标题:
51单片机MLX90614红外温度计源程序
[打印本页]
作者:
老古董2号
时间:
2020-9-20 22:34
标题:
51单片机MLX90614红外温度计源程序
/***********************************************************
*
* 功能:利用MLX90614实现红外测温
*
* 平台:keil5 + STC89C52
*
* 作者:辟邪居士
*
*
* 日期:2020年9月19
*
************************************************************/
#include"reg52.h"
#include"intrins.h"
//************************************
#define uint unsigned int
#define uchar unsigned char
#define delay_5t {_nop_();_nop_();_nop_();\
_nop_();_nop_();} //延时5个机器周期
# define LcdDB P0
//************** 端口定义**************
//LCD 控制线接口
uchar flag1;
sbit LcdRS=P2^6;
sbit LcdRW=P2^5;
sbit LcdEN=P2^7;
//************ 函数声明*****************************************
void delay(uint N); //延时程序
void LCD_show(uchar x,uchar y);
void LcdBusy();
void LcdwrDat(uchar dat);
void LcdwrCmd(uchar cmd);
void LCD_init ();
void display(uint Tem); // 显示子程序
bit SMB_ack(); //应答信号
//*************主函数*******************************************
//mlx90614 端口定义
sbit SCL=P1^1;// 时钟线
sbit SDA=P1^2;// 数据线
//************ 数据定义****************
bdata uchar flag; //可位寻址数据
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar TeL; //温度低八位
uchar TeH; //温度高八位
uchar PEC;
uint TEP; //存储温度
void Delay10us() //@11.0592MHz
{
unsigned char i;
i = 2;
while (--i);
}
void SMBus_Start() //开始信号
{
SDA = 1;
delay_5t;
SCL = 1;
delay_5t;
SDA = 0;
delay_5t;
SCL = 0;
delay_5t;
}
void SMBus_Stop() //停止信号
{
SCL = 0;
delay_5t;
SDA = 0;
delay_5t;
SCL = 1;
delay_5t;
SDA = 1;
}
bit SMBus_writer(uchar DAT) //写一个字节
{
uchar i;
uchar temp; //缓存寄存器
bit ack; //定义位变量,反馈应答信号
temp = DAT; //待发送字节存入缓冲寄存器
for(i = 0;i < 8;i++) //循环发送8位数据
{
SCL = 0; //拉低时钟线
if((temp&0x80)==0x80) //判断temp的高位是0还是1
SDA=1;
else
SDA=0; //送出相应数据
delay_5t ; //延时5个机器周期
SCL = 1; //拉低时钟线
temp = temp << 1; //待发送数据左移一位
delay_5t ; //延时5个机器周期
}
SCL = 0; //拉低时钟线
ack = SMB_ack(); //调用应答信号检测子函数
return ack; //返回检测到的应答信号
}
/*
bit SMBus_writer(uchar dat)
{
bit ack1;
uchar i;
SCL = 0;
for(i=0;i<8;i++)
{
Delay10us();
SDA = dat >> 7; //将发送的数据右移7位
dat = dat << 1; //将发送的数据左移1位
SCL = 1;
Delay10us();
SCL = 0;
}
SDA = 1;
Delay10us();
SCL = 1;
while(SDA) //等待从机应答信号,超过2000us,返回
{
uint j;
j++;
if(j>2000)
{
SCL = 0;
Delay10us();
return 0;
}
}
ack1 = SMB_ack();
return ack1;
}
*/
/*
//---------- 接收一个位----------
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_();
}
//-----------发送一个位---------
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_();
}
//---------- 接收一个字节--------
uchar rx_byte(void)
{
uchar 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 send_bit(void) //发送一位
{
if(bit_out==0)
SDA=0;
else
SDA=1;
SCL=1;
delay_5t;
SCL=0;
delay_5t;
}
uchar rx_byte() //读一个字节
{
uchar i;
uchar dat;
SDA = 1;
_nop_();_nop_();
for(i=0;i<8;i++)
{
SCL = 1;
_nop_();
dat = dat << 1;
dat|=SDA;
_nop_();
SCL = 0;
_nop_();
}
send_bit(); //主设备向从设备发送应答
return dat;
}
bit SMB_ack() //IIC应答
{
bit ack;
SDA = 1;
Delay10us();
SCL = 1;
Delay10us();
SCL =0;
ack = SDA;
return ack;
}
uint MLX90614()
{
SMBus_Start(); //开始信号
SMBus_writer(0x00); //写从设备地址
SMBus_writer(0x07); //写命令
SMBus_Start(); //重新开始
SMBus_writer(0x01); //写地址
TeL = rx_byte(); //读取温度
TeH = rx_byte();
PEC = rx_byte();
SMBus_Stop();
TEP = (TeH*256)+TeL;
//TEP = TEP * 0.02 -273.15;
return TEP;
}
void main()
{
uint Tem;
SCL=1;
SDA=1;
delay_5t;
SCL=0;
delay(1000);
SCL=1;
LCD_init (); //LCD初始化
LCD_show(1,1); //LCD显示的位置
while(1)
{
Tem = MLX90614();
display(Tem);
delay(20);
}
}
//*********输入转换并显示*********
void display(uint Tem)
{
uint YEP;
uint a,b;
YEP = Tem * 0.02 - 273.15;
LcdwrCmd(0x01); //清屏
a = YEP /10; //十位
LcdwrDat(0x30+a); //显示字符串
b = YEP %10; //个位
LcdwrDat(0x30+b); //显示字符串
}
//************************************
//------------ 延时--------------
void delay(uint N)
{
uint i;
for(i=0;i<N;i++)
_nop_();
}
//------------------------------
//******************LCD 显示子函数***********************
void LCD_init ()
{
LcdwrCmd(0x38);
LcdwrCmd(0x0C);
LcdwrCmd(0x06);
LcdwrCmd(0x01);
}
void LcdwrCmd(uchar cmd)
{
LcdBusy();
LcdRS = 0;
……………………
…………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
全部源程序:
51单片机MLX90614红外温度计.zip
(40.27 KB, 下载次数: 165)
2020-9-20 22:34 上传
点击文件名下载附件
51单片机MLX90614红外温度计
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1