• 学而时习之专栏
  • 温故而知新专栏



  • 用三个按钮改变多组时间的程序




    有一次,我偶尔有一个坏的温度传感器的显示控制器,检查四位数数码显示板没有损坏,还有三个微动开关可以使用.
    我突发奇想,可不可用这块电路板做一个多组延时控制器,我看什么旧的单片机来推动这块板呢!看到有一块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 for (j=0;j<60;j++) {;}
    }
    }
    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 p1=0xfc;
    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;
    }
    }