微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 有趣的小玩意

有趣的小玩意

时间:10-02 整理:3721RD 点击:

单片机超声模块+LCD1602显示



(提示:用数码管显示参照这个网址


http://wenku.baidu.com/view/57ed956858fafab069dc02fc.html)






  
  
  
  
  
  
  
  
  
  
  
  





了解超声模块我们要分几步来理解,包括它的工作原理和在单片机上的运行情况,只有两者相互理解透才能更好的利用超声模块来开发一些东东!  不同型号的超声模块其实大致是一样,也就没必要区分型号,除非你是特别要求,对于爱好者,初学者,则是没必要这么苛刻!




第一步:超声模块的工作原理





参数的设置







时序图的说明








第二步:单片机的连接


上面我们知道怎么连接单片机的线了,对于TRIG发射端,ECHO接受端,它们只需要四I/O端口就可以。


我们要熟悉LCD1602的工作原理,不明白的参照我的这份文档,里面对1602的工作步骤说的很明白。


http://wenku.baidu.com/view/170407ff0242a8956bece435.html


第三步:程序的编写和功能的开发


这里我选择TRIG  =
P1^0     ECHO = P3^2


设置一个报警器,当距离超过200cm是就报警,不超过是就不报警。         

/******************************************

板子      :郭天祥老师的52单片机板?

设计者    :蒋

时间      :2012-4-29

学校      :南昌航空大学

******************************************/

#include <reg51.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

sbit dula=P2^6;

sbit wela=P2^7;

sbit LCD_RS = P3^5;         

sbit LCD_RW = P3^6;

sbit LCD_EN = P3^4;

sbit d=P2^3;

int time;

int succeed_flag;

uchar timeL;

uchar timeH;

uchar distance;

sbit Trig=P1^0;

sbit Echo=P3^2;

uchar code dis1[] =
{"The juli is: "};


uchar dis2[] =
{0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};


void delay(int ms)

{                           

   int i;

   while(ms--)

   {

     for(i = 0; i< 110; i++)

     {

      _nop_();

     }

   }

}

void delay_20us()

{

    uchar a ;

    for(a=0;a<100;a++);

}

bit lcd_busy()

{                          

    bit result;

    LCD_RS = 0;

    LCD_RW = 1;

    LCD_EN = 1;

    _nop_();

    _nop_();

    _nop_();

    _nop_();

     result = (bit)(P0&0x80);

    LCD_EN = 0;

    return result;

}

void lcd_wcmd(uchar cmd)

{                          

   while(lcd_busy());

    LCD_RS = 0;

    LCD_RW = 0;

    LCD_EN = 0;

    _nop_();

    _nop_();

    P0 = cmd;

    _nop_();

    _nop_();

    LCD_EN = 1;

    _nop_();

    _nop_();

    LCD_EN = 0;


}

void lcd_wdat(uchar dat)

{                          

   while(lcd_busy());

    LCD_RS = 1;

    LCD_RW = 0;

    LCD_EN = 0;

    P0 = dat;

    _nop_();

    _nop_();

    LCD_EN = 1;

    _nop_();

    _nop_();   


    LCD_EN = 0;

}

void lcd_pos(uchar pos)

{                          

   lcd_wcmd(pos|0x80);      //数据指针=80+地址变量

}

void lcd_init()

{   

    dula=0;

    wela=0;                     

    lcd_wcmd(0x38);          //16*2显示,5*7点阵,8位数据

    delay(5);

    lcd_wcmd(0x38);         

    delay(5);

    lcd_wcmd(0x38);         

    delay(5);

    lcd_wcmd(0x0c);          //显示开,关光标

    delay(5);

    lcd_wcmd(0x06);          //移动光标

    delay(5);

    lcd_wcmd(0x01);          //清除LCD的显示内容

    delay(5);

}

main()

{

    uchar
i,a,b,c;  


    delay(10);

    lcd_init();                        // 初始化LCD

    Trig=0;       //首先拉低脉冲输入引脚

    EA=1;         //打开总中断0

    TMOD=0x10;    //定时器1,16位工作方式

    while(1)              

   {

        EA=0;           //关总中断

        Trig=1;         //超声波输入端

        delay_20us();   //延时20us

        Trig=0;         //产生一个20us的脉冲

        while(Echo==0); //等待Echo回波引脚变高电平

        succeed_flag=0; //清测量成功标志

        EA=1;

        EX0=1;          //打开外部中断0

        TH1=0;          //定时器1清零

        TL1=0;          //定时器1清零

        TF1=0;          //计数溢出标志

        TR1=1;          //启动定时器1

        delay(20);      //等待测量的结果

        TR1=0;          //关闭定时器1

        EX0=0;          //关闭外部中断0

       if(succeed_flag==1)

       {  


          time=timeH*256+timeL;

          distance=time*0.0172;  //厘米

       }                        

      if(succeed_flag==0)

       {

          distance=0;                    //没有回波则清零



        }   


      a=distance/100;

      b=(distance%100)/10;

      c=distance%10;                  

      lcd_wcmd(0x06);           //向右移动光标

      lcd_pos(0);         //设置显示位置为第一行的第1个字符

      i = 0;

     while(dis1 != '\0')

     {                                     //显示字符

       lcd_wdat(dis1);

       i++;

       delay(2);                     //控制两字之间显示速度

     }                                                     


      lcd_pos(0x45);        //设置显示位置为第二行第1个字符

      lcd_wdat(dis2[a]);

      delay(2);                                 

      lcd_wdat(dis2);

      delay(2);                             

      lcd_wdat(dis2[c]);

      delay(2);

      lcd_wdat('c');

      delay(2);

      lcd_wdat('m');

      delay(2);      

      if(distance>200)     

          d=0;

      else

          d=1;      

   }

}   



void exter()  interrupt 0  
// 外部中断0是0号


{  

     EX0=0;         //关闭外部中断

     timeH =TH1;    //取出定时器的值

     timeL =TL1;    //取出定时器的值

     succeed_flag=1;//至成功测量的标志

}

void timer1() interrupt
3  //


    {

         TH1=0;

         TL1=0;

     }







一遍可能看的有点糊涂!多看几遍就可以看懂!



不明白问me+739141300



技术付出的是金钱和汗水,收获的是一份自信!

图片看不到

/....

小编辛苦了

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

网站地图

Top