51单片机超声波模块的C语言程序.docx
《51单片机超声波模块的C语言程序.docx》由会员分享,可在线阅读,更多相关《51单片机超声波模块的C语言程序.docx(9页珍藏版)》请在冰点文库上搜索。
51单片机超声波模块的C语言程序
//超声波模块程序
//超声波模块程序
//Trig=P2^0
//Echo=P3^2
#include
#defineucharunsignedchar
#defineuintunsignedint
inttime;
intsucceed_flag;
uchartimeL;
uchartimeH;
sbitTrig=P1^0;
sbitEcho=P3^2;
ucharcodetable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
ucharcodetable1[]={0,1,2,3,4,5,6,7};
//
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
//
voiddelay_20us()
{
uchara;
for(a=0;a<100;a++);
}
//***************************************************************
//显示数据转换程序
voiddisplay(uinttemp)
{
ucharge,shi,bai;
bai=temp/100;
shi=(temp%100)/10;
ge=temp%10;
P2=table1[2];
P0=table[ge];
delay
(1);
P2=table1[1];
P0=table[shi];
delay
(1);
P2=table1[0];
P0=table[bai];
delay
(1);
}
//***************************************************************
voidmain()
{
uintdistance;
//test=0;
Trig=0;//首先拉低脉冲输入引脚
EA=1;//打开总中断0
TMOD=0x10;//定时器1,16位工作方式
while
(1)
{
EA=0;//关总中断
Trig=1;//超声波输入端
delay_20us();//延时20us
Trig=0;//产生一个20us的脉冲
while(Echo==0);//等待Echo回波引脚变高电平
succeed_flag=0;//清测量成功标志
EA=1;
EX0=1;//打开外部中断0
TH1=0;//定时器1清零
TL1=0;//定时器1清零
TF1=0;//计数溢出标志
TR1=1;//启动定时器1
delay(20);//等待测量的结果
TR1=0;//关闭定时器1
EX0=0;//关闭外部中断0
if(succeed_flag==1)
{
time=timeH*256+timeL;
distance=time*0.0172;//厘米
}
if(succeed_flag==0)
{
distance=0;//没有回波则清零
//test=!
test;//测试灯变化
}
display(distance);
}
}
//***************************************************************
//外部中断0,用做判断回波电平
voidexter()interrupt0//外部中断0是0号
{
EX0=0;//关闭外部中断
timeH=TH1;//取出定时器的值
timeL=TL1;//取出定时器的值
succeed_flag=1;//至成功测量的标志
}
//****************************************************************
//定时器1中断,用做超声波测距计时
voidtimer1()interrupt3//
{
TH1=0;
TL1=0;
}
1602液晶显示的超声波模块程序
接口程序里边都有、、
#include
//#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitlcdrs=P2^3;
sbitlcden=P2^2;
sbittrig=P2^0;//超声波发送
//sbitecho=P3^2;//超声波接受
//P0____________DB0-DB7
uchardis[]="Disp_HC-SR04";
ucharnum[]="0123456789";
uintdistance;
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=121;y>0;y--);
}
voidHC_init()
{
TMOD=0x09;
TR0=1;
TH0=0;TL0=0;
}
uintHC_jisuan()
{
uintdist,timer;
timer=TH0;
timer<<=8;
timer=timer|TL0;
dist=timer/53;//晶振11.0592MHz距离cm=微秒us/58
returndist;//1个机器周期是12个时钟周期timer*12/(58*11.0592)=timer/53
}
voidHC_run()
{
uinttempH=0x00,tempL=0x00;
TH0=0;TL0=0;
trig=0;
trig=1;
delay
(1);
trig=0;
while((TH0-tempH!
=0||TL0-tempL!
=0)||(TH0==0&&TL0==0))
{
tempH=TH0;
tempL=TL0;
}
delay
(1);
}
voidlcd_write_com(ucharcom)//LCD写指令
{
lcdrs=0;
P0=com;
delay
(1);
lcden=1;
delay
(1);
lcden=0;
}
voidlcd_write_data(uchardate)//LCD写数据
{
lcdrs=1;
P0=date;
delay
(1);
lcden=1;
delay
(1);
lcden=0;
}
voidlcd_init()//LCD初始化
{
lcden=0;
lcd_write_com(0x38);
lcd_write_com(0x0c);
lcd_write_com(0x06);
lcd_write_com(0x01);
}
voidlcd_display(uchartemp)
{
uinti;
lcd_write_com(0x82);
for(i=0;i<12;i++)
{
lcd_write_data(dis[i]);
}
lcd_write_com(0x80+0x41);
lcd_write_data('D');
lcd_write_data('i');
lcd_write_data('s');
lcd_write_data('t');
lcd_write_data('a');
lcd_write_data('n');
lcd_write_data('c');
lcd_write_data('e');
lcd_write_data(':
');
lcd_write_data(num[temp/100]);
lcd_write_data(num[temp/10%10]);
lcd_write_data(num[temp%10]);
lcd_write_data('c');
lcd_write_data('m');
}
voidmain()
{
lcd_init();
HC_init();
while
(1)
{
HC_run();
distance=HC_jisuan();
lcd_display(distance);
delay(200);
}
}