QQ网名大全

单片机万年历的c语言程序

没分啊 那也给你发一个吧
ds1302+ds18b20 用1602显示
我在protues**上做的 你可以根据程序画电路图 很简单
程序 采用模块化方式
/*初始化*/
#define uint unsigned int
#define uchar unsigned char
uchar code tab[]=" 20 - - " ;
uchar code table[]=" : : ";
uchar code ttable[]={"now temperature:"} ;
**it rs=p3^0;
**it e=p3^1;
**it button1=p1^0;
**it button2=p1^3;
**it button3=p1^6;
**it rst=p2^5;
**it sclk=p2^6;
**it io=p2^7;
**it acc7=acc^7;
**it dq=p3^6;
char hour,minute,second,n,k,week,day,month,year1=20 ,year,nn,flag;
uchar key=0;
uint tem,a;
void delay(uint x)
{
while(x--);
}
void write_zl(uchar zl)
{e=0;
rs=0;
p0=zl;
e=1;
delay(500);
e=0;
}
void write_sj(uchar sj)
{e=0;
rs=1;
p0=sj;
e=1;
delay(500);
e=0;
}
void init_lcd()
{
write_zl(0x38);//开显示
write_zl(0x01);//清屏
write_zl(0x06);//整屏不移动
write_zl(0x0c);//不开光标
}
/*18b20*/部分
void init_18b20()
{ dq=1;
delay(8); //延时
dq=0;
delay(80);
dq=1;
delay(20);
}
void write_dat(uchar dat)
{ uchar i,k;
k=dat;
for(i=0;i<8;i++)
{ dq=0;
dq=k&0x01;//从低位开始
delay(5);
dq=1;
k>>=1;
}
delay(4);
}

int read_sj()
{
uchar j,date;
for(j=0;j<8;j++)
{
dq=1;
delay(1);
dq=0;
date=date>>1;
dq=1;
if(dq==1) //
date|=0x80;
delay(4);}
return(date);
}
void temperaturechange()
{ uint temph,templ;
init_18b20();
write_dat(0xcc);//只对一个操作就跳过读序列号操作
write_dat(0x44); //启动温度转换
delay(60000);
delay(33750);//需要93.75ms
init_18b20();
write_dat(0xcc);
write_dat(0xbe);//读温度寄存器

templ=read_sj();//读取温度低位l**
temph=read_sj();//读取温度高位m**
if(temph&0x80) //高5位是1为负数
{ a=1;
tem=temph;
tem<<=8; //共16位
tem=tem|templ; //合并高低位数
tem=~tem+1;
tem=tem*(0.0625);
}
else
{
a=0;
tem=((temph*256)+templ)*0.0625;//转换实际温度
}
}
void write_temperature(uint temp) //被调用的函数必须在前
{ uint bai,shi,ge;
bai=temp/100;
shi=temp%100/10;
ge=temp%10;
if(a==1)
{ if(shi>0)
{write_zl(0x80+0x50+3);
write_sj('-');
write_zl(0x80+0x50+4);
write_sj(0x30+shi); }
else
{
write_zl(0x80+0x50+3);
write_sj(0x00);
write_zl(0x80+0x50+4);
write_sj('-');}
}

else
{
if(bai>0) //若bai显示shi肯定显示
{
write_zl(0x80+0x50+3);
write_sj(0x30+bai);
write_zl(0x80+0x50+4);
write_sj(0x30+shi);
}
else
{
if(shi>0) //否则判断shi是否显示
{
write_zl(0x80+0x50+4);
write_sj(0x30+shi);
}
else
{
write_zl(0x80+0x50+4);
write_sj(0x00);
}
write_zl(0x80+0x50+3);
write_sj(0x00);
}
}

write_zl(0x80+0x50+5); //个位公用总的显示
write_sj(0x30+ge);
}

/*ds1302部分*/
void ds1302_write(uchar shju)
{ uchar s,j;
s=shju;
for(j=0;j<8;j++)
{ io=s&0x01;
sclk=0;
sclk=1;

s=s>>1;
}}
uchar ds1302_readbyte()
{ uchar i,r=0;
sclk=0;
delay(10);
for(i=8;i>0;i--)
{
acc=acc>>1;
acc7=io;
sclk=1;
sclk=0;
}
return(acc);
/*{
r=r>>1;
if(io==1)
r=r|0x80;
sclk=1;
sclk=0;
}
return(r); */}

