![]() |
發布時間: 2018-4-7 12:20
正文摘要:我先來說問題:現在設計一個溫度報警器,我現在溫度顯示和調整溫度方面已經設計的沒有問題了,就是聲光報警的問題 比如要求溫度超過20度,燈閃爍,聲音也斷續發聲,但是我這部分程序就是寫不對,用中斷寫,結果試的 ... |
頂一下還有知道的嗎,之前樓層回復的不是很好,沒有解決問題,請問誰能在看一下這個問題 |
你用數碼管做動態顯示 本身靠的是人眼的視覺暫留現象。單片機不停的處理動態顯示 再處理其它任務時 必會影響動態顯示的時間 導致數碼管閃爍時間延遲。 你把其它程序放中斷里 運行時間長的話 一樣會影響主程序的動態顯示時間。 如果你非要用數碼管顯示的話 可以用最小系統,C51的話用Small RTOS 。也可以用74H595驅動數碼管就不是動態掃描了。 不影響主程序做其它事。 也可以用1602等液晶做顯示都不會影響主程序做其它事。 如果你軟件不想改變 那么你只有把閃爍的LED和蜂鳴器做成獨立的硬件組件。 也就是一個LED組件通電就會每隔1秒閃一次,同時蜂鳴器用有源蜂鳴器,通電就響。斷電就停的那種。 |
參與人數 1 | 黑幣 +10 | 收起 理由 |
---|---|---|
![]() | + 10 | 很給力! |
還有人知道如何做嗎,樓上說的不太對 |
en,聲電控制需要很 |
QIANLILI 發表于 2018-4-7 15:38 您好,程序我看了,我一開始確實也沒有用中斷,就是在主函數里和你寫的一樣 但是目前來看你改的程序,發生報警的時候燈光和聲音閃爍太快了啊,需要亮一下閃一下,0.5s這樣間斷的呀,但是你現在的這個實在是太快了,我一開始也是這樣的問題,后來我就加delay函數,你看我是這么加的 BEEP=~BEEP; LED=~LED ; delay(5000);,在這里加了一個delay函數,但是不行啊,這樣的話運行仿真的時候,屏幕就一直閃,數字也顯示的不對了,這是怎么回事,怎么改才能達到目的呢? |
我把你的程序修改了一下。 取消了中斷。 把溫度判斷程序直接放在主程序循環里。 仿真測試下來沒問題。 另外 我發現你仿真里的單片機設定的晶振是6MHZ的 如果你實際用的晶振是11.0592或12MHZ的 DS18B20的溫度傳感器的傳輸延時要相應改一下 否則會讀不出DS18B20的溫度值。 這個你在仿真時就可以看出來。 /************************************************************************************** * DS18B20溫度傳感器實驗 * 實現現象: 具體接線操作請看視頻。 下載程序后,在溫度傳感器接口處,按照絲印方向插好溫度傳感器,數碼管就會顯示 檢測的溫度值, 注意事項: ***************************************************************************************/ #include "reg52.h" //此文件中定義了單片機的一些特殊功能寄存器 #include"temp.h" typedef unsigned int u16; //對數據類型進行聲明定義 typedef unsigned char u8; sbit LSA=P2^2; sbit LSB=P2^3; sbit LSC=P2^4; sbit LED=P1^7; sbit BEEP=P2^7; bit flash=0; bit setup=0; int cn=0; char num=0; u8 DisplayData[8]; u8 code smgduan[10]= { 0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f } ; /******************************************************************************* * 函 數 名 : delay * 函數功能 : 延時函數,i=1時,大約延時10us *******************************************************************************/ void delay(u16 i) { while(i--); } /******************************************************************************* * 函 數 名 : datapros() * 函數功能 : 溫度讀取處理轉換函數 * 輸 入 : temp * 輸 出 : 無 *******************************************************************************/ void datapros(int temp) { float tp; if(temp< 0) //當溫度值為負數 { DisplayData[0] = 0x40; // - //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼 temp=temp-1; temp=~temp; tp=temp; temp=tp*0.0625*100+0.5; //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就 //算加上0.5,還是在小數點后面。 } else { DisplayData[0] = 0x00; tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量 //如果溫度是正的那么,那么正數的原碼就是補碼它本身 temp=tp*0.0625*100+0.5; //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點 //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就 //算加上0.5,還是在小數點后面。 } DisplayData[1] = smgduan[temp / 10000]; DisplayData[2] = smgduan[temp % 10000 / 1000]; DisplayData[3] = smgduan[temp % 1000 / 100] | 0x80; DisplayData[4] = smgduan[temp % 100 / 10]; DisplayData[5] = smgduan[100]; } /******************************************************************************* * 函數名 :DigDisplay() * 函數功能 :數碼管顯示函數 * 輸入 : 無 * 輸出 : 無 *******************************************************************************/ void DigDisplay() { u8 i; for(i=0;i<6;i++) { switch(i) //位選,選擇點亮的數碼管, { case(0): LSA=0;LSB=0;LSC=0; break;//顯示第0位 case(1): LSA=1;LSB=0;LSC=0; break;//顯示第1位 case(2): LSA=0;LSB=1;LSC=0; break;//顯示第2位 case(3): LSA=1;LSB=1;LSC=0; break;//顯示第3位 case(4): LSA=0;LSB=0;LSC=1; break;//顯示第4位 case(5): LSA=1;LSB=0;LSC=1; break;//顯示第5位 } P0=DisplayData[ i];//發送數據 delay(100); //間隔一段時間掃描 P0=0x00;//消隱 } } /******************************************************************************* * 函 數 名 : main * 函數功能 : 主函數 * 輸 入 : 無 * 輸 出 : 無 *******************************************************************************/ void main() { while(1) { datapros(Ds18b20ReadTemp()); //數據處理函數 DigDisplay();//數碼管顯示函數 if(DisplayData[2]==0x5b) //你這種寫法這里只能判斷20度到29度 30度到39 需要寫成 if(DisplayData[2]==0x5b || DisplayData[2]==0x4f) 依次類推 //最好改成判斷未轉碼的數值。也就是TEMP值。 視你具體要求判斷的溫度范圍。 { BEEP=~BEEP; LED=~LED ; } else { BEEP=1; LED=1; } } } |
求幫助啊在線等 |
頂!! |