MLX90614红外测温代码.docx

上传人:scccc 文档编号:14425920 上传时间:2022-02-05 格式:DOCX 页数:19 大小:34.16KB
返回 下载 相关 举报
MLX90614红外测温代码.docx_第1页
第1页 / 共19页
MLX90614红外测温代码.docx_第2页
第2页 / 共19页
MLX90614红外测温代码.docx_第3页
第3页 / 共19页
MLX90614红外测温代码.docx_第4页
第4页 / 共19页
MLX90614红外测温代码.docx_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《MLX90614红外测温代码.docx》由会员分享,可在线阅读,更多相关《MLX90614红外测温代码.docx(19页珍藏版)》请在三一文库上搜索。

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

2、能用于STC单片机)。或用仿真器来执行程序,将程序下载到仿真器中,具体方法请参考仿真器的使用一节。用编程器将生成的 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=P0A6;RS 端 sbit RW=P0” 读写端 sbit LCDE=P3A5;使能端 /mlx90614 端口定义 sbit SCK=P3A7;/时钟线 sbit SDA=P3A6;/ 数据线sbit DPY1=P3A2;/温度显示第1个数码管段选sbit DPY2=P3A3;/ 温度显示第2 个数码管

4、段选sbit DPY3=P3A4;/ 温度显示第3 个数码管段选矩阵键盘第 矩阵键盘第 矩阵键盘第 矩阵键盘第 矩阵键盘第 矩阵键盘第1列2列3列1行2行3行sbit row1=P0A3;/ sbit row2=P0A4; sbit row3=P0A5;/ sbit cow1=P0A0;/ sbit cow2=P0A1;/ sbit cow3=P0A2;/ /* 数据定义 *bdata uchar flag1;/ 可位寻址数据sbit bit_out=flag1A7;sbit bit_in=flag1A0;uchar temp H,temp L,err;void CALTEMP(uint TE

5、MP);void Read Key(void);void init Int();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;/* 全局变量定

6、义*/bit b20ms,b100ms;/ 定时标志位uchar c20ms,c100ms;/ 定时毫秒数/*LCD1602*/向LCD写入命令或数据*#define LCD_COMMAND 0/ 命令#define LCD_DATA 1/数据#define LCD_CLEAR_SCREEN 0X0 情屏#define LCD_HOMING 0x02/ 光标返回原点/ 设置显示模式*0x08+*#define LCD_SHOW 0x04/ 显示开一实验目的#define LCD_HIDE 0x00 显示关#define LCD_CURSOR 0x0/2/ 显示光标#define LCD_NO_

7、CURSOR 0x00/疣光标 #define LCD_FLASH 0x0/1/ 光标闪动#define LCD_NO_FLASH 0x00/优标不闪动 #define LCD_AC_UP 0x02/ 光标右移 AC+/ 设置输入模式*0x04+*#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 Acc

8、ess 0x20 对 EEPRAM操作# define Mode 0x60/ 进入命令模式# define Exit 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

9、0x4074 16500 0.01 /单元-40125*/#define Line Obj1Temp Addr 0x07/ 目标温度 ,红外温度/*0x27ad-0x7fff0x3559 22610 0.02/单元-70.01-382.190.01452.2*/#define Line Obj2Temp Addr 0x08/eepom address EEPROM 地址# define TObj Max Addr 0x00/ 测量范围上限设定# define TObj Min Addr 0x01 / 测量范围下限设定# define PWMCtrl Addr 0x02 /PWM 设定# def

10、ine Ta Range Addr 0x03/ 环境温度设定# define Ke Addr 0x04/ 频率修正系数# define Config 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/* 函数声明 *vo

