找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2678|回复: 2
收起左侧

关于单片机秒表的一个程序,但是数码管只显示一个0

[复制链接]
ID:309719 发表于 2018-5-26 13:32 | 显示全部楼层 |阅读模式

关于秒表的一个程序,但是数码管只显示一个0,求各位帮忙看一下。

单片机源码:
  1. #include<reg51.h>

  2. sbit K1 = P1^0;
  3. sbit K2 = P1^1;
  4. sbit K3 = P1^2;
  5. sbit K4 = P1^3;

  6. unsigned char code LedChar[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  7. unsigned char LedBuff[] = {0x00,0x00,0x00,0x00,0x00,0x00};
  8. unsigned char KeySta[] = {1,1,1,1};

  9. bit StopwatchRunning = 0;
  10. bit StopwatchRefresh = 1;
  11. unsigned char DecimalPart = 0;
  12. unsigned int IntegerPart = 0;
  13. unsigned char T0RH = 0;
  14. unsigned char T0RL = 0;

  15. void ConfigTimer0(unsigned int ms);
  16. void StopwatchDisplay();
  17. void KeyDriver();

  18. void main()
  19. {
  20.         EA = 1;
  21.         P1 = 0xFE;
  22.         ConfigTimer0(2);

  23.         while(1)
  24.         {
  25.                 if(StopwatchRefresh)
  26.                 {
  27.                         StopwatchRefresh = 0;
  28.                         StopwatchDisplay();
  29.                 }
  30.                 KeyDriver();
  31.         }
  32. }
  33. void ConfigTimer0(unsigned int ms)
  34. {
  35.         unsigned long tmp;
  36.         
  37.         tmp = 11059200 / 12;
  38.         tmp = (tmp*ms) /1000;
  39.         tmp = 65536 -tmp;
  40.         tmp = tmp + 18;
  41.         T0RH = (unsigned char)(tmp>>8);
  42.         T0RL = (unsigned char)tmp;
  43.         TMOD &= 0xF0;
  44.         TMOD |= 0x01;
  45.         TH0 = T0RH;
  46.         TL0 = T0RL;
  47.         ET0 = 1;
  48.         TR0 = 1;
  49. }
  50. void StopwatchDisplay()
  51. {
  52.         signed char i;
  53.         unsigned char buf[6];

  54.         LedBuff[0] = LedChar[DecimalPart % 10];
  55.         LedBuff[1] = LedChar[DecimalPart / 10];
  56.         buf[0] = IntegerPart % 10;
  57.         buf[1] = (IntegerPart / 10) % 10;
  58.         buf[2] = (IntegerPart / 100) % 10;
  59.         buf[3] = (IntegerPart / 1000) % 10;
  60.         for(i = 3;i>=1;i--)
  61.         {
  62.                 if(buf[i] == 0)[/i][i]
  63.                         LedBuff[i+2] = 0x00;
  64.                 else
  65.                         break;
  66.         }
  67.         for(;i>=0;i--)
  68.         {
  69.                 LedBuff[i+2] = LedChar[buf[i]];[/i][i]
  70.         }
  71.         LedBuff[2] &= 0x80;
  72. }                          
  73. void StopwatchAction()
  74. {
  75.         if(StopwatchRunning)
  76.                 StopwatchRunning = 0;
  77.         else
  78.                 StopwatchRunning = 1;
  79. }
  80. void StopwatchReset()
  81. {
  82.         StopwatchRunning = 0;
  83.         DecimalPart = 0;
  84.         IntegerPart = 0;
  85.         StopwatchRefresh = 1;
  86. }
  87. void KeyDriver()
  88. {
  89.         unsigned char i;
  90.         static unsigned char backup[4] = {1,1,1,1};

  91.         for(i=0;i<4;i++)
  92.         {
  93.                 if(backup[i] != KeySta[i])[/i][/i][i][i]
  94.                 {
  95.                         if(backup[i] != 0)[/i][i]
  96.                         {
  97.                                 if(i == 1)
  98.                                         StopwatchReset();
  99.                                 else if(i == 2)
  100.                                         StopwatchReset();
  101.                         }
  102.                 }
  103.                 backup[i] = KeySta[i];[/i][/i][i][i]
  104.         }
  105. }
  106. void KeyScan()
  107. {
  108.         unsigned char i;
  109.         static unsigned char keybuf[] = {0x00,0x00,0x00,0x00};

  110.         keybuf[0] = (keybuf[0]<<1) | K1;
  111.         keybuf[1] = (keybuf[1]<<1) | K2;
  112.         keybuf[2] = (keybuf[2]<<1) | K3;
  113.         keybuf[3] = (keybuf[3]<<1) | K4;
  114.         for(i = 0;i<4;i++)
  115.         {
  116.                 if(keybuf[i] == 0x00)[/i][i]
  117.                 {
  118.                         KeySta[i] = 0;[/i][i]
  119.                 }
  120.                 else if(keybuf[i] == 0xff)[/i][i]
  121.                 {
  122.                         KeySta[i] =1;[/i][i]
  123.                 }
  124.         }
  125. }
  126. void LedScan()
  127. {
  128.         static unsigned char i = 0;

  129.         P0 =0X00;
  130.         P2 = (P2 &0xF8) | i;
  131.         P0 = LedBuff[i];[/i][i]
  132.         if(i<5)
  133.                 i++;
  134.         else
  135.                 i = 0;
  136. }
  137. void StopwatchCount()
  138. {
  139.         if(StopwatchRunning)
  140.         {
  141.                 DecimalPart++;
  142.                 if(DecimalPart >= 100)
  143.                 {
  144.                         DecimalPart = 0;
  145.                         IntegerPart++;
  146.                         if(IntegerPart >= 10000)
  147.                         {
  148.                                  IntegerPart = 0;
  149.                         }
  150.                 }
  151.                 StopwatchRefresh = 1;
  152.         }
  153. }
  154. void InterruptTimer0() interrupt 1
  155. {
  156.         static unsigned char tmr10ms = 0;

  157.         TH0 = T0RH;
  158.         TL0 = T0RL;
  159.         LedScan();
  160.         KeyScan();

  161.         tmr10ms++;
  162.         if(tmr10ms >= 5)
  163.         {
  164.                 tmr10ms = 0;
  165.                 StopwatchCount();
  166.         }
  167. }
复制代码

回复

使用道具 举报

ID:111634 发表于 2018-5-26 18:26 | 显示全部楼层
本帖最后由 zl2168 于 2018-5-26 18:28 编辑

给你介绍一个正确有效看得懂的案例,自己对照查错吧!
实例93  99.9秒秒表
实例95 99.9秒秒表.rar (38.86 KB, 下载次数: 6)
回复

使用道具 举报

ID:111634 发表于 2018-5-26 18:29 | 显示全部楼层
本帖最后由 zl2168 于 2018-5-26 18:35 编辑

实例96  能预置初值的倒计时秒表
Proteus仿真一下,确认有效。
实例96 能设置初值的倒计时秒表.rar (40 KB, 下载次数: 5)
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表