51单片机MLX90614非接触红外测温程序

发布者:心怀梦想最新更新时间:2020-02-21 来源: 51hei关键字:51单片机  MLX90614  非接触红外测温 手机看文章 扫描二维码
随时随地手机看文章

这个模块采用I2C通讯,只需要接两个上拉电阻,就可以了,还是很好用的。

单片机源程序如下:

#include"at89x52.h" 

#include"intrins.h" 

//************************************ 

#define  uint  unsigned int 

#define  uchar unsigned char 

#define  Nack_counter  10 

//************** 端口定义************** 

//LCD 控制线接口 

uchar flag1; 

sbit  RS=P0^7; 

sbit  RW=P0^6; 

sbit  LCDE=P0^5; 

//mlx90614 端口定义 

sbit  SCL=P1^6;// 时钟线 

sbit  SDA=P1^7;// 数据线 

//************ 数据定义**************** 

bdata uchar flag;//可位寻址数据 

sbit bit_out=flag^7; 

sbit bit_in=flag^0; 

uchar DataH,DataL,Pecreg; 

//************ 函数声明***************************************** 

void   start_bit();                 //MLX90614 发起始位子程序 

void   stop_bit();                 //MLX90614发结束位子程序 

uchar  rx_byte(void);              //MLX90614 接收字节子程序 

void   send_bit(void);             //MLX90614发送位子程序 

void   tx_byte(uchar dat_byte);     //MLX90614 接收字节子程序 

void   receive_bit(void);           //MLX90614接收位子程序 

void   delay(uint N);              //延时程序 

uint   memread(void);             // 读温度数据 

void   init1602(void);        //LCD 初始化子程序 

void   chk_busy_flg(void);         //LCD 判断忙子程序 

void   dis_cmd_wrt(uchar cmd);     //LCD 写命令子程序 

void   dis_dat_wrt(uchar dat);       //LCD 写数据子程序 

void   display(uint Tem);           // 显示子程序 

//*************主函数******************************************* 

void main() 

uint Tem; 

//函数部分 

SCL=1;SDA=1;_nop_(); 

_nop_();_nop_();_nop_(); 

SCL=0; 

delay(1000); 

SCL=1; 

init1602(); 

while(1) 

   Tem=memread(); 

   display(Tem); 

   delay(20); 

//*********输入转换并显示********* 

void display(uint Tem) 

uint T,a,b; 

T=Tem*2; 

  dis_cmd_wrt(0x01);//清屏 

if(T>=27315) 

   T=T-27315; 

   a=T/100; 

   b=T-a*100; 

//--------------------------- 

   if(a>=100) 

   { 

    dis_dat_wrt(0x30+a/100); 

    a=a%100; 

    dis_dat_wrt(0x30+a/10); 

    a=a%10; 

    dis_dat_wrt(0x30+a); 

   } 

   else if(a>=10) 

   { 

    dis_dat_wrt(0x30+a/10); 

    a=a%10; 

    dis_dat_wrt(0x30+a); 

   } 

   else 

   { 

    dis_dat_wrt(0x30+a); 

   } 

   dis_dat_wrt(0x2e);// 显示点 

   //--------------------------- 

  if(b>=10) 

  { 

    dis_dat_wrt(0x30+b/10); 

//    b=b%10; 

//    dis_dat_wrt(0x30+b); 

  } 

  else 

  { 

    dis_dat_wrt(0x30); 

//    dis_dat_wrt(0x30+b); 

  } 

//==========

else 

  T=27315-T; 

  a=T/100; 

    b=T-a*100; 

  dis_dat_wrt(0x2d); 

//-------------------------- 

  if(a>=10) 

  { 

    dis_dat_wrt(0x30+a/10); 

    a=a%10; 

    dis_dat_wrt(0x30+a); 

  } 

  else 

  { 

    dis_dat_wrt(0x30+a); 

  } 

  dis_dat_wrt(0x2e);//显示点 

//-------------------------- 

  if(b>=10) 

  { 

    dis_dat_wrt(0x30+b/10); 

    b=b%10; 

    dis_dat_wrt(0x30+b); 

  } 

  else 

  { 

    dis_dat_wrt(0x30); 

    dis_dat_wrt(0x30+b); 

  } 