void ds1302write(uchar dz,uchar shij)//初始化1302
{ rst=1;
sclk=0;
ds1302_write(dz);
ds1302_write(shij);
sclk=1;
rst=0;
}
void start1302()
{ uchar num;
for(num=0;num<13;num++)
{ write_sj(tab[num]);}
for(num=13;num<16;num++)
{ write_sj(tab[num]);}
write_zl(0x80+0x40);
for(num=0;num<12;num++)
{ write_sj(table[num]);
}}
void write_hms(uchar add,uchar sj) //被调用的函数必须在前
{ uchar shi,ge;
shi=sj/10;
ge=sj%10;
write_zl(0x80+0x40+add);
write_sj(0x30+shi);
write_sj(0x30+ge); }
void write_nyr(uchar add,uchar sj)
{ uchar shi,ge;
shi=(sj/10);
ge=(sj%10);
write_zl(0x80+add);
write_sj(0x30+shi);
write_sj(0x30+ge); }
void write_xq(uchar wk)
{ write_zl(0x80+13);
switch(wk)
{ case 2: write_sj('m'); write_sj('o');write_sj('n'); break;
case 3: write_sj('t'); write_sj('u');write_sj('e'); break;
case 4: write_sj('w'); write_sj('e');write_sj('d'); break;
case 5: write_sj('t'); write_sj('h');write_sj('u'); break;
case 6: write_sj('f'); write_sj('r');write_sj('i'); break;
case 7: write_sj('s'); write_sj('a');write_sj('t'); break;
case 1: write_sj('s'); write_sj('u');write_sj('n'); break;
}
}
void write_day(uchar rue)
{
switch(rue)
{
case 1: nn=31;break;
case 2: if((year%4==0&&year%100!=0)||year%400==0)
nn=29;
else
nn=28;break;
case 3: nn=31;break;
case 4: nn=30;break;
case 5: nn=31;break;
case 6: nn=30;break;
case 7: nn=31;break;
case 8: nn=31;break;
case 9: nn=30;break;
case 10: nn=31;break;
case 11: nn=30;break;
case 12: nn=31;break;
}}
void keyboard()
{
if(button1==0)
{ delay(5);
if(button1==0)
{ while(button1==0);
key++; flag=1;
switch(key)
{ case 1: write_zl(0x80+0x40+10);
write_zl(0x0f); break;//shan shuo
case 2: write_zl(0x80+0x40+7); break;
case 3: write_zl(0x80+0x40+4); break;
case 4: write_zl(0x80+10); break;
case 5: write_zl(0x80+7); break;
case 6: write_zl(0x80+4); break;
case 7: write_zl(0x80+2); break;
case 8: key=0;
write_zl(0x0c);
flag=0;
ds1302write(0x80,second);
ds1302write(0x82,minute);
ds1302write(0x84,hour);
ds1302write(0x86,day);
ds1302write(0x88,month);
ds1302write(0x8a,week);
ds1302write(0x8c,year);break;
}
}}
if(button2==0)
{ delay(10);
if(button2==0)
{ while(button2==0);
switch(key)
{case 1: second++;if(second==60)second=0;
write_hms(10,second); write_zl(0x80+0x40+10); break;
case 2: minute++;if(minute==60)minute=0;
write_hms(7,minute);write_zl(0x80+0x40+7); break;
case 3: hour++;if(hour==24)hour=0;
write_hms(4,hour); write_zl(0x80+0x40+4); break;
case 4: day++;week++;
if(week==8)week=1;write_xq(week);
write_day(month); if(day==nn+1)day=1;
write_nyr(10,day);write_zl(0x80+10); break;
case 5: month++;if(month==13)month=1;
write_nyr(7,month);write_zl(0x80+7); break;
case 6: year++ ;if(year==100)year=0;
write_nyr(4,year);write_zl(0x80+4); break;
case 7: year1++ ;if(year1==100)year1=0;
write_nyr(2,year1);write_zl(0x80+2); break;
}}}
if(button3==0)
{delay(10);
if(button3==0)
{ while(button3==0);
switch(key)
{case 1: second--;if(second<0)second=59;
write_hms(10,second); write_zl(0x80+0x40+10); break;
case 2: minute--;if(minute<0)minute=59;
write_hms(7,minute);write_zl(0x80+0x40+7); break;
case 3: hour--;if(hour<0)hour=23;
write_hms(4,hour);write_zl(0x80+0x40+4); break;
case 4: week--;if(week==0)week=7;write_xq(week);
day--; write_day(month); if(day==0)day=nn;
write_nyr(10,day);write_zl(0x80+10); break;
case 5: month--;if(month==0)month=12;
write_nyr(7,month);write_zl(0x80+7); break;
case 6: year-- ;if(year<0)year=99;
write_nyr(4,year);write_zl(0x80+4); break;
case 7: year1-- ;if(year1<0)year1=99;
write_nyr(2,year1);write_zl(0x80+2); break;}
}}
}

void ds1302_sfm()
{ uchar a,b;
rst=1; //高电平期间启动一次数据转换
ds1302_write(0x81);
second=ds1302_readbyte();
rst=0;// 结束转换
a=second/16;//bcd码转换
b=second%16;
second=a*10+b;
write_hms(10,second);
//分
rst=1;
ds1302_write(0x83);
minute= ds1302_readbyte();
a=minute/16;
b=minute%16;
minute=a*10+b;
write_hms(7,minute);
rst=0;
//时
rst=1;
ds1302_write(0x85);
hour= ds1302_readbyte();
rst=0;
a=hour/16;
b=hour%16;
hour=a*10+b;
write_hms(4,hour);
//日
rst=1;
ds1302_write(0x87);
day= ds1302_readbyte();
rst=0;
a=day/16;
b=day%16;
day=a*10+b;
write_nyr(10,day);
//月
rst=1;
ds1302_write(0x89);
month= ds1302_readbyte();
rst=0;
a=month/16;
b=month%16;
month=a*10+b;
write_nyr(7,month);
// 周
rst=1;
ds1302_write(0x8b);
week= ds1302_readbyte();
rst=0;
a=week/16;
b=week%16;
week=a*10+b;
write_xq(week);
// 年
sclk=0;
delay(5);
rst=1;
ds1302_write(0x8d);
io=1;
year= ds1302_readbyte();
rst=0;
delay(5);
sclk=1;
a=year/16;
b=year%16;
year=a*10+b;
write_nyr(4,year);
}
/* 总程序*/
#include<reg51.h>
#include<init.h>
#include<ds1302.h>
#include<18b20.h>
void main()
{
init_lcd();

start1302();
while(1)
{
rst=0;
keyboard();
if(flag==0) //标志位为0才能读取1302,否则按键无效
ds1302_sfm();

write_zl(0x80+0x10);
for(n=0;n<16;n++)
write_sj(ttable[n]);
temperaturechange();
write_temperature(tem);
}
}
佚名
2024-06-08 06:17:42
最佳回答
类似问题(10)