久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2163|回復: 1
打印 上一主題 下一主題
收起左側

51智能小車超聲波測距lcd顯示源碼

[復制鏈接]
跳轉到指定樓層
樓主
ID:330146 發表于 2019-3-20 09:15 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
51智能小車超聲波測距lcd顯示源碼
#include <reg52.h>
#include <intrins.h>
#include "lcd.h"
sbit ENA = P1^6; //定義ENA為P1^1端口
sbit ENB = P1^7;
sbit IN1 = P1^2;
sbit IN2 = P1^3;
sbit IN3 = P1^4;
sbit IN4 = P1^5;
sbit Trig = P2^1;
sbit Echo = P2^0;
sbit left_1_led = P3^4; //宏定義左避障模塊為p3^6口
sbit right_1_led = P3^5;//宏定義右避障模塊為p3^7口
sbit left_x = P3^7;
sbit right_x = P3^6;
unsigned char pwm_t = 0; //定義周期
unsigned char Disp[]="  4:XU:TIAN:ZAN   ";
unsigned char code ASCII[15] = {'0','1','2','3','4','5','6','7','8','9','.','-','M'};
unsigned char left_pwm_val = 100,right_pwm_val = 100; //左右電機占空比值
static unsigned char DisNum = 0; //顯示用指針      
       unsigned int  time=0;
    unsigned long S=0;
    bit      flag =0;
    unsigned char disbuff[4]    ={ 0,0,0,0,};
   
   
   
