找回密码
 立即注册

QQ登录

只需一步,快速开始

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

怎么用lcd1602设定一个值 就是倒车雷达那样 设置一个危险距离 还能用按键调整的

[复制链接]
跳转到指定楼层
楼主
就是倒车雷达那样 设置一个危险距离 还能用按键调整的
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:165046 发表于 2017-3-12 20:01 | 只看该作者
这个关键要看你选择什么样的测距传感器了,比如选择红外发送、接收模块,然后通过软件调节灵敏度!
回复

使用道具 举报

板凳
ID:151348 发表于 2017-3-12 22:17 | 只看该作者
把以前的程序改了改,你看看能不能用
#include<reg52.h>
#include <intrins.h>
sbit RS=P2^0;
sbit RW=P2^1;
sbit E =P2^2;
sbit BF=P0^7;
sbit k1=P2^3;
sbit k2=P2^4;
sbit beep = P2^5;
unsigned char code digit[ ]={"0123456789"}; //定义字符数组显示数字

/*****************************************************
函数功能:延时若干毫秒
入口参数:n
***************************************************/
void delay(unsigned char n)
{
   unsigned char i;
        for(i=0;i<n;i++)
          ;
}
/*****************************************************
函数功能:判断液晶模块的忙碌状态
返回值:result。result=1,忙碌;result=0,不忙
***************************************************/
unsigned char BusyTest(void)
  {
    bit result;
         RS=0;       //根据规定,RS为低电平,RW为高电平时,可以读状态
    RW=1;
    E=1;        //E=1,才允许读写
    _nop_();   //空操作
    _nop_();
    _nop_();
    _nop_();   //空操作四个机器周期,给硬件反应时间       
    result=BF;  //将忙碌标志电平赋给result
    E=0;         //将E恢复低电平
   return result;
  }
