找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 689|回复: 2
收起左侧

DHT11和单片机定时器之间的冲突问题

[复制链接]
ID:1050289 发表于 2023-3-7 00:01 | 显示全部楼层 |阅读模式
各位大佬你们好,我想问一下单片机STC89C52单片机使用DHT11时与定时器发生冲突怎么办,DHT11要是想实现检测湿度,就得按照下面的代码,而定时器1的作用是做倒计时用的。要想读DHT11的就必须先关定时器再开定时器,但是倒计时就不能通过按键按下就开始(用一个按键开始倒计时)。现在的问题就是一插电,湿度显示的同时也就直接开始倒计时,按键没有作用,我该怎么解决这问题

                                        //********************************湿度检测*******************************//
                                       
                                                        DHT11_delay_ms(100);  
                                                        TR0 = 0;
                                                        TR1 = 0;
                                                        
                                                        DHT11_receive();
                                                        for(i=0;i<7;i++)
                                                                {
                                                                        if(i<=2)
                                                                        {
                                                                                sidu[ i]= rec_dat[ i]; //读取湿度
                                                                        }  
                                                                }
                                                        LCD_DispOneChar(5, 1, 'H');
                                                        LCD_DispOneChar(6, 1, ':');
                                                        LCD_DispStr(7, 1, sidu);
                                                        TR0 = 1;

                                                        TR1 = 1;


//************************************定时器1-用于实现倒计时功能***********************//
void T1_init()//定时器1初始化
{
          TMOD |= 0x10;                        //0001  0000//设置方式1是16位的。CT=0是定时,CT = 1是记数
                TH1 = 15536/256;        //12MHz 的晶振,那么一个周期就是 1 us,所以需要计数 50ms / 1us = 50000
                TL1 = 15536%256;        //方式1
                TR1 = 0;
                ET1 = 1;
                EA  = 1;
}
void t1_irs(void)interrupt 3
{
        TH1 = 15536/256;                //重装初值
        TL1 = 15536%256;
        
        
        
        if(++con == 20)                        //如果con自++到20 就1000ms ,最大定时时间=65536us=65.536ms。中断20次就是1秒。
        {        
                con = 0;
                miao--;
                        if(miao<0)
                        {
                                miao=59;
                          fen--;
                        }
                else if(fen<0)
                {
                          fen=0;                 
                }               
        }
}

回复

使用道具 举报

ID:213173 发表于 2023-3-7 07:49 | 显示全部楼层
//********************************湿度检测*******************************//

//        DHT11_delay_ms(100);  
//        TR0 = 0;
//        TR1 = 0;        //定时器不可以停止
        if(Time>=2)//代替DHT11_delay_ms(100)
        {
                Time=0;
                DHT11_receive();
                for(i=0;i<7;i++)
                {
                        if(i<=2)
                        {
                                sidu[ i]= rec_dat[ i]; //读取湿度
                        }  
                }
                LCD_DispOneChar(5, 1, 'H');
                LCD_DispOneChar(6, 1, ':');
                LCD_DispStr(7, 1, sidu);
//                TR0 = 1;       
//                TR1 = 1;
        }

//************************************定时器1-用于实现倒计时功能***********************//
void T1_init()//定时器1初始化
{
        TMOD |= 0x10;                        //0001  0000//设置方式1是16位的。CT=0是定时,CT = 1是记数
        TH1 = 15536/256;        //12MHz 的晶振,那么一个周期就是 1 us,所以需要计数 50ms / 1us = 50000
        TL1 = 15536%256;        //方式1
        TR1 = 0;
        ET1 = 1;
        EA  = 1;
}
void t1_irs(void)interrupt 3
{
        TH1 = 15536/256;                //重装初值
        TL1 = 15536%256;
       
        Time++;
        if(start==1)//启动倒计时
        {
                if(++con == 20)      //如果con自++到20 就1000ms ,最大定时时间=65536us=65.536ms。中断20次就是1秒。
                {        
                        con = 0;
                        miao--;
                        if(miao<0)
                        {
                                miao=59;
                                fen--;
                        }
                        else if(fen<0)
                        {
                                fen=0;                 
                        }               
                        if(miao==0 && fen==0)
                        {
                                start=0; //结束倒计时               
                        }
                }
        }
}
回复

使用道具 举报

ID:415064 发表于 2023-3-7 13:16 | 显示全部楼层
DHT11_delay_ms(100);  
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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