写出来的程序 结果时间不走,还显示Date:85-85-85 85:85:85,到底问题出在哪了,#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
uchar code digit[10]={"0123456789"};
sbit SCLK=P1^4;
sbit DATA=P1^5;
sbit RST=P1^6;
/*延时若干微秒*/
void delaynus(uchar n)
{
uchar i;
for(i=0;i<n;i++);
}
/*函数功能:向1302写一个字节数据*/
void Write1302(uchar dat)
{
uchar i;
RST=1;
SCLK=0; //先置低,等拉高后就开始写数据
delaynus(2);//保持一段时间
for(i=0;i<8;i++)
{
if(dat&0x01) {DATA=1;}
else{DATA=0;}
delaynus(2);//保持一段时间
SCLK=1; //上升沿,单片机开始向DS1302写数据
delaynus(2);//保持一段时间,使数据写完
SCLK=0; //重新拉低SCLK
dat>>=1;//位右移,准备写入下一个数据位
}
RST=0;
}
/*根据命令字,向1302写入一个字节数据*/
void WriteSet1302(uchar Cmd,uchar dat)
{
RST=0; //根据时序图得出
SCLK=0; //同上
RST=1; //启动数据传输
delaynus(2); //SCLK为低,持续一段时间
Write1302(Cmd); //写指令
Write1302(dat); //写数据
SCLK=1;
RST=0; //禁止数据传递
}
/*从1302读一个字节数据*/
uchar Read1302(void)
{
uchar i,dat;
RST=1;
delaynus(2);
for(i=0;i<8;i++) //连续读8个二进制位
{
dat>>=1; //将dat的数据位右移,因为最先读出的是最低位
if(DATA==1)
{dat|=0x80;} //将1取出,写在本次的最高位
else {dat&=0x7f;}
SCLK=1; //将SCLK置高,根据时序图得出的初始状态
delaynus(2);//等待一段时间
SCLK=0; //开始读数据
delaynus(2);//等待一段时间,数据读完
}
RST=0;
return dat; //将读出的数据返回
}
/*根据命令字,向1302读取一个字节数据*/
uchar ReadSet1302(uchar Cmd)
{
uchar dat;
RST=0; //初始化,由时序图得出
SCLK=0; //同上
RST=1;//开始数据传输
Write1302(Cmd); //写命令字
dat=Read1302(); //读出数据
SCLK=1; //将电平置于已知状态
RST=0; //禁止数据传递
return dat; //将读出的数据返回
}
/*函数功能:将1302初始化*/
void Init_DS1302(void)
{
WriteSet1302(0x8e,0x00) ; //根据写状态命令字,写入不保护指令
WriteSet1302(0x80,0x10) ; //根据写秒命令字,写入秒的初值
WriteSet1302(0x82,0x00) ; //根据写分命令字,写入分的初值
WriteSet1302(0x84,0x12) ; //根据写小时命令字,写入小时的初值
WriteSet1302(0x86,0x16) ; //根据写日命令字,写入日的初值
WriteSet1302(0x88,0x11) ;//根据写月命令字,写入月的初值
WriteSet1302(0x8c,0x08) ;//根据写年命令字,写入年的初值
WriteSet1302(0x8e,0x80) ; //写保护开
}
/*对液晶模块的操作程序*/
sbit RS=P2^4;
sbit RW=P2^5;
sbit E=P2^6;
/*函数功能:延时1ms*/
void delay1ms()
{
uchar i,j;
for(i=0;i<10;i++)
for(j=0;j<33;j++);
}
/*函数功能:延时若干ms*/
void delaynms(uchar n)
{
uchar i;
for(i=0;i<n;i++)
delay1ms();
}
/*函数功能:将模式设置指令或显示地址写入液晶模块*/
void WriteInstruction(uchar dictate)
{
RS=0;RW=0;//写指令
P0=dictate;//将数据给P0口
delaynms(5);
E=1;//开始写入液晶模块
delaynms(5);
E=0;//液晶模块开始执行命令
}
/*函数功能:指定字符显示的实际地址*/
void WriteAddress(uchar x)
{
WriteInstruction(x|0x80);
}
/*函数功能:将数据写入液晶模块*/
void WriteData(uchar y)
{
RS=1;RW=0;//写数据
P0=y;//将数据给P0口
delaynms(5);
E=1;//开始写入液晶模块
delaynms(5);
E=0;//液晶模块开始执行命令
}
/*函数功能:对LCD的显示模式初始化*/
void LcdInitiate(void)
{
delaynms(15);
WriteInstruction(0x38);
delaynms(5);
WriteInstruction(0x38);
delaynms(5);
WriteInstruction(0x38);
delaynms(5);
WriteInstruction(0x0c);
delaynms(5);
WriteInstruction(0x06);
delaynms(5);
WriteInstruction(0x01);
delaynms(5);
}
/*LCD1602数据的显示模式*/
/*函数功能:显示秒*/
void DisplaySecond(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
WriteAddress(0x49);
WriteData(digit[i]);
WriteData(digit[j]);
delaynms(50);
}
/*函数功能:显示分*/
void DisplayMinute(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
WriteAddress(0x46);
WriteData(digit[i]);
WriteData(digit[j]);
delaynms(50);
}
/*函数功能:显示小时*/
void DisplayHour(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
WriteAddress(0x43);
WriteData(digit[i]);
WriteData(digit[j]);
delaynms(50);
}
/*函数功能:显示日*/
void DisplayDay(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
WriteAddress(0x0c);
WriteData(digit[i]);
WriteData(digit[j]);
delaynms(50);
}
/*函数功能:显示月*/
void DisplayMonth(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
WriteAddress(0x09);
WriteData(digit[i]);
WriteData(digit[j]);
delaynms(50);
}
/*函数功能:显示年*/
void DisplayYear(uchar x)
{
uchar i,j;
i=x/10;
j=x%10;
WriteAddress(0x06);
WriteData(digit[i]);
WriteData(digit[j]);
delaynms(50);
}
/*函数功能:主函数*/
void main(void)
{
uchar second,minute,hour,day,month,year;
uchar ReadValue;
LcdInitiate();
WriteAddress(0x01);
WriteData('D');
WriteData('a');
WriteData('t');
WriteData('e');
WriteData(':');
WriteAddress(0x08);
WriteData('-');
WriteAddress(0x0b);
WriteData('-');
WriteAddress(0x45);
WriteData(':');
WriteAddress(0x48);
WriteData(':');
Init_DS1302();
while(1)
{
ReadValue=ReadSet1302(0x81); //从DS1302的秒寄存器读出数据
second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f); //BCD码转 十进制数
DisplaySecond(second);
ReadValue=ReadSet1302(0x83); //从分寄存器读数据
minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
DisplayMinute(minute);
ReadValue=ReadSet1302(0x85); //从小时寄存器读数据
hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
DisplayHour(hour);
ReadValue=ReadSet1302(0x87); //从日寄存器读数据
day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
DisplayDay(day);
ReadValue=ReadSet1302(0x89); //从月寄存器读数据
month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
DisplayMonth(month);
ReadValue=ReadSet1302(0x8d); //从年寄存器读数据
year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0f);
DisplayYear(year);
}
} |