導航:首頁 > 操作系統 > 單片機距離判斷程序

單片機距離判斷程序

發布時間:2022-10-24 23:19:24

㈠ 51單片機編寫不同距離發出不同信號的程序

程序?
你會超聲波測距程序嘛?
會就行啦!
還有,你說的震動的信號,那你得搭一個小馬達才行啊,用手機的小馬達就可以了。

至於閃光信號,接個LED搞定。

㈡ 求個51單片機超聲波測距(距離+報警)的c程序

//晶振=8M
//MCU=STC10F04XE
//P0.0-P0.6共陽數碼管引腳
//Trig = P1^0
//Echo = P3^2
#include <reg52.h> //包括一個52標准內核的頭文件
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
//***********************************************
sfr CLK_DIV = 0x97; //為STC單片機定義,系統時鍾分頻
//為STC單片機的IO口設置地址定義
sfr P0M1 = 0X93;
sfr P0M0 = 0X94;
sfr P1M1 = 0X91;
sfr P1M0 = 0X92;
sfr P2M1 = 0X95;
sfr P2M0 = 0X96;
//***********************************************
sbit Trig = P1^0; //產生脈沖引腳
sbit Echo = P3^2; //回波引腳
sbit test = P1^1; //測試用引腳

uchar codeSEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數碼管0-9
uint distance[4]; //測距接收緩沖區
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定義寄存器
bit succeed_flag; //測量成功標志
//********函數聲明
void conversion(uint temp_data);
void delay_20us();
//void pai_xu();

void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
CLK_DIV=0X03; //系統時鍾為1/8晶振(pdf-45頁)
P0M1 = 0; //將io口設置為推挽輸出
P1M1 = 0;
P2M1 = 0;
P0M0 = 0XFF;
P1M0 = 0XFF;
P2M0 = 0XFF;
i=0;
flag=0;
test=0;
Trig=0; //首先拉低脈沖輸入引腳
TMOD=0x11; //定時器0,定時器1,16位工作方式
TR0=1; //啟動定時器0
IT0=0; //由高電平變低電平,觸發外部中斷
ET0=1; //打開定時器0中斷
//ET1=1; //打開定時器1中斷
EX0=0; //關閉外部中斷
EA=1; //打開總中斷0

while(1) //程序循環
{
EA=0;
Trig=1;
delay_20us();
Trig=0; //產生一個20us的脈沖,在Trig引腳
while(Echo==0); //等待Echo回波引腳變高電平
succeed_flag=0; //清測量成功標志
EX0=1; //打開外部中斷
TH1=0; //定時器1清零
TL1=0; //定時器1清零
TF1=0; //
TR1=1; //啟動定時器1
EA=1;

while(TH1 < 30);//等待測量的結果,周期65.535毫秒(可用中斷實現)
TR1=0; //關閉定時器1
EX0=0; //關閉外部中斷

if(succeed_flag==1)
{
distance_data=outcomeH; //測量結果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//與低8位合並成為16位結果數據
distance_data*=12; //因為定時器默認為12分頻
distance_data/=58; //微秒的單位除以58等於厘米
} //為什麼除以58等於厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //沒有回波則清零
test= !test; //測試燈變化
}

/// distance[i]=distance_data; //將測量結果的數據放入緩沖區
/// i++;
/// if(i==3)
/// {
/// distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
/// pai_xu();
/// distance_data=distance[1];

a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
/// i=0;
/// }
}
}
//***************************************************************
//外部中斷0,用做判斷回波電平
INTO_() interrupt 0 // 外部中斷是0號
{
outcomeH =TH1; //取出定時器的值
outcomeL =TL1; //取出定時器的值
succeed_flag=1; //至成功測量的標志
EX0=0; //關閉外部中斷
}
//****************************************************************
//定時器0中斷,用做顯示
timer0() interrupt 1 // 定時器0中斷是1號
{
TH0=0xfd; //寫入定時器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0xfd;flag++;break;
case 0x01:P0=shi;P2=0xfe;flag++;break;
case 0x02:P0=;P2=0xfb;flag=0;break;
}
}
//*****************************************************************
/*
//定時器1中斷,用做超聲波測距計時
timer1() interrupt 3 // 定時器0中斷是1號
{
TH1=0;
TL1=0;
}
*/
//******************************************************************
//顯示數據轉換程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余運算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余運算
ge_data=temp_data;

