标题:
MLX90614非接触式红外体温计的单片机驱动程序
[打印本页]
作者:
啊哈哈嗝
时间:
2020-4-5 00:30
标题:
MLX90614非接触式红外体温计的单片机驱动程序
非接触式红外体温计
单片机源程序如下:
#include<reg52.h>
#include"MLX906.h"
#include"LCD1602.h"
#include"EEPROM.h"
#include"I2C.h"
#include"WT558D.h"
#include"USART.h"
sbit red =P3^3;
sbit green =P3^4;
sbit blue =P3^5;
sbit key =P3^6;
uchar tab[] ="Temp:";
int main()
{
uchar i;
uint wendu; //存储读取的值
uint xiaoshu,zhengshu; //存储小数和整数
uchar ge,shi,bai,fyi,fer; //存储个,十,百,分数的第一位,分数的第二位
double num;
UsartInit();
Lcd_init();
for(i=0;i<5;i++)
{
write_data(tab[i]);
}
bai = EEPROM_read_data(0);
shi = EEPROM_read_data(1);
ge = EEPROM_read_data(2);
fyi = EEPROM_read_data(3);
fer = EEPROM_read_data(4);
if(bai!=0)
{
write_data(bai+0x30);
}
write_data(shi+0x30);
write_data(ge+0x30);
write_data(0x2e);
write_data(fyi+0x30);
write_data(fer+0x30);
write_data(0xdf);
write_data('C');
write_com(0x85);
key=1;
while(1)
{
if(key==0)
{
delay(10);
if(key==0)
{
wendu=read_temp();
wendu=wendu*2;
if(wendu>=27315)
{
wendu=wendu-27315+530; //530是进行温度补偿
zhengshu=wendu/100; //整数部分
xiaoshu=wendu-zhengshu*100; //小数部分
bai = zhengshu/100;
shi = zhengshu%100/10;
ge = zhengshu%10;
fyi = xiaoshu/10;
fer = xiaoshu%10;
num = wendu*1.0/100;
EEPROM_write_data(0,bai);
delay(20);
EEPROM_write_data(1,shi);
delay(20);
EEPROM_write_data(2,ge);
delay(20);
EEPROM_write_data(3,fyi);
delay(20);
EEPROM_write_data(4,fer);
delay(20);
}
if(bai!=0)
{
write_data(bai+0x30);
}
write_data(shi+0x30);
write_data(ge+0x30);
write_data(0x2e);
write_data(fyi+0x30);
write_data(fer+0x30);
write_data(0xdf);
//write_data('C');
}while(!key);
write_com(0x85);
if(num<36.0)
{
blue = 0;
red = 1;
green = 1;
}
else if(num>=36.0&&num<=38.0)
{
green = 0;
red = 1;
blue = 1;
}
else if(num>38.0)
{
red = 0;
green =1;
blue = 1;
}
//语音播报
Send_oneline(shi*10);
WT558D_Delay1ms(500);
if(ge!=0)
{
Send_oneline(ge);
WT558D_Delay1ms(300);
}
Send_oneline(56);
WT558D_Delay1ms(300);
Send_oneline(fyi);
WT558D_Delay1ms(300);
Send_oneline(fer);
WT558D_Delay1ms(600);
if(num<36.0)
{
Send_oneline(58);
}
else if(num>=36.0&&num<=38.0)
{
Send_oneline(59);
}
else if(num>38.0)
{
Send_oneline(57);
}
}
}
}
//串口中断
void serial() interrupt 4
{
uint wendu; //存储读取的值
uint xiaoshu,zhengshu; //存储小数和整数
uchar ge,shi,bai,fyi,fer; //存储个,十,百,分数的第一位,分数的第二位
double num;
uchar start = Usart_Read();
if(start =='s')
{
wendu=read_temp();
wendu=wendu*2;
if(wendu>=27315)
{
wendu=wendu-27315+530; //530是进行温度补偿
zhengshu=wendu/100; //整数部分
xiaoshu=wendu-zhengshu*100; //小数部分
bai = zhengshu/100;
shi = zhengshu%100/10;
ge = zhengshu%10;
fyi = xiaoshu/10;
fer = xiaoshu%10;
Usart_Write(shi+0x30);
Usart_Write(ge+0x30);
Usart_Write('.');
Usart_Write(fyi+0x30);
Usart_Write(fer+0x30);
num = wendu*1.0/100;
EEPROM_write_data(0,bai);
delay(20);
EEPROM_write_data(1,shi);
delay(20);
EEPROM_write_data(2,ge);
delay(20);
EEPROM_write_data(3,fyi);
delay(20);
EEPROM_write_data(4,fer);
delay(20);
}
if(bai!=0)
{
write_data(bai+0x30);
}
write_data(shi+0x30);
write_data(ge+0x30);
write_data(0x2e);
write_data(fyi+0x30);
write_data(fer+0x30);
write_data(0xdf);
//write_data('C');
}while(!key);
write_com(0x85);
if(num<36.0)
{
blue = 0;
red = 1;
green = 1;
}
else if(num>=36.0&&num<=38.0)
{
green = 0;
red = 1;
blue = 1;
}
else if(num>38.0)
{
red = 0;
green =1;
blue = 1;
}
//语音播报
Send_oneline(shi*10);
WT558D_Delay1ms(500);
if(ge!=0)
{
Send_oneline(ge);
WT558D_Delay1ms(300);
}
Send_oneline(56);
WT558D_Delay1ms(300);
Send_oneline(fyi);
WT558D_Delay1ms(300);
Send_oneline(fer);
WT558D_Delay1ms(600);
if(num<36.0)
{
Send_oneline(58);
}
else if(num>=36.0&&num<=38.0)
{
Send_oneline(59);
}
else if(num>38.0)
{
Send_oneline(57);
}
}
复制代码
所有资料51hei提供下载:
总程序.rar
(73.09 KB, 下载次数: 53)
2020-4-5 00:30 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
admin
时间:
2020-4-6 01:34
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
作者:
tiaoshen
时间:
2020-7-30 11:30
有成套的干货就好了
作者:
吾心悦汝
时间:
2020-9-2 20:56
原理图有木有?草图也行呀
作者:
aking991
时间:
2020-9-3 10:05
我有个疑问了解一下,第1是这个程序是51单片机是吗?如是的话你在中断里有个定义双精度的变量,请问此单片机支持吗?第2是你中断里处理太多事了,我建议中断里作的事情越短越好,把事情放在主函数里去作,这样效率会高点。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1