超声波测距程序.docx
- 文档编号:7497710
- 上传时间:2023-01-24
- 格式:DOCX
- 页数:8
- 大小:21.63KB
超声波测距程序.docx
《超声波测距程序.docx》由会员分享,可在线阅读,更多相关《超声波测距程序.docx(8页珍藏版)》请在冰豆网上搜索。
超声波测距程序
超声波测距程序
//超声波测距程序
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitrs=P2^6;//1602的数据/指令选择控制线
sbitrw=P2^5;//1602的读写控制线
sbiten=P2^7;//1602的使能控制线
sbittrig=P2^0;//超声波测距模块Trig
sbitecho=P2^1;//超声波测距模块Echo
bitflag1;//触发信号标志位//
ucharcount;//中断累加变量
longintdistance;//测量所得距离
unsignedcharcodetable[]={"0123456789"};
ucharcodetable1[]="distance:
";//定义字符数组显示数字
voiddelay(uintn)
voidlcd_wcom(ucharcom)
{
rs=0;//选择指令寄存器
rw=0;//选择写
P0=com;//把命令字送入P0
delay(5);//延时一小会儿,让1602准备接收数据
en=1;//使能线电平变化,命令送入1602的8位数据口,这点非常重要
en=0;
}
/*------------------------------------------------
1602写数据函数
------------------------------------------------*/
voidlcd_wdat(uchardat)
{
rs=1;//选择数据寄存器
rw=0;//选择写
P0=dat;//把要显示的数据送入P0
delay(5);//延时一小会儿,让1602准备接收数据,也就是检测忙信号,这点非常重要。
en=1;//使能线电平变化,数据送入1602的8位数据口
en=0;
}
voidlcd_init()
{
lcd_wcom(0x38);//8位数据,双列,5*7字形,用到功能设定指令
lcd_wcom(0x0c);//开启显示屏,关光标,光标不闪烁,用到显示开关控制指令
lcd_wcom(0x06);//显示地址递增,即写一个数据后,显示位置右移一位,用到了写入模式设置指令
lcd_wcom(0x01);//清屏,用到了清屏指令
}
voidlcd_xianshi()
{
uchari;
lcd_wcom(0x80);
for(i=0;i<13;i++)
{
lcd_wdat(table1[i]);
}
lcd_wcom(0xcc);
lcd_wdat('.');
lcd_wcom(0xce);//单位是厘米//
lcd_wdat('c');
lcd_wdat('m');
}
/*------------------------------------------------
定时器0初始化,用于计算响应信号时间
------------------------------------------------*/
voidinit_t0()
{
TMOD=0x01;
TL0=0x66;
TH0=0xfc;//1ms
ET0=1;
EA=1;
}
/*------------------------------------------------
超声波模块触发信号
------------------------------------------------*/
voidtrigger()
{
trig=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
trig=1;
}
/*------------------------------------------------
超声波模块相应端口初始化函数
------------------------------------------------*/
voidinit_measuring()
{
trig=1;
echo=1;
count=0;
}
/*------------------------------------------------
超声波模块距离测试函数
------------------------------------------------*/
voidmeasuring()
{
ucharl;
uinth,y;
TR0=1;
while(echo==1)
{
;
}
TR0=0;
l=TL0;
h=TH0;
y=(h<<8)+l;
y=y-0xfc66;//us部分
distance=y+1000*count;//计算总时间,单位是微秒
TL0=0x66;
TH0=0xfc;
delayt(30);
distance=3453*distance/20000;//原始为:
(0.34毫米/us)*时间/2//
}
/*------------------------------------------------
超声波模块测量结果显示函数
------------------------------------------------*/
voiddisplay(uintx)
{
ucharqian,bai,shi,ge;
qian=x/1000;
bai=(x/100)%10;
shi=(x/10)%10;
ge=x%10;
lcd_wcom(0x80+0x49);//单位是厘米//
lcd_wdat(table[qian]);
lcd_wdat(table[bai]);
lcd_wdat(table[shi]);
lcd_wcom(0x80+0x4d);
lcd_wdat(table[ge]);
}
/*------------------------------------------------
主函数
------------------------------------------------*/
voidmain()
{lcd_init();//液晶初始化
init_t0();//定时器0初始化
init_measuring();//超声波相应端口初始化
while
(1)
{
lcd_xianshi();//液晶显示特定字符
trigger();//触发超声波启动
while(echo==0)//等待回声
{
;
}
measuring();//进行距离测量
display(distance);//对测量结果进行显示
init_measuring();//超声波相应端口初始化
delayt(600);//每次测量间隔60ms
}
}
//……………………………………………中断服务函数…………………………………………………//
voidT_0()interrupt1
{
TF0=0;
TL0=0x66;
TH0=0xfc;
count++;
if(count==18)
{
TR0=0;
TL0=0x66;
TH0=0xfc;
count=0;
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波 测距 程序