MLX90614红外测温代码文档格式.docx
- 文档编号:22121888
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:25
- 大小:20.17KB
MLX90614红外测温代码文档格式.docx
《MLX90614红外测温代码文档格式.docx》由会员分享,可在线阅读,更多相关《MLX90614红外测温代码文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
//使能端
//mlx90614端口定义
sbitSCK=P3^7;
//时钟线
sbitSDA=P3^6;
//数据线
sbitDPY1=P3^2;
//温度显示第1个数码管段选
sbitDPY2=P3^3;
//温度显示第2个数码管段选
sbitDPY3=P3^4;
//温度显示第3个数码管段选
sbitrow1=P0^3;
//矩阵键盘第1列
sbitrow2=P0^4;
//矩阵键盘第2列
sbitrow3=P0^5;
//矩阵键盘第3列
sbitcow1=P0^0;
//矩阵键盘第1行
sbitcow2=P0^1;
//矩阵键盘第2行
sbitcow3=P0^2;
//矩阵键盘第3行
//************数据定义****************************************************
bdataucharflag1;
//可位寻址数据
sbitbit_out=flag1^7;
s
bitbit_in=flag1^0;
uchartempH,tempL,err;
voidCALTEMP(uintTEMP);
voidReadKey(void);
voidinitInt();
voiddelay1(uintz);
voidshow();
ucharkey_num;
ucharmah[5];
/********数码管码值定义*******************************************************/
ucharcodeLED01[]={//LED显示代码,0-9共阳不带小数点的
0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
ucharcodeLED02[]={//LED显示代码,0-9共阳带小数点的
0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};
/**********全局变量定义******************************************************/
bitb20ms,b100ms;
//定时标志位
ucharc20ms,c100ms;
//定时毫秒数
//**************************LCD1602***********************************
//向LCD写入命令或数据*****************************************************
#defineLCD_COMMAND0//命令
#defineLCD_DATA1//数据
#defineLCD_CLEAR_SCREEN0x01//清屏
#defineLCD_HOMING0x02//光标返回原点
//设置显示模式*******0x08+*********************************************
#defineLCD_SHOW0x04//显示开一.实验目的
#defineLCD_HIDE0x00//显示关
#defineLCD_CURSOR0x02//显示光标
#defineLCD_NO_CURSOR0x00//无光标
#defineLCD_FLASH0x01//光标闪动
#defineLCD_NO_FLASH0x00//光标不闪动
//设置输入模式**********0x04+********************************************
#defineLCD_AC_UP0x02//光标右移AC+
#defineLCD_AC_DOWN0x00//默认光标左移AC-
#defineLCD_MOVE0x01//画面可平移
#defineLCD_NO_MOVE0x00//默认画面不移动
//**************************mlx90614***********************************
//commandmode命令模式
#defineRamAccess0x00//对RAM操作
#defineEepomAccess0x20//对EEPRAM操作
#defineMode0x60//进入命令模式
#defineExitMode0x61//退出命令模式
#defineReadFlag0xf0//读标志
#defineEnterSleep0xff//进入睡眠模式
//ramaddressreadonlyRAM地址(只读)
#defineAbmientTempAddr0x03//周围温度
#defineIR1Addr0x04
#defineIR2Addr0x05
#defineLineAbmientTempAddr0x06//环境温度
/*0x00000x4074165000.01/单元
-40125*/
#defineLineObj1TempAddr0x07//目标温度,红外温度
/*0x27ad-0x7fff0x3559226100.02/单元
-70.01-382.190.01452.2*/
#defineLineObj2TempAddr0x08
//eepomaddressEEPROM地址
#defineTObjMaxAddr0x00//测量范围上限设定
#defineTObjMinAddr0x01//测量范围下限设定
#definePWMCtrlAddr0x02//PWM设定
#defineTaRangeAddr0x03//环境温度设定
#defineKeAddr0x04//频率修正系数
#defineConfigAddr0x05//配置寄存器
#defineSMbusAddr0x0e//器件地址设定
#defineReserverd1Addr0x0f//保留
#defineReserverd2Addr0x19//保留
#defineID1Addr0x1c//ID地址1
#defineID2Addr0x1d//ID地址2
#defineID3Addr0x1e//ID地址3
#defineID4Addr0x1f//ID地址4
//************函数声明*****************************************************
voidstart();
//MLX90614发起始位子程序
voidstop();
//MLX90614发结束位子程序
ucharReadByte(void);
//MLX90614接收字节子程序
voidsend_bit(void);
//MLX90614发送位子程序
voidSendByte(ucharnumber);
voidread_bit(void);
//MLX90614接收位子程序
voiddelay(uintN);
//延时程序
uintreadtemp(void);
//读温度数据
voidinit1602(void);
//LCD初始化子程序
voidbusy(void);
//LCD判断忙子程序
voidcmd_wrt(ucharcmd);
//LCD写命令子程序
voiddat_wrt(uchardat);
//LCD写数据子程序
voiddisplay(uintTem);
//显示子程序
voidPrint(uchar*str);
//字符串显示程序
//*************主函数*******************************************
voidmain()
{
uintTem;
//温度变量
initInt();
SCK=1;
SDA=1;
delay(4);
SCK=0;
delay(1000);
init1602();
//初始化LCD
while
(1)
while(b100ms)//每100ms扫描一次键盘
b100ms=0;
ReadKey();
}
if(key_num==1)//按下1键时,进行数码管显示
Tem=readtemp();
CALTEMP(Tem);
show();
if(key_num!
=1)//液晶屏显示
//读取温度
cmd_wrt(0x01);
//清屏
Print("
Temperature:
"
);
//显示字符串Temperature:
且换行
display(Tem);
//显示温度
^C"
//显示摄氏度
delay(100000);
//延时再读取温度显示
voidPrint(uchar*str)//字符串显示程序
{
while(*str!
='
\0'
)//直到字符串结束
dat_wrt(*str);
//转成ASCII码
str++;
//指向下一个字符
}
//--------------输入转换并显示(用于LCD1602)--------------------
voiddisplay(uintTem)
{
uintT,a,b;
T=Tem*2;
if(T>
=27315)//温度为正
T=T-27315;
//
a=T/100;
//温度整数
b=T-a*100;
//温度小数
if(a>
=100)//温度超过100度
dat_wrt(0x30+a/100);
//显示温度百位
dat_wrt(0x30+a%100/10);
//显示温度十位
dat_wrt(0x30+a%10);
//显示温度个位
}elseif(a>
=10)//温度超过10度
else//温度不超过10度
dat_wrt(0x30+a);
dat_wrt(0x2e);
//显示小数点
if(b>
=10)//温度小数点后第1位数不等于0
dat_wrt(0x30+b/10);
//显示温度小数点后第1位数
dat_wrt(0x30+b%10);
//显示温度小数点后第2位数
else//温度小数点后第1位数等于0
dat_wrt(0x30);
//显示温度小数点后第1位数0
dat_wrt(0x30+b);
else//温度为负
T=27315-T;
b=T-a*100;
dat_wrt(0x2d);
//显示负号
=10)//温度低于负10度
dat_wrt(0x30+a/10);
else//温度高于负10度
//--------------------根据十六进制计算温度--------------------------------------------------------
voidCALTEMP(uintTEMP)
uintT;
uinta,b;
ucharA4,A5,A6,A7,A8;
T=TEMP*2;
=27315)
=100)
A4=a/100;
a=a%100;
A5=a/10;
a=a%10;
A6=a;
elseif(a>
=10)
A4=0;
else
A5=0;
A7=b/10;
b=b%10;
A8=b;
A7=0;
A4=9;
mah[4]=A4;
mah[3]=A5;
mah[2]=A6;
mah[1]=A7;
mah[0]=A8;
}
//------------------------------
voidstart(void)//停止条件是SCK=1时,SDA由1到0
SDA=0;
voidstop(void)//停止条件是SCK=1时,SDA由0到1
//---------发送一个字节---------
voidSendByte(ucharnumber)
uchari,n,dat;
n=Nack_number;
//可以重发次数
Send_again:
dat=number;
for(i=0;
i<
8;
i++)//8位依次发送
if(dat&
0x80)//取最高位
bit_out=1;
//发1
bit_out=0;
//发0
send_bit();
//发送一个位
dat=dat<
<
1;
//左移一位
read_bit();
//接收1位
应答信号
if(bit_in==1)//无应答时重发
stop();
if(n!
=0)
n--;
//可以重发Nack_number=10次
gotoRepeat;
//重发
gotoexit;
//退出
Repeat:
start();
//重新开始
gotoSend_again;
exit:
;
//-----------发送一个位---------
voidsend_bit(void)
if(bit_out==1)
_nop_();
//上升沿
//----------接收一个字节--------
ucharReadByte(void)
uchari,dat;
dat=0;
//初值为0
i++)
//左移
//接收一位
if(bit_in==1)
dat=dat+1;
//为1时对应位加1
//发送应答信号0
returndat;
//带回接收数据
//----------接收一个位----------
voidread_bit(void)
//数据端先置1
bit_in=1;
bit_in=SDA;
//读数据
uintreadtemp(void)
//开始条件
SendByte(0x00);
//发送从地址00RS=0;
//指向指令寄存器
SendByte(0x07);
//发送命令
SendByte(0x01);
//读从地址00
tempL=ReadByte();
//读数据低字节
tempH=ReadByte();
//读数据高字节
err=ReadByte();
//读错误信息码
//停止条件
return(tempH*256+tempL);
//******************LCD显示子函数***********************
voidinit1602(void)//初始化LCD
//清屏
cmd_wrt(0x0c);
//开显示,不显示光标,不闪烁
cmd_wrt(0x06);
//完成一个字符码传送后,光标左移,显示不发生移位
cmd_wrt(0x38);
//16×
2显示,5×
7点阵,8位数据接口
voidbusy(void)//LCD忙标志判断
flag=0x80;
//赋初值高位为1禁止
while(flag&
0x80)//读写操作使能位禁止时等待继续检测
P1=0xff;
RS=0;
//指向地址计数器
RW=1;
//读
LCDE=1;
//信号下降沿有效
flag=P1;
//读状态位高位为状态
LCDE=0;
voidcmd_wrt(ucharcmd)//写命令子函数
busy();
//检测读写操作使能吗
P1=cmd;
//命令
//指向命令计数器
RW=0;
//写
//高电平有效
voiddat_wrt(uchardat)//写数据子函数
if(flag==16)
P1=0XC0;
//指向第二行
RS=1;
//指向数据寄存器
P1=dat;
//写数据
//------------延时--------------
voiddelay(uintn)
uintj;
for(j=0;
j<
n;
j++)
//------------定时器初始化函数----------------
voidinitInt()
TMOD=0x10;
//定时器1方式1
TH1=(65536-1000)/256;
//定时器1设置1ms定时
TL1=(65536-1000
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MLX90614 红外 测温 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)