1. 51单片机程序编写
/*这是用LCD显示所测温度的代码,你参考一下,如果没问题的话,其他的功能你再添加就好了,不难*/
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define Nack_number 10
//**************端口定义**************************************************
uchar flag; //LCD控制线接口
sbit RS=P1^0; //RS端
sbit RW=P1^1; //读写端
sbit LCDE=P2^5; //使能端
//mlx90614端口定义
sbit SCK=P2^1; //时钟线
sbit SDA=P2^2; //数据线
//************数据定义****************************************************
bdata uchar flag1; //可位寻址数据
sbit bit_out=flag1^7;
sbit bit_in=flag1^0;
uchar tempH,tempL,err;
//************************** LCD1602 ***********************************
//向LCD写入命令或数据*****************************************************
#define LCD_COMMAND 0 //命令
#define LCD_DATA 1 // 数据
#define LCD_CLEAR_SCREEN 0x01 // 清屏
#define LCD_HOMING 0x02 // 光标返回原点
//设置显示模式******* 0x08+ *********************************************
#define LCD_SHOW 0x04 //显示开
#define LCD_HIDE 0x00 //显示关
#define LCD_CURSOR 0x02 //显示光标
#define LCD_NO_CURSOR 0x00 //无光标
#define LCD_FLASH 0x01 //光标闪动
#define LCD_NO_FLASH 0x00 //光标不闪动
//设置输入模式********** 0x04+ ********************************************
#define LCD_AC_UP 0x02 //光标右移 AC+
#define LCD_AC_DOWN 0x00 //默认 光标左移 AC-
#define LCD_MOVE 0x01 //画面可平移
#define LCD_NO_MOVE 0x00 //默认 画面不移动
//************************** mlx90614 ***********************************
//command mode 命令模式
#define RamAccess 0x00 //对RAM操作
#define EepomAccess 0x20 //对EEPRAM操作
#define Mode 0x60 //进入命令模式
#define ExitMode 0x61 //退出命令模式
#define ReadFlag 0xf0 //读标志
#define EnterSleep 0xff //进入睡眠模式
//ram address read only RAM地址(只读)
#define AbmientTempAddr 0x03 //周围温度
#define IR1Addr 0x04
#define IR2Addr 0x05
#define LineAbmientTempAddr 0x06 //环境温度
/*0x0000 0x4074 16500 0.01/单元
-40 125*/
#define LineObj1TempAddr 0x07 //目标温度,红外温度
/*0x27ad-0x7fff 0x3559 22610 0.02/单元
-70.01-382.19 0.01 452.2*/
#define LineObj2TempAddr 0x08
//eepom address EEPROM地址
#define TObjMaxAddr 0x00 //测量范围上限设定
#define TObjMinAddr 0x01 //测量范围下限设定
#define PWMCtrlAddr 0x02 //PWM设定
#define TaRangeAddr 0x03 //环境温度设定
#define KeAddr 0x04 //频率修正系数
#define ConfigAddr 0x05 //配置寄存器
#define SMbusAddr 0x0e //器件地址设定
#define Reserverd1Addr 0x0f //保留
#define Reserverd2Addr 0x19 //保留
#define ID1Addr 0x1c //ID地址1
#define ID2Addr 0x1d //ID地址2
#define ID3Addr 0x1e //ID地址3
#define ID4Addr 0x1f //ID地址4
//************函数声明*****************************************************
void start(); //MLX90614发起始位子程序
void stop(); //MLX90614发结束位子程序
uchar ReadByte(void); //MLX90614接收字节子程序
void send_bit(void); //MLX90614发送位子程序
void SendByte(uchar number); //MLX90614接收字节子程序
void read_bit(void); //MLX90614接收位子程序
void delay(uint N); //延时程序
uint readtemp(void); //读温度数据
void init1602(void); //LCD初始化子程序
void busy(void); //LCD判断忙子程序
void cmd_wrt(uchar cmd); //LCD写命令子程序
void dat_wrt(uchar dat); //LCD写数据子程序
void display(uint Tem); //显示子程序
void Print(uchar *str); //字符串显示程序
//*************主函数*******************************************
void main()
{
uint Tem; //温度变量
SCK=1;
SDA=1;
delay(4);
SCK=0;
delay(1000);
SCK=1;
init1602(); //初始化LCD
while(1)
{
Tem=readtemp(); //读取温度
cmd_wrt(0x01); //清屏
Print(" Temperature: "); //显示字符串 Temperature: 且换行
display(Tem); //显示温度
Print(" ^C"); //显示摄氏度
delay(10000); //延时再读取温度显示
}
}
void Print(uchar *str) //字符串显示程序
{
while(*str!='