找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机定时倒计时提醒制作 附代码

[复制链接]
跳转到指定楼层
楼主
ID:678280 发表于 2020-11-7 23:07 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
学了一段时间单片机,这两天做了个实用电路,最长99分钟定时倒计时提醒器。缺陷是电路开始工作后,一分钟减一个数再无其它动作。给启动按钮加了声音,否则电路是否已经启动都看不出来。时间到有响声提醒。


上面两个按钮调节十分与分,每次加十分钟和加一分钟。
晶振下面是复位按钮,右下角是启动按钮。
下面压缩包中有Proteus仿真文件与C代码。

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


单片机源程序如下:
  1. #include<reg52.h>  //自制最长99分钟定时倒计时提醒器 2020-11-06
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit gewei0=P2^6;   //允许个位显示。
  5. sbit shiwei0=P2^7;  //允许十位显示。
  6. sbit key1=P2^5;  //键1,每按加10分钟。
  7. sbit key2=P2^4;  //键2,每按加1分钟。
  8. sbit key3=P2^3;  //键3,开倒计时或暂停。
  9. sbit beep=P2^2;
  10. uchar k;
  11. unsigned int s;
  12. void delayms(uchar);
  13. void delay(uint z);
  14. void keyscan();
  15. void display(uchar);
  16. void init();
  17. void xiang1();
  18. void xiang2();
  19. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  20. void main()
  21. { init();     //调“初始化”。
  22.   while(1)
  23.   { keyscan();  //调“监测按键”。
  24.     display(k); //调“显示”。
  25. }}

  26. void keyscan() //监测按键。
  27. { if(key2==0)
  28.   { delayms(26);
  29.     if(key2==0)
  30.     { k++;
  31.       if(k>=99) //k==99与中断那里一致。
  32.          k=0;
  33.       while(!key2); //抬起按键key2时,显示出k+2的结果。
  34.     }
  35.   }

  36.   if(key1==0)
  37.   { delayms(26);
  38.     if(key1==0)
  39.     { k=k+10;
  40.       if(k>=99) //k==99与中断那里一致。
  41.          k=0;
  42.       while(!key1);
  43.     }
  44.   }
  45.   if(key3==0)
  46.   { delayms(26);
  47.     if(key3==0)
  48.     {   xiang1(); //启动“倒计时”提示。
  49.       delayms(246);
  50.       TR0=~TR0;
  51.       while(!key3);
  52. }}}

  53. void delayms(uchar z) //延时。
  54. { uchar i,j;
  55.   for(i=z;i>0;i--)
  56.     for(j=110;j>0;j--); }

  57. void delay(uint z)
  58. {  while(z--); }

  59. void display(uchar k) //显示。
  60. { uchar shi,ge;
  61.   shi=k/10;
  62.   ge =k%10;

  63.   gewei0=0;
  64.   P0=table[ge];
  65.   delayms(21);
  66.   gewei0=1;

  67.   shiwei0=0;
  68.   P0=table[shi];
  69.   delayms(21);
  70.   shiwei0=1;
  71. }

  72. void init() //初始化。设置中断与定时器的值。
  73. { TMOD=0x01;
  74.   TH0=(65536-50000)/256;  //晶振12MHz,定时50ms。
  75.   TL0=(65536-50000)%256;
  76.   EA=1;
  77.   ET0=1;
  78. }

  79. void xiang1() //计时开始提示音。
  80. {
  81.   uchar q;
  82.   for(q=0;q<100;q++)
  83.   {
  84.     beep=0;
  85.     delayms(6);
  86.     beep=1;
  87.     delayms(4);
  88.   }
  89.     delayms(64);
  90. }

  91. void xiang2() //计时结束提示音--嘟嘟。
  92. {
  93.   unsigned int m;
  94.   uchar n;
  95.   for(n=0;n<2;n++)
  96.   {
  97.     for(n=0;n<111;n++)
  98.     {
  99.       beep=0;
  100.       delay(107);
  101.       beep=1;
  102.       delay(107);
  103.     }

  104.    for(m=0;m<3456;m++);
  105.     for(n=0;n<111;n++)
  106.     {
  107.       beep=0;
  108.       delay(107);
  109.       beep=1;
  110.       delay(107);
  111.     }
  112.    for(m=0;m<33333;m++);
  113.   }
  114. ……………………

  115. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
仿真文件与C代码.rar (17.21 KB, 下载次数: 50)

评分

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

查看全部评分

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

使用道具 举报

沙发
ID:97678 发表于 2020-11-8 09:19 | 只看该作者
可以把时间修改为999分钟吗?
回复

使用道具 举报

板凳
ID:678280 发表于 2020-11-8 11:09 | 只看该作者
jovew 发表于 2020-11-8 09:19
可以把时间修改为999分钟吗?

可以改,但首先得改电路部分。
回复

使用道具 举报

地板
ID:135950 发表于 2020-11-8 11:41 | 只看该作者
程序和电路可以再优化一下的。而且如果要做最好做成成品电路吧,这种做好后要拿来用又太乱,不用又浪费。。把电路板做小焊接好就可以了。
回复

使用道具 举报

5#
ID:678280 发表于 2020-11-8 16:40 | 只看该作者
提示音代码有误,修改如下:

void xiang2() //计时结束提示音--嘟嘟。
{
  unsigned int m;
  uchar n,i;
  for(i=2;i>0;i--)
  {
    for(n=123;n>0;n--)
    {
      beep=0;
      delay(88);
      beep=1;
      delay(88);
    }

   for(m=3456;m>0;m--);
    for(n=123;n>0;n--)
    {
      beep=0;
      delay(88);
      beep=1;
      delay(88);
    }
   for(m=56789;m>0;m--);
  }
}
回复

使用道具 举报

6#
ID:678280 发表于 2020-11-8 16:50 | 只看该作者
wasen 发表于 2020-11-8 11:41
程序和电路可以再优化一下的。而且如果要做最好做成成品电路吧,这种做好后要拿来用又太乱,不用又浪费。。 ...

想做出个恰当漂亮的面板太难,并且飞线太多既不好看出问题时又不方便检查。
回复

使用道具 举报

7#
ID:678280 发表于 2020-11-26 11:13 | 只看该作者
在中断中添加了可以实现秒指示作用的代码。

void time0()interrupt 1  //0中断,中断序号1。
{ uint zxc=65432;
  TH0=0xb1; //晶振12MHz,定时20ms。
  TL0=0xe0;
  s++;
  if(m==25)  //作秒指示。
  {
    m=0;
    led=~led;}
  m++;  //uchar m; 定义为全局变量。
  if(s==3000) //3000×20ms=60000ms÷1000ms=60s(1分钟)
  { s=0;   //归零。等待下个1分钟。
    k--; } //倒计时,减1分钟。

  if(k<=0) //如果到0,发声,关闭中断。
  {
    k=0;
    xiang2();
    TR0=0;   //预定时间到,关中断0,停止。
}}

回复

使用道具 举报

8#
ID:849826 发表于 2021-7-14 10:20 来自手机 | 只看该作者
再加个到时间输出一个端口,吸合继电器或者释放继电器
回复

使用道具 举报

9#
ID:849826 发表于 2021-7-17 16:12 来自手机 | 只看该作者
我把继电器输出端口p3^4=1写在TR0=0;后面的下一句,应该是应该是提示音全部结束,再关断继电器。可是现在是继电器关断后,后面还响两声,应该怎么改?
回复

使用道具 举报

10#
ID:849826 发表于 2021-7-17 16:12 来自手机 | 只看该作者
要求,倒计时声音全部响完,再关断继电器
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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