欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
超聲波測距單片機源碼
[打印本頁]
作者:
jlqiu
時間:
2017-6-2 10:36
標題:
超聲波測距單片機源碼
超聲波測距源碼
超聲波測距源碼.docx
(12.91 KB, 下載次數: 4)
2017-6-2 10:34 上傳
點擊文件名下載附件
源碼
下載積分: 黑幣 -5
/**************************************************************************/
*********采用IO口TRIG觸發測距,給至少10us的高電平信號; (2)模塊自動發送8個40khz
的方波,自動檢測是否有信號返回; (3)有信號返回,通過IO口ECHO輸出一個高電平,
高電平持續的時間就是超聲波從發射到返回的時間。*****************************/
#include"reg52.h"
#include"intrins.h"
#define uchar unsigned char
#define uint unsigned int
uchar code table[]={'0','1','2','3','4','5','6','7','8','9'};// 顯示段碼值0123456789
sbit lcden=P3^4; //定義LCD使能端
sbit lcdrs=P3^5; //定義LCD讀寫端
sbit dula=P2^6; //數碼管段先端
sbit wela=P2^7; //數碼管位先端
/***********************************************/
/**********超聲波檢測引腳和變量定義*******************************/
sbit Trig=P2^4;// 定義HC-SR04發送端
sbit Echo=P2^5;//定義HC-SR04接收端
uint gewei='0'; //測量距離的個位
uint shiwei='0'; // 測量距離的十位
uint baiwei='0'; //測量距離的百位
uint s,time,flag;
/***********************************************/
/**********延時MS函數*******************************/
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
/***********************************************/
/**********延時uS函數*******************************/
void delay_uS(uint z)
{
while(z--);
}
/***********************************************/
/**********寫命令*******************************/
void write_com(uchar com)
{
lcdrs=0; //寫命令信號
P0=com; //寫命令字
delay(5); //延時
lcden=1; //開使能端
delay(5);
lcden=0;
}
/***********************************************/
/**********寫數據*******************************/
void write_data(uchar date)
{
lcdrs=1; //寫數據信號
P0=date; //寫數據
delay(5); //延時
lcden=1; //開使能端
delay(5);
lcden=0;
}
/**********************************************/
/***********************************************/
/**********LCD1602初始化函數*******************************/
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38); //設置16X2顯示,5X7點陣顯示
write_com(0x0c); //開顯示,不顯光標
write_com(0x06); //顯示一個字符后,地址指針加1且光標加1
write_com(0x01); //清屏
write_com(0x80+0x01); //從第一行0X10地址位開始顯示
}
/***********************************************/
/**********計算距離函數*******************************/
void count(void)
{
time=TH0*256+TL0; //檢測所需時間
TH0=0;
TL0=0;
s=time/58;// 計算距離,算出來的單位是CM
gewei=table[s%1000];
shiwei=table[s%1000/100];
baiwei=table[s%1000%100%10];
}
/***********************************************/
/**********T0中斷函數*******************************/
void Time0() interrupt 1 //T0中斷用作計數器溢出,超出測距范圍
{
flag=1; //中斷溢出標志
}
/***********************************************/
/**********啟動模塊函數*******************************/
void startmodle(void) //啟動檢測模塊
{
Trig=1; //啟動一次檢測模塊
delay_uS(20);
Trig=0; //停止向檢測模塊Trig端發送高電平
}
/***********************************************/
/**********中斷初始化函數*******************************/
void InterruptInit(void) //中斷初始化
{
TMOD=0x01; //高T0工作方式為方式1,GATE=1
TH0=0;
TL0=0;
ET0=1; //允許T0中斷
EA=1; // 開啟總中斷
}
/***********************************************/
/**********顯示函數*******************************/
void Display(void)
{
write_com(0x80+0x02);
write_data(baiwei);
write_com(0x80+0x03);
write_data('.');
write_com(0x80+0x04);
write_data(shiwei);
write_com(0x80+0x05);
write_data(gewei);
write_com(0x80+0x06);
write_data('M');
}
/***********************************************/
/**********主函數*******************************/
void main(void)
{
init(); //初始化LCD1602
while(1)
{
InterruptInit(); //中斷初始化
startmodle(); // 啟動檢測模塊
while(!Echo); //當接收為零時等待
TR0=1; //開啟計數
while(Echo); //當接收為1計數并等待
TR0=0; //關閉計數
count(); //計算距離
Display(); // 顯示距離,以M為單位
delay(500); //延時80MS
}
}
復制代碼
作者:
jlqiu
時間:
2017-6-2 13:35
歡迎大家來討論
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1