谈到【控制】,就有控制的对象是谁? 先研究一下【控制对象】的特性,需求。 而后再写程序。 |
怎样将PT100将AD转换成温度,算法不会,所以精度太大 #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;//设定的温度 uchar dat; long int temp; double deal,U ;//电阻值,温度对电阻的变化量(Q //延时函数 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;//根据规定,RS为低电平,RW为高电平时,可以读状态 lcdrw=1; lcden=1; //E=1,才允许读写 _nop_();//空操作 _nop_(); _nop_(); _nop_();//空操作四个机器周期,给硬件反应时间 result=(bit)(P0&0x80); //将忙碌标志电平赋给result lcden=0;//将E恢复低电平 return result; } //写命令函数 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;} //写数据函数 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显示函数 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 转换 void AD0808_display() { disdata[0]=temp/1000+0x30;//百位数 disdata[1]=temp/100%10+0x30;//十位数 disdata[2]=temp/10%10+'0';//个位数 disdata[3]=temp%10+0x30;//小数位 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);//显示小数点 write_com(0x80+0x4d); write_date(disdata[3]);//显示小数位 if((tempmax>290)||(tempmin<30)) {jdq=0;be=~be;led2=0;delay(50);} else {led2=1;} } //主函数 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; } } |
代码呢? |
你在住循环里面 加入一个if 判断即可,你可以在上面的51hei搜索框输入"温控"参考一下 51hei其他的项目 |