收藏 分享(赏)

MLX90614红外测温代码.doc

上传人:精品资料 文档编号:9661310 上传时间:2019-08-21 格式:DOC 页数:18 大小:63.50KB
下载 相关 举报
MLX90614红外测温代码.doc_第1页
第1页 / 共18页
MLX90614红外测温代码.doc_第2页
第2页 / 共18页
MLX90614红外测温代码.doc_第3页
第3页 / 共18页
MLX90614红外测温代码.doc_第4页
第4页 / 共18页
MLX90614红外测温代码.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、1通过本实验掌握 MLX90614 的原理。2通过实验掌握数码管基本原理3.通过实验掌握矩阵键盘的使用4通过实验掌握 1602 的使用二实验内容通过 MLX90614 非接触式测得物体温度三实验器材1.主控屏+5V 电源2.DCP-PRJ09 红外测温仪四实验原理图五实验步骤1.接上电源2.运行 Keil u Vision 软件,新建一个工程,新建一个工程文件。将文件添加到工程中并编译 ,如有错,请更改直到编译成功,如有错,请更改直到编译成功4.用编程器将生成的 HEX 文件烧写到单片机中,或用 STC 单片机专用的串口烧写软件,通过 MAX232 串口烧写到单片机中(只能用于 STC 单片机

2、) 。或用仿真器来执行程序,将程序下载到仿真器中,具体方法请参考仿真器的使用一节。用编程器将生成的 HEX 文件烧写到单片机中。5.程序下完后可以看到液晶屏有温度显示,用手掌覆盖红外传感器上方 2cm 处,看到此时液晶屏温度即为手掌的表面温度。6按下 1 键可以看到数码管显示,用手掌覆盖红外传感器上方 2cm 处,看到此时数码管温度即为手掌的表面温度。此时液晶屏温度保持不变。7按下除 1 键其他键,此时液晶屏又重新显示温度。实验代码如下:/-/说明:显示分为 2 部分:数码管显示,液晶屏显示/按 1 键数码管显示,此时液晶屏保持静止/复位时或按除 1 键外其他键时,液晶屏显示,数码管熄灭/-#

3、include#include#define uint unsigned int#define uchar unsigned char#define Nack_number 10/*端口定义*uchar flag;/LCD 控制线接口sbit RS=P06;/RS 端sbit RW=P07;/读写端sbit LCDE=P35;/使能端/mlx90614 端口定义sbit SCK=P37;/时钟线sbit SDA=P36;/数据线sbit DPY1=P32;/温度显示第 1 个数码管段选sbit DPY2=P33;/温度显示第 2 个数码管段选sbit DPY3=P34;/温度显示第 3 个数码

4、管段选sbit row1=P03;/矩阵键盘第 1 列sbit row2=P04;/矩阵键盘第 2 列sbit row3=P05;/矩阵键盘第 3 列sbit cow1=P00;/矩阵键盘第 1 行sbit cow2=P01;/矩阵键盘第 2 行sbit cow3=P02;/矩阵键盘第 3 行/*数据定义*bdata uchar flag1;/可位寻址数据sbit bit_out=flag17;sbit bit_in=flag10;uchar temp H,temp L,err;void CALTEMP(uint TEMP);void Read Key(void);void init Int(

5、);void delay1(uint z);void show();uchar key_num;uchar mah5;/*数码管码值定义*/uchar code LED01= /LED 显示代码,0-9 共阳不带小数点的0x C0,0x F9,0x A4,0x B0,0x99,0x92,0x82,0x F8,0x80,0x90;uchar code LED02= /LED 显示代码,0-9 共阳带小数点的0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10;/*全局变量定义*/bit b20ms,b100ms;/定时标志位uchar c20ms,c

6、100ms;/定时毫秒数/*LCD1602*/向 LCD 写入命令或数据*#define LCD_COMMAND 0/命令#define LCD_DATA 1/数据#define LCD_CLEAR_SCREEN 0x01/清屏#define LCD_HOMING 0x02/光标返回原点/设置显示模式*0x08+*#define LCD_SHOW 0x04/显示开一实验目的#define LCD_HIDE 0x00/显示关#define LCD_CURSOR 0x02/显示光标#define LCD_NO_CURSOR 0x00/无光标#define LCD_FLASH 0x01/光标闪动#d

