久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费
標題:
CX20106+4069超聲波測距電路與單片機源碼(帶詳細代碼注釋)
[打印本頁]
作者:
807086295
時間:
2018-5-14 00:12
標題:
CX20106+4069超聲波測距電路與單片機源碼(帶詳細代碼注釋)
0.png
(42.15 KB, 下載次數: 31)
下載附件
2018-5-14 02:55 上傳
超聲波測距IC模塊電路原理圖如下:
0.png
(48 KB, 下載次數: 18)
下載附件
2018-5-14 02:54 上傳
單片機源程序如下:
/*
* 超聲波測距模塊(CX20106+4069版本)
*
* 用途:超聲波測距模塊測試程序
*
* 作者 日期 備注
* Huafeng Lin 20011/01/05 新增
* Huafeng Lin 20011/01/05 修改
*
*/
#include<reg51.h>
#include<INTRINS.H>
#define uchar unsigned char
#define uint unsigned int
#define nop _nop_()
#define LCM_Data P2 //數據接口
#define Busy 0x80 //用于檢測LCM狀態字中的Busy標識
uint dis;
uchar flag=0,high_time,low_time;
sbit in=P3^3; //外部中斷1,接CX20106的7腳
sbit csb=P1^0; //40KHz方波輸出腳
sbit LCM_RW = P0^1; //讀寫控制輸入端,LCD1602的第五腳
sbit LCM_RS = P0^2; //寄存器選擇輸入端,LCD1602的第四腳
sbit LCM_E = P0^0; //使能信號輸入端,LCD1602的第6腳
void WriteDataLCM (uchar WDLCM); //LCD模塊寫數據
void WriteCommandLCM (uchar WCLCM,BuysC); //LCD模塊寫指令
uchar ReadDataLCM (void); //LCD模塊讀數據
uchar ReadStatusLCM (void); //讀LCD模塊的忙標
void DisplayOneChar (uchar X,uchar Y,uchar ASCII); //在第X+1行的第Y+1位置顯示一個字符
void DisplayListChar (uchar X,uchar Y,uchar delayms,uchar code *DData);
void DisplayCursorPos (uchar X, uchar Y);
void LCMInit (void);
void DisplayIntData (uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu);
void DisplayCharData (uchar X, uchar Y,uchar ZiFu);
void DelayUs(uint us);
void DelayMs(uint Ms);
void init(void); //初始化
void delay_nms(uint n); //延時nms
void display(uint dat); //顯示函數
void tran(void); //發射超聲波
void delay100us(); //延時100us
/**********************************
函數名稱:初始化函數
修改日期:
入口參數:無
返回值: 無
**********************************/
void init(void)
{
TMOD=0x01;//定時器0方式1用于計時,定時器1用于產生38K方波
TH0=0;
TL0=0; /* 設定T0的工作模式為2*/
EA=1;
IT1=1;//下降沿有效,左傳感器
}
/**********************************
函數名稱:延時函數
修改日期:
入口參數:n
返回值: 無
**********************************/
void delay_nms(uint n)
{
uchar i;
while(n--)
{
for(i = 0; i < 123; i++);
} ;
}
/************************************************
延時100us函數
***********************************************/
void delay100us()
{
uchar j;
for(j=50;j>0;j--);
}
/**********************************
函數名稱:超聲波發射函數
修改日期:
入口參數:無
返回值: 無
**********************************/
void tran(void)
{
uchar i;
float temp;
TH0=0;
TL0=0;//清定時0
TR0=1;//開定時0
for(i=8;i>0;i--)
{
csb=!csb;
//nop;
//nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
nop;
}
csb=1;
delay_nms(1);//延時1ms左右后再開中斷,避免直接回來的回波
EX1=1;
delay_nms(50);
if(flag==1)
{
temp=high_time*256+low_time;
temp=(temp/1000)/2;
temp*=344;
temp=temp/10;
//if(temp>10)
dis=(unsigned int)temp;
flag=0;
}
//else dis=0;
}
/**********************************
函數名稱:中斷函數
修改日期:
入口參數:無
返回值: 無
**********************************/
void TT() interrupt 2
{
uint tmp;
TR0=0;//關定時器0
ET1=0;//關外部中斷
//flag=1;//外部中斷標志位
tmp=TH0*256+TL0;
if((tmp>0)&&(tmp<60000))
{
high_time=TH0;
low_time=TL0;
flag=1;
}
else
{
high_time=0;
low_time=0;
}
}
/*===========================================================================
主程序
=============================================================================*/
void main(void)
{
uchar i;
uint tp=0;
init();
LCMInit();
DisplayOneChar(1,10,'M');
DisplayListChar(0,0,0,"LCSOFT (C) 2011");
while(1)
{
tran();
for(i=100;i>0;i--)
{
DisplayIntData(1,9,dis,4,2);
}
}
}
/*====================================================================
功 能: 在1602顯示一個整數數據
說 明: 顯示一個整數數據-9999->32625. 從右至左顯示數據5位:
======================================================================*/
void DisplayIntData(uchar X, uchar Y,int ZhengShu,uchar Digit,uchar XiaoShu)
{
uchar i=0,k=0, BCD[5]={0};
if(Digit>5) Digit=5;
if(ZhengShu<0)
{
k=1;//負數示志位
ZhengShu=-ZhengShu;
}
BCD[4] = ZhengShu / 10000; //求出萬位數據
ZhengShu = ZhengShu % 10000;
BCD[3] = ZhengShu / 1000; //求出千位數據
ZhengShu = ZhengShu % 1000;
BCD[2] = ZhengShu / 100; //求出百位數據
ZhengShu = ZhengShu % 100;
BCD[1] = ZhengShu / 10; //求出十位數據
BCD[0] = ZhengShu % 10; //求出個位數據
for(i=0;i<Digit;i++)//輸出顯示的數值
{
if((i==XiaoShu)&&(0!=XiaoShu))
{
DisplayOneChar(X,Y-i,'.');//輸出小數點
Y= Y-1;
}
DisplayOneChar(X,Y-i,BCD[i]+0x30); //顯示一個字符
}
if(k==1)
DisplayOneChar(X,Y-1,'-');//輸出負符
}
/*====================================================================
功 能:在1602顯示一個字符數據
說 明:顯示一個字符數據0~256. 從左至右顯示數據3位
======================================================================*/
void DisplayCharData(uchar X, uchar Y,uchar ZiFu)
{
uchar i=0;
uchar ValueBCD[3];
ValueBCD[0] = ZiFu / 100; //求出百位數據
ZiFu = ZiFu % 100;
ValueBCD[1] = ZiFu / 10; //求出十位數據
ValueBCD[2] = ZiFu % 10; //求出個位數據
for(i=0;i<3;i++)//輸出顯示的數值
{
DisplayOneChar(X,Y+i,ValueBCD[i]+0x30); //顯示一個字符
}
}
/*======================================================================
LCM初始化
======================================================================*/
void LCMInit(void)
{
LCM_Data = 0;
WriteCommandLCM(0x38,0); //三次顯示模式設置,不檢測忙信號
DelayMs(5);
WriteCommandLCM(0x38,0);
DelayMs(5);
WriteCommandLCM(0x38,0);
DelayMs(5);
WriteCommandLCM(0x38,1); //顯示模式設置,開始要求每次檢測忙信號
WriteCommandLCM(0x08,1); //關閉顯示
WriteCommandLCM(0x01,1); //顯示清屏
WriteCommandLCM(0x06,1); // 顯示光標移動設置
WriteCommandLCM(0x0C,1); // 顯示開及光標設置
DelayMs(100);
}
/*====================================================================
顯示光標的位置
====================================================================*/
void DisplayCursorPos( unsigned char X, unsigned char Y)
{
X &= 0x1;
Y &= 0xF; //限制Y不能大于15,X不能大于1
if (X) Y |= 0x40; //當要顯示第二行時地址碼+0x40;
Y |= 0x80; // 算出指令碼
WriteCommandLCM(Y, 1); //這里不檢測忙信號,發送地址碼
}
/*====================================================================
按指定位置顯示一串字符:第 X 行,第 y列
注意:字符串不能長于16個字符
======================================================================*/
void DisplayListChar(uchar X,uchar Y,uchar delayms, uchar code *DData)
{
unsigned char ListLength;
ListLength = 0;
X &= 0x1;
Y &= 0xF; //限制X不能大于15,Y不能大于1
while (DData[ListLength]!='\0') //若到達字串尾則退出
{
if (Y <= 0xF) //X坐標應小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //顯示單個字符
ListLength++;
Y++;
DelayMs(delayms);//延時顯示字符串
}
else
break;//跳出循環體
}
}
/*====================================================================
設定延時時間:x*1us
====================================================================*/
void DelayUs(uint us)
{
while(us--);
}
/*====================================================================
設定延時時間:x*1ms
====================================================================*/
void DelayMs(uint Ms)
{
uint i,TempCyc;
for(i=0;i<Ms;i++)
{
TempCyc = 250;
while(TempCyc--);
}
}
/*=====================================================================
寫數據函數: E =高脈沖 RS=1 RW=0
======================================================================*/
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //檢測忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0; //若晶振速度太高可以在這后加小的延時
LCM_E = 0; //延時
LCM_E = 1;
}
/*====================================================================
寫指令函數: E=高脈沖 RS=0 RW=0
======================================================================*/
void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC為0時忽略忙檢測
{
if (BuysC) ReadStatusLCM(); //根據需要檢測忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
}
/*====================================================================
//讀數據
======================================================================*/
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
return(LCM_Data);
}
/*====================================================================
正常讀寫操作之前必須檢測LCD控制器狀態:E=1 RS=0 RW=1;
DB7: 0 LCD控制器空閑,1 LCD控制器忙。
讀狀態
======================================================================*/
unsigned char ReadStatusLCM(void)
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
LCM_E = 0;
LCM_E = 1;
while (LCM_Data & Busy); //檢測忙信號
return(LCM_Data);
}
/*======================================================================
功 能: 在1602 指定位置顯示一個字符:第一行位置0~15,第二行16~31
說 明: 第 X 行,第 y 列 注意:字符串不能長于16個字符
======================================================================*/
void DisplayOneChar( unsigned char X, unsigned char Y, unsigned char ASCII)
{
X &= 0x1;
Y &= 0xF; //限制Y不能大于15,X不能大于1
if (X) Y |= 0x40; //當要顯示第二行時地址碼+0x40;
Y |= 0x80; // 算出指令碼
WriteCommandLCM(Y, 0); //這里不檢測忙信號,發送地址碼
WriteDataLCM(ASCII);
}
復制代碼
所有資料51hei提供下載:
超聲波測距LC模塊.rar
(317.06 KB, 下載次數: 61)
2018-5-14 00:11 上傳
點擊文件名下載附件
超聲波模塊
下載積分: 黑幣 -5
作者:
zhouwang4135463
時間:
2018-8-13 21:40
為什么我做出來測出來沒有用啊
歡迎光臨 (http://www.zg4o1577.cn/bbs/)
Powered by Discuz! X3.1
主站蜘蛛池模板:
久久久久中文字幕
|
亚洲精品v日韩精品
|
日韩中文字幕
|
精品久久香蕉国产线看观看亚洲
|
日本免费在线
|
久久99精品国产99久久6男男
|
亚洲精品一
|
在线观看www视频
|
欧美日韩亚洲国产综合
|
国产亚洲精品精品国产亚洲综合
|
国产一二三视频在线观看
|
国产精品日日做人人爱
|
在线观看特色大片免费网站
|
日韩欧美一级精品久久
|
欧美日韩亚洲一区
|
久久精品欧美一区二区三区不卡
|
手机看黄av免费网址
|
国产区精品视频
|
欧美激情精品久久久久久变态
|
亚洲国产精品一区
|
玖操
|
欧美日韩亚洲视频
|
国产精品国产三级国产aⅴ原创
|
中文字幕精品一区二区三区精品
|
国产成人在线视频免费观看
|
日韩av一区二区在线观看
|
欧美伊人影院
|
欧美极品视频在线观看
|
欧美二区乱c黑人
|
国产成人叼嘿视频在线观看
|
国产精品久久久久国产a级 欧美日韩国产免费
|
久久久久国产一区二区三区四区
|
精品一区在线看
|
成人伊人
|
亚洲成av人影片在线观看
|
91精品久久久久
|
精品二
|
最新中文字幕在线播放
|
国产在线一区二区三区
|
龙珠z国语版在线观看
|
免费观看成人性生生活片
|