找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5456|回复: 15
收起左侧

红外无线测温装置 51单片机源码

  [复制链接]
ID:73063 发表于 2015-1-31 16:35 | 显示全部楼层 |阅读模式
无线测温装置
液晶12864是并口带中文字库的。单片机型号是STC89C52  晶振11.0592MHz  
Keil软件是Keil uVision4
0.png
修改环境温度和目标温度校准方法:
(1)    在12864.c程序中修改液晶和你的单片机开发板相对应
1.png
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
2.png
下面是部分源码预览:

  1. #include<reg52.h>
  2. #include <intrins.h>
  3. #include <stdio.h>
  4. #include"math.h"
  5. #define        PAUSE_INT        EA=0;
  6. #define        START_INT        EA=1;
  7. #define uchar unsigned char
  8. #define uint unsigned int
  9. #define ulong unsigned long
  10. ulong  OffSetValue=-20;//环境温度校准值,假如你测量
  11.                        //的温度比实际的偏高了,这个
  12.                                            //值就要用负数,如-20,就是减少2度

  13. ulong  OffSetValue2=0; //目标温度校准值,修改方法同上
  14. ulong Temperature=0,Temperature2=0;
  15. unsigned char date;
  16. unsigned char time_buf2[7];//定义接收四个字节非接触式红外温度数组
  17. unsigned char Temp1[6];
  18. unsigned char Temp2[6];
  19. 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;
  20. void initial_LCD();
  21. void DispalyLcd();
  22. void LCD_Data(uchar LCDbyte );
  23. void WriteCommand(uchar a);
  24. void LCD_PutString(unsigned char x,unsigned char y,uchar *s);
  25. void UART_Init();
  26. unsigned char Receive(void);
  27. void Send(unsigned char back);
  28. void        send_char_com(uchar ch);
  29. void        send_string_com(uchar *str, uchar strlen);
  30. void delay1ms(uint z);
  31. void Init_Timer0(void);


  32. void main(void)
  33. {                 
  34.     initial_LCD(); //初始化LCD12864
  35.         LCD_PutString(0,1,"MXL90614非接触式");
  36.         LCD_PutString(2,2,"红外测温");       
  37.     LCD_PutString(0,3,"目标温度:");
  38.         LCD_PutString(0,4,"环境温度:");
  39.         UART_Init();//初始化串口通信
  40.         while(1);               
  41. }
  42. void UART_Init()     
  43. {
  44.     TMOD|=0x20;    //TMOD: timer 1, mode 2, 8-bit reload
  45.     TH1=0xfd;      //Baud:9600 fosc="11.0592"MHz
  46.     TL1=0xfd;
  47.     SCON|=0x50;    //SCON: serail mode 1, 8-bit UART, enable ucvr
  48.     TI = 0;
  49.     RI = 0;
  50.     TR1=1;// timer 1 run //启动定时器1
  51.     ES=1; //Enable Serial Interrupt 打开中断         
  52.     EA=1; //打开所有中断
  53. }

  54. //串行中断服务程序,读取非接触式红外测温温度4个字节
  55. void UART_SER (void) interrupt 4
  56. {
  57.     unsigned char Temp;          //定义临时变量
  58.         unsigned int a,b,c,d,e,f,g,h;
  59.     unsigned char i;
  60.     if(RI)                        //判断是接收中断产生
  61.      {
  62.           RI=0;                      //标志位清零
  63.           Temp=SBUF;                 //读入缓冲区的值
  64.           time_buf2[i]=Temp;
  65.           i++;
  66.           if(i==8)                  //连续接收4个字符信息
  67.            {
  68.                 i=0;
  69.                         a1=(unsigned int)(time_buf2[0]/16);a2=(unsigned int)(time_buf2[0]%16);//串口接收第1个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
  70.             a3=(unsigned int)(time_buf2[1]/16);a4=(unsigned int)(time_buf2[1]%16);//串口接收第2个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
  71.             a5=(unsigned int)(time_buf2[2]/16);a6=(unsigned int)(time_buf2[2]%16);//串口接收第3个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
  72.                 a7=(unsigned int)(time_buf2[3]/16);a8=(unsigned int)(time_buf2[3]%16);//串口接收第4个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
  73.                          
  74.                         a9=(unsigned int)(time_buf2[4]/16);a10=(unsigned int)(time_buf2[4]%16);//串口接收第5个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
  75.             a11=(unsigned int)(time_buf2[5]/16);a12=(unsigned int)(time_buf2[5]%16);//串口接收第6个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
  76.             a13=(unsigned int)(time_buf2[6]/16);a14=(unsigned int)(time_buf2[6]%16);//串口接收第7个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
  77.                 a15=(unsigned int)(time_buf2[7]/16);a16=(unsigned int)(time_buf2[7]%16);//串口接收第8个16进制温度字节,并且把个位和十位分离,只取有效数据个位。
  78.                          

  79.                             Temperature=a2*1000+a4*100+a6*10+a8+OffSetValue; //将分离开的温度数据组合成一个数据,OffSetValue是校准值
  80.                                                                                                                                  //如果测到的温度比实际温度高,则OffSetValue要减少,反正则增加
  81.        
  82.                        
  83.                             Temperature2=a10*1000+a12*100+a14*10+a16+OffSetValue2; //将分离开的温度数据组合成一个数据,OffSetValue2是校准值
  84.                                                                                                                                            //如果测到的温度比实际温度高,则OffSetValue2要减少,反正则增加
  85.                
  86.                           
  87.                             a=Temperature/1000;
  88.                                 b=(Temperature%1000)/100;
  89.                                 c=(Temperature%100)/10;
  90.                                 d= Temperature%10;
  91.                                 Temp1[0]=a+0x30;
  92.                                 Temp1[1]=b+0x30;                                                                     
  93.                 Temp1[2]=c+0x30;
  94.                                 Temp1[3]='.';
  95.                                 Temp1[4]=d+0x30;                     
  96.                                 LCD_PutString(5,3,Temp1);                     //液晶显示目标温度
  97.                                
  98.                

  99.                                 e=Temperature2/1000;
  100.                                 f=(Temperature2%1000)/100;
  101.                                 g=(Temperature2%100)/10;
  102.                                 h= Temperature2%10;                                          
  103.                                 Temp2[0]=e+0x30;
  104.                                 Temp2[1]=f+0x30;                                                                     
  105.                 Temp2[2]=g+0x30;
  106.                                 Temp2[3]='.';
  107.                                 Temp2[4]=h+0x30;
  108.                                 LCD_PutString(5,4,Temp2);                     //液晶显示环境温度               
  109.            }  
  110.          }
  111.     if(TI)  //如果是发送标志位,清零
  112.     TI=0;
  113. }

  114. void Send(unsigned char back)
  115. {
  116.    SBUF=back;
  117.    while(TI==0)
  118.       ;
  119.     TI=0;
  120. }
  121. unsigned char Receive(void)
  122. {
  123.         unsigned long i = 10000;
  124.        
  125.         while( RI == 0 )
  126.         {
  127.                 i--;
  128.                 if( i == 0 ) return -1;//
  129.         }
  130.        
  131.         RI = 0;
  132.         return SBUF;
  133. }
  134. //向串口发送一个字符
  135. void        send_char_com(uchar ch)  
  136. {
  137.         PAUSE_INT
  138.     SBUF=ch;
  139.     while(TI==0);
  140.     TI=0;
  141.         START_INT
  142. }
  143. //
  144. //向串口发送一个字符串,strlen为该字符串长度
  145. void        send_string_com(uchar *str, uchar strlen)
  146. {
  147.     uchar k=0;
  148.     do
  149.     {
  150.         send_char_com(*(str+k));
  151.         k=k+1;
  152.     } while(k<strlen);

  153. }


  154. void delay1ms(uint z)
  155. {
  156.         uint x,y;
  157.         for(x=z;x>0;x--)
  158.                 for(y=110;y>0;y--);
  159. }



