找回密码
 立即注册

QQ登录

只需一步,快速开始

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

【求助】STC12C5A60S2如何通过定时器读取DH11并且显示到数码管上?

[复制链接]
跳转到指定楼层
楼主
ID:116532 发表于 2016-4-25 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STC12C5A60S2
74HC164
三位数码管
DH11温湿度传感器

1、用STC12C5A60S2接74HC164驱动3位数码管并键盘扫描。
     开始用的是软件延迟,搞定。就是要求扫描时间不能过长,
     否则会出现数码管过暗或者不能显示的情况。
2、后来要接一片DH11读温湿度数据,然后输出到数码管上。
     开始时也是用软件延时,搞定。(曾经用嘴吹DH11达到99湿度,)
     第二天发现数据不稳,然后开始调试。
3、然后发现采集DH11数据时间过长和74HC164扫描数码管有冲突
     单片机和DH11通讯过程时间过长,
     而74HC164是无锁存寄存器的需要快速扫描,
     把这两个放到一个while里面的话会导致数码管只能显示出最后一位,前两位因为延时过长而太暗。
4、想把扫描数码管放到定时器T0里面,而DH11放到main里面,结果发现因为DH11时间过长,
     定时器中断里面只能读取到第一次数据;而如果定时器时间足够长的话能够正确读取main里面修改的数据。
uchar dh11;
void get_dh11(void)
{...}//启动DH11,把温湿度数据读到dh11里面(实际应该是5个数据)
void display (dh11)
{...}//把数据显示到数码管上,通过74HC164
void timer0int () interrupt 1
{//中断
    display(dh11);
}
void Timer0Init ()
{...}//定时器初始化
main(void)
{
    EA=1;
    ET0=1;
    while(1)
    {
        get_dh11();
    }
}//开启定时器前dh11无数据,这样的话中断里面读取不到数据

main(void)
{
    get_dh11();
    Delay30ms();
    EA=1;
    ET0=1;
    while(1)
    {
        get_dh11();
        Delay1000ms();//DH11要求两次采集间隔至少1秒
    }
}//开启定时器前启动一次数据采集,dh11有数据,这样的话中断里面读取的数据为第一次采集到的数据
//但是while里面再次采集到的新数据定时器中断里面读取不到,始终为第一次的数据,除非重新上电。

为了验证定时器中断读取数据更新问题,采用了一个简单的办法:直接在main里面更新数据让定时器中断读取

main(void)
{
    dh11=0;//直接赋值
    Delay30ms();
    EA=1;
    ET0=1;
    while(1)
    {
        if(dh11++>10)
               dh11=0;//直接修改
        Delay1000ms();//DH11要求两次采集间隔至少1秒
    }
}//这种情况下只有定时器中断时间足够大才能争取读取数据更新,比如几十到几百ms
//如果定时器中断时间太短(几十us)则无法读取数据更新

猜测是因为定时器中断打断了数据更新的过程,使得数据无法正确更新。

看网上有关用STC12C5A60S2读取DH11的例子,里面一开始也是想用定时器中断显示数据,结果最终被注释掉了。
看来遇到了同样的问题。
见此贴 http://www.51hei.com/bbs/dpj-38986-1.html
其他有关用定时器采集DHT11数据并显示的几乎没有搜到。








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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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