找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4518|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

自己寫的簡單倒車?yán)走_程序,超聲波測距藍牙控制LCD顯示或數(shù)碼管顯示或距離越近燈頻...

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:188933 發(fā)表于 2017-4-20 19:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
#include <reg52.h>   
#include <intrins.h>
#include <STDIO.H>

#define uint unsigned int
#define uchar unsigned char

sbit RX=P2^1;
sbit TX=P2^0;       //超聲波

sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P3^7;     //數(shù)碼管位選

sbit rs=P2^4;            //1602的數(shù)據(jù)/指令選擇控制線
sbit rw=P2^5;           //1602的讀寫控制線
sbit en=P2^6;          //1602的使能控制線

sbit buzzer=P2^7;      //蜂鳴器

/*    超聲波    */

uchar count;           //中斷累加變量
long int distance;    //測量所得距離
unsigned char code table[ ]={"0123456789"}; //定義字符數(shù)組顯示數(shù)字



#define GPIO_DIG P0
//--定義全局變量--//
unsigned char code DIG_CODE[17]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的顯示碼
unsigned char disbuff[4] ={ 0,0,0,0,};



/*------------------------------------------------
                  延時函數(shù)
------------------------------------------------*/
void delay(uint n)                           
{
    uint x,y;  
    for(x=n;x>0;x--)
    for(y=110;y>0;y--);
}


/*------------------------------------------------
                  延時函數(shù)
------------------------------------------------*/
void delayt(uint x)
{
    uchar j;
    while(x-- > 0)
    {
              for(j = 0;j < 125;j++)
        {
          ;
        }
    }
}

/*------------------------------------------------
     定時器0初始化,用于計算響應(yīng)信號時間
------------------------------------------------*/
void init_t0()
{
        TMOD=0x01;         
        TL0=0x66;
        TH0=0xfc;              //1ms
        ET0=1;            
        EA=1;                     
}


/*------------------------------------------------
      超聲波模塊觸發(fā)信號
------------------------------------------------*/
void trigger()
{
        TX=1;
        delayt(1);
        TX=0;        
}


/*------------------------------------------------
      超聲波模塊相應(yīng)端口初始化函數(shù)
------------------------------------------------*/
void init_measuring()
{
        TX=0;
        RX=0;
        count=0;
}


/*------------------------------------------------
         超聲波模塊距離測試函數(shù)
------------------------------------------------*/
void measuring()
{
        uchar l;
        uint h,y;
        TR0 = 1;
        while(RX)
    {
        ;
    }        
        TR0 = 0;
        l = TL0;
        h = TH0;
        y = (h << 8) + l;
        y = y - 0xfc66;//us部分
        distance = y + 1000 * count;//計算總時間,單位是微秒
        TL0 = 0x66;
        TH0 = 0xfc;
        delayt(30);
        distance = 3453* distance / 20000;//原始為:(0.34毫米/us)*時間/2//        
}

/********************LCD****************************/

/*------------------------------------------------
                1602寫命令函數(shù)
------------------------------------------------*/
void lcd_wcom(uchar com)            
{
    rs=0;                //選擇指令寄存器
    rw=0;               //選擇寫
    P1=com;            //把命令字送入P0
    delay(5);         //延時一小會兒,讓1602準(zhǔn)備接收數(shù)據(jù)
    en=1;            //使能線電平變化,命令送入1602的8位數(shù)據(jù)口,這點非常重要
    en=0;
}


/*------------------------------------------------
               1602寫數(shù)據(jù)函數(shù)   
------------------------------------------------*/
void lcd_wdat(uchar dat)        
{
    rs=1;             //選擇數(shù)據(jù)寄存器
    rw=0;            //選擇寫
    P1=dat;         //把要顯示的數(shù)據(jù)送入P0
    delay(5);    //延時一會兒,讓1602準(zhǔn)備接收數(shù)據(jù),也是檢測忙信號,這點非常重要
    en=1;         //使能線電平變化,數(shù)據(jù)送入1602的8位數(shù)據(jù)口
    en=0;
  }


