|
我想用兩個單片機,1用來讀數據,2寫數據到AT24C- #include <reg51.h>
- #include<intrins.h>//包含_nop_()函數
- #define uc unsigned char
- #define CTL_R 0xa1//AT24讀控制
- #define CTL_W 0xa0//AT24寫控制
- sbit whitch = P3^1;
- sbit what = P3^0;
- sbit SCL = P2^6;
- sbit SDA = P2^7;
- sbit BUSY = P3^2;
- uc code num[10] = {
- 0x3f, 0x06, 0x5b,
- 0x4f,0x66,0x6d,
- 0x7d, 0x07, 0x7f, 0x6f
- };
- /**
- * @name : void Delay(int n)
- * @description : 延時
- * @param ;int n 延遲的時間
- * @return :
- */
- void Delay(int n)
- {
- int i,j;
- for(i = 0; i < n; i++)
- for(j = 0; j < 100; j++);
- }
- /**
- * @name : void delay()
- * @description : 延時>4us
- * @param ;
- * @return :
- */
- void delay()
- {
- _nop_();//空指令
- _nop_();
- _nop_();
- _nop_();
- }
-
- /**
- * @name : void IIC_start()
- * @description : IIC開始
- * @param ;
- * @return :
- */
- void IIC_start()
- {
- SDA = 1;
- SCL = 1;
- delay();
- SDA = 0;
- delay();
- SCL = 0;
- }
- /**
- * @name : void IIC_stop()
- * @description : IIC結束
- * @param ;
- * @return :
- */
- void IIC_stop()
- {
- SDA = 0;
- SCL = 1;
- delay();
- SDA = 1;
- delay();
- SCL = 0;
- }
- /**
- * @name : void IIC_ACK()
- * @description : 發送應答ACK=0
- * @param ;
- * @return :
- */
- void IIC_ACK()
- {
- SDA = 0;
- SCL = 1;
- delay();
- SCL = 0;
- SDA = 1;
- }
-
- /**
- * @name : uc IIC_CACK()
- * @description : 檢查應答
- * @param ;
- * @return :
- */
- uc IIC_CACK()
- {
- int C = 0;
- while(C != SDA);
- SCL = 1;
- delay();
- SCL = 0;
- return C;
- }
- /**
- * @name : void IIC_send(uc n)
- * @description :發送一個字節
- * @param ;uc n發送的字節
- * @return :
- */
- void IIC_send(char n)
- {
- uc i;
- char tmp = n;
- for(i = 0; i < 8; i++)
- {
- SDA =(bit)(tmp >> 7);//發送一個字節的高位
- SCL = 1;
- delay();
- tmp <<= 1;
- SCL = 0;
- }
- }
- /**
- * @name : uc IIC_rec()
- * @description :接收一個字節
- * @param ;
- * @return : 收到的數
- */
- uc IIC_rec()
- {
- uc i;
- char tmp = 0;
- for(i = 0; i < 8; i++)
- {
- tmp <<= 1;
- tmp |= SDA;
- SCL = 1;
- delay();
- SCL = 0;
- }
- return tmp;
- }
- /**
- * @name : void IIC_W_AT24C1024B(uc datas, short int ADDR)
- * @description :寫一個字節的全過程
- * @param :uc datas 寫的數 short int ADDR 寫到的地址
- * @notice : None
- */
- void IIC_W_AT24C1024B(char datas, short int ADDR)
- {
- IIC_start();
- do
- IIC_send(CTL_W);
- while(IIC_CACK());//等待應答
- do
- IIC_send((char)(ADDR >> 4));//1字節高位地址
- while(IIC_CACK());//等待應答
- do
- IIC_send((char)ADDR);//1字節低位地址
- while(IIC_CACK());//等待應答
- IIC_send(datas);//發送一個字節
- while(IIC_CACK());//等待應答
- IIC_stop();
- }
- /**
- * @name : uc IIC_R_AT24C1024B(short int ADDR)
- * @description :讀一個字節的全過程
- * @param short int ADDR 讀的地址
- * @notice : None
- */
- uc IIC_R_AT24C1024B(short int ADDR)
- {
- char datas;
- IIC_start();
- do
- IIC_send(CTL_W);
- while(IIC_CACK());//等待應答
- do
- IIC_send((char)(ADDR >> 4));//1字節高位地址
- while(IIC_CACK());//等待應答
- do
- IIC_send((char)ADDR);//1字節低位地址
- while(IIC_CACK());//等待應答
- IIC_start();
- do
- IIC_send(CTL_R);
- while(IIC_CACK());//等待應答
- datas = IIC_rec();//接收一個字節
- IIC_ACK();//發送應答
- IIC_stop();
- return datas;
- }
- /**
- * @name : void checkbusy()
- * @description : 檢測EEPROM是否在工作
- * @param short int ADDR 讀的地址
- * @notice : None
- */
- void checkbusy()
- {
- while(BUSY);
- }
- int main(void)//單片機1
- {
- char datas;
- BUSY = 0;
- whitch = 1;
- P1 = 0x0f;
- whitch = 0;
- while(1)
- {
- Delay(50);Delay(50);Delay(50);
- checkbusy();
- BUSY = 1;
- Delay(50);
- datas = IIC_R_AT24C1024B(0x0020);
- BUSY = 0;
- what = 1;
- P1 = num[(int)datas];
- what = 0;
- }
- }
- ////////單片機2(其他函數在單片機1里面有)
- /**
- * @name : void key();
- * @description : 鍵盤檢測
- * @return : 代表鍵盤按鍵的變量
- */
- char key()
- {
- char x,k = 0;
- P3 = 0xff;
- x = P3;
- if(x != 0xff) //沒按鍵跳出
- {
- Delay(10); //有按鍵,延時
- P3 = 0xff;
- x = P3;
- if(x != 0xff) //再測
- {
- switch(x) //獲取鍵值
- {
- case 0xfe:
- k = 1;
- break;
- case 0xfd:
- k = 2;
- break;
- case 0xfb:
- k = 3;
- break;
- case 0xf7:
- k = 4;
- break;
- case 0xef:
- k = 5;
- break;
- case 0xdf:
- k = 6;
- break;
- case 0xbf:
- k = 7;
- break;
- case 0x7f:
- k = 8;
- break;
- default:
- break;
- }
- }
- }
- return k;
- }
- /**
- * @name : void checkbusy()
- * @description : 檢測EEPROM是否在工作
- * @param short int ADDR 讀的地址
- * @notice : None
- */
- void checkbusy()
- {
- while(BUSY);
- }
- int main(void)
- {
- char datas;
- Delay(30);
- while(1)
- {
- datas = key();
- checkbusy();
- BUSY = 1;
- Delay(30);
- IIC_W_AT24C1024B(0x05, 0x0020);
- BUSY = 0;while(1);
- }
- }
復制代碼
那里,但是單片機2寫不了數據到它里面,單片機1倒是可以正常讀寫,這是為什么呢?
|
-
捕獲1.JPG
(171.84 KB, 下載次數: 89)
下載附件
2019-5-2 23:30 上傳
-
-
出錯的.zip
2019-5-2 23:28 上傳
點擊文件名下載附件
28.06 KB, 下載次數: 5
|