标题: 超声波lcd1602显示 [打印本页]

作者: 电子工程协会    时间: 2017-12-23 16:35
标题: 超声波lcd1602显示
仅供大家参考
   超声波程序.zip (61.16 KB, 下载次数: 15)


#include<reg51.h>
#include<intrins.h>       
#include"lcd.h"
sbit Trig = P2^1;
sbit Echo = P2^0;

unsigned char PuZh[]="Distance:       ";
unsigned char code ASCII[15] =    {'0','1','2','3','4','5','6','7','8','9','.','-','M'};

static unsigned char DisNum = 0; //显示用指针                                  
       unsigned int  time=0;
           unsigned long S=0;

           bit      flag =0;                 //标志位flag
           unsigned char disbuff[4]           ={ 0,0,0,0,};

void Conut(void)
        {
         time=TH0*256+TL0;         //*256是16位计数器的高8位和低八位之分,恢复成16位数的时候要*256
                                                 //    将字节转化成十进制数,比如定时器中装的是0xabcd,转化成十进制就是d+c*16+b*16*16+a*16*16*16=43981。
                                                 //    发现ab*256=(b+a*16)*256=43776,cd=d+c*16=205,43776+205=43981
         TH0=0;
         TL0=0;
       
         S=(time*1.7)/100;     //算出来是CM           其中*0.0172是根据超声的声速、单片机的频率,得出来的一个系数。
         
         if((S>=300)) //超出测量范围显示“-”||flag==1
         {         
                  flag=0;
//                  P1 = 0XFD;
                 
                  DisplayOneChar(0, 1, ASCII[11]);
                  DisplayOneChar(1, 1, ASCII[10]);        //显示个点
                  DisplayOneChar(2, 1, ASCII[11]);
                  DisplayOneChar(3, 1, ASCII[11]);
                  DisplayOneChar(4, 1, ASCII[12]);        //显示M
         }
         else
         {
//                   P1 = 0X00;
                  disbuff[0]=S%1000/100;
                  disbuff[1]=S%1000%100/10;
                  disbuff[2]=S%1000%10 %10;
                  DisplayOneChar(0, 1, ASCII[disbuff[0]]);
                  DisplayOneChar(1, 1, ASCII[10]);        //显示点
                  DisplayOneChar(2, 1, ASCII[disbuff[1]]);
                  DisplayOneChar(3, 1, ASCII[disbuff[2]]);
                  DisplayOneChar(4, 1, ASCII[12]);        //显示M
         }
        }

void zd0() interrupt 1                  //T0中断用来计数器溢出,超过测距范围
{
    flag=1;                                                         //中断溢出标志
}

void  StartModule()                          //启动模块
{
          Trig=1;                                             //启动一次模块
          
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          _nop_();
          Trig=0;
       
}
void delayms(unsigned int ms)
{
        unsigned char i=100,j;
        for(;ms;ms--)
        {
                while(--i)
                {
                        j=10;
                        while(--j);
                }
        }
}

void main(void)
{
         TMOD=0x01;                   //设定时器0为工作方式1,GATE=1;
         TH0=0;
         TL0=0;         
         ET0=1;            //开定时器0中断
         EA=1;                           //开启总中断       

        InitLcd1602();
        LcdShowStr(0,0,PuZh);
        while(1)
        {
                 StartModule();
             while(!Echo);                //当RX为零时等待
             TR0=1;                            //开启计数
             while(Echo);                        //当RX为1计数并等待
             TR0=0;                                //关闭计数
                       
         Conut();                        //计算
                 delayms(80);
        }
                       
}


作者: 211209    时间: 2018-1-5 20:22
看看行不行
作者: 想学习的电子热    时间: 2019-4-20 15:46
我能说用这个程序,我的keil直接死机了么

作者: WDYWJ    时间: 2019-4-23 19:59
1602管脚没定义吧。





欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1