超声波程序Word文档格式.docx
- 文档编号:13300967
- 上传时间:2022-10-09
- 格式:DOCX
- 页数:25
- 大小:20.06KB
超声波程序Word文档格式.docx
《超声波程序Word文档格式.docx》由会员分享,可在线阅读,更多相关《超声波程序Word文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
ucharm;
//开关控制
//sbitn=P2;
//电机反转
codeunsignedcharseg7code[10]={0xa0,0xbb,0x62,0x2a,0x39,0x2c,0x24,0xba,0x20,0x28};
//显示段码
/****************************定时器0中断************************/
voidtimer0()interrupt1
{
TH0=(65536-count)/256;
TL0=(65536-count)%256;
s=~s;
//产生38K信号
ss=~ss;
//
tt++;
//发送超声波个数
}
/****************************延时0.9ms子程序************************/
voidDelay0_9ms(void)
ucharj,k;
for(j=18;
j>
0;
j--)
for(k=20;
k>
k--);
/***************************延时1ms子程序**********************/
voidDelay1ms(void)
uchari,j;
for(i=2;
i>
i--)
for(j=230;
j--);
/***************************延时4.5ms子程序**********************/
voidDelay4_5ms(void)
for(i=10;
for(j=225;
/****************************解码延时子程序************************/
voidDelay(void)
uchari,j,k;
for(i=100;
i--)
for(j=100;
for(k=3;
/****************************显示延时子程序************************/
voidledDelay(unsignedinttc)//延时程序
unsignedinti,j;
for(i=0;
i<
10;
i++)
for(j=0;
j<
tc;
j++);
/****************************************************************/
//定时器1中断,用做超声波测距无回波
voidtimer1()interrupt3
{
TR1=0;
ET1=0;
EX1=0;
TH1=0;
TL1=0;
}
/***********************显示程序*********************/
voidLed(intdate)//显示函数
{inti;
table[0]=date/1000;
table[1]=date/100%10;
table[2]=date/10%10;
table[3]=date%10;
date=0;
120;
{
P2=enled[i%4]&
m;
//P2口高四位控制数码管,低位陪分控制继电器
P0=seg7code[table[i%4]];
//取出千位数,查表,输出。
ledDelay(15);
}
}
/*******************************************************************/
//外部中断1,用做判断超声波回波电平说明测试成功
voidint1()interrupt2//外部中断1是0号
{
//关闭外部中断1
succeed_flag=1;
//测试成功标志
/****************************超声波测路子函数***********************/
voidsound()
{ET0=1;
TR0=1;
//开38K超声波输入端
while(tt!
=1);
//发送几个脉冲的超声
tt=0;
//清零重新计数
ET0=0;
TR0=0;
TF1=0;
//计数溢出标志
//定时器1清零
//定时器1清零
ET1=1;
//开定时器1
TR1=1;
//启动定时器1
EX1=1;
//打开外部中断1
succeed_flag=0;
while(EX1==1);
//等待回波标志
if(succeed_flag==1)//测试成功
{time=TH1*256+TL1;
//回波响应时间
distance=time*1.72/100;
//换算成路程
Led(distance);
//显示测到的距离
//开中断1
if(succeed_flag==0)//测试不成功或超出时间
Led(3333);
//表示测不到回波
/****************************红外解码******************************/
/********************中断0解码服务子程序********************/
voidint0(void)interrupt0using2
EA=0;
//?
?
可以这样,跳入中断,但仍可对P3.2(INT0)进行电平变化的读取
for(k=0;
k<
k++)
Delay0_9ms();
if(IRsignal==1)//如果0.9ms后IRsignal=1,说明不是引导码
k=10;
break;
elseif(k==9)//如果持续了10×
0.9ms=9ms的低电平,说明是引导码
while(IRsignal==0);
Delay4_5ms();
//跳过持续4.5ms的高电平
4;
i++)//分别读取4个字节
for(j=1;
=8;
j++)//每个字节8个bit的判断
//等待上升沿此处用得很好:
因为0.56ms的低电平(接收时)是代码0与1的相同部分
//从上升沿那一时刻开始延时0.9ms(因为0.9介于0.56(=1.125-0.56)与1.69(=2.25-0.56)之间),再判断IRsignal
if(IRsignal==1)//如果IRsignal是"
1"
高位置"
,并向右移一位
Delay1ms();
//为什么要延时1ms呢?
因为要使IRsignal跳至低电平(即0.56ms的0与1相同部分上)
CodeTemp=CodeTemp|0x80;
//此处的算法很好
if(j<
8)CodeTemp=CodeTemp>
>
1;
elseif(j<
8)
{CodeTemp=CodeTemp>
}//如果IRsignal是"
0"
则直接向右移一位,自动补"
IRcode[i]=CodeTemp;
CodeTemp=0;
i++)//通过串口将代码发出
SBUF=IRcode[i];
//引导码地址码数据码数据反码
while(!
TI);
//等待一个字节发送完毕
TI=0;
Delay();
switch(IRcode[2])//数据位
case69:
m=0xfe;
break;
//电机上升
case70:
m=0xff;
//电机停止
case71:
m=0xfc;
//电机下降
case22:
a=0;
case25:
key=1;
//功能键
case12:
a=1;
;
case24:
a=2;
case94:
a=3;
case8:
a=4;
case28:
a=5;
case90:
a=6;
case66:
a=7;
case82:
a=8;
case74:
a=9;
EA=1;
//开总中断
/*******************************************************************/
/***********************初始化程序*********************/
voidinitUart(void)
TMOD|=0x11;
//定时器T1,T0都用方式1,16位
PCON|=0x80;
//定时器T1高位初始化
//定时器T1低位初始化
TR1=1;
//用时才启动
//TMOD=0x01;
//定时器T0初值
//
EA=1;
//先关上38KHz,用到的时候再开
TR0=0;
//先关上38KHz,用到的时候再开
//设置电机到达的高度
voidscankey()
while(
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 超声波 程序
![提示](https://static.bdocx.com/images/bang_tan.gif)