标题:
单片机MLX90614测温代码
[打印本页]
作者:
821174733
时间:
2021-10-27 16:56
标题:
单片机MLX90614测温代码
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
#include<stdio.h>
#include<intrins.h>
#include "delay.h"
#include "1602.h"
#include "mlx90614.h"
sbit buzzer=P1^0; //引脚定义
sbit key1=P2^0;
sbit key2=P2^1;
unsigned long time_20ms; //定时计数
char dis0[16]; //液晶数组显示暂存
char dis1[16];
unsigned int setNum = 37; //设置值
//---------------------------------------
//Name: CALTEMP
//Temperature data is T=(Data)*0.02-273.15
//---------------------------------------
bit rekey =0;//防止按键重复按下
bit disFlag =0;//更新显示标志
unsigned int Tem; //温度
float objTemp,envTemp; //物体温度和环境温度
void Init_Timer0(void); //函数声明
void main (void)
{
Init_Timer0(); //定时器0初始化
LCD_Init(); //初始化液晶
DelayMs(20); //延时有助于稳定
LCD_Clear();
while (1) //主循环
{
if(disFlag==1) //显示标志
{
Tem=ReadObjectTemp(); //读取实物温度
objTemp=(float)(Tem)*0.02-273.15;
Tem=ReadEnvironTemp(); //读取环境温度
envTemp=(float)(Tem)*0.02-273.15;
sprintf(dis0,"E: %4.1f'C ",envTemp);//打印温度值
LCD_Write_String(0,0,dis0);//显示
sprintf(dis1,"O:%5.1f'C %3d ",objTemp,setNum);//打印温度设置值
LCD_Write_String(0,1,dis1);//显示
if(objTemp>setNum)
{buzzer =0; } //温度高蜂鸣器鸣叫
else
{buzzer=1;} //温度低 停止
disFlag = 0;
}
if((key1 == 0)||(key2 == 0)) //有按键按下
{
if(rekey == 0)
{
DelayMs(10);
if(key1 == 0) //按键1按下
{
rekey =1; //防止重复按下
if(setNum<200) setNum++; //++
}
else if((key2 == 0))//按键2按下
{
rekey =1; //防止重复按下
if(setNum>0) setNum--; //--
}
}
}
else
{
rekey = 0; //防止重复按下
}
}
}
void Init_Timer0(void)
{
TMOD |= 0x01; //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
EA=1; //总中断打开
ET0=1; //定时器中断打开
TR0=1; //定时器开关打开
}
void Timer0_isr(void) interrupt 1
{
TH0=(65536-20000)/256; //重新赋值 20ms
TL0=(65536-20000)%256;
time_20ms++;
if(time_20ms%20==0) //定时更新显示
{disFlag = 1;}
}
复制代码
#include "mlx90614.h"
#define Nack_counter 10
//************数据定义****************
unsigned char bit_out=1;
unsigned char bit_in=1;
unsigned char DataH,DataL,Pecreg;
void start_bit(void)
{
SDA=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void stop_bit(void)
{
SCL=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=1;
}
//---------发送一个字节---------
void tx_byte(unsigned char dat_byte)
{
char i,n,dat;
n=Nack_counter;
dat=dat_byte;
for(i=0;i<8;i++)
{
if(dat&0x80)
bit_out=1;
else
bit_out=0;
send_bit();
dat=dat<<1;
}
receive_bit();
if(bit_in==1)
{
stop_bit();
if(n!=0)
{n--;}
else
return;
}
else
return;
start_bit();
tx_byte(dat_byte); //函数自身回调
}
////---------发送一个字节---------
//void tx_byte(unsigned char dat_byte)
//{
// char i,n,dat;
// n=Nack_counter;
// TX_again:
// dat=dat_byte;
// for(i=0;i<8;i++)
// {
// if(dat&0x80)
// bit_out=1;
// else
// bit_out=0;
// send_bit();
// dat=dat<<1;
// }
// receive_bit();
// if(bit_in==1)
// {
// stop_bit();
// if(n!=0)
// {n--;goto Repeat;}
// else
// goto exit;
// }
// else
// goto exit;
// Repeat:
// start_bit();
// goto TX_again;
// exit: ;
//}
//-----------发送一个位---------
void send_bit(void)
{
if(bit_out==0)
SDA=0;
else
SDA=1;
_nop_();
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//----------接收一个字节--------
unsigned char rx_byte(void)
{
unsigned char i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
receive_bit();
if(bit_in==1)
dat=dat+1;
}
send_bit();
return dat;
}
//----------接收一个位----------
void receive_bit(void)
{
SDA=1;bit_in=1;
SCL=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
bit_in=SDA;
_nop_();
SCL=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//------------------------------
unsigned int ReadObjectTemp(void)
{
start_bit();
tx_byte(0x00); //Send SlaveAddress
tx_byte(0x07); //Send Command
start_bit();
tx_byte(0x01);
bit_out=0;
DataL=rx_byte();
bit_out=0;
DataH=rx_byte();
bit_out=1;
Pecreg=rx_byte();
stop_bit();
return(DataH*256+DataL);
}
unsigned int ReadEnvironTemp(void)
{
start_bit();
tx_byte(0x00); //Send SlaveAddress
tx_byte(0x06); //Send Command
start_bit();
tx_byte(0x01);
bit_out=0;
DataL=rx_byte();
bit_out=0;
DataH=rx_byte();
bit_out=1;
Pecreg=rx_byte();
stop_bit();
return(DataH*256+DataL);
}
//---------------------------------------
//Name: CALTEMP
//Temperature data is T=(Data)*0.02-273.15
//Tem=ReadObjectTemp();
//objTemp=(float)(Tem)*0.02-273.15;
//sprintf(tab_up,"O:%5.2f %05d ",objTemp,Tem);//打印温度值
//LCD_Write_String(0,0,tab_up);//显示第一行
//
//Tem=ReadEnvironTemp();
//envTemp=(float)(Tem)*0.02-273.15;
//sprintf(tab_dw,"E:%5.2f %05d ",envTemp,Tem);//打印温度值
//LCD_Write_String(0,1,tab_dw);//显示第一行
//
//DelayMs(200);
复制代码
1.png
(51.1 KB, 下载次数: 59)
下载附件
2021-10-27 17:15 上传
代码下载:
精准测温MLX90614.zip
(79.45 KB, 下载次数: 47)
2021-10-27 16:55 上传
点击文件名下载附件
下载积分: 黑币 -5
作者:
小林子51
时间:
2023-4-19 17:33
这个是包含温度补偿的吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1