標題:
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) //寫一個字節(jié)
{
uchar i;
uchar temp; //緩存寄存器
bit ack; //定義位變量,反饋應答信號
temp = DAT; //待發(fā)送字節(jié)存入緩沖寄存器
for(i = 0;i < 8;i++) //循環(huán)發(fā)送8位數據
{
SCL = 0; //拉低時鐘線
if((temp&0x80)==0x80) //判斷temp的高位是0還是1
SDA=1;
else
SDA=0; //送出相應數據
delay_5t ; //延時5個機器周期
SCL = 1; //拉低時鐘線
temp = temp << 1; //待發(fā)送數據左移一位
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; //將發(fā)送的數據右移7位
dat = dat << 1; //將發(fā)送的數據左移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_();
}
//-----------發(fā)送一個位---------
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_();
}
//---------- 接收一個字節(jié)--------
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) //發(fā)送一位
{
if(bit_out==0)
SDA=0;
else
SDA=1;
SCL=1;
delay_5t;
SCL=0;
delay_5t;
}
uchar rx_byte() //讀一個字節(jié)
{
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(); //主設備向從設備發(fā)送應答
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.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1