|
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.zg4o1577.cn/bbs/dpj-38986-1.html
其他有關用定時器采集DHT11數據并顯示的幾乎沒有搜到。
|
|