_data=SEG7[_data];
shi_data=SEG7[shi_data];
ge_data =SEG7[ge_data];

EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************
void delay_20us()
{ ucharbt ;
for(bt=0;bt<100;bt++);
}
/*
void pai_xu()
{ uint t;
if(distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;} /*交換值
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;} /*交換值
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;} /*交換值
}
*/

㈢ 急求基於凌陽61系列單片機 超聲波測距的C語言程序或者匯編程序!!

#include "SPCE061A.h"
#include "ultrasonic_App.h"

//========================================================================
// 語法格式: int main(void)
// 實現功能: 主程序
// 參數: 無
// 返回值: int 無意義
//========================================================================
void F_Key_Scan_Initial(void);
void F_Key_Scan_ServiceLoop(void);
unsigned int SP_GetCh(void);

void Speech_Resource(unsigned int iSpeechIndex);
void Speech_Result(unsigned int uiResult);
int main(void)
{
unsigned int uiKey;
unsigned int Back_data;

F_Key_Scan_Initial();
Initial_ult();
while(1)
{
uiKey = SP_GetCh();
switch(uiKey)
{
case 0: break;
case 1:
Back_data = measure_Times(1);
if(Back_data==0)
Speech_Resource(12); //結果為0時表示測量出錯,播放"咚"
else
Speech_Result(Back_data);
break;
case 2:
break;
case 3: break;
default: break;
}
F_Key_Scan_ServiceLoop();
*P_Watchdog_Clear = 0x0001;
}
}
//========================================================================
// 文件名稱: IRQ.c
// 功能描述: IRQ中斷服務程序
// 維護記錄: 2006-04-13 V2.0
//========================================================================
#include "SPCE061A.h"
#include "ultrasonic_App.h"

void IRQ3(void)__attribute__((ISR));
void IRQ3(void)
{
*P_INT_Clear = 0x0100; //
EXT1_IRQ_ult(); //調用超聲波測距的外部中斷服務程序
}

//========================================================================
// 文件名稱: ultrasonic_App.c
// 功能描述: 超聲波測距模組V2.0的功能介面函數
// 維護記錄: 2006-02-21 V2.0
//========================================================================
#include "SPCE061A.h"
#define LONG_SEND_TIMER 1000 //中距測距時的40KHz信號發射時長
#define LONG_SEND_TIMER2 3000 //中距測距的補充測距時的40KHz信號發射時長
#define LONG_WAIT_DELAY 600 //中距測距的防餘波干擾延時時長
#define LONG_WAIT_DELAY2 1500 //中距測距的補充測距時的防餘波干擾延時時長
#define LONG_RES_ADD 0x00B0 //中距測距的結果補償值
#define LONG_RES_ADD2 0x0220 //中距測距的補充測距時的結果補償值

#define LOW_SEND_TIMER 250 //短距測距時的40KHz信號發射時長
#define LOW_SEND_TIMER2 1000 //短距測距的補充測距時的40KHz信號發射時長
#define LOW_WAIT_DELAY 180 //短距測距的防餘波干擾延時時長
#define LOW_WAIT_DELAY2 400 //短距測距的補充測距時的防餘波干擾延時時長
#define LOW_RES_ADD 0x0034 //短距測距的結果補償值
#define LOW_RES_ADD2 0x00B0 //短距測距的補充測距時的結果補償值

