只截了關(guān)鍵部分代碼出來,其他代碼都仿真過,沒有問題,當加上溫控函數(shù)后,就不行了,一仿真就只執(zhí)行第一條語句,即高速檔,我是初學(xué)者,不清楚是自己代碼寫錯了還是怎樣,自己看了好久也看不出個所以然,求大神看看,最好順著這個代碼幫我把這個溫控函數(shù)的代碼寫出來,謝謝,重賞
單片機源程序如下:
- #include <reg52.h> //此文件中定義了單片機的一些特殊功能寄存器
- #include "temp.h"
- sbit LSA=P2^2;
- sbit LSB=P2^3;
- sbit LSC=P2^4;
- int weidu;
- uchar smgwei[3];
- uchar code smgduan[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
- void DigDisplay();
- void smgdelay(uint x);
- * 溫度讀取處理轉(zhuǎn)換函數(shù) */ (數(shù)碼管上溫度顯示正常,證明這個函數(shù)沒毛病)
- int datapros(int temp)
- {
- float tp,x;
- if(temp< 0) //當溫度值為負數(shù)
- {
- smgwei[0] = 0x40; // -
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*10+0.5;
- x=tp*0.0625+0.5;
- }
- else
- {
- smgwei[0] = 0x00;
- tp=temp;
- temp=tp*0.0625*10+0.5;
- x=tp*0.0625+0.5;
- }
- smgwei[1] = smgduan[temp % 1000 / 100 ];
- smgwei[2] = smgduan[temp % 100 / 10] | 0x80;
- smgwei[3] = smgduan[temp % 10];
- return x;
- }
- /* 溫控自動檔 */
- void motorauto()
- {
- weidu=datapros(Ds18b20ReadTemp()); //懷疑這句出錯
- if(weidu>=30) //仿真的時候無論怎么調(diào)溫度,都是執(zhí)行高速檔
- { //當把這里的條件調(diào)大 (如:weidu>=300)時,就只執(zhí)行低速檔
- third(); //高速檔
- }
- else
- {
- first(); //低速檔
- }
- }
- /* 數(shù)碼管顯示函數(shù) */ (數(shù)碼管上可以正常顯示溫度,這個函數(shù)也沒問題)
- void DigDisplay()
- {
- uchar i;
- for(i=0;i<4;i++)
- {
- P0=0x00;
- switch(i) //位選,選擇點亮的數(shù)碼管,
- {
- 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位
- }
- P0=smgwei[3-i]; //發(fā)送數(shù)據(jù)
- msdelay(10); //間隔一段時間掃描
- P0=0x00; //消隱
- }
- }
- /* 主函數(shù) */
- void main()
- {
- while(1)
- motorauto();
- }
- /* while(1) 數(shù)碼管上顯示溫度,這里仿真過,沒有問題
- {
- datapros(Ds18b20ReadTemp());
- DigDisplay();
- }*/
|