7、efine LCD_NO_FLASH 0x00/光标不闪动/设置输入模式*0x04+*#define LCD_AC_UP 0x02/光标右移 AC+#define LCD_AC_DOWN 0x00/默认光标左移 AC-#define LCD_MOVE 0x01/画面可平移#define LCD_NO_MOVE 0x00/默认画面不移动/*mlx90614*/command mode 命令模式#define Ram Access 0x00/对 RAM 操作#define Eepom Access 0x20/对 EEPRAM 操作#define Mode 0x60/进入命令模式#define Ex

8、it Mode 0x61/退出命令模式#define Read Flag 0xf0/读标志#define Enter Sleep 0xff/进入睡眠模式/ram address read only RAM 地址(只读)#define Abmient Temp Addr 0x03/周围温度#define IR1Addr 0x04#define IR2Addr 0x05#define Line Abmient Temp Addr 0x06/环境温度/*0x0000 0x4074 16500 0.01/单元-40 125*/ #define Line Obj1Temp Addr 0x07 /目标温度

9、, 红外温度/*0x27ad-0x7fff 0x3559 22610 0.02/单元-70.01-382.19 0.01 452.2*/ #define Line Obj2Temp Addr 0x08/eepom address EEPROM 地址#define TObj Max Addr 0x00/测量范围上限设定#define TObj Min Addr 0x01/测量范围下限设定#define PWMCtrl Addr 0x02/PWM 设定#define Ta Range Addr 0x03/环境温度设定#define Ke Addr 0x04/频率修正系数#define Config

10、 Addr 0x05/配置寄存器#define SMbus Addr 0x0e/器件地址设定#define Reserverd1Addr 0x0f/保留#define Reserverd2Addr 0x19/保留#define ID1Addr 0x1c/ID 地址 1#define ID2Addr 0x1d/ID 地址 2#define ID3Addr 0x1e/ID 地址 3#define ID4Addr 0x1f/ID 地址 4/*函数声明*void start();/MLX90614 发起始位子程序void stop();/MLX90614 发结束位子程序uchar Read Byte(