/*------------------------------------------------
                1602初始化函數(shù)      
------------------------------------------------*/
void lcd_init()              
{
    lcd_wcom(0x38);       //8位數(shù)據(jù),雙列,5*7字形  ,用到功能設(shè)定指令     
    lcd_wcom(0x0c);      //開啟顯示屏,關(guān)光標(biāo),光標(biāo)不閃爍,用到顯示開關(guān)控制指令
    lcd_wcom(0x06);     //顯示地址遞增,即寫一個數(shù)據(jù)后,顯示位置右移一位,用到了寫入模式設(shè)置指令
    lcd_wcom(0x01);    //清屏,用到了清屏指令
}


/*------------------------------------------------
              1602顯示固定字符函數(shù)      
------------------------------------------------*/
void lcd_xianshi()              
{
    lcd_wcom(0x80+0x40);
        lcd_wdat('D');
        lcd_wdat('i');
        lcd_wdat('s');
        lcd_wdat('t');
        lcd_wdat('a');
        lcd_wdat('n');
        lcd_wdat('c');
        lcd_wdat('e');
        lcd_wdat(':');
        lcd_wcom(0x80+0x4c);
        lcd_wdat('.');
        lcd_wcom(0x80+0x4e);//單位是厘米//
        lcd_wdat('c');
        lcd_wdat('m');

}




/*------------------------------------------------
       超聲波模塊測量結(jié)果LCD顯示函數(shù)
------------------------------------------------*/
void display(uint x)
{
        uchar qian,bai,shi,ge;
        qian=x/1000;
        bai=(x/100)%10;
        shi=(x/10)%10;
        ge=x%10;

        lcd_wcom(0x80+0x49);//單位是厘米//
        lcd_wdat(table[qian]);
        lcd_wdat(table[bai]);
        lcd_wdat(table[shi]);
        lcd_wcom(0x80+0x4d);
        lcd_wdat(table[ge]);
}

/*------------------------------------------------
                LCD主函數(shù)
------------------------------------------------*/
void LCD()            
{   //uint i;
    lcd_init();          //液晶初始化        
    init_t0();          //定時器0初始化   
    init_measuring();  //超聲波相應(yīng)端口初始化
       

   while(1)// for(i=0;i<1;i++)
       { lcd_xianshi();   //液晶顯示特定字符
        trigger();      //觸發(fā)超聲波啟動

                 while(RX==0)          //等待回聲
         {
           ;
         }

                 measuring();           //進行距離測量
                 display(distance);    //對測量結(jié)果進行顯示
                 init_measuring();    //超聲波相應(yīng)端口初始化
                 delayt(60);        //每次測量間隔60ms
}      
}
/**********************蜂鳴器*************************************/
/***********蜂鳴器響應(yīng)函數(shù)*********/
void Conut1(uint x)
        {

         if(x>=42000)                   //超出測量
         {
          buzzer=1;
          }
          else
          {
            buzzer=1;
                   delayt(x);        //printf("S=%fCM\n",S);                       
            buzzer=0;
                   delayt(x);
           }

        }
/*************蜂鳴器主函數(shù)***********/
void Buzzer()            
{   //uint i;              
    init_t0();          //定時器0初始化   
    init_measuring();  //超聲波相應(yīng)端口初始化


        //for(i=0;i<1;i++)
     while(1)
         {   

        trigger();      //觸發(fā)超聲波啟動

                 while(RX==0)          //等待回聲
         {
           ;
         }

                 measuring();           //進行距離測量
                 Conut1(distance);    //對測量結(jié)果進行顯示
                 init_measuring();    //超聲波相應(yīng)端口初始化
                 delayt(60);        //每次測量間隔60ms
}        
}