unsigned int Counter_buf; //超聲波測距當中,用於保存TimerB計數的變數,相當於時長
unsigned int EXT1_IRQ_flag=0; //外部中斷標志變數,用於EXT1的IRQ中斷程序和測距程序同步
//========================================================================
// 語法格式: void Initial_ult(void)
// 實現功能: 超聲波測距模組的初始化子程序
// 參數: 無
// 返回值: 無
//========================================================================
void Initial_ult(void)
{
unsigned int uiTemp;
// 初始化埠主要是IOB8和IOB9
uiTemp = *P_IOB_Dir;
uiTemp = uiTemp|0x0200;
uiTemp = uiTemp&0xfeff;
*P_IOB_Dir = uiTemp;
uiTemp = *P_IOB_Attrib;
uiTemp = uiTemp|0x0200;
uiTemp = uiTemp&0xfeff;
*P_IOB_Attrib = uiTemp;
uiTemp = *P_IOB_Buffer;
uiTemp = uiTemp|0x0300;
*P_IOB_Data = uiTemp;
}
//========================================================================
// 語法格式: void Delay_ult(unsigned int timers)
// 實現功能: 超聲波測距模組的延時子程序
// 參數: unsigned int timers 延時的時長(僅是一個相對量)
// 返回值: 無
//========================================================================
void Delay_ult(unsigned int timers)
{
unsigned int i;
for(i=0;i<timers;i++)
{
__asm("nop");
}
}
//========================================================================
// 語法格式: unsigned int Resoult_ult(unsigned int Counter)
// 實現功能: 超聲波測距模組的測距數據處理程序,將TimerB的計數值換算為距離
// 參數: Counter 需要換算的計數值
// 返回值: 計算後的距離,厘米為單位
//========================================================================
unsigned int Resoult_ult(unsigned int Counter)
{
unsigned int uiTemp;
unsigned long ulTemp;
ulTemp = (unsigned long)Counter*33500;
ulTemp = ulTemp/196608;
ulTemp = ulTemp>>1; //除二
uiTemp = (unsigned int)ulTemp;
return uiTemp;
}
//========================================================================
// 語法格式: unsigned int measure_ult(unsigned int type)
// 實現功能: 超聲波測距模組的測距程序,完成一次測距
// 參數: type 選擇測距類型,
// type=1 中距測距
// type=0 短距測距
// 返回值: 所測得的距離,以厘米為單位
//========================================================================
unsigned int measure2_ult(unsigned int type);
unsigned int measure_ult(unsigned int type)
{
unsigned int Exit_flag = 1;
unsigned int uiTemp;
unsigned int uiResoult;
unsigned int uiSend_Timer,uiWait_Timer,uiRes_Add;
unsigned int uiSystem_Clock;
uiSystem_Clock = *P_SystemClock; //將當前的系統時鍾設置暫時保存起來
*P_SystemClock = 0x0088; //將系統時鍾設置為49MHz,分頻比為1,強振模式
if(type) //根據type即測距類型,選擇不同的測距參數
{
uiSend_Timer = LONG_SEND_TIMER;
uiWait_Timer = LONG_WAIT_DELAY;
uiRes_Add = LONG_RES_ADD;
}
else
{
uiSend_Timer = LOW_SEND_TIMER;
uiWait_Timer = LOW_WAIT_DELAY;
uiRes_Add = LOW_RES_ADD;
}
*P_TimerB_Data = 0xfed2;
*P_TimerB_Ctrl = 0x03c0; //enable 40KHz out
Delay_ult(uiSend_Timer); //delay for send the signal
*P_TimerB_Ctrl = 0x0006; //stop 40KHz out
*P_TimerB_Data = 0x0000;
*P_TimerB_Ctrl = 0x0001; //TimerB work as a counter at 192KHz
while(*P_TimerB_Data<uiWait_Timer) //等待一定時間後再打開TimerA的計數(來源於EXT1)
{ //以避開餘波的干擾
*P_Watchdog_Clear = 0x0001;
}
*P_INT_Clear = 0x0100; //開中斷前先清中斷
*P_INT_Ctrl = *P_INT_Ctrl_New|0x0100;
*P_INT_Clear = 0xffff; //清除中斷發生標志
__asm("IRQ ON"); //打開總中斷使能
EXT1_IRQ_flag = 0; //TimerA的溢出中斷的標志變數置0
while(Exit_flag)
{
if(EXT1_IRQ_flag==1) //當該變數在timerA的FIQ中斷中被置1時表示接收到了回波
{
Exit_flag = 0; //exit
Counter_buf = Counter_buf+uiRes_Add;//計數值加上一定的調整數據
uiResoult = Resoult_ult(Counter_buf);//對計數值進行處理,得出距離值
}
if(*P_TimerB_Data>10000) //如計數值大於10000,表示超時
{
Exit_flag = 0; //exit
uiResoult = measure2_ult(type);//再進行一次補充的測距,將會加長40KHz信號發射的量
*P_TimerB_Ctrl = 0x0006; //stop timerB
}
uiTemp = *P_TimerB_Data;
*P_Watchdog_Clear = 0x0001;
}
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100); //關掉外部中斷
__asm("IRQ OFF"); //關掉總中斷

