51单片机发超声波
时间:10-02
整理:3721RD
点击:
51单片机发超声波,使用串口助手接收返回信息。却显示不是要打印的信息,而是一堆问号。希望大神帮忙找出错误,十二道金牌加急啊!
以下是代码:
//晶振:11。0592
//接线:模块TRIG接 P1.2 ECH0 接P1.1
//串口波特率9600
#include <AT89X51.H>
#include <intrins.h>
#include <STDIO.H>
#define uchar unsigned char
#define uint unsigned int
#define RX P1_1
#define TX P1_2
unsigned int time=0,timeH,timeL;
unsigned int timer=0;
uint succeed_flag;
float S=0;
bit flag =0;
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.87)/100; //算出来是CM
if(flag==1) //超出测量
{
flag=0;
printf("-----\n");
}
printf("S=%f\n",S);
}
/********************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/********************************************************/
void StartModule() //T1中断用来扫描数码管和计800MS启动模块
{
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/********************************************************/
void main(void)
{
TMOD=0x13;
SCON=0x02;
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允许T0中断
TR1=1; //开启定时器
EA=1; //开启总中断
while(1)
{
EA=0; //关总中断
StartModule();
while(RX==1);
succeed_flag=0; //清测量成功标志
EA=1;
IT0=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(succeed_flag==1)
{
Conut(); //计算
}
if(succeed_flag==0)
{
TR0=1; //开启计数
}
}
}
void exter() interrupt 0
{
TR0=0; //关闭计数
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************
以下是代码:
//晶振:11。0592
//接线:模块TRIG接 P1.2 ECH0 接P1.1
//串口波特率9600
#include <AT89X51.H>
#include <intrins.h>
#include <STDIO.H>
#define uchar unsigned char
#define uint unsigned int
#define RX P1_1
#define TX P1_2
unsigned int time=0,timeH,timeL;
unsigned int timer=0;
uint succeed_flag;
float S=0;
bit flag =0;
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.87)/100; //算出来是CM
if(flag==1) //超出测量
{
flag=0;
printf("-----\n");
}
printf("S=%f\n",S);
}
/********************************************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
void delayms(unsigned int ms)
{
unsigned char i=100,j;
for(;ms;ms--)
{
while(--i)
{
j=10;
while(--j);
}
}
}
/********************************************************/
void zd0() interrupt 1 //T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/********************************************************/
void StartModule() //T1中断用来扫描数码管和计800MS启动模块
{
TX=1; //800MS 启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/********************************************************/
void main(void)
{
TMOD=0x13;
SCON=0x02;
TH1=0xFD;
TL1=0xFD;
TH0=0;
TL0=0;
TR0=1;
ET0=1; //允许T0中断
TR1=1; //开启定时器
EA=1; //开启总中断
while(1)
{
EA=0; //关总中断
StartModule();
while(RX==1);
succeed_flag=0; //清测量成功标志
EA=1;
IT0=1;
EX0=1; //打开外部中断0
TH1=0; //定时器1清零
TL1=0; //定时器1清零
TF1=0; //计数溢出标志
TR1=1; //启动定时器1
TR1=0; //关闭定时器1
EX0=0; //关闭外部中断0
if(succeed_flag==1)
{
Conut(); //计算
}
if(succeed_flag==0)
{
TR0=1; //开启计数
}
}
}
void exter() interrupt 0
{
TR0=0; //关闭计数
succeed_flag=1;//至成功测量的标志
EX0=0; //关闭外部中断
}
//****************************************************************