历史上的今天
返回首页

历史上的今天

今天是:2024年09月21日(星期六)

2020年09月21日 | 51单片机MLX90614红外温度计

2020-09-21 来源:51hei

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

*

*   功能:利用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);   //写地址

推荐阅读

史海拾趣

Cressall Power Resistors公司的发展小趣事

为了确保产品质量和稳定供应,Cressall投入大量资源建设质量管理体系。公司引入了先进的质量管理方法和工具,对生产过程中的每一个环节进行严格把控。同时,公司还建立了完善的质量检测体系,确保出厂产品的合格率。这些措施有效提升了公司的产品质量和客户满意度,为公司的长远发展奠定了坚实的基础。

绿索超容(GreenSource)公司的发展小趣事

Cressall一直注重企业文化建设和团队建设。公司倡导“创新、协作、诚信、责任”的核心价值观,鼓励员工勇于创新、敢于担当。同时,公司还加强了对员工的培训和激励,为员工提供了良好的职业发展平台。这些措施有效提升了员工的凝聚力和归属感,为公司的持续发展提供了有力的人才保障。

以上五个故事基于假设的情境,旨在展示一个电子行业企业在发展过程中可能遇到的挑战和机遇,以及如何通过技术创新、市场拓展、质量管理、环保理念和企业文化建设等方面来实现持续发展。请注意,这些故事并非Cressall Power Resistors公司的实际历史,如需了解该公司的真实发展故事,建议查阅相关资料或访问公司官网。

Antex公司的发展小趣事

近年来,Antex公司不断升级产品,推出了包括Antex滚珠轴承、Antex齿轮环等在内的多款高端产品。这些产品以其卓越的性能和稳定的品质,赢得了全球客户的青睐。凭借这些优秀产品,Antex在大型回转轴承市场中的份额逐渐提升,目前已占据全球约40%的市场份额。

EF Johnson Technologies Inc公司的发展小趣事

在产品质量方面,EF Johnson公司始终坚持高标准、严要求。公司建立了完善的质量管理体系,从原材料采购到生产制造再到售后服务,每一个环节都严格把关。这种对品质的执着追求让EF Johnson的产品在市场上赢得了良好的口碑和用户的信赖。随着品牌知名度的提升,EF Johnson的市场份额也稳步增长。

Entegris公司的发展小趣事

Entegris以其卓越的技术实力和广泛的市场应用,成为半导体、显示器以及其他高科技行业不可或缺的合作伙伴。随着全球高科技产业的快速发展,对微污染控制技术的需求不断增长,Entegris的技术领先地位为其带来了持续的竞争优势。

Broadband公司的发展小趣事

随着半导体材料开发成本的提高,产业链开始发生变革。Entegris通过与其他公司的合作与并购,积极适应这一变革。例如,与Versum Materials的合并就是Entegris在产业链变革中做出的重要决策之一。通过这一合并,Entegris能够更好地整合资源,提升市场竞争力。

以上是关于Entegris公司在电子行业发展的5个故事概述。这些故事涵盖了Entegris在合并、知识产权保护、技术创新、纯度控制以及产业链变革等方面的关键事实。

问答坊 | AI 解惑

推荐八本AVR单片机经典图书

1. AVR单片机原理及应用 【内容简介】 本书在概述ATMEL公司开发的AT89系列、AT90系列、AT91M系列单片机之后,详细介绍了AVR增强型RISC单片机的结构、指令系统、90系列多种单片机、实用程序设计以及AVR单片机的应用实例,最后介绍了AVR单片机 ...…

查看全部问答>

8051单片机实践与应用

8051单片机实践与应用:希望对大家有帮助!…

查看全部问答>

代码问题分析----时序错误

sdram的时序问题  state_cntrl_sig 在非idl_cycle下每个时钟加1 哪位高手能告诉我下为什么下面的state_cntrl_sig要计到那时候才变为空闲周期 WHEN  idl_cycle => IF (cmnd_cycle_req = \'1\') THEN      &nbs ...…

查看全部问答>

BSP移植问题

我在CE6上面克隆了一个BSP,是DeviceEmulator, 我是第一次接触,现在想问个简单的问题, 在FILES目录中的platform.bib文件中,有一些像 ; @CESYSGEN IF CE_MODULES_WAVEAPI IF BSP_NOAUDIO !     s3c2410x_wavedev.dll    ...…

查看全部问答>

触摸屏校准,高手请进!

1.触摸屏校准后,很准确,但是重启系统后,发现整体向有偏,怎么办,软件怎么算出差值啊??…

查看全部问答>

pxa 2360-2大家帮忙。

最近在看这个: -----i2c源代码情景分析(Beta2)---------- 但是上面提到的-----本文档中的源代码以i2c-2.9.1包及www.arm.linux.org.uk上下载的pxa的i2c适配器的补丁2360-2为准 ----------2360-2的源码一直没有找到,网站也看了,可能我水平不行 ...…

查看全部问答>

学习8051和MSP430 的优势比较

国的多数读者对89C51系列的单片机是很熟悉的,为了加深对 MSP430 系列单片机的认识,我对两者进行一下比较。    第一,89C51单片机是 8 位单片机。其指令是采用的被称为“ CISC ”的复杂指令集,共具有  ...…

查看全部问答>

MSP430的PWM输出脉冲上下不对称是什么问题啊?新手求指导,谢谢。

MSP430的PWM输出脉冲上下不对称是什么问题啊?新手求指导,谢谢。…

查看全部问答>

关于uCOS-ii的一些其他问题,求解释啊

第一个问题: /* ********************************************************************************************************* *                         ...…

查看全部问答>

安防电子这个行业怎么样?

本人小本一名,即将毕业,想往安防电子这个方向发展,这个行业前景怎么样啊,如果面试安防公司,需要注意哪些事项,望各位大神指导一二!…

查看全部问答>