无线测温装置
液晶12864是并口带中文字库的。单片机型号是STC89C52 晶振11.0592MHz Keil软件是Keil uVision4 修改环境温度和目标温度校准方法: (1) 在12864.c程序中修改液晶和你的单片机开发板相对应 file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image001.gif (2) 修改环境温度和目标温度校准值 在90614.c程序中更改OffSetValue(环境温度校准)和OffSetValue2(目标温度校准)的值。如果测量的温度比实际的温度高了,那校准值要为负数,如想把校准值降低2.1度就写-21 file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtmlclip1\01\clip_image005.gif
下面是部分源码预览:
- #include<reg52.h>
- #include <intrins.h>
- #include <stdio.h>
- #include"math.h"
- #define PAUSE_INT EA=0;
- #define START_INT EA=1;
- #define uchar unsigned char
- #define uint unsigned int
- #define ulong unsigned long
- ulong OffSetValue=-20;//环境温度校准值,假如你测量
- //的温度比实际的偏高了,这个
- //值就要用负数,如-20,就是减少2度
- ulong OffSetValue2=0; //目标温度校准值,修改方法同上
- ulong Temperature=0,Temperature2=0;
- unsigned char date;
- unsigned char time_buf2[7];//定义接收四个字节非接触式红外温度数组
- unsigned char Temp1[6];
- unsigned char Temp2[6];
- uchar a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,a10=0,a11=0,a12=0,a13=0,a14=0,a15=0,a16=0;
- void initial_LCD();
- void DispalyLcd();
- void LCD_Data(uchar LCDbyte );
- void WriteCommand(uchar a);
- void LCD_PutString(unsigned char x,unsigned char y,uchar *s);
- void UART_Init();
- unsigned char Receive(void);
- void Send(unsigned char back);
- void send_char_com(uchar ch);
- void send_string_com(uchar *str, uchar strlen);
- void delay1ms(uint z);
- void Init_Timer0(void);
- void main(void)
- {
- initial_LCD(); //初始化LCD12864
- LCD_PutString(0,1,"MXL90614非接触式");
- LCD_PutString(2,2,"红外测温");
- LCD_PutString(0,3,"目标温度:");
- LCD_PutString(0,4,"环境温度:");
- UART_Init();//初始化串口通信
- while(1);
- }
- void UART_Init()
- {
- TMOD|=0x20; //TMOD: timer 1, mode 2, 8-bit reload
- TH1=0xfd; //Baud:9600 fosc="11.0592"MHz
- TL1=0xfd;
- SCON|=0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
- TI = 0;
- RI = 0;
- TR1=1;// timer 1 run //启动定时器1
- ES=1; //Enable Serial Interrupt 打开中断
- EA=1; //打开所有中断
- }
- //串行中断服务程序,读取非接触式红外测温温度4个字节
- void UART_SER (void) interrupt 4
- {
- unsigned char Temp; //定义临时变量
- unsigned int a,b,c,d,e,f,g,h;
- unsigned char i;
- if(RI) //判断是接收中断产生
- {
- RI=0; //标志位清零
- Temp=SBUF; //读入缓冲区的值
- time_buf2[i]=Temp;
- i++;
- if(i==8) //连续接收4个字符信息
- {
- i=0;
- a1=(unsigned int)(time_buf2[0]/16);a2=(unsigned int)(time_buf2[0]%16);//串口接收第1个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
- a3=(unsigned int)(time_buf2[1]/16);a4=(unsigned int)(time_buf2[1]%16);//串口接收第2个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
- a5=(unsigned int)(time_buf2[2]/16);a6=(unsigned int)(time_buf2[2]%16);//串口接收第3个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
- a7=(unsigned int)(time_buf2[3]/16);a8=(unsigned int)(time_buf2[3]%16);//串口接收第4个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
-
- a9=(unsigned int)(time_buf2[4]/16);a10=(unsigned int)(time_buf2[4]%16);//串口接收第5个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
- a11=(unsigned int)(time_buf2[5]/16);a12=(unsigned int)(time_buf2[5]%16);//串口接收第6个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
- a13=(unsigned int)(time_buf2[6]/16);a14=(unsigned int)(time_buf2[6]%16);//串口接收第7个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
- a15=(unsigned int)(time_buf2[7]/16);a16=(unsigned int)(time_buf2[7]%16);//串口接收第8个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
-
- Temperature=a2*1000+a4*100+a6*10+a8+OffSetValue; //将分离开的温度数据组合成一个数据,OffSetValue是校准值
- //如果测到的温度比实际温度高,则OffSetValue要减少,反正则增加
-
-
- Temperature2=a10*1000+a12*100+a14*10+a16+OffSetValue2; //将分离开的温度数据组合成一个数据,OffSetValue2是校准值
- //如果测到的温度比实际温度高,则OffSetValue2要减少,反正则增加
-
-
- a=Temperature/1000;
- b=(Temperature%1000)/100;
- c=(Temperature%100)/10;
- d= Temperature%10;
- Temp1[0]=a+0x30;
- Temp1[1]=b+0x30;
- Temp1[2]=c+0x30;
- Temp1[3]='.';
- Temp1[4]=d+0x30;
- LCD_PutString(5,3,Temp1); //液晶显示目标温度
-
-
- e=Temperature2/1000;
- f=(Temperature2%1000)/100;
- g=(Temperature2%100)/10;
- h= Temperature2%10;
- Temp2[0]=e+0x30;
- Temp2[1]=f+0x30;
- Temp2[2]=g+0x30;
- Temp2[3]='.';
- Temp2[4]=h+0x30;
- LCD_PutString(5,4,Temp2); //液晶显示环境温度
- }
- }
- if(TI) //如果是发送标志位,清零
- TI=0;
- }
- void Send(unsigned char back)
- {
- SBUF=back;
- while(TI==0)
- ;
- TI=0;
- }
- unsigned char Receive(void)
- {
- unsigned long i = 10000;
-
- while( RI == 0 )
- {
- i--;
- if( i == 0 ) return -1;//
- }
-
- RI = 0;
- return SBUF;
- }
- //向串口发送一个字符
- void send_char_com(uchar ch)
- {
- PAUSE_INT
- SBUF=ch;
- while(TI==0);
- TI=0;
- START_INT
- }
- //
- //向串口发送一个字符串,strlen为该字符串长度
- void send_string_com(uchar *str, uchar strlen)
- {
- uchar k=0;
- do
- {
- send_char_com(*(str+k));
- k=k+1;
- } while(k<strlen);
- }
- void delay1ms(uint z)
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=110;y>0;y--);
- }
复制代码
|