钻石会员
主题
帖子
积分11931
阅读权限50
注册时间2009-7-18
最后登录1970-1-1
在线时间 小时
|
本帖最后由 LBQ691477940 于 2014-6-17 22:44 编辑
/*********************************************************************************************
CLOCK V1.0
89C2051 + 4-digit 7-SEG led + 4-key switch
Simple Digital Clock demostrates scanning LED and key switch.
The clock has 1-bit output port P3.7 for driving AC load through MOC3040+triac.
The source program was modified for Proview32 C51 Compiler.
3 November 2542
* **** **** ****
* * * * * * * *
* * * * * * *
* **** * * * *
* * * * * * *
* * * * * * * *
* **** **** ****
P3.0 P3.1 P3.2 P3.3
set set time manual
HOUR MIN ON/OFF ON/OFF
/**********************************************************************************************/
#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;
//P1.0 = F / P1.1 = A / P1.2 = B / P1.3 = C / P1.4 = D / P1.5 = E / P1.6 = G / P1.7 = H
// 0 1 2 3 4 5 6 7 8 9
char convert[10] = {0x3F,0x0c,0x76,0x5e,0x4d,0x5b,0x7b,0x0e,0x7f,0x5f};//共阴极
void pause(int j); //延时
void scanLED(); //扫描4位数码管和4个按键,如果有按键按下,键值 = 0-3 否则键值 = -1
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(); //更新即时时钟
sec100++;
if (sec100 >= 100) //100 * 10 ms = 1 s
{
sec100 = 0;
flag1 |= 0x05; //set bit 0, bit 2
temp = 50;
sec++;
if (sec >= 60)
{
sec = 0;
flag1 |= 0x02; //set bit 1
min++;
if (min >= 60)
{
min = 0;
hour++;
if (hour >= 24)
{
hour = 0;
}
}
}
}
}
/**********************************************************************************************
void time ()//更新即时时钟
{
sec100++;
if (sec100 >= 100) //100 * 10 ms = 1 s
{
sec100 = 0;
flag1 |= 0x05; //set bit 0, bit 2
temp = 50;
sec++;
if (sec >= 60)
{
sec = 0;
flag1 |= 0x02; //set bit 1
min++;
if (min >= 60)
{
min = 0;
hour++;
if (hour >= 24)
{
hour = 0;
}
}
}
}
}
/**********************************************************************************************/
void scanLED() //扫描4位数码管和4个按键,如果有按键按下,键值 = 0-3 否则键值 = -1
{
int i;
digit = 0x08;
key = -1;
for( i = 0; i < 4; i++) //共4位数码管
{
P3 = ~digit & opto; //送位选
P1 = ~buffer; //送段码
pause(5); //延时
P1 = 0xff; //off LED
if((P3 & 0x10) == 0) //如果按键公共端P3.4变低
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) //check bit 2 if set decrement temp until zero
{
temp--;
if (temp != 0)
{
buffer[1] |= 0x80;
buffer[2] |= 0x80;
}
else( flag1 &= ~0x04);
}
}
/**********************************************************************************************/
void keyexe() //按键处理
{
if (key != -1)
{
if ((flag1 & 0x80) == 0) // within 0.5 sec after 1st pressthe following execution is not allowed
{
flag1 |= 0x80;
delay = 50;
switch(key)
{
case (0): //key position 0
manualOnOff(); //service key 0
break;
case (1): //key position 1
savetimeOnOff1(); //service key 1
break;
case (2): //key position 2
setmin(); //service key 2
break;
case (3): //key position 3
sethour();
}
}
}
}
/**********************************************************************************************/
void sethour() //校时
{
hour++;
if( hour == 24)
hour = 0;
}
/**********************************************************************************************/
void setmin() //校分
{
min++;
sec = 0;
if(min == 60 )
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; //complement bit 7 which in turn activates P3.7
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; //P3.7 = 0 on
if(hour == offHour1 && min == offMin1)
opto = 0xff; //P3.7 = 1 off
}
}
/**********************************************************************************************/
void offmsd()
{
if(buffer[3] == 0x3f) //if msd = '0' then put blank unstead
buffer[3] = 0x00;
}
/**********************************************************************************************/
void pause(int j) //延时
{
int i;
for (i = 0; i < j; i++);
}
/**********************************************************************************************/
void main()
{
EA = 1;
ET0 = 1; //
TMOD |= 0x01; //
TR0 = 1; //
opto = 0xff;
cputick = 0;
hour = 18;
min = 0;
sec = 0;
key = -1;
flag1 = 0;
onHour1 = 18; //18:01 on
onMin1 = 01; //18:01 on
offHour1 = 18; //18:02 off
offMin1 = 02; //18:02 off
count1 = 0;
buffer[0] = 0x40;
buffer[1] = 0x40;
buffer[2] = 0x40;
buffer[3] = 0x40;
while(1)
{
while ( cputick < 1)
scanLED();
cputick = 0;
//下列任务每10ms运行一次
timeToBuffer();
blink();
offmsd();
keyexe();
keydelay();
comparetime();
}
}
/**********************************************************************************************/
|
|