小白跟做江科大51单片机之AT24C02数据存储 |
您所在的位置:网站首页 › 单片机at24c02代码 › 小白跟做江科大51单片机之AT24C02数据存储 |
1.导入Delay、key、LCD1602相关文件 2.控制逻辑 以I2C去写入,用AT24C02包装好,main调用即可 3.编写I2C.c代码 看着这六个状态编 图1 开和关 图2 发送一个字节 图3 接收一个字节 图4 接收和发送应答 I2C.c文件 #include sbit I2C_SCL = P2^1; sbit I2C_SDA = P2^0; /** * @brief I2C开始 * @param 无 * @retval 无 */ void I2C_Start(void) { //空闲状态默认SCL和SDA是高电平的 I2C_SDA=1; //SDA可能是0,可能是1 I2C_SCL=1; //SCL在I2C复合的时候有可能为低电平 I2C_SDA=0; //SDA要换为低电平 I2C_SCL=0; //SCL要换为低电平 } /** * @brief I2C发送一个字节 * @param Data 要发送的字节 * @retval 无 */ void I2C_Send(unsigned char Data) { //默认I2C_SCL=0; unsigned char i; for(i=0;i>i); I2C_SCL=1; I2C_SCL=0; //写了立马就读没超过最大时钟 } } /** * @brief I2C接收一个字节 * @param 无 * @retval 接收到的一个字节数据 */ unsigned char I2C_Receive(void) //这里不需要参数Data { unsigned char Receive_Data=0x00,i; I2C_SDA=1; //接收之前需要释放,释放SDA是这个语句 for(i=0;i>i); //第一次读的是最高位 I2C_SCL=0; } return Receive_Data; } /** * @brief I2C发送应答 * @param ACK_select 应答位,0为应答,1为非应答 * @retval 无 */ void I2C_Send_ACK(unsigned char ACK_select) { //返回需要通过时序变化,不能直接返回参数值 I2C_SDA=ACK_select; //SDA就是应答位 //发送应答过程 I2C_SCL=1; I2C_SCL=0; } /** * @brief I2C接收应答位 * @param 无 * @retval 接收到的应答位,0为应答,1为非应答 */ unsigned char I2C_Receive_ACK(void) { unsigned char ACK_bit; //返回需要通过时序变化,不能直接返回参数值 I2C_SDA=1; //SDA释放 //发送应答过程 I2C_SCL=1; //SCL拉高可以读取 ACK_bit=I2C_SDA; I2C_SCL=0; return ACK_bit; } /** * @brief I2C停止 * @param 无 * @retval 无 */ void I2C_Stop(void) { //归为0上拉才有意义 I2C_SDA=0; //在终止之前,SDA有可能是0,有可能是1 I2C_SCL=1; //符合空闲状态标准 I2C_SDA=1; //符合空闲状态标准 } 4.看此图编写AT24C02.c代码 #include #include "I2C.h" #define AT24C02_ADDRESS 0xA0 //默认地址 void AT24C02_WriteByte(unsigned char WordAddress,Data) { I2C_Start(); I2C_Send(AT24C02_ADDRESS); I2C_Send_ACK(0); I2C_Send(WordAddress); I2C_Send_ACK(0); I2C_Send(Data); //第一个字节数据 I2C_Send_ACK(0); I2C_Stop(); } unsigned char AT24C02_ReadByte(unsigned char WordAddress) { unsigned char num; I2C_Start(); I2C_Send(AT24C02_ADDRESS); I2C_Receive_ACK(); ///开始接收,所以是receive_ACK I2C_Send(WordAddress); I2C_Receive_ACK(); I2C_Start(); //直接开始,无需停止 I2C_Send(AT24C02_ADDRESS|0x01); //这表示为读 I2C_Receive_ACK(); num=I2C_Receive(); I2C_Send_ACK(1); I2C_Stop(); return num; } 写完要等待5ms 5.编写main代码 #include #include "LCD1602.h" #include "key.h" #include "AT24C02.h" #include "Delay.h" unsigned char keynum; unsigned int figure=0; void main() { LCD_Init(); LCD_ShowString(1,1,"Hello! "); while(1) { keynum=Key(); //K1按键,Num自增 if(keynum==1) { figure++; LCD_ShowNum(2,1,figure,5); } //K2按键,Num自减 if(keynum==2) { figure--; LCD_ShowNum(2,1,figure,5); } //K3按键,向AT24C02写入数据 if(keynum==3) { AT24C02_WriteByte(0,figure%256); Delay(5); AT24C02_WriteByte(1,figure/256); Delay(5); LCD_ShowString(2,1,"Write ok"); Delay(1000); LCD_ShowString(2,1," "); Delay(500); } //K4按键,从AT24C02读取数据 if(keynum==4) { static int temp=0; temp=AT24C02_ReadByte(0); temp|=AT24C02_ReadByte(1) |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |