完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
各位大师有个问题请教下,为什么我这个程序掉电后数据可以保存,但是到了60秒进位时候会出现乱码是怎么回事,24C02是这样保存数据的吗???
#include"main.h" #include"lcd1602.h" #include"74hc595.h" #include"key.h" #include"time.h" #include "boardinit.h" #include"24c02.h" #include"lcd1602.h" void main() { lcdinit_1602(); boardinit(); time1(); //shi=At24c02Read(3); //if(shi>24) //shi=0; // fen=At24c02Read(2); // if(fen>60) // fen=0; miao=At24c02Read(3); if(miao>60) miao=0; Disp_1602(1,1," 2017-06-08 ",16); Disp_1602(1,2," 22:06:59 ",16); while(1) { keyscan(); //shi=At24c02Read(3); //write_dierhang_1602(5,shi); miao=At24c02Read(3); write_dierhang_1602(11,miao); fen=At24c02Read(2); write_dierhang_1602(8,fen); } } #include"time.h" #include"lcd1602.h" #include"24c02.h" #include"74hc595.h" uchar time,shi,fen,miao; void time1() { TMOD=0X10; //设置定时器方式1(16位定时器) TH1=0X4c; //定时器高八位装初值 TL1=0X00; //定时器低八位装初值 定时50ms ET1=1; //允许定时器 1 产生中断 TR1=1; //启动定时器 1 EA=1; //外部中断 0初始化 EX0=1; // 开外部中断零,EX1=1; 就是开外部中断 0 IT0=0; // 请求P3.2 跳沿触发方式 } void zd()interrupt 3 { TMOD=0X10; //设置定时器方式1(16位定时器) TH1=0X4c; //定时器高八位装初值 time++; if(time>=20) { time=0; miao++; if(miao==60) { miao=0; fen++; if(fen==60) { fen=0; shi++; if(shi==24) { shi=0; } At24c02Write(1,shi); } At24c02Write(2,fen); } At24c02Write(3,miao); } } #include"24c02.h" void Delay10us() { unsigned char a,b; for(b=1;b>0;b--) for(a=2;a>0;a--); } void I2cStart() { SDA=1; Delay10us(); SCL=1; Delay10us();//建立时间是SDA保持时间>4.7us SDA=0; Delay10us();//保持时间是>4us SCL=0; Delay10us(); } void I2cStop() { SDA=0; Delay10us(); SCL=1; Delay10us();//建立时间大于4.7us SDA=1; Delay10us(); } unsigned char I2cSendByte(unsigned char dat) { unsigned char a=0,b=0;//最大255,一个机器周期为1us,最大延时255us。 for(a=0;a<8;a++)//要发送8位,从最高位开始 { SDA=dat>>7; //起始信号之后SCL=0,所以可以直接改变SDA信号 dat=dat<<1; Delay10us(); SCL=1; Delay10us();//建立时间>4.7us SCL=0; Delay10us();//时间大于4us } SDA=1; Delay10us(); SCL=1; while(SDA)//等待应答,也就是等待从设备把SDA拉低 { b++; if(b>200) //如果超过2000us没有应答发送失败,或者为非应答,表示接收结束 { SCL=0; Delay10us(); return 0; } } SCL=0; Delay10us(); return 1; } unsigned char I2cReadByte() { unsigned char a=0,dat=0; SDA=1; //起始和发送一个字节之后SCL都是0 Delay10us(); for(a=0;a<8;a++)//接收8个字节 { SCL=1; Delay10us(); dat<<=1; dat|=SDA; Delay10us(); SCL=0; Delay10us(); } return dat; } void At24c02Write(unsigned char addr,unsigned char dat) { I2cStart(); I2cSendByte(0xa0);//发送写器件地址 I2cSendByte(addr);//发送要写入内存地址 I2cSendByte(dat); //发送数据 I2cStop(); } unsigned char At24c02Read(unsigned char addr) { unsigned char num; I2cStart(); I2cSendByte(0xa0); //发送写器件地址 I2cSendByte(addr); //发送要读取的地址 I2cStart(); I2cSendByte(0xa1); //发送读器件地址 num=I2cReadByte(); //读取数据 I2cStop(); return num; } |
|
相关推荐
1个回答
|
|
24C02是双地址的,不然会被刷掉的
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
644 浏览 0 评论
求助一下关于51系列单片机的Timer0的计时问题,TH0、TL0+1的时间是怎么算的?
1819 浏览 1 评论
【RA-Eco-RA4E2-64PIN-V1.0开发板试用】开箱+Keil环境搭建+点灯+点亮OLED
1262 浏览 0 评论
【敏矽微ME32G070开发板免费体验】使用coremark测试敏矽微ME32G070 跑分
1136 浏览 0 评论
【敏矽微ME32G070开发板免费体验】开箱+点灯+点亮OLED
1357 浏览 2 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
12031 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 21:11 , Processed in 0.477599 second(s), Total 42, Slave 35 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号