OpenEdv-开源电子网

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

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

[复制链接]

2

主题

4

帖子

0

精华

新手上路

积分
20
金钱
20
注册时间
2016-9-21
在线时间
2 小时
发表于 2016-9-21 15:57:50 | 显示全部楼层 |阅读模式
1金钱
问题:
不能连续测距,且数值不正常
希望各路大神指点指点
#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 16:54:48 来自手机 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 18:46

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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