#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;//数据线
sbit SCL1=P1^4;
sbit SDA1=P1^3;
sbit LED=P2^3; //检测温度指示灯
//************数据定义****************
uchar flag1;
bdata uchar flag;//可位寻址数据
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[]={"检测结束"};
uchar DataH,DataL,Pecreg,j;
uchar condition,condition1,condition2,last,K;//温度十位,个位提取及合成。
//************函数声明*****************************************
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); //读温度数据
uchar rx_byte1(void); //MLX90614 接收字节子程序
void send_bit1(void); //MLX90614 发送位子程序
void tx_byte1(uchar dat_byte); //MLX90614 接收字节子程序
void receive_bit1(void); //MLX90614 接收位子程序
uint memread1(void); //读温度数据
uint compute();
void writecom(uchar com);
void writedat(uchar dat);
void init();
void first();
void delay(uint z);
void Close(); //关闭检测
void display(uint Tem);
void Judge();//自动复位判断
void display1(uint Tem);//转换不显示
//*************主函数**************************************
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); //设置显示位置为第一行的第1个字符
i = 0;
while(dis3[i] != '\0')//
{
LED=0;
writedat(dis3[i]); //显示字符" 温度: "
i++;
delay(30); //控制两字之间显示速度
}
writecom(0x98+0X42); //设置显示位置为第二行第4个字符
display(compute()); //显示摄氏度
Judge();
delay(100);
writecom(0x98+0X45); //设置显示位置为第二行第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;
}
}
}
}
//*********求数值平均与最高值*******
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);
}
//*********输入转换并显示*********
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)//转换不显示
{
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启动函数
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终止函数
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;
}
//---------发送一个字节---------
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: ;
}
//-----------发送一个位---------
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_();
}
//----------接收一个字节--------
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写入数据
{
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显示检测结束
{
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;
}
}
|