|
#include <reg51.h>
#include"intrins.h"
//************************************
#define uint unsigned int
#define uchar unsigned char
#define Nack_counter 10
//**************端口定義**************
sbit SCL=P1^2;//時鐘線
sbit SDA=P1^1;//數(shù)據(jù)線
sbit SCL1=P1^4;
sbit SDA1=P1^3;
sbit LED=P2^3; //檢測溫度指示燈
//************數(shù)據(jù)定義****************
uchar flag1;
bdata uchar flag;//可位尋址數(shù)據(jù)
sbit bit_out=flag^7;
sbit bit_in=flag^0;
sbit rw = P2^1;
sbit rs=P2^0;
sbit LCD_EN = P2^2;
sbit PSB = P2^7;
uchar code dis1[ ] = {"測溫寶盒"};
uchar code dis2[ ] = {"Chen Chaowen"};
uchar code dis3[]={"溫度: "};
uchar code dis4[]={"℃"};
uchar code dis5[]={"溫馨提示:"};
uchar code dis6[]={"檢測結(jié)束"};
uchar DataH,DataL,Pecreg,j;
uchar condition,condition1,condition2,last,K;//溫度十位,個位提取及合成。
//************函數(shù)聲明*****************************************
void start_bit(); //MLX90614 發(fā)起始位子程序
void stop_bit(); //MLX90614 發(fā)結(jié)束位子程序
uchar rx_byte(void); //MLX90614 接收字節(jié)子程序
void send_bit(void); //MLX90614 發(fā)送位子程序
void tx_byte(uchar dat_byte); //MLX90614 接收字節(jié)子程序
void receive_bit(void); //MLX90614 接收位子程序
uint memread(void); //讀溫度數(shù)據(jù)
uchar rx_byte1(void); //MLX90614 接收字節(jié)子程序
void send_bit1(void); //MLX90614 發(fā)送位子程序
void tx_byte1(uchar dat_byte); //MLX90614 接收字節(jié)子程序
void receive_bit1(void); //MLX90614 接收位子程序
uint memread1(void); //讀溫度數(shù)據(jù)
uint compute();
void writecom(uchar com);
void writedat(uchar dat);
void init();
void first();
void delay(uint z);
void Close(); //關(guān)閉檢測
void display(uint Tem);
void Judge();//自動復(fù)位判斷
void display1(uint Tem);//轉(zhuǎn)換不顯示
//*************主函數(shù)**************************************
void InitTimer0(void)
{
TMOD = 0x01;
TH0 = (65535-45872)/256;
TL0 = (65535-445872)%256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void Timer0Interrupt(void) interrupt 1
{
TH0 = (65535-45872)/256;
TL0 = (65535-445872)%256;
j++;
}
void main()
{
uchar i,k=0;;
SCL=1;
delay(10);
SDA=1;
delay(10);
SCL=0;
delay(10);
SCL=1;
delay(10);
InitTimer0();
init();
first();
delay(100000);
init();
while(1)
{
LED=0;
writecom(0x88+0x43); //設(shè)置顯示位置為第一行的第1個字符
i = 0;
while(dis3[i] != '\0')//
{
LED=0;
writedat(dis3[i]); //顯示字符" 溫度: "
i++;
delay(30); //控制兩字之間顯示速度
}
writecom(0x98+0X42); //設(shè)置顯示位置為第二行第4個字符
display(compute()); //顯示攝氏度
Judge();
delay(100);
writecom(0x98+0X45); //設(shè)置顯示位置為第二行第9個字符
i = 0;
while(dis4[i] != '\0')
{
LED=0;
writedat(dis4[i]); //顯示字符"℃"
i++;
delay(30); //控制兩字之間顯示速度
}
delay(1000);
if(j>=200)//10秒
{
K=1;
Close();
delay(10000);
while(1)//熄屏判斷
{
init();
LED=1;
display1(compute());
Judge();
if(K==0)break;
}
}
}
}
//*********求數(shù)值平均與最高值*******
uint compute()
{
long int sum1=0,sum2=0;
int sum_aver,aver1,aver2;
uchar i;
for(i=0;i<5;i++)
{
sum1=sum1+memread();
delay(5);//取值間隔時間
}
for(i=0;i<5;i++)
{
sum2=sum2+memread1();
delay(5);//取值間隔時間
}
aver1=sum1/5;
aver2=sum2/5;
if(aver1>=aver2)sum_aver=aver1;
else sum_aver=aver2;
return(sum_aver);
}
//*********輸入轉(zhuǎn)換并顯示*********
void display(uint Tem)
{
uint T,a,b;
T=Tem*2;
if(T>=27315)
{
T=T-27315;
a=T/100;
b=T-a*100;
if(a>=100)
{
writedat(0x30+a/100); //百位顯示
a=a%100;
writedat(0x30+a/10); //十位顯示
a=a%10;
writedat(0x30+a); //個位顯示
}
else if(a>=10)
{
writedat(0x30+a/10);
condition1=a/10;
a=a%10;
writedat(0x30+a);
condition2=a;
}
else
{
writedat(0x30+a);
}
writedat(0x2e);//顯示點
if(b>=10)
{
writedat(0x30+b/10);
writedat(0x30+b%10);
}
else
{
writedat(0x30);
}
}
else
{
T=27315-T;
a=T/100;
b=T-a*100;
writedat(0x2d);
if(a>=10)
{
writedat(0x30+a/10);
a=a%10;
writedat(0x30+a);
}
else
{
writedat(0x30+a);
}
writedat(0x2e);//顯示點
if(b>=10)
{
writedat(0x30+b/10);
b=b%10;
writedat(0x30+b);
}
else
{
writedat(0x30);
writedat(0x30+b);
}
}
}
void display1(uint Tem)//轉(zhuǎn)換不顯示
{
uint T,a,b;
T=Tem*2;
if(T>=27315)
{
T=T-27315;
a=T/100;
b=T-a*100;
if(a>=10)
{
condition1=a/10;
a=a%10;
condition2=a;
}
}
}
//****************mlx90614啟動函數(shù)
void start_bit(void)
{
SDA=SDA1=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=SCL1=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=SDA1=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=SCL1=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
}
//-----------------mlx90614終止函數(shù)
void stop_bit(void)
{
SCL=SCL1=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=SDA1=0;
_nop_();_nop_();_nop_();_nop_();_nop_();
SCL=SCL1=1;
_nop_();_nop_();_nop_();_nop_();_nop_();
SDA=SDA1=1;
}
//---------發(fā)送一個字節(jié)---------
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 tx_byte1(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_bit1();
dat=dat<<1;
}
receive_bit1();
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: ;
}
//-----------發(fā)送一個位---------
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_();
}
void send_bit1(void)
{
if(bit_out==0)
SDA1=0;
else
SDA1=1;
_nop_();
SCL1=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SCL1=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
}
//----------接收一個字節(jié)--------
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;
}
uchar rx_byte1(void)
{
uchar i,dat;
dat=0;
for(i=0;i<8;i++)
{
dat=dat<<1;
receive_bit1();
if(bit_in==1)
dat=dat+1;
}
send_bit1();
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 receive_bit1(void)
{
SDA1=1;bit_in=1;
SCL1=1;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
bit_in=SDA1;
_nop_();
SCL1=0;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_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);
}
uint memread1(void)
{
start_bit();
tx_byte1(0x00); //Send SlaveAddress
tx_byte1(0x07); //Send Command
start_bit();
tx_byte1(0x01);
bit_out=0;
DataL=rx_byte1();
bit_out=0;
DataH=rx_byte1();
bit_out=1;
Pecreg=rx_byte1();
stop_bit();
return(DataH*256+DataL);
}
void init()//12864初始化
{
PSB=1;
writecom(0x30);
writecom(0x0c);
writecom(0x01);
}
void writecom(uchar com)//12864寫入命令
{
rs = 0;
rw = 0;
LCD_EN = 0;
P0 = com;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
void writedat(uchar dat)//12864寫入數(shù)據(jù)
{
rs = 1;
rw = 0;
LCD_EN=0;
P0 = dat;
delay(5);
LCD_EN = 1;
delay(5);
LCD_EN = 0;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
void first()//12864開始顯示
{
uchar num;
init();
writecom(0x80+0x42);
for(num=0;num<8;num++)
{ LED=0;
writedat(dis1[num]);
delay(1000);
}
writecom(0x90+0x41);
for(num=0;num<13;num++)
{ LED=0;
writedat(dis2[num]);
delay(1000);
}
}
void Close()//12864顯示檢測結(jié)束
{
uchar num;
init();
writecom(0x80+0x42);
for(num=0;num<10;num++)
{ LED=0;
writedat(dis5[num]);
delay(1000);
}
writecom(0x90+0x42);
for(num=0;num<8;num++)
{ LED=0;
writedat(dis6[num]);
delay(1000);
}
}
void Judge()
{
last=condition;
condition=condition1+condition2;
if((condition>=last+2)||(condition<=last-2))
{
j=0;
K=0;
}
}
|
|