找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机倒计时牌Proteus仿真图+代码 可倒计时24小时

  [复制链接]
跳转到指定楼层
楼主
ID:487926 发表于 2019-3-10 15:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
“彼岸之光”倒计时牌设计书

一.设计构想
⒈设计一个倒计时牌。
⒉倒计时牌由九个数码管分别显示“天”、“时”、“分”、“秒”,其中“天”为三位,“时”、“分”、“秒”各两位。
⒊倒计时牌设置两个按键:select/start键和set键,用来设置计时时间(只能设置整天)。当按select/start键时,“天”的百位、十位、个位依次闪烁,闪烁位表明当前位被选中,此时按set键进行调整。三位调整完毕再按下select/start键,倒计时开始。
二.实现方法
⒈定时器0工作在方式1(16位)下定时一秒,每秒触发依次,使“秒”变量减一,相当于秒针。
⒉两个按键:select/start键和set键分别使用两个外部中断INT0和INT1(设置下降沿有效)。当相应的按键按下时,触发相应的中断子程序。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include <reg51.h>
  2. #include <stdio.h>
  3. void timer0_init();               //定时器0初始化
  4. void delay(int);                  //延时程序
  5. void trans_led(int,int,int,int);  //数码管显示传送函数
  6. sbit P10=0x90;                    //管脚定义
  7. sbit P30=0xB0;
  8. sbit P20=0xA0;
  9. int day=0,hour=0,min=0,sec=0;     //定义时间变量
  10. unsigned int state=0;             //运行状态标志
  11. unsigned int asec=0;              //记录定时器0中断次数,当asec=20时计时为1s
  12. unsigned int check_b=0,check_s=0,check_g=0;    //记录set键的按下次数
  13. char table[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};  //定义表格
  14. main(){
  15.   timer0_init();
  16.   EX0=1;
  17.   EX1=1;
  18.   IT0=1;
  19.   IT1=1;
  20.   EA=1;
  21.   TR0=1;
  22.   while(1){
  23.    switch(state){
  24.      case(1):trans_led(100,5,10,10); //"天"的百位闪烁
  25.              break;
  26.      case(2):trans_led(10,100,5,10); //"天"的十位闪烁
  27.              break;
  28.      case(3):trans_led(10,10,100,5); //"天"的个位闪烁
  29.              break;
  30.      default:trans_led(0,20,20,20);  //正常运行
  31.              break;

  32.    }
  33.   }
  34. }
  35. void timer0_init(){
  36.   TMOD=0x21;
  37.   TH0=0x3C;
  38.   TL0=0xB0;
  39.   ET0=1;
  40.   TF0=0;
  41. }
  42. void Timer0_overflow() interrupt 1 using 0{
  43.   TH0=0x3C;
  44.   TL0=0xB0;
  45.   asec++;
  46.   if(asec==20){             //定时一秒           
  47.     asec=0;
  48.     if(sec==0){
  49.       sec+=60;
  50.       min--;
  51.     }
  52.     if(min<0){
  53.       min+=60;
  54.       hour--;
  55.     }
  56.     if(hour<0){
  57.       hour+=24;
  58.       day--;
  59.     }
  60.     if(day>=0){              //计时时间未完,秒减一
  61.       sec--;
  62.     }
  63.     else{
  64.       day=hour=min=sec=0;    //计时结束
  65.       TR0=0;
  66.     }
  67.   }
  68. }
  69. void Int0() interrupt 0 using 0{  //set键
  70.   if(state>4)
  71.     state=1;
  72.   else
  73.     state++;
  74.   if(state==4){
  75.     state=0;
  76.     TR0=1;
  77.   }
  78. }
  79. void Int1() interrupt 2 using 0{ //select/start键

  80. if(state>=1&&state<=3){
  81.   TR0=0;
  82.   hour=min=sec=0;
  83.   timer0_init();
  84.   }
  85.     switch(state){
  86.        case(1):day+=100;
  87.                check_b++;
  88.                break;
  89.        case(2):day+=10;
  90.                check_s++;
  91.                break;
  92.        case(3):day++;
  93.                check_g++;
  94.                break;
  95.        default:break;      
  96.      }

  97.   if(check_b>9)               //计时范围限制
  98.     day-=1000;
  99.   if(check_s>9){      
  100.     day-=100;
  101.   }
  102.   if(check_g>9){
  103.     day-=10;
  104.   }

  105. }
  106. void delay(int time){
  107.   int i,j;
  108.   for(i=0;i<=time;i++){
  109.     for(j=0;j<=10;j++);
  110.   }
  111. }
  112. void trans_led(int a,int b,int c,int d){
  113.                            //显示秒
  114.   P2=0xFE;
  115.   P1=table[sec%10];
  116.   delay(20);
  117.   P2=0xFF;

  118.   P2=0xFD;              
  119.   P1=table[sec/10];
  120.   delay(20);
  121.   P2=0xFF;

  122.                           //显示分
  123.   P2=0xFB;
  124.   P1=table[min%10];
  125.   delay(20);
  126.   P2=0xFF;

  127.   P2=0xF7;              
  128.   P1=table[min/10];
  129.   delay(20);
  130.   P2=0xFF;


  131.                          //显示时
  132.   P2=0xEF;
  133.   P1=table[hour%10];
  134.   delay(20);
  135.   P2=0xFF;

  136.   P2=0xDF;              
  137.   P1=table[hour/10];
  138.   delay(20);



  139.                         //显示天
  140.   delay(a);         
  141.   P2=0xFF;            
  142.   P30=0;
  143.   check_b=day/100;         
  144.   P1=table[check_b];
  145.   delay(b);
  146.   P2=0xFF;


  147.   P30=1;
  148.   P2=0x7F;
  149.   check_s=(day/10)%10;
  150.   P1=table[check_s];
  151.   delay(c);
  152.   P2=0xFF;

  153.   P2=0xBF;
  154.   check_g=day%10;
  155.   P1=table[check_g];
  156.   delay(d);
  157.   P2=0xFF;



  158. }
复制代码
全部资料51hei下载地址:

倒计时牌.zip (540.18 KB, 下载次数: 135)


评分

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

查看全部评分

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

使用道具 举报

沙发
ID:97678 发表于 2020-4-26 21:12 | 只看该作者
值得学习的好东西!!!
回复

使用道具 举报

板凳
ID:772518 发表于 2020-6-8 10:16 | 只看该作者
膜拜大神
回复

使用道具 举报

地板
ID:243874 发表于 2020-10-19 11:33 | 只看该作者
大神,我只要时分秒的倒计时,怎么改
回复

使用道具 举报

5#
ID:196383 发表于 2023-9-1 14:47 | 只看该作者
值得学习的好东西!!!
回复

使用道具 举报

6#
ID:1119063 发表于 2024-5-21 11:11 | 只看该作者
值得学习的好东西!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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