标题: 红外无线测温装置 51单片机源码 [打印本页]
作者: 刘军12123 时间: 2015-1-31 16:35
标题: 红外无线测温装置 51单片机源码
无线测温装置
液晶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--);
- }
复制代码
-
-
12864液晶显示.zip
268.7 KB, 下载次数: 107, 下载积分: 黑币 -5
12864显示
作者: admin 时间: 2015-1-31 22:52
谢谢分享,不错的资料
作者: exv 时间: 2015-2-1 11:07
谢谢楼主分享,有3个问题:
1.#include"math.h"
好像不需要吧?
2.MXL90614非接触式?
只听说过这个:MLX90614 family
MLX90614 is an Infra Red thermometer for noncontact temperature measurements.
3.楼主不会是正点原子吧?
作者: h1314258 时间: 2015-7-27 11:04
这个是错误的
作者: h1314258 时间: 2015-7-27 11:04
/* After is STC additional SFR or change */
/* sfr AUXR = 0x8e; */
/* sfr IPH = 0xb7; */
/* Watchdog Timer Register */
sfr WDT_CONTR = 0xe1;
/* ISP_IAP_EEPROM Register */
sfr ISP_DATA = 0xe2;
sfr ISP_ADDRH = 0xe3;
sfr ISP_ADDRL = 0xe4;
sfr ISP_CMD = 0xe5;
sfr ISP_TRIG = 0xe6;
sfr ISP_CONTR = 0xe7;
/* IDLE, Clock Divider */
sfr IDLE_CLK = 0xc7;
/* I_O Port Mode Set Register */
sfr P0M0 = 0x93;
sfr P0M1 = 0x94;
sfr P1M0 = 0x91;
sfr P1M1 = 0x92;
sfr P2M0 = 0x95;
sfr P2M1 = 0x96;
sfr P3M0 = 0xb1;
sfr P3M1 = 0xb2;
/* SPI Register */
sfr SPSTAT = 0x84;
sfr SPCTL = 0x85;
sfr SPDAT = 0x86;
/* ADC Register */
sfr ADC_CONTR = 0xc5;
sfr ADC_DATA = 0xc6;
sfr ADC_LOW2 = 0xbe;
/* PCA SFR */
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
sfr CCAPM2 = 0xDC;
sfr CCAPM3 = 0xDD;
sfr CCAPM4 = 0xDE;
sfr CCAPM5 = 0xDF;
sfr CL = 0xE9;
sfr CCAP0L = 0xEA;
sfr CCAP1L = 0xEB;
sfr CCAP2L = 0xEC;
sfr CCAP3L = 0xED;
sfr CCAP4L = 0xEE;
sfr CCAP5L = 0xEF;
sfr CH = 0xF9;
sfr CCAP0H = 0xFA;
sfr CCAP1H = 0xFB;
sfr CCAP2H = 0xFC;
sfr CCAP3H = 0xFD;
sfr CCAP4H = 0xFE;
sfr CCAP5H = 0xFF;
sfr PCA_PWM0 = 0xF2;
sfr PCA_PWM1 = 0xF3;
sfr PCA_PWM2 = 0xF4;
sfr PCA_PWM3 = 0xF5;
sfr PCA_PWM4 = 0xF6;
sfr PCA_PWM5 = 0xF7;
/* CCON */
sbit CF = CCON^7;
sbit CR = CCON^6;
sbit CCF5 = CCON^5;
sbit CCF4 = CCON^4;
sbit CCF3 = CCON^3;
sbit CCF2 = CCON^2;
sbit CCF1 = CCON^1;
sbit CCF0 = CCON^0;
/* Above is STC additional SFR or change */
/*--------------------------------------------------------------------------
REG51F.H
Header file for 8xC31/51, 80C51Fx, 80C51Rx+
Copyright (c) 1988-1999 Keil Elektronik GmbH and Keil Software, Inc.
All rights reserved.
Modification according to DataSheet from April 1999
- SFR's AUXR and AUXR1 added for 80C51Rx+ derivatives
--------------------------------------------------------------------------*/
/* BYTE Registers */
sfr P0 = 0x80;
sfr P1 = 0x90;
sfr P2 = 0xA0;
sfr P3 = 0xB0;
sfr PSW = 0xD0;
sfr ACC = 0xE0;
sfr B = 0xF0;
sfr SP = 0x81;
sfr DPL = 0x82;
sfr DPH = 0x83;
sfr PCON = 0x87;
sfr TCON = 0x88;
sfr TMOD = 0x89;
sfr TL0 = 0x8A;
sfr TL1 = 0x8B;
sfr TH0 = 0x8C;
sfr TH1 = 0x8D;
sfr IE = 0xA8;
sfr IP = 0xB8;
sfr SCON = 0x98;
sfr SBUF = 0x99;
/* 80C51Fx/Rx Extensions */
sfr AUXR = 0x8E;
/* sfr AUXR1 = 0xA2; */
sfr SADDR = 0xA9;
sfr IPH = 0xB7;
sfr SADEN = 0xB9;
sfr T2CON = 0xC8;
sfr T2MOD = 0xC9;
sfr RCAP2L = 0xCA;
sfr RCAP2H = 0xCB;
sfr TL2 = 0xCC;
sfr TH2 = 0xCD;
/* BIT Registers */
/* PSW */
sbit CY = PSW^7;
sbit AC = PSW^6;
sbit F0 = PSW^5;
sbit RS1 = PSW^4;
sbit RS0 = PSW^3;
sbit OV = PSW^2;
sbit P = PSW^0;
/* TCON */
sbit TF1 = TCON^7;
sbit TR1 = TCON^6;
sbit TF0 = TCON^5;
sbit TR0 = TCON^4;
sbit IE1 = TCON^3;
sbit IT1 = TCON^2;
sbit IE0 = TCON^1;
sbit IT0 = TCON^0;
/* P3 */
sbit RD = P3^7;
sbit WR = P3^6;
sbit T1 = P3^5;
sbit T0 = P3^4;
sbit INT1 = P3^3;
sbit INT0 = P3^2;
sbit TXD = P3^1;
sbit RXD = P3^0;
/* SCON */
sbit SM0 = SCON^7; // alternatively "FE"
sbit FE = SCON^7;
sbit SM1 = SCON^6;
sbit SM2 = SCON^5;
sbit REN = SCON^4;
sbit TB8 = SCON^3;
sbit RB8 = SCON^2;
sbit TI = SCON^1;
sbit RI = SCON^0;
sbit T2EX = P1^1;
sbit T2 = P1^0;
/* T2CON */
sbit TF2 = T2CON^7;
sbit EXF2 = T2CON^6;
sbit RCLK = T2CON^5;
sbit TCLK = T2CON^4;
sbit EXEN2 = T2CON^3;
sbit TR2 = T2CON^2;
sbit C_T2 = T2CON^1;
sbit CP_RL2= T2CON^0;
/* PCA Pin */
sbit CEX3 = P2^4;
sbit CEX2 = P2^0;
sbit CEX1 = P3^5;
sbit CEX0 = P3^7;
sbit ECI = P3^4;
/* IE */
sbit EA = IE^7;
sbit EPCA_LVD = IE^6;
sbit EADC_SPI = IE^5;
sbit ES = IE^4;
sbit ET1 = IE^3;
sbit EX1 = IE^2;
sbit ET0 = IE^1;
sbit EX0 = IE^0;
/* IP */
sbit PPCA_LVD = IP^6;
sbit PADC_SPI = IP^5;
sbit PS = IP^4;
sbit PT1 = IP^3;
sbit PX1 = IP^2;
sbit PT0 = IP^1;
sbit PX0 = IP^0;
作者: tanmin801120 时间: 2015-8-7 08:07
太强大了,下来看看
作者: YOU1988 时间: 2015-8-7 13:35
下载下来做做看,谢谢大神分享,谢谢
作者: 空袭的梦 时间: 2015-9-15 16:30
LZ没有硬件电路吗?能看下吗?
作者: cai596513612 时间: 2015-10-19 17:43
下来看看
作者: cai596513612 时间: 2015-10-19 17:46
还以为是红外呢
作者: cai596513612 时间: 2015-11-1 15:04
下载来看看,希望很有用
作者: DavidMark01 时间: 2015-12-4 21:54
我来看看可不可以用
作者: DavidMark01 时间: 2015-12-4 21:54
我来看看可不可以用......................哎呀
作者: DavidMark01 时间: 2015-12-4 21:55
我都不知道我的积分有多少 。关注微信才送50
作者: w110365154 时间: 2017-6-11 09:35
谢谢分享了!
作者: eyeshot2017 时间: 2017-6-11 11:58
学习学习
欢迎光临 (http://www.51hei.com/bbs/) |
Powered by Discuz! X3.1 |