找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1243|回复: 0
打印 上一主题 下一主题
收起左侧

水杯智能监测器OLED程序

[复制链接]
跳转到指定楼层
楼主
以STC89C52RC为控制核心,通过MLX90614进行红外测温,4管脚oled显示数值,独立按键设置温度上下限,超限蜂鸣器报警。




//////////////////////////////////////////////////////////////////////////////////  
//              ???:                 /
//              ---------------------------------------------------------------- /
//              GND    ?????              /
//              VCC  ??5V??3.3v???             /
//              D0   P1^0??SCL??             /
//              D1   P1^1??SDA??             /
//              RES  ??P12               /
//              DC   ??P13               /
//              CS   ??P14                          /
//              ---------------------------------------------------------------- /
//******************************************************************************//
#include "REG51.h"
#include "oled.h"
#include "bmp.h"
#include "intrins.h"
#define  uint  unsigned int //λ????
#define  uchar unsigned char //λ????
#define  Nack_counter  10
uchar flag1;
sbit  SCL=P2^6;// ?????
sbit  SDA=P2^7;// ??????
bdata uchar flag;//??λ??????
sbit bit_out=flag^7;
sbit bit_in=flag^0;
uchar DataH,DataL,Pecreg; //?????????м???

sbit button=P2^1;  //??????????
uchar code table[]={0,1,2,3,4,5,6,7,8,9};
uint sysm=50,sy,STOU=1;//???????????
sbit sysmz=P2^2; //??????????
sbit sysmf=P2^3; //??????С???
sbit STO=P2^0;  //?????????2???

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????λ?????
uint   memread(void);               // ?????????
void   display(uint Tem);           // ????????
void   delayms(uint xms);     //???1ms

void num1(); //????1
void num2(); //????2
void num3(); //????3
void num4(); //????4
void num5(); //????5
void num6(); //????6
void num7(); //????7
void num8(); //????8
void num9(); //????9
void num10();//????10
void startread();//??????????????
void centigrade();//????????
int main(void)
{
uint Tem,a;  //?????????????
   //T????????? a?м???  shi??ge???ж?λ  lm???λ
uchar ss,sg,lm;     //?????????????
uchar shi,ge;
SCL=1;// ?????
SDA=1;// ??????

_nop_();
_nop_();
_nop_();  //???????
_nop_();

SCL=0; // ?????
delayms(1);
SCL=1; // ?????
P0=0xff; //?????P0??????
button=1; //????????????
sysmz=1;   //?????????????I/0??????????Ч
sysmf=1;   //???????????СI/0??????????Ч
STO=1;    //??????趨???????I/O????????Ч
OLED_Init();   //?????OLED  
OLED_Clear();
  OLED_ShowCHinese(0,0,0);//?
  OLED_ShowCHinese(16,0,1);//??
  OLED_ShowCHinese(32,0,2);//??
  OLED_ShowCHinese(48,0,3);//??
  OLED_ShowCHinese(64,0,4);//??
  OLED_ShowCHinese(80,0,5);//??
  OLED_ShowCHinese(96,0,6);//??
  OLED_ShowCHinese(112,0,7);//??
  OLED_ShowCHinese(0,3,8);//??
  OLED_ShowCHinese(16,3,9);//?
  OLED_ShowCHinese(32,3,10);//?
  OLED_ShowCHinese(48,3,11);//??
  OLED_ShowString(66,3,":",16);
  
  OLED_ShowCHinese(110,3,16);//??
  OLED_ShowCHinese(0,6,12);//??
  OLED_ShowCHinese(16,6,13);//??
  OLED_ShowCHinese(32,6,14);//??
  OLED_ShowCHinese(48,6,15);//??
  OLED_ShowString(66,6,":",16);
  OLED_ShowCHinese(110,6,16);//??
while(1)
{  
     
  Tem=memread();    //
  a=Tem*2-27315;
  shi=a/100/10;
  ge=a/100%10;
  OLED_ShowNum(70,3,shi,2,16);
  OLED_ShowNum(86,3,ge,2,16);
  if(shi==1)shi=10;
   if(button==1||sy==1)
   {
    startread();   
    switch(shi)
    {
      case 1:    num1();num10();break;
   case 2:    num2();num10();break;
   case 3:    num3();num10();break;
   case 4:    num4();num10();break;
   case 5:    num5();num10();break;
   case 6:    num6();num10();break;
   case 7:    num7();num10();break;
   case 8:    num8();num10();break;
   case 9:    num9();num10();break;
   case 10:          num10();break;
    }
   
    switch(ge)
    {
      case 1:    num1();break;
   case 2:    num2();break;
   case 3:    num3();break;
   case 4:    num4();break;
   case 5:    num5();break;
   case 6:    num6();break;
   case 7:    num7();break;
   case 8:    num8();break;
   case 9:    num9();break;
    }
    centigrade();sy=0;
   }
/************************************************************************/
/*****************************д????????????************************/
   if(sysmz==1)
   {sysm++;}
   
   if(sysmf==1)
   {sysm--;}
   ss=sysm/10;
   sg=sysm%10;
   OLED_ShowNum(70,6,ss,2,16);
   OLED_ShowNum(86,6,sg,2,16);;
   if(a/100==sysm&&STOU==1)
   {
     for(lm=0;lm<2;lm++) //????????????????????趨?????
  {
      P0=0x06;
   delayms(200);//200ms???????
   P0=0xff;  //???????????
   delayms(4000);//???????????
  }
  STOU=0;
   }
   if(sysm>99||sysm<=0)sysm=50;  //?????????99??0???50??????????????
   if(STO==1)STOU=1;    //??????o?????趨????????
}
}   


