以作息时间控制为主的多功能任务设计(淮阴工学院电气学院)_第1页
以作息时间控制为主的多功能任务设计(淮阴工学院电气学院)_第2页
以作息时间控制为主的多功能任务设计(淮阴工学院电气学院)_第3页
以作息时间控制为主的多功能任务设计(淮阴工学院电气学院)_第4页
以作息时间控制为主的多功能任务设计(淮阴工学院电气学院)_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

1、#include<reg52.h> /52单片机头文件,声明各寄存器等#include <intrins.h>#define uint unsigned int /宏定义符号,类似于替换#define uchar unsigned char sbit key1=P34; /宏定义位,也即IO口定义sbit key2=P35; sbit key3=P36; sbit key4=P37; sbit fm=P23;sbit dula=P26;sbit wela=P27;sbit bear=P23;uint i; /定义各符号uchar aa,bb,numdu,numwe;uc

2、har sec1,min1,hour1,year1,mon1,day1,temp1,temp2,sec2,min2,hour2; /主功能符号定义uchar code tablew=0x71,0x6d,0x5b,0x3f,0x6d,0x5b,0x06, ;uchar code tablewe=0xfe,0xfd,0xfb,0xf7,0xef,0xdf;uchar code table=0x3f,0x06,0x5b,0x4f, /主功能数组定义0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;void w1(); /子函数声明

3、void w2();void w3();void w4();void delayms(uint xms); void timer0();void delay(uint z); /主功能子函数声明 void init();void display(uchar hour,uchar min,uchar sec);void keyscan(); void alarm();void time1();/*- 主函数-*/void main() key1=1;key2=1;key3=1;key4=1;while(1) while(!key1)w1();while(!key2)w2();while(!key

4、3)w3();while(!key4)w4(); /*- 按键控制蜂鸣器过程 -*/void w1()if(!key1)delayms(300); /延时防抖,松手检测if(key1) fm=!fm; /*- 按键控制流水灯过程 -*/void w2()loop1:P1=0xff;if(!key2) delayms(300);if(key2)aa=0xfe;/赋初值11111110 while(1) /大循环P1=aa;delayms(100); /延时500毫秒aa=_crol_(aa,1); /将aa循环左移1位后再赋给aa /相应的cror是循环右移一位 if(!key2)delayms

5、(300);if(key2)goto loop1; /*- 按键控制数码管过程 -*/void w3() loop2:wela=1; P0=0xff; if(!key3) delayms(300);if(key3)numdu=0;numwe=0;while(1)numdu+;if(numdu=7)numdu=1;dula=1; /开段锁存器P0=tablewnumdu; /送段码dula=0; /锁存段码wela=1; /开位锁存器P0=tablewenumwe; /送位码wela=0; /锁存位码numwe+;if(numwe=6)numwe=0;delayms(5); if(!key3)d

6、elayms(300);if(key3)goto loop2; /*- 按键控制作息时间过程 -*/void w4()if(!key4) delayms(300);if(key4)init(); /主功能主程序while(1) keyscan();alarm(); /*-延时函数(用于按键,蜂鸣器,流水灯等的延时)-*/void delayms(uint xms)uint i,j;for(i=xms;i>0;i-) /i=xms即延时约xms毫秒for(j=110;j>0;j-);/*- 主功能相关所有子程序-*/void delay(uint z) /延时程序/uint x,y;

7、for(x=0;x<z;x+)for(y=0;y<110;y+);void init() /赋初值程序/TMOD=0X02; /选择模式2,可自动重装载的八位计数器TH0=6; /给TH0赋初值 最大256-250=6 ;250与后面的3886相乘约为1sTL0=6; /给TH0赋初值 自动装入初值TL=TH6EA=1; /开总中断ET0=1; /开T0中断TR0=1;hour1=15;min1=20; sec1=57;year1=11;mon1=12;day1=24;void display(uchar hour,uchar min,uchar sec) /显示程序/uchar

8、s1,s2,m1,m2,h1,h2; /该段用于数码管显示要赋的值s2=sec/10; /显示秒的第二位,即个位s1=sec%10; /显示秒的第一位,即十位 ; “%” 两边为整型,表示取余; m2=min/10; /下四句同m1=min%10;h2=hour/10;h1=hour%10;dula=1; /显示小时的十位数P0=tableh2; dula=0;P0=0XFF; /P0初始化wela=1;P0=0XFE; /打开第一位数码管delay(1);dula=1; /显示小时的个位数P0=tableh1+0x80; /0x80显示小数点dula=0;P0=0XFF; /P0初始化wel

