找回密码
 立即注册

QQ登录

只需一步,快速开始

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

在单片机倒计时器程序里面再加一个按键循环开关?

[复制链接]
跳转到指定楼层
楼主
ID:849826 发表于 2021-7-21 10:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
倒计时程序

#include<reg52.h>  //最长99分钟定时倒计时提醒器
                       //2021-7-14        中微电子
#define uchar unsigned char
#define uint unsigned int
sbit gewei0=P1^6;   //允许个位显示。
sbit shiwei0=P1^7;  //允许十位显示。
sbit key1=P1^2;  //键1,每按加10分钟。
sbit key2=P1^1;  //键2,每按加1分钟。
sbit key3=P1^0;  //键3,开倒计时或暂停。
sbit beep=P1^3;         //蜂鸣器
sbit  led=P1^4;          //秒指示灯
sbit  jdq=P3^4;        //继电器        
uchar k;
unsigned int s,m;
void delayms(uchar);
void delay(uint z);
void keyscan();
void display(uchar);
void init();
void xiang1();
void xiang2();
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};


void main()
{ init();     //调“初始化”。
  while(1)
  { keyscan();  //调“监测按键”。
    display(k); //调“显示”。
}}


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


  if(key1==0)
  { delayms(26);
    if(key1==0)
    { k=k+10;
      if(k>=99) //k==99与中断那里一致。
         k=0;
      while(!key1);
    }
  }
  if(key3==0)
  { delayms(26);
    if(key3==0)
    {         
          xiang1(); //启动“倒计时”提示。
      delayms(246);
      TR0=~TR0;
           jdq=~jdq;  //继电器状态 随启动停止按键翻转
      while(!key3);
         
}}}


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


void delay(uint z)
{  while(z--); }


void display(uchar k) //显示。
{ uchar shi,ge;
  shi=k/10;
  ge =k%10;


  gewei0=0;
  P2=table[ge];
  delayms(21);
  gewei0=1;


  shiwei0=0;
  P2=table[shi];
  delayms(21);
  shiwei0=1;
}


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


void xiang1() //计时开始提示音。
{
  uchar q;
  for(q=0;q<100;q++)
  {
    beep=0;
    delayms(6);
    beep=1;
    delayms(4);
  }
    delayms(64);
}




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


   for(m=3456;m>0;m--);
    for(n=123;n>0;n--)
    {
      beep=0;
      delay(90);
      beep=1;
      delay(90);
                  
    }


         
   for(m=56789;m>0;m--);
        
  }

}










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,停止。
        jdq=1;         // 继电器释放
}}

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

使用道具 举报

沙发
ID:849826 发表于 2021-7-21 10:46 来自手机 | 只看该作者
回复

使用道具 举报

板凳
ID:849826 发表于 2021-7-21 10:48 来自手机 | 只看该作者
把链接里面按键循环开关加倒,计时器里面,模拟的时候风扇一个按键循环控制三个档位,和倒计时功能,谁帮我把按键循环程序,加倒计时器里面
回复

使用道具 举报

地板
ID:955239 发表于 2021-7-21 11:50 | 只看该作者
只提供思路参考
按键循环可以使用“状态机”来实现。比如第一次按下,按键做出第一次按的响应,同时按键状态更改为下一个状态。根据“状态机”状态来响应同一个按键的不同功能。
回复

使用道具 举报

5#
ID:161164 发表于 2021-7-21 16:04 | 只看该作者
6313 发表于 2021-7-21 10:48
把链接里面按键循环开关加倒,计时器里面,模拟的时候风扇一个按键循环控制三个档位,和倒计时功能,谁帮我 ...

楼主的鱼文,能力太可怕了
我是说楼主的,鱼文能力太,可怕了

楼主的代码中已经有三个按键
现在是要再加一个按键去实现循环控制三个档位吗?
回复

使用道具 举报

6#
ID:849826 发表于 2021-7-21 20:38 | 只看该作者
lkc8210 发表于 2021-7-21 16:04
楼主的鱼文,能力太可怕了
我是说楼主的,鱼文能力太,可怕了

是你的理解能力太差
回复

使用道具 举报

7#
ID:123289 发表于 2021-7-22 09:04 | 只看该作者
的确,估计我的理解能力也差。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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