*P_SystemClock = uiSystem_Clock; //恢復系統時鍾的設置
return uiResoult;
}
//========================================================================
// 語法格式: void EXT1_IRQ_ult(void)
// 實現功能: 超聲波測距模組的測距程序的EXT1中斷服務程序,在EXT1的IRQ中斷
// 中調用
// 參數: 無
// 返回值: 無
//========================================================================
void EXT1_IRQ_ult(void)
{
Counter_buf = *P_TimerB_Data; //save the timerB counter
*P_TimerB_Ctrl = 0x0006; //stop timerB
*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100); //關掉外部中斷
*P_INT_Clear = 0xffff; //清除中斷發生標志
EXT1_IRQ_flag = 1; //通知測距程序,外部中斷已發生
}
//========================================================================
// 語法格式: unsigned int measure2_ult(void)
// 實現功能: 補充進行一次遠距的測量,以保證能夠獲取測量結果
// 參數: type 選擇測距類型,
// type=1 中距測距
// type=0 短距測距
// 返回值: 所測得的距離,以厘米為單位
//========================================================================
unsigned int measure2_ult(unsigned int type)
{
unsigned int Exit_flag = 1;
unsigned int uiResoult;
unsigned int uiSend_Timer,uiWait_Timer,uiRes_Add;
*P_TimerA_Ctrl = 0x0006; //stop TimerA

*P_INT_Ctrl = *P_INT_Ctrl_New&(~0x0100); //關掉外部中斷
__asm("IRQ OFF"); //關掉總中斷
*P_INT_Clear = 0xffff; //清除掉中斷發生標志

if(type) //根據type即測距類型,選擇不同的測距參數
{
uiSend_Timer = LONG_SEND_TIMER2;
uiWait_Timer = LONG_WAIT_DELAY2;
uiRes_Add = LONG_RES_ADD2;
}
else
{
uiSend_Timer = LOW_SEND_TIMER2;
uiWait_Timer = LOW_WAIT_DELAY2;
uiRes_Add = LOW_RES_ADD2;
}
*P_TimerB_Data = 0xfed2;
*P_TimerB_Ctrl = 0x03c0; //enable 40KHz out
Delay_ult(uiSend_Timer); //delay for send the signal
*P_TimerB_Ctrl = 0x0006; //stop 40KHz out
*P_TimerB_Data = 0x0000;
*P_TimerB_Ctrl = 0x0001; //TimerB work as a counter at 192KHz
while(*P_TimerB_Data<uiWait_Timer) //等待一定時間,以避開餘波的干擾
{
*P_Watchdog_Clear = 0x0001;
}

*P_INT_Ctrl = *P_INT_Ctrl_New|0x0100;//打開外部中斷
*P_INT_Clear = 0xffff; //清除中斷發生標志
__asm("IRQ ON"); //打開總中斷使能

EXT1_IRQ_flag = 0; //TimerA的溢出中斷的標志變數置0
while(Exit_flag)
{
if(EXT1_IRQ_flag==1) //當該變數在timerA的FIQ中斷中被置1時表示接收到了回波
{
Exit_flag = 0; //exit
Counter_buf = Counter_buf+uiRes_Add;//計數值加上一定的調整數據
uiResoult = Resoult_ult(Counter_buf);//對計數值進行處理,得出距離值
}
if(*P_TimerB_Data>10000) //如計數值大於10000,表示超時
{
Exit_flag = 0; //exit
uiResoult = 0; //error return data 0
*P_TimerB_Ctrl = 0x0006; //stop timerB
}
}
return uiResoult;
}
//========================================================================
// 語法格式: unsigned int measure_Times(unsigned int type)
// 實現功能: 組合進行共6次的測距程序,包括對6次測量結果的取平均值處理
// 參數: type 選擇測距類型,
// type=1 中距測距
// type=0 短距測距
// 返回值: 所測得的距離,以厘米為單位
//========================================================================
unsigned int measure_Times(unsigned int type)
{
unsigned int uiResoult=0,uiMeasure_Index=0,i;
unsigned int uiTemp_buf[6],uiTemp;
unsigned int uiSystem_Clock;

for(;uiMeasure_Index<6;uiMeasure_Index++)
{ //循環進行四次測量
uiTemp = measure_ult(type); //進行一次測量,測量類型由type決定
if(uiMeasure_Index==0) //如果為本次測量的第一次測距,則直接保存在緩沖區第一個單元
uiTemp_buf[0] = uiTemp;
else
{ //否,則對結果進行比較,進行排序,從大到小排
i = uiMeasure_Index;
while(i) //以下為排序的代碼
{
if(uiTemp>uiTemp_buf[i-1])
{
uiTemp_buf[i] = uiTemp_buf[i-1];
uiTemp_buf[i-1] = uiTemp;
}
else
{
uiTemp_buf[i] = uiTemp;
break; //退出排序
}
i--;
}
}
//兩次測量之間的延時等待,利用以下代碼軟模擬時的cycles數結合設置的CPUCLK進行計算,大概72ms
uiSystem_Clock = *P_SystemClock; //將之前的系統時鍾的設置用變數保存
*P_SystemClock = 0x000b; //設置為FSYS=24.576MHz 分頻比為8
for(i=0;i<5;i++)
{
Delay_ult(1000); //調用延時程序
*P_Watchdog_Clear = 0x0001;
}
*P_SystemClock = uiSystem_Clock; //恢復系統時鍾設置
//此處延時結束
}
//對6次測距的結果進行處理
if(uiTemp_buf[5]==0)
{ //如果緩沖區中的最小的測距值為0,則採用中間4個數據進行平均
uiResoult = uiTemp_buf[1]+uiTemp_buf[2]+uiTemp_buf[3]+uiTemp_buf[4];
uiResoult = uiResoult/4;
}
else
{ //否則就取後5個數據進行平均
uiResoult = uiTemp_buf[1]+uiTemp_buf[2]+uiTemp_buf[3]+uiTemp_buf[4]+uiTemp_buf[5];
uiResoult = uiResoult/5;
}
return uiResoult;
}

