标题:
51单片机智能小车红外避障循迹程序
[打印本页]
作者:
18930130
时间:
2020-7-10 22:04
标题:
51单片机智能小车红外避障循迹程序
51单片机智能小车红外避障程序以及文档
#include"car_psb.h"
#define uint unsigned int //用uint代替无字符整形数据的名称
#define uchar unsigned char
sbit A1 = P0^3;
sbit A2 = P0^2;//A1为L293芯片2脚(IN1),A2为L293芯片7脚(IN2),控制右电机
sbit B1 = P0^1;
sbit B2 = P0^0;
sbit key1 = P0^6;//按钮s1
sbit key2 = P3^5;//按钮s2
sbit key3 = P3^6;//按钮s3
sbit key4 = P3^7;//按钮s4
sbit u4_out1 = P1^0;//左红外循迹
sbit u4_out2 = P1^1;//右红外循迹
#define c_stop {A1=0;A2=0;B1=0;B2=0;}//小车停止
#define c_go {A1=1;A2=0;B1=1;B2=0;}//小车向前
#define c_bask {A1=0;A2=1;B1=0;B2=1;}//小车后退
#define c_left {A1=1;A2=0;B1=0;B2=1;}//小车向左
#define c_right {A1=0;A2=1;B1=1;B2=0;}//小车向右
uchar shu;
void delayms(uint xms);//延时xms毫秒;
bit start;
void delayms(uint xms);//延时xms毫秒;
void main(void)
{
c_init();//每次都需要先调用此函数
c_stop;//单片机上电先让电机停止。
while(1)//进入死循环,一直循环{}里的程序
{
if(key1==0)//如果检测到key1为0,测判断按键被按下
{
delayms(5);//延时大约5ms防止按键振动产生影响
if(key1==0)//延时5ms后key1为0,测确定按键被按下,执行按钮按下后的程序
{
c_right;//小车向右
delayms(3000) ;
c_left;//小车向左
delayms(3000) ;
c_bask;//小车向后
delayms(3000) ;
c_go;//小车向前
delayms(3000) ;
c_stop;
// while(key1==0);//等待按钮被松开
}
}
if(key2==0)//如果检测到key2为0,测判断按键被按下
{
delayms(5);//延时大约5ms防止按键振动产生影响
if(key2==0)//延时5ms后key2为0,测确定按键被按下,执行按钮按下后的程序
{
c_bask;
delayms(2000);//小车后退
c_stop;
while(key2==0);//等待按钮被松开
}
}
if(key3==0)//如果检测到key3为0,测判断按键被按下
{
delayms(5);//延时大约5ms防止按键振动产生影响
if(key3==0)//延时5ms后key3为0,测确定按键被按下,执行按钮按下后的程序
{
shu++;
if(shu==3)
shu=0;
if(shu==2)
{
start = ~start;
}
while(key3==0);//等待按钮被松开
if(start == 0)//停止
{
c_stop;
}
else if(start == 1)//开始红外循迹
{
while(1)
{
if((u4_out1==0)&(u4_out2==1))//当右循迹等于1时,说明小车右循迹在循迹线上,小车需左转
{
c_left;
delayms(50);
c_go;
delayms(10);
c_stop;
delayms(50);
}
else if((u4_out1==1)&(u4_out2==0))//当左循迹等于1时,说明小车左循迹在循迹线上,小车需要右转
{
c_right;
delayms(50);
c_go;
delayms(10);
c_stop;
delayms(50);
}
else if(((u4_out1==0)&(u4_out2==0))|((u4_out1==1)&(u4_out2==1)))//当小车左右两边的循迹一致时,小车直走
{
c_go;
delayms(50);
c_stop;
delayms(30);
}
}
}
}
}
}
}
复制代码
#include"car_psb.h"
#define smg P2
sbit b = P0^4;//蜂鸣器驱动三极管B管脚
sbit u3_en = P4^4;//u3的使能管脚
sbit u4_en = P4^5;//u4芯片的使能管脚
sbit u5_en = P4^6;//u5芯片的使能管脚
sbit key1 = P0^6;//s1按钮
sbit key2 = P3^5;//s2按钮
sbit key3 = P3^6;//s3按钮
sbit key4 = P3^7;//s4按钮
sbit DQ = P0^5;//ds18b20数据线
sbit DATA=P4^7; //双向数据线
sbit RST=P1^7; //使能线
sbit SCLK=P0^7; //时钟线
sbit A1 = P0^3;
sbit A2 = P0^2;//A1为L293芯片2脚(IN1),A2为L293芯片7脚(IN2),控制右电机
sbit B1 = P0^1;
sbit B2 = P0^0;//B1为L293芯片10脚(IN3),B2为L293芯片15脚(IN4),控制左电机
//注意芯片使能管脚1脚(E1)和9脚(E2)已接vcc高电平,
//所以不需要单片机控制输出高电平使能
sbit u5_out2 = P1^6;//右光敏电阻
sbit u5_out1 = P1^4;//左光敏电阻
sbit u4_out3 = P1^2;//左红外避障
sbit u4_out4 = P1^3;//右红外避障
sbit u4_out1 = P1^0;//右红外循迹
sbit u4_out2 = P1^1;//左红外循迹
sbit Echo = P3^3;//超声波信号反馈端
sbit Tring = P3^4;//超声波信号发送端
sbit Rt = P3^2;//红外接收管脚,单片机中断0管脚
unsigned char a[4];//保存红外遥控器的四位数据
unsigned char code tab1[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};//数码管位选
unsigned char code ds1302_w[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};//ds1302芯片写字节
unsigned char code ds1302_r[]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};//ds1302芯片写字节
/*************************************************************/
//函数名称:void delayms(unsigned int xms)
//函数功能:延时xms毫秒
//xms取值为0-65535
//调用:为内部调用函数
/************************************************************/
void delayms(unsigned int xms)
{
unsigned int x,y;
for(x=xms;x>0;x--)
for(y=1100;y>0;y--);
}
/*************************************************************/
//函数名称:void c_stop(void)
//函数功能:小车停止
//调用:为内部调用函数
/************************************************************/
void c_stop(void)
{A1=0;A2=0;B1=0;B2=0;}//小车停止
/*************************************************************/
//函数名称:void c_go(void)
//函数功能:小车向前
//调用:为内部调用函数
/************************************************************/
void c_go(void)
{A1=1;A2=0;B1=1;B2=0;}//小车向前
/*************************************************************/
//函数名称:void c_bask(void)
//函数功能:小车后退
//调用:为内部调用函数
/************************************************************/
void c_bask(void)
{A1=0;A2=1;B1=0;B2=1;}//小车后退
/*************************************************************/
//函数名称:void c_left(void)
//函数功能:小车向左
//调用:为内部调用函数
/************************************************************/
void c_left(void)
{A1=1;A2=0;B1=0;B2=1;}//小车向左
/*************************************************************/
//函数名称:void c_right(void)
//函数功能:小车向右
//调用:为内部调用函数
/************************************************************/
void c_right(void)
{A1=0;A2=1;B1=1;B2=0;}//小车向右
/*************************************************************/
//函数名称:void bell(unsigned int x,unsigned int time)
//函数功能:蜂鸣器驱动函数,让蜂鸣器循环响停X次
// (蜂鸣器响time毫秒,停time毫秒为一次)
//x取值为0-65535,time取值为0-65535
//调用:为外部调用函数
/************************************************************/
void bell(unsigned int x,unsigned int time)
{
unsigned int i;
for(i=x;i>0;i--)
{
b = ~b;
delayms(time);
}
b = 1;
}
/*********************数码管****************************************/
/*************************************************************/
//函数名称:void display_init()
//函数功能:0-7位的数码管显示,初始化程序
//调用:为外部调用函数
/************************************************************/
void display_init(void)
{
P4SW = 0x70;
smg = 0xff;
}
/*************************************************************/
//函数名称:void display_07(unsigned char x,unsigned char dat)
//函数功能:0-7位的数码管显示
//x取值为0-7,dat取值为0-0xff
//调用:为外部调用函数
//调用时如:display_07(0,0xc0);则让0位数码管显示0,(0xc0是共阳数码管“0”的编码)
/************************************************************/
void display_07(unsigned char cmd,unsigned dat)
{
u5_en = 0;
u3_en = 0;
u4_en = 0;//先将两个芯片不使能,数据不能改变
smg = dat;//将段选的数据赋予P2
u3_en = 1;//u3使能,数据输入
u3_en = 0;//稍作延时后将u3不使能
smg = tab1[cmd];//将需要点亮的数码管数据赋予P2
u4_en = 1;//u4使能,P2数据进入u4
delayms(2);//u4使能后稍作延时
smg = 0x00;
u3_en = 0;
u4_en = 0;//将两个芯片不使能,数据不能改变结束一轮数据的输入
u5_en = 0;
}
/*********************led驱动****************************************/
/*************************************************************/
//函数名称:void display_led(unsigned char dat)
//函数功能:8位led的显示
//dat取值为0-0xff
//调用:为外部调用函数
/************************************************************/
void display_led(unsigned char dat)
{
u5_en = 0;
u3_en = 0;
u4_en = 0;//先将两个芯片不使能,数据不能改变
smg = dat;//将段选的数据赋予P2
u5_en = 1;//u5使能,数据输入
u5_en = 0;//稍作延时后将u5不使能
}
/*********************按钮驱动****************************************/
/*************************************************************/
//函数名称:bit k1()
//函数功能:返回一位数据,当按钮按下时返回1,没有按下时返回0
//调用:为外部调用函数
/************************************************************/
bit k1(void)
{
bit dat;
if(key1==0)
{
delayms(2);
if(key1==0)
{
dat = 1;
}
}
else if(key1==1)
{
dat = 0;
}
return dat;
}
/*************************************************************/
//函数名称:bit k2()
//函数功能:返回一位数据,当按钮按下时返回1,没有按下时返回0
//调用:为外部调用函数
/************************************************************/
bit k2(void)
{
bit dat;
if(key2==0)
{
delayms(2);
if(key2==0)
{
dat = 1;
}
}
else if(key2==1)
{
dat = 0;
}
return dat;
}
/*************************************************************/
//函数名称:bit k3()
//函数功能:返回一位数据,当按钮按下时返回1,没有按下时返回0
//调用:为外部调用函数
/************************************************************/
bit k3(void)
{
bit dat;
if(key3==0)
{
delayms(2);
if(key3==0)
{
dat = 1;
}
}
else if(key3==1)
{
dat = 0;
}
return dat;
}
/*************************************************************/
//函数名称:bit k4()
//函数功能:返回一位数据,当按钮按下时返回1,没有按下时返回0
//调用:为外部调用函数
/************************************************************/
bit k4(void)
{
bit dat;
if(key4==0)
{
delayms(2);
if(key4==0)
{
dat = 1;
}
}
else if(key4==1)
{
dat = 0;
}
return dat;
}
/*********************DS18B20温度传感器驱动****************************************/
/***************************************************/
//函数名称:void delay750us(void);
//函数功能:延时7500us;
/***************************************************/
void delay750us(void)
{
unsigned char a,b;
for(b=112;b>0;b--)
for(a=17;a>0;a--);
}
/***************************************************/
//函数名称:void delay70us(void);
//函数功能:延时70us;
/***************************************************/
void delay70us(void)
{
unsigned char a;
for(a=192;a>0;a--);
}
/***************************************************/
//函数名称:void delay15us(void);
//函数功能:延时15us;
/***************************************************/
void delay15us(void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=38;a>0;a--);
_nop_();
}
/***************************************************/
//函数名称:void delay45us(void);
//函数功能:延时45us;
/***************************************************/
void delay45us(void)
{
unsigned char a,b;
for(b=49;b>0;b--)
for(a=1;a>0;a--);
_nop_();
}
/***************************************************/
//函数名称:void delay2us(void);
//函数功能:延时2us;
/***************************************************/
void delay2us(void)
{
unsigned char a;
for(a=4;a>0;a--);
}
/***************************************************/
//函数名称:void delay4us(void);
//函数功能:延时4us;
/***************************************************/
void delay4us(void)
{
unsigned char a,b;
for(b=1;b>0;b--)
for(a=8;a>0;a--);
}
/***************************************************/
//函数名称:void delay6us(void);
//函数功能:延时6us;
/***************************************************/
void delay6us(void)
{
unsigned char a;
for(a=15;a>0;a--);
}
/***************************************************/
//函数名称:void delay30us(void);
//函数功能:延时30us;
/***************************************************/
void delay30us(void)
{
unsigned char a;
for(a=81;a>0;a--);
_nop_();
}
/***************************************************/
//函数名称:bit ack_ds18b20(void);
//函数功能: ds18b20复位答应函数
/***************************************************/
bit ack_ds18b20(void)
{
bit flag;//返回标志位定义
DQ = 1;//先将数据总线置高电平1
delayms(2);//延时(延时时间没有太大要求,但尽可能短比较好)
DQ = 0;//将数据总线拉低
delay750us();//延时480-960us之内的时间
DQ = 1;//将总是拉高释放数据线
delay70us();//将总线拉高后需要等待15-60us后ds18b20会释放一个60-240us的低电平
if(DQ==0)
flag = 1;//检测到总是拉低则输出1
else
flag = 0;//检测总线是高电平则输出0
delay750us();//从单片机拉高释放数据线后需要延时大于480us才能结束
DQ = 1;//将数据线释放
return flag;//返回数据
}
/***************************************************/
//函数名称:write_ds18b20(uchar dat)
//函数功能: 向ds18b20发送一个字节的数据
/***************************************************/
void write_ds18b20(unsigned char dat)
{
unsigned char i;
DQ = 1;//先将总线拉高
delayms(1);//稍作延时,时间不定
for(i=0;i<8;i++)
{
DQ = 0;//先拉低总线
delay15us();//延时15us
DQ = dat&0x01;//按从低位到高位的顺序发送数据,一次发送一位数据
delay45us();//保存数据状态,延时45us
DQ = 1;//将总线释放
dat>>=1;//将数据右移一位,为下一次数据发送做准备
}
DQ = 1;//8位数据发送完后释放总线
}
/***************************************************/
//函数名称:read_ds18b20(uchar dat)
//函数功能: 读取一个字节的数据
/***************************************************/
unsigned char read_ds18b20(void)
{
unsigned char dat;
unsigned char i;
for(i=0;i<8;i++)
{
dat >>= 1;//右移一位
DQ = 1;//总线先拉高
delay2us();//延时2us
DQ = 0;//将总线拉低
delay6us();//延时6us
DQ = 1;//将总线拉高
delay4us();//延时4us
if(DQ == 1)//读取总线的状态,如果是1的,就写进数据里,如果是0就不作处理
dat |= 0x80;
delay30us();//延时30us
}
return dat;//返回读取到的数据
}
/*************************************************************/
//函数名称:unsigned int Rtemp_ds18b20()
//函数功能:向ds18b20读取温度值,如实际温度为36.5,返回的数据为365
//调用:为外部调用函数
/************************************************************/
unsigned int Rtemp_ds18b20()
{
bit k;
unsigned char temph,templ;//读取的温度高低数据保存
unsigned int temp;//计算后的温度
k = ack_ds18b20();//先发送复位信号
if(k==1)//ds18b20如果有答应,则读取温度
{
write_ds18b20(0xcc);//跳过ROM匹配命令
write_ds18b20(0xbe);//发送读取温度命令
templ = read_ds18b20();//读取温度低8位
temph = read_ds18b20();//读取温度高8位
temp = (temph*256+templ)*0.0625*10;//将读取的温度数据进行计算转换为温度值,
} //并扩大10倍,将小数点后一位往前移动一位,方便显示
k = ack_ds18b20();//先发送复位信号
if(k==1)//ds18b20如果有答应,则发送温度转换命令
{
write_ds18b20(0xcc);//跳过ROM匹配命令
write_ds18b20(0x44);//发送温度转换命令
}
return temp;
}
/*********************DS1302驱动****************************************/
void delaynus(unsigned char n)
{
unsigned char i;
for(i=0;i<(n*10);i++);
}
/*************************************************************/
//函数名称:void Write1302(unsigned char dat)
//函数功能:向ds1302芯片发送一个字节的数据
//调用:为内部调用函数
/************************************************************/
void Write1302(unsigned char dat)//发送一个字节的数据
{
unsigned char i;
SCLK=0; //先将时钟线置位
delaynus(2);
for(i=0;i<8;i++)
{
DATA=dat&0x01; //先发送低电平
delaynus(2);
SCLK=1; //拉高时钟线,时钟芯片在这时候读取数据线上的电平
delaynus(2);
SCLK=0; //时钟线复位
dat>>=1; //数据右移
}
}
/*************************************************************/
//函数名称:unsigned char Read1302(void)
//函数功能:向ds1302芯片读取一个字节的数据
//调用:为内部调用函数
/************************************************************/
unsigned char Read1302(void)
{
unsigned char i,dat;
delaynus(2);
for(i=0;i<8;i++)
{
dat>>=1;
if(DATA==1)
dat|=0x80;
SCLK=1;
delaynus(2);
SCLK=0;
delaynus(2);
}
return dat;
}
/*************************************************************/
//函数名称:void WriteSet1302(unsigned char Cmd,unsigned char dat)
//函数功能:向ds1302芯片内部某个字节(Cmd)写入一个数据(dat)
//参数说明:Cmd为0-6,分别代表"秒,分,时,日,月,周,年"
//调用:为外部调用函数
/************************************************************/
void WriteSet1302(unsigned char Cmd,unsigned char dat)//向时钟写入一个字节的数据
{
WriteSet1302(0x8E,0x00); //关闭写保护
RST=0;
SCLK=0;
RST=1;
delaynus(2);
Write1302(ds1302_w[Cmd]);
Write1302(((dat/10)<<4)|(dat%10));
SCLK=1;
RST=0;
}
/*************************************************************/
//函数名称:unsigned char ReadSet1302(unsigned char Cmd)
//函数功能:向ds1302芯片内部某个字节(Cmd)读出一个数据,并将数据返回
//调用:为外部调用函数
/************************************************************/
unsigned char ReadSet1302(unsigned char Cmd)
{
unsigned char dat;
RST=0;
SCLK=0;
RST=1;
Write1302(ds1302_r[Cmd]);
dat=Read1302();
SCLK=1;
RST=0;
return dat;
}
/******************************寻光模块*******************************/
/*************************************************************/
//函数名称:bit gm_left(void)
//函数功能:左寻光光敏电阻,当亮度大时返回1,亮度比较小时返回0
//调用:为外部调用函数
/************************************************************/
bit gm_left(void)
{
bit dat;
dat = u5_out1;
return dat;
}
/*************************************************************/
//函数名称:bit gm_left(void)
//函数功能:右寻光光敏电阻,当亮度大时返回1,亮度比较小时返回0
//调用:为外部调用函数
/************************************************************/
bit gm_right(void)
{
bit dat;
dat = u5_out2;
return dat;
}
/******************************红外避障模块*******************************/
/*************************************************************/
//函数名称:bit hbz_left(void)
//函数功能:左红外避障,接收到反射回来的信号返回0,没有收到信号返回1
//调用:为外部调用函数
/************************************************************/
bit hbz_left(void)
{
bit dat;
dat = u4_out3;
return dat;
}
/*************************************************************/
//函数名称:bit hbz_right(void)
//函数功能:右红外避障,接收到反射回来的信号返回0,没有收到信号返回1
//调用:为外部调用函数
/************************************************************/
bit hbz_right(void)
{
bit dat;
dat = u4_out4;
return dat;
}
/******************************红外循迹模块*******************************/
/*************************************************************/
//函数名称:bit hxj_left(void)
//函数功能:左红外循迹,接收到反射回来的信号返回0,没有收到信号返回1
//调用:为外部调用函数
/************************************************************/
bit hxj_left(void)
{
bit dat;
dat = u4_out2;
return dat;
}
/*************************************************************/
//函数名称:bit hxj_right(void)
//函数功能:右红外循迹,接收到反射回来的信号返回0,没有收到信号返回1
//调用:为外部调用函数
/************************************************************/
bit hxj_right(void)
{
bit dat;
dat = u4_out1;
return dat;
}
/******************************超声波模块*******************************/
/***************************************************/
//函数名称:void delay20us();
//函数功能:延时20us;
/***************************************************/
void delay20us() //@11.0592MHz
{
unsigned char i;
_nop_();
_nop_();
_nop_();
i = 24;
while (--i);
}
/***************************************************/
//函数名称:void csb_init(void);
//函数功能: 超声波模块初始化程序
//使用定时器1计算时间,
/***************************************************/
void csb_init(void)
{
EA = 1; //打开中断总开关
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F;
TMOD |= 0x10; //定时器1工作方式1,16位计时模式
TF1 = 0; //将定时器溢出标志复位
}
/***************************************************/
//函数名称:unsigned int get_distance(void);
//函数功能: 获取超声波返回的时间,并计算距离,返回计算好的距离
//使用定时器1计算时间,
/***************************************************/
unsigned int get_distance(void)
{
unsigned int Distance; //测量到的距离
unsigned char flag_i=0; //距离测量成果标志位
TR1 = 0; //先将定时器1关闭
TH1 = 0;
TL1 = 0; //将定时器1的计数清零
Tring = 0; //信号端先置零
delayms(2); //稍微延时一下
Tring = 1;
delay20us();
Tring = 0; //信号端置位保存大约10us的时间,产生开始信号
while(Echo==0); //等待返回高电平
TR1 = 1; //启动定时器1开始计数
while(Echo==1) //当为1时计时
{
Distance = TH1*256+TL1;
if(Distance>27110) //大约4000时间已超出出量距离,返回888
{
TR1 = 0;
flag_i = 2;
Distance = 888;
break;
}
else
flag_i = 1;
}
if(flag_i==1)
{
TR1 = 0; //关闭定时器3;
Distance = TH1*256+TL1; //读取定时器里的时间
Distance *= 0.01844; //距离=(时间*速度)/2,时间单位秒,速度单位m/s,距离单位米
if(Distance>500) //定时器一个计时时间:12/11.0592=1.085
Distance=888; //时间=(TH1*256+TL1)*1.085,单位微秒,转换为秒需除1000000
} //距离=(340*(TH1*256+TL1)*1.085)/2/1000000=(TH1*256+TL1)*0.0001844,单位米
//转化为厘米显示:0.0001844*100=0.01844,单位厘米
TR1 = 0;//关闭定时器1中断
return Distance;//将计算出的距离返回
}
/******************************红外遥控模块*******************************/
/***************************************************/
//函数名称:void hwyk_init(void);
//函数功能: 超声波模块初始化程序
//使用定时器1计算时间,
/***************************************************/
void hwyk_init(void)
{
EA = 1;//打开中断总开关
ET1 = 1;//允许定时器0中断
EX0 = 1;//允许外部中断0中断
IT0 = 1;//下降沿触发外部中断0
AUXR &= 0xBF; //定时器工作在12T模式
TMOD &= 0x0f; //将定时器工作模式设置先复位
TMOD |= 0x10; //设置定时工作在方式1中,16位计时模式
TH1 = 0;
TL1 = 0;//将定时器计时溢出清零
}
/***************************************************/
//函数名称:unsigned char get_hwyk(void);
//函数功能: 返回接收到的红外按键码
//使用定时器1计算时间,
/***************************************************/
unsigned char get_hwyk(void)
{
unsigned char i,x;//i为计算接上多少字节的数据,x为计算每一个字节数据的第几位
unsigned char temp;//临时接到字节数据存储
unsigned int Ltime,Htime;//波形的高低电平时间存储
EX0 = 0;//先将中断允许关闭,放在其他的电平造成干扰
TH1 = 0;
TL1 = 0;//将定时器的计算寄存器清零
TR1 = 1;//定时器开始运行计时
while(Rt==0)//计算低电平时间
{
if((TH1*256+TL1)>16000)//如果低电平时间超过16000,则实际时间是16000*1.085=17360us,是引导码9000us的两倍
{
Rt = 1;//将管脚释放
IE0 = 0;//将中断标记位清零
TR1 = 0;//定时器关闭
TF1 = 0;
EX0 = 1;//重新开启外中断
break;//直接退出中断
}
}
TR1 = 0;
Ltime = TH1*256+TL1;//记录低电平时间
TH1 = 0;
TL1 = 0;//将定时器的计算寄存器清零
TR1 = 1;//定时器开始运行计时
while(Rt==1)//计算高电平时间
{
if((TH1*256+TL1)>9000)//如果高电平时间超过9000,则实际时间是9000*1.085=9765us,是引导码4500us的两倍
{
Rt = 1;//将管脚释放
IE0 = 0;//将中断标记位清零
TR1 = 0;//定时器关闭
TF1 = 0;
EX0 = 1;//重新开启外中断
break;//直接退出中断
}
}
TR1 = 0;
Htime = TH1*256+TL1;//记录高电平时间
if((Ltime>7800)&&(Ltime<8800)&&(Htime>3800)&&(Htime<4500))//如果引导码低电平在9000us左右,高电平在4500us左右,则符合
{
for(i=0;i<4;i++)//一共有4个字节数据
{
for(x=0;x<8;x++)//每个字节有8位数据
{
temp >>= 1;//先接上低位,在接高位,所以需要先左移一位
while(Rt==0);//跳过低电平
TH1 = 0;
TL1 = 0;
TR1 = 1;
while(Rt==1);
TR1 = 0;
Htime = TH1*256+TL1;//测量高电平时间
if((Htime>300)&&(Htime<720))//高电平符合则为0
temp &= 0x7f;
if((Htime>1300)&&(Htime<1800))//高电平符合则为1
temp |= 0x80;
}
a[i] = temp;//将每个字节都存储到数组中
}
}
Rt = 1;
IE0 = 0;
TR1 = 0;
TF1 = 0;
EX0 = 1;//重新启动外部中断
return a[2];//读取遥控编码的第三位,第三位为按键码
}
/******************************红外遥控模块*******************************/
/***************************************************/
//函数名称:void c_init(void);
//函数功能: 小车初始化,每个程序都需要保护这个
/***************************************************/
void c_init(void)
{
unsigned char i=0;
unsigned char dddd;
unsigned int vvvv;
if(i==1)
{
c_stop();
c_go();
c_bask();
c_left();
c_right();
bell(1,200);
display_init();
display_07(0,0);
display_led(0xaa);
k1();
k2();
k3();
k4();
vvvv = Rtemp_ds18b20();
WriteSet1302(0x80,0x00);
dddd = ReadSet1302(0x81);
gm_left();
gm_right();
hbz_left();
hbz_right();
hxj_left();
hxj_right();
csb_init();
vvvv = get_distance();
hwyk_init();
dddd = get_hwyk();
}
}
复制代码
新建文件夹.zip
2020-7-10 22:03 上传
点击文件名下载附件
下载积分: 黑币 -5
621.56 KB, 下载次数: 39, 下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1