DS1302程序
时间:10-02
整理:3721RD
点击:
写的DS1302+LCD1602的程序,运行后,年月日显示一直在闪烁,而且日,分,秒还会出现乱码(?),不知道是哪里出问题了。懂的指点一下。谢了。下面是程序:
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sck=P3^6;
sbit ds_io=P3^4;
sbit rst=P3^5;
sbit rs=P2^6;
sbit rw=P2^5;
sbit lcde=P2^7;
uchar nian,yue,ri,shi,fen,miao,week;
uchar code table[]="20 - - ";
uchar code table1[]=" : : ";
uchar time_data[7]={13,5,8,16,0,20,50};//年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
void write_ds1302_byte(uchar dat);
void write_ds1302(uchar add,uchar dat);
uchar read_ds1302(uchar add);
void set_rtc();
void read_rtc();
void time_pros();
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//LCD1602写命令函数
{
rs=0;
rw=0;
lcde=0;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void write_data(uchar dat)//LCD1602写数据函数
{
rs=1;
rw=0;
lcde=0;
P0=dat;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void write_sfm(uchar add,uchar dat)//写时分秒函数
{
uchar a,b;
a=dat/16;
b=dat%16;
write_com(0x80+0x40+add);
write_data(0x30+a);
write_data(0x30+b);
}
void write_nyr(uchar add,uchar dat)//写年月日函数
{
uchar shi,ge;
shi=dat/16;
ge=dat%16;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_week(uchar week)//写星期函数
{
week=week%16;
write_com(0x80+11);
switch(week)
{
case 1: write_data('M');
delay(5);
write_data('O');
delay(5);
write_data('N');
break;
case 2: write_data('T');
delay(5);
write_data('U');
delay(5);
write_data('E');
break;
case 3: write_data('W');
delay(5);
write_data('E');
delay(5);
write_data('N');
break;
case 4: write_data('T');
delay(5);
write_data('H');
delay(5);
write_data('U');
break;
case 5: write_data('F');
delay(5);
write_data('R');
delay(5);
write_data('I');
break;
case 6: write_data('S');
delay(5);
write_data('A');
delay(5);
write_data('T');
break;
case 7: write_data('S');
delay(5);
write_data('U');
delay(5);
write_data('N');
break;
}
}
void init()//初始化函数
{
uchar i;
write_com(0x38);//液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(i=0;i<14;i++)//写时钟固定部分
{
write_data(table[i]);
delay(1);
}
write_com(0x80+0x40);
for(i=0;i<9;i++)
{
write_data(table1[i]);
delay(1);
}
}
void main()
{
init();
// set_rtc(); 初次上电是DS1302初始化
read_rtc();//读出DS1302的时间
time_pros();//时间转化并在液晶显示
}
void write_ds1302_byte(uchar dat)//向DS1302写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
ds_io=dat&0x01;
dat=dat>>1;
sck=1;
}
}
void write_ds1302(uchar add,uchar dat)//向DS1302写数据
{
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
_nop_();
sck=1;
ds_io=1;
}
uchar read_ds1302(uchar add)//从1302读数据
{
uchar i,tmp;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
tmp=tmp>>1;
sck=0;
if(ds_io)
tmp=tmp|0x80;
sck=1;
}
rst=0;
_nop_();
sck=0;
_nop_();
ds_io=1;
return tmp;
}
void set_rtc()//1302上电初始化
{
uchar i,j;
for(i=0;i<7;i++)
{
j=time_data[i]/10;//取十位
time_data[i]=time_data[i]%10;//取个位
time_data[i]=j*16+time_data[i];
}
write_ds1302(0x8e,0x00);
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80);
}
void read_rtc()//从DS1302读出时间
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
void time_pros()//时间转化并显示函数
{
/* nian=time_data[0];
week=time_data[1];
yue=time_data[2];
ri=time_data[3];
shi=time_data[4];
fen=time_data[5];
miao=time_data[6];
write_nyr(2,nian);
write_week(week);
write_nyr(5,yue);
write_nyr(8,ri);
write_sfm(1,shi);
write_sfm(4,fen);
write_sfm(7,miao);*/
write_nyr(2,time_data[0]);
write_week(time_data[1]);
write_nyr(5,time_data[2]);
write_nyr(8,time_data[3]);
write_sfm(1,time_data[4]);
write_sfm(4,time_data[5]);
write_sfm(7,time_data[6]);
}
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit sck=P3^6;
sbit ds_io=P3^4;
sbit rst=P3^5;
sbit rs=P2^6;
sbit rw=P2^5;
sbit lcde=P2^7;
uchar nian,yue,ri,shi,fen,miao,week;
uchar code table[]="20 - - ";
uchar code table1[]=" : : ";
uchar time_data[7]={13,5,8,16,0,20,50};//年周月日时分秒
uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
void write_ds1302_byte(uchar dat);
void write_ds1302(uchar add,uchar dat);
uchar read_ds1302(uchar add);
void set_rtc();
void read_rtc();
void time_pros();
void delay(uint z)//延时函数
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void write_com(uchar com)//LCD1602写命令函数
{
rs=0;
rw=0;
lcde=0;
P0=com;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void write_data(uchar dat)//LCD1602写数据函数
{
rs=1;
rw=0;
lcde=0;
P0=dat;
delay(5);
lcde=1;
delay(5);
lcde=0;
}
void write_sfm(uchar add,uchar dat)//写时分秒函数
{
uchar a,b;
a=dat/16;
b=dat%16;
write_com(0x80+0x40+add);
write_data(0x30+a);
write_data(0x30+b);
}
void write_nyr(uchar add,uchar dat)//写年月日函数
{
uchar shi,ge;
shi=dat/16;
ge=dat%16;
write_com(0x80+add);
write_data(0x30+shi);
write_data(0x30+ge);
}
void write_week(uchar week)//写星期函数
{
week=week%16;
write_com(0x80+11);
switch(week)
{
case 1: write_data('M');
delay(5);
write_data('O');
delay(5);
write_data('N');
break;
case 2: write_data('T');
delay(5);
write_data('U');
delay(5);
write_data('E');
break;
case 3: write_data('W');
delay(5);
write_data('E');
delay(5);
write_data('N');
break;
case 4: write_data('T');
delay(5);
write_data('H');
delay(5);
write_data('U');
break;
case 5: write_data('F');
delay(5);
write_data('R');
delay(5);
write_data('I');
break;
case 6: write_data('S');
delay(5);
write_data('A');
delay(5);
write_data('T');
break;
case 7: write_data('S');
delay(5);
write_data('U');
delay(5);
write_data('N');
break;
}
}
void init()//初始化函数
{
uchar i;
write_com(0x38);//液晶初始化
write_com(0x0c);
write_com(0x06);
write_com(0x01);
write_com(0x80);
for(i=0;i<14;i++)//写时钟固定部分
{
write_data(table[i]);
delay(1);
}
write_com(0x80+0x40);
for(i=0;i<9;i++)
{
write_data(table1[i]);
delay(1);
}
}
void main()
{
init();
// set_rtc(); 初次上电是DS1302初始化
read_rtc();//读出DS1302的时间
time_pros();//时间转化并在液晶显示
}
void write_ds1302_byte(uchar dat)//向DS1302写一个字节
{
uchar i;
for(i=0;i<8;i++)
{
sck=0;
ds_io=dat&0x01;
dat=dat>>1;
sck=1;
}
}
void write_ds1302(uchar add,uchar dat)//向DS1302写数据
{
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
write_ds1302_byte(dat);
rst=0;
_nop_();
sck=1;
ds_io=1;
}
uchar read_ds1302(uchar add)//从1302读数据
{
uchar i,tmp;
rst=0;
_nop_();
sck=0;
_nop_();
rst=1;
_nop_();
write_ds1302_byte(add);
for(i=0;i<8;i++)
{
tmp=tmp>>1;
sck=0;
if(ds_io)
tmp=tmp|0x80;
sck=1;
}
rst=0;
_nop_();
sck=0;
_nop_();
ds_io=1;
return tmp;
}
void set_rtc()//1302上电初始化
{
uchar i,j;
for(i=0;i<7;i++)
{
j=time_data[i]/10;//取十位
time_data[i]=time_data[i]%10;//取个位
time_data[i]=j*16+time_data[i];
}
write_ds1302(0x8e,0x00);
for(i=0;i<7;i++)
{
write_ds1302(write_add[i],time_data[i]);
}
write_ds1302(0x8e,0x80);
}
void read_rtc()//从DS1302读出时间
{
uchar i;
for(i=0;i<7;i++)
{
time_data[i]=read_ds1302(read_add[i]);
}
}
void time_pros()//时间转化并显示函数
{
/* nian=time_data[0];
week=time_data[1];
yue=time_data[2];
ri=time_data[3];
shi=time_data[4];
fen=time_data[5];
miao=time_data[6];
write_nyr(2,nian);
write_week(week);
write_nyr(5,yue);
write_nyr(8,ri);
write_sfm(1,shi);
write_sfm(4,fen);
write_sfm(7,miao);*/
write_nyr(2,time_data[0]);
write_week(time_data[1]);
write_nyr(5,time_data[2]);
write_nyr(8,time_data[3]);
write_sfm(1,time_data[4]);
write_sfm(4,time_data[5]);
write_sfm(7,time_data[6]);
}
void main()
{
init();
// set_rtc(); 初次上电是DS1302初始化
while(1)
{ read_rtc();//读出DS1302的时间
time_pros();//时间转化并在液晶显示
}
} 试试看
