温度电子时钟程序.docx
- 文档编号:4129018
- 上传时间:2022-11-28
- 格式:DOCX
- 页数:17
- 大小:22.24KB
温度电子时钟程序.docx
《温度电子时钟程序.docx》由会员分享,可在线阅读,更多相关《温度电子时钟程序.docx(17页珍藏版)》请在冰豆网上搜索。
温度电子时钟程序
C
51
程
序
设
计
作
业
学生姓名***
专业班级自动化12-01
学号541201010101
院(系)电气信息工程学院
温度电子时钟
程序:
#include
#include
#defineLCD_RSP2_0//定义引脚
#defineLCD_RWP2_1#defineLCD_EP2_2
#defineLCD_DataP0#defineBusy0x80//用于检测LCD状态字中的Busy标识
#defineucharunsignedchar
ucharid,timecount,dipsmodid;
bitlmcinit_or_not;//是否清屏“1”是“0”否
bitflag,sflag;//flag是时钟冒号闪烁标志,sflag是温度负号显示标志
voidDisp_line1(void);//显示屏幕第一行
voidDisp_line2(void);//显示屏幕第二行
voidid_case1_key();
voidDisp_mod0(void);//显示模式0
voidDisp_mod1(void);//显示模式1
voidDisp_mod2(void);//显示模式2
ucharcodeshaci[]={"WelcomeShaci"};
ucharcodehappy[]={"HappyEveryDay"};
//***********闹钟显示定义部分
bith_flash_flag;bitm_flash_flag;
bits_flash_flag;charalarms=0,alarmid,ii=0;
voidDisp_Alarm(void);//闹钟显示
voidSet_H_Alarm(void);//闹钟小时的设置
voidSet_M_Alarm(void);//闹钟分钟的设置
voidSet_S_Alarm(void);//闹钟开关设置
voidAlarmup(void);//闹钟时间到显示
signedcharhoura=7,mina=30;//闹钟初始时间
uchara[]={"0123456789"};
sbitbeep=P3^6;//位定义,定义P3.6为蜂鸣器
voiddelay500(void);voidnaozhong(ucharn);
ucharcodealarm[]={"ALARMSET"};
ucharcodeoff[]={"OFF"};
ucharcodeon[]={"ON"};
ucharcodeup[]={"TIMEUP!
"};
//***********DS1302时间显示定义部分
sbitT_CLK=P1^0;sbitT_IO=P1^1;
sbitT_RST=P1^2;sbitACC0=ACC^0;
sbitACC7=ACC^7;
voidSet(uchar,uchar);//据选择调整相应项目
voidRTInputByte(uchar);/*输入1Byte*/
ucharRTOutputByte(void);/*输出1Byte*/
voidW1302(uchar,uchar);//向DS1302写一个字节
ucharR1302(uchar);//从DS1302读一个字节
voidSet1302(uchar*);//设置时间
bitsec,min,hour,year,mon,day,weekk;//闪烁标志位//初始化后设置为:
04年12月2日星期40点0分0秒
ucharinittime[7]={0x00,0x00,0x00,0x02,0x12,0x04,0x04};//秒分钟小日月年星期
//*****18B20温度显示定义部
sbitDQ=P3^3;//18B20接3.3口
typedefucharbyte;typedefunsignedintword;
Read_Temperature(char,char);
voidmychar(void);byteow_reset(void);
byteread_byte(void);voidwrite_byte(charval);
voidadjust_res(charres);//温度分辨率调整
//*******温度控制部分*********
bitth_flash_flag,tl_flash_flag;//上、下限闪烁
bitth_flag,tl_flag;//上、下限越限标志
bittl_sign,th_sign;//零下标志0:
零上,1:
零下
chartempid;uchartl=20,th=45,tb;
voidDisp_Temp(void);//显示上下限温度
voidSet_TH_Temp(void);//设置温度上限
voidSet_TL_Temp(void);//设置温度下限
voidCompare_Temp(signedcharl,signedcharh);//比较温度
voidTl_Al(void);voidTh_Al(void);
voidTover(void);//温度报警界面
ucharcodeover[]={"OVER!
!
"};ucharcodetemperature[]={"TEMPERATURE"};
//*******1602LCD驱动***
voidWriteDataLCD(ucharWDLCD);
voidDelay5Ms(void);voidDelay400Ms(void);
voidWriteCommandLCD(ucharWCLCD,BuysC);ucharReadStatusLCD(void);
voidLCDInit(void);
voidDOC(ucharX,ucharY,ucharDData);
voidDLC(ucharX,ucharY,ucharcode*DData);ucharcodeweek[]={"Week."};
voidmain(void)
{ucharii=0;Delay400Ms();//启动等待,等LCD讲入工作状态
LCDInit();//LCD初始化
DLC(0,0,shaci);
DLC(0,1,happy);
Delay400Ms();Delay400Ms();Delay400Ms();
LCDInit();//LCD初始化
mychar();TMOD=0x01;
TH0=(65535-50000)/256;
TL0=(65535-50000)%256;
EA=1;TR0=1;ET0=1;
W1302(0x90,0xa5);W1302(0x8e,0x80);
adjust_res(0x1f);//调整18B20的分辨率
while
(1){if(P1_7==0){dipsmodid++;
lmcinit_or_not=1;if(dipsmodid>2)dipsmodid=0;while(P1_7==0);}
switch(dipsmodid){case0:
Disp_mod0();break;
case1:
Disp_mod1();break;
case2:
Disp_mod2();break;}
if(((R1302(0x81)/16+0x30)==a[0])&&((R1302(0x81)/16+0x30)==a[0])&&((R1302(0x83)/16+0x30)==a[mina/10])&&((R1302(0x83)%16+0x30)==a[mina%10])&&((R1302(0x85)/16+0x30)==a[houra/10])&&((R1302(0x85)%16+0x30)==a[houra%10]))
{if(alarms==1){Alarmup();naozhong(10);}}
if(ii==50){ii=0;if(tb>th)
{Tover();naozhong(10);}}ii++;}}
voidDisp_mod0(void)//显示模式0
{if(lmcinit_or_not==1)
{LCDInit();lmcinit_or_not=0;}DOC(0,0,'');
if((P1_4|P1_5)==0)//初始化
{Delay5Ms();
if((P1_4|P1_5)==0)Set1302(inittime);}
if(P1_6==0)//设置和选择项目键
{Delay5Ms();if(P1_6==0){id++;if(id>7)id=0;}
while(P1_6==0);}
switch(id){case0:
sec=0;Disp_line1();Disp_line2();break;
case1year=1;Disp_line1();Disp_line2();
id_case1_key();break;:
//年
case2:
year=0;mon=1;Disp_line1();
Disp_line2();id_case1_key();break;//月
case3:
mon=0;day=1;Disp_line1();
Disp_line2();id_case1_key();break;//日
case4:
day=0;weekk=1;Disp_line1();
Disp_line2();id_case1_key();break;//星期
case5:
weekk=0;hour=1;Disp_line1();
Disp_line2();id_case1_key();break;//小时
case6:
hour=0;min=1;Disp_line1();
Disp_line2();id_case1_key();break;//分钟
case7:
min=0;sec=1;Disp_line1();
Disp_line2();id_case1_key();break;//秒}}
voidDisp_mod1(void)//显示模式1
{if(lmcinit_or_not==1)
{LCDInit();lmcinit_or_not=0;}
Read_Temperature(1,0);
DOC(0,1,'T');DOC(1,1,'L');DOC(2,1,':
');
DOC(7,1,'T');DOC(8,1,'H');DOC(9,1,':
');
if(P1_6==0){Delay5Ms();if(P1_6==0)
{tempid++;if(tempid>2)tempid=0;
while(P1_6==0);}}switch(tempid)
{case0:
tl_flash_flag=0;th_flash_flag=0;
Disp_Temp();break;
case1:
tl_flash_flag=1;th_flash_flag=0;
Disp_Temp();Set_TL_Temp();break;
case2:
tl_flash_flag=0;th_flash_flag=1;
Disp_Temp();Set_TH_Temp();break;}
Compare_Temp(tl,th);Tl_Al();Th_Al();}
voidDisp_mod2(void)//显示模式2
{if(lmcinit_or_not==1)
{LCDInit();lmcinit_or_not=0;}
DOC(0,0,'');DLC(3,0,alarm);
DOC(3,1,a[houra/10]);DOC(4,1,a[houra%10]);
DOC(5,1,':
');DOC(6,1,a[mina/10]);
DOC(7,1,a[mina%10]);
if(alarms==0){DLC(10,1,off);}
else{DLC(10,1,on);}
if(P1_6==0){Delay5Ms();if(P1_6==0)
{alarmid++;if(alarmid>3)alarmid=0;
while(P1_6==0);}}switch(alarmid)
{case0:
h_flash_flag=0;m_flash_flag=0;
s_flash_flag=0;Disp_Alarm();break;
case1:
h_flash_flag=1;m_flash_flag=0;
s_flash_flag=0;Disp_Alarm();
Set_H_Alarm();break;
case2:
h_flash_flag=0;m_flash_flag=1;
s_flash_flag=0;Disp_Alarm();
Set_M_Alarm();break;
case3:
h_flash_flag=0;m_flash_flag=0;
s_flash_flag=1;Disp_Alarm();
Set_S_Alarm();break;}}
voidDisp_Alarm(void)//闹钟显示
{if(h_flash_flag==1)
{if(flag==1){DOC(3,1,a[houra/10]);DOC(4,1,a[houra%10]);Delay5Ms();}
else{DOC(3,1,0x20);
DOC(4,1,0x20);Delay5Ms();}}
else{DOC(3,1,a[houra/10]);DOC(4,1,a[houra%10]);}
if(m_flash_flag==1){if(flag==1){DOC(6,1,a[mina/10]);DOC(7,1,a[mina%10]);Delay5Ms();}
else{DOC(6,1,0x20);
DOC(7,1,0x20);Delay5Ms();}}
else{DOC(6,1,a[mina/10]);DOC(7,1,a[mina%10]);}
if(s_flash_flag==1){if(flag==1){if(alarms)
{DLC(10,1,on);Delay5Ms();}
else{DLC(10,1,off);Delay5Ms();}}
else{DOC(10,1,0x20);DOC(11,1,0x20);
DOC(12,1,0x20);Delay5Ms();}}}
voidSet_H_Alarm(void)//闹钟小时的设置
{if(P1_5==0){Delay5Ms();if(P1_5==0)
{houra++;if(houra>23)houra=0;}
while(P1_5==0);}
if(P1_4==0){Delay5Ms();if(P1_4==0)
{houra--;if(houra<0)houra=23;}
while(P1_4==0);}}
voidSet_M_Alarm(void)//闹钟分钟的设置
{if(P1_5==0){Delay5Ms();if(P1_5==0)
{mina++;if(mina>59)mina=0;}
while(P1_5==0);}
if(P1_4==0){Delay5Ms();if(P1_4==0)
{mina--;if(mina<0)mina=59;}
while(P1_4==0);}}
voidSet_S_Alarm(void)//闹钟开关设置
{if(P1_5==0){Delay5Ms();if(P1_5==0)
{alarms=0;}while(P1_5==0);}
if(P1_4==0){Delay5Ms();if(P1_4==0)
{alarms=1;}while(P1_4==0);}}
voidAlarmup(void)//闹钟到时显示
{LCDInit();DOC(0,0,'');
DLC(3,0,up);DOC(3,1,a[houra/10]);
DOC(4,1,a[houra%10]);DOC(5,1,':
');
DOC(6,1,a[mina/10]);DOC(7,1,a[mina%10]);
if(alarms==0){DLC(10,1,off);}
else{DLC(10,1,on);}}
voidDisp_Temp(void)//显示上下限温度
{uchartl_gw,tl_sw,tl_bw;//下限的个,十,百
ucharth_gw,th_sw,th_bw;//上限的个,十,百
tl_sign=tl>>7;
if(tl_sign{tl_bw=(~(tl-1))/100;//计算百位
tl_sw=((~(tl-1))-tl_bw*100)/10;//计算十位
tl_gw=(~(tl-1))-tl_bw*100-tl_sw*10;//个位}
else{tl_bw=(tl)/100;tl_sw=(tl-tl_bw*100)/10;
tl_gw=tl-tl_bw*100-tl_sw*10;}
if(tl_flash_flag==1){if(flag==1){if(tl_sign)
{DOC(3,1,0x2d);DOC(4,1,tl_sw+0x30);
DOC(5,1,tl_gw+0x30);}
else{DOC(3,1,tl_bw+0x30);DOC(4,1,tl_sw+0x30);DOC(5,1,tl_gw+0x30);}}
else{DOC(3,1,0x20);DOC(4,1,0x20);DOC(5,1,0x20);//显示下限温度}}
else{DOC(3,1,tl_bw+0x30);
DOC(4,1,tl_sw+0x30);//显示下限温度
DOC(5,1,tl_gw+0x30);}
th_sign=th>>7;if(th_sign)
{th_bw=(~(th-1))/100;//计算百位
th_sw=((~(th-1))-th_bw*100)/10;//计算十位
th_gw=(~(th-1))-th_bw*100-th_sw*10;//个位}
else{th_bw=(th)/100;
th_sw=(th-th_bw*100)/10;
th_gw=th-th_bw*100-th_sw*10;}
if(th_flash_flag==1){if(flag==1){if(th_sign)
{DOC(10,1,0x2d);DOC(11,1,th_sw+0x30);DOC(12,1,th_gw+0x30);//显示下限温度}
else{DOC(10,1,th_bw+0x30);DOC(11,1,th_sw+0x30);DOC(12,1,th_gw+0x30);//显示下限温度}}
else{DOC(10,1,0x20);DOC(11,1,0x20);DOC(12,1,0x20);//显示下限温度}}
else{DOC(10,1,th_bw+0x30);DOC(11,1,th_sw+0x30);DOC(12,1,th_gw+0x30);//显示下限温度}}
voidSet_TL_Temp(void)//设置温度下限
{if(P1_5==0){Delay5Ms();if(P1_5==0)
{tl++;if(tl>125)tl=-55;}while(P1_5==0);}
if(P1_4==0){Delay5Ms();if(P1_4==0)
{tl--;if(tl<-55)tl=125;}while(P1_4==0);}}
voidSet_TH_Temp(void)//设置温度上限
{if(P1_5==0){Delay5Ms();if(P1_5==0)
{th++;if(th>125)th=-55;}while(P1_5==0);}
if(P1_4==0){Delay5Ms();if(P1_4==0)
{th--;if(th<-55)th=125;}while(P1_4==0);}}
voidCompare_Temp(signedcharl,signedcharh)//比较温度
{uchartl_temp;uchary,s;
union{bytec[2];intx;}temp;
ow_reset();write_byte(0xCC);//SkipROM
write_byte(0x44);//转换温度
ow_reset();write_byte(0xCC);//SkipROM
write_byte(0xbe);//读取寄存器
temp.c[1]=read_byte();//读出温度低8位
temp.c[0]=read_byte();//读出温度高8位
sflag=0;//温度零下标志0:
零上,1:
零下
if((temp.c[0]&0xf8)!
=0x00)
{sflag=1;//零下标志位置1
temp.c[1]=~temp.c[1];//低8位取反
temp.c[0]=~temp.c[0];//高8位取反
tl_temp=temp.c[1]+1;//低8位加1
temp.c[1]=tl_temp;//计算后重新存入数组
if(tl_temp>255)temp.c[0]++;//如果低8位大于255,向高8位进1}
y=0;s=0;y=temp.c[0]<<4;
s=temp.c[1]>>4;y=s|y;
if(y if(y>h)th_flag=1;elseth_flag=0;} voidTl_Al(void)//下限越限提示 {if(tl_flag==1){if(flag==1) {DOC(9,0,'A');DOC(10,0,'L');} else{DOC(9,0,0x20);DOC(10,0,0x20);}} else{DOC(9,0,0x20);DOC(10,0,0x20);}} voidTh_Al(void)//上限越限提示 {if(th_flag==1){if(flag==1) {DOC(13,0,'A');DOC(14,0,'H');} else{DOC(13,0,0x20);DOC(14,0,0x20);}} else{DOC(13,0,0x20);DOC(14,0,0x20);}} voidTover(void)//温度越限报警 {LCDInit();DOC(0,0,''); DLC(3,0,temperature);DLC(5,1,over);} //中断入口,冒号闪烁 voidt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 温度 电子 时钟 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)