11、id start();/MLX90614 发起始位子程序void stop();/MLX90614 发结束位子程序uchar Read Byte(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 初始化子程序voi

12、d busy(void);/LCD 判断忙子程序void cmd_wrt(uchar cmd);/LCD 写命令子程序void dat_wrt(uchar 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 扫描一次

13、键盘b100ms=0;Read Key();if(key_num=1)/ 按下 1 键时,进行数码管显示Tem=readtemp();CALTEMP(Tem);show();if(key_num!=1)/ 液晶屏显示Tem=readtemp();/ 读取温度cmd_wrt(0x01);/ 清屏Print(Temperature:);/ 显示字符串 Temperature: 且换行display(Tem);/ 显示温度PrintCC);/显示摄氏度delay(100000);/ 延时再读取温度显示void Print(uchar *str)/ 字符串显示程序while(*str!=0)/ 直到字

14、符串结束dat_wrt(*str);/ 转成 ASCII 码str+;/ 指向下一个字符 / 输入转换并显示(用于 LCD1602)void display(uint 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

15、度 dat_wrt(0x30+a%100/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 位数 0dat_wrt(0x30+b); / 显示温度小数点

16、后第 2 位数 else/ 温度为负 T=27315-T; a=T/100;b=T-a*100;dat_wrt(0x2d);/ 显示负号if(a=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 位数不等于0dat_wrt(0x30+b/10);/ 显示温度小数点后第 1 位数dat_wrt(0x30+b%10);/ 显示温度小数点后第 2 位数e

17、lse/ 温度小数点后第1 位数等于 0dat_wrt(0x30); / 显示温度小数点后第1 位数 0dat_wrt(0x30+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;)

18、 else( A4=0;A5=0; A6=a; ) if(b=10) (A7=b/10; b=b%10;A8=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; elseA7=0;A8=b; mah4=A4;mah3=A5;mah2=A6;mah1=A7;mah0=A8; /void start(void)/ 停止条件是SCK=1 时, SDA 由 1

19、到 0SDA=1;delay(4);SCK=1;delay(4);SDA=0;delay(4);SCK=0;delay(4);/void stop(void)/ 停止条件是SCK=1 时, SDA 由 0 到 1SCK=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;i8;i+)if(dat&0x80)bit_out=1;elsebit_out=

20、0;send_bit();dat=dat1;read_bit();应答信号if(bit_in=1)stop();if(n!=0)n-;goto Repeat; elsegoto exit; elsegoto exit;Repeat:start();/8 位依次发送/ 取最高位/ 发 1/ 发 0/ 发送一个位/ 左移一位/ 接收 1 位/ 无应答时重发/ 可以重发 Nack_number=10 次/ 重发/ 退出/ 重新开始goto Send_again; / 重发exit: ;/ 退出/ 发送一个位void send_bit(void)if(bit_out=1)SDA=1;/ 发 1else

21、 SDA=0;/ 发 0 _nop_();SCK=1;/ 上升沿delay(4);delay(4); SCK=0; delay(4);delay(4); / 接收一个字节 uchar Read Byte(void) uchar i,dat; dat=0;/ 初值为 0for(i=0;i8;i+) dat=dat1;/ 左移read_bit();/ 接收一位if(bit_in=1) dat=dat+1;/ 为 1 时对应位加SDA=0;/ 发送应答信号0send_bit(); return dat;/ 带回接收数据 / 接收一个位void read_bit(void) SDA=1;/ 数据端先置

22、1bit_in=1; SCK=1;/ 上升沿delay(4);delay(4); bit_in=SDA;/ 读数据_nop_();SCK=0; delay(4);delay(4); /uint readtemp(void) SCK=0;start();/ 开始条件/ 指向指令寄存器/ 读从地址 00/ 读数据低字节/ 读数据高字节/ 读错误信息码/*LCD显示子函数*void init1602(void)/ 初始化 LCDSend Byte(0x00);/ 发送从地址00RS=0;Send Byte(0x07);/ 发送命令start();/ 开始条件Send Byte(0x01); bit_

23、out=0;temp L=Read Byte(); bit_out=0;temp H=Read Byte(); bit_out=1;err=Read Byte();stop();/ 停止条件return(temp H*256+temp L);cmd_wrt(0x01);cmd_wrt(0x0c);cmd_wrt(0x06);cmd_wrt(0x38);void busy(void)flag=0x80;while(flag&0x80)P1=0xff;/ 清屏/ 开显示,不显示光标,不闪烁/ 完成一个字符码传送后,光标左移,显示不发生移位/16X2显示,5X7点阵,8位数据接口/LCD 忙标志判断

24、/ 赋初值高位为 1 禁止/ 读写操作使能位禁止时等待继续检测RS=0;/指向地址计数器RW=1;/ 读LCDE=1;/ 信号下降沿有效flag=P1;/读状态位高位为状态LCDE=0;void cmd_wrt(uchar cmd)/ 写命令子函数LCDE=0; busy();P1=cmd;RS=0;RW=0;LCDE=1;LCDE=0;/ 检测读写操作使能吗/ 命令/ 指向命令计数器/ 写/ 高电平有效void dat_wrt(uchar dat)/ 写数据子函数 busy();/ 检测读写操作使能吗LCDE=0;if(flag=16)RS=0;/ 指向指令寄存器RW=0;/ 写P1=0XC

25、0;/ 指向第二行LCDE=1;/ 高电平有效LCDE=0;RS=1;/ 指向数据寄存器RW=0;/写P1=dat;/写数据LCDE=1;/高电平有效LCDE=0;/ 延时 void delay(uint n)uint j;for(j=0;j= 20)c20ms = 0;b20ms = 1;if(c100ms = 50)c100ms = 0;b100ms = 1;/ 20ms 计时器/100ms 计时器/ 温度显示函数void show()DPY1=0;P2=LED01mah3;delay1(2);P2=0x FF;DPY1=1;DPY2=0;P2=LED02mah2;delay1(2);P2

26、=0x FF;DPY2=1;DPY3=0;P2=LED01mah1;delay1(2);P2=0x FF;DPY3=1;void Read Key(void)/ 转换 8 位数显示,不带小数点的/ 转换 8 位数显示,带小数点的/ 转换 8 位数显示,不带小数点的row1=0;/ 矩阵键盘第1 列 ,将第一列拉低,扫描是否有按键按下,第一列按键括:1,4,7row2=1;/ 矩阵键盘第2 列row3=1;/ 矩阵键盘第3 列cow1=1;/ 矩阵键盘第1 行cow2=1;/ 矩阵键盘第2 行cow3=1;/ 矩阵键盘第3 行_nop_();/ 延时函数,否则继续扫描下一列if(!(cow1&c

27、ow2&cow3) / 如果有键按下,就返回,且判断是那个键值 if(cow1=0) key_num=2;if(cow2=0)key_num=5; if(cow3=0) key_num=8; return;row1=1;/ 矩阵键盘第 1 列 ,将第一列拉低,扫描是否有按键按下,第一列按键包括:2,5,8row2=0;row3=1;cow1=1;cow2=1;cow3=1;_nop_();/ 矩阵键盘第/ 矩阵键盘第/ 矩阵键盘第/ 矩阵键盘第/ 矩阵键盘第/ 延时函数列 列 行 行 行if(!(cow1&cow2&cow3) / 如果有键按下,就返回,且判断是那个键值,否则继续扫描下一列if

28、(cow1=0) key_num=2; if(cow2=0) key_num=5; if(cow3=0) key_num=8; return;row1=1;/ 矩阵键盘第1 列 ,将第一列拉低,扫描是否有按键按下,第一列按键包括:3,6row2=1;row3=0;cow1=1;cow2=1;_nop_();/ 矩阵键盘第/ 矩阵键盘第/ 矩阵键盘第/ 矩阵键盘第/ 延时函数列 列 行 行if(!(cow1&cow2) /如果有键按下,就返回,且判断是那个键值,否则继续扫描下一列if(cow1=0)key_num=3;if(cow2=0)key_num=6;return;/ 数码管显示延时函数void delay1(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);

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

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1