㈣ 基於51單片機,用霍爾感測器測算智能小車行走的距離!誰有匯編程序,貼上來我學習學習。

ORG 0000H
SJMP MAIN
MAIN:
MOV TMOD,#05H
MOV TH0,#0
MOV TL0,#0
SETB EA
MOV P0,#0FFH
SETB TR0
ST:
MOV A,TL0
MOV 30H,A
LCALL BTOD
LCALL DISP
SJMP ST
BTOD:
MOV A,30H
MOV B,#100
DIV AB
MOV 20H,A
MOV A,B
MOV B,#10
DIV AB
MOV 21H,A
MOV 22H,B
RET
DISP:
MOV DPTR,#SEG7
MOV A,21H
MOVC A,@A+DPTR
MOV P0,A
CLR P3.0
LCALL DELAY
SETB P3.0
MOV A,22H
MOVC A,@A+DPTR
MOV P0,A
CLR P3.1
LCALL DELAY
SETB P3.1
RET
DELAY:MOV R7,#20
D00:MOV R6,#100
D11:DJNZ R6,D11
DJNZ R7,D00
RET
SEG7: DB 0C0H,0F9H,0A4H,0B0H
DB 99H,92H,82H,0F8H
DB 80H,90H,88H,83H
DB 0C6H,0A1H,86H,8EH
END
用單片機的p3.4口 數碼管顯示p0口 共陽極數碼管動態顯示p3.0和p3.1接com端,我這個程序你得修改一下 根據你的輪子的大小 計算每圈走的距離就可以算出小車行走的距離 祝你成功!

㈤ 用51單片機做測量物體的距離和方位角的程序,想用matlab讀取RS232的串列數據來做數據處理

看你用什麼單片機吧,matlab有直接可以生成單片機c語言的功能,不過我只看過avr,其他的單片機就不知道了

㈥ 基於單片機超聲波測距c語言程序求解釋

//上面這段什麼意思?
//上下面這段什麼意思? 沒有code為什麼也可以存16進制?
uchar dis_smg[8] ={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8};

有code和沒有code的區別在於 dis_smg變數的存儲的存儲方式上
我記得有code的適合 dis_smg的數組元素不能改變的吧 記得不清楚了
你可以網路去

//下面是不是數碼管引腳和單片機引腳對應?
//數碼管位選定義
sbit smg_we1 = P3^4; //數碼管位選定義