/****************數(shù)碼管******************/
/*******************************************************************************
函 數(shù) 名         : DigDisplay
* 函數(shù)功能                   : 使用數(shù)碼管顯示
* 輸    入         : 無
* 輸    出         : 無
*******************************************************************************/
void DigDisplay()
{
        uchar i;
        uint j;
        for(i=1;i<4;i++)
        {
                switch(i)         //位選,選擇點亮的數(shù)碼管,
                {
                        case(1):
                                LSA=0;LSB=1;LSC=1;break;//顯示第1位
                        case(2):
                                LSA=1;LSB=0;LSC=1; break;//顯示第2位
                        case(3):
                                LSA=1;LSB=1;LSC=0; break;//顯示第3位
                        //case(4):
                               // LSA=1;LSB=1;LSC=1;LSD=0; break;//顯示第3位

                }
                GPIO_DIG=disbuff[i];//發(fā)送段碼
                j=10;                                                 //掃描間隔時間設(shè)定
                while(j--);        
                GPIO_DIG=0x00;//消隱
        }
}
/*****************數(shù)碼管顯示函數(shù)*******************/

    void Conut3(uint x)
        {
         if(x>=42000)   //超出測量范圍顯示“ERR0”
         {         
          disbuff[0]=0x3f;           //“-”
          disbuff[1]=0x50;           //“-”
          disbuff[2]=0x50;           //“-”
          disbuff[3]=0x79;           //“-”
         }
         else
         {
          disbuff[3]=DIG_CODE[x%10000/1000];
          disbuff[2]=DIG_CODE[x%1000/100];
          disbuff[1]=DIG_CODE[x%100/10];
          disbuff[0]=DIG_CODE[x%10/1];
         }
        }
/****************數(shù)碼管***********************/
void SMG()            
{   
    //uint i;               
    init_t0();          //定時器0初始化   
    init_measuring();  //超聲波相應(yīng)端口初始化


       //for(i=0;i<1;i++)
        while(1)
        {
        trigger();      //觸發(fā)超聲波啟動

                 while(RX==0)          //等待回聲
         {
           ;
         }

                 measuring();           //進行距離測量
                 DigDisplay();
                 Conut3(distance);    //對測量結(jié)果進行顯示
                 init_measuring();    //超聲波相應(yīng)端口初始化
                 delayt(60);        //每次測量間隔60ms
}        
}


/*……………………………………………中斷服務(wù)函數(shù)…………………………*/

void T_0()interrupt 1
{
        TF0 = 0;
        TL0 = 0x66;
        TH0 = 0xfc;
        count++;
        if(count==18)
        {
          TR0 =0;
          TL0 = 0x66;
          TH0 = 0xfc;
          count = 0;
        }
}

/***********************藍牙********************************/
void UART_Init(void)
{   
        TMOD &= 0x0f;   // 清空定時器1      
        TMOD |= 0x20;        // 定時器1工作于方式2
        TH1 = 0xfd;                // 為定時器1賦初值
        TL1 = 0xfd;                // 等價于將波特率設(shè)置為9600
        ET1 = 0;                // 防止中斷產(chǎn)生不必要的干擾
        TR1 = 1;                // 啟動定時器1

                //PS=1;
        SCON |= 0x50;        // 串口工作于方式1,允許接收
}



void main(void)
{
  uchar X;

  UART_Init();
  while(1)
  {
     X=SBUF;
     while(!RI);
     RI=0;
    /* switch(X)
{case 'L':
       LCD(); break;
case 'S':
       SMG();  break;
case 'B':
      Buzzer(); break;
}  */
//default:break;

    if(X=='L')
      LCD();      
    else if(X=='S')
      SMG();     
     else //if(X=='B')   
      Buzzer();
         //else
           // {;}       
   //}
}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:188933 發(fā)表于 2017-4-20 19:40 | 只看該作者
但是實現(xiàn)不了,求助大神
回復(fù)

使用道具 舉報

板凳
ID:188933 發(fā)表于 2017-4-20 19:42 | 只看該作者
坐等大神   O(∩_∩)O謝謝
回復(fù)

使用道具 舉報

地板
ID:192776 發(fā)表于 2017-4-23 19:32 | 只看該作者
一起學(xué)習(xí)。
回復(fù)

使用道具 舉報

5#
ID:399132 發(fā)表于 2018-10-4 16:49 | 只看該作者
沒電路圖啊,數(shù)碼管用什么驅(qū)動的
回復(fù)

使用道具 舉報

6#
ID:407566 發(fā)表于 2018-12-1 16:01 | 只看該作者
你好,那如果是超聲波和pwm調(diào)光結(jié)合的話,那應(yīng)該怎么實現(xiàn)超聲波測到一定的距離使pwm調(diào)亮調(diào)暗
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表