9、a=1; P0=0XFd; /打开第二位数码管delay(1);dula=1; /显示分钟的十位数P0=tablem2;dula=0;P0=0XFF;wela=1;P0=0XFb;delay(1);dula=1; /显示分钟的个位数P0=tablem1+0x80;dula=0;P0=0XFF;wela=1;P0=0XF7;delay(1);dula=1; /显示秒的十位数P0=tables2;dula=0;P0=0XFf;wela=1;P0=0Xef;delay(1);dula=1; /显示秒的个位数P0=tables1;dula=0;P0=0XFF;wela=1;P0=0Xdf;delay(

10、1);void keyscan() /键盘扫描程序/if(key1=0)delay(10);if(key1=0)/TR0=0;temp1+;if(temp1=4) /temp1用于记小时,分钟,秒的数码管temp1=0; TR0=1;while(!key1)switch(temp2) /temp2用于记日历,闹钟,时钟三种模式case 0:display(hour1,min1,sec1);break;case 1:display(year1,mon1,day1);break;case 2:display(hour2,min2,sec2);break;if(key2=0)delay(10);if

11、(key2=0)if(temp2=0)TR0=0;switch(temp1)case 1:sec1+;if(sec1=60)sec1=0;break;case 2:min1+;if(min1=60)min1=0;break;case 3:hour1+;if(hour1=24)hour1=0;break;while(!key2)display(hour1,min1,sec1);if(temp2=1)TR0=1;switch(temp1)case 1:day1+;if(day1=31)day1=1;break;case 2:mon1+;if(mon1=13)mon1=1;break;case 3:

12、year1+;if(year1=100)year1=0;break;while(!key2)display(year1,mon1,day1);if(temp2=2)TR0=1;switch(temp1)case 1:sec2+;if(sec2=60)sec2=0;break;case 2:min2+;if(min2=60)min2=0;break;case 3:hour2+;if(hour2=24)hour2=0;break;while(!key2)display(hour2,min2,sec2);if(key3=0)delay(10);if(key3=0)if(temp2=0)TR0=0;s

13、witch(temp1)case 1:if(sec1=0)sec1=60;sec1-;break;case 2:if(min1=0)min1=60;min1-;break;case 3:if(hour1=0)hour1=24;hour1-;break;while(!key3)display(hour1,min1,sec1);if(temp2=1)TR0=1;switch(temp1)case 1:if(day1=1)day1=31;day1-;break;case 2:if(mon1=1)mon1=13;mon1-;break;case 3:if(year1=0)year1=100;year1

14、-;break;while(!key3)display(year1,mon1,day1);if(temp2=2)TR0=1;switch(temp1)case 1:if(sec2=0)sec2=60;sec2-;break;case 2:if(min2=0)min2=60;min2-;break;case 3:if(hour2=0)hour2=24;hour2-;break;while(!key3)display(hour2,min2,sec2);if(key4=0)delay(10);if(key4=0)temp1=0;temp2+;if(temp2=3)temp2=0;while(!key

15、4)switch(temp2)case 0:display(hour1,min1,sec1);break;case 1:display(year1,mon1,day1);break;case 2:display(hour2,min2,sec2);break;switch(temp2)case 0:display(hour1,min1,sec1);break;case 1:display(year1,mon1,day1);break;case 2:display(hour2,min2,sec2);break;void alarm() /蜂鸣器,流水灯程序/uint i; if(hour1=hou

16、r2&&min1=min2&&(sec1>=sec2&&sec1<sec2+30)|(min1=0&&sec1<20) /闹钟响30秒,正点报时20秒功能for(i=0;i<20;i+)bear=bear;P1=P1;switch(temp2)case 0:display(hour1,min1,sec1);break;case 1:display(year1,mon1,day1);break;case 2:display(hour2,min2,sec2);break;delay(30);bear=1;P1=0xff;/*void mainw() /主功能主程序/init();while(1) keyscan

温馨提示

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

评论

0/150

提交评论