你的位置:首页 > 操作系统

[操作系统]单片机实现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;   //按钮0sbit  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  }