超声波测距的串口显示与数码管显示,初学编程,请牛人指点迷津
时间:10-02
整理:3721RD
点击:
写了段超声波测距的程序,大概想实现的功能就是将测得的数据用数码管显示,并且在每次测量的时候将0xdd通过串口发送给电脑。以下是是程序
#include <AT89X52.h> //头文件
#include <intrins.h>
#define uint unsigned int //宏定义,意思为用uint代替unsigned int,这样编写方便,在以后宏定义的作用还有可以方便调用等
#define uchar unsigned char //同上
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
sbit RX=P3^2;
sbit TX=P3^3;
uchar code table[]={ //共阴极数码管编码定义
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint time=0;
// float s=0;
unsigned long s=0;
bit start_measure=0;
uint num,num1,distance,bai,shi,ge;
/********************1ms延时函数********************/
void delayms(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<120;j++);
}/**********************显示函数******************************/
void display(uchar bai,uchar shi,uchar ge)
{
dula=1; //送段选数据
P0=table[bai];
dula=0;
P0=0xff; //送位选数据前关闭搜有显示,防止打开位选锁存时
wela=1; //原来的段选数据通过位选锁存器造成混乱
P0=0xfd; //送位选数据
wela=0;
delayms(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
}
void T0_time() interrupt 1
{
TH0=(65536-1000)/256; //重装初值
TL0=(65536-1000)%256;
num1++;
if(num1>=200) //如果到了60次,说明60毫秒到
{
num1=0; //把num1清零,重新计数
start_measure=1;
}
}
void init()
{
TMOD=0x21; //设T0为方式1,GATE=1;
TH1=0xfd;
TL1=0xfd;
TH0=(65536-1000)/256; //装初值
TL0=(65536-1000)%256;
EA=1; //开启总中断
ET0=1;
TR1=1;
TR0=1;
SM0=0;
SM1=1;
T2CON=0x00;
TH2=0;
TL2=0;
}
/****************启动超声波模块*************************/
void StartModule()
{
TX=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/***********************计算距离*****************************/
void Conut(void)
{
time=TH2*256+TL2;
TH2=0;
TL2=0;
s=(time*1.7)/100; //算出来是CM
if(s>=700) //超出测量范围显示“FFF”
{
bai=15;
shi=15;
ge=15;
}
else
{
bai=s/100; //距离处理函数
shi=(s%100)/10;
ge=s%10;
}
}
/*********************主函数**************************/
void main(void)
{
init();
while(1)
{
display(bai,shi,ge); //调用显示函数
if(start_measure==1)
{
start_measure=0;
StartModule();
while(!RX); //当RX为零时等待
TR2=1; //开启计数
while(RX); //当RX为1计数并等待
TR2=0; //关闭计数
Conut(); //计算
TI=1;
SBUF=0xdd;
while(!TI);
TI=0;
}
}
}
这段程序下载后,在串口处能接收到0xdd,但是数码管显示000.请高人指点。
#include <AT89X52.h> //头文件
#include <intrins.h>
#define uint unsigned int //宏定义,意思为用uint代替unsigned int,这样编写方便,在以后宏定义的作用还有可以方便调用等
#define uchar unsigned char //同上
sbit dula=P2^6;
sbit wela=P2^7;
sbit beep=P2^3;
sbit RX=P3^2;
sbit TX=P3^3;
uchar code table[]={ //共阴极数码管编码定义
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
uint time=0;
// float s=0;
unsigned long s=0;
bit start_measure=0;
uint num,num1,distance,bai,shi,ge;
/********************1ms延时函数********************/
void delayms(uint z)
{
uint i,j;
for(i=0;i<z;i++)
for(j=0;j<120;j++);
}/**********************显示函数******************************/
void display(uchar bai,uchar shi,uchar ge)
{
dula=1; //送段选数据
P0=table[bai];
dula=0;
P0=0xff; //送位选数据前关闭搜有显示,防止打开位选锁存时
wela=1; //原来的段选数据通过位选锁存器造成混乱
P0=0xfd; //送位选数据
wela=0;
delayms(1);
dula=1;
P0=table[shi];
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delayms(1);
dula=1;
P0=table[ge];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delayms(1);
}
void T0_time() interrupt 1
{
TH0=(65536-1000)/256; //重装初值
TL0=(65536-1000)%256;
num1++;
if(num1>=200) //如果到了60次,说明60毫秒到
{
num1=0; //把num1清零,重新计数
start_measure=1;
}
}
void init()
{
TMOD=0x21; //设T0为方式1,GATE=1;
TH1=0xfd;
TL1=0xfd;
TH0=(65536-1000)/256; //装初值
TL0=(65536-1000)%256;
EA=1; //开启总中断
ET0=1;
TR1=1;
TR0=1;
SM0=0;
SM1=1;
T2CON=0x00;
TH2=0;
TL2=0;
}
/****************启动超声波模块*************************/
void StartModule()
{
TX=1; //启动一次模块
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
TX=0;
}
/***********************计算距离*****************************/
void Conut(void)
{
time=TH2*256+TL2;
TH2=0;
TL2=0;
s=(time*1.7)/100; //算出来是CM
if(s>=700) //超出测量范围显示“FFF”
{
bai=15;
shi=15;
ge=15;
}
else
{
bai=s/100; //距离处理函数
shi=(s%100)/10;
ge=s%10;
}
}
/*********************主函数**************************/
void main(void)
{
init();
while(1)
{
display(bai,shi,ge); //调用显示函数
if(start_measure==1)
{
start_measure=0;
StartModule();
while(!RX); //当RX为零时等待
TR2=1; //开启计数
while(RX); //当RX为1计数并等待
TR2=0; //关闭计数
Conut(); //计算
TI=1;
SBUF=0xdd;
while(!TI);
TI=0;
}
}
}
这段程序下载后,在串口处能接收到0xdd,但是数码管显示000.请高人指点。