用51单片机实现的简易秒表

时间:2024-02-22 08:48:06

设计思路:(1)在main函数中不停的控制数码管显示时、分、秒

     (2)用定时器0控制时间的递增

     (3)用外部中断0(KEY3)实现秒表的暂停/开始

        (4)用外部中断1(KEY4)实现秒表的停止

开发板:普中科技开发板

代码如下:

  1 #include "reg52.h"
  2 #define led P0
  3 typedef unsigned char u8;
  4 typedef unsigned int u16;
  5 
  6 sbit LSA = P2^2;
  7 sbit LSB = P2^3;
  8 sbit LSC = P2^4;
  9 sbit k3 = P3^2;
 10 sbit k4 = P3^3;
 11 static u8 hour = 0;
 12 static u8 min = 0;
 13 static u8 sec = 0;
 14 
 15 u8 code smgz[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
 16                     0x7f,0x6f,0x40};
 17 
 18 u8 code location[8][3] = {1, 1, 1,
 19                           0, 1, 1,
 20                           1, 0, 1,
 21                           0, 0, 1,
 22                           1, 1, 0,
 23                           0, 1, 0,
 24                           1, 0, 0,
 25                           0, 0, 0};
 26 //位置表 从左到右
 27 
 28 void delay(u16 j){
 29     while(j--);
 30 }
 31 
 32 char nol(char loc){
 33     switch(loc){
 34         case 7:
 35                return sec % 10 ;
 36         case 6:
 37                return sec / 10; 
 38         case 5:
 39                return 10;
 40         case 4:
 41                return min % 10;
 42         case 3:
 43                return min / 10; 
 44         case 2:
 45                return 10;
 46         case 1:
 47                return hour % 10;
 48         case 0:
 49                return hour / 10;
 50     }
 51 }
 52                 
 53 void Timer0Init()
 54 {
 55     TMOD |= 0X01;
 56     TH0 = 0XFC;
 57     TL0 = 0X18;
 58     ET0 = 1;
 59     IT0=1;//跳变沿出发方式(下降沿)
 60     EX0=1;//打开INT0的中断允许。
 61     IT1=1;
 62     EX1=1;
 63     EA = 1;
 64     TR0 = 1;     
 65 }
 66 void main(){
 67 
 68     Timer0Init();
 69     while(1)
 70     {    
 71         u8 i;
 72         for(i = 0; i <= 7; i++){
 73 
 74             LSA = location[i][0];
 75             LSB = location[i][1];
 76             LSC = location[i][2];
 77             led = smgz[nol(i)];
 78             delay(50);
 79             led = 0;//消隐
 80         }
 81     }            
 82 }
 83 void Timer0() interrupt 1
 84 {
 85         static int Timer0_times = 0;
 86         TH0 = 0XFC;
 87         TL0 = 0X18;
 88         Timer0_times++;
 89         if(Timer0_times == 987)
 90         {
 91             if(sec < 59)
 92                 sec++;
 93             else if(min < 59)
 94             {
 95                 min++;
 96                 sec = 0;
 97             }
 98             else
 99             {
100                 hour++;
101                 min = sec = 0;
102             } 
103             Timer0_times = 0;
104         }
105 }
106 
107 void Int0()    interrupt 0        //外部中断0的中断函数
108 {
109     delay(1000);     //延时消抖
110     if(k3==0)
111     {
112         TR0 = ~TR0;
113     }
114 }
115 
116 void Int1()    interrupt 2        //外部中断1的中断函数
117 {
118     delay(1000);     //延时消抖
119     if(k4==0)
120     {
121         TR0 = 0;
122         hour = min = sec = 0;
123 
124     }
125 }