欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標(biāo)題:
AT89S51單片機(jī)超聲波測距系統(tǒng)Proteus仿真+注釋詳細(xì)的代碼
[打印本頁]
作者:
太太天真
時間:
2019-6-20 14:02
標(biāo)題:
AT89S51單片機(jī)超聲波測距系統(tǒng)Proteus仿真+注釋詳細(xì)的代碼
測距精度不是特別的準(zhǔn)確。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
0.png
(15.65 KB, 下載次數(shù): 71)
下載附件
2019-6-20 17:56 上傳
單片機(jī)源程序如下:
// 基于AT89C51/52單片機(jī)的超聲波測距系統(tǒng)
// 測量范圍:40-690厘米
// 晶振:12MH
// 2015年5月
#include <REGX51.H> //頭文件
#include <intrins.h> //頭文件
#define uchar unsigned char
#define uint unsigned int
#define bjh P3_1 //定值輸出(繼電器)
#define sx P0_2 //報警值輸出(聲音)
#define csbout P2_7 //超聲波發(fā)送
#define csbint P3_5 //超聲波接收
uchar ec,cls,cs,mq,xm0,xm1,xm2,sec20,sec,sec1,buffer[3]; //程序中使用的變量
uchar convert[10]={0x81,0xED,0xA2,0xA8,0xCC,0x98,0x90,0xAD,0x80,0x88};//0~9段碼
uint zzz,dz,i,jsz,t;//程序中使用的變量 zzz:測量上限,dz:報警定值,i:延時變量,jsz:距離測量結(jié)果,t:時間
static uchar bdata ke; //可位尋址的狀態(tài)寄存器
float csbc; //超聲波速儲存單元
sbit LED1 = P3^4; //數(shù)碼管位驅(qū)動
sbit LED2 = P3^2; //數(shù)碼管位驅(qū)動
sbit LED3 = P3^3; //數(shù)碼管位驅(qū)動
void delay(i); //延時函數(shù)
void scanLED(); //顯示函數(shù)
void timeToBuffer(); //顯示轉(zhuǎn)換函數(shù)
void time(); //計(jì)時處理
void csbcj(); //超聲波測量處理
void bgcl(); //繼電器報警處理
void csbfs(); //超聲波發(fā)送
void offmsd(); //百位為零時不顯示處理
void main() //主程序
{
EA=1; //開中斷
TMOD=0x11; //設(shè)定時器1定時
csbout=1; //單片機(jī)超聲波輸出端口置高電平
TR1=0; //定時器1停止工作
zzz=699; //測量上限值
mq=40; //盲區(qū)值
dz=120; //報警值初值
cls=1; //每秒測量次數(shù)
csbc=0.034; //20度時的超聲波速度:厘米/uS
bjh=1; //繼電器停止工作
sx=0; //蜂鳴器停止工作
ec=100;
while(1)
{
ec++;
if (ec>100) //超聲波測量標(biāo)志為100時進(jìn)行測量
{
cls=~cls;
ec=0; //超聲波測量標(biāo)志置0
csbcj(); //調(diào)用超聲波測量程序
timeToBuffer(); //調(diào)用轉(zhuǎn)換段碼功能模塊
offmsd(); //調(diào)用顯示轉(zhuǎn)換程序
bgcl(); //調(diào)用報警處理程序
}
scanLED(); //調(diào)用顯示函數(shù)
if((jsz<dz)&(cls==1)) //判斷是否達(dá)到報警值
{
i=5;
while(i--)
{
sx=~sx; //發(fā)出“滴”聲響
delay(70);
}
}
else {sx=0;}
}
}
void delay(i) //延時子程序
{
while(--i);
}
void scanLED() //顯示功能模塊
{
P2=buffer[2]; //顯百位段
LED1=0; //顯百位位
delay(40); //百位顯示延時 程序要下載到實(shí)物中時改為delay(2); 下同
LED1=1; //關(guān)閉百位顯示
delay(2); //關(guān)閉百位顯示延時 程序要下載到實(shí)物中時改為delay(50); 下同
P2=buffer[1]; //顯十位段
LED2=0; //顯十位位
delay(40); //百十位顯示延時
LED2=1; //關(guān)閉十位顯示
delay(2); //關(guān)閉十位顯示延時
P2=buffer[0]; //顯個位段
LED3=0; //顯個位位
delay(40); //顯個位段
LED3=1; //百關(guān)閉個位顯示
delay(2); //百關(guān)閉個位顯示延時
}
void timeToBuffer() //轉(zhuǎn)換段碼功能模塊
{
if (jsz>zzz) //測量值大于測量上限時顯示“CCC”
{
buffer[0]=0x93; //顯示 C
buffer[1]=0x93; //顯示 C
buffer[2]=0x93; //顯示 C
}
else if (jsz<mq) //測量值小于測量下限時顯示“CCC"
{
buffer[0]=0xFE; //顯示 -
buffer[1]=0xFE; //顯示 -
buffer[2]=0xFE; //顯示 -
}
else
{
xm0=jsz/100; //計(jì)算百位值
xm1=(jsz-xm0*100)/10; //計(jì)算十位值
xm2=jsz-xm0*100-xm1*10; //計(jì)算個位值
buffer[0]=convert[xm2]; //進(jìn)行個位顯示段碼轉(zhuǎn)換
buffer[1]=convert[xm1]; //進(jìn)行十位顯示段碼轉(zhuǎn)換
buffer[2]=convert[xm0]; //進(jìn)行百位顯示段碼轉(zhuǎn)換
if (buffer[2]==0x81) //判斷百位是否為零
{
buffer[2]=0xFF; //百位為零時不顯示
}
}
}
void csbcj() //超聲波測距程序
{
TR0=0; //停止定時器1工作
TH1=0x00; //計(jì)時器1清零
TL1=0x00; //計(jì)時器1清零
csbint=1; //置單片機(jī)超聲波接收口高高電平
sx=0; //停止報警聲響
delay(1700); //進(jìn)行延時
csbfs(); //調(diào)用超聲波發(fā)送子程序:CSBFS.ASM
csbout=1; //置單片機(jī)超聲波輸出端口P2.7為高電平
TR1=1; //超聲波發(fā)頭發(fā)送完超聲波后,啟動定時器1進(jìn)行計(jì)時
i=250; //盲區(qū)處理系數(shù)
while(i--) //盲區(qū)延時處理
{
}
i=0;
while(csbint) //進(jìn)行超聲波回波判斷,判斷接收回路是否收到超聲波的回波,接收到回波時,csbint=0
{
i++;
if(i>=3300) //規(guī)定時間沒收到回波時退出判斷處理程序
csbint=0; //規(guī)定時間內(nèi)接收到回波時,置csbint=0
}
TR1=0; //停止計(jì)時器1計(jì)時
t=TH1; //提取計(jì)時器記錄的高8位值
t=t*256+TL1; //計(jì)算計(jì)時的總時間
TR0=1; //恢復(fù)定時器0工作
csbint=1; //超聲波接收端置高電平,這下次測量做準(zhǔn)備
jsz=t*csbc; //計(jì)算測量結(jié)果
jsz=jsz/2; //計(jì)算測量結(jié)果
}
void bgcl() //報警處理繼電器動作判斷程序
{
if (jsz<dz) //測量值低于設(shè)定的報警值,繼電器吸合
{
bjh=0; //繼電器吸合
}
else
{
bjh=1; //繼電器斷開
}
}
void offmsd() //百位為數(shù)0判斷模塊
{
if (buffer[2]==0x81) //如果值為零時百位不顯示
buffer[2] = 0xff;
}
復(fù)制代碼
所有資料51hei提供下載:
超聲波.7z
(27.31 KB, 下載次數(shù): 69)
2019-6-20 14:00 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1