基于51单片机定时器的秒表程序 只显示 毫秒 秒 分钟

[复制链接]
查看1 | 回复0 | 2021-4-14 16:04:44 | 显示全部楼层 |阅读模式
1.png

单片机部分代码:(完整代码和仿真文件见本帖附件)
  1. #include <AT89X52.H>
  2. #define uint unsigned int                         //宏定义无符号整型数据
  3. #define uchar unsigned char                        //宏定义无符号字符型数据
  4. sbit key1=P3^6;                                                //按键
  5. sbit led=P1^0;                                                //灯
  6. sbit ledc=P1^1;                                                //灯
  7. uchar Cntus=0,Cnt10ms=0,Cnt1s=0,Cnt1min=0;//中断计时变量

  8. bit stop=0;                                                        //停止标志
  9. void display();                                                //显示程序声明
  10. void keyscan();                                                //按键扫描程序声明

  11. /**************************************
  12. 1602液晶
  13. **************************************/
  14. sbit RS = P2^5;               
  15. sbit RW = P2^6;
  16. sbit E  = P2^7;
  17.                            /**********************************************************
  18. 函数说明: 延时程序
  19. **********************************************************/
  20. void delay(uchar t)
  21. {
  22.         uint j;
  23.         uchar i;
  24.         for(i=0;i<t;i++)
  25.                 for(j=0;j<1000;j++);
  26. }
  27. /**************************************
  28. 短延时
  29. **************************************/
  30. void delay5ms()   
  31. {
  32.     uchar i,v,k;
  33.     for(i=1;i>0;i--)
  34.         for(v=168;v>0;v--)
  35.             for(k=22;k>0;k--);
  36. }
  37. /**************************************
  38. 写指令
  39. **************************************/
  40. void lcd_Write_com(uchar com)         
  41. {
  42.         RS=0;                        //定义指令寄存器
  43.         RW=0;                                  //写允许
  44.         P0=com;                                          //写指令
  45.         delay5ms();        E=1;                //片选端上拉
  46.         delay5ms();        E=0;                //下降沿锁存
  47. }
  48. /**************************************
  49. 写数据
  50. **************************************/
  51. void lcd_write_date(uchar date)      
  52. {
  53.         RS=1;                                        //定义数据寄存器
  54.         RW=0;                                        //写允许
  55.         P0=date;                                //写数据
  56.         delay5ms();        E=1;                //片选端上拉
  57.         delay5ms();        E=0;                //下降沿锁存
  58. }
  59. /**************************************
  60. 显示程序
  61. **************************************/
  62. void dis_lcd1602(uchar x,uchar y,uchar dat)
  63. {
  64.         uchar add;
  65.         if(y==1)         add=(0x80+x);
  66.         if(y==2)         add=(0xc0+x);
  67.         lcd_Write_com(add);                //写指令
  68.         lcd_write_date(dat);        //写数据
  69. }  
  70. /**************************************
  71. 液晶初始化
  72. **************************************/
  73. void lcd1602_init()
  74. {
  75.         lcd_Write_com(0x38);        //设置8位格式,2行,5*7
  76.         lcd_Write_com(0x01);        //清屏
  77.         lcd_Write_com(0x0c);        //整体显示,关光标,不闪烁
  78.         lcd_Write_com(0x06);        //设定输入方式,增量不移位
  79.         lcd_Write_com(0x80);        //初始坐标
  80. }
  81. /**************************************
  82. 液晶显示汉字程序
  83. **************************************/
  84. void hz_lcdDis(uchar x,uchar y,uchar *p) //汉字显示
  85. {
  86.    uchar i=0,temp;
  87.    if(x)temp = 0x40;   else temp = 0;
  88.    for(i=y;*p!='\0';i++,p++)
  89.    {
  90.                 lcd_Write_com(i|0x80+temp);
  91.                 lcd_write_date(*p);
  92.                 delay5ms();                        
  93.    }
  94. }
  95. /**************************************
  96. 液晶显示数字程序
  97. **************************************/
  98. void  num_lcdDis(uchar X,uchar Y,uint num,uchar n)      
  99. {
  100.         uint i=0,temp,hang;   
  101.         n +=1;
  102.            if(X)hang = 0x40;else hang = 0;
  103.            for(i=(n-1);i>0;i--)
  104.     {           
  105.                   lcd_Write_com((i+Y-1)|0x80+hang);          //从个位开始显示
  106.                   temp = num%10+0x30;
  107.                   lcd_write_date(temp);      
  108.                  delay5ms();
  109.                   num/=10;                                         
  110.         }      
  111. }

  112. void  num_lcdDis1_1(uint num)//input 电压 整数部分      
  113. {
  114.         uint i,temp,x;   

  115.             x=5;
  116.            for(i=0;i<2;i++)
  117.     {         x--;  
  118.                   lcd_Write_com(0x80+x);        //写指令
  119.                   temp = num%10+0x30;
  120.                   lcd_write_date(temp);//        写数据
  121.                   num/=10;                                         
  122.         }      
  123. }
  124. /**************************************
  125. 液晶显示数字程序
  126. **************************************/
  127. void  num_lcdDisx(uchar X,uchar Y,uint num,uchar n)      
  128. {
  129.         uint i=0,temp,hang;   
  130.         n +=1;
  131.            if(X)hang = 0x40;
  132.         else hang = 0;
  133.            for(i=(n-1);i>0;i--)
  134.     {           
  135.                   lcd_Write_com((i+Y-1)|0x80+hang);//从个位开始显示
  136.                   temp = num%10+0x30;
  137.                   lcd_write_date(temp);      
  138.                  delay5ms();
  139.                   num/=10;                                         
  140.         }      
  141. }
  142. /***********按键扫描程序****************/
  143. void keyscan()      
  144. {
  145.         static uint count2=0,count1=0;        //计数变量                       
  146.         static bit key_sign=0;                        //按键自锁标志
  147.         if(key1==0)                                                //检测按键为0
  148.         {        delay(50);
  149.                 if(key1==0){
  150.                            count1++;
  151.                         stop=!stop;
  152.                
  153.                 }
  154.                                                 //计数延时消抖
  155.          
  156.         }
  157.         else
  158.         {
  159.                 count1=0;                                        //计数变量清0
  160.         }
  161. }
  162. /***********定时器初始化程序****************/
  163. void Timer0Init(void)                                //2.5毫秒@11.0592MHz
  164. {
  165.         TMOD = 0x01;                                        //设置定时器模式
  166.         TL0 = 0x00;                                                //设置定时初值
  167.         TH0 = 0xF7;                                                //设置定时初值
  168.         TR0 = 1;                                                //定时器0开始计时
  169.         EA=1;                                                        //开总中断
  170.         ET0=1;                                                        //开定时器0中断
  171. }
  172. /***************主程序****************/
  173. void main()
  174. {
  175. int cm=0;
  176.         Timer0Init();                                        //定时器初始化
  177.         lcd1602_init();//液晶初始化
  178.         hz_lcdDis(0,0,"Timer system");        //启动电源
  179.         hz_lcdDis(1,7,":  :");                //欢迎你
  180.                 led=1;
  181.         while(1)
  182.         {
  183.                 //        Cnt1min                   Cnt1s                         Cnt10ms      
  184.                 num_lcdDis(1,5,Cnt1min,2);
  185.                 num_lcdDis(1,8,Cnt1s,2);
  186.                 num_lcdDis(1,11,Cnt10ms,2);
  187.                 if(Cnt1min>9){
  188.                    led=0;
  189.                 }
  190.          
  191.                 keyscan();                                        //按键扫描
  192.         }
  193. }
  194. /**************中断服务程序*****************/
  195. void timer0() interrupt        1                        //2.5毫秒@11.0592MHz
  196. {
  197.         TL0 = 0x00;                                                //设置定时初值
  198.         TH0 = 0xF7;                                                //设置定时初值
  199.         Cntus++;                                                //中断变量Cntus自+1
  200.         if(Cntus>=4)                                        //10ms
  201.         {
  202.                 Cntus=0;                                        //清0
  203.                 if(stop==1)                                        //启动
  204.                         Cnt10ms++;                                //10毫秒计数
  205.                 if(Cnt10ms>=100)
  206.                 {
  207.                         Cnt10ms=0;
  208.                         ledc=!ledc;
  209.                         Cnt1s++;
  210.                                                         //秒计数
  211.                         if(Cnt1s>=60)
  212.                         {
  213.                                 Cnt1s=0;
  214.                                 Cnt1min++;                        //分计数
  215.                                 if(Cnt1min>=100)
  216.                                         Cnt1min=0;
  217.                         }
  218.                 }
  219.         }
  220. }
复制代码
c代码和仿真文件 毫秒级的秒表.zip (131.34 KB, 售价: 1 工控币)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则