以作息时间控制为主的多功能任务设计淮阴工学院电气学院Word文档格式.docx
《以作息时间控制为主的多功能任务设计淮阴工学院电气学院Word文档格式.docx》由会员分享,可在线阅读,更多相关《以作息时间控制为主的多功能任务设计淮阴工学院电气学院Word文档格式.docx(15页珍藏版)》请在冰豆网上搜索。
voidtimer0();
voiddelay(uintz);
//主功能子函数声明
voidinit();
voiddisplay(ucharhour,ucharmin,ucharsec);
voidkeyscan();
voidalarm();
voidtime1();
/*--------------------------------------
主函数
----------------------------------------*/
voidmain()
{
key1=1;
key2=1;
key3=1;
key4=1;
while
(1)
{
while(!
key1)w1();
key2)w2();
key3)w3();
key4)w4();
}
}
/*--------------------------------------
按键控制蜂鸣器过程
----------------------------------------*/
voidw1()
{
if(!
key1)
{
delayms(300);
//延时防抖,松手检测
if(key1)
{
fm=!
fm;
}
}
按键控制流水灯过程
voidw2()
{
loop1:
P1=0xff;
key2)
{
delayms(300);
if(key2)
aa=0xfe;
//赋初值11111110
while
(1)//大循环
{
P1=aa;
delayms(100);
//延时500毫秒
aa=_crol_(aa,1);
//将aa循环左移1位后再赋给aa//相应的cror是循环右移一位
if(!
{
delayms(300);
if(key2)
gotoloop1;
}
}
按键控制数码管过程
voidw3()
loop2:
wela=1;
P0=0xff;
key3)
if(key3)
numdu=0;
numwe=0;
while
(1)
{
numdu++;
if(numdu==7)
numdu=1;
dula=1;
//开段锁存器
P0=tablew[numdu];
//送段码
dula=0;
//锁存段码
wela=1;
//开位锁存器
P0=tablewe[numwe];
//送位码
wela=0;
//锁存位码
numwe++;
if(numwe==6)
numwe=0;
delayms(5);
if(!
{
delayms(300);
if(key3)
gotoloop2;
}
}
}
}
按键控制作息时间过程
voidw4()
key4)
if(key4)
init();
//主功能主程序
while
(1)
keyscan();
alarm();
}
/*------------------------------------------
延时函数(用于按键,蜂鸣器,流水灯等的延时)
------------------------------------------*/
voiddelayms(uintxms)
uinti,j;
for(i=xms;
i>
0;
i--)//i=xms即延时约xms毫秒
for(j=110;
j>
j--);
主功能相关所有子程序
voiddelay(uintz)//延时程序//
uintx,y;
for(x=0;
x<
z;
x++)
for(y=0;
y<
110;
y++);
voidinit()//赋初值程序//
TMOD=0X02;
//选择模式2,可自动重装载的八位计数器
TH0=6;
//给TH0赋初值最大256-250=6;
250与后面的3886相乘约为1s
TL0=6;
//给TH0赋初值自动装入初值TL=TH=6
EA=1;
//开总中断
ET0=1;
//开T0中断
TR0=1;
hour1=15;
min1=20;
sec1=57;
year1=11;
mon1=12;
day1=24;
voiddisplay(ucharhour,ucharmin,ucharsec)//显示程序//
uchars1,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=table[h2];
dula=0;
P0=0XFF;
//P0初始化
wela=1;
P0=0XFE;
//打开第一位数码管
delay
(1);
//显示小时的个位数
P0=table[h1]+0x80;
//0x80显示小数点
P0=0XFd;
//打开第二位数码管
//显示分钟的十位数
P0=table[m2];
P0=0XFb;
//显示分钟的个位数
P0=table[m1]+0x80;
P0=0XF7;
//显示秒的十位数
P0=table[s2];
P0=0XFf;
P0=0Xef;
//显示秒的个位数
P0=table[s1];
P0=0Xdf;
voidkeyscan()//键盘扫描程序//
if(key1==0)
{
delay(10);
if(key1==0)
//TR0=0;
temp1++;
if(temp1==4)//temp1用于记小时,分钟,秒的数码管
temp1=0;
TR0=1;
switch(temp2)//temp2用于记日历,闹钟,时钟三种模式
case0:
display(hour1,min1,sec1);
break;
case1:
display(year1,mon1,day1);
case2:
display(hour2,min2,sec2);
if(key2==0)
if(key2==0)
if(temp2==0)
{TR0=0;
switch(temp1)
case1:
sec1++;
if(sec1==60)sec1=0;
case2:
min1++;
if(min1==60)min1=0;
case3:
hour1++;
if(hour1==24)hour1=0;
while(!
display(hour1,min1,sec1);
if(temp2==1)
{TR0=1;
day1++;
if(day1==31)day1=1;
mon1++;
if(mon1==13)mon1=1;
year1++;
if(year1==100)year1=0;
display(year1,mon1,day1);
if(temp2==2)
sec2++;
if(sec2==60)sec2=0;
min2++;
if(min2==60)min2=0;
hour2++;
if(hour2==24)hour2=0;
display(hour2,min2,sec2);
if(key3==0)
if(key3==0)
if(sec1==0)sec1=60;
sec1--;
if(min1==0)min1=60;
min1--;
if(hour1==0)hour1=24;
hour1--;
if(day1==1)day1=31;
day1--;
if(mon1==1)mon1=13;
mon1--;
if(year1==0)year1=100;
year1--;
if(sec2==0)sec2=60;
sec2--;
if(min2==0)min2=60;
min2--;
if(hour2==0)hour2=24;
hour2--;
if(key4==0)
if(key4==0)
temp1=0;
temp2++;
if(temp2==3)
temp2=0;
switch(temp2)
switch(temp2)
case0:
case1:
case2:
voidalarm()//蜂鸣器,流水灯程序//
uinti;
if((hour1==hour2&
&
min1==min2&
(sec1>
=sec2&
sec1<
sec2+30))||(min1==0&
20))//闹钟响30秒,正点报时20秒功能
{for(i=0;
i<
20;
i++)
bear=~bear;
P1=~P1;
case0:
case1:
case2:
delay(30);
bear=1;
P1=0xff;
/*voidmainw()//主功能主程序//
init();
keyscan();
alarm();
}*/
voidtime1()interrupt1//定时器程序//
uintm;
m++;
if(m==3686)//250与后面的3886相乘约为100000us=1s,控制1秒程序
m=0;
sec1++;
if(sec1==60)
sec1=0;
min1++;
if(min1==60)
min1=0;
hour1++;
if(hour1==24)
{
hour1=0;
day1++;
if(day1==31)
{
day1=1;
mon1++;
if(mon1==13)
mon1=1;
year1++;
if(year1==100)
year1=0;
}