#include <reg51.h> //引入一個reg51.h的頭文件
#include <intrins.h> //引入一個intrins.h的頭文件
#define nop() _nop_() //#define 是宏定義,起作用就是用 nops(); 代替{_nop_();_nop_();_nop_();_nop_();}
unsigned char code a[4]={0x03,0x06,0x0c,0x09}; //正轉,順時針轉,四位顯示
unsigned char code b[4]={0x03,0x09,0x0c,0x06}; //反轉,逆時針轉 四位顯示
#define motor P0 //定義電機P0口,電機接口
sbit Trig=P3^1; // TRIG是控制端(輸入),TRIG給個高電平脈沖
sbit Echo=P3^2; //echo一般接外部中斷P32或P33,利用中斷確認echo的低電平結束
void Delay20us(void); //延時20微秒
void Delay(unsigned int t); //Delay是一個子函數
int time; //定義時間
int succeed_flag; //定義測量成功標志
unsigned char timeL; //定義timeL,timeL=TL1,取出定時器的值
unsigned char timeH; //定義timeH,timeH=TH1,取出定時器的值
unsigned int Totalangle[]={4096,0}; //4096個脈沖 totalangle是轉速輸出4096個脈沖
/*************************************/
Range_to_angle(unsigned int SS) //定義ss,ss為物體距離超聲波傳感器的距離 range to是轉動的角度
{
unsigned int i1,i2; //定義i1,i2
unsigned char j; //定義j
if(SS<=5||SS==Totalangle[1]/32) // 距離小于等于5
return(0); //輸出0
if(SS<70) //如果距離大于70,i1=距離減5
{
i1=SS-5; //i1為距離減5
for(i2=0;i2<(i1*64-Totalangle[1]);i2++) //令i2等于0,如果i2小于,i2累加
{
motor=0x00; //電機顯示
motor=a[j]; //電機正轉
j++; //j累加,一共四位
if(j>=4) //如果j大于等于4,j等于0
j=0;
Delay(2); //延時
}
if(Totalangle[1]>i1*64) //
for(i2=0;i2<(Totalangle[1]-i1*64);i2++) //
{
motor=0x00; //電機顯示
motor=b[j]; //電機反轉
j++; //j累加
if(j>=4) //j小于等于4
j=0; //j等于0
Delay(2);
}
Totalangle[1]=i1*64; //totalangle1=i1乘以64
}
}
/*************************************/
void main(void) //主函數
{
unsigned int distance; //定義距離
Trig=0; //首先拉低脈沖輸入引腳
TMOD=0x10; //定時器1 16位定時器
EA=1; //打開總中斷0
while(1) //循環
{
EA=0; //關閉總中斷
Trig=1; //超聲波模塊產生超聲波
Delay20us(); //延時20us
Trig=0; //產生一個20us的脈沖
while(Echo==0); //等待ECHO回波引腳變成高電平
succeed_flag=0; //清測量成功標志
EA=1; //打開總中斷0
EX0=1; //打開外部中斷0
TH1=0; //定時器1清零
TL1=0; //定時器1清零
TF1=0; //計數溢出標志
TR1=1; //啟動定時器1
Delay(20); //延時20us
EX0=0; //關閉外部中斷0
TR1=0; //關閉定時器1
if(succeed_flag==1) //至成功測量標志
{
time=timeH*256+timeL;
distance=time*0.0172; //厘米
//Totalangle[]
}
if(succeed_flag==0)
{
distance=0; //沒有回波則清零
}
Range_to_angle(distance);
Delay(10); //延時
}
}
/******************************/
void Delay20us() //延時20us
{ unsigned char i; //定義i
for(i=0;i<100;i++); //i小于100,i累加
}
/*****************************/
void Delay(unsigned int t)//ms
{ unsigned int j,k; //延時函數
for(j=0;j<t;j++)
for(k=0;k<110;k++);
}
/******************************/
void exter(void) interrupt 0 //外部中斷
{
EX0=0; //關閉外部中斷
timeH=TH1; //取出定時器的值
timeL=TL1; //取出定時器的值
succeed_flag=1; //至成功測量標志
}
/************************************/
void timer1() interrupt 3 //定時器1中斷,用做超聲波測距計時
{
TH1=0; //定時器1清零
TL1=0; //定時器1清零
}
|