📄 111.c
字号:
#include<AT89X51.H>
#include <INTRINS.H>
sbit cs=P1^0;
sbit sid=P1^1;
sbit sclk=P1^2;
sbit fang=P1^3; // squart wave
sbit ensp=P2^5;
sbit dr=P2^4; //dangerous distance led
sbit hy=P2^3; //hold distance led
sbit sg=P2^2; //safe distance led
sbit dpl=P2^1; //drop power led
sbit re=P2^7; //receive led
sbit vc=P3^0; //voltage compare
sbit dq=P1^4; //18B20 data bit
sbit hold=P2^6; //hold
sbit play=P2^7; //play
//****************************************************************
bit ff;
bit flag;
bit comflag;
unsigned char pf=3; //显示警告标志
unsigned char soubuf[6];
unsigned char disbufs[7]; //distance memory
unsigned char disbuft[8]; //temperature memory
unsigned char timeh,timel; //time memory
unsigned char temp[2]; //temp[1]温度的高位与temp[0]低位
unsigned char code word[9]={"当前距离:"};
unsigned char code wordt[5]={"温度:"};
unsigned char code wordd[8]={"危险距离"};
unsigned char code wordh[8]={"保持距离"};
unsigned char code words[8]={"安全距离"};
unsigned char code wordpower[12]={"电源电压正常"};
unsigned char code worddrop[12]={"请您更换电池"};
unsigned char code check[13]={"系统正在自检!"};
unsigned char code sound[10]={74,10,16,22,30,37,43,51,58,67}; //声音地址 点:92;米: 83
//***************************************************************
void lcdbusy(void);
void sendbyte(unsigned char ds);
void wrlcd(unsigned char sta,ks);
void ex0(void);
//void t00(void);
void computers(unsigned int v);
void display(void);
void send0(void);
void send1(void);
void intlcd(void);
unsigned int computerv(void);
void de750ms(void);
void init18b20(void);
void wr18b20(unsigned char ks);
unsigned read18b20(void);
void gettemper(void);
void computert(void);
void checkself(void);
void speak(void);
//******************************************************
void init18b20(void) // 初始化18B20
{ unsigned char i;
dq=1;
_nop_();
dq=0;
for(i=255;i>0;i--);
dq=1;
for(i=30;i>0;i--);
for(i=120;i>0;i--)
if(dq==0) {flag=1;break;}//led=0;
for(i=100;i>0;i--);
dq=1;
}
//*************************************************************
void wr18b20(unsigned char ks)
{unsigned char i,j;
for(i=8;i>0;i--)
{
dq=0;
for(j=6;j>0;j--) ;
_nop_();
dq=(bit)(ks&0x01);
for(j=24;j>0;j--);
dq=1;
ks=ks>>1;
}
}
//*************************************************************
unsigned read18b20(void) //先读出的是低位后读出的是高位,读一个字节子程序
{unsigned char i,j,tdata;
tdata=0;
for(j=8;j>0;j--)
{tdata=tdata>>1;
dq=0;
for(i=6;i>0;i--);
_nop_();
dq=1;
for(i=6;i>0;i--);
if(dq==1) tdata=tdata|0x80;
for(i=28;i>0;i--);
dq=1;
}
return(tdata);
}
//*******************************************************************
void gettemper(void)
{
init18b20();
if(flag==1)
{ //跳过ROM匹配
wr18b20(0xcc);
//发出温度转换命令
wr18b20(0x44);
flag=0;
}
de750ms();
init18b20();
if(flag==1) {
wr18b20(0xcc); //读温度命令
wr18b20(0xbe);
temp[0]=read18b20();
temp[1]=read18b20();
flag=0;
}
else flag=0;
}
//*****************************************************************/
void computert(void) //温度处理子程序,temp[1]温度的高位与temp[0]低位
{ unsigned char aa,i;
unsigned int cc;
aa=temp[1]&0xf8;
if(aa==0xf8) {disbuft[5]=0x2d; //处理负温度
temp[0]=~temp[0];
temp[1]=~temp[1];
if(temp[0]==0xff) temp[1]=temp[1]+1;
temp[0]=temp[0]+1;
aa=(temp[1]&0x07)<<4;
aa=aa|((temp[0]&0xf0)>>4);
disbuft[4]=aa/10;
disbuft[3]=(aa%10);
aa=temp[0]&0x0f;
cc=(int)(aa*625);
disbuft[3]=cc/10000+disbuft[3];
if (disbuft[3]==10) {disbuft[3]=disbuft[3]&0xff;disbuft[4]=disbuft[4]+1;}
cc=cc%10000;
disbuft[2]=cc/1000;
cc=cc%1000;
disbuft[1]=cc/100;
cc=cc%100;
disbuft[0]=cc/10;
}
else {aa=((temp[1]&0x07)<<4); //处理正温度
aa=aa|((temp[0]&0xf0)>>4);
disbuft[0]=aa/10;
disbuft[1]=aa%10;
aa=temp[0]&0x0f;
cc=(int)(aa*625);
disbuft[1]=cc/10000+disbuft[1];
if (disbuft[1]==10) {disbuft[1]=0;disbuft[0]=disbuft[0]+1;}
cc=cc%10000;
disbuft[3]=cc/1000;
cc=cc%1000;
disbuft[4]=cc/100;
cc=cc%100;
disbuft[5]=cc/10;
disbuft[6]=cc%10;
for(i=0;i<7;i++)
disbuft[i]=disbuft[i]|0x30;
disbuft[2]=0x2e;
}
}
//*****************************************************************
unsigned int computerv(void)
{unsigned char a;
unsigned int v;
temp[1]=temp[1]&0x07;
a=temp[1]<<4;
a=a|(temp[0]>>4);
a=a*6;
v=3314+a;
return(v);
}
//*************************************************************
void de750ms(void) //750ms
{unsigned char i,j,k;
for(i=6;i>0;i--)
for(j=255;j>0;j--)
for(k=255;k>0;k--);
}
//*************************************************************
void lcdbusy(void)
{unsigned char i,c;
while(1)
{sendbyte(0xfc);
sclk=1;
c=sid;
sclk=0;
for(i=0;i<15;i++)
{sclk=1;
sclk=0;}
if(c==0) break;
}
}
//**********************************************************
void sendbyte(unsigned char ds) //向LCD中发送一个字节
{unsigned char i;
for(i=0;i<8;i++)
{sclk=1;
sid=ds&0x80;
// if((ds&0x80)==0x80) sid=1;
// else sid=0;
sclk=0;
ds=ds<<1;}
}
//*************************************************************
void wrlcd(unsigned char sta,ks) //向LCD中写入一个起始字节与一个数据
{unsigned char hdata,ldata;
hdata=ks&0xf0;
ks=ks&0x0f;
ks=ks<<4;
ldata=ks;
cs=1;
lcdbusy();
sendbyte(sta);
sendbyte(hdata);
sendbyte(ldata);
cs=0;
}
//****************************************************************
void ex0(void) interrupt 0 using 0
{EX0=0;
TR0=0;
timeh=TH0;
timel=TL0;
TH0=0;
TL0=0;
IE0=0;
ff=1;
re=0;
}
//****************************************************************
void computers(unsigned int v)
{unsigned long s;
unsigned int ss;
unsigned char i;
v=v/2;
s=timeh;
s=s<<8;
s=s+timel;
// s=s*v;
if(comflag==1) s=s-270; //时间修正-194
else s=s-142; //-177
s=s*v;
//ss=s/100000;
if(14000000<s&&s<19500000) s=s+240000;
else if(s>=19500000&&s<28500000) s=s+140000;
else if(s>=36500000&&s<=40000000) s=s-30000;
else if(s>49500000&&s<59500000) s=s-25000;
else if(s>=59500000&&s<=69500000) s=s-49000;
else if(s>69500000) s=s-700000;
else s=s;
ss=s/100000;
disbufs[0]=s/100000000;
s=s%100000000;
disbufs[1]=s/10000000;
s=s%10000000;
disbufs[3]=s/1000000;
s=s%1000000;
disbufs[4]=s/100000;
s=s%100000;
disbufs[5]=s/10000;
soubuf[0]=sound[disbufs[0]];
soubuf[1]=sound[disbufs[1]];
soubuf[2]=92;
soubuf[3]=sound[disbufs[3]];
soubuf[4]=sound[disbufs[4]];
soubuf[5]=83;
for(i=0;i<6;i++)
disbufs[i]=disbufs[i]|0x30;
disbufs[2]=0x2e;
disbufs[6]=0x6d;
if(ss<=200) pf=0;
else if(ss>200&&ss<=300) pf=1;
else if(ss>300) pf=2;
else pf=3;
}
//***********************************************************
void display(void)
{unsigned char i;
wrlcd(0xf8,0x80);
for(i=0;i<9;i++)
wrlcd(0xfa,word[i]);
for(i=0;i<7;i++)
wrlcd(0xfa,disbufs[i]);
wrlcd(0xf8,0x92);
for(i=0;i<8;i++)
{if(pf==0) {wrlcd(0xfa,wordd[i]);dr=0;sg=1;hy=1;}
if(pf==1) {wrlcd(0xfa,wordh[i]);hy=0;dr=1;sg=1;}
if(pf==2) {wrlcd(0xfa,words[i]);sg=0;dr=1;hy=1;}
}
wrlcd(0xf8,0x89);
for(i=0;i<12;i++)
{if (vc==1) {wrlcd(0xfa,wordpower[i]);dpl=1;}
if (vc==0) {wrlcd(0xfa,worddrop[i]);dpl=0;}
}
wrlcd(0xf8,0x98);
for(i=0;i<5;i++)
wrlcd(0xfa,wordt[i]);
for(i=0;i<8;i++)
wrlcd(0xfa,disbuft[i]);
wrlcd(0xf8,0x9e);
wrlcd(0xfa,0xa1);
wrlcd(0xfa,0xe6);
}
//******************************************************************
void speak(void)
{unsigned char i,j,k,h;
for(i=1;i<6;i++)
{P1=soubuf[i];
play=0;
for(j=5;j>0;j--)
for(k=255;k>0;k--)
for(h=250;h>0;h--);
play=1;
for(j=190;j>0;j--)
for(k=255;k>0;k--);
}
}
//******************************************************
void send0(void)
{unsigned char i,j;
EX0=0;
TH0=0;
TL0=0;
//re=1;
ff=0;
TR0=1;
for(i=2;i>0;i--) //20 //2
{fang=1;
for(j=5;j>0;j--);
fang=0;
for(j=4;j>0;j--);
}
//TR0=1;
for(j=8;j>0;j--) //延时消除余震3ms 3,255 //2,255//8,65
for(i=65;i>0;i--);
IE0=0;
EX0=1;
//等待中断回波
for(i=139;i>0;i--)
for(j=255;j>0;j--);
}
//********************************************************************
void send1(void)
{unsigned char i,j;
EX0=0;
TH0=0;
TL0=0;
//re=1;
ff=0;
TR0=1;
for(i=20;i>0;i--) //20 //2
{fang=1;
for(j=5;j>0;j--);
fang=0;
for(j=4;j>0;j--);
}
//TR0=1;
for(j=2;j>0;j--) //延时消除余震3ms 3,255 //2,255//8,65
for(i=255;i>0;i--);
IE0=0;
EX0=1;
//等待中断回波
for(i=139;i>0;i--)
for(j=255;j>0;j--);
}
//******************************************************************
void intlcd(void) //初始化LCD
{//delay40();
de750ms();
wrlcd(0xf8,0x30); //功能设定
wrlcd(0xf8,0x30); //功能设定
wrlcd(0xf8,0x30); //功能设定
wrlcd(0xf8,0x0c); //显示状态
wrlcd(0xf8,0x06); //显示右移
}
//*****************************************************************
void checkself(void)
{unsigned char i;
unsigned char j,k;
P1=97;
P2=0x00;
wrlcd(0xf8,0x81);
for(i=0;i<13;i++)
wrlcd(0xfa,check[i]);
for(i=0;i<20;i++)
for(j=0;j<255;j++)
for(k=0;k<255;k++);
play=1;
P2=0x7f;
}
//***************************************************************
void main(void)
{
TMOD=0x01;
TH0=0;
TL0=0;
EA=1;
EX0=0;
IT0=1;
IE0=0;
ff=0;
comflag=0;
// ET0=0;
P2=0xff;
intlcd();
// checkself();
while(1)
{//se:
send0();
if(ff==0) goto se;
else {comflag=0;goto ne;}
se:
send1();
if(ff==0) goto se;
comflag=1;
ne:
ff=0;
gettemper();
computert();
re=1;
computers(computerv());
display();
if(ensp==0)
speak();
hl:
if(hold==0) goto hl;
}
}
//*****************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -