|
80黑幣
用串口調試助手,將數據通過UART下發到單片機當中, 并且存儲到EEPROM中, 然后將電源關掉, 重新上電讀取EEPROM的數據并數碼管上顯示出來,但是我現在數據發送單片機也接收了,就是無法存儲到EEPROM中,望各位朋友幫忙指點一下,謝謝!
以下是單片機代碼:
----------------------------------------------------------
- #include <reg52.h>
- #include <intrins.h>
- #define I2CDelay() {_nop_();_nop_();_nop_();_nop_();}
- sbit I2C_SCL = P0^6;
- sbit I2C_SDA = P0^7;
- unsigned char ucDataOneTab[10] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f,0x6f};
- unsigned char ucDataTwoTab[8] = {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
- unsigned char disbuf[8] = {0x3f,0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07};
- sbit LED_SMG_RCK = P1^0;
- sbit LED_SMG_SCK = P1^1;
- sbit LED_SMG_DATA = P1^4;
- unsigned char RxdByte;
- //數碼管顯示函數
- void Send_data_smg(unsigned int uiDataOne,unsigned int uiDataTwo)
- {
- unsigned char i;
-
- LED_SMG_RCK = 0;
- for(i=0; i<8; i++)
- {
- LED_SMG_SCK = 0;
- if(0 != (uiDataOne&0x80))
- {
- LED_SMG_DATA = 1;
- }
- else
- {
- LED_SMG_DATA = 0;
- }
- LED_SMG_SCK = 1;
- uiDataOne <<= 1;
- }
-
- for(i=0; i<8; i++)
- {
- LED_SMG_SCK = 0;
- if(0 != (uiDataTwo&0x80))
- {
- LED_SMG_DATA = 1;
- }
- else
- {
- LED_SMG_DATA = 0;
- }
- LED_SMG_SCK = 1;
- uiDataTwo <<= 1;
- }
- LED_SMG_RCK = 1;
- }
- /* 產生總線起始信號 */
- void I2CStart()
- {
- I2C_SDA = 1; //首先確保 SDA、 SCL 都是高電平
- I2C_SCL = 1;
- I2CDelay();
- I2C_SDA = 0; //先拉低 SDA
- I2CDelay();
- I2C_SCL = 0; //再拉低 SCL
- }
- /* 產生總線停止信號 */
- void I2CStop()
- {
- I2C_SCL = 0; //首先確保 SDA、 SCL 都是低電平
- I2C_SDA = 0;
- I2CDelay();
- I2C_SCL = 1; //先拉高 SCL
- I2CDelay();
- I2C_SDA = 1; //再拉高 SDA
- I2CDelay();
- }
- /* I2C 總線寫操作, dat-待寫入字節,返回值-從機應答位的值 */
- bit I2CWrite(unsigned char dat)
- {
- bit ack; //用于暫存應答位的值
- unsigned char mask; //用于探測字節內某一位值的掩碼變量
- for (mask=0x80; mask!=0; mask>>=1) //從高位到低位依次進行
- {
- if ((mask&dat) == 0) //該位的值輸出到 SDA 上
- I2C_SDA = 0;
- else
- I2C_SDA = 1;
-
- I2CDelay();
- I2C_SCL = 1; //拉高 SCL
- I2CDelay();
- I2C_SCL = 0; //再拉低 SCL,完成一個位周期
- }
- I2C_SDA = 1; //8 位數據發送完后,主機釋放 SDA,以檢測從機應答
- I2CDelay();
- I2C_SCL = 1; //拉高 SCL
- ack = I2C_SDA; //讀取此時的 SDA 值,即為從機的應答值
- I2CDelay();
- I2C_SCL = 0; //再拉低 SCL 完成應答位,并保持住總線
- return (~ack); //應答值取反以符合通常的邏輯:
- //0=不存在或忙或寫入失敗, 1=存在且空閑或寫入成功
- }
- /* I2C 總線讀操作,并發送非應答信號,返回值-讀到的字節 */
- unsigned char I2CReadNAK()
- {
- unsigned char mask;
- unsigned char dat;
- I2C_SDA = 1; //首先確保主機釋放 SDA
- for (mask=0x80; mask!=0; mask>>=1) //從高位到低位依次進行
- {
- I2CDelay();
- I2C_SCL = 1; //拉高 SCL
- if(I2C_SDA == 0) //讀取 SDA 的值
- dat &= ~mask; //為 0 時, dat 中對應位清零
- else
- dat |= mask; //為 1 時, dat 中對應位置 1
- I2CDelay();
- I2C_SCL = 0; //再拉低 SCL,以使從機發送出下一位
- }
- I2C_SDA = 1; //8 位數據發送完后,拉高 SDA,發送非應答信號
- I2CDelay();
- I2C_SCL = 1; //拉高 SCL
- I2CDelay();
- I2C_SCL = 0; //再拉低 SCL 完成非應答位,并保持住總線
- return dat;
- }
- /* I2C 總線讀操作,并發送應答信號,返回值-讀到的字節 */
- unsigned char I2CReadACK()
- {
- unsigned char mask;
- unsigned char dat;
- I2C_SDA = 1; //首先確保主機釋放 SDA
- for (mask=0x80; mask!=0; mask>>=1) //從高位到低位依次進行
- {
- I2CDelay();
- I2C_SCL = 1; //拉高 SCL
- if(I2C_SDA == 0) //讀取 SDA 的值
- dat &= ~mask; //為 0 時, dat 中對應位清零
- else
- dat |= mask; //為 1 時, dat 中對應位置 1
- I2CDelay();
- I2C_SCL = 0; //再拉低 SCL,以使從機發送出下一位
- }
- I2C_SDA = 0; //8 位數據發送完后,拉低 SDA,發送應答信號
- I2CDelay();
- I2C_SCL = 1; //拉高 SCL
- I2CDelay();
- I2C_SCL = 0; //再拉低 SCL 完成應答位,并保持住總線
-
- return dat;
- }
- /* 讀取 EEPROM 中的一個字節, addr-字節地址 */
- unsigned char E2ReadByte(unsigned char addr)
- {
- unsigned char dat;
- I2CStart();
- I2CWrite(0x50<<1); //尋址器件,后續為寫操作
- I2CWrite(addr); //寫入存儲地址
- I2CStart(); //發送重復啟動信號
- I2CWrite((0x50<<1)|0x01); //尋址器件,后續為讀操作
- dat = I2CReadNAK(); //讀取一個字節數據
- I2CStop();
- return dat;
- }
- /* 向 EEPROM 中寫入一個字節, addr-字節地址 */
- void E2WriteByte(unsigned char addr, unsigned char dat)
- {
- I2CStart();
- I2CWrite(0x50<<1); //尋址器件,后續為寫操作
- I2CWrite(addr); //寫入存儲地址
- I2CWrite(dat); //寫入一個字節數據
- I2CStop();
- }
- void Delay1ms(unsigned int i)
- {
- int j;
- for(; i>0; i--)
- {
- for(j = 0; j < 110; j++);
- }
- }
- void ConfigUart(unsigned int baud)
- {
- SCON = 0x50;
- TMOD &= 0x0F;
- TMOD |= 0x20;
- TH1 = 256 - (11059200/12/32)/baud;
- TL1 = TH1;
- TR1 = 1;
- ET1 = 0;
- ES = 1;
- }
- void main()
- {
- unsigned char dat;
- unsigned char i;
- unsigned char str[5];
-
- EA = 1;
- ConfigUart(9600);
-
- RxdByte = E2ReadByte(0x20);
- Delay1ms(100);
-
- str[0] = (RxdByte/100);
- str[1] = (RxdByte/10%10);
- str[2] = (RxdByte%10);
-
- //dat++;
- E2WriteByte(0x20,RxdByte);//將數據存儲到E2PROM中
- disbuf[2] = ucDataOneTab[str[2]];
- disbuf[1] = ucDataOneTab[str[1]];
- disbuf[0] = ucDataOneTab[str[0]];
-
- while(1)
- {
- for(i=0; i<8; i++)
- {
- Send_data_smg(disbuf[i],ucDataTwoTab[i]);
- Delay1ms(1);
- }
- }
- }
- /* UART中斷服務函數 */
- void InterruptUART() interrupt 4
- {
- if (RI) //接收到字節
- {
- RI = 0; //手動清零接收中斷標志位
- RxdByte = SBUF; //接收到的數據保存到接收字節變量中
- //用以提示用戶輸入的信息是否已正確接收
- SBUF = RxdByte;
- }
- if (TI) //字節發送完畢
- {
- TI = 0; //手動清零發送中斷標志位
- }
- }
復制代碼
|
|