复制代码


12864液晶显示.zip

268.7 KB, 下载次数: 107, 下载积分: 黑币 -5

12864显示

回复

使用道具 举报

ID:1 发表于 2015-1-31 22:52 来自手机 | 显示全部楼层
谢谢分享,不错的资料
回复

使用道具 举报

ID:67796 发表于 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.楼主不会是正点原子吧?
回复

使用道具 举报

ID:86938 发表于 2015-7-27 11:04 | 显示全部楼层
这个是错误的
回复

使用道具 举报

ID:86938 发表于 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;
回复

使用道具 举报

ID:87799 发表于 2015-8-7 08:07 | 显示全部楼层
太强大了,下来看看
回复

使用道具 举报

ID:84705 发表于 2015-8-7 13:35 | 显示全部楼层
下载下来做做看,谢谢大神分享,谢谢
回复

使用道具 举报

ID:90092 发表于 2015-9-15 16:30 | 显示全部楼层
LZ没有硬件电路吗?能看下吗?
回复

使用道具 举报

ID:92665 发表于 2015-10-19 17:43 | 显示全部楼层
下来看看
回复

使用道具 举报

ID:92665 发表于 2015-10-19 17:46 | 显示全部楼层
还以为是红外呢
回复

使用道具 举报

ID:92665 发表于 2015-11-1 15:04 | 显示全部楼层
下载来看看,希望很有用
回复

使用道具 举报

ID:98370 发表于 2015-12-4 21:54 | 显示全部楼层
我来看看可不可以用
回复

使用道具 举报

ID:98370 发表于 2015-12-4 21:54 | 显示全部楼层
我来看看可不可以用......................哎呀
回复

使用道具 举报

ID:98370 发表于 2015-12-4 21:55 | 显示全部楼层
我都不知道我的积分有多少 。关注微信才送50
回复

使用道具 举报

ID:210017 发表于 2017-6-11 09:35 | 显示全部楼层
谢谢分享了!
回复

使用道具 举报

ID:210051 发表于 2017-6-11 11:58 来自手机 | 显示全部楼层
学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表