11、void);/MLX90614 接收字节子程序void send_bit(void);/MLX90614 发送位子程序void Send Byte(uchar number);/MLX90614 接收字节子程序void read_bit(void);/MLX90614 接收位子程序void delay(uint N);/延时程序uint readtemp(void);/读温度数据void init1602(void);/LCD 初始化子程序void busy(void);/LCD 判断忙子程序void cmd_wrt(uchar cmd);/LCD 写命令子程序void dat_wrt(uch

12、ar dat);/LCD 写数据子程序void display(uint Tem);/显示子程序void Print(uchar*str);/字符串显示程序/*主函数*void main()uint Tem;/温度变量init Int();SCK=1;SDA=1;delay(4);SCK=0;delay(1000);SCK=1;init1602();/初始化 LCDwhile(1)while(b100ms)/每 100ms 扫描一次键盘b100ms=0;Read Key();if(key_num=1)/按下 1 键时,进行数码管显示Tem=readtemp();CALTEMP(Tem);sho

13、w();if(key_num!=1)/液晶屏显示Tem=readtemp();/读取温度cmd_wrt(0x01);/清屏Print(“Temperature:“);/显示字符串 Temperature:且换行display(Tem);/显示温度Print(“C“);/显示摄氏度delay(100000);/延时再读取温度显示void Print(uchar *str) /字符串显示程序 while(*str!=0) /直到字符串结束 dat_wrt(*str); /转成 ASCII 码str+; /指向下一个字符 /-输入转换并显示 (用于 LCD1602)-void display(uin

14、t Tem) uint T,a,b; T=Tem*2; if(T=27315) /温度为正 T=T-27315; / a=T/100; /温度整数b=T-a*100; /温度小数if(a=100) /温度超过 100 度 dat_wrt(0x30+a/100); /显示温度百位dat_wrt(0x30+a%100/10); /显示温度十位dat_wrt(0x30+a%10); /显示温度个位 else if(a=10) /温度超过 10 度 dat_wrt(0x30+a%100/10); /显示温度十位dat_wrt(0x30+a%10); /显示温度个位 else /温度不超过 10 度 d

15、at_wrt(0x30+a); /显示温度个位 dat_wrt(0x2e); /显示小数点if(b=10) /温度小数点后第 1 位数不等于 0 dat_wrt(0x30+b/10); /显示温度小数点后第 1 位数dat_wrt(0x30+b%10); /显示温度小数点后第 2 位数 else /温度小数点后第 1 位数等于 0 dat_wrt(0x30); /显示温度小数点后第 1 位数 0 dat_wrt(0x30+b); /显示温度小数点后第 2 位数 else /温度为负 T=27315-T; a=T/100; b=T-a*100; dat_wrt(0x2d); /显示负号if(a=

16、10) /温度低于负 10 度 dat_wrt(0x30+a/10); /显示温度十位dat_wrt(0x30+a%10); /显示温度个位 else /温度高于负 10 度 dat_wrt(0x30+a); /显示温度个位 dat_wrt(0x2e); /显示小数点if(b=10) /温度小数点后第 1 位数不等于 0 dat_wrt(0x30+b/10); /显示温度小数点后第 1 位数dat_wrt(0x30+b%10); /显示温度小数点后第 2 位数 else /温度小数点后第 1 位数等于 0 dat_wrt(0x30); /显示温度小数点后第 1 位数 0 dat_wrt(0x3

17、0+b); /显示温度小数点后第 2 位数 /-根据十六进制计算温度- void CALTEMP(uint TEMP) uint T; uint a,b; uchar A4,A5,A6,A7,A8; T=TEMP*2; if(T=27315) T=T-27315; a=T/100; b=T-a*100; if(a=100) A4=a/100; a=a%100; A5=a/10; a=a%10; A6=a; else if(a=10) A4=0; A5=a/10; a=a%10; A6=a; else A4=0; A5=0; A6=a; if(b=10) A7=b/10; b=b%10; A8=

18、b; else A7=0; A8=b; else T=27315-T; a=T/100; b=T-a*100; A4=9; if(a=10) A5=a/10; a=a%10; A6=a; else A5=0; A6=a; if(b=10) A7=b/10; b=b%10; A8=b; else A7=0; A8=b; mah4=A4; mah3=A5; mah2=A6; mah1=A7; mah0=A8; /- void start(void) /停止条件是 SCK=1 时,SDA 由 1 到 0 SDA=1; delay(4); SCK=1; delay(4); SDA=0; delay(4

19、); SCK=0; delay(4); /- void stop(void) /停止条件是 SCK=1 时,SDA 由 0 到 1 SCK=0; delay(4); SDA=0; delay(4); SCK=1; delay(4); SDA=1; /-发送一个字节- void Send Byte(uchar number) uchar i,n,dat; n=Nack_number; /可以重发次数Send_again: dat=number; for(i=0;i= 20) /20ms 计时器 c20ms = 0; b20ms = 1; if(c100ms = 50) /100ms 计时器 c1

20、00ms = 0; b100ms = 1; /-温度显示函数- void show() DPY1=0; P2=LED01mah3; /转换 8 位数显示,不带小数点的delay1(2); P2=0x FF; DPY1=1; DPY2=0; P2=LED02mah2; /转换 8 位数显示,带小数点的delay1(2); P2=0x FF; DPY2=1; DPY3=0; P2=LED01mah1; /转换 8 位数显示,不带小数点的delay1(2); P2=0x FF; DPY3=1; void Read Key(void) row1=0; /矩阵键盘第 1 列,将第一列拉低, 扫描是否有按

21、键按下 ,第一列按键括:1,4,7 row2=1; /矩阵键盘第 2 列row3=1; /矩阵键盘第 3 列cow1=1; /矩阵键盘第 1 行cow2=1; /矩阵键盘第 2 行cow3=1; /矩阵键盘第 3 行_nop_(); /延时函数if(!(cow1 if(cow2=0) key_num=5; if(cow3=0) key_num=8; return; row1=1; /矩阵键盘第 1 列,将第一列拉低, 扫描是否有按键按下 ,第一列按键包括:2,5,8 row2=0; /矩阵键盘第 2 列row3=1; /矩阵键盘第 3 列cow1=1; /矩阵键盘第 1 行cow2=1; /矩

22、阵键盘第 2 行cow3=1; /矩阵键盘第 3 行_nop_(); /延时函数if(!(cow1 if(cow2=0) key_num=5; if(cow3=0) key_num=8; return; row1=1; /矩阵键盘第 1 列,将第一列拉低, 扫描是否有按键按下 ,第一列按键包括:3,6 row2=1; /矩阵键盘第 2 列row3=0; /矩阵键盘第 3 列cow1=1; /矩阵键盘第 1 行cow2=1; /矩阵键盘第 2 行_nop_(); /延时函数if(!(cow1 if(cow2=0) key_num=6; return; /-数码管显示延时函数- void delay1(uint z) uint x,y; for(x=z;x0;x-) for(y=110;y0;y-);

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报