完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
单片机AT24C02芯片上电自启动读取数据,写入数据的实现也是挺重要的一个模块,往年的考试就有考到过,下面就来解说一下具体的分析过程吧。
编写一个记录上电次数的代码,每一次上电自加一,使用数码管显示。 首先,官方提供的数据包中有提供了IIC总线的底层驱动代码,我们是可以直接调用这个底层驱动代码的,方便自己编写代码; 其次,系统设置一个记录上电次数的变量,上电的时候,上电之后把变量自加一,写入到芯片中; 之后,对芯片数据进行读取,读取到的数据进行显示; 最后,大概流程就差不多了,开始动手吧。 #include "reg52.h" #include "iic.h" #include "intrins.h" typedef unsigned char u8; typedef unsigned int u16; u8 shuma[12] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf,0xbf}; // 外设初始化 void init_system() { P2 = (P2 & 0x1f) | 0x80; P0 = 0xff; P2 = (P2 & 0x1f); P2 = (P2 & 0x1f) | 0xa0; P0 = 0x00; P2 = (P2 & 0x1f); P2 = (P2 & 0x1f) | 0xc0; P0 = 0x00; P2 = (P2 & 0x1f); } // 外设导通选择 void select(u8 local) { switch(local) { case(4): P2 = (P2 & 0x1f) | 0x80; break; case(5): P2 = (P2 & 0x1f) | 0xa0; break; case(6): P2 = (P2 & 0x1f) | 0xc0; break; case(7): P2 = (P2 & 0x1f) | 0xe0; break; } } void delay() { u8 t = 200; while(t--); } void display(u8 local, u8 num) { select(6); P0 = 0x80 >> (local - 1); P2 = P2 & 0x1f; delay(); // 消隐 select(7); P0 = num; P2 = P2 & 0x1f; } void write_at24c02(u8 add, u8 data1) // 往AT24C02芯片写入数据函数 { IIC_Start(); IIC_SendByte(0xa0); IIC_WaitAck(); IIC_SendByte(add); IIC_WaitAck(); IIC_SendByte(data1); IIC_WaitAck(); IIC_Stop(); } unsigned char read_at24c02(u8 add) // 读取ATC24C02的数据函数 { u8 temp; IIC_Start(); // 启动总线 ,函数主体在底层函数中 IIC_SendByte(0xa0); // 发送标志字节 IIC_WaitAck(); // 等待总线响应 IIC_SendByte(add); // 发送读取数据的地址 IIC_WaitAck(); // 等待总线响应 IIC_Start(); // 重新启动再发送地址单元写进去 IIC_SendByte(0xa1); IIC_WaitAck(); temp = IIC_RecByte(); IIC_WaitAck(); IIC_Stop(); return temp; } void Delay2ms() //@11.0592MHz { unsigned char i, j; _nop_(); _nop_(); i = 22; j = 128; do { while (--j); } while (--i); } void main() { u8 num; init_system(); num = read_at24c02(0x55); // 读取数据的地址可以0x00-0xff,自行选择,注意写入到那个地址,之后读取数据就在那个地址进行读取 write_at24c02(0x55,++num); // 写入数据到上面读取数据的地址(地址需要一致) while(1) { display(1,shuma[num%10]); display(2,shuma[num/10]); close_display(); Delay2ms(); } } |
|
|
|
只有小组成员才能发言,加入小组>>
3309 浏览 9 评论
2988 浏览 16 评论
3490 浏览 1 评论
9050 浏览 16 评论
4085 浏览 18 评论
1171浏览 3评论
602浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
594浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2332浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 20:04 , Processed in 1.139992 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号