//************************************ 

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(uchar 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_(); 

//---------- 接收一个字节-------- 

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 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   delay(uint N) 

  uint i; 

  for(i=0;i  

     _nop_(); 

//------------------------------ 

uint memread(void) 

  start_bit(); 

  tx_byte(0xB4);  //Send SlaveAddress ==============================

  //tx_byte(0x00); 

  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); 

//******************LCD 显示子函数*********************** 

void init1602(void)        // 初始化LCD 

   dis_cmd_wrt(0x01); 

   dis_cmd_wrt(0x0c); 

   dis_cmd_wrt(0x06); 

   dis_cmd_wrt(0x38); 

   

   } 


void chk_busy_flg(void) //LCD 忙标志判断 

   flag1=0x80; 

  while(flag1&0x80) 

   P2=0xff; 

   RS=0; 

   RW=1; 

   LCDE=1; 

   flag1=P2; 

   LCDE=0; 


void dis_cmd_wrt(uchar cmd)    // 写命令子函数 

   chk_busy_flg(); 

   P2=cmd; 

   RS=0; 

   RW=0; 

   LCDE=1; 

   LCDE=0; 


void dis_dat_wrt(uchar dat) // 写数据子函数 

  chk_busy_flg(); 

  if(flag1==16) 

  { 

   P2=0XC0; 

   RS=0; 

   RW=0; 

   LCDE=1; 

   LCDE=0; 

  } 

   P2=dat; 

   RS=1; 

   RW=0; 

   LCDE=1; 

   LCDE=0; 

关键字:51单片机  MLX90614  非接触红外测温 引用地址:51单片机MLX90614非接触红外测温程序

上一篇:单片机程序实现 按键 长按短按识别
下一篇:注释非常详细的51单片机IIC源程序

推荐阅读最新更新时间:2024-11-17 12:45

