单片机万年历的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);
}
}
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)
-
佚名2024-06-08 18:59:44
问c语言万年历程序设计
答功能要求:模仿现实生活中的挂历. 当前页以系统当前日期的月份为准显...答:#include int leap (int year) {if(year%4==0...
-
佚名2024-06-08 08:00:00
问万年历查询程序. c语言代码
答除了天数差计算,基本上是完成了你所提出的功能(天数差计算其实已经提供了年内序数计算方方法,可以在此基础上完善即可)。包含星期计算、公历转农历、农历转公历、节气查...
-
佚名2024-06-08 08:00:00
-
佚名2024-06-08 08:00:00
问c语言万年历程序
答出现无限递归的问题,我提供的头文件是不会有这样的问题的,请查看是否有递归调用的问题,同时,检查项目设置属性是否正确。另附原始头文件如下:#ifndef _hel...
-
佚名2024-06-08 08:00:00
问用c#编写一个万年历程序
答借贵宝地拿点经验,不谢
-
佚名2024-06-08 08:00:00
问用c语言编写万年历程序
答// test1.cpp : defines the entry point for the console application.//#include &l...
-
佚名2024-06-08 08:00:00
问用c语言写万年历
答写万年历程序,您需要先了解万年历的特点 下面是万年历的特点(复制粘贴的):1. 平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年...
-
佚名2024-06-08 08:00:00
问单片机万年历的怎样设计的?c语言版
答分析:硬件:需要设计89c51+lcd1602,一般有现成的;再采用 spi 三线接口设计ds1302,一般也有类似的;估计还需要设计键盘,输入时间。程序:功能...
-
佚名2024-06-08 08:00:00
问用51单片机制作可以显示年月日时分秒的万年历,有电路图和汇编语言程序。
答可以,有1602lcd就可以记得采纳啊
-
佚名2024-06-08 08:00:00
问关于c++编写万年历程序
答// abc4.cpp : 定义控制台应用程序的入口点。//#include "stdafx.h"#include<stdio.h>#include<...
风水
起名
网名
- 1 可怜网名
- 2 五个五个字的网名
- 3 半 半 半 的网名
- 4 八个字的网名前面是笑到猖狂
- 5 以中药取的好听网名
- 6 支付宝昵称宝宝
- 7 群主的专属头衔昵称
- 8 好听的微信昵称带茶的四个字
- 9 父亲称呼儿子最亲的昵称
- 10 很骚的情侣昵称
说说
- 1 个性签名拼搏事业
- 2 情侣套装网名 个性签名
- 3 生活百态说说
- 4 家族聚会的说说
- 5 自家种的西瓜说说
- 6 海边开心心情说说
- 7 说说 淋 字的意思
- 8 微信朋友圈说说超拽霸气
- 9 前男友结婚的朋友圈说说
- 10 美味烤鱼的说说