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

Posted l_____py

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用51单片机实现的简易秒表相关的知识,希望对你有一定的参考价值。

设计思路:在main函数中不停的控制数码管显示时、分、秒,同时用定时器0控制时间的递增

代码如下:

  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 }

 

以上是关于用51单片机实现的简易秒表的主要内容,如果未能解决你的问题,请参考以下文章

用定时器实现10s秒表的计时功能,精确到小数点后一位,即能够有0.1s显示,有开始,暂停,清零的功能(C语

单片机定时器秒表不跳

基于51单片机的电子秒表

基于51单片机的电子秒表

51单片机C语言秒表程序报错误和警告(程序如下)

51单片机的正向计时秒表protues仿真(源码+仿真)