单片机c语言电子万年历完整程序.docx
- 文档编号:30763942
- 上传时间:2023-08-23
- 格式:DOCX
- 页数:27
- 大小:18.64KB
单片机c语言电子万年历完整程序.docx
《单片机c语言电子万年历完整程序.docx》由会员分享,可在线阅读,更多相关《单片机c语言电子万年历完整程序.docx(27页珍藏版)》请在冰豆网上搜索。
单片机c语言电子万年历完整程序
该程序为51单片机c语言电子万年历
#include"reg52.h"
//#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcden=P3^4;
sbitlcdrs=P3^5;
sbitDATA=P0^7;
sbitRST=P0^5;
sbitSCLK=P0^6;
sbitmenu=P3^0;//菜单
sbitadd=P3^1;//加一
sbitdec=P3^7;//减一
sbitled0=P1^0;
sbitled1=P1^1;
sbitled2=P1^2;
sbitled3=P1^3;
sbitds=P3^2;
//sbitbeep=P3^3;
uinttemp;
floatf_temp;
uintwarn_l1=270;
uintwarn_l2=250;
uintwarn_h1=300;
uintwarn_h2=320;
uintget_temp();
voiddelayms(uintx);
voidwrite_com(ucharcom);
voidwrite_data(uchardate);
voidinit();
voiddis_temp(uintt);
voidWrite1302(uchardat);
voidWriteSet1302(ucharCmd,uchardat);
ucharRead1302(void);
ucharReadSet1302(ucharCmd);
voidInit_DS1302(void);
voidDisplaySecond(ucharx);
voidDisplayMinute(ucharx);
voidDisplayHour(ucharx);
voidDisplayDay(ucharx);
voidDisplayMonth(ucharx);
voidDisplayYear(ucharx);
voidDisplayWeek(ucharx);
voiddis_temp(uintt);
voidread_date(void);
voidturn_val(charnewval,ucharflag,
ucharnewaddr,uchars1num);
voidkey_scan(void);
ucharcodetable2[]="TUEWESTHUFRISATSUNMON";
ucharsecond,minute,hour,day,month,year,week,count=0;
ucharReadValue,num,time;
voiddelayms(uintx)
{
uinti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
////////////////////////////////////////////////////////////
voidwrite_com(ucharcom)
{
lcdrs=0;
P2=com;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
voidwrite_data(uchardate)
{
lcdrs=1;
P2=date;
delayms(5);
lcden=1;
delayms(5);
lcden=0;
}
voidinit()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
/////////////////////////////////////////////////////////////////
voidWrite1302(uchardat)
{
uchari;
SCLK=0;//拉低SCLK,为脉冲上升沿写入数据做好准备
delayms
(2);//稍微等待,使硬件做好准备
for(i=0;i<8;i++)//连续写8个二进制位数据
{
DATA=dat&0x01;//取出dat的第0位数据写入1302
delayms
(2);//稍微等待,使硬件做好准备
SCLK=1;//上升沿写入数据
delayms
(2);//稍微等待,使硬件做好准备
SCLK=0;//重新拉低SCLK,形成脉冲
dat>>=1;//将dat的各数据位右移1位,准备写入下一个数据位
}
}
voidWriteSet1302(ucharCmd,uchardat)
{
RST=0;//禁止数据传递
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
delayms
(2);//稍微等待,使硬件做好准备
Write1302(Cmd);//写入命令字
Write1302(dat);//写数据
SCLK=1;//将时钟电平置于已知状态
RST=0;//禁止数据传递
}
ucharRead1302(void)
{
uchari,dat;
delayms
(2);//稍微等待,使硬件做好准备
for(i=0;i<8;i++)//连续读8个二进制位数据
{
dat>>=1;//将dat的各数据位右移1位,因为先读出的是字节的最低位
if(DATA==1)//如果读出的数据是1
dat|=0x80;//将1取出,写在dat的最高位
SCLK=1;//将SCLK置于高电平,为下降沿读出
delayms
(2);//稍微等待
SCLK=0;//拉低SCLK,形成脉冲下降沿
delayms
(2);//稍微等待
}
returndat;//将读出的数据返回
}
ucharReadSet1302(ucharCmd)
{
uchardat;
RST=0;//拉低RST
SCLK=0;//确保写数居前SCLK被拉低
RST=1;//启动数据传输
Write1302(Cmd);//写入命令字
dat=Read1302();//读出数据
SCLK=1;//将时钟电平置于已知状态
RST=0;//禁止数据传递
returndat;//将读出的数据返回
}
voidInit_DS1302(void)
{
WriteSet1302(0x8E,0x00);//根据写状态寄存器命令字,写入不保护指令
WriteSet1302(0x80,((0/10)<<4|(0%10)));//根据写秒寄存器命令字,写入秒的初始值
WriteSet1302(0x82,((59/10)<<4|(59%10)));//根据写分寄存器命令字,写入分的初始值
WriteSet1302(0x84,((23/10)<<4|(23%10)));//根据写小时寄存器命令字,写入小时的初始值
WriteSet1302(0x86,((28/10)<<4|(28%10)));//根据写日寄存器命令字,写入日的初始值
WriteSet1302(0x88,((2/10)<<4|(2%10)));//根据写月寄存器命令字,写入月的初始值
WriteSet1302(0x8c,((14/10)<<4|(14%10)));//nian
//WriteSet1302(0x8a,((4/10)<<4|(4%10)));
}
/////////////////////////////////////////////////////////////////
voidDisplaySecond(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
write_com(0x80+0x46);
write_data(i+0x30);
write_com(0x80+0x47);
write_data(j+0x30);
write_com(0x80+0x48);
write_data('');
dis_temp(get_temp());
}
voidDisSecond(ucharx)
{
uchari,j;
ReadValue=ReadSet1302(0x81);
second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
i=x/10;
j=x%10;
write_com(0x80+0x46);
write_data(i+0x30);
write_com(0x80+0x47);
write_data(j+0x30);
}
voidDisplayMinute(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
write_com(0x80+0x43);
write_data(i+0x30);
write_com(0x80+0x44);
write_data(j+0x30);
write_com(0x80+0x45);
write_data(':
');
}
voidDisplayHour(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
write_com(0x80+0x40);
write_data(i+0x30);
write_com(0x80+0x41);
write_data(j+0x30);
write_com(0x80+0x42);
write_data(':
');
}
voidDisplayDay(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
write_com(0x89);
write_data(i+0x30);
write_com(0x8a);
write_data(j+0x30);
}
voidDisplayMonth(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
write_com(0x86);
write_data(i+0x30);
write_com(0x87);
write_data(j+0x30);
write_com(0x88);
write_data('/');
}
voidDisplayYear(ucharx)
{
uchari,j;
i=x/10;
j=x%10;
write_com(0x81);
write_data(2+0x30);
write_com(0x82);
write_data(0+0x30);
write_com(0x83);
write_data(i+0x30);
write_com(0x84);
write_data(j+0x30);
write_com(0x85);
write_data('/');
}
voidDisplayWeek(ucharx)
{uchari;
x=x*3;
//write_com(0x8c);write_data(table2[x]);
//write_com(0x8d);write_data(table2[x+1]);
//write_com(0x8e);write_data(table2[x+2]);
write_com(0x8c);
for(i=0;i<3;i++)
{
write_data(table2[x]);
x++;
}
}
voidread_date(void)
{
ReadValue=ReadSet1302(0x81);
second=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=ReadSet1302(0x83);
minute=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=ReadSet1302(0x85);
hour=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=ReadSet1302(0x87);
day=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=ReadSet1302(0x89);
month=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=ReadSet1302(0x8d);
year=((ReadValue&0x70)>>4)*10+(ReadValue&0x0F);
ReadValue=ReadSet1302(0x8b);//读星期
week=ReadValue&0x07;
DisplayYear(year);
DisplayMonth(month);
DisplayDay(day);
DisplayWeek(week);
DisplayHour(hour);
DisplayMinute(minute);
DisplaySecond(second);
dis_temp(get_temp());///温度显示
key_scan();///按键检测
}
voidturn_val(charnewval,ucharflag,ucharnewaddr,uchars1num)
{
newval=ReadSet1302(newaddr);//读取当前时间
newval=((newval&0x70)>>4)*10+(newval&0x0f);//将bcd码转换成十进制
if(flag)//判断是加一还是减一
{
newval++;
switch(s1num)
{case1:
if(newval>99)newval=0;
DisplayYear(newval);
break;
case2:
if(newval>12)newval=1;
DisplayMonth(newval);
break;
case3:
if(newval>31)newval=1;
DisplayDay(newval);
break;
case4:
if(newval>6)newval=0;
DisplayWeek(newval);
break;
case5:
if(newval>23)newval=0;
DisplayHour(newval);
break;
case6:
if(newval>59)newval=0;
DisplayMinute(newval);
break;
case7:
if(newval>59)newval=0;
DisplaySecond(newval);
break;
default:
break;
}
}
else
{
newval--;
switch(s1num)
{case1:
if(newval==0)newval=99;
DisplayYear(newval);
break;
case2:
if(newval==0)newval=12;
DisplayMonth(newval);
break;
case3:
if(newval==0)newval=31;
DisplayDay(newval);
break;
case4:
if(newval<0)newval=6;
DisplayWeek(newval);
break;
case5:
if(newval<0)newval=23;
DisplayHour(newval);
break;
case6:
if(newval<0)newval=59;
DisplayMinute(newval);
break;
case7:
if(newval<0)newval=59;
DisplaySecond(newval);
break;
default:
break;
}
}
WriteSet1302((newaddr-1),((newval/10)<<4)|(newval%10));//将新数据写入寄存器
}
//////////////////////////////////////
voiddsreset(void)
{
uinti;
ds=0;
i=103;
while(i>0)
i--;
ds=1;
i=4;
while(i>0)
i--;
}
bittempreadbit(void)
{
uinti;
bitdat;
ds=0;i++;
ds=1;i++;i++;
dat=ds;
i=8;
while(i>0)
i--;
return(dat);
}
uchartempread(void)
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tempreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
voidtempwritebyte(uchardat)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)
{
ds=0;
i++;i++;
ds=1;
i=8;
while(i>0)
i--;
}
else
{
ds=0;
i=8;
while(i>0)i--;
ds=1;
i++;i++;
}
}
}
voidtempchange(void)
{
dsreset();
delayms
(1);
tempwritebyte(0xcc);
tempwritebyte(0x44);
key_scan();//////按键函数
}
uintget_temp()
{
uchara,b;
tempchange();//////温度函数
dsreset();
delayms
(1);
tempwritebyte(0xcc);
tempwritebyte(0xbe);
a=tempread();
b=tempread();
temp=b;
temp<<=8;
temp=temp|a;
f_temp=temp*0.0625;
temp=f_temp*10+0.5;
f_temp=f_temp+0.05;
returntemp;
}
//////
voiddis_temp(uintt)
{
ucharn1,n2,n3;
n1=t/100;
n2=t%100/10;
n3=t%100%10;
DisSecond(second);///秒显示
write_com(0x80+0x49);
write_data(table[n1]);
//delayms(5);
write_com(0x80+0x4a);
write_data(table[n2]);
//delayms(5);
write_com(0x80+0x4b);
write_data('.');
//delayms(5);
write_com(0x80+0x4c);
write_data(table[n3]);
//delayms(5);
write_com(0x80+0x4d);
write_data('^');
//delayms(5);
write_com(0x80+0x4e);
write_data('C');
//delayms(5);
DisSecond(second);////秒显示
}
/*********************液晶显示*****************/
voidwarn(uints,ucharled)
{
uchari;i=s;
//beep=0;
P1=~(led);
while(i--)
{
dis_temp(get_temp());
}
//beep=1;
P1=0xff;
i=s;
while(i--)
{
dis_temp(get_temp());
}
}
voiddeal(uintt)
{
uchari;
if((t>warn_l2)&&(t<=warn_l1))
{
warn(40,0x01);
}
elseif(t<=warn_l2)
{
warn(10,0x03);
}
elseif((t
{
warn(40,0x04);
}
elseif(t>=warn_h2)
{
warn(10,0x0c);
}
else
{
i=40;
while(i--)
{dis_temp(get_temp());
DisSecond(second);}
}
}
///////////////////////////////////////
voidmain()
{
init();
Init_DS1302();
while(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 语言 电子 万年历 完整 程序