#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清零
}
|