|
以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???
|
|