|
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数据并显示的几乎没有搜到。
|
|