找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1643|回复: 3
收起左侧

用51单片机设计一个2位的LED数码显示00-99的秒表程序求助

[复制链接]
ID:1020093 发表于 2022-5-9 20:04 | 显示全部楼层 |阅读模式
各位前辈们,你们好!我是一个初学单片机的新手,我需要完成一个项目,但是遇到了一些问题,所以想请教一下前辈们。

如下:
用AT89C51单片机设计一个2位的 LED 数码显示作为“秒表”:显示时间为00-99秒,每秒自动加1,另设计一个“开始”键和一个“复位”键,一个“设置”按键,一个蜂鸣器。
要求:
(1)具备计时功能,每秒自动加一,实现00-99秒显示。
(2)按下复位键后,时间清零。
(3)按下设置按键后,可以通过开始键和复位键对定时时间的十位和个位进行加减设置,当到达定时时间时,蜂鸣器滴答报警。
我想请教的问题是:要求中的第(3)小问,要怎么样才能实现呢?希望能得到前辈们的帮助,谢谢!
1.png
代码如下:
  1. #include "reg51.h"
  2. #define uchar unsigned char
  3. #define uint unsingned int
  4. #define LED P0
  5. uchar tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
  6. uchar num,t,shi,ge;
  7. void init();
  8. void timer0();
  9. void display();
  10. void delay(uchar);

  11. sbit KEY1 = P3^6;//开始
  12. sbit KEY2 = P3^7;//复位

  13. void delay(uchar x)          //延时子程序
  14. {
  15.    int i,j;
  16.    for(i=x;i>0l;i--)
  17.    for(j=255;j>0;j--);
  18. }

  19. void display()        //显示
  20. {
  21.         if(num >= 99)
  22.         {
  23.                 //num = 0;  // 数据显示限制  最大为99
  24.                 if(TR0)
  25.                 TR0 = 0;
  26.         }
  27.         shi=num/10;   //显示拆分  
  28.         ge=num%10;
  29.         P2=0X00;          //显示消影
  30.         P0=0XFF;
  31.         P2=0x01;     //显示第一位
  32.         LED=tab[shi];
  33.         delay(5);//延时
  34.         P2=0X00; //显示消影
  35.         P0=0XFF;
  36.         P2=0x02;   //显示第二位
  37.         LED=tab[ge];
  38.         delay(5);//延时
  39. }

  40. void init()//定时器初始化部分
  41. {
  42.         num=t=0;         //清楚数据
  43.         TMOD=0x01;        //定时器初始化
  44.         TH0=(65536-15536)/256;//定时器赋初值 定时50ms
  45.         TL0=(65536-15536)%256;
  46.         EA=1;
  47.         ET0=1;
  48. }

  49. void timer0()
  50. {
  51.         if(TF0==1)    //查询溢出的时间
  52.         {
  53.         TF0=0;        //清楚溢出标志
  54.         t++;
  55.    if(t==20) //累计时间到1S
  56.    {
  57.     t=0;
  58.     num++;
  59.    }
  60.         }
  61. }

  62. void main()
  63. {
  64.         init();
  65.         while(1)
  66.         {
  67.                 timer0();
  68.                 display();
  69.          if(KEY1 == 0)//开始
  70.          {
  71.                  if(TR0 == 0)
  72.                  {
  73.                     t = 0;
  74.         num = 0;
  75.         TR0=1;   
  76.                   }
  77.           }
  78.          else  if(KEY2 == 0)//复位
  79.          {
  80.         TR0 = 0;   
  81.             TF0 = 0;
  82.             t = 0;
  83.             num = 0;
  84.             TR0=1;
  85.           }
  86.                  
  87.   }

  88. }

复制代码

回复

使用道具 举报

ID:1025219 发表于 2022-5-9 22:11 | 显示全部楼层
建议开始,复位,蜂鸣器采用中断
回复

使用道具 举报

ID:161164 发表于 2022-5-10 14:46 | 显示全部楼层
本帖最后由 lkc8210 于 2022-5-10 14:48 编辑

你少了设置键
第一次按:进入个位设置模式,开始键为加,复位键为减
第二次按:进入十位设置模式,开始键为加,复位键为减
第三次按:退出设置模式,按开始键开始倒计时
回复

使用道具 举报

ID:1020093 发表于 2022-5-11 20:05 | 显示全部楼层
lkc8210 发表于 2022-5-10 14:46
你少了设置键
第一次按:进入个位设置模式,开始键为加,复位键为减
第二次按:进入十位设置模式,开始键 ...

好的谢谢啦!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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