找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2102|回复: 0
打印 上一主题 下一主题
收起左侧

求助,基于51单片机的超声波测距数码管不能显示距离

[复制链接]
跳转到指定楼层
楼主
ID:205456 发表于 2017-5-27 17:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人小白,正在做避障小车,其中需要超声波测距并用数码管显示距离,可是数码管显示一堆乱码,求指教



程序如下


#include<reg52.h>
#include <intrins.h> //常变量定义:?
code unsigned char table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xbf}; //表:共阳数码管?0-9?-??
unsigned int time=0;
unsigned int timer=0;
unsigned long S=0;
bit flag =0;
unsigned char l_disbuff[4]={0xff,0,0,0,};//显示缓冲
unsigned char l_posit=1;//位选择
//引脚定义
sbit SMG_q=P1^0;//定义数码管阳级控制脚(千位)本例程只用到三位数 码管
sbit SMG_b=P1^1;//定义数码管阳级控制脚(百位)
sbit SMG_s=P1^2;//定义数码管阳级控制脚(十位)
sbit SMG_g=P1^3;//定义数码管阳级控制脚(个位)  
sbit RX=P2^1;//模块引脚
sbit TX=P2^0;//显示函数,参数为显示内容
void display()
{
P0=0XFF; //
switch(l_posit)
{
case 0: //选择千位数码管,关闭其它位
SMG_q=0;
SMG_b=1;
SMG_s=1;
SMG_g=1;
P0=0xff;//table[l_disbuff[0]];
//此位不显示
break;
case 1: //选择百位数码管,关闭其它位
SMG_q=1;
SMG_b=0;
SMG_s=1;
SMG_g=1;
P0=table[l_disbuff[1]]&0x7f;//加入小数点
break;
case 2://选择十位数码管,关闭其它位
SMG_q=1;
SMG_b=1;
SMG_s=0;
SMG_g=1;
P0=table[l_disbuff[2]];
break;
case 3: //选择个位数码管,关闭其它位
SMG_q=1;
SMG_b=1;
SMG_s=1;
SMG_g=0;
P0=table[l_disbuff[3]];
break;
}
l_posit++;
if(l_posit>3)
l_posit=0;
}
/********************************************************/
void Conut(void)
{
time=TH0*256+TL0;
TH0=0;
TL0=0;
S=(time*1.7)/100;//算出来是CM
if((S>=700)||flag==1)//超出测量范围显示“-”
{
flag=0;
l_disbuff[1]=10;//“-”
l_disbuff[2]=10;//“-”
l_disbuff[3]=10;//“-”
}
else
{
l_disbuff[1]=S%1000/100;
l_disbuff[2]=S%1000%100/10;
l_disbuff[3]=S%1000%100%10;
}
}  
/********************************************************/
void zd0() interrupt 1//T0中断用来计数器溢出,超过测距范围
{
flag=1; //中断溢出标志
}
/********************************************************/
void zd3() interrupt 3//T1中断用来扫描数码管和计800MS启动模块
{
TH1=0xf8;
TL1=0x30;
display();
timer++;
if(timer>=400)
{
timer=0;
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=0x11;//设T0,T1为方式1
TH0=0;
TL0=0;
TH1=0xf8;//2MS定时
TL1=0x30;
ET0=1;//允许T0中断
ET1=1;//允许T1中断
TR1=1;//开启定时器
EA=1; //开启总中断
while(1)
{
while(!RX);//当RX为零时等待
TR0=1;
//开启计数
while(RX);//当RX为1计数并等待
TR0=0; //关闭计数
Conut();//计算
}
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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