找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3829|回复: 6
打印 上一主题 下一主题
收起左侧

设计一个简易单片机秒表,按键k1按下后,开始计时 如果再次按下开始按键,则暂停计时

[复制链接]
跳转到指定楼层
楼主
ID:972882 发表于 2021-10-17 23:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
目前K2没反应(没报错)

单片机源程序如下:
  1. #include <REG52.H>

  2. sbit k1 = P3 ^ 2; //开始按键k1

  3. sbit k2 = P3 ^ 3; //暂停按键k2

  4. /*全局变量及函数声明*/
  5. unsigned char flag2=0;
  6. unsigned char flag = 0;     //运行标记
  7. unsigned char second;
  8. unsigned char second2;
  9. void delay1s();             //定时器计时1s的函数

  10. void disp(unsigned char i); //数码管显示函数

  11. void delay(unsigned int i); //粗略延时函数

  12. unsigned char isStarted();  //判断是否开始按键按下函数

  13. unsigned char isPaused();   //判断是否暂停按键按下函数
  14. unsigned char isclear();
  15. /*------声明结束-----------*/

  16. void main()

  17. {
  18. unsigned char second2= 0;
  19.     unsigned char second = 0; //秒计数变量

  20.     disp(second);             //一开始显示"00"

  21.     while (1)

  22.     {

  23.         while (!isStarted())

  24.             ; //检测开始按键是否按下,按下则结束此处的循环等待,往下执行

  25.         while (flag)

  26.         {

  27.             disp(second); //把秒数写入显示函数

  28.             delay1s();    //调用1s函数

  29.             second++;     //隔1s,秒数加1

  30.             if (second == 100)

  31.                 second = 0; //当定时到100,则变成0
  32. isclear();
  33.             isPaused();     //调用暂停按键函数,检测暂停按键是否按下

  34.         }

  35.     }
  36. while(flag2)

  37.     disp(second2);            //一开始显示"00"
  38.                   while (1)

  39.     {

  40.         while (!isStarted())

  41.             ; //检测开始按键是否按下,按下则结束此处的循环等待,往下执行

  42.         while (flag2)

  43.         {
  44. P1=0XC0;
  45.                                         P2=0XC0;
  46.             disp(second); //把秒数写入显示函数

  47.             delay1s();    //调用1s函数

  48.             second++;     //隔1s,秒数加1

  49.             if (second == 100)

  50.                 second = 0; //当定时到100,则变成0
  51. isclear();
  52.             isPaused();     //调用暂停按键函数,检测暂停按键是否按下

  53.         }

  54.     }
  55. }



  56. //定时器计时1s的函数

  57. void delay1s()

  58. {

  59.     unsigned char i;

  60.     for (i = 0; i < 20; i++) //因为计数器每计50000次就耗时50ms,所以20次循环则为1s

  61.     {

  62.         //isPaused(); //调用暂停按键函数,检测暂停按键是否按下。优点:不用长按暂停键就可以停止计时;缺点:每次计时要检测耗费时间,影响定时准确性。

  63.         /*1、设置定时器工作方式(只需要设置1次即可)*/

  64.         TMOD = 0x10; //定时器T1设置为工作方式1,16位计数器

  65.         /*2、给计数器赋初始值*/

  66.         /*只要每次对计数器重新赋值,就按照下面设置的值在TR1启动后开始计数*/

  67.         TH1 = (65536 - 50000) / 256; //把初始值写入计数器的高8位

  68.         TL1 = (65536 - 50000) % 256; //把初始值写入计数器的低8位

  69.         /*3、启动定时器*/

  70.         TR1 = 1; //启动定时器T ReadyGo

  71.         /*4、检测计数器是否溢出*/

  72.         while (TF1 == 0)

  73.             ; //当还没有溢出就等待,当溢出时TF1自动为1

  74.         /*5、手动清除溢出标记*/

  75.         TF1 = 0; //必须手动对溢出标记清零,以便开始下一次计数定时

  76.     }

  77. }



  78. //数码管显示函数

  79. void disp(unsigned char i)

  80. {

  81.     unsigned char code led[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};

  82.     //定义0~9显示码,共阳极数码管

  83.     P1 = led[i / 10]; //把秒数的十位写给P1口

  84.     P2 = led[i % 10]; //把秒数的个位写给P2口

  85. }



  86. //粗略延时函数

  87. void delay(unsigned int i)

  88. {

  89.     while (i--)

  90.         ;

  91. }

  92. //判断是否开始按键按下函数

  93. unsigned char isStarted()

  94. {

  95.     if (k1 == 0)

  96.     {

  97.         delay(1000);

  98.         if (k1 == 0)

  99.         {

  100.             while (!k1)

  101.                 ;

  102.             flag = 1; //把运行标记设置为1

  103.         }

  104.     }

  105.     return flag;

  106. }

  107. //判断是否暂停按键按下函数

  108. unsigned char isPaused()

  109. {

  110.     if (k1 == 0)

  111.     {

  112.         delay(1000);

  113.         if (k1 == 0)

  114.         {

  115.             while (!k1)

  116.                 ;

  117.             flag = 0; //把运行标记设置为0

  118.         }

  119.     }

  120.     return flag;

  121. }

  122. unsigned char isclear()

  123. {

  124.     if (k2 == 0)

  125.     {

  126.         delay(1000);

  127.         if (k2 == 0)

  128.         {

  129.             while (!k2)

  130.                 ;

  131.           flag2=1;
  132.         }

  133.     }

  134. return flag2;

  135. }
复制代码


作业4-制作简易秒表(外部中断、定时器中断).zip

33.16 KB, 下载次数: 12

C语言程序

作业3-使用定时器制作简易秒表.zip

22.45 KB, 下载次数: 14

prpteus图

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:972882 发表于 2021-10-17 23:45 | 只看该作者
各位大神能否帮我看看我这个程序为什么K2没反应(没报错)
回复

使用道具 举报

板凳
ID:972882 发表于 2021-10-17 23:46 | 只看该作者
能否有条件在该程序原来的基础上修改一部分让K2正常运行
回复

使用道具 举报

地板
ID:332444 发表于 2021-10-18 08:13 | 只看该作者
回复

使用道具 举报

5#
ID:839438 发表于 2021-10-18 10:06 | 只看该作者
if (k2 == 0)

    {

        delay(1000);

        if (k2 == 0)

        {

           

          flag2=1;
        }
while (!k2)

                ;
    }感觉是这样的
回复

使用道具 举报

6#
ID:161164 发表于 2021-10-18 17:02 | 只看该作者
好可怕的写法
while(1)
  while(1)
    while(1)
      while(1)
       while(1)
回复

使用道具 举报

7#
ID:213173 发表于 2021-10-18 20:32 | 只看该作者
SWATELITE 发表于 2021-10-17 23:46
能否有条件在该程序原来的基础上修改一部分让K2正常运行

楼主对while情有独钟。在该程序原来的基础上修改只能保留#include <REG52.H>,其它几乎都要改。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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