江苏理工学院毕业设计说明书(论文)
第4章 软件模块设计
本次设计的是基于单片机的非接触式体温计,秉承的是从局部到整体的设计方案,将复杂的问题简单化,将复杂的问题分别一一解决。本次设计采用KELL软件编程,接通电源单片机自动复位,程序进行工作,红外传感器进行红外测温,将测得的温度在液晶显示屏上显示采集到的数据。当采集到的温度大于所设置的温度值的时候则进行温度报警,LED显示灯亮则表示温度报警。主程序流程图如图4-1所示。
图4-1主程序流程图
第 17 页 共 61 页
江苏理工学院毕业设计说明书(论文)
4.1红外测温模块
4.1.1红外测温模块分析
MLX90615红外传感器的默认的地址为5BH,单片机能够通过从地址来访问MLX90615。MLX90615传感器的发送与接收数据都是以字节为单位,每当发送一个字节,系统做出判断,判断是否有回应,要是有回应则进行下一个字节,若是没有回应,重复的发送这个字节,一直到接收为止。MLX90615红外传感器与单片机通过SMBus协议进行数据传输。此时单片机为设备,MLX90615为从设备,主设备向从设备进行数据传输。MLX90615中有16个字长为16的存储单元,地址为0H~FH,6H和7H中分别储存了环境的温度和物体的温度,物体的温度可以通过T0=RAM×0.02-273.15来得出。 4.1.2软件程序
图4-3测温流程图。
图4-3 红外测温流程图
第 18 页 共 61 页
江苏理工学院毕业设计说明书(论文)
程序:
#include \#include \#include \#include \
#define _NOP() _nop_() // 5us
void delay_Tbuf() { }
void delay_Thd() { }
void MLX90615_init(void) {
mSDA_OUT; // Set SDA as Output mSCL_OUT; // Set SCL as Output mSDA_HIGH(); // bus free mSCL_HIGH(); }
第 19 页 共 61 页
//_nop_(); unsigned char a,b; for(b=1;b>0;b--)
for(a=1;a>0;a--);
江苏理工学院毕业设计说明书(论文)
void START_bit(void) {
mSDA_OUT; mSDA_HIGH(); delay_Tbuf();
// Set SDA line
// Wait a few microseconds
// Set SCL line
mSCL_HIGH(); delay_Tbuf();
// Generate bus free time between Stop
// and Start condition (Tbuf=4.7us min)
// Clear SDA line
mSDA_LOW(); delay_Tbuf();
// Hold time after (Repeated) Start
// Condition. After this period, the first clock is
generated. }
void STOP_bit(void) { }
unsigned char TX_byte(unsigned char Tx_buffer)
第 20 页 共 61 页
mSDA_OUT; mSCL_LOW(); delay_Tbuf();
// Clear SCL line
//(Thd:sta=4.0us min)
// Clear SCL line
mSCL_LOW(); delay_Tbuf();
// Wait a few microseconds
// Wait a few microseconds
// Clear SDA line
mSDA_LOW(); delay_Tbuf();
// Wait a few microseconds
// Set SCL line
mSCL_HIGH(); delay_Tbuf();
// Stop condition setup time(Tsu:sto=4.0us min)
// Set SDA line
mSDA_HIGH();
江苏理工学院毕业设计说明书(论文)
{
for(Bit_counter=8; Bit_counter; Bit_counter--) { }
Ack_bit=Receive_bit();
// Get acknowledgment bit
if(Tx_buffer&0x80)
bit_out=1; // If the current bit of Tx_buffer is 1 set bit_out
unsigned char unsigned char unsigned char
Bit_counter; Ack_bit; bit_out;
else
bit_out=0; // else clear bit_out
send_bit(bit_out); Tx_buffer<<=1;
// Send the current bit on SDA // Get next bit for checking
return Ack_bit;
}// End of TX_bite()
unsigned char RX_byte(unsigned char ack_nack) {
unsigned char RX_buffer; unsigned char
for(Bit_Counter=8; Bit_Counter; Bit_Counter--) {
if(Receive_bit()) {
第 21 页 共 61 页
// Get a bit from the SDA line
Bit_Counter;