MLX90614红外测温代码
Datasheet MLX90614 中文 数据手册 rev008
3901090614 Rev 008
第 2 / 52 页
数据手册 2013/2/28
MLX90614 系列
单区视场和双区视场 TO-39 封装 红外温度传感器
3 目录
1 功能图 ........................................................................................................................................................................................................ 1 2 概述 ............................................................................................................................................................................................................ 1 3 目录 ............................................................................................................................................................................................................ 3 4 术语缩写 ...........................................................
MLX90640红外热成像仪测温传感器模块PC端操作教程
MLX90640红外热成像仪测温传感器模块PC端操作教程河北稳控科技MLX90640 红外热成像仪测温传感器模块PC端操作教程1.驱动程序安装本设备没有自带显示设备(屏幕),若要进行实时图像查看或者参数修改需要连接到计算机或者手机,并由对应的工具软件完成上述工作。
若要连接到计算机,则需要预先安装 USB 驱动程序,若要连接到手机,则直接使用 APP 程序即可(无需安装驱动程序)。
计算机安装驱动程序的步骤如下:(1)双击“驱动程序CH341SER”文件夹内的 SETUP.exe 文件弹出“驱动安装” 对话框,点击【安装】按钮,稍候弹出“驱动安装成功” 提示框,表示驱动安装完成,点击【确定】关闭驱动安装窗口。
(2)将本设备插入计算机USB 接口,计算机右下角弹出发现新设备以及设备安装成功的提示信息,右键点击“我的电脑-属性-设备管理器”,在“端口(COM 和LPT)”中查看是否有“USBSERIAL CH340(COMx)”, COMx 表示红外成像仪对应的端口名称。
2.与计算机工具软件 IFD_Tool 连接(1)运行程序计算机软件 IFD_Tool 无需安装,直接运行即可。
双击“计算机工具软件”文件夹内的 IFD_Tool.exe 文件运行程序,主界面如下所示。
(2)连接端口在设备已经与 USB 接口连接状态下,点击主界面左上角的【端口】下拉框中选择5.1 小节中的COMx 端口名称,【参数】下拉框选择460800,点击【连接端口】按钮,若一切正常,主界面右侧会显示出实时的红外图像。
若5 秒后仍未显示实时图像,可尝试点击【读取校正参数】按钮。
3.运行流程与工具界面操作说明(1)设备运行流程设备上电后,迅速完成初始化(约500ms),并开始从数字接口不断输出实时数据,上拉机工具软件接收到实时数据后进行解析、计算、显示。
(2)操作界面说明以下以计算机工具界面为例说明各种操作以及设备参数。
提示:当鼠标移动到界面上的不同控件时均有对应的说明提示,以下内容也可以界面中实时获取。
红外测温 源程序代码(汇编)
/*****************************************************************/ /* “红外测温仪”主程序/*****************************************************************/ ORG 0000HSJMP MAINORG 0030HMAIN:MOV DPTR, #7FFFH ;启动AD转换MOV A, #0MOVX @DPTR, AHERE:JB P3.2, HERE ;等待转换结束MOVX A, @DPTR ;读取转换结果SUBB A, #60MOV B, #108 ;准备温度换算MUL ABMOV R5, AMOV R6, BCALL WDJS ;调用温度计算子程序CALL XSZH ;调用温度显示转换子程序MOV R6, #30LOOP1: CALL DISPLAY ;调用温度显示子程序DJNZ R6, LOOP1 ;循环显示LJMP MAIN ;重新开始温度数据采集、转换和显示/*****************************************************************/ /* 温度计算子程序/*****************************************************************/ /*首先对16位数与255的除法进行计算,获得商为显示时的整数部分*/ WDJS: MOV R7, #08H ;循环次数装入R7JS: CLR CMOV A, R5 ;被除数低位存入ARLC A;带进位位循环左移1位MOV R5, A ;左移后结果回存MOV A, R6 ;被除数高位存入ARLC A;16位被除数整体左移1位MOV 07H, C;保留最高位CLR CMOV R4, #255 ;除数进入R4SUBB A, R4 ;余数高位减去除数JB 07H, S1 ;最高位为1转S1JNC S1 ;没有借位转S1ADD A, R4 ;产生借位恢复余数SJMP S2 ;转到S2S1: INC R5 ;修改商值S2: MOV R6, A ;保留余数高位DJNZ R7, JS ;循环/*对16位除法后的余数乘10后再进行求商,获得的商为显示时的小数部分*/ MOV A, R6MOV B, #10MUL ABMOV R3, AMOV R2, BWDJS1: MOV R7, #08HJS1: CLR CMOV A, R3RLC AMOV R3, AMOV A, R2RLC AMOV 07H, CCLR CSUBB A, R4JB 07H, S11JNC S11ADD A, R4SJMP S21S11: INC R3S21: MOV R2, ADJNZ R7, JS1MOV A, R3MOV R6, ARET/******************************************************************/ /* 显示转换子程序/******************************************************************/ /*把温度计算子程序的结果转换成4个数码管显示的数据*/XSZH: MOV A, R5 ;求显示的第一位MOV B, #100DIV ABMOV R0, AMOV A, B ;求显示的第2,3位MOV B, #10DIV ABMOV R1, AMOV R2, BMOV A, R6 ;求显示的第4位MOV R3, ARET/*****************************************************************/ /* 显示子程序/*****************************************************************/ DISPLAY:MOV DPTR, #TABLE ;显示第1位MOV A, R0MOVC A, @A+DPTRMOV P1, AMOV P2, #0FEHCALL DELMS ;显示第2位MOV A, R1MOVC A, @A+DPTRMOV P1, AMOV P2, #0FDHCALL DELMSMOV DPTR, #TABLE1 ;显示第3位MOV A, R2MOVC A, @A+DPTRMOV P1, AMOV P2, #0FBHCALL DELMSMOV DPTR, #TABLE ;显示第4位MOV A, R3MOVC A, @A+DPTRMOV P1, AMOV P2, #0F7HCALL DELMSRET/****************************************************************/ /* 显示延时子程序/*****************************************************************/ DELMS: MOV 50H, #2HDELAY1: MOV 52H, #4DELAY: MOV 51H, #60DJNZ 51H, $DJNZ 52H, D ELAYDJNZ 50H, D ELAY1RET/****************************************************************/ /* 数据定义/****************************************************************/ TABLE: DB 3fh,06h,5bh,4fh,66h,6dh,7dh,07hDB 7fh,6fh,77h,7ch,39h,5eh,79h,71hTABLE1: DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH,0FDH,87H DB 0FFH,0EFH,0F7H,0FCH,0B9H,0DEH,0F9H,0F1HEND。
MLX90614和STC12C5604AD通讯
1 目的该文档的主要目的是描述怎样实现单片机和红外温度计MLX90614的SMBus通信,并简略介绍利用单片机对MLX90614的PWM输出脉冲进行测量并计算相关温度。
代码是基于STC12C5604AD单片机的。
实例给出了由C语言实现MLX90614读取物体温度,写入数据到MLX90614、以及对PWM脉冲的测量和计算等功能。
2 C 代码2.1 由取、改变SMBus_CM.c(具体描述SMBus(包含了利用SMBus通信由Delay.c(调用延迟函数);子文件数);子文件.h文//----------------------------------------------------------------------------------------------------------------------------------------//主文件SMBus.c//----------------------------------------------------------------------------------------------------------------------------------------////----------------------------------------------------------------------------------------------------------------------------------------//红外温度计—MLX90614中读取物体温度描述:该文件是基于单片机STC12C5604AD编写的C语言程序,可通过SMBus实现对MLX90614温度数据的读取,对MLX90614写入数据的功能。
实例给出了读取物体温度的程序,以及可根据十六进制数值计算温度数值并在数字LEDs上显示温度的程序,但是此为可选项,用户可根据自己的应用另行选择其他方式。
MLX90614ESF-AAA
MLX90614ESF-AAA数字非接触红外测温传感器高精度无接触远程测温
MLX90614是一款非接触式温度测量的红外温度计。
TO-39封装内集成了对红外灵敏的热电堆探测器芯片和信号处理ASSP(专用集成电路)芯片。
由于集成了低噪声放大器,17位ADC和强大的DSP单元,使得高精度的温度计得以实现。
温度计出厂设置为数字SMBus输出,在整个温度测量范围内的分辨率为0.02°C。
用户可以将输出配置为PWM格式。
作为标准,将PWM格式配置成10位来连续传送测量温度。
测量温度范围为-20…120 ?C,分辨率是0.14 ?C。
特点和优点
∙体积小,成本低,易集成。
∙宽温度范围内的出厂校准设置:
∙传感器温度范围-40…+125 ?C
∙物体温度范围-70…+380 ?C
∙Ta 和To 由0到+50°C温度范围内,精度可达0.5°C
∙(医用)高精度校准,在所需的温度范围精度为0.1°C,分辨率为0.01°C。
有单个和双重区域版本。
∙SMBus兼容数字接口用于快速读取温度并可建立传感器网络。
∙客户定制的PWM连续读数输出。
∙3V和5V电源电压,电源电压可调节为8…16V,节能工作模式。
∙适用于不同应用领域多种封装形式和测量方式。
∙车用级别标准。
产品应用
诊断系统
发烧测量
温度测量
过程监控
食品温度监测器
舒适度测量
薄雾/大雾探测防护
乘客探测系统
车窗冷凝水珠(雾)测试和预报
室温测量
温度测量。
红外温度计MLX90614及其应用
//CDP每次都指向循环首地址
MOV*AR2.ARli
//假设*AR2记录的是最老采样数据在循环地址中的位置
MOV*AR2.AR3:
AMAR-ARl一l
//调整ARl,使ARI指向本次滤渡的最老数据
lMOV CoeffCnt一3,CSR I //指定单指令循环扶数
MOV Co“fCnt,TO I
//TO记录地址跳转步长
(下转第40页)
37
墨曩圈臣雹圜
到型鳌量;卫星渣塞矍鱼退让壁旦翌塞婴
***…㈧{t- 具体程序代码如下;
初始化准备,t-㈩**…+
OR 0】【340,mmap(STl』5)# //小数乘法模式;符号扩展模式开
oR OxlOA,mmap(ST2—55)‘
//设置CDP,ARl,AR3为循环寻址模式,其他的ARx为线性模式 BSET SMUL
MOV SampCnt,BK03}//设置输人采样值的循环长度
.
MOV CoeflCnt,BKC f
//设置滤波系数的循环长度
MOV sample,BSAOl I
’
//设置采样数据循环缓冲区的首地址
MOV sample.BSA23 I
//
MOV coeff,BSAC,
//设置滤波系数的首地址
MOV 0,CDP}
FIRSADD-AR3+.-ARl一.*CDP+.AC0,ACl l
FIRSADD*(AR3一TO),*ARl,*CDP+,ACO,ACl l
㈩…¨¨45 输出结果㈧-y: //同时调整AR3指向最老数据 MACM*CDP+。ACO.ACl *******
MOV rnd(hi(ACl)).*AR4{ //假设AR4指向输出缓冲地址
基于MLX90614的无线温度采集系统设计_钟君
2015年第34卷第3期传感器与微系统(Transducer and Microsystem Technologies)DOI:10.13873/J.1000—9787(2015)03—0087—03基于MLX90614的无线温度采集系统设计*钟君,蔡黎明,于涌(中国科学院苏州生物医学工程技术研究所,江苏苏州215163)摘要:在医疗设备研发制造等领域,为了实现人体体温附近范围内高精度的温度测量,设计了一种基于低功耗单片机MSP430、非接触式红外温度传感器MLX90614以及蓝牙传输技术的无线温度监控系统,采集发送模块以超低功耗单片机MSP430为控制核心,通过SMBus协议读取MLX90614所采集到的目标温度值,利用蓝牙透传模块将数据上传。
MSP430单片机的使用极大地降低了系统功耗,MLX90614非接触测量方式满足了医疗设备研发污染隔离的特殊需求,具有较高的测量分辨率和精度,蓝牙透传模块的使用使得系统易于实现数字化、网络化和集散化管理。
实验表明:该系统在32 42ħ温度范围内,测量精度达ʃ0.2ħ,并实现了测量结果的无线传输,在医疗设备研制领域有广泛的应用前景。
关键词:MLX90614;红外温度采集;SMBus;蓝牙中图分类号:TH811文献标识码:A文章编号:1000—9787(2015)03—0087—03Design of wireless temperature acquisition systembased on MLX90614*ZHONG Jun,CAI Li-ming,YU Yong(Suzhou Institute of Biomedical Engineering and Technology,Chinese Academy of Sciences,Suzhou215163,China)Abstract:A wireless temperature monitoring system based on low power consumption MCU MSP430and non-contact infrared temperature sensor MLX90614and Bluetooth transmission technology is presented.The systemconsists of acquisition sending module and receiving display module,acquisition sending module read temperaturedata from MLX90614by means of SMBus protocol with the usage of MSP430as core,the result is sent byBluetooth module and displayed by receiving display module through segment LCD.The system power consumptionis reduced by usage of MCU MSP430.In the area of medical equipment research and development,specialrequirements of pollution isolation is reached with the help of non-contact infrared thermometer MLX90614,digitization networking,distribution management is realized easily by the usage of the Bluetooth transparenttransmission module.Experimental results show that measurement precision can reachʃ0.2ħin the range of32 42ħand the system can achieve wireless transmission,it has wide application prospect in medical deviceresearch and fabrication field.Key words:MLX90614;infrared temperature acquisition;SMBus;Bluetooth0引言温度监控系统在工业生产、现代农业、智能家居以及医疗保健行业都有广泛的应用[1,2],尤其是在医疗设备研制领域,非接触、精度高、响应快且可无线传输的数字化温度监控系统,能够为提高医疗设备的性能指标提供有效依据。
红外测温仪.doc
摘要传统的接触式测温模式存在响应时间长、易受环境温度的影响等缺点。
而红外测温是根据被测物体的红外辐射能量来确定物体的温度,不需与被测物体接触,具有不影响被测物体温度场、温度分辨率高、响应速度快、测温范围广、不受测温上限的限制、稳定性好等特点,因此,设计一套红外测温仪。
设计的红外测温仪以AT89C51单片机为核心,红外测温传感器(MLX90614)在测量温度后,以SMbus方式与单片机进行通信,单片机读取温度数据并进行处理,之后驱动LCD 模块显示测量温度。
一旦温度超过设定阀值,立刻进行声光报警。
该红外测温仪具有功能稳定,运行速度快等特点。
是一种便携式温度测量仪器。
关键词:红外线温度测量,MLX90614传感器,AT89C51单片机目录第1章绪论1.1课题开发的背景和现状1.2课题开发的目的和意义1.3 课题技术性能指标第2章红外测温工作原理第3章系统设计方案的选择3.1 方案选择3.1.1 方案一3.1.2 方案二3.1.3 方案对比选择3.2 总体方案设计第4章系统主要器件的方案选择4.1 传感器的方案选择4.1.1 红外探测器的分类4.1.2 传感器的选择4.2 显示器的方案选择4.3 单片机的方案选择第5章系统各模块硬件设计5.1 MCU主控模块5.2 红外温度测量模块5.2.1 MLX90614的特性5.2.2 MLX90614的引脚分布和内部结构5.2.3 MLX90614的接口电路5.3 电源模块5.4 声光报警模块5.5 LCD显示模块第6章系统软件设计6.1 MLX90614的SMBus传输协议6.2 软件流程图6.3 主程序设计第7章系统误差分析与改进方法第8章课程设计心得体会第9章参考文献附录1 总电路图2 元器件清单第1章绪论1.1 课题开发的背景和现状红外辐射这一物理现象被发现在1800年,但直到本世纪50年代,红外技术才开始进入广泛应用的阶段。
非接触测温技术也叫辐射测温,最早的非接触测温就是以光学高温计为代表的高温法,以后,人们根据斯蒂芬.玻尔兹曼公式,利用黑体辐射能与热力学温度的关系进行测温,这就是全辐射测温和部分辐射测温法,还有的人在光学高温计上进行改进,出现了光电高温计、红外温度计等。
单个 MLX90614 IR 温度计和 PIC10
于为多数23.情5mAµ况A。下并因P且此IC,PMI平CC1均U0电监和源视M电时LX流钟9大0漏6约1电4为流在事6睡µ实眠A上。模也式是工相作同。的3V数M值L。X9在0开61通4 典时型段的,睡电眠源模电式流电典源型漏值电小流 P睡如对如IC眠连果果1模续睡0PFI式眠周C201进功期20能的入F的2可条不0条2以件需件用被汇要汇于编注跳编未语释过语注言行,言释连#(无行d续e睡#f周ind眠e期ef模Si里nL式e去EP)E读ICP取O10N-F传(2见送02全。(见程全序程) 序)
1/25
10-2007
应用指南
单个 MLX90614 IR 温度计和 PIC10 MCU 的通信
解释
典型应用电路
VCC
VCC
R1
U1
1.8k U2
SCL SDA Vdd Vss
1 SCL 2 SDA 3 4
C1
5 4
GP0 Vdd GP1
8
Vss 7
MLX90614
100n
GP2 3
PIC10F206 TX
MemRead
; Read RAM address macro
可以是 或 结果的形式为 RAM_Address
Ta,To1 To2.
DataH:DataL
出意厂SA默0认x0所0有在S系M统B有us一的个从以动上器M地L址X9(0S6A1)4为器0件x5时A是。无所效有的M。LX90614 器件可以接受 SA 0x00。注
应用指南
单个 MLX90614 IR 温度计和 PIC10 MCr用语稍oc指言作hi南改。p 汇描变给编述并出语了移了言怎植从)样于M可实其L以X现他9从0的S6wM18w4B位wRu.sAmP和MIicCr读MoMcL取ChXi测Up9.0。c量6o应1温m4用下度的的载的通开得实信发到例。工。。代具用码是软是件M为P实ML现AicBrSoIcMDhEBipu和’ss
基于MLX90614的智能体温安检系统
2020年12月25日第4卷第24期现代信息科技Modern Information TechnologyDec.2020 Vol.4 No.24收稿日期:2020-11-04基金项目:陕西省大学生创新创业训练计划项目(7288)基于MLX90614的智能体温安检系统高雪娟,董小倩,石萌,刘炜(陕西学前师范学院 信息工程学院,陕西 西安 710100)摘 要:考虑到公共场所人工测温将会给工作人员带来一定的安全隐患,文章提出将MLX90614红外非接触式温度传感器与Arduino UNO R3相结合,开发出一种功能可定制的智能体温安检系统。
该系统能够完成测温和身份识别等功能,并根据检测数据自动控制闸门开合。
通过无线传输,将检测数据存储于OneNET 云平台并进行分析,可实现远程自动控制闸门的开合。
系统实用效应强,应用范围广,具有较好的推广价值。
关键词:体温;MLX90614;安检中图分类号:TP274文献标识码:A文章编号:2096-4706(2020)24-0171-04Intelligent Temperature Security Verification System Based on MLX90614GAO Xuejuan ,DONG Xiaoqian ,SHI Meng ,LIU Wei(School of Information Engineering ,Shaanxi Xueqian Normal University ,Xi ’an 710100,China )Abstract :Considering that manual temperature measurement in public places will bring a certain security threat to staff ,this paperproposes to develop an intelligent temperature security verification system with customizable functions by combining MLX 90614 infrared non-contact temperature sensor with Arduino UNO R 3. The system can complete the functions of temperature measurement and identity recognition ,and automatically control the opening and closing of the gate according to the detected data. Through wireless transmission ,the detected data is stored in the OneNet cloud platform and is analyzed ,which can realize the remote automatic control of the opening and closing of the gate. The system has strong practical effect ,wide application range and good promotion value.Keywords :body temperature ;MLX 90614;security verification0 引 言在人群密集场所,体温检测是保证人群健康安全的有效措施。
中文_MLX90614红外传感温度计
Vdd GND
Vdd 3
C1
0.1uF CON1 C1 value and type may differ in different applications for optimum EMC
MLX90614 connection to SMBus
图 1 典型应用电路图
总体描述 (续)
MLX90614 集成了由迈来芯开发和生产的两款芯片: 红外热电堆传感器 MLX81101 信号处理专用集成芯片 MLX90302,专门用于处理红外传感器输出信号。 器件为工业标准 TO-39 封装。 由于集成了低噪声放大器、17 位模数转换器和强大的数字信号处理芯片 MLX90302,使得高精度和高分辨度的 温度计得以实现。计算所得物体温度和环境温度存储在 MLX90302 的 RAM 单元,温度分辨率为 0.01 ˚C,并 可通过两线 SMBus 兼容协议接口 (0.02°C 分辨率)或是 10 位 PWM (脉宽调制) 输出模式输出。 MLX90614 出厂校准的温度范围为:环境温度 -40…125 ˚C,物体温度 -70…382.2 ˚C。 传感器测量的温度为视场里所有物体温度的平均值。MLX90614 室温下的标准精度为±0.5ºC。医疗应用版本的 传感器可在人体温度范围内达到±0.1ºC 的精度。 在应用设计中需要注意上述精度是当传感器在热平衡和等温条件下才能保证和达到的。(传感器封装里没有温差) 封装内部的温差会影响温度计测量的精度,如下因素会造成温差:传感器背部的热电子,传感器背部或旁边的 加热器/冷却器, 或当热/冷物体靠近传感器,不仅会加热传感元件,而且会加热温度计封装。 该效应对小视场(FOV)器件,如-XXC和-XXF会更加明显,因为传感器接收到被测物体能量削减了。因此, 迈来芯引入MLX90614 –XCX版本,在该版本里,热梯度是通过内部测量的,进而用所测温度去补偿该梯度。 应用该方式, MLX90614 –XCX版本对热梯度有低的灵敏度,但是并未完全消除该效应,所以需要尽可能避免 使用造成热梯度的操作或是将传感器和该环境隔离。 作为标准, MLX90614 将物体发射率校准为 1。但用户可在无需黑体的情况下,简易地将发射率在 0.1…1.0 之间改变。10-位 PWM 输出模式是连续输出所测物体温度的标准配置,测量物体的温度范围为-20…120 ˚C, 分辨率为 0.14 ˚C。 PWM 格式可以通过改变 2 个 EEPROM 单元的内容来简易地定制为客户所需的范围,这对 器件的出厂校准并无影响。 PWM 引脚也可配置为热动继电器模式, (输入为 To) 进而构造简单且经济的恒温器或是温度(冻结/沸腾)警 报装置。温度阈值是用户编程的。在 SMBus 系统中该特性可以作为进程中断以便读取总线上的从动器件 并确 定其精确的状态。 温度计有两个电源电压:5V 或是 3V (电池作为电源) 。5V 电源电压可通过使用少量片外元件调节到更高的电 源电压。 (例如 8…16V) (具体请参考 “应用信息” 部分) 用以阻碍可见光和近红外光辐射的光学滤波器(可传播长波)集成在封装内提供对环境和日光的免疫。滤波器 的波长通带为 5.5 到 14µm。
ml 90614红外温度计程序
#include <reg52.h>#include<intrins.h>//#include <stdio.h>#define uint unsigned int#define uchar unsigned char#define Nack_number 10//**************端口定义************************************************** sbit P_RS=P3^5;sbit P_RW=P3^6;sbit P_E=P3^7;sbit SCK=P3^2; //时钟线sbit SDA=P3^3;//************数据定义**************************************************** int bit_out=0,bit_in=0;uchar tempH,tempL,err;unsigned char ltable[6];#define clear 0x01 //清除显示#define home 0x02 //地址归位#define dis_on 0x0f //打开显示:显示控制00001DCB,D=1整体显示开,即打开// 开关让屏显示C=1游标开,// B=1游标位置反白允许(此处不允许)#define in_mode 0x06 //输入方式(进入点设置:000001I/DS//I/D=1光标右移,AC自动加1,S=0,整体显示不移动)//************函数声明*****************************************************void start(); //MLX90614发起始位子程序void stop(); //MLX90614发结束位子程序uchar ReadByte(void); //MLX90614接收字节子程序void send_bit(void); //MLX90614发送位子程序void SendByte(uchar number); //MLX90614接收字节子程序void read_bit(void); //MLX90614接收位子程序void delay(uint N); //延时程序uint readtemp(void); //读温度数据uint wreadtemp(void); //读温度数据void display(uint Tem); //显示子程序void displayw(uint Tem); //显示子程序void screen_delay1(uint x); //延时函数void screen_initial(); //液晶初始化函数void screen_instruct(uint dat); // 液晶发送控制指令void screen_bit8_serial_input(uint ix);//液晶输入字节函数void dis_str(uchar x, uchar y, uchar *str);//液晶写入函数void screen_write_abyte(uint dat); //发送数据函数//void screen_delay_ms(); //延时函数//////////////////////////////////////////////////////////////////////////////////以下是12864液晶显示函数/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////延时函数!///////////////////////////////////////////////////////////////////////////////void screen_delay1(uint x) //51+17x(us){uint i,j;for(i=0;i<1;i++)for(j=0;j<x;j++);}//////////////////////////////////////////////////////////////////////////////// //液晶初始化函数,通过去掉0x0c,可以实时显示光标位置!/////////////////////////////////////////////////////////////////////////////// void screen_initial(){P_RS=0; //RS为低电平,进行控制指令screen_instruct(dis_on); //发送打开显示指令screen_delay1(70);screen_instruct(clear); //发送清屏指令screen_delay1(3000);screen_instruct(in_mode); //发送输入方式指令screen_delay1(7);screen_instruct(0x0c); //显示状态的游标和游标位置不显示screen_delay1(7);screen_instruct(home); //发送地址归位指令screen_delay1(3000);}/////////////////////////////////////////////////////////////////////////////// //发送控制指令函数/////////////////////////////////////////////////////////////////////////////// void screen_instruct(uint dat){uint ch;P_RS=1;ch=0xf8;screen_bit8_serial_input(ch);ch=dat&0xf0;screen_bit8_serial_input(ch);ch=dat<<4;screen_bit8_serial_input(ch);P_RS=0;}/////////////////////////////////////////////////////////////////////////////// //输入字节函数/////////////////////////////////////////////////////////////////////////////// void screen_bit8_serial_input(uint ix){uint i;P_E=0;for(i=0;i<8;i++){if((ix&0x80)==0)P_RW=0;elseP_RW=1;ix<<=1;P_E=1;P_E=0; //使能端发出一个负跳变沿脉冲,详见MPU写资料模块}}/////////////////////////////////////////////////////////////////////////////////写入函数///////////////////////////////////////////////////////////////////////////////void dis_str(uchar x, uchar y, uchar *str) //16*4{data uchar loc,*p;code uchar xline[5]={0,1,3,2,4};p=str;x=xline[x];screen_instruct(home);loc=(16*(x-1)+y-1);if(loc&0x01){loc/=2;screen_instruct(loc|0x80);screen_write_abyte(' ');}else{loc/=2;screen_instruct(loc|0x80);}while(*p){screen_write_abyte(*p++);}screen_instruct(0x9e); screen_write_abyte(' ');}/////////////////////////////////////////////////////////////////////////////////发送数据///////////////////////////////////////////////////////////////////////////////void screen_write_abyte(uint dat){uint ch;P_RS=1;ch=0xfa;screen_bit8_serial_input(ch);ch=dat&0xf0;screen_bit8_serial_input(ch);ch=dat<<4;screen_bit8_serial_input(ch);P_RS=0;}///////////////////////////////////////////////////////////////////////////////void screen_delay_ms(){unsigned int i,j;for(i=0;i<500;i++)for(j=0;j<500;j++) ;}//*************主函数*******************************************void main(){uint Tem; //温度变量uint Temh;SCK=1;SDA=1;delay(4);SCK=0;delay(1000);SCK=1;screen_initial(); //液晶初始化函数dis_str(1,3,"东北农业大学");//前边的1表明是哪一行,后边的3表明从第一行的第3个dis_str(2,1,"温度:C");dis_str(3,1,"环境:C");while(1){Tem=readtemp(); //读取温度display(Tem); //显示温度Temh=wreadtemp();displayw(Temh);delay(10000); //延时再读取温度显示10000delay(10000);delay(10000);delay(10000);}}//*********输入转换并显示*********void display(uint Tem){uint T,a,b;T=Tem*2;if(T>=27315) //温度为正{T=T-27315; //a=T/100; //温度整数b=T-a*100; //温度小数ltable[0]=a/100+'0';ltable[1]=a%100/10+'0';ltable[2]=a%10+'0';ltable[3]='.';ltable[4]=b/10+'0';ltable[5]=b%10+'0';dis_str(2,7,ltable);}else //温度为负{T=27315-T;a=T/100;b=T-a*100;ltable[0]='-';ltable[1]=a/10+'0';ltable[2]=a%10+'0';ltable[3]='.';ltable[4]=b/10+'0';ltable[5]=b%10+'0';dis_str(2,7,ltable);}}void displayw(uint Tem){uint T,a,b;T=Tem*2;if(T>=27315) //温度为正{T=T-27315; //a=T/100; //温度整数b=T-a*100; //温度小数ltable[0]=a/100+'0';ltable[1]=a%100/10+'0';ltable[2]=a%10+'0';ltable[3]='.';ltable[4]=b/10+'0';ltable[5]=b%10+'0';dis_str(3,7,ltable);}else //温度为负{T=27315-T;a=T/100;b=T-a*100;ltable[0]='-';ltable[1]=a/10+'0';ltable[2]=a%10+'0';ltable[3]='.';ltable[4]=b/10+'0';ltable[5]=b%10+'0';dis_str(3,7,ltable);}}//************************************void start(void) //停止条件是SCK=1时,SDA由1到0 {SDA=1;delay(4);SCK=1;delay(4);SDA=0;delay(4);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 SendByte(uchar number){uchar i,n,dat;n=Nack_number; //可以重发次数Send_again:dat=number;for(i=0;i<8;i++) //8位依次发送{if(dat&0x80) //取最高位{bit_out=1; //发1}else{bit_out=0; //发0}send_bit(); //发送一个位dat=dat<<1; //左移一位}read_bit(); //接收1位应答信号if(bit_in==1) //无应答时重发{stop();if(n!=0){n--; //可以重发Nack_number=10次goto Repeat; //重发}else{goto exit; //退出}}else{goto exit;}Repeat:start(); //重新开始goto Send_again; //重发exit: ; //退出}//-----------发送一个位---------void send_bit(void){if(bit_out==1){SDA=1; //发1}else{SDA=0; //发0}_nop_();SCK=1; //上升沿delay(4);delay(4);SCK=0;delay(4);delay(4);}//----------接收一个字节--------uchar ReadByte(void){uchar i,dat;dat=0; //初值为0for(i=0;i<8;i++){dat=dat<<1; //左移read_bit(); //接收一位if(bit_in==1){dat=dat+1; //为1时对应位加1 }}SDA=0; //发送应答信号0 send_bit();return dat; //带回接收数据}//----------接收一个位----------void read_bit(void){SDA=1; //数据端先置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(); //开始条件SendByte(0x00); //发送从地址00SendByte(0x07); //发送命令start(); //开始条件SendByte(0x01); //读从地址00bit_out=0;tempL=ReadByte(); //读数据低字节bit_out=0;tempH=ReadByte(); //读数据高字节bit_out=1;err=ReadByte(); //读错误信息码stop(); //停止条件return(tempH*256+tempL);}uint wreadtemp(void){SCK=0;start(); //开始条件SendByte(0x00); //发送从地址00 SendByte(0x06); //发送命令start(); //开始条件SendByte(0x01); //读从地址00bit_out=0;tempL=ReadByte(); //读数据低字节bit_out=0;tempH=ReadByte(); //读数据高字节bit_out=1;err=ReadByte(); //读错误信息码stop(); //停止条件return(tempH*256+tempL);}//------------延时--------------void delay(uint n){uint j;for(j=0;j<n;j++){_nop_();}}。
基于MLX90614的非接触式母线温度在线监测系统
基于MLX90614的非接触式母线温度在线监测系统-电气论文基于MLX90614的非接触式母线温度在线监测系统陈创1,徐恺2,王颖韬3,李巨泽1,李党1,刘灿萍1 (1.广州供电局有限公司变电管理一所,广东广州510001;2.常州森隆电力科技有限公司,江苏常州213014;3.上海市电力公司,上海200120)摘要:MLX90614具有体积小、测温范围宽、高精度、无接触测量等优点,在此提出一种基于MLX90614非接触式母线测温开关柜在线监测预警系统,其采用MLX90614BCI红外传感器模块测量开关柜母线温度,再利用ZigBee无线通信方式将温度数据传递至本地终端。
经过实践测试表明,该测温点终端能准确测量母线温度,同时将该温度反馈到本地开关柜终端,通过校正红外发射率进行温度校正的方法,可使测温精度达到±0.5%,能够实现对开关柜母线温度的高精确温度测量和预警,并且能对柜内母线温度异常位置进行准确定位,便于故障状态检修,提高了开关柜运行的可靠性,保障了开关柜系统的安全。
关键词:MLX90614;非接触式母线测温;开关柜;在线监测中图分类号:TN911-34 文献标识码:A 文章编号:1004-373X(2015)12-0105-05收稿日期:2014-12-15基金项目:广州供电局有限公司科技项目:基于全生命周期管理的开关柜在线监测预警系统的开发和应用(K-GZM2014-010)电力系统中,开关柜母线是电气主接线的重要环节,其将配电装置中各个载流分支回路连接在一起,起着汇集、分配和传输电能的作用。
高压载流母线常因接触点氧化、接触松动、负荷过大、相间短路、散热环境差等原因而使温度升高,造成开关柜过热故障[1]。
由于开关柜内的空间结构狭小,同时母线运行处于高电压状态,直接人工巡查测温不太方便[1],因此采用一种合适的温度监测方法对开关柜的高压载流母线的温度进行在线实时监测预警是保证开关柜安全运行的重要手段。
MLX90614的原理与应用
dis_cmd_wrt(0x01);//清屏 if(T>=27315) { T=T-27315; a=T/100; b=T-a*100; //--------------------------if(a>=100) { dis_dat_wrt(0x30+a/100); a=a%100; dis_dat_wrt(0x30+a/10); a=a%10; dis_dat_wrt(0x30+a); } else if(a>=10) { dis_dat_wrt(0x30+a/10); a=a%10; dis_dat_wrt(0x30+a); } else { dis_dat_wrt(0x30+a); } dis_dat_wrt(0x2e);//显示点 //--------------------------if(b>=10) { dis_dat_wrt(0x30+b/10); // // } else { dis_dat_wrt(0x30); // } } //=========================== else { T=27315-T; a=T/100; dis_dat_wrt(0x30+b); b=b%10; dis_dat_wrt(0x30+b);
南京航空航天大学 曾德志
摘要: MLX90614 系列模块是一组通用的红外测温模块。在出厂前该模块已进行校验及线
性化,具有非接触、体积小、精度高,成本低等优点。被测目标温度和环境温度能通过单通 道输出,并有两种输出接口,适合于汽车空调、室内暖气、家用电器、手持设备以及医疗设 备应用等。本文以MLX90614AAA为例介绍其原理和应用。
PWM/SDA 上的数据在 SCL 变为低电平 300n 后即可改变,数据在 SCL 的上升沿被捕 获。 16 位数据分两次传输, 每次传一个字节。 每个字节都是按照高位(MSB)在前, 低位(LSB) 在后的格式传输,两个字节中间的第九个时钟是应答时钟。 4.2 单片机接口电路 MLX90614AAA 与单片机连接的硬件电路如图 4 所示。SCL、PWM/SDA 管脚直接连接 MCU 的普通 I/O 口即可,由于 MLX90614AAA 的输入输出接口是漏级开路(OD)结构, 需要加上拉电阻。多个 MLX90614 可以用于一个系统中,每个 MLX90614 对应一个不同地 址,通过地址的不同而访问不同的 MLX90614,最多可以达到 127 个。
中文MLX90614_chinese[1]
MLX90614红外测温代码
1.通过本实验掌握MLX90614的原理。
2.通过实验掌握数码管基本原理3.通过实验掌握矩阵键盘的使用4.通过实验掌握1602的使用二.实验内容通过MLX90614非接触式测得物体温度三.实验器材1.主控屏+5V电源2.DCP-PRJ09红外测温仪四.实验原理图五.实验步骤1.接上电源2.运行Keil u Vision软件,新建一个工程,新建一个工程文件。
将文件添加到工程中并编译,如有错,请更改直到编译成功,如有错,请更改直到编译成功4.用编程器将生成的HEX文件烧写到单片机中,或用STC单片机专用的串口烧写软件,通过MAX232串口烧写到单片机中(只能用于STC单片机)。
或用仿真器来执行程序,将程序下载到仿真器中,具体方法请参考仿真器的使用一节。
用编程器将生成的HEX文件烧写到单片机中。
5.程序下完后可以看到液晶屏有温度显示,用手掌覆盖红外传感器上方2cm处,看到此时液晶屏温度即为手掌的表面温度。
6.按下1键可以看到数码管显示,用手掌覆盖红外传感器上方2cm处,看到此时数码管温度即为手掌的表面温度。
此时液晶屏温度保持不变。
7.按下除1键其他键,此时液晶屏又重新显示温度。
实验代码如下://----------------------------//说明:显示分为2部分:数码管显示,液晶屏显示//按1键数码管显示,此时液晶屏保持静止//复位时或按除1键外其他键时,液晶屏显示,数码管熄灭//-------------------------------------------------------------------------#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define Nack_number 10//**************端口定义************************************************** uchar flag;//LCD控制线接口sbit RS=P0^6;//RS端sbit RW=P0^7;//读写端sbit LCDE=P3^5;//使能端//mlx90614端口定义sbit SCK=P3^7;//时钟线sbit SDA=P3^6;//数据线sbit DPY1=P3^2;//温度显示第1个数码管段选sbit DPY2=P3^3;//温度显示第2个数码管段选sbit DPY3=P3^4;//温度显示第3个数码管段选sbit row1=P0^3;//矩阵键盘第1列sbit row2=P0^4;//矩阵键盘第2列sbit row3=P0^5;//矩阵键盘第3列sbit cow1=P0^0;//矩阵键盘第1行sbit cow2=P0^1;//矩阵键盘第2行sbit cow3=P0^2;//矩阵键盘第3行//************数据定义**************************************************** bdata uchar flag1;//可位寻址数据sbit bit_out=flag1^7;sbit bit_in=flag1^0;uchar temp H,temp L,err;void CALTEMP(uint TEMP);void Read Key(void);void init Int();void delay1(uint z);void show();uchar key_num;uchar mah[5];/********数码管码值定义*******************************************************/ 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,c100ms;//定时毫秒数//**************************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//光标闪动#define 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 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 0x4074 16500 0.01/单元-40 125*/#define Line Obj1Temp Addr 0x07 //目标温度,红外温度/*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 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(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(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扫描一次键盘{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);//显示温度Print("^C");//显示摄氏度delay(100000);//延时再读取温度显示}}}void Print(uchar *str) //字符串显示程序{while(*str!='\0') //直到字符串结束{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 度{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); //显示温度小数点后第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 位数不等于0{dat_wrt(0x30+b/10); //显示温度小数点后第1 位数dat_wrt(0x30+b%10); //显示温度小数点后第2 位数}else //温度小数点后第1 位数等于0{dat_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;}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;}else{A7=0;A8=b;}}mah[4]=A4;mah[3]=A5;mah[2]=A6;mah[1]=A7;mah[0]=A8; }//------------------------------void start(void) //停止条件是SCK=1 时,SDA 由1 到0 {SDA=1;delay(4);SCK=1;delay(4);SDA=0;delay(4);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<8;i++) //8 位依次发送{if(dat&0x80) //取最高位{bit_out=1; //发1}else{bit_out=0; //发0}send_bit(); //发送一个位dat=dat<<1; //左移一位}read_bit(); //接收1 位应答信号if(bit_in==1) //无应答时重发{stop();if(n!=0){n--; //可以重发Nack_number=10 次goto Repeat; //重发}else{goto exit; //退出}}else{goto exit;}Repeat:start(); //重新开始goto Send_again; //重发exit: ; //退出}//-----------发送一个位--------- void send_bit(void){if(bit_out==1){SDA=1; //发1}else{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; //初值为0 for(i=0;i<8;i++){dat=dat<<1; //左移read_bit(); //接收一位if(bit_in==1){dat=dat+1; //为1 时对应位加1}SDA=0; //发送应答信号0send_bit();return dat; //带回接收数据}//----------接收一个位----------void read_bit(void){SDA=1; //数据端先置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(); //开始条件Send Byte(0x00); //发送从地址00 RS=0; //指向指令寄存器Send Byte(0x07); //发送命令start(); //开始条件Send Byte(0x01); //读从地址00bit_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);}//******************LCD 显示子函数***********************void init1602(void) //初始化LCD{cmd_wrt(0x01); //清屏cmd_wrt(0x0c); //开显示,不显示光标,不闪烁cmd_wrt(0x06); //完成一个字符码传送后,光标左移,显示不发生移位cmd_wrt(0x38); //16×2 显示,5×7 点阵,8 位数据接口}void busy(void) //LCD 忙标志判断{flag=0x80; //赋初值高位为1 禁止while(flag&0x80) //读写操作使能位禁止时等待继续检测{P1=0xff;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=0XC0; //指向第二行LCDE=1; //高电平有效LCDE=0;}RS=1; //指向数据寄存器RW=0; //写P1=dat; //写数据LCDE=1; //高电平有效LCDE=0;}//------------延时--------------void delay(uint n){uint j;for(j=0;j<n;j++){_nop_();}}//------------定时器初始化函数---------------- void init Int(){TMOD = 0x10; //定时器1 方式1TH1=(65536-1000)/256; //定时器1 设置1ms 定时TL1=(65536-1000)%256;EA=1; //开总中断ET1 = 1; //开定时器T1 中断TR1 = 1; //启动定时器T1}//------------定时器中断处理函数-------------------void timer1handle() interrupt 3 //定时器3 1ms 中断{TH1=(65536-1000)/256;TL1=(65536-1000)%256;c20ms++;c100ms++;if(c20ms >= 20) //20ms 计时器{c20ms = 0;b20ms = 1;}if(c100ms >= 50) //100ms 计时器{c100ms = 0;b100ms = 1;}}//--------------------------温度显示函数------------------------void show(){DPY1=0;P2=LED01[mah[3]]; //转换8 位数显示,不带小数点的delay1(2);P2=0x FF;DPY1=1;DPY2=0;P2=LED02[mah[2]]; //转换8 位数显示,带小数点的delay1(2);P2=0x FF;DPY2=1;DPY3=0;P2=LED01[mah[1]]; //转换8 位数显示,不带小数点的delay1(2);P2=0x FF;DPY3=1;}void Read Key(void){row1=0; //矩阵键盘第1 列,将第一列拉低,扫描是否有按键按下,第一列按键括:1,4,7 row2=1; //矩阵键盘第2 列row3=1; //矩阵键盘第3 列cow1=1; //矩阵键盘第1 行cow2=1; //矩阵键盘第2 行cow3=1; //矩阵键盘第3 行_nop_(); //延时函数if(!(cow1&cow2&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,8 row2=0; //矩阵键盘第2 列row3=1; //矩阵键盘第3 列cow1=1; //矩阵键盘第1 行cow2=1; //矩阵键盘第2 行cow3=1; //矩阵键盘第3 行_nop_(); //延时函数if(!(cow1&cow2&cow3)) //如果有键按下,就返回,且判断是那个键值,否则继续扫描下一列{if(cow1==0)key_num=2;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&cow2)) //如果有键按下,就返回,且判断是那个键值,否则继续扫描下一列{if(cow1==0)key_num=3;if(cow2==0)key_num=6;return;}}//--------------数码管显示延时函数-----------------------------------------------------void delay1(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}。
红外测温传感器
红外测温在石油化工行业当中的应用
石化企业各种各样的设备,特别是大多数设备往往会处于高温, 高压,腐蚀,氧化的恶劣工况下,同时其有着工作周期长,维修时 间短的特点,特别是往往一旦运行就会长时间不中断,我们往往需 要同时把握所有这些设备的运行状态,从而能够根据实际情况排出 一个检验的计划,红外测温仪将是你最佳的选择。
MLX90614 子程序设计 ——收发字节子程序
MLX90614 发送和接收数据 的单位是字节,发送数据时是按 位发送,发送八次就发送了一个 字节,也就是一个单位。之后看 MCU 有无返回信号,若 MCU 给传感器应答信号,则如上继续 发送下一个字节。若没有应答信 号,则尝试反复发送这个字节, 直到接收到应答。若重复多次始 终无应答,则结束数据发送。
红外测温传感器的原理及应用
红外测温原理 红外温度传感器介绍(MLX90614) 红外温度传感器的应用
红外温度传感器介绍(MLX90614)
模块简介
MLX90614 系列模块是一组通用的红外测温模块。 在出厂前该模块已进行校验及线性化,具有非接触、体积 小、精度高,成本低等优点。被测目标温度和环境温度能 通过单通道输出,并有两种输出接口,适合于汽车空调、 室内暖气、家用电器、手持设备以及医疗设备应用等。
MXL90614[1]
MLX90614 family
Thanks to the low noise amplifier, high resolution 17-bit ADC and powerful DSP unit of MLX90302 high accuracy and resolution of the thermometer is achieved. The calculated object and ambient temperatures are available in RAM of MLX90302 with resolution of 0.01 ˚C. They are accessible by 2 wire serial SMBus compatible protocol (0.02° C resolution) or via 10-bit PWM (Pulse Width Modulated) output of the device. The MLX90614 is factory calibrated in wide temperature ranges: -40…125 ˚C for the ambient temperature and -70…382.19 ˚C for the object temperature. The measured value is the average temperature of all objects in the Field Of View of the sensor. The MLX90614 offers a standard accuracy of ±0.5ºC around room temperatures. A special version for medical applications exists offering an accuracy of ±0.1ºC in a limited temperature range around the human body temperature. It is very important for the application designer to understand that these accuracies are only guaranteed and achievable when the sensor is in thermal equilibrium and under isothermal conditions (there are no temperature differences across the sensor package). The accuracy of the thermometer can be influenced by temperature differences in the package induced by causes like (among others): Hot electronics behind the sensor, heaters/coolers behind or beside the sensor or by a hot/cold object very close to the sensor that not only heats the sensing element in the thermometer but also the thermometer package. This effect is especially relevant for thermometers with a small FOV like the -XXC and -XXF as the energy received by the sensor from the object is reduced. Therefore, Melexis has introduced the -XCX version of the MLX90614. In these MLX90614-XCX, the thermal gradients are measured internally and the measured temperature is compensated for them. In this way, the –XCX version of the MLX90614 is much less sensitive to thermal gradients, but the effect is not totally eliminated. It is therefore important to avoid the causes of thermal gradients as much as possible or to shield the sensor from them. As a standard, the MLX90614 is calibrated for an object emissivity of 1. It can be easily customized by the customer for any other emissivity in the range 0.1…1.0 without the need of recalibration with a black body. The 10-bit PWM is as a standard configured to transmit continuously the measured object temperature for an object temperature range of -20…120 ˚C with an output resolution of 0.14 ˚C. The PWM can be easily customized for virtually any range desired by the customer by changing the content of 2 EEPROM cells. This has no effect on the factory calibration of the device. The PWM pin can also be configured to act as a thermal relay (input is To), thus allowing for an easy and cost effective implementation in thermostats or temperature (freezing / boiling) alert applications. The temperature threshold is user programmable. In a SMBus system this feature can act as a processor interrupt that can trigger reading all slaves on the bus and to determine the precise condition. The thermometer is available in 2 supply voltage options: 5V compatible or 3V (battery) compatible. The 5V can be easily adopted to operate from a higher supply voltage (8…16V, for example) by use of few external components (refer to “Applications information” section for details). An optical filter (long-wave pass) that cuts off the visible and near infra-red radiant flux is integrated in the package to provide ambient and sunlight immunity. The wavelength pass band of this optical filter is from 5.5 till 14µm.
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1. 通过本实验掌握MLX90614 的原理。
2. 通过实验掌握数码管基本原理3、通过实验掌握矩阵键盘的使用4. 通过实验掌握1602 的使用二.实验内容通过MLX90614 非接触式测得物体温度三.实验器材1、主控屏+5V 电源2、DCP-PRJO缸外测温仪四.实验原理图五.实验步骤1. 接上电源2、运行Keil u Vision 软件,新建一个工程,新建一个工程文件。
将文件添加到工程中并编译如有错,请更改直到编译成功,如有错,请更改直到编译成功4、用编程器将生成的HEX文件烧写到单片机中,或用STC单片机专用的串口烧写软件,通过MAX232串口烧写到单片机中(只能用于STC单片机)。
或用仿真器来执行程序,将程序下载到仿真器中,具体方法请参考仿真器的使用一节。
用编程器将生成的HEX文件烧写到单片机中。
5、程序下完后可以瞧到液晶屏有温度显示,用手掌覆盖红外传感器上方2cm 处,瞧到此时液晶屏温度即为手掌的表面温度。
6. 按下1 键可以瞧到数码管显示,用手掌覆盖红外传感器上方2cm 处,瞧到此时数码管温度即为手掌的表面温度。
此时液晶屏温度保持不变。
7. 按下除1 键其她键,此时液晶屏又重新显示温度。
实验代码如下:// // 说明:显示分为2 部分:数码管显示,液晶屏显示// 按1 键数码管显示,此时液晶屏保持静止// 复位时或按除1 键外其她键时,液晶屏显示,数码管熄灭// ------------------------------------------------------------------------ #include<reg52 、h>#include<intrins 、h> #define uint unsigned int #define uchar unsigned char #define Nack_number 10//* ************* 端口定义**************************************************uchar flag;//LCD 控制线接口sbit RS=P09〃RS 端sbit RW=P0A7;// 读写端sbit LCDE=P3A5;〃使能端//mlx90614 端口定义sbit SCK=P3A7;〃时钟线sbit SDA=P3A6;〃数据线sbit DPY1=P3A2;// 温度显示第 1 个数码管段选sbit DPY2=P3A3;// 温度显示第 2 个数码管段选sbit DPY3=P3A4;// 温度显示第 3 个数码管段选sbit row1=P0A3;// 矩阵键盘第1 列sbit row2=P0A4;// 矩阵键盘第2 列sbit row3=P0A5;// 矩阵键盘第3 列sbit cow1=P0A0;// 矩阵键盘第1 行sbit cow2=P0A1;// 矩阵键盘第2 行sbit cow3=P0A2;〃矩阵键盘第 3行 //************ 数据定义 **************************************************** bdata uchar flag1;// 可位寻址数据sbit bit_out=flag1A 7;s bit bit_i n=flag1A 。
; uchar temp H,temp L,err; void CALTEMP(uint TEMP); void Read Key(void);void init Int();void delay1(uint z);void show(); uchar key_num;uchar mah[5]; /******** 数码管码值定义 *******************************************************/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,c100ms;〃 定时毫秒数***************************************************** #defineLCD_COMMAND 0//命令 #define LCD_DATA 1//数据#define LCD_CLEAR_SCREEN 0x/0/ 1清屏#define LCD_HOMING 0x02/ 光标返回原点// 设置显示模式 *******0x08+********************************************* #define LCD_SHOW 0x04/ 显示开一.实验目的#define LCD HIDE 0x00//显示关#define LCD_CURSOR 0x0/2/ 显示光标#defi ne LCD_NO_CURSOR 0x00/无光标#define LCD_FLASH 0x0/1/ 光标闪动//* ************************ *LCD1602*********************************** //向LCD 写入命令或数据#defi ne LCD_NO_FLASH 0x00//光标不闪动// 设置输入模式**********0x04+******************************************** #define LCD_AC_UP 0x02// 光标右移AC+#defi ne LCD_AC_DOWN 0x00// 默认光标左移AC-#define LCD_MOVE 0x01// 画面可平移#defi ne LCD_NO_MOVE 0x00// 默认画面不移动//**************************mlx90614***********************************//command mode 命令模式#define Ram Access 0x00// 对RAM 操作#define Eepom Access 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 0x4074 16500 0 、01/单元-40 125*/#define Line Obj1Temp Addr 0x07 // 目标温度,红外温度/*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 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(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(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();// 初始化LCD while(1){while(b100ms)// 每100ms 扫描一次键盘{ 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);// 显示温度Print("9");〃显示摄氏度delay(100000);// 延时再读取温度显示}}}void Print(uchar *str) // 字符串显示程序{ while(*str!='\0') // 直到字符串结束{ 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 度{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); // 显示温度小数点后第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 位数不等于0 {dat_wrt(0x30+b/10); // 显示温度小数点后第1 位数dat_wrt(0x30+b%10); // 显示温度小数点后第2 位数}else // 温度小数点后第1 位数等于0{dat_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;}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;}else{A7=0;A8=b;}}mah[4]=A4;mah[3]=A5;mah[2]=A6;mah[1]=A7;mah[0]=A8; }// -----------------------------void start(void) // 停止条件就是{SCK=1 时,SDA 由1 至U 0 SDA=1; delay(4);SCK=1; delay(4);SDA=0; delay(4);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<8;i++) { if(dat&0x80) { bit_out=1; } else{ bit_out=0;} send_bit();dat=dat<<1;} read_bit(); 应答信号if(bit_in==1) // 无应答时重发stop();if(n!=0){n--; // 可以重发Nack_number=10 次//8 位依次发送// 取最高位// 发1// 发0// 发送一个位// 左移一位// 接收1 位goto Repeat; // 重发}else{goto exit; // 退出}}else{goto exit;}Repeat:start(); // 重新开始goto Send_again; // 重发exit: ; // 退出}// ---------- 发送一个位 ------ void send_bit(void){if(bit_out==1){SDA=1; // 发1}else{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;i<8;i++){dat=dat<<1; // 左移read_bit(); // 接收一位if(bit_in==1){dat=dat+1; // 为 1 时对应位加 1}SDA=0; // 发送应答信号 0send_bit();return dat; // 带回接收数据}// --------- 接收一个位 ------void read_bit(void){SDA=1; // 数据端先置 1bit_in=1;SCK=1; // 上升沿delay(4);delay(4);bit_in=SDA; // 读数据bit_out=1;_nop_();SCK=0;delay(4);delay(4);}// -----------------------uint readtemp(void){SCK=0;start();Send Byte(0x00);Send Byte(0x07); start();Send Byte(0x01);bit_out=0; temp L=Read Byte();bit_out=0; tempH=Read Byte();// 开始条件// 发送从地址 00 RS=0;// 发送命令// 指向指令寄存器// 开始条件// 读从地址 00// 读数据低字节// 读数据高字节RS=0; // 指向命令计数器err=Read Byte();// 读错误信息码stop(); // 停止条件return(temp H*256+temp L);//* **************** *LCD显示子函数 *********************** void init1602(void){ cmd_wrt(0x01);// 初始化 LCD// 清屏 cmd_wrt(0x0c); cmd_wrt(0x06); // 完成一个字符码传送后 ,光标左移 ,显示不发生移位cmd_wrt(0x38); 〃16 X 2显示,5X 7点阵,8位数据接口void busy(void){ flag=0x80; while(flag&0x80)//LCD 忙标志判断// 赋初值高位为 1 禁止// 读写操作使能位禁止时等待继续检测 {P1=0xff;RS=0; // 指向地址计数器 RW=1;// 读 LCDE=1;// 信号下降沿有效 flag=P1; // 读状态位高位为状态LCDE=0; } }LCDE=0;busy();// 检测读写操作使能不 P1=cmd; // 命令// 开显示 ,不显示光标 ,不闪烁}void cmd_wrt(uchar cmd) // 写命令子函数 {RW=0;LCDE=1;LCDE=0; } void dat_wrt(uchar dat)// 写数据子函数 {busy();// 检测读写操作使能不 LCDE=0;if(flag==16) { RS=0; // 指向指令寄存器RW=0;// 写P1=0XC0;// 指向第二行LCDE=1;// 高电平有效LCDE=0;}RS=1;// 指向数据寄存器 RW=0;// 写 P1=dat;// 写数据 LCDE=1;// 高电平有效 LCDE=0;}// ----------- 延时 --------void delay(uint n){uint j;for(j=0;j<n;j++){ _nop_();}}// ----------- 定时器初始化函数 -----------void init Int(){TMOD = 0x10; // 定时器 1 方式 1// 写 // 高电平有效TH1=(65536-1000)/256;TL1=(65536-1000)%256;EA=1;ET1 = 1; // 开定时器 T1 中断TR1 = 1; // 启动定时器 T1 } // ----------- 定时器中断处理函数 -------------void timer1handle() interrupt 3 // 定时器 3 1ms 中断{TH1=(65536-1000)/256; TL1=(65536-1000)%256; c20ms++; c100ms++; if(c20ms >= 20) // 20ms 计时器{ c20ms = 0; b20ms = 1; } if(c100ms >= 50) //100ms 计时器 {c100ms = 0;b100ms = 1; } } // ------------------------- 温度显示函数 ----------------void show() { DPY1=0; P2=LED01[mah[3]]; // 转换 8 位数显示 ,不带小数点的 delay1(2); P2=0x FF; DPY1=1; DPY2=0; P2=LED02[mah[2]]; // 转换 8 位数显示 , 带小数点的 delay1(2); P2=0x FF; DPY2=1;// 定时器 1 设置 1ms 定时 // 开总中断DPY3=0;P2=LED01[mah[1]];delay1(2);P2=0x FF;DPY3=1;}void Read Key(void) {row1=0; row2=1; row3=1; cow1=1; cow2=1; cow3=1; _nop_(); // 矩阵键盘第1 列,将第一列拉低,扫描就是否有按键按下,第一列按键括:1,4,7 // 矩阵键盘第2 列// 矩阵键盘第3 列// 矩阵键盘第1 行// 矩阵键盘第2 行// 矩阵键盘第3 行// 延时函数if(!(cow1&cow2&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,8 row2=0;row3=1;cow1=1;cow2=1;cow3=1; _nop_();// 矩阵键盘第2 列// 矩阵键盘第3 列// 矩阵键盘第1 行// 矩阵键盘第2 行// 矩阵键盘第3 行// 延时函数if(!(cow1&cow2&cow3)) // 如果有键按下,就返回,且判断就是那个键值,否则继续扫描下一列{ if(cow1==0)key_num=2;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&cow2)) //如果有键按下,就返回,且判断就是那个键值,否则继续扫描下一列{// 转换8 位数显示, 不带小数点的if(cow1==0)key_num=3;if(cow2==0)key_num=6;return;}}// ------------- 数码管显示延时函数----------------------------------- void delay1(uint z) { uint x,y;for(x=z;x>0;x--) for(y=110;y>0;y--);}。