基于单片机与超声波传感器的自动蔽障论文程序.docx

上传人:b****2 文档编号:17981333 上传时间:2023-08-05 格式:DOCX 页数:14 大小:17.19KB
下载 相关 举报
基于单片机与超声波传感器的自动蔽障论文程序.docx_第1页
第1页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第2页
第2页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第3页
第3页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第4页
第4页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第5页
第5页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第6页
第6页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第7页
第7页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第8页
第8页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第9页
第9页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第10页
第10页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第11页
第11页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第12页
第12页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第13页
第13页 / 共14页
基于单片机与超声波传感器的自动蔽障论文程序.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于单片机与超声波传感器的自动蔽障论文程序.docx

《基于单片机与超声波传感器的自动蔽障论文程序.docx》由会员分享,可在线阅读,更多相关《基于单片机与超声波传感器的自动蔽障论文程序.docx(14页珍藏版)》请在冰点文库上搜索。

基于单片机与超声波传感器的自动蔽障论文程序.docx

基于单片机与超声波传感器的自动蔽障论文程序

#include

#include

sbitLCM_RW=P2^1;//定义引脚

sbitLCM_RS=P2^0;

sbitLCM_E=P2^2;

sbitRX=P2^7;

sbitTX=P2^6;

sbitAnother_RX=P2^5;

sbitAnother_TX=P2^4;

sbitK1=P3^3;

sbitK2=P3^4;

sbitK3=P3^5;

sbitSPK=P2^3;//定义喇叭端口

#defineLCM_DataP1

#defineBusy0x80//用于检测LCM状态字中的Busy标识

voidWriteDataLCM(unsignedcharWDLCM);

voidWriteCommandLCM(unsignedcharWCLCM,BuysC);

unsignedcharReadDataLCM(void);

unsignedcharReadStatusLCM(void);voidLCMInit(void);

voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData);

voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData);

voidDelayms(unsignedintn);

voiddellay(unsignedinth);

unsignedcharcodeName[]={"LiJunLi"};

unsignedcharcodeID[]={"310808030304"};

