|
我想用两个单片机,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倒是可以正常读写,这是为什么呢?
|
|