void Conut(void)
{
  time=TH1*256+TL1;
  TH1=0;
  TL1=0;

  S=(time*1.7)/100;     //算出來是CM
  if((S>=700)||flag==1) //超出測量范圍顯示“-”
  {  
   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 3    //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 run() //小車前進函數
{
IN1 = 1; //左電機前進
IN2 = 0;
IN3 = 1; //右電機前進
IN4 = 0;
}
//左轉
     void  leftrun(void)
{  
     IN1 = 0;
    IN2 = 0;
    IN3 = 1;
    IN4 = 0;
}
//右轉
     void  rightrun(void)
{
    IN1 = 1;
    IN2 = 0;
    IN3 = 0;
    IN4 = 0;   
}
//停止
     void  stop(void)
{  
     IN1 = 0;
    IN2 = 0;
    IN3 = 0;
    IN4 = 0;
  
}
void bi(void)  //小車避障函數
{
//有信號為0 無信號為1
if(left_1_led == 1 && right_1_led == 1)  
{
  run();
}
if(left_1_led == 1 && right_1_led == 0)
{
  stop();
}
if(left_1_led == 0 && right_1_led == 1)
{
  stop();
}
if(left_1_led == 0 && right_1_led == 0)
{
  stop();
}
}
void timer0(void) interrupt 1 //定時器中斷服務程序
{

pwm_t++;  
if(pwm_t == 255) //周期最大值時 清零
  pwm_t = ENA = ENB = 0;

if(left_pwm_val == pwm_t) //左電機占空比等于周期時
  ENA = 1;                //使能ENA
if(right_pwm_val == pwm_t) //右電機占空比等于周期時
  ENB = 1;                //使能ENB
}
void Time0Config()  
{
TMOD|= 0x02;   //八位自動重裝模式
TH0= 220;    //1ms定時
  TL0= 220;
ET0 = 1;    //允許定時器0中斷
EA = 1;     //開啟總中斷
TR0 = 1;   //開啟定時器0
}
void Time1Config()  
{
  TMOD=0x10;     //設T0為方式1,GATE=1;
  TH1=0;
  TL1=0;         
  ET1=1;             //允許T1中斷
  EA=1;      //開啟總中斷
}
void main(void)
{

LcdInit();
LcdShowStr(0,0,Disp);
Time1Config();
Time0Config(); //定時器函數
while(1) //無限循環
{
     StartModule();
      while(!Echo);  //當RX為零時等待
      TR1=1;       //開啟計數
    while(Echo);   //當RX為1計數并等待
    TR1=0;    //關閉計數
    Conut();   //計算
     delayms(10);
  if((left_x!=1)||(right_x!=1))
  {
   if((left_x==1)&&(right_x==0))
   {
    bi();
    leftrun();
   }
   if((left_x==0)&&(right_x==1))
   {
    bi();
        rightrun();
   }
   if((left_x==0)&&(right_x==0))
   {
    bi();
    run();
   }
  
  if((left_x==1)&&(right_x==1))
  {
   stop();
  }
}
}
}
lcd顯示
#include "lcd.h"
/*******************************************************************************
* 函 數 名         : Lcd1602_Delay1ms
* 函數功能     : 延時函數,延時1ms
* 輸    入         : c
* 輸    出         : 無
* 說    名         : 該函數是在12MHZ晶振下,12分頻單片機的延時。
*******************************************************************************/
void Lcd1602_Delay1ms(uint c)   //誤差 0us
{
    uchar a,b;
for (; c>0; c--)
{
   for (b=199;b>0;b--)
   {
     for(a=1;a>0;a--);
   }      
}
     
}
/*******************************************************************************
* 函 數 名         : LcdWriteCom
* 函數功能     : 向LCD寫入一個字節的命令
* 輸    入         : com
* 輸    出         : 無
*******************************************************************************/
#ifndef  LCD1602_4PINS  //當沒有定義這個LCD1602_4PINS時
void LcdWriteCom(uchar com)   //寫入命令
{
LCD1602_E = 0;     //使能
LCD1602_RS = 0;    //選擇發送命令
LCD1602_RW = 0;    //選擇寫入

LCD1602_DATAPINS = com;     //放入命令
Lcd1602_Delay1ms(1);  //等待數據穩定
LCD1602_E = 1;           //寫入時序
Lcd1602_Delay1ms(5);   //保持時間
LCD1602_E = 0;
}
#else
void LcdWriteCom(uchar com)   //寫入命令
{
LCD1602_E = 0;  //使能清零
LCD1602_RS = 0;  //選擇寫入命令
LCD1602_RW = 0;  //選擇寫入
LCD1602_DATAPINS = com; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1;  //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = com << 4; //發送低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;  //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數 名         : LcdWriteData
* 函數功能     : 向LCD寫入一個字節的數據
* 輸    入         : dat
* 輸    出         : 無
*******************************************************************************/     
#ifndef  LCD1602_4PINS     
void LcdWriteData(uchar dat)   //寫入數據
{
LCD1602_E = 0; //使能清零
LCD1602_RS = 1; //選擇輸入數據
LCD1602_RW = 0; //選擇寫入
LCD1602_DATAPINS = dat; //寫入數據
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //寫入時序
Lcd1602_Delay1ms(5);   //保持時間
LCD1602_E = 0;
}
#else
void LcdWriteData(uchar dat)   //寫入數據
{
LCD1602_E = 0;   //使能清零
LCD1602_RS = 1;   //選擇寫入數據
LCD1602_RW = 0;   //選擇寫入
LCD1602_DATAPINS = dat; //由于4位的接線是接到P0口的高四位,所以傳送高四位不用改
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
LCD1602_DATAPINS = dat << 4; //寫入低四位
Lcd1602_Delay1ms(1);
LCD1602_E = 1;   //寫入時序
Lcd1602_Delay1ms(5);
LCD1602_E = 0;
}
#endif
/*******************************************************************************
* 函 數 名       : LcdInit()
* 函數功能   : 初始化LCD屏
* 輸    入       : 無
* 輸    出       : 無
*******************************************************************************/     
#ifndef  LCD1602_4PINS
void LcdInit()        //LCD初始化子程序
{
  LcdWriteCom(0x38);  //開顯示
LcdWriteCom(0x0c);  //開顯示不顯示光標
LcdWriteCom(0x06);  //寫一個指針加1
LcdWriteCom(0x01);  //清屏
LcdWriteCom(0x80);  //設置數據指針起點
}
#else
void LcdInit()        //LCD初始化子程序
{
LcdWriteCom(0x32);  //將8位總線轉為4位總線
LcdWriteCom(0x28);  //在四位線下的初始化
LcdWriteCom(0x0c);  //開顯示不顯示光標
LcdWriteCom(0x06);  //寫一個指針加1
LcdWriteCom(0x01);  //清屏
LcdWriteCom(0x80);  //設置數據指針起點
}
#endif
void LcdSetCursor(unsigned char x,unsigned char y)  //坐標顯示
{
    unsigned char addr;
    if(y == 0)
        addr = 0x00 + x;
    else
        addr = 0x40 + x;
   
    LcdWriteCom(addr|0x80);
}
void LcdShowStr(unsigned char x,unsigned char y,unsigned char *str)     //顯示字符串
{
    LcdSetCursor(x,y);      //當前字符的坐標
    while(*str != '\0')
    {
        LcdWriteData(*str++);
    }
}
//按指定位置顯示一個字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1;
X &= 0xF; //限制X不能大于15,Y不能大于1
if (Y) X |= 0x40; //當要顯示第二行時地址碼+0x40;
X |= 0x80; //算出指令碼
LcdWriteCom(X); //發命令字
LcdWriteData(DData); //發數據
}

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

使用道具 舉報

沙發
ID:1 發表于 2019-3-20 18:23 | 只看該作者
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 嫩草视频在线 | 国产99久久精品 | 精品中文字幕一区 | 午夜视频免费在线观看 | 欧美精品一区二区三区在线四季 | 久久综合入口 | 亚洲国产aⅴ成人精品无吗 国产精品永久在线观看 | 国产精品久久久亚洲 | 日韩三区 | 91美女在线观看 | 成人一区二区在线 | 国产成人免费视频 | 嫩草网 | 亚洲免费视频播放 | 成人一区二区三区在线 | 日韩精品视频在线 | 国产激情一区二区三区 | 日韩精品在线观看一区二区三区 | 91黄色片免费看 | 可以在线观看av的网站 | 日韩一区二区三区四区五区六区 | 亚洲精品第一 | 91视频进入| 久久青| 91日日 | 久久久久久91香蕉国产 | www亚洲精品 | 日韩欧美在线视频观看 | 激情综合五月 | caoporn免费 | 午夜免费成人 | 毛片链接 | 亚洲精品 在线播放 | 日本成人在线播放 | 亚洲精品中文字幕 | 综合久久综合久久 | 日韩久久久一区二区 | 成人一区二区三区在线观看 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 国产午夜精品一区二区三区四区 | 2020天天操 |