【自学51单片机】7--LED点阵学习
1、LED点阵介绍 LED点阵由多个LED小灯构成,以8*8LED点阵介绍,实物图和内部原理图如下。 图7-2左侧8个引脚为内部LED小灯阳极,上侧8个引脚为阴极。 2、点亮LED点阵 2.1 原理 点亮LED点阵与点亮LED小灯原理相似,根据LED点阵电路图分析即可,详细见第三章。 2.2 点亮全部LED点阵程序 利用定时器中断和数码管动态显示原理,就不进行说明,详细见第六章 3、取模软件简单介绍 取模软件可以将LED点阵图形的数据转换为程序中的数据。取模软件中黑色为LED熄灭,值为1,白色为LED点亮,值为0。如下图绘制了一个心形。 下面来说明取模软件参数的选取。 取模方式:根据LED点阵结构原理图
[单片机]
【自学<font color='red'>51单片机</font>】7--LED点阵学习
基于AT89C51单片机和传感器实现家庭安全报警系统的设计
家庭安全报警系统家庭安防报警功能是智能家居系统的重要功能,同家庭的各种传感器、功能键、探测器及执行器共同构成家庭的安防体系,是家庭安防体系的“大脑”。报警功能包括防火、防盗、煤气泄露报警及紧急求助等功能,报警系统采用先进智能型控制网络技术、由微机管理控制,实现对匪情、盗窃、火灾、煤气、紧急求助等意外事故的自动报警。然而市场上出现的各类家庭安全报警系统功能虽较齐全,但并不完善,明显的不足之处就是报警号码都是预先存入,而且没有提供人机交互功能,用户如因特殊情况需更换报警电话号码时往往无能为力,其设计显然不够人性化,也给用户带来了诸多不便。明显的不足之处就是报警号码都是预先存入,而且没有提供人机交互功能,用户如因特殊情况需更换报警电话号
[单片机]
基于AT89C<font color='red'>51单片机</font>和传感器实现家庭安全报警系统的设计
基于51单片机的霍尔水流量计设计
1、开发准备 (1)YF-B1流量传感器一个 (2)51开发板一个 2、基础知识 (1)YF-B1流量传感器只有三根线。即数据线、VCC、GND。数据线输出为占空比为50%的方波。当水流通过水流转子组件时,磁性转子转动并且转速随着流量的变化而成线性变化。霍尔传感器(霍尔元件采样)输出相应的脉冲信号。其流量脉冲特性计算公式为:脉冲f(Hz)=8.1x流量Q(L/min)-3。 (2)51单片机的中断工作方式。51单片机有定时器T0和T1,他们既有定时又有计数的功能。通过设置相关的特殊功能寄存器就可以启用定时或计数功能。需要注意的是,定时器系统是单片机内部一个独立的硬件部分,CPU一旦设置定时功能,定时器便在晶振的作用下计时
[单片机]
89C51单片机40s倒记时数码管动态显示
此程序已经通过测试,电路连接是:一个2位的共阴数码管,位选是P3.6,P3.7口,段选是P0口,还有如下3个按键 sbit buzz = P2^2; sbit clear = P2^0; sbit start = P2^1; 分别是喇叭,清除和开始 与gnd相连即可. #include reg51.h #include intrins.h const unsigned char LED7Code ={ 0xC0, // 0 0xF9, // 1 0xA4, // 2 0xB0, // 3 0x99, // 4 0x92, // 5 0x82, // 6 0xF8, // 7 0x80, // 8 0x
[单片机]
51单片机“积木式”实验板的制作
这套实验板每块板上的元件数不多,采用万能板和敷铜板丙种方法制作均可,上图中的实物就是用l5xLOCm万能板制作的。主控板的制作要注意的是PO口的引出端,从主控板原理下图可以看到,PO口引出端接线柱的排列方向和51 芯片 的PO口引脚的排列方向正好相反,所以要接跳线,别的三个 端口 的对外接线柱排列方向和51芯片的端口引脚方向一致。这样安排主要是保证不管主板怎样摆放,板上边两个端口各自的8个接线柱排列从左到右分别按PX.7、PX.6、...、PX.1、PX.0(X为0、1、2、3)的顺序,这样容易记忆,特别是外接数码管驱动时尤为方便。 另外要注意各元件的安装高度,保证40脚锁紧式插座装上芯片后,锁紧柄按下不被板上所装的元件挡住。
[单片机]
<font color='red'>51单片机</font>“积木式”实验板的制作
基于8051单片机和SC1128芯片实现病房呼叫系统的设计
传统的病房呼叫系统普遍采用有线式,不仅布线安装繁琐、维护不便、利用率低,而且实时性差。虽然无线式呼叫系统没有布线问题,但它的可靠性差,而且无线电波会干扰其它医疗仪器设备,目前大多数医院不采用无线呼叫系统。 随着电力载波技术的发展,应用低压电力线作为传输媒质,采用扩频、数字编码、单片机控制等技术实现病房呼叫已成为可能。本文运用电力载波技术设计了一种病房呼叫系统。 1 病房呼叫系统的基本要求 临床求助呼叫是传送临床信息的重要手段,病房呼叫系统是病人请求值班医生或护士进行诊断或护理的紧急呼叫工具,可将病人的请求快速传送给值班医生或护士, 并在值班室的监控中心电脑上留下准确完整的记录,是提高医院和病室护理水平的必备设备之一。呼叫系
[单片机]
基于80<font color='red'>51单片机</font>和SC1128芯片实现病房呼叫系统的设计
#51单片机#A/D差分输入信号
在上一节已经提到过,控制字的第 4 位和第 5 位是用于控制 PCF8591 的模拟输入引脚是单端输入还是差分输入。差分输入是模拟电路常用的一个技巧,这里我们把相关知识做一些简单介绍。 从严格意义上来讲,其实所有的信号都是差分信号,因为所有的电压只能是相对于另外一个电压而言。但是大多数系统,我们都是把系统的 GND 作为基准点。而对于 A/D 来说的差分输入,通常情况下是除了 GND 以外,另外两路幅度相同,极性相反的输入信号,其实理解起来很简单,就如同跷跷板一样。如图17-8 所示。 图 17-8 差分输入原理 差分输入的话,就不是单个输入,而是由 2 个输入端构成的一组输入。PCF8591 一共是4 个模拟输入端,可以配置
[单片机]
#<font color='red'>51单片机</font>#A/D差分输入信号
51单片机在锅炉水处理控制中的应用
0 引 言 自然水中通常含有钙镁等离子,俗称硬水。在锅炉用水中需要去除水中的钙镁离子而形成软水以防止锅炉结垢。在生产中锅炉水的软化处理是一项重要的安全指标,所以,对于锅炉水处理的技术要求愈来愈高。单片机以其较高的灵活性和稳定性广泛应用在自动控制领域。本文所设计的锅炉水处理控制装置,由高低水位控制进水阀开关,选用单片机为核心,C语言编程实现循环时间电路控制。该装置已成功应用于成都富华水处理公司。 1 软水生产工艺过程及对自控系统的要求 1.1 生产工艺过程 软化水设备的工作原理是基于阳离子交换原理。水由交换柱上流下,与交换树脂中的盐离子充分接触达到把原水中的杂质、易结垢的重金属阳离子去除掉。其生产工艺大致分为下列几步:①条件
[单片机]
<font color='red'>51单片机</font>在锅炉水处理控制中的应用
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved