原创】简易万年历的设计_毕业论文(20201002124458_第1页
原创】简易万年历的设计_毕业论文(20201002124458_第2页
原创】简易万年历的设计_毕业论文(20201002124458_第3页
原创】简易万年历的设计_毕业论文(20201002124458_第4页
原创】简易万年历的设计_毕业论文(20201002124458_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、漳州师范学院简易万年历的设计系别:物理与电子信息工程系专业:电子信息科学与技术2013年6月22目录丄2_weishan; uchar rO,DELAY_mode;uchar msta,BJ_L,BJ_H,c nt1,cnt;void RDKEY()P2=0xff;扫描第 0 行(ROW0),即 k0-k3 键rO=P2;r0=r0;r0&=0xf0;将读取到的k0-k3键值保存于KEY0的低四位if(r0!=KEY0)判断是否有键按下时间未到,沿用原来保留的键值未有键按下提取键前沿TR0=1;EKEY0=KEY0;elseTR0=0;EKEY0=0x00;EKEY0=r0&(KEY0W0);

2、KEY0=r0;void disp ()uchar i;for(i=0;i3;i+)P2=0xff;switch(dsw)case 0:CS0=0;SM_PORT=tablebuf0; dsw=1;break;case 1:CS1=0;SM_PORT=tablebuf1; dsw=2;break;case 2:if(!fh_300) CS2=0;elseCS2=1;SM_PORT=tablebuf2; if(poi nt_flag) poin t=0;显示个位显示十位显示百位else point=1;dsw=3;break;case 3:if(!fh_300) CS3=0;elseCS3=1;

3、SM_P0RT=tablebuf3; dsw=0;break;default:break;void disp1 ()SM_PORT=0xff;P2=0xff;switch(dsw)case 0:if(!fl_300) CS0=0; elseCS0=1;SM_PORT=tablebuf0; dsw=1;break;case 1:if(!fl_300) CS1=0;elseCS1=1;SM_PORT=tablebuf1; dsw=2;break;case 2:if(!fh_300) CS2=0;elseCS2=1;SM_PORT=tablebuf2;if(poi nt_flag) poin t=0

4、; else point=1;dsw=3;break;case 3:if(!fh_300) CS3=0;elseCS3=1;SM_PORT=tablebuf3; dsw=0;break;显示千位显示个位显示十位显示百位显示千位default:break; void In it() TMOD=0x11;TH0=(65536-20000)256;设置疋时器的工作方式为定时器0装载初值,用中断方式进行 按键的去抖TL0=(65536-20000)%256;TH1=(65536-5000)256;为定时器1装载初值TL1=(65536-5000)%256;EA=1;ET0=1;TR 仁1;LBJ_bu

5、f 仁2;开总中断开定时器0中断开定时器0为低温报警值赋初值22度,在主程序中可修改LBJ_buf0=2;HBJ_buf1=3;为高温报警值赋初值35度,在主程 序中可修改HBJ_buf0=5;FMQ=1;DELAY_mode=1;关闭蜂鸣器和LED工作模式赋初值1(其中mode=1表示,程序使用软件延时,此时使用 DS18B20进行温度测量,作为温度计使用;mode=0时,使用定 时器延时,程序每隔5ms执行一次,此时作为时钟TZtime_flag 仁0;Seco nd_buf=0x00;Min ute_buf=0x00;Hour_buf=0x12;Day_buf=0x16;Week_buf

6、=0x01;Mon th_buf=0x06;Year_buf=0x13; _void wen xia n()DELAY_mode=1; BJ_L=LBJ_buf1; BJ_L=4;BJ_L&=0xf0;BJ_L+=LBJ_buf0&0x0f;BJ_H=HBJ_buf1;BJ_H=BJ_H|temp16h=BJ_L)cn t+;if(cnt=50) FMQ=FMQ;c nt=O;else FMQ=1;void XG_LBJ()修改低温报警值DELAY_mode=1;poin t_flag=O;buf3=19;buf2=18;buf仁 LBJ_buf1;bufO=LBJ_bufO;fl_300=0

7、;H2_weisha n+;if(H2_weisha n=60)H2_weisha n=0; fh_300=fh_300;if(EK2)if(LBJ_bufO) -LBJ_bufO;else if(LBJ_buf1) -LBJ_buf1;LBJ_bufO=9;if(EK3)if(LBJ_bufO!=9) +LBJ_bufO;else if(LBJ_buf1!=9) +LBJ_buf1;LBJ_bufO=O; void XG_HBJ()修改高温报警值DELAY_mode=1;poin t_flag=O;buf3=17;buf2=18;buf 仁 HBJ_buf1;bufO=HBJ_bufO;fl

8、_300=0;H2_weisha n+;if(H2_weisha n=60) _H2_weisha n=0; fh_300=fh_300;if(EK2)if(HBJ_buf0) -HBJ_buf0;else if(HBJ_buf1) -HBJ_buf1;HBJ_buf0=9;if(EK3)if(HBJ_buf0!=9) +HBJ_buf0;else if(HBJ_buf1!=9) +HBJ_buf1;HBJ_buf0=0; void work0()if(EK1)cn t1+;if(c nt1=3) cn t1=0;switch(c nt1)温度显示子程序,具有超温和低温修改低温报警值修改高温报

9、警值case 0:fh_300=0; wen xia n(); 报警功能break;case 1:XG_LBJ();break;case 2:XG_HBJ(); break;default:break;void work1()if(EK1) msta+;if(msta=4) msta=0;fh_300=0;fl_300=0;switch(msta)case 0: time_show(); break;case 1: mon th_show(); break;case 2: year_show();break;case 3: week_show(); break;defaultbreak;voi

10、d work2()if(EK1)msta1+;if(msta1=8) msta1=0; f300+;switch(msta1)case 0: set_beg in(); break;case 1: Hour_set();break;case 2: Min ute_set();break;case 3: Mon th_set(); break;case 4: Day_set();break;case 5: Year_set(); break;case 6: Week_set(); break;case 7: set_over(); break;defaultbreak;void mai n()程

11、序的初始化In it();while(1)if(DELAY_mode) get_temperature(); RDKEY(); disp(); 获得温度elsewhile(!TF1);TF1=0;TH1=(65536-5000)256;TL1=(65536-5000)%256; RDKEY();disp1();In itial_DS1302();DS1302_GetTime();if(EK0)mode+; if(mode=3) mode=0;switch(mode)case 0:work0();break;case 1:msta1=0;DELAY_mode=0;poin t_flag=O; w

12、ork1();break;case 2:work2();DELAY_mode=0;break; default:break;void exter0() in terrupt 1TH0=(65536-20000)256;TL0=(65536-20000)%256;KEY0=r0;KEY16.2 包含文件 =4;Temp_H=8)tempdf=5;else tempdf=0;0.5度精度显示a3 = tempi nt10; a2 = tempi nt%10;十位个位Temp_L=READ_DS18B20_DATA();al = tempdf;temp16h=(a34)*10+(ReadValue&

13、0x0F);ReadValue=DS1302Read(0x84);Hour=(ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=DS1302Read(0x86);Day=(ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=DS1302Read(0x8a);Week=(ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue=DS1302Read(0x88);Mo nth=(ReadValue&0x70)4)*10+(ReadValue&0x0F);ReadValue

14、=DS1302Read(0x8c);Year=(ReadValue&0x70)4)*10+(ReadValue&0x0F);void Ini tial_DS1302()if(TZtime_flag1) _DS1302Write(0x8e,0x00);写保护关,将 8e单元置为00,将wp位写0写年,月,日,星期如: 2008.06.09.01DS1302Write(0x8c,Year_buf);向年寄存单元写初始年份08DS1302Write(0x88,Mo nth_buf);向月份寄存单元写初始月份06DS1302Write(0x86,Day_buf);向日寄存单元写初始日 09DS1302

15、Write(0x8a,Week_buf); 向星期寄存单元写初始星期 01写时间,如:23:59:55DS1302Write(0x84,Hour_buf);DS1302Write(0x82,Mi nute_buf);DS1302Write(0x80,Seco nd_buf);DS1302Write(0x8e,0x80);禁止写入TZtime_flag仁0;将允许修改时间的标志位清零,带下次主程序循环中,不执行该子程序,知道该标志位被允许为1时,才唤醒该 子程序void time_show() _buf仁Mi nu te10;走时模块,显示时间buf0=Mi nu te%10;buf3=Hour

16、10;buf2=Hour%10;f500+;if(f500=100)f500=0;FMQ=FMQ;void Hour_set()时间修改模块,修改小时 _fl_300=0;if(f300=60) fh_300=fh_300;f300=0;if(EK3)Hour_buf1+=1;if(Hour_buf1=24)Hour_buf1=0; 一 一if(EK2)Hour_buf1-=1;if(Hour_buf1=-1)Hour_buf1=23; 一 一buf3=Hour_buf110;buf2=Hour_buf1%10;buf 1= Mi nute_buf110;buf0=Mi nute_buf1%1

17、0;Hour_buf=(buf3&0x0f)4)+(buf2&0x0f);将修改后的值转换成BCD码void Mi nute_set()时间修改模块,修改分钟 _fh_300=0;if(f300=60)fl_300=fl_300;f300=0;if(EK3)Min ute_buf1+=1;if(Mi nute_buf1=60)Mi nute_buf1=0;if(EK2)Min ute_buf1-=1;if(Mi nute_buf1=-1)Mi nute_buf1=59; 一 一buf1=Min ute_buf110;buf0=Mi nute_buf1%10;Mi nute_buf=(buf1

18、&0x0f)4)+(buf0&0x0f);将修改后的值转换成 BCD码void mon th_show() _buf仁Day10;走时模块,显示月份buf0=Day%10;buf3=Mo nth10;buf2=Mon th%10;FMQ=1;void Mon th_set()月份修改模块,修改月fl_300=0;if(f300=60)fh_300=fh_300;f300=0;if(EK3)Mon th_buf1+=1;if(Mon th_buf1=13)M on th_buf1=0; 一 一if(EK2)Mon th_buf1-=1;if(Mon th_buf1=-1)M on th_buf1

19、=12; 一 一buf3=Mo nth_buf110;buf2=Mo nth_buf1%10;buf仁 Day_buf110;buf0=Day_buf1%10;Mon th_buf=(buf3&0x0f)4)+(buf2&0x0f);将修改后的值转换成BCD码void Day_set()月份修改模块,修改日 fh_300=0; if(f300=60)fl_300=fl_300; f300=0;if(EK3)Day_buf1+=1;if(Day_buf1=32)Day_buf1=0; 一 一if(EK2)Day_buf1-=1;if(Day_buf1=-1)Day_buf1=31;buf仁 Da

20、y_buf110;buf0=Day_buf1%10;Day_buf=(buf1 &0x0f)4)+(buf0&0x0f);将修改后的值转换成BCD码void year_show()走时模块,显示年份 _buf仁 Year10; buf0=Year%10; buf3=2; buf2=0;FMQ=1;void Year_set()年份修改模块,修改年 _fh_300=0;if(f300=60)fl_300=fl_300; f300=0;if(EK3)Year_buf1+=1;if(Year_buf1=100)Year_buf1=0; 一 一if(EK2)Year_buf1-=1; if(Year_

21、buf1=-1)Year_buf1=99; 一 一buf1=Year_buf110;buf0=Year_buf1%10;buf3=2;buf2=0;Year_buf=(buf1 &0x0f)4)+(buf0&0x0f);将修改后的值转换成BCD码void week_show()走时模块,显示星期buf仁 Week10;buf0=Week%10;buf3=16;buf2=16;FMQ=1;void Week_set()星期修改模块,修改星期 _fh_300=0;if(f300=60)fl_300=fl_300;f300=0;if(EK3)Week_buf1+=1;if(Week_buf1=100

22、)Week_buf1=0;if(EK2)Week_buf1-=1;if(Week_buf1=-1)Week_buf1=99;buf仁 Week_buf110;buf0=Week_buf1%10;buf3=16;buf2=16;Week_buf=(buf1 &0x0f)4)+(buf0&0x0f);将修改后的值转换成BCD码void set_begi n() _Min ute_buf1=Mi nute; 至卩XXXX_buf1中Hour_buf仁Hour;Day_buf仁Day;Mon th_buf1=Mo nth; Week_buf仁Week; Year_buf仁Year; buf0=18;b

23、uf 1= 18;进入时间调整模式 buf2=18;buf3=18;void set_over() 内的数据开始进行时间设置的预准备工作将当前有关时间的左右信息寄存让数码管显示-,用以提示用户已时间设置完毕,可修改DS1302芯片TZtime_flag 仁1; fh_300=0;允许修改的标志位置1 关位闪fl_300=0;mode=1;修改时间完毕,进入走时模块msta仁0;待下次进入修改时间模块时,从该模块的case。处开始,因为修改时间要进行时间设置的预准备工作#en dif7. 调试要点7.1硬件调试1、硬件完成后,检查电路有无短路、断路或虚焊;2、电路板检查正常后,编一段简单的显示程序,检验显示电路是否正 常;3、若显示电路正常后,则可开始进行程序调试;4、动态显示时要注意任一时刻

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论