void   start_bit(void)  //MLX90614 ?????λ?????
{
   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)  //MLX90614??????λ?????
{
   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) //MLX90614 ????????????
{
   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) //MLX90614????λ?????
{
  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)  //MLX90614 ????????????
{
  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)    //MLX90614????λ?????
{
  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_();
}


uint memread(void)    // ?????????
{
  start_bit();    //MLX90614 ?????λ?????
  tx_byte(0xB4);    //MLX90614 ???????
  tx_byte(0x07);  //Send Command  //MLX90614 ???????
  start_bit();     //MLX90614 ?????λ?????
  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);
}

void delayms(uint xms)
{
uint i,j;
for(i=xms;i>0;i--)
  for(j=110;j>0;j--);
}
void num1()//???ò???????1
{
P0=0x1e; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void num2()//???ò???????2
{
P0=0x1d; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void num3()//???ò???????3
{
P0=0x1c; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void num4()//???ò???????4
{
P0=0x1b; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void num5()//???ò???????5
{
P0=0x1a; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void num6()//???ò???????60
{
P0=0x19; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void num7()//???ò???????7
{
P0=0x18; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void num8()//???ò???????8
{
P0=0x17; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void num9()//???ò???????9
{
P0=0x16; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void num10()//???ò???????10
{
P0=0x15; //???ò???????
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(200);//???????????
}
void startread()//???????
{
P0=0x0b;
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(1300);//???????????
}
void centigrade()//??
{
P0=0x09;
delayms(200);//200ms???????
P0=0xff;  //???????????
delayms(1300);//???????????
}
//  OLED_ShowString(6,3,"0.96' OLED TEST",16);
//     OLED_ShowString(8,2,"ZHONGJINGYUAN");  
//   OLED_ShowString(20,4,"2014/05/01");  
//  OLED_ShowString(0,6,"ASCII:",16);  
//  OLED_ShowString(63,6,"CODE:",16);  
//  OLED_ShowChar(48,6,t,16);//???ASCII???

51hei图片20200129163220.png (89.71 KB, 下载次数: 31)

51hei图片20200129163220.png

水杯智能监测器OLED程序.rar

275.67 KB, 下载次数: 6, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表