找回密码
 立即注册

QQ登录

只需一步,快速开始

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

这是一个51单片机倒计时程序

[复制链接]
跳转到指定楼层
楼主
ID:123409 发表于 2016-5-26 20:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家参考参考,可以提提宝贵建议

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #define uchar unsigned char
  4. #define uint  unsigned int

  5. uint countb=0,counta=0;                // counta 为10ms计数器,countb为1s计数器,均为全局变量
  6. sbit s1 = P2^0;
  7. sbit s2 = P2^1;
  8. sbit s3 = P2^2;
  9. sbit s4 = P2^3;
  10. sbit en = P2^5;
  11. sbit speaker = P2^4;

  12. sbit k1=P3^2;
  13. sbit k2=P3^3;
  14.        
  15. uchar a1,a2,b1,b2;

  16. code ledseg7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};           //0~9不带小数点的段码表
  17.             //   0    1    2    3    4    5    6    7    8    9
  18. code ledseg8[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
  19.             //   0    1    2    3    4    5    6    7    8    9            //0~9带小数点的段码表


  20. /********延时函数********/
  21. void Delay(uint xms)              //延时程序,xms是形式参数
  22. {
  23.         uint i,j;
  24.         for(i=xms;i>0;i--)      
  25.         for(j=100;j>0;j--);                //此处分号不可少
  26. }

  27. /*******显示函数********/
  28. void display(uchar a,uchar b,uchar c,uchar d)
  29. {
  30.         en = 1;           //启用数码管信号

  31.         s1 = 0;
  32.         P0 = ledseg7[a];
  33.         Delay(5);     
  34.         s1 = 1;

  35.         s2 = 0;
  36.         P0 = ledseg8[b];
  37.         Delay(5);     
  38.         s2 = 1;

  39.         s3 = 0;
  40.         P0 = ledseg7[c];
  41.         Delay(5);      
  42.         s3 = 1;

  43.         s4 = 0;
  44.         P0 = ledseg7[d];
  45.         Delay(5);   
  46.         s4 = 1;
  47. }

  48. /********重置,暂停设置******/
  49. void key()
  50. {
  51.         if(k1==0)         //开始,暂停
  52.     {
  53.         Delay(10);
  54.                    if(k1==0)
  55.         {
  56.                      while(!k1);
  57.                          TR0=~TR0;
  58.         }
  59.     }
  60.         if(k2==0)          //复位
  61.         {
  62.            Delay(10);
  63.            if(k2==0)
  64.            {
  65.             TH0=0xDC; TL0=0x00;
  66.         countb=0;
  67.                 counta=0;
  68.         TR0=0;
  69.         while(k2!=0);
  70.     }
  71.     }
  72.   
  73. }

  74. /********定时器T0中断函数*******/
  75. void timer0() interrupt  1
  76. {  
  77.         TH0=0xDC;TL0=0x00;
  78.         counta++;                            //计数值加1
  79.           if(counta==100)                //若counta为99,(100*10ms=1s)
  80.           {       
  81.                   counta=0;                        // counta清0
  82.                 countb++;           
  83.           }
  84.         if(countb==30)
  85.         {
  86.                 TR0=0;
  87.                 s3=1;
  88.                 counta=0,countb=0;
  89.                 speaker=0;
  90.                 Delay(500);
  91.                 speaker=1;
  92.                 Delay(500);
  93.                 speaker=0;
  94.                 Delay(500);
  95.                 speaker=1;
  96.         }
  97. }

  98. void main()
  99. {
  100.         P0=0xff;
  101.            TMOD=0x01;                         //定时器T0方式1
  102.            TH0=0xDC; TL0=0x00;              //10ms定时初值
  103.         TR0=0;
  104.            EA=1;
  105.            ET0=1;         //开总中断,开定时器T0中断,启动定时器T0
  106.            while(1)
  107.            {
  108.             key();
  109.                 b2=countb/10;      //取出记数秒数的十位
  110.                    b1=countb%10;      //取出计数秒的个位
  111.                 a2=counta/10;      //取出记数百分秒数的十位
  112.                    a1=counta%10;             //取出计数百分秒的个位
  113.                    display(b2,b1,a2,a1);  //调显示函数
  114.            }
  115. }
复制代码


clock.docx

13.44 KB, 下载次数: 14, 下载积分: 黑币 -5

程序代码

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:214205 发表于 2017-6-24 12:01 | 只看该作者
很给力
回复

使用道具 举报

板凳
ID:213173 发表于 2017-6-24 16:43 | 只看该作者
显示函数执行一次超过20ms,有可能闪烁,也无法正常反映十分秒和百分秒动态,按键程序里使用了Delay(10);延时和while(!k1);等待按键释放,会明显劣化显示质量。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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