答案: 是

㈦ 單片機匯編語言程序解讀(超聲波測距)越詳細越好

這是幾個子程序被 堆砌到一起了 ,沒有主程序不能實現功能

㈧ 單片機超聲波雷達測距的C語言程序設計,具體要求看問題補充

你到網路文庫中找找,會找到很多的。你也可到淘寶網上找一下:「單片機超聲波測距模塊電子設計製作C程序」這是一款比較好的程序,附的資料比較多,有Protel格式原理圖、PCB圖,有源程序、設計論文報告、元件清單等,製作非常容易,只要按圖焊接好元件,基本不需要調試,最遠可測量到6.99米,報警距離還可調節。 這里還有製作調試好的實物,你找找看。

㈨ 如何用單片機寫一個光電開關距離按鍵調節程序

,又被叫做U型光電開關,是一款紅外線感應光電產品,由紅外線發射管和紅外線接收管組合而成,而槽寬則就決定了感應接收型號的強弱與接收信號的距離,以光為媒介,由發光體與受光體間的紅外光進行接收與轉換,檢測物體的位置。槽型光電開關於接近開關同樣是無接觸式的,受檢測體的制約少,且檢測距離長,可進行長距離的檢測(幾十米)檢測精度高能檢測小物體。應用非常的廣泛。

槽型光電開關主要特點
1.檢測距離長

與接近開關等比較,光電開關的檢測距離非常長,且是無接觸式的,所以不會損傷檢測物體,也不受檢測物體的影響。幾乎不受檢測物體的制約由於是採用對檢測對象的表面進行反射及光透過方式,不像接近開關只能對金屬,還能對玻璃、塑料、木製物體、液體等各種物質進行檢測。

2.響應速度快

與接近開關同樣,由於無機械運動,所以能對高速運動的物體進行檢測。鏡頭容易受有機塵土等的影響鏡頭免受污染後,光會散射或被遮光,所以在有活水蒸汽、塵土等較多的環境下使用的場合,需施加適當的保護裝置。受環境強光的影響幾乎不受一般照明光的影響,但像太陽光那樣的強光直接照射受光體時,會造成誤動作或損壞。

NPN槽型光電開關工作原理分析
在不同的應用電路中。可根據需要把其工作輸出狀態設計成高電平或低電平脈沖輸出,見左圖、右圖。

需要說明的是,有些購買來的成品槽型光電開關的引出腳已焊接了四芯線和插頭的。四根線的顏色分別是棕、黑、紅、橙。這四根線並不像平常的紅色線接電源,黑色線接地。經實際測試。分別是棕色A.黑色C,紅色K,橙色E。

單片機與光電開關接法
三線光電開關三線一般為 電源+ 、 電源- 、信號輸出端,根據信號輸出端輸出形式,根據不同形式再添加相應電路(如上拉電阻等),再連到單片機某個IO口即可。

㈩ 51單片機控制的超聲波測距儀程序

