c51可调10小时倒计时源程序

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

#include <reg52.h>
#include <stdio.h>
unsigned char sec100,sec,sec5,min,hour,flag1,command,temp,opto; unsigned char i,digit,buffer[4],onHour1,onMin1,offHour1,offMin1;
char cputick,key,delay,count1;
char convert[10] = {0x3F,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0e,0x7f,0x5f}; void pause(int);
void scanLED();
void manualOnOff();
void savetimeOnOff1();
void setmin();
void sethour();
void showOnce();
void savetimeOff1();
void time();
void timeToBuffer();
void blink();
void offmsd();
void keyexe();
void keydelay();
void comparetime();
void timer0int (void)
interrupt 1 using 1
{
TH0 |= 0xdc;
cputick++;
time();
}
void main() //主运行程序//
{
EA = 1; //打开总中断开关//
ET0 = 1; //打开定时器中断//
TMOD |= 0x01; //定时器方式选择//
TR0 = 1;
opto = 0xff; //定时开关置1//
cputick = 0;
hour = 10;
min = 0;
sec = 0; //初始开机时分秒//
key = -1;
flag1 = 0;
onHour1 = 10;
onMin1 = 00; //定时开关开启时间//
offHour1 = 00;
offMin1 = 00; //定时开关关闭时间//
count1 = 0;
buffer[0] = 0x40;
buffer[2] = 0x40;
buffer[3] = 0x40;
while(1)
{
while ( cputick < 1)
scanLED();
cputick = 0;
timeToBuffer();
blink();
offmsd();
keyexe();
keydelay();
comparetime();
}
}
void time () //计时子程序//
{
sec100++;
if (sec100 >= 100) //这里if构成顺序选择结构/// {
sec100 = 0;
flag1 |= 0x05;
temp = 50;
sec++;
if (sec >= 60)
{
sec = 0; //秒产生程序//
flag1 |= 0x02;
min--;
if (min == -1)
{
min = 59; //分倒计时//
hour--;
if (hour == -1)
{
hour = 23; //时倒计时//
}
}
}
}
}
void scanLED()
{
int i;
digit = 0x08;
for( i = 0; i < 4; i++)
{
P3 = ~digit & opto;
P1 = ~buffer[i];
pause(5);
P1 = 0xff;
if ((P3 & 0x10) == 0)
key = i;
digit>>=1;
}
}
void timeToBuffer()
{
buffer[0] = convert[min%10]; //分个位//
buffer[1] = convert[min/10]; //分十位//
buffer[2] = convert[hour%10]; //时个位//
buffer[3] = convert[hour/10]; //时十位//
}
void blink()
{
if((flag1 & 0x04) != 0)
{
temp--;
if (temp != 0)
{
buffer[1] |= 0x80;
buffer[2] |= 0x80;
}
else( flag1 &= ~0x04);
} //if和else构成多分支选择结构,当表达式为假时,就跳过分支语句,执行后续程序/////
}
void keyexe() //键盘处理子程序//
{
if (key != -1) //if如果的意思//
{
if ((flag1 & 0x80) == 0)
{
flag1 |= 0x80;
delay = 50; //延时//
switch(key) //开关和跳转语句//
{
case (0): //开关语句关键字//
manualOnOff();
break; //通常用在循环语句和开关语句中,用来跳出循环程序块//
savetimeOnOff1();
break;
case (2):
setmin();
break;
case (3):
sethour();
}
}
}
}
void sethour() //小时调整子程序//
{
hour--;
if ( hour== 23)
hour = 0;
}
void setmin() //分钟调整子程序//
{
min--;
sec = 0;
if( min == 59 )
min = 0;
}
void savetimeOnOff1()
{
count1++;
if (count1 == 1)
{
onHour1 = hour;
onMin1 = min;
buffer[0] = 0x00;
buffer[1] = 0x68;
buffer[2] = 0x78;
buffer[3] = 0x71;
showOnce();
}
else
{
count1 = 0;
savetimeOff1();
}
}
void savetimeOff1()
offHour1 = hour;
offMin1 = min;
buffer[0] = 0x63;
buffer[1] = 0x63;
buffer[2] = 0x78;
buffer[3] = 0x71;
showOnce();
}
void manualOnOff() {
opto= ~opto | 0x7f;
if ((opto & 0x80) == 0)
{
buffer[0] = 0;
buffer[1] = 0;
buffer[2] = 0x68;
buffer[3] = 0x78;
showOnce();
}
else
{
buffer[0] = 0;
buffer[1] = 0x63;
buffer[2] = 0x63;
buffer[3] = 0x78;
showOnce();
}
}
void showOnce() {
int i;
for(i=0;i<2000;i++)
scanLED();
}
void keydelay()
{
if ((flag1 & 0x80) !=0)
{
delay--;
if(delay == 0)
flag1 &= ~0x80;
}
}
void comparetime()
if((flag1 & 0x01) != 0 )
{
flag1 &= ~0x01;
if(hour == onHour1 && min == onMin1)
opto = 0x7f;
if(hour == offHour1 && min == offMin1)
opto = 0xff;
}
}
void offmsd()
{
if (buffer[3] == 0x3f)
buffer[3] = 0x00;
}
void pause(j)
int j;
{
int i;
for (i = 0; i < j; i++);
}。

相关文档
最新文档