• 单片机实现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    
    }                             


  • 相关阅读:
    浅谈display:flex
    MVVM
    HDFS 伪分布式集群搭建
    HDFS入门
    Hadoop-HDFS
    Hadoop介绍
    大数据-高并发Nginx
    大数据-高并发LVS3Keepalived
    大数据-高并发LVS2实验
    大数据-高并发LVS1
  • 原文地址:https://www.cnblogs.com/zhaocundang/p/4968590.html
Copyright © 2020-2023  润新知