大家可以帮我看一下我写的单片机超声波测量距离的程序正确吗?很容易看的#include sbit Trig = P1^0; //触发脚sbit Echo = P3^3; //接受脚unsigned int times;float v; //距离bit flag; //中断进入标志/*---------------
来源:学生作业帮助网 编辑:作业帮 时间:2024/11/09 03:41:03
大家可以帮我看一下我写的单片机超声波测量距离的程序正确吗?很容易看的#include sbit Trig = P1^0; //触发脚sbit Echo = P3^3; //接受脚unsigned int times;float v; //距离bit flag; //中断进入标志/*---------------
大家可以帮我看一下我写的单片机超声波测量距离的程序正确吗?很容易看的
#include
sbit Trig = P1^0; //触发脚
sbit Echo = P3^3; //接受脚
unsigned int times;
float v; //距离
bit flag; //中断进入标志
/*------------------------------------------------
延时函数大约为7-10个us
------------------------------------------------*/
void delayus(unsigned char dela)
{
while(dela--);
}
/*------------------------------------------------
延时函数大约为1ms
------------------------------------------------*/
void delayms(unsigned char nn)
{
while(nn--)
{
delayus(245);
delayus(245);
}
}
void timer0init() //初始化函数
{
TMOD = 0x21; //设置定时器0来计时,定时器1来产生40KHZ方波;定时器0为16位工作方式,定时器1为8位自动重装;
TH0 = 0;
TL0 = 0;
TH1= 0xF3; //频率接近40KHZ
TL1= 0xF3;
ET0=1;
ET1=1;
IT1=1; //IT1=1表示边沿触发
EA=1;
Trig =0;
}
void main()
{
timer0init(); //初始化
EX1=0; //外部中断1关
while(1)
{
TR0 = 1;
TR1=1; //开始发送超声波;开始计时;
delayus(250); //发送250us左右时间;大约10个40KHZ的方波
TR1=0; //关闭发送超声波;
delayus(20); //延迟20us再开中断,防止接收了发送时的余波;20us时间在算距离时可以忽略
EX1=1; //开外部中断;
delayms(30); //等待中断响应;测量距离限制在30ms*340/2=2.5米左右;
if(flag) //收到中断后计算时间和距离
{
flag = 0;
times = TH0*256+TL0;
v = ((float)times * 1.7)/100;//单位cm
}
TH0 = 0; //给定时器0清零
TL0 = 0;
delayms(200);
}
}
/*------------------------------------------------
外部中断1程序
------------------------------------------------*/
void ISR_INT1(void) interrupt 2
{
TR0=0; //响应中断的同时把定时器0锁住
EX1=0; //关闭外部中断
flag=1; //作标志
}
/*------------------------------------------------
定时1中断程序 40KHZ方波
------------------------------------------------*/
void dingshi_40KHZ() interrupt 3
{
Trig Trig; //产生方波;
}
大家可以帮我看一下我写的单片机超声波测量距离的程序正确吗?很容易看的#include sbit Trig = P1^0; //触发脚sbit Echo = P3^3; //接受脚unsigned int times;float v; //距离bit flag; //中断进入标志/*---------------
我的建议:
1、如果能用一个do...loop循环和几个nop()解决的问题,最好别用定时器做,当程序写大了,中断多了以后,定时器容易出现一些不易调试的问题.
2、接收也可以用轮询的方式,只要mcu的速度足够快即可,这样做的好处是将来可以用A/D口来判断,可以根据不同的接收时间来设置不同的触发电平,有助于提高远距离的灵敏度和近距离的余震问题.
3、对于测到的距离结果,不必急于在MCU里算出距离结果,建议先用串口把两个字节发送到上微机调试,待MCU功能稳定以后,再把温度等系数引入.
另外表扬一下,你的程序写得不错.