下面的是我的一个程序,可温湿度的值出来的是乱码,不知道哪儿有错误,请高手们帮我指点一下了!!谢谢!<br /><br />//12864并行接口参考程序,控制器st7920<br />#include <reg51.h><br />#include <intrins.h><br />#include <math.h> <br />#include <stdio.h> <br />#define uchar unsigned char<br />#define uint unsigned int<br />#define LcdData P0<br />//12864 汉字显示模块 与MCU连接<br />sbit RS = P2^0;// 1:输入数据 ;0:输入命令<br />sbit RW = P2^1;//1:读数据 0:写数据<br />sbit E = P2^2;<br /><br /><br />typedef union<br />{ unsigned int i;<br /> float f;<br />} value;<br /><br />//----------------------------------------------------------------------------------<br />// modul-var<br />//----------------------------------------------------------------------------------<br />enum {TEMP,HUMI};<br /><br /><br />sbit DATA = P1^0;<br />sbit SCK = P1^1;<br /><br />#define noACK 0<br />#define ACK 1<br /> //adr command r/w<br />#define STATUS_REG_W 0x06 //000 0011 0<br />#define STATUS_REG_R 0x07 //000 0011 1<br />#define MEASURE_TEMP 0x03 //000 0001 1<br />#define MEASURE_HUMI 0x05 //000 0010 1<br />#define RESET 0x1e //000 1111 0<br /><br /><br />//延时子程序<br />void delay(unsigned int t)<br />{<br />unsigned int i,j;<br />for(i=0;i<t;i++)<br />for(j=0;j<100;j++);<br />}<br />///========================12864显示部分============================<br />//测试LCD忙<br />bit Check_Busy()<br />{<br />bit busy;<br />RS = 0;<br />RW = 1;<br />E = 1;<br />_nop_();<br />busy = (bit)(LcdData&0x80);<br />E = 0;<br />return 0;<br />}<br />//等待LCD到空闲<br />void wait()<br />{<br />while(Check_Busy());<br />}<br />//写数据<br />void Lcd_Writedata(unsigned char dispdata)<br />{ wait();<br />RS=1;<br />RW=0;<br />E=0;<br />_nop_(); _nop_();<br />LcdData=dispdata;<br />E=1;<br />_nop_(); _nop_();<br />E=0;<br />}<br />//写指令代码<br />void Lcd_WriteCmd(unsigned char cmdcode)<br />{ wait();<br />RS=0;<br />RW=0;<br /><br />E=0;<br />_nop_(); _nop_();<br />LcdData=cmdcode;<br />_nop_(); _nop_();<br />E=1;<br />_nop_(); _nop_();<br />E=0;<br />}<br />/*****************初始化LCD*******************************/<br />void Lcd_Init(void)<br />{<br />uchar cmd;<br /> cmd=0x30; //功能设置 8位数据,基本指令<br />Lcd_WriteCmd(cmd); //写指令<br />cmd=0x0C; //显示状态 ON,游标OFF,反白OFF<br />Lcd_WriteCmd(cmd); //写指令<br />cmd=0x02; //地址归位<br />Lcd_WriteCmd(cmd); //写指令<br />cmd=0x80; //设置DDRAM地址<br />Lcd_WriteCmd(cmd); //写指令<br />cmd=0x06;<br />Lcd_WriteCmd(cmd); //指定在资料的读取及写入时,设定游标的移动方向及指定显示的移位<br />delay(100); //延时<br />}<br />/*****************清屏LCD *******************************/<br />void Lcd_Clr(void)<br />{<br />Lcd_WriteCmd(0x01); //清除显示<br />delay(100);<br /> delay(100);<br /> delay(100);<br />}<br /><br /><br /><br /><br />/*****************设置汉字位置********************************/<br />void Char_Set_XY(uchar x, uchar y, uchar *p)<br />{<br /> if(y == 0)<br />{<br /><br />Lcd_WriteCmd((0x80+x));<br />}<br />if(y == 1)<br />{<br />Lcd_WriteCmd((0x90+x));<br />}<br />if(y == 2)<br />{<br /><br />Lcd_WriteCmd((0x88+x));<br />}<br />if(y == 3)<br />{<br /><br />Lcd_WriteCmd((0x98+x));<br />}<br />while(*p != 0)<br />{<br />Lcd_Writedata(*p++);<br /><br /> }<br />} <br /><br />//字符串显示<br />void WriteStr(unsigned char code *s)<br />{<br />while(*s>0)<br />{ Lcd_Writedata(*s);<br />s++;<br />}<br />}<br /> <br /> void disp2()<br />{ Char_Set_XY(0,0,"温度上限:");<br /><br />Char_Set_XY(0,1,"温度下限:");<br /><br /> Char_Set_XY(0,2,"湿度上限:");<br /><br /> Char_Set_XY(0,3,"湿度下限:");<br /> }<br /><br />//----------------------------------------------------------------------------------<br />char s_write_byte(unsigned char value)<br />//----------------------------------------------------------------------------------<br />// writes a byte on the Sensibus and checks the acknowledge<br />{<br /> unsigned char i, error=0;<br /><br /> unsigned char n;<br /><br /> for (i=0x80;i>0;i/=2) //shift bit for masking<br /> { if (i & value) DATA=1; //masking value with i , write to SENSI-BUS<br /> else DATA=0;<br /> SCK=1; //clk for SENSI-BUS<br /> for(n=0;n<10;n++) _nop_(); //pulswith approx. 5 us<br /> SCK=0;<br />for(n=0;n<7;n++) _nop_();<br /> }<br /> DATA=1; //release DATA-line<br /><br /> for(n=0;n<3;n++) _nop_();<br /> SCK=1; //clk #9 for ack<br /> for(n=0;n<5;n++) _nop_();<br /> error=DATA; //check ack (DATA will be pulled down by SHT11)<br /> for(n=0;n<5;n++) _nop_();<br /> SCK=0;<br /><br /><br /><br /> return error; //error=1 in case of no acknowledge<br />}<br /><br />//----------------------------------------------------------------------------------<br />char s_read_byte(unsigned char ack)<br />//----------------------------------------------------------------------------------<br />// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"<br />{<br /> unsigned char i,val=0;<br /> DATA=1; //release DATA-line<br /> for (i=0x80;i>0;i/=2) //shift bit for masking<br /> { SCK=1; //clk for SENSI-BUS<br /> if (DATA) val=(val | i); //read bit<br /> SCK=0;<br /> }<br /> DATA=!ack; //in case of "ack==1" pull down DATA-Line<br /> SCK=1; //clk #9 for ack<br /> _nop_();_nop_();_nop_(); //pulswith approx. 5 us<br /> SCK=0;<br /> DATA=1; //release DATA-line<br /> return val;<br />}<br /><br />//----------------------------------------------------------------------------------<br />void s_transstart(void)<br />//----------------------------------------------------------------------------------<br />// generates a transmission start<br />// _____ ________<br />// DATA: |_______|<br />// ___ ___<br />// SCK : ___| |___| |______<br />{<br />int n;<br /><br /> DATA=1; SCK=0; //Initial state<br /> for(n=0;n<5;n++)_nop_();<br /> SCK=1;<br /> for(n=0;n<5;n++)_nop_();<br /> DATA=0;<br /> for(n=0;n<5;n++)_nop_();<br /> SCK=0;<br /> for(n=0;n<5;n++)_nop_();_nop_();_nop_();<br /> SCK=1;<br /> for(n=0;n<5;n++)_nop_();<br /> DATA=1;<br /> for(n=0;n<5;n++)_nop_();<br /> SCK=0;<br /> for(n=0;n<5;n++)_nop_();<br />}<br /><br />//----------------------------------------------------------------------------------<br />void s_connectionreset(void)<br />//----------------------------------------------------------------------------------<br />// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart<br />// _____________________________________________________ ________<br />// DATA: |_______|<br />// _ _ _ _ _ _ _ _ _ ___ ___<br />// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______<br />{<br /> unsigned char i;<br /> int n;<br /><br /> DATA=1; SCK=0; //Initial state<br /> for(i=0;i<9;i++) //9 SCK cycles<br /> {<br /> SCK=1;<br />for(n=0;n<10;n++)_nop_();<br /> SCK=0;<br />for(n=0;n<5;n++)_nop_();<br /> }<br /> for(n=0;n<5;n++)_nop_();<br /> s_transstart(); //transmission start<br />}<br /><br />//----------------------------------------------------------------------------------<br />char s_softreset(void)<br />//----------------------------------------------------------------------------------<br />// resets the sensor by a softreset<br />{<br /> unsigned char error=0;<br /> s_connectionreset(); //reset communication<br /> error+=s_write_byte(RESET); //send RESET-command to sensor<br /> return error; //error=1 in case of no response form the sensor<br />}<br /><br /><br />//----------------------------------------------------------------------------------<br />char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)<br />//----------------------------------------------------------------------------------<br />// makes a measurement (humidity/temperature) with checksum<br />{<br /> unsigned int error=0;<br /> unsigned int i;<br /><br /> s_transstart(); //transmission start<br /> switch(mode){ //send command to sensor<br /> case TEMP : error+=s_write_byte(MEASURE_TEMP); break;<br /> case HUMI : error+=s_write_byte(MEASURE_HUMI); break;<br /> default : break;<br /> }<br /> for (i=0;i<65535;i++) if(DATA==0) break; //wait until sensor has finished the measurement<br /> if(DATA) error+=1; // or timeout (~2 sec.) is reached<br /> *(p_value) =s_read_byte(ACK); //read the first byte (MSB)<br /> *(p_value+1)=s_read_byte(ACK); //read the second byte (LSB)<br /><br />// printf("\ndata1=%x, data2=%x\n", *(p_value), *(p_value+1));<br /><br /> *p_checksum =s_read_byte(noACK); //read checksum<br /> return error;<br />}<br /><br />//----------------------------------------------------------------------------------<br />void init_uart()<br />//----------------------------------------------------------------------------------<br />//9600 bps @ 11.059 MHz<br />{SCON = 0x52;<br />TMOD = 0x20;<br />TCON = 0x69;<br />TH1 = 0xfd;<br />}<br /><br />//----------------------------------------------------------------------------------------<br />void calc_sth11(float *p_humidity ,float *p_temperature)<br />//----------------------------------------------------------------------------------------<br />// calculates temperature [癈] and humidity [%RH]<br />// input : humi [Ticks] (12 bit)<br />// temp [Ticks] (14 bit)<br />// output: humi [%RH]<br />// temp [癈]<br />{ const float C1=-4.0; // for 12 Bit<br /> const float C2=+0.0405; // for 12 Bit<br /> const float C3=-0.0000028; // for 12 Bit<br /> const float T1=+0.01; // for 14 Bit @ 5V<br /> const float T2=+0.00008; // for 14 Bit @ 5V<br /><br /> float rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit<br /> float t=*p_temperature; // t: Temperature [Ticks] 14 Bit<br /> float rh_lin; // rh_lin: Humidity linear<br /> float rh_true; // rh_true: Temperature compensated humidity<br /> float t_C; // t_C : Temperature [癈]<br /><br /> t_C=t*0.01 - 40; //calc. temperature from ticks to [癈]<br /> rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH]<br /> rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]<br /> if(rh_true>100)rh_true=100; //cut if the value is outside of<br /> if(rh_true<0.1)rh_true=0.1; //the physical possible range<br /><br /> *p_temperature=t_C; //return temperature [癈]<br /> *p_humidity=rh_true; //return humidity[%RH]<br />}<br /><br /><br /><br />//----------------------------------------------------------------------------------<br />void main()<br />//----------------------------------------------------------------------------------<br />// sample program that shows how to use SHT11 functions<br />// 1. connection reset<br />// 2. measure humidity [ticks](12 bit) and temperature [ticks](14 bit)<br />// 3. calculate humidity [%RH] and temperature [癈]<br />// 4. calculate dew point [癈]<br />// 5. print temperature, humidity, dew point<br /><br />{<br /> value humi_val,temp_val;<br /> float dew_point;<br /> unsigned char error,checksum;<br /> unsigned int i;<br /><br />init_uart();<br /><br /> s_connectionreset();<br />Lcd_Clr();<br />Lcd_Init(); //初始化LCD<br />//Char_Set_XY(2, 1, "初始化成功");<br />delay(1000);<br /><br /> while(1)<br /> { error=0;<br /> error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //measure humidity<br /><br />//printf("humi:%dC \n",humi_val.i);<br /><br /> error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //measure temperature<br /><br />// printf("temp:%dC \n",temp_val.i);<br /><br /> if(error!=0) s_connectionreset(); //in case of an error: connection reset<br /> else<br /> { //humi_val.f=(float)humi_val.i; //converts integer to float<br /> temp_val.f=(float)temp_val.i; //converts integer to float<br /> calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity, temperature<br /> // dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point<br /> //printf("temp:%5.1fC \n",temp_val.f);<br /> <br />Lcd_WriteCmd(0x98);<br />Lcd_WriteDat(*temp_va1.f) ;<br />// Char_Set_XY(1,2,&temp_val.f );<br /> }<br /> //----------wait approx. 0.8s to avoid heating up SHTxx------------------------------<br /> for (i=0;i<40000;i++); //(be sure that the compiler doesn't eliminate this line!)<br /> //-----------------------------------------------------------------------------------<br /> }<br />}<br /> <br /> |
|