久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
51智能小車超聲波測距lcd顯示源碼
[打印本頁]
作者:
徐天贊
時間:
2019-3-20 09:15
標題:
51智能小車超聲波測距lcd顯示源碼
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); //發數據
}
作者:
admin
時間:
2019-3-20 18:23
本帖需要重新編輯補全電路原理圖,源碼,詳細說明與圖片即可獲得100+黑幣(帖子下方有編輯按鈕)
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
亚洲91精品
|
亚洲444eee在线观看
|
亚洲成人av一区二区
|
中文在线a在线
|
国产伦一区二区三区
|
一区二区视频在线
|
国产乱码久久久久久
|
美女爽到呻吟久久久久
|
av一区二区三区四区
|
精品三区
|
国产二区精品视频
|
日韩精品久久一区二区三区
|
亚洲乱码国产乱码精品精的特点
|
69热视频在线观看
|
蜜臀网站
|
欧美黄色性生活视频
|
中文字幕精品视频在线观看
|
日韩看片
|
99福利视频
|
岛国午夜
|
亚洲每日更新
|
精品综合在线
|
亚洲精品乱码久久久久久按摩观
|
国产日韩欧美中文
|
91新视频
|
成人欧美一区二区三区在线播放
|
亚洲精品电影网在线观看
|
99久久99
|
91直接看
|
亚洲视频在线一区
|
欧美激情一区二区三级高清视频
|
国产精品资源在线
|
九九热在线视频
|
日韩在线视频精品
|
久久精品无码一区二区三区
|
久久国内
|
国产高清精品一区二区三区
|
午夜三级在线观看
|
亚洲午夜av久久乱码
|
毛片区
|
国产伦精品一区二区三区照片91
|