登錄
|
立即注冊(cè)
|
使用QQ帳號(hào)登錄
論壇
>
資料共享
發(fā)帖
|
單片機(jī)超聲波測(cè)距液晶顯示加串口
看1491
|
回1
|
收藏
樓主
ID:578994
只看他
2019-7-6 16:26
當(dāng)初剛學(xué)51的代碼,莫見(jiàn)笑
單片機(jī)源程序如下:
代碼:
/******2018年11.30超聲波測(cè)距液晶顯示加串口******/
#include<reg51.h> //包含51頭文件
#include<lcd.c> //包含液晶1602顯示
sbit trig=P0^1; //控制端口定義
sbit echo=P0^0; //接收端口定義
unsigned char str[]={"wuxuesiceju!"}; //液晶屏顯示數(shù)組刷廣告
unsigned char juli[]={"0000cm!"}; //液晶屏顯示測(cè)量距離值數(shù)組
unsigned int time; //定義一個(gè)整型(全局)變量time
unsigned long s; //定義一個(gè)長(zhǎng)整型(全局)變量s
unsigned char flag=0; //定義一個(gè)字符型(全局)變量flag(計(jì)數(shù)器數(shù)到溢出標(biāo)記)
/******軟件延時(shí)函數(shù)延時(shí)20微秒(晶振11.0592MHz)******/
void Delay20us() //@11.0592MHz
{
unsigned char i;
// _nop_();
i = 6;
while (--i);
}
/******軟件延時(shí)函數(shù)延時(shí)1000毫秒(晶振11.0592MHz)******/
void Delay1000ms() //@11.0592MHz
{
unsigned char i, j, k;
// _nop_();
i = 8;
j = 1;
k = 243;
do
{
do
{
while (--k);
} while (--j);
} while (--i);
}
/******超聲波模塊啟動(dòng)函數(shù)(由時(shí)序圖得)******/
void start()
{ trig=1; //控制端高電平持續(xù)超過(guò)10us以上啟動(dòng)模塊
Delay20us(); //延時(shí)20us
trig=0; //控制端拉低
}
/******超聲波測(cè)距距離計(jì)算1602顯示函數(shù)******/
void count()
{ time=TH0*256+TL0; //計(jì)數(shù)器中的16進(jìn)制數(shù)據(jù)轉(zhuǎn)化為10進(jìn)制數(shù)(高位低位拼成一個(gè)整數(shù))
s=time*1.7/100; //超聲模塊測(cè)量距離計(jì)算公式(發(fā)出超聲波計(jì)數(shù)器開(kāi)始計(jì)數(shù),
//當(dāng)接收到反射回來(lái)的時(shí)停止,這個(gè)就是一個(gè)來(lái)回的時(shí)間,
//除以2再乘上聲速340m/s)
if((s>400)||(s<3)||(flag==1) ) //假如測(cè)量距離超過(guò)4m或者小于3cm或者計(jì)數(shù)器溢出1602顯示錯(cuò)誤提示
wstr(0xc0,"chaole!");
else //否則將測(cè)量距離顯示到1602上
{
juli[3] = s%10+48; //取出十位在轉(zhuǎn)為數(shù)字在液晶屏顯示
juli[2] = s/10%10+48; //取出百位在轉(zhuǎn)為數(shù)字在液晶屏顯示
juli[1] = s/100%10+48; //取出千位在轉(zhuǎn)為數(shù)字在液晶屏顯示
juli[0] = s/1000+48; //取出萬(wàn)位在轉(zhuǎn)為數(shù)字在液晶屏顯示
wstr(0xc0," ");//清空液晶屏
wstr(0xc0,juli); //指定液晶屏顯示位置
}
TH0=0X00; // 定時(shí)器初值為0
TL0=0X00; // 定時(shí)器初值為0
flag=0; // 溢出標(biāo)記置0
}
/******串口初始化函數(shù)******/
uart () //9600bps@11.0592MHz 【兩者波特率要一致】
{
TMOD=TMOD|0x20; //設(shè)置T1為定時(shí)器,工作在方式2
TH1=0XFD; //定時(shí)器T1初值253 波特率為96000b/s
TL1=0XFD; //定時(shí)器T1初值253 波特率為96000b/s
SCON=0X50; //設(shè)置串口工作方式1
PCON=0X00; //波特率不加倍
ET1=0; //定時(shí)器1的中斷允許開(kāi)關(guān)
ES=1; //開(kāi)啟串口中斷
TR1=1; //啟動(dòng)定時(shí)器
}
/******中斷服務(wù)子程序函數(shù)******/
t0int() interrupt 1 //中斷t0中斷服務(wù)子程序,中斷類(lèi)型號(hào)為1
{
flag=1; //溢出標(biāo)記賦值1
}
/******主程序******/
main()
{
unsigned char i; //定義一個(gè)字符型(局部)變量
Init(); //液晶屏1602初始化
wstr(0x80,str); //指定地址液晶屏顯示數(shù)組
TMOD=0x01; //定時(shí)器0工作在方式1
TH0=0x00; //定時(shí)器0初值為0
TL0=0x00; //定時(shí)器0初值為0
EA=1; //開(kāi)總中斷
ET0=1; //定時(shí)器0允許中斷
uart(); //串口初始化
while(1)
{
start(); //超聲波模塊初始化
while(echo==0) ; //判斷收端口是否為低電平(不是低電平什么也不干)
TR0=1; //啟動(dòng)定時(shí)器
while(echo==1) ; //判斷收端口是否為高電平(不是高電平什么也不干)
TR0=0; //關(guān)閉定時(shí)器
count(); //超聲波測(cè)距距離計(jì)算1602顯示函數(shù)初始化
Delay1000ms() ; //延時(shí)1000ms
for(i=0;i<7;i++) //將測(cè)量數(shù)據(jù)發(fā)送到電腦串口軟件
TL1=0XFD; //定時(shí)器T1初值253 波特率為96000b/s 【兩者波特率要一致】
{
SBUF=juli[i]; //測(cè)量數(shù)據(jù)寫(xiě)到SBUF,發(fā)送到電腦串口軟件
while(TI==0) ; //等待發(fā)送結(jié)束(沒(méi)發(fā)送完成什么也不干)
TI=0; //中斷標(biāo)志清零
}
}
}
所有資料51hei提供下載:
2018年11.30超聲波測(cè)距液晶顯示加串口.zip
(34.19 KB)
(下載次數(shù): 24, 2019-7-6 16:26 上傳)
下載積分: 黑幣 -5
沙發(fā)
ID:413568
只看他
2019-12-7 14:18
串口為什么顯示00
51黑電子論壇
Powered by
Discuz!
X3.1
首頁(yè)
|
標(biāo)準(zhǔn)版
|
觸屏版
|
電腦版