K1:從開始位置開始寫入0x00-0xFF, 0x00-0xFF(512字節)
K2:從第512字節位置開始寫入512個隨機字節
K3:讀取前512個字節并顯示
K4:讀取后512個字節并顯示
操作過程中可嘗試"熱插撥"MMC卡,觀察運行效果
MMC存儲卡仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機控制MMC存儲卡源程序如下:
- //-----------------------------------------------------------------
- // 名稱: MMC存儲卡測試
- //-----------------------------------------------------------------
- // 說明: 本例運行時,按下K1將向MMC卡第0塊寫入512個有序字節,按下K2時
- // 將向第1塊寫入512個隨機字節,按下K3與K4時將分別讀取并通過
- // 虛擬終端顯示這些字節數據.
- //
- //-----------------------------------------------------------------
- #include <reg51.h>
- #include <intrins.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <math.h>
- #include <absacc.h>
- #define INT8U unsigned char
- #define INT16U unsigned int
- #define INT32U unsigned long
- //定義按鍵操作
- #define K1_DOWN() !(P1 & (1<<0))
- #define K2_DOWN() !(P1 & (1<<2))
- #define K3_DOWN() !(P1 & (1<<4))
- #define K4_DOWN() !(P1 & (1<<6))
- //MMC相關函數
- extern void OpenSPI();
- extern INT8U MMC_Initialise();
- extern INT8U MMC_Read_Block(INT32U address);
- extern INT8U MMC_Write_Block(INT32U address);
- //串口相關函數
- extern void Init_USART();
- extern void PutChar(char c);
- extern void PutStr(char *s);
- INT8U OP = 0; //當前按鍵操作代號
- INT8U ERROR_Flag = 1; //MMC卡操作錯誤標識(為1表示正常,為0表示出錯)
- //-----------------------------------------------------------------
- // 延時函數
- //-----------------------------------------------------------------
- void delay_ms(INT16U x) {INT8U t; while(x--) for(t = 0; t<120; t++);}
- //-----------------------------------------------------------------
- // 以十六進制形式顯示所讀取的字節
- //-----------------------------------------------------------------
- void Show_Byte_by_HEX(INT32U Len)
- {
- INT32U i; char s[] = " ";//字符串初始為三個空格
- for (i = 0; i < Len; i++)
- {
- }
- PutStr("\r--------Finished!--------\r");
- }
- //-----------------------------------------------------------------
- // 向串口輸出一個字符
- //-----------------------------------------------------------------
- void PutChar(INT8U c) { SBUF = c; while (TI == 0); TI = 0; }
- //------------------------------------------------------------------
- // 串口輸出字符串
- //------------------------------------------------------------------
- void PutStr(char *s) { while (*s) PutChar(*s++); }
- //-----------------------------------------------------------------
- // 串口配置
- //-----------------------------------------------------------------
- void Init_USART()
- {
- }
- //-----------------------------------------------------------------
- // 主程序
- //-----------------------------------------------------------------
- void main()
- {
- INT32U i,j;
- //SPI,USART初始化
- OpenSPI(); Init_USART(); delay_ms(100);
- //初始化MMC
- PutStr("Initialise MMC, Please Waiting.....");
- ERROR_Flag = MMC_Initialise();
- if (ERROR_Flag) PutStr("OK!\r\r"); else PutStr("ERROR!\r\r");
- //提示進行K1-K4操作
- PutStr("Plase Press K1,K2,K3 or K4 to Play MMC Test...\r\r");
- //設置隨機種子
- srand(300);
- while(1)
- { while (P1 == 0xFF); //未按鍵則等待-------------------------
- if (K1_DOWN()) { delay_ms(10); if (K1_DOWN()) OP = 1; }
- else if (K2_DOWN()) { delay_ms(10); if (K2_DOWN()) OP = 2; }
- else if (K3_DOWN()) { delay_ms(10); if (K3_DOWN()) OP = 3; }
- else if (K4_DOWN()) { delay_ms(10); if (K4_DOWN()) OP = 4; }
- //如果上次MMC出錯則重新初始化SPI接口與MMC卡
- if (ERROR_Flag == 0) //------------------------------------
- {
- }
- //根據按鍵操作代號分別進行操作,因為上述可能的重新初始化會耗費較多時間,
- //如果在這里仍用K1~K4的DOWN判斷,按鍵可能已經釋放,從而導致判斷失效.
- //因此這里使用的是提前獲取的按鍵操作代號
- if (OP == 1) //--------------------------------------------
- {
- }
- else if (OP == 2) //---------------------------------------
- {
- }
- else if (OP == 3) //---------------------------------------
- {
- }
- else if (OP == 4) //---------------------------------------
- {
- }
- next: while (P1 != 0xFF); //等待釋放按鍵-----------------
- }
- }
復制代碼
所有資料51hei提供下載:
50 MMC存儲卡測試.zip
(33.82 KB, 下載次數: 39)
2019-3-13 19:23 上傳
點擊文件名下載附件
|