单片机:89c51Rc 晶振:11.0592MHZ
错误记录:
1.误把 &0x1f(11111)写成 &11111 ,0x1f是二进制,11111是十进制
2.再进行显示的时候,把小时寄存器中D5(AM/PM)标志记反了,实际是(0-AM,1-PM)
实际记录:
1.对于1302在显示屏上显示,关于1302的数据显示"?",而其它部分正常显示,不用说,程序没问题,1302坏了(我用到第三个1302才正常显示,不是“?”)
2.1302所具有的校准功能在显示AM/PM方面,必须小时位变化(类似22->23)才会发生,所以在初始化的时候必须对小时寄存器中D5(AM/PM)标志位进行设置(在显示AM/PM的前提下)
方式:
1.是对于12/24小时制的选择以及AM/PM的设定,我选择的是在数组中放置标志位
uchar add_write[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};//寄存器地址
uchar add_read[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar tim0[]={22,7,2,11,11,59,55,1,1};//年、星期、月、日、时、分、秒、12/24、PM/AM
uchar tim_bcd[7];//保存读出的时间日期
uchar tim[14];//保存分解开的十位、个位
前两个是各个寄存器的读写地址,第三个是各寄存器的初始值设置,而第三个数组最后两个元素就是12/24,AM/PM标志位(1-12,0-24)(1-PM,0-AM)
2.我对12/24小时制的选择以及AM/PM的设定是在初始化函数中对已经转化为BCD码的tim0[4](也就是对小时寄存器初始化写入)进行操作的
if(tim0[7]==1)//对12/24标志位进行判断
{
if(tim0[8]==1)
tim0[4]|=0xa0;//12小时PM
else
tim0[4]|=0x80;//12小时AM
}
else
{
if(tim0[8]==1)//对AM/PM标志位进行判断
tim0[4]|=0x20;//PM
else
tim0[4]|=0x00;//AM
}
3.对于AM/PM的显示,我是在display_1302time显示函数中写的
主函数部分:
initial_12864();
// initial_1602();
ds1302_initial();
while(1)
{
read_1302time();
display_1302time();
}
首先是在read_1302time()函数中把从小时寄存器读出的数据(BCD码)储存在tim_bcd[14]中,然后只留下后五位数据用于转化为十进制(小时时间数据只用到了后五位)
if(i==4)
{
tim_bcd[14] = tim_bcd[4];
tim_bcd[4] = tim_bcd[4]& 0x1f;//11111
}
之后在display_1302time显示函数中对显示AM/PM进行判断
if(tim_bcd[14]&0x20==0x20)
Putstring(" PM");
else
Putstring(" AM");
学1302的时候,我是在B站上从零学电子的个人空间_哔哩哔哩_Bilibili这个UP主学的,我觉得讲的很细。但是只有最基础的24小时星期显示,AM/Pm,12小时制需要自己加,而且硬件也很恶心,刚学的时候根本不知道是硬件还是软件的问题,就尼玛显示"?",鬼知道为啥显示“?”,折腾半天,三块1302坏了两块,改显示格式上下午的时间都没在”?“上面卡的时间长
上图.c和.h文件下载:
10.ds1302.zip
(14.9 KB, 下载次数: 19)
|