单片机实现60s定时器

单片机573+数码管+按钮 实现60秒的定时器

知识:

IE寄存器

TCON寄存器

TMOD 寄存器

/*****************

2个定时中断,2个按钮中断

*******************/

#include    <reg51.h>     
#define    SEG        P2      //数码管 断码口 
#define    SCANP    P1    //数码管 com扫描口
sbit  OC = P0^0;      //定义573锁存器使能口,我是用的573驱动7段数码管
sbit    PB0=P3^2;      //按钮0
sbit    PB1=P3^3;      //按钮1     

/********************

第一个定时器

********************/
#define  count_M1 50000 // 0.05s MODE 1 一个机器周期1us 这里12MHZ 机器周期=1/(12/12) 定时时间=定时个数*机器周期=50000*1us =0.05s 

#define  TH_M1  (65536-count_M1)/256  //MODE 1 高4位
#define  TL_M1  (65536-count_M1)%256  //MODE 1 低4位

int count_T0=0;                        /***定义中断次数,第一个中断***/
/**********************

第2个定时器

**********************/ 
#define  count_M2   250                  //MODE 2  250*1us = 0.25s
#define  TH_M2  (256-count_M2)          //方式2 高4位
#define  TL_M2  (256-count_M2)          //方式1 低4位

char count_T1=0;                       /***定义中断次数 ,第2个中断***/
 
char code TAB[10]={    0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7c,0x07,0x7f,0x67 };    // 共阴极
char disp[2]={ 0x3f,0x3f }; // 数码管开始显示 0 0
 
char seconds=0;        
 
char scan=0;        

void delay(void);          
 
main()                     
{    
    OC = 0;         //锁存置0 ,点亮数码管
    IE=0x8f;        // 1000 1111 1000开启总中断  1111开启4个中断     
    TCON=0x00;        //低电平0触发         
    TMOD=0x21;        // 0010 0001  timer1采用方式2  timer0采用方式1
    TH0=TH_M1;      //T0高4位  MODE 1
    TL0=TL_M1;      //T0低4位  MODE 1
    TR0=0;            //不启动 T0     
    TH1=TH_M2;      //设置T1自动加载值,计数值  MODE2
    TL1=TL_M2;        //    T1 MODE2
    TR1=1;            //启动T1
    P3 =0xff;        //设置按钮输入
    while(1);     
}                             
 /**************

 中断0     计算并显示秒数

 ***************/
void T0_1s(void) interrupt 1 
{    
    TH0=TH_M1;     
    TL0=TL_M1;      
    if (++count_T0==20)           //中断计数20次  0.05*20 = 1S     
    {    
        count_T0=0;             
        seconds++;         
        if (seconds==60)      
        seconds=0;         
    }                         
    disp[1]=TAB[seconds/10];   //十位
    disp[0]=TAB[seconds%10];   //个位
}                             
/***********************

中断1      扫描

************************/ 
void T1_8ms(void) interrupt 3     
{    if (++count_T1==32)  //0.25us * 32 ==8ms         
    {    
        count_T1=0;             
        if (++scan==3)  //不能超过十位
        scan=1;     
        SEG=0xff;                 
        SCANP=~scan;             
        SEG=disp[scan-1];     
    }                             
}                             
 
/************************

按钮 0 中断      码表开始/暂停

*************************/
void int0_sw(void) interrupt 0     
{    
    TR0=~TR0;    //启动/暂停定时器                 
    while(PB0==0);                 
    delay();    //延时去抖动         
}                                 
 /************************

    中断1 按钮 1  复位

 ************************/
void int1_RST(void) interrupt 2  
{    
    while(PB1==0);             
    delay();         
    seconds=0;                     
    disp[0]=disp[1]=0xc0;           
}                             
 
void delay(void)        //延时去抖动     
{    
    int i;                         
    for(i=0;i<2400;i++); // 2400 * 8 =  19200us = 20ms    
}                             


原文地址:https://www.cnblogs.com/zhaocundang/p/4968590.html