找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

定时器秒表99秒,按键可控

查看数: 2966 | 评论数: 2 | 收藏 2
关灯 | 提示:支持键盘翻页<-左 右->
    组图打开中,请稍候......
发布时间: 2018-5-12 20:40

正文摘要:

中断,定时器,数码管动态显示 0~99秒定时器 按键按一下 开启显示00 再按一下开始计时 再按一下暂停 再按一下清0 一起学习 仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)

回复

ID:320909 发表于 2018-5-15 12:47
#include<reg51.h>
#define SEG P2
#define SCANP P1
sbit PB0=P1^7;
sbit led=P0^7;

#define count_M1 50000
#define TH_M1 (65636-count_M1)/256
#define TL_M1 (65636-count_M1)%256
int count_T0=0;

#define count_M2  250
#define TH_M2 (256-count_M2)
#define TL_M2 (256-count_M2)
char count_T1=0;

char code TAB[10]= {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};
char disp[2]= {0xc0,0xc0};

char seconds=0;
char scan=0;
char flag=0;

void debouncer(void);
void delay(int x);
main() {

    IE=0x8f;
    TCON=0x00;
    TMOD=0x21;
    TH0=TH_M1;
    TL0=TL_M1;
    TR0=0;
    TH1=TH_M2;
    TL1=TL_M2;
    TR1=0;

    while(1) {
                       
                          
        if(PB0==0&&flag==0) {  

            debouncer();
                                          led=0;
            TR0=1;
            TR1=1;
            TR0=0;
            flag=1;
            while(PB0==0);
            debouncer();

        }
        if(PB0==0&&flag==1) {
            debouncer();
            TR0=1;
            flag=2;
            while(PB0==0);
            debouncer();

        }
        if(PB0==0&&flag==2) {
            debouncer();
                                           led=0;
            TR0=0;
            flag=3;
            while(PB0==0);
            debouncer();

        }
        if(PB0==0&&flag==3) {
            debouncer();
            seconds=0;
            disp[0]=disp[1]=0xc0;
            TR0=0;
            flag=1;
            while(PB0==0);
            debouncer();

        }



    }



}

void T0_1s(void)interrupt 1
{
    TH0=TH_M1;
    TL0=TL_M1;
    if(++count_T0==16) //为了消除误差将20改为16
    {   
        count_T0=0;
                          
                           led=~led;
                       
        seconds++;
        if(seconds==99)
            seconds=0;
    }
    disp[1]=TAB[seconds/10];
    disp[0]=TAB[seconds%10];
}

void T1_8ms(void) interrupt 3
{
    if(++count_T1==32)
    {
        count_T1=0;
        if(++scan==3) scan=1;
        SEG=0xff;
        SCANP=~scan;
        SEG=disp[scan-1];
    }
}


void debouncer(void)
{
    int i;
    for(i=0; i<2400; i++);
}

ID:320909 发表于 2018-5-15 12:46
不好意思源码发错了现在补上,并且加上了 led 提示灯

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表