微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 超声波测距的串口显示与数码管显示,初学编程,请牛人指点迷津

超声波测距的串口显示与数码管显示,初学编程,请牛人指点迷津

时间: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.请高人指点。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top