找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2251|回复: 2
收起左侧

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

[复制链接]
ID:320909 发表于 2018-5-12 20:40 | 显示全部楼层 |阅读模式

中断,定时器,数码管动态显示
0~99秒定时器
按键按一下
开启显示00
再按一下开始计时
再按一下暂停
再按一下清0

一起学习

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
0.png 0.png

单片机源程序如下:
  1. #include<reg51.h>

  2. sbit p1=P1^0;
  3. sbit p2=P1^1;
  4. unsigned char code TAB[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  5.                       0x80,0x90};
  6. unsigned char disp[2]={0xc0,0xc0};

  7. unsigned char i=0;
  8. unsigned int cnt =0;

  9. void main(){
  10. unsigned long sec =0;
  11.         EA=1;
  12.         TMOD=0x01;
  13.         TH0=0xfc;
  14.         TL0=0x18;
  15.         ET0=1;
  16.         TR0=1;
  17.        
  18.         while(1){
  19.         if(cnt>=1000){
  20.         cnt=0;
  21.                 sec++;
  22.                 disp[0]=TAB[sec%10];
  23.                 disp[1]=TAB[sec/10];
  24.         }
  25.        
  26.        
  27.        
  28.         }
  29.   


  30. }



  31. void inter0() interrupt 1{
  32. TH0=0xfc;
  33.         TL0=0x18;
  34.         cnt++;
  35.         if(++i==3)i=1;
  36.         P2=0xff;
  37.         P1=~i;
  38.         P2=disp[i-1];
  39.        
  40.        
  41. }
复制代码

所有资料51hei提供下载:
定时器秒表.rar (14.37 KB, 下载次数: 37)
回复

使用道具 举报

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

使用道具 举报

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++);
}

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

Powered by 单片机教程网

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