希望對你有幫助
//超聲波模塊顯示程序
#include <reg52.h> //包括一個52標准內核的頭文件
#define uchar unsigned char //定義一下方便使用
#define uint unsigned int
#define ulong unsigned long
sbit Tx = P3^3; //產生脈沖引腳
sbit Rx = P3^2; //回波引腳
uchar code SEG7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};//數碼管0-9
uint distance[4]; //測距接收緩沖區
uchar ge,shi,,temp,flag,outcomeH,outcomeL,i; //自定義寄存器
bit succeed_flag; //測量成功標志
//********函數聲明
void conversion(uint temp_data);
void delay_20us();
void pai_xu();
void main(void) // 主程序
{ uint distance_data,a,b;
uchar CONT_1;
i=0;
flag=0;
Tx=0; //首先拉低脈沖輸入引腳
TMOD=0x11; //定時器0,定時器1,16位工作方式
TR0=1; //啟動定時器0
IT0=0; //由高電平變低電平,觸發外部中斷
ET0=1; //打開定時器0中斷
EX0=0; //關閉外部中斷
EA=1; //打開總中斷0

while(1) //程序循環
{
EA=0;
Tx=1;
delay_20us();
Tx=0; //產生一個20us的脈沖,在Tx引腳
while(Rx==0); //等待Rx回波引腳變高電平
succeed_flag=0; //清測量成功標志
EX0=1; //打開外部中斷
TH1=0; //定時器1清零
TL1=0; //定時器1清零
TF1=0; //
TR1=1; //啟動定時器1
EA=1;

while(TH1 < 30);//等待測量的結果,周期65.535毫秒(可用中斷實現)
TR1=0; //關閉定時器1
EX0=0; //關閉外部中斷

if(succeed_flag==1)
{
distance_data=outcomeH; //測量結果的高8位
distance_data<<=8; //放入16位的高8位
distance_data=distance_data|outcomeL;//與低8位合並成為16位結果數據
distance_data*=12; //因為定時器默認為12分頻
distance_data/=58; //微秒的單位除以58等於厘米
} //為什麼除以58等於厘米, Y米=(X秒*344)/2
// X秒=( 2*Y米)/344 ==》X秒=0.0058*Y米 ==》厘米=微秒/58
if(succeed_flag==0)
{
distance_data=0; //沒有回波則清零

}

distance[i]=distance_data; //將測量結果的數據放入緩沖區
i++;
if(i==3)
{
distance_data=(distance[0]+distance[1]+distance[2]+distance[3])/4;
pai_xu();
distance_data=distance[1];

a=distance_data;
if(b==a) CONT_1=0;
if(b!=a) CONT_1++;
if(CONT_1>=3)
{ CONT_1=0;
b=a;
conversion(b);
}
i=0;
}
}
}
//***************************************************************
//外部中斷0,用做判斷回波電平
INTO_() interrupt 0 // 外部中斷是0號
{
outcomeH =TH1; //取出定時器的值
outcomeL =TL1; //取出定時器的值
succeed_flag=1; //至成功測量的標志
EX0=0; //關閉外部中斷
}
//****************************************************************
//定時器0中斷,用做顯示
timer0() interrupt 1 // 定時器0中斷是1號
{
TH0=0xfd; //寫入定時器0初始值
TL0=0x77;
switch(flag)
{case 0x00:P0=ge; P2=0x7f;flag++;break;
case 0x01:P0=shi;P2=0xbf;flag++;break;
case 0x02:P0=;P2=0xdf;flag=0;break;
}
}

//顯示數據轉換程序
void conversion(uint temp_data)
{
uchar ge_data,shi_data,_data ;
_data=temp_data/100 ;
temp_data=temp_data%100; //取余運算
shi_data=temp_data/10 ;
temp_data=temp_data%10; //取余運算
ge_data=temp_data;

_data=SEG7[_data];
shi_data=SEG7[shi_data]&0x7f;
ge_data =SEG7[ge_data];

EA=0;
= _data;
shi = shi_data;
ge = ge_data ;
EA=1;
}
//******************************************************************

void delay_20us()
{ uchar bt ;
for(bt=0;bt<60;bt++);
}
void pai_xu()
{ uint t;
if (distance[0]>distance[1])
{t=distance[0];distance[0]=distance[1];distance[1]=t;}
if(distance[0]>distance[2])
{t=distance[2];distance[2]=distance[0];distance[0]=t;}
if(distance[1]>distance[2])
{t=distance[1];distance[1]=distance[2];distance[2]=t;}
}

閱讀全文

與單片機距離判斷程序相關的資料

熱點內容
法律寫作pdf 瀏覽:142
國貨哪個品牌最好app 瀏覽:951
看哪個app給錢最多 瀏覽:178
編程靠經驗嗎 瀏覽:759
c教程pdf下載地址 瀏覽:573
製作視頻哪個app有瘦臉功能 瀏覽:649
linux查看線程內存 瀏覽:509
命令行簽名apk 瀏覽:92
網頁照片旋轉源碼 瀏覽:842
QQ會員頭像源碼 瀏覽:263
內核命令行 瀏覽:324
腳本提取源碼器 瀏覽:930
smo源碼 瀏覽:877
為什麼要搭建單獨伺服器 瀏覽:480
編譯器有什麼控制 瀏覽:893
希爾伯特pdf 瀏覽:645
php數組全數字 瀏覽:647
解密塔羅牌小程序源碼 瀏覽:862
聚合跑分源碼 瀏覽:555
注冊dns伺服器寫什麼 瀏覽:881