用三个按钮改变多组时间的程序
用三个按钮改变多组时间的程序
有一次,我偶尔有一个坏的温度传感器的显示控制器,检查四位数数码显示板没有损坏,还有三个微动开关可以使用.
我突发奇想,可不可用这块电路板做一个多组延时控制器,我看什么旧的单片机来推动这块板呢!看到有一块AT89S52的单片机.
这个几元小家伙要工作啦!用单片机显示数码器显示时定时时间的程序,用三个按钮来改变多组时时间,其中P2_4为设置改变时间选择按钮,这个钮按一下就可以开始改变时间,现在这个程序是可以改三组时间,
如果按第二下就退出改变时间,就运行所使用的时间了,P2_5为改变时间的组,按这个按钮可以改变时间的组,按一下就会显示C1 C2 C3.当按到显示C3时,如果在按一下会显示C1 周而复始,如果已经设置了,每当按一下它会显示以前的时间的值 P2_6为设定时间的值,P1是显示数码管输出端口。
这个程序如下:
#include "at89x52.h"
#define uchar unsigned char
#define uint unsigned int
uint set=0, c0=0, c1=0, c2=0;
char DATA_7SEG[13]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x6f,0x39,0x79,0x5e}; //数码管显示代码
uchar timetype=100,time=0,sec=0,deda=0,m;
void disp();
void set_time(); //设置函数
void delay(uint k);
void run();
void init_timer();//初始化数据
void init_timer()
{TMOD=0x01;
TH0=0xfd;
TL0=0x40;
IE=0x82;
TR0=1;
}
void TF_VECTOR(void)
{ TH0=0xed;TL0=0x40;deda++;}
void disp()
{ P0=DATA_7SEG[timetype/10];
P2=0xf7;
delay(1);
P0=DATA_7SEG[timetype%10];
P2=0xfb;
delay(1);
P0=DATA_7SEG[time/10];
P2=0xfd;
delay(1);
P0=DATA_7SEG[time%10];
P2=0xfe;delay(1);
}
void delay(uint k) {
uint i,j;
for(i=0;i
}
}
void set_time()
{
if (p2_5==0) timetype++;
if(timetype==103) timetype=100;
F1:if(p2_5==0) goto F1;
for(m=0;m<30;m++) {
disp();
delay(1);
}
switch(timetype)
{
case 100:time=c0;break;
case 101:time=c1;break;
case 102:time=c2;break;
default:break;}
if (p2_6==0) delay(1);
if (p2_6==0) time++
if(time==100) time=0;
for(m=0;m<30;m++)
{
disp();
delay(1);
}
switch(timetype)
{
case 100:c0=time;break;
case 101:c1=time;break;
case 102:c2=time;break;
default:break;
}
}
void conv()
{
if(deda<=100) d_05s=0;
else d_05s=1;
if(deda>=200)
{
sec++;
deda=0;
}
}
void run()
{
if (sec
conv();
for(m=0;m<30;m++) {
P0=DATA_7SEG[sec/10];P2=0xfd;delay(1);
P0=DATA_7SEG[sec%10];P2=0xfe;delay(1);
}
}
if(sec>=c0){p1=0xfa;
for(m=0;m<30;m++)
{
P0=DATA_7SEG[11];P2=0xfd;delay(1);
P0=DATA_7SEG[12];P2=0xfe;delay(1);
}
}
}
void scan_key()
{
delay(1);
if(p2_4==0) set++;
if(set>=2) set=0;
F0:if(p2_4==0) goto F0;
}
void main () {
init_timer();
switch(set){
case 0:p1=0xff,sec=0,set_time();break;
case 1:run();break;
default:break;
}
}