哪位大俠幫幫忙吧,用鍵盤設定的上下限溫度值沒用 為什么啊 這是代碼
#include <reg52.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int sbit ds=P2^2; //溫度傳感器信號線 sbit dula=P2^6; //數碼管段選線 sbit wela=P2^7; //數碼管位選線 sbit beep=P2^3; //蜂鳴器 sbit key1=P3^4; sbit key2=P3^5; sbit key3=P3^6;
uint temp; float f_temp; uchar shi,ge,shu,t0,flag,num1;
sbit led0=P1^0; sbit led1=P1^1; sbit led2=P1^2; sbit led3=P1^3;
unsigned char code table[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0xbf,0x86, 0xdb,0xcf,0xe6,0xed, 0xfd,0x87,0xff,0xef}; //不帶小數點的編碼
void delay(uint z)//延時函數 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }
void dsreset(void) //18B20復位,初始化函數 { uint i; ds=0; i=103; while(i>0)i--; ds=1; i=4; while(i>0)i--; }
bit tempreadbit(void) //讀1位函數 { uint i; bit dat; ds=0;i++; //i++ 起延時作用 ds=1;i++;i++; dat=ds; i=8;while(i>0)i--; return (dat); }
uchar tempread(void) //讀1個字節 { uchar i,j,dat; dat=0; for(i=1;i<=8;i++) { j=tempreadbit(); dat=(j<<7)|(dat>>1); //讀出的數據最低位在最前面,這樣剛好一個字節在DAT里 } return(dat); }
void tempwritebyte(uchar dat) //向18B20寫一個字節數據 { uint i; uchar j; bit testb; for(j=1;j<=8;j++) { testb=dat&0x01; dat=dat>>1; if(testb) //寫 1 { ds=0; i++;i++; ds=1; i=8;while(i>0)i--; } else { ds=0; //寫 0 i=8;while(i>0)i--; ds=1; i++;i++; }
} }
void tempchange(void) //DS18B20 開始獲取溫度并轉換 { dsreset(); delay(1); tempwritebyte(0xcc); // 寫跳過讀ROM指令 tempwritebyte(0x44); // 寫溫度轉換指令 }
uint get_temp() //讀取寄存器中存儲的溫度數據 { uchar a,b;
dsreset(); delay(1); tempwritebyte(0xcc); tempwritebyte(0xbe); a=tempread(); //讀低8位 b=tempread(); //讀高8位 temp=b; temp<<=8; //兩個字節組合為1個字 temp=temp|a; f_temp=temp*0.0625; //溫度在寄存器中為12位 分辨率位0.0625° temp=f_temp*10+0.5; //乘以10表示小數點后面只取1位,加0.5是四舍五入 f_temp=f_temp+0.05; return temp; //temp是整型 }
////////////////////顯示程序////////////////////////// void display(uchar num,uchar dat,uchar shi,uchar ge) { uchar i; dula=0; P0=table[dat]; dula=1; dula=0;
wela=0; i=0XFF; i=i&(~((0X01)<<(num))); P0=i; wela=1; wela=0; delay(1);
dula=1; P0=table[shi]; dula=0; P0=0xff; wela=1; P0=0xf7; wela=0; delay(1);
dula=1; P0=table[ge]; dula=0; P0=0xff; wela=1; P0=0xef; wela=0; delay(1);
}
void dis_temp(uint t) { uchar i; shi=wx/10; ge=wx%10; i=t/100; display(0,i,shi,ge); i=t%100/10; display(1,i+10,shi,ge); i=t%100%10; display(2,i,shi,ge); } //報警設置
void deal(uint t) { uchar i; if(t>num1) { P1=0Xfe;
dis_temp(get_temp());
} else { i=40; while(i--) { dis_temp(get_temp()); } } } //定時器鍵盤掃描 void timer0() interrupt 1 { TH0=0xb8; TL0=0x00; t0++; if(t0==5) { t0=0; if(key1==0) { delay(5); if(key1==0) { shu++; if(shu==100) shu=0; } while(!key1) ; delay(5); while(!key1); } if(key2==0) { delay(5); if(key2==0) { shu--; if(shu==-1) shu=99; } while(!key2) ; delay(5); while(!key2); } if(key3==0) { delay(5); if(key3==0) { flag=1; } } } }
void init()//定時器初始化函數 { TMOD=0x01;//設置定時器0為工作方式1 TH0=0xb8; TL0=0x00; EA=1;//開總中斷 ET0=1;//開定時器0中斷 TR0=1;//啟動定時器0 }
void main() { uchar buff[4],i; dula=0; wela=0; init(); while(1) { tempchange();
if(flag==1) { num1=shu; deal(temp); } else { for(i=10;i>0;i--) { dis_temp(get_temp());} sprintf(buff,"%f",f_temp);
for(i=10;i>0;i--) { dis_temp(get_temp());}
for(i=10;i>0;i--) { dis_temp(get_temp());} } } }
[此貼子已經被作者于2012-3-24 18:45:40編輯過]
|