欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1483|回復: 0
打印 上一主題 下一主題
收起左側

52單片機驅動mlx90614代碼程序

[復制鏈接]
跳轉到指定樓層
樓主
ID:620315 發表于 2020-9-28 16:20 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
最近在做的一個比賽中有用到mlx90614紅外測溫模塊,經調試整合出一片代碼,放在下邊:
C 語言程序清單: 單片機 89S52、MLX90614、LCD1602 晶振:12M

#include"at89x52.h"
#include"intrins.h" //************************************
#define  uint  unsigned int
#define  uchar unsigned char
#define  Nack_counter  10 //**************端口定義************** //LCD 控制線接口
uchar flag1; sbit  RS=P2^7; sbit  RW=P2^6; sbit  LCDE=P2^5; //mlx90614 端口定義

sbit  SCL=P2^3;//時鐘線 sbit  SDA=P2^2;//數據線 //************數據定義**************** 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<N;i++)
   _nop_(); } //------------------------------ uint memread(void) {   start_bit();   tx_byte(0x00);  //Send SlaveAddress   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)  {    P0=0xff;    RS=0;    RW=1;    LCDE=1;    flag1=P0;    LCDE=0;  } }

void dis_cmd_wrt(uchar cmd)  //寫命令子函數
{    chk_busy_flg();    P0=cmd;    RS=0;    RW=0;    LCDE=1;    LCDE=0; }

void dis_dat_wrt(uchar dat) //寫數據子函數 {   chk_busy_flg();   if(flag1==16)   {    P0=0XC0;    RS=0;    RW=0;    LCDE=1;    LCDE=0;   }    P0=dat;    RS=1;    RW=0;    LCDE=1;    LCDE=0; }

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表