unsignedcharcodesensor1[]={"Down:

"};

unsignedcharcodesensor2[]={"Ahead:

"};

unsignedcharcodecharactor[]={'0','1','2','3','4','5','6','7','8','9','.','-','C','M'};

 

staticunsignedcharDisNum=0;//显示用指针

unsignedinttime=0,y;

unsignedlongS=0;

unsignedlongAnother_S=0;

bitflag=0;

unsignedchardisbuff[4]={0,0,0,0,};

voiddelay(unsignedintcnt)

{

while(--cnt);

}

/********************************************************/

voiddelay1ms(unsignedintms)

{

unsignedchari=100,j;

for(;ms;ms--)

{

while(--i)

{

j=10;

while(--j);

}

}

}

/*********************************************************/

/********************************************************/

voidConut(unsignedinty)

{

time=TH0*256+TL0;

TH0=0;

TL0=0;

S=(time*1.7)/100;//算出来是CM

if((S>=450)||flag==1)//超出测量范围显示“-

{

flag=0;

DisplayOneChar(8,y,charactor[11]);

DisplayOneChar(9,y,charactor[9]);//显示点

DisplayOneChar(10,y,charactor[10]);

DisplayOneChar(11,y,charactor[9]);

DisplayOneChar(12,y,charactor[9]);

}

else

{

disbuff[0]=S%1000/100;

disbuff[1]=S%1000%100/10;

disbuff[2]=S%1000%10%10;

disbuff[3]=S%100%10%10;

DisplayOneChar(8,y,charactor[disbuff[0]]);

DisplayOneChar(9,y,charactor[disbuff[1]]);

DisplayOneChar(10,y,charactor[disbuff[2]]);

DisplayOneChar(11,y,charactor[10]);//显示点

DisplayOneChar(12,y,charactor[disbuff[3]]);

DisplayOneChar(13,y,charactor[12]);//显示C

DisplayOneChar(14,y,charactor[13]);//显示M

}

}

/********************************************************/

/********************************************************/

voidStartModule(bitTXC)//启动模块bitTXC

{

TXC=1;//启动一次模块

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

_nop_();

TXC=0;

}

/********************************************************/

/********************************************************/

voidzd0()interrupt1//T0中断用来计数器溢出,超过测距范围

{

flag=1;//中断溢出标志

}

voidalart(unsignedinta)

{

unsignedinti;

if(a==0)

{

while

(1)

{

for(i=0;i<100;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短

{

delay(60);//参数决定发声的频率,估算值,可以自行更改参数并

SPK=~SPK;

if(K1==0||K2==0||K3==0)

{SPK=0;break;}

}

if(K1==0||K2==0||K3==0)

{SPK=0;break;}

}

}

if(a==1)

{

while

(1)

{

for(i=0;i<100;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短

{

delay(30);//参数决定发声的频率,估算值,可以自行更改参数并

SPK=~SPK;

if(K1==0||K2==0||K3==0)

{SPK=0;break;}

}

if(K1==0||K2==0||K3==0)

{SPK=0;break;}

}

}

if(a==2)

{

while

(1)

{

for(i=0;i<100;i++)//喇叭发声的时间循环,改变大小可以改变发声时间长短

{

delay(15);//参数决定发声的频率,估算值,可以自行更改参数并

SPK=~SPK;

if(K1==0||K2==0||K3==0)

{SPK=0;break;}

}

if(K1==0||K2==0||K3==0)

{SPK=0;break;}

}

}

}

voidcal(unsignedlongl,unsignedlongh)

{

if(l<=2*h)

{

if((2*h-l)>80)

{

alart

(2);

}

if((2*h-l)<=80&&(2*h-l)>40)

{

alart

(1);

}

if((((2*h-l)>10)&&((2*h-l)<=40)))

{

alart(0);

}

}

if(l>2*h)

{

if((l-2*h)>80)

{

alart

(2);

}

if((l-2*h)>=40&(l-2*h)<=60)

{

alart

(1);

}

if((l-2*h)>=10&(l-2*h)<=40)

{

alart(0);

}

}

}

 

voidmain(void)

{

unsignedcharTempCyc;

Delayms(400);//启动等待,等LCM讲入工作状态

LCMInit();//LCM初始化

Delayms(5);//延时片刻(可不要)

DisplayListChar(2,0,Name);

DisplayListChar(1,1,ID);

ReadDataLCM();//测试用句无意义

for(TempCyc=0;TempCyc<10;TempCyc++)

Delayms(400);;//延时

LCMInit();//LCM初始化

while

(1)

{

TMOD=0x01;//设T0为方式1,GATE=1;

TH0=0;

TL0=0;

ET0=1;//允许T0中断

EA=1;//开启总中断

while

(1)

{

DisplayListChar(0,0,sensor1);

StartModule(TX);

while(!

RX);//当RX为零时等待

TR0=1;//开启计数

while(RX);//当RX为1计数并等待

TR0=0;//关闭计数

Conut(0);//计算

delay1ms(80);//80MS

Another_S=S;

DisplayListChar(0,1,sensor2);

StartModule(Another_TX);

while(!

Another_RX);//当RX为零时等待

TR0=1;//开启计数

while(Another_RX);//当RX为1计数并等待

TR0=0;

Conut

(1);

cal(S,Another_S);//计算*/

Delayms(80);//80MS*/

}

}

}

//写数据RS="H",RW=L,D0~D7=数据,E=高脉冲

voidWriteDataLCM(unsignedcharWDLCM)

{

dellay(100);

LCM_E=0;

LCM_RS=1;

LCM_RW=0;

LCM_Data=WDLCM;

//dellay(100);//短暂延时,代替检测忙状态

//ReadStatusLCM();//检测忙

LCM_E=1;

LCM_E=0;

}

//写指令RS="L",RW=L,D0~D7=指令码,E=高脉冲

voidWriteCommandLCM(unsignedcharWCLCM,BuysC)

//BuysC为0时忽略忙检测

{

//if(BuysC)ReadStatusLCM();//根据需要检测忙

dellay(100);//短暂延时,代替检测忙状态

LCM_E=0;

LCM_RS=0;

LCM_RW=0;

LCM_Data=WCLCM;

LCM_E=1;

LCM_E=0;

}

//读数据RS="H",RW=H,E=H

unsignedcharReadDataLCM(void)

{

LCM_RS=1;

LCM_RW=1;

LCM_E=1;

return(LCM_Data);

}

//读状态RS="L",RW=H,E=H

unsignedcharReadStatusLCM(void)

{

LCM_Data=0xFF;

LCM_RS=0;

LCM_RW=1;

LCM_E=1;

//while(LCM_Data&Busy);//检测忙信号

return(LCM_Data);

}

voidLCMInit(void)//LCM初始化

{

LCM_Data=0;

Delayms(15);

WriteCommandLCM(0x38,0);//三次显示模式设置,不检测忙信号

Delayms(5);

WriteCommandLCM(0x38,0);

Delayms(5);

WriteCommandLCM(0x38,0);

WriteCommandLCM(0x38,1);//显示模式设置,开始要求每次检测忙信号

WriteCommandLCM(0x08,1);//关闭显示

WriteCommandLCM(0x01,1);//显示清屏

WriteCommandLCM(0x06,1);//显示光标移动设置

WriteCommandLCM(0x0C,1);//显示开及光标设置

}

//按指定位置显示一个字符

voidDisplayOneChar(unsignedcharX,unsignedcharY,unsignedcharDData)

{

Y&=0x1;

X&=0xF;//限制X不能大于15,Y不能大于1

if(Y)X|=0x40;//当要显示第二行时地址码+0x40;

X|=0x80;//算出指令码

WriteCommandLCM(X,1);//这里不检测忙信号,发送地址码

WriteDataLCM(DData);

}

//按指定位置显示一串字符

voidDisplayListChar(unsignedcharX,unsignedcharY,unsignedcharcode*DData)

{

unsignedcharListLength;

ListLength=0;

Y&=0x1;

X&=0xF;//限制X不能大于15,Y不能大于1

while(DData[ListLength]>0x1f)//若到达字串尾则退出

{

if(X<=0xF)//X坐标应小于0xF

{

DisplayOneChar(X,Y,DData[ListLength]);//显示单个字符

ListLength++;X++;

}

}

}

//延时程序

voidDelayms(unsignedintn)

{

unsignedinti,j;

for(j=n;j>0;j--)

for(i=112;i>0;i--);

}

/**************************************************

**函数名称:

dellay

**入口参数:

h(unsignedint型)

**出口参数:

**功能描述:

短暂延时,使用12MHz晶体,约0.01MS

****************************************************/

voiddellay(unsignedinth)

{

while(h--);//0.01MS

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2