/*****************************************************
函数功能:将模式设置指令或显示地址写入液晶模块
入口参数:dictate
***************************************************/
void Write_LCD_command (unsigned char dictate)
{   
    while(BusyTest()==1); //如果忙就等待
         RS=0;                  //根据规定,RS和R/W同时为低电平时,可以写入指令
         RW=0;   
         E=0;                   //E置低电平(根据表8-6,写指令时,E为高脉冲,
                          // 就是让E从0到1发生正跳变,所以应先置"0"
         _nop_();
         _nop_();             //空操作两个机器周期,给硬件反应时间
         P0=dictate;            //将数据送入P0口,即写入指令或地址
         _nop_();
         _nop_();
         _nop_();
         _nop_();               //空操作四个机器周期,给硬件反应时间
         E=1;                   //E置高电平
         _nop_();
         _nop_();
         _nop_();
         _nop_();               //空操作四个机器周期,给硬件反应时间
          E=0;                  //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:将数据(字符的标准ASCII码)写入液晶模块
入口参数:y(为字符常量)
***************************************************/
void Write_LCD_data(unsigned char value)
{
    while(BusyTest()==1);  
          RS=1;           //RS为高电平,RW为低电平时,可以写入数据
          RW=0;
          E=0;            //E置低电平(根据表8-6,写指令时,E为高脉冲,
                       // 就是让E从0到1发生正跳变,所以应先置"0"
          P0=value;           //将数据送入P0口,即将数据写入液晶模块
          _nop_();
          _nop_();
          _nop_();
     _nop_();       //空操作四个机器周期,给硬件反应时间
          E=1;          //E置高电平
          _nop_();
          _nop_();
          _nop_();
         _nop_();        //空操作四个机器周期,给硬件反应时间
         E=0;            //当E由高电平跳变成低电平时,液晶模块开始执行命令
}
/*****************************************************
函数功能:对LCD的显示模式进行初始化设置
***************************************************/
void LcdInitiate(void)
{
    delay(15);             //延时15ms,首次写指令时应给LCD一段较长的反应时间
    Write_LCD_command(0x38);  //显示模式设置:16×2显示,5×7点阵,8位数据接口
        delay(5);               //延时5ms ,给硬件一点反应时间
    Write_LCD_command(0x38);
        delay(5);
        Write_LCD_command(0x38); //连续三次,确保初始化成功
        delay(5);
        Write_LCD_command(0x0c);  //显示模式设置:显示开,无光标,光标不闪烁
        delay(5);
        Write_LCD_command(0x06);  //显示模式设置:光标右移,字符不移
        delay(5);
        Write_LCD_command(0x01);  //清屏幕指令,将以前的显示内容清除
        delay(5);
}


/***********************************************************
           显示数字                 
*************************************************************/
void display(unsigned char add,unsigned int x)
{
    unsigned char i,j,m;
    i=x/100;
    j=x/10%10;
        m=x%10;
        Write_LCD_command(add);
        Write_LCD_command(add);
        Write_LCD_data(digit[i]);
        Write_LCD_data(digit[j]);
        Write_LCD_data(digit[m]);
}

/***********************************************************
           显示字符               
*************************************************************/
void displayWorningChars(unsigned char add)
{
        Write_LCD_command(add);
        Write_LCD_command(add);
        Write_LCD_data('D');
        Write_LCD_data('e');
        Write_LCD_data('n');
        Write_LCD_data('g');
        Write_LCD_data('e');
        Write_LCD_data('r');
        Write_LCD_data('!');
        Write_LCD_data('!');
        Write_LCD_data('!');
}
void erase(unsigned char add)
{
        Write_LCD_command(add);
        Write_LCD_command(add);
        Write_LCD_data(' ');
        Write_LCD_data(' ');
        Write_LCD_data(' ');
        Write_LCD_data(' ');
        Write_LCD_data(' ');
        Write_LCD_data(' ');
        Write_LCD_data(' ');
        Write_LCD_data(' ');
        Write_LCD_data(' ');
}
void displayChars(unsigned char add)
{
        Write_LCD_command(add);
        Write_LCD_command(add);
        Write_LCD_data('s');
        Write_LCD_data('e');
        Write_LCD_data('t');
        Write_LCD_data(':');
}

void main()
{
  unsigned int set_distance=2,num=1;
  unsigned char denger_flag=0;
  beep =0;
  LcdInitiate();
  displayChars(0x80);
  display(0x84,num);

        while(1)
      {
                if (!k1)
                {
                        delay(1);
                        if(!k1)
                        {
                                while(!k1);
                                if(num<1) num=1;
                                num--;
                                display(0x84,num);
                                if(num>set_distance)
                                {
                                        denger_flag=1;
                                }
                                else
                                {
                                        denger_flag=0;
                                        erase(0xc0);
                                }
                        }
                }
                if (!k2)
                {
                        delay(1);
                        if(!k2)
                        {
                                while(!k2);
                                num++;
                                display(0x84,num);
                                if(num>set_distance)
                                {
                                        denger_flag=1;
                                }
                                else
                                {
                                        denger_flag=0;
                                        erase(0xc0);
                                }
                        }
                }
                if(denger_flag==1)
                {       
                        Write_LCD_command(0xc6);
                        Write_LCD_data(' ');
                        Write_LCD_data(' ');
                        Write_LCD_data(' ');
                        displayWorningChars(0xc0);
                        beep =1;
                }
       }
}

tp.png (29.03 KB, 下载次数: 60)

tp.png

LCD1602 按键设置.zip

33.19 KB, 下载次数: 12

回复

使用道具 举报

地板
ID:150257 发表于 2017-3-13 20:19 | 只看该作者

#include<reg51.h>
#include<intrins.h>       
#include"lcd.h"

sbit Trig = P2^1;
sbit Echo = P2^0;
sbit beep = P1^5;

unsigned char PuZh[]=" 00-00-00 ";
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;
           unsigned char disbuff[4]           ={ 0,0,0,0,};
/*******************************************************************************
* oˉ êy Ãû         : main
* oˉêy1|Äü                   : Ö÷oˉêy
* êä    èë         : ÎT
* êä    3ö         : ÎT
*******************************************************************************/
void Conut(void)
        {
         time=TH0*256+TL0;
         TH0=0;
         TL0=0;
       
         S=(time*1.7)/100;     //Ëã3öà′êÇCM
         if((S>=700)||flag==1) //3¬3ö2aá¿·¶Î§ÏÔ꾡°-¡±
         {         
          flag=0;
         
          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
         {
          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ÖD¶ÏóÃà′¼ÆêyÆ÷òç3ö,3¬1y2a¾à·¶Î§
  {
    flag=1;                                                         //ÖD¶Ïòç3ö±êÖ¾
  }

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 Delay10Us_24M(unsigned int n)
{
unsigned int i=0;
char j=0;
for(i=0;i<n;i++)
  for(j=0;j<2;j++);
}
void fengmingqi()
{
   uint i,j,y;

           
               
               for(i=0;i<2000;i++)
               {beep=~beep;for(j=0;j<24;j++);}
               for(y=0;y<2000;y++)
               {beep=~beep;for(j=0;j<25;j++);}
      for(i=0;i<2000;i++)
               {beep=~beep;for(j=0;j<26;j++);}
    for(i=0;i<2000;i++)
               {beep=~beep;for(j=0;j<27;j++);}
            
         
                                                         
                               
         
}

void main(void)
{

         TMOD=0x01;                   //éèT0Îa·½ê½1£¬GATE=1£»
         TH0=0;
         TL0=0;         
         ET0=1;             //ÔêDíT0ÖD¶Ï
         EA=1;                           //¿aÆô×üÖD¶Ï       
  
        InitLcd1602();
        LcdShowStr(0,0,PuZh);
       
        while(1)
        {
                 StartModule();
             while(!Echo);                //μ±RXÎaáãê±μè′y
             TR0=1;                            //¿aÆô¼Æêy
             while(Echo);                        //μ±RXÎa1¼Æêy2¢μè′y

    TR0=0;                                //1رռÆêy
         Conut();                        //¼ÆËã
                         delayms(80);
                if(S<=50)
                {
                fengmingqi();
                }
                else
                        beep=1;
               
              
        }
       
       
                       
}
回复

使用道具 举报

5#
ID:150257 发表于 2017-3-13 20:19 | 只看该作者
虚荣心像恶鬼 发表于 2017-3-13 20:19
#include
#include       
#include"lcd.h"

我用的是超声波模块
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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