OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2310|回复: 2

求助:超声波串口打印测距程序

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2016-9-21
在线时间
2 小时
发表于 2016-9-21 16:57:02 来自手机 | 显示全部楼层 |阅读模式
问题:
不能连续测距,且数值不正常
希望各路大神指点指点
#include<stc15w408s.h>   
#include <intrins.h>
#include<stdio.h>
#define uint unsigned int
#define uchar unsigned char

uint s1;
uint distance;
sbit trig=P0^1;
sbit echo=P0^3;
sbit led=P0^0;
void Delay20us()[url=]//@12.000MHz[/url]
{
unsigned char i;
_nop_();
_nop_();
i = 57;
while (--i);
}
void UartInit(void)[url=]//9600bps@12.000MHz[/url]
{
SCON = 0x50;//8位数据,可变波特率
AUXR |= 0x40;//定时器1时钟为Fosc,即1T
AUXR &= 0xFE;//串口1选择定时器1为波特率发生器
TMOD &= 0x0F;//设定定时器1为16位自动重装方式
TL1 = 0xC7;//设定定时初值
TH1 = 0xFE;//设定定时初值
ET1 = 0;//禁止定时器1中断
TR1 = 1;//启动定时器1
REN=1;
ES=1;
}
void Timer0Init(void)//1微秒@12.000MHz
{
AUXR &= 0x7F;//定时器时钟12T模式
TMOD &= 0xF0;//设置定时器模式
TMOD |= 0x02;//设置定时器模式
TL0 = 0xFF;//设置定时初值
TH0 = 0xFF;//设置定时重载值
TF0 = 0;//清除TF0标志
TR0 = 1;//定时器0开始计时
ET0=1;
EA=1;  //中断总开关打开
}

void start() //启动超声波
{
trig=1;
Delay20us();
// Delay20us();
trig=0;
}

main()
{
Timer0Init();
UartInit();
while(1)
{
start(); //启动
while(echo==1)
{
distance=(s1*17);//算距离
s1=0;
}
ES=0;
TI=1;
printf("%d\n",distance); //串口打印
while(!TI);
TI=0;
ES=1;
}
}
void time0() interrupt 1 //中断计时
{
s1++;
}
希望各路大神指点指点
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2016-9-21
在线时间
2 小时
 楼主| 发表于 2016-9-21 19:38:31 来自手机 | 显示全部楼层
回复 支持 反对

使用道具 举报

9

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
257
金钱
257
注册时间
2015-12-14
在线时间
50 小时
发表于 2016-9-21 22:22:12 | 显示全部楼层
看到了传说中的51程序
Keep moving,to be NO.1!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 02:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表