标题: 12M,89C52单片机,1602显示,定时器倒计时两种时间单位问题 [打印本页]

作者: 许许许    时间: 2020-4-5 16:42
标题: 12M,89C52单片机,1602显示,定时器倒计时两种时间单位问题
请问各位大神,我用一个定时器1,按键设置倒计时一段时间,时间单位是秒,时间到继电器断开;继电器一断马上倒计时另一段时间,时间单位是豪秒,时间到继电器吸合。请问样子思路可行吗,我写了定时器1程序,但是仿真只会倒计时一段时间,后面不会倒计时了,我是初学者,写的程序很简单,请单片机大神帮帮忙
/*------------------------------------------------
                 定时器1中断子程序
------------------------------------------------*/
void Timer1_isr(void) interrupt 3
{
  TH1=(65536-50000)/256;//定时器装初值
  TL0=(65536-50000)%256;
          count++; //中断次数累加
        if(count==20) //20次50毫秒为1秒
        {
                count=0;
                Pon--;                // 单片机工作默认继电器闭合,Pon上电时间倒计时,单位秒
                write_twodate(9,Pon);        //变化送到LCD显示
        }
        if(Pon==0)
        {
         JDQ=0;                  //继电器断开
         count++;                   //继电器断电后,Poff掉电时间倒计时
        }
        if(count==1)         //1次为1毫秒,这里是错误的,实际为50ms,还没想到办法转换不同单位
        {
                count=0;
                Poff--;          //Poff掉电时间倒计时,单位毫秒
                write_onedate(10,Poff);        //变化送到LCD显示
        }
         if(Poff==0)
         {
            JDQ=1;                //继电器吸合
            TR1=0;      //定时器1关闭,即倒计时关闭
                TR0=1;           // 定时器0开启,即按键扫描开启
                }
}
作者: 许许许    时间: 2020-4-5 16:50
而且前一段时间会不停循环倒计时,改了之后还是一样
作者: wulin    时间: 2020-4-6 06:20
以两种时间单位(s/ms)倒计时没有任何技术问题,不过以1ms周期刷新LCD不现实。就算LCD能完成但肉眼根本无法分辨。给你改为1ms中断周期并增加一个标志位allow用于区分两种时间单位的倒计时,至于LCD显示ms问题只能呵呵了。
void Timer1_isr(void) interrupt 3
{
        TH1=(65536-1000)/256;//定时器装初值
        TL0=(65536-1000)%256;
        if(allow==0)
        {
                count++; //中断次数累加
                if(count==1000) //1000次1毫秒为1秒
                {
                        count=0;
                        Pon--;                // 单片机工作默认继电器闭合,Pon上电时间倒计时,单位秒
                        write_twodate(9,Pon);        //变化送到LCD显示
                        if(Pon==0)
                        {
                                JDQ=0;                  //继电器断开
                                allow=1;
                        //        count++;                   //继电器断电后,Poff掉电时间倒计时
                        }
                }
        }
        else
        {       
//                if(count==1)         //1次为1毫秒,这里是错误的,实际为50ms,还没想到办法转换不同单位
//                {
//                        count=0;
                Poff--;          //Poff掉电时间倒计时,单位毫秒
                write_onedate(10,Poff);        //变化送到LCD显示
//                }
                if(Poff==0)
                {
                        JDQ=1;                //继电器吸合
                        TR1=0;      //定时器1关闭,即倒计时关闭
                        TR0=1;           // 定时器0开启,即按键扫描开启

                        allow=0;//到此一轮倒计时结束,等待定时器1再次开启
                }
        }
}
作者: 许许许    时间: 2020-4-6 15:52
wulin 发表于 2020-4-6 06:20
以两种时间单位(s/ms)倒计时没有任何技术问题,不过以1ms周期刷新LCD不现实。就算LCD能完成但肉眼根本无 ...

多谢老哥,有个问题,我按你的设置,但是倒计时跑得很快,差不多正常一秒十分之一,晶振设置确实是12M,仿真跑得很快
作者: 许许许    时间: 2020-4-6 20:23
许许许 发表于 2020-4-6 15:52
多谢老哥,有个问题,我按你的设置,但是倒计时跑得很快,差不多正常一秒十分之一,晶振设置确实是12M, ...

解决了




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1