如何利用STC89C52RC去实现一种99秒倒计时器的设计呢

控制/MCU

1813人已加入

描述

设计要求:通过STC89C52RC单片机的定时器0实现精确定时,并通过LCD1602实现倒计时时间的显示功能,初始值为99秒,并且具有暂停和复位功能。,倒计时时间设置功能。

倒计时器系统电路:通过LCD1602显示倒计时初始值和当前计时值,并且可以通过set键启动倒计时,通过reset复位停止倒计时。并且在停止模式时可以通过plus和minus键进行倒计时初值的加减操作,在运行模式无法调整倒计时的初始值。。

LCD1602

系统的软件设计:上电首先初始化单片机,主要包括定时器的初始化、倒计时初始值的初始化、运行状态初始化。整个系统运行分为2个模式:停止模式、倒计时运行模式。主程序流程图:

LCD1602

主要代码

主函数:

void main()
{

    InitLcd1602();
    LcdShowStr(0, 0, "Current : 99 S");
    LcdShowStr(0, 1, "Initial : 99 S");
    
    timer_inial();

    while(1)
    {
        if(0==run_mode){
            time_set();
        
        }else{
            second_cal_show();    
        
        }
         start();
         stop();
        
    }
}void main()
{

    InitLcd1602();
    LcdShowStr(0, 0, "Current : 99 S");
    LcdShowStr(0, 1, "Initial : 99 S");
    
    timer_inial();

    while(1)
    {
        if(0==run_mode){
            time_set();
        
        }else{
            second_cal_show();    
        
        }
         start();
         stop();
        
    }
}
 

运行模式代码:

void second_cal_show()
{
  if(TF0==1)
        {
            TF0=0;
          TH0=0XB8;
            TL0=0X00;
            time_count++;
            if(time_count>=50)//50次一秒
            {
              time_count=0;
                time_S--;
                if(0==time_S) {TR0=0;FM=0;run_mode=0;}
                sprintf(Disp_Buffer,"%d S ",time_S);
            LcdShowStr(10, 0, Disp_Buffer);    
            }
            
        }
}
 

停止模式代码:

void time_set()
{
    if(0==key_plus)
         {
             delay(1200);//10ms消抖
             if(0==key_plus)//再次检测按键是否按下
             {
                    //while(!key_plus);//等待按键释放
                  
                
                  ini_value++;
                  sprintf(Disp_Buffer,"%d S ",ini_value);
                  LcdShowStr(10, 1, Disp_Buffer);
                 LcdShowStr(10, 0, Disp_Buffer);
                
             }
        
         }else if(0==key_minus)
         {
             delay(1200);//10ms消抖
             if(0==key_minus)//再次检测按键是否按下
             {
                    //while(!key_minus);//等待按键释放
                 ini_value--;
                 sprintf(Disp_Buffer,"%d S ",ini_value);
                 LcdShowStr(10, 1, Disp_Buffer);
                 LcdShowStr(10, 0, Disp_Buffer);
             }
        
         }
                 
}



审核编辑:刘清

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分