![]() |
談到【控制】,就有控制的對象是誰? 先研究一下【控制對象】的特性,需求。 而后再寫程序。 |
怎樣將PT100將AD轉(zhuǎn)換成溫度,算法不會,所以精度太大 #include <reg51.h> #include<intrins.h> #include<math.h> #define uint unsigned int #define uchar unsigned char uchar code str1[]={"Temper" } ; uchar code str2[]={" " } ; sbit lcdrs=P2^0; sbit lcdrw=P2^1; sbit lcden=P2^2; sbit CS=P2^4; sbit CLK=P2^5; sbit DIDO=P2^7; sbit be=P3^4; sbit jdq=P3^3; sbit led1=P3^5; sbit led2=P3^6; uchar flag,num,count,k1num,k2num, k3num,k4num,a,b,c,d,e,f; char tempmax,tempmin;//設(shè)定的溫度 uchar dat; long int temp; double deal,U ;//電阻值,溫度對電阻的變化量(Q //延時函數(shù) void delay(uint z) { uint x,y; for(x=0;x<z;x++) for(y=0;y<114;y++);} //蜂鳴器子程序 void di() { be=0;delay(100);be=1;} // 忙碌 bit lcd_busy(void) { bit result; lcdrs=0;//根據(jù)規(guī)定,RS為低電平,RW為高電平時,可以讀狀態(tài) lcdrw=1; lcden=1; //E=1,才允許讀寫 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四個機(jī)器周期,給硬件反應(yīng)時間 result=(bit)(P0&0x80); //將忙碌標(biāo)志電平賦給result lcden=0;//將E恢復(fù)低電平 return result; } //寫命令函數(shù) void write_com(uchar com) { while( lcd_busy()); lcdrs=0;lcdrw=0;lcden=0; _nop_();_nop_(); P0=com;delay(5); lcden=1;delay(5); lcden=0;} //寫數(shù)據(jù)函數(shù) void write_date(uchar date) { while( lcd_busy()); lcdrs=1; lcdrw=0; lcden=0; P0=date; delay(5); lcden=1; delay(5); lcden=0; } //LCD1602顯示函數(shù) void lcd1602_display(uchar *p,uchar*q) { write_com(0x80+0x40); while(*p!='\0') { write_date(*p); p++; delay(1); } write_com(0x80+0x48); while(*q!='\0') { write_date(*q); q++; delay(1); } } //D0832初始話顯示 /////////////////////// void Init_AD0808() { lcd_init(); lcd1602_display(str1,str2); } /////////////// void delay_ADC(uint i) { while(i--); } /////////////////// uchar ADC0808() { uchar i; CS=1;delay_ADC(5) ; CLK =1; delay_ADC(5) ; CS = 0; DIDO = 1;CLK = 0; delay_ADC(5) ; CLK =1; DIDO =1; delay_ADC(5) ; CLK = 0; CLK = 1; delay_ADC(5) ; DIDO = 0; CLK = 0; delay_ADC(5) ; CLK = 1;DIDO =1; delay_ADC(5) ; for(i = 0; i< 8; i++) { CLK = 0; delay_ADC(5) ; if(DIDO) dat |=0x01; CLK =1; dat <<= 1; delay_ADC(5) ; U=5.0/255.0*dat; deal=10.0*59.9*U; temp=(long int)deal; tempmax=temp/10;tempmin=temp/10; } return temp; CS= 1; } //AD 轉(zhuǎn)換 void AD0808_display() { disdata[0]=temp/1000+0x30;//百位數(shù) disdata[1]=temp/100%10+0x30;//十位數(shù) disdata[2]=temp/10%10+'0';//個位數(shù) disdata[3]=temp%10+0x30;//小數(shù)位 if(disdata[0]==0x30) { disdata[0]=0x20;//如果百位為0,不顯示 if(disdata[1]==0x30) { disdata[1]=0x20;//如果百位為0,十位為0也不顯示 } } write_com(0x80+0x49); write_date(disdata[0]);//顯示百位 write_com(0x80+0x4a); write_date(disdata[1]);//顯示十位 write_com(0x80+0x4b); write_date(disdata[2]);//顯示個位 write_com(0x80+0x4c); write_date(0x2e);//顯示小數(shù)點(diǎn) write_com(0x80+0x4d); write_date(disdata[3]);//顯示小數(shù)位 if((tempmax>290)||(tempmin<30)) {jdq=0;be=~be;led2=0;delay(50);} else {led2=1;} } //主函數(shù) void main() { TMOD=0x01; TH0=(65536-46080)/256; TL0=(65536-46080)%256; EA=1; ET0=1; TR0=1; lcd_init(); Init_AD0808(); write_com(0x80); while(1) { ADC0808(); AD0808_display(); tempmax = temp/10; } } |
代碼呢? |
你在住循環(huán)里面 加入一個if 判斷即可,你可以在上面的51hei搜索框輸入"溫控"參考一下 51hei其他的項目 |
Powered by 單片機(jī)教程網(wǎng)