|
运用6位集成数码管;蜂鸣器;4个按键开关;(我用的是4*4扫描按键的开关没有改图,不影响)
k1为模式按键,第一次按下调整时,第二次按下调整分,第三次按下调整秒;
K2为调闹钟(同K1);
k3为时间加一;
k4为时间减一;
proteus接发如下:
程序如下:
#include <reg51.h>
void delay(unsigned int i)
{
unsigned int k;
for(k = 0; k < i; k++);
}
unsigned char count = 0;
unsigned char miao = 0, min = 0, hour = 0;
unsigned char miao2 = 0, min2 = 0, hour2 = 0;
unsigned int b = 0, c = 0, d = 0; i = 0, bm = 0, btime = 0;
sbit keymode = P2^3;
sbit keyclock = P2^2;
sbit keyup = P2^1;
sbit keydown = P2^0;
sbit beep_b = P3^6;
void dispall();
void key_mode();
void key_clock();
void key_scan();
void key_scan2();
void set();
void set2();
void disp();
void disp2();
void beep();
void main()
{
TMOD = 0x10;
TH1 = (65536 - 50000)/256; //重新设置T1计数初值高8位
TL1 = (65536 - 50000)%256; //重新设置T1计数初值低8位
ET1 = 1; //开放T1中断允许
EX1 = 1;
IT1 = 1;
EA = 1; //开放总中断允许
TR1 = 1; //启动T1开始计数
while(1)
{
key_scan();
key_scan2();
disp();
disp2();
beep();
}
}
void key_mode()
{
if(!keymode)
{
delay(1000);
if(!keymode)
{
b++;
if(b > 3)
b = 0;
}
while(!keymode);
}
}
void key_clock()
{
if(!keyclock)
{
delay(1000);
if(!keyclock)
{
c++;
if(c > 3)
c = 0;
}
d++;
while(!keyclock);
}
}
void key_scan()
{
P2=0x0f;
key_mode();
if(b == 1)
{
c = 0;
disp(); set();
}
else if(b == 2)
{
c = 0;
disp(); set();
}
else if(b == 3)
{
c = 0;
disp(); set();
}
}
void key_scan2()
{
P2=0x0f;
key_clock();
if(c == 1)
{
b = 0;
disp2(); set2();
}
else if(c == 2)
{
b = 0;
disp2(); set2();
}
else if(c == 3)
{
b = 0;
disp2(); set2();
}
}
void set()
{
if(keyup == 0) //时间增加按键
{
if(b == 1) {hour++; if(hour > 23) hour = 0;}
else if(b == 2) {min++; if(min > 59) min = 0;}
else if(b == 3) {miao++; if(miao > 59) miao = 0;}
}
while(!keyup);
if(keydown == 0) //时间减少按键
{
if(b == 1) {if(hour != 0) hour--; else hour = 23;}
else if(b == 2) {if(min != 0) min--; else min = 59;}
else if(b == 3) {if(miao != 0) miao--; else miao = 59;}
}
while(!keydown);
}
void set2()
{
if(keyup == 0) //时间增加按键
{
if(c == 1) {hour2++; if(hour2 > 23) hour2 = 0;}
else if(c == 2) {min2++; if(min2 > 59) min2 = 0;}
else if(c == 3) {miao2++; if(miao2 > 59) miao2 = 0;}
}
while(!keyup);
if(keydown == 0) //时间减少按键
{
if(c == 1) {if(hour2 != 0) hour2--; else hour2 = 23;}
else if(c == 2) {if(min2 != 0) min2--; else min2 = 59;}
else if(c == 3) {if(miao2 != 0) miao2--; else miao2 = 59;}
}
while(!keydown);
}
int timer() interrupt 3
{
TH1 = (65536 - 50000)/256; //重新设置T1计数初值高8位
TL1 = (65536 - 50000)%256; //重新设置T1计数初值低8位
count++; //50ms计数器加1
if(count == 20) //1s时间到
{
count = 0;
if(bm)
{btime ++;
}
miao++;
if(miao == 60)
{
miao = 0;
min++;
if(min == 60)
{
min = 0;
hour++;
if(hour == 24) hour = 0;
}
}
}
}
void disp()
{
unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
if(b == 1)
{
P1 = 0x3e; P0 = led[hour/10]; delay(100);
P1 = 0x3d; P0 = led[hour%10]; delay(100);
}
else if(b == 2)
{
P1 = 0x3b; P0 = led[min/10]; delay(100);
P1 = 0x37; P0 = led[min%10]; delay(100);
}
else if(b == 3)
{ P1 = 0x2f; P0 = led[miao/10]; delay(100);
P1 = 0x1f; P0 = led[miao%10]; delay(100);
}
else if((b == 0) && (c == 0))
{
dispall();
}
}
void disp2()
{
unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
if(c == 1)
{
P1 = 0x3e; P0 = led[hour2/10]; delay(100);
P1 = 0x3d; P0 = led[hour2%10]; delay(100);
}
else if(c == 2)
{
P1 = 0x3b; P0 = led[min2/10]; delay(100);
P1 = 0x37; P0 = led[min2%10]; delay(100);
}
else if(c == 3)
{ P1 = 0x2f; P0 = led[miao2/10]; delay(100);
P1 = 0x1f; P0 = led[miao2%10]; delay(100);
}
else if((b == 0) && (c == 0))
{
dispall();
}
}
void dispall()
{
unsigned char led[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
P1 = 0x2f; P0 = led[miao/10]; delay(100);
P1 = 0x1f; P0 = led[miao%10]; delay(100);
P1 = 0x3b; P0 = led[min/10]; delay(100);
P1 = 0x37; P0 = 0x80; delay(100); P0 = led[min%10]; delay(100);
P1 = 0x3e; P0 = led[hour/10]; delay(100);
P1 = 0x3d; P0 = 0x80; delay(100); P0 = led[hour%10]; delay(100);
}
void beep()
{
if((hour==hour2) && (min==min2) && (miao==miao2) && (d != 0)) //计数10秒后 P3^6 输出低电平,启动蜂鸣器
{
bm = 1;
beep_b = 0;
}
if(btime == 10)
{
beep_b = 1;
bm = 0;
btime = 0;
d = 0;
}
}
|
评分
-
查看全部评分
|