红外遥控车.docx
《红外遥控车.docx》由会员分享,可在线阅读,更多相关《红外遥控车.docx(18页珍藏版)》请在冰豆网上搜索。
红外遥控车
计算机与信息学院
单片机综合实验审批材料
电子信息工程16-1班
第一组红外遥控车
一.成员介绍
本组共有15名成员,其中组长一名,副组长一名
组长:
刘之恒
副组长:
刘晓畅
成员:
刘志华
常兴宏
高阿麒
徐建栗
马睿
诸辰洋
张华庆
陆潮彬
林晨瑶
詹妮
周杰
郑婧
彭可军
二.成员分工
1.实验模块
本实验分为七个模块,分别为键盘与蜂鸣器,数码管,红外初始化,红外解码,74HCT595N芯片,PWM调速,车的组装。
2.模块分工
键盘与蜂鸣器:
刘志华周杰
诸辰洋彭可军
数码管:
张华庆林晨瑶
红外初始化:
郑婧常兴宏
高阿麒
红外解码:
刘之恒陆潮彬
詹妮
74HCT595N:
刘晓畅
PWM调速:
刘晓畅
车的组装:
刘晓畅
三.实验原理
1bas.c程序
1.1头文件与宏定义
#include
#include
#defineucharunsignedchar
#defineNOP()_nop_()
sbitb=P2^3;//定义蜂鸣器
sbits2=P3^4;//定义按键s2
sbits3=P3^5;//定义按键s2
sbitdula=P2^6;//数码管段选,锁存器控制信号
sbitwela=P2^7;//数码管位选,锁存器控制信号
sbitIR=P3^2;//红外接口标志
unsignedcharirtime;//红外用全局变量
bitirpro_ok,irok;
unsignedcharIRcord[4];
unsignedcharirdata[33];
1.2延时程序
1.2.1程序代码
/***********************
延时1ms
***********************/
voiddelay(unsignedinti)
{
unsignedintj;
unsignedchark;
for(j=i;j>0;j--)
for(k=125;k>0;k--);
}
1.3按键程序
1.3.1程序代码
/***********************
按键
***********************/
unsignedcharrec_ud()
{
if(s2==1&&s3==1)
return0;
elseif(0==s2){delay(5);//防抖
if(s2==0)return1;}
elseif(0==s3){delay(5);//防抖
if(s3==0)return2;}
}
1.3.2原理
独立按键内部电路如图所示。
矩阵键盘内部电路图
当按键没按下时,CPU对应的I/O接口由于内部有上拉电阻,其输入为高电平;当某键被按下后,对应的I/O接口变为低电平。
只要在程序中判断I/O接口的状态,即可知道哪个键处于闭合状态。
1.4蜂鸣器程序
1.4.1程序代码
/***********************
蜂鸣器
***********************/
voidbeep()
{
b=0;
delay(500);
b=1;
delay(1000);
}
1.4.2原理
蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型。
无源他激型蜂鸣器的工作发声原理是:
方波信号输入谐振装置转换为声音信号输出,无源他激型蜂鸣器的工作发声原理图如下:
有源自激型蜂鸣器的工作发声原理是:
直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号,有源自激型蜂鸣器的工作发声原理图如下:
1.5数码管程序
1.5.1程序代码
/***********************
数码管
***********************/
voidspringt(unsignedcharnum){
unsignedchardunum[]=
{0xc0,0xf9,0xa4,
0xb0,0x99,0x92,
0x82,0xf8,0x80,
0x90,0x00};
unsignedcharwenum[]=
{0x01,0x02,0x04,
0x08,0x10,0x20};
unsignedchartemp=0,i=5,level;
unsignedcharcount=1;
level=num/43;
while(num>0||count<=3){
temp=num%10;
dula=0;
P0=dunum[temp];//段选
dula=1;
dula=0;
wela=0;
P0=wenum[i];//位选
wela=1;
wela=0;
delay(6);//此处延时,约6ms
num/=10;
i--;
count++;
}
//此处是挡位
dula=0;
P0=dunum[level];//段选
dula=1;
dula=0;
wela=0;
P0=wenum[0];//位选
wela=1;
wela=0;
delay
(1);//此处延时,约1ms
}
1.5.2原理
dula和wela的D0-D7分别对应单片机I/O口的P0.0到P0.7,8个单片机IO口组成一个字节,在程序编写过程中,可以直接用P0来进行操作。
dula和wela的分别对应单片机I/O口的P2.6和P2.7,实现对数码管的位选和段选.加入延时函数,达到数码管循环显示目的。
1.6红外程序
1.6.1程序代码
/*------------------------------------------------
定时器0中断处理
------------------------------------------------*/
voidtim0_isr(void)interrupt1using1
{
irtime++;//用于计数2个下降沿之间的时间
}
/*------------------------------------------------
外部中断0中断处理
------------------------------------------------*/
voidEX0_ISR(void)interrupt0//外部中断0服务函数
{
staticunsignedchari;//接收红外信号处理
staticbitstartflag;//是否开始处理标志位
if(startflag)
{
if(irtime<63&&irtime>=33)//引导码TC9012的头码,9ms+4.5ms
i=0;
irdata[i]=irtime;//存储每个电平的持续时间,用于以后判断是0还是1
irtime=0;
i++;
if(i==33)
{
irok=1;
i=0;
}
}
else
{
irtime=0;
startflag=1;
}
}
/*-----------------------------------------------------
红外接收函数
-----------------------------------------------------*/
unsignedcharrec_ir(){
unsignedchari,j,k;
unsignedcharcord,value;
unsignedcharnum;
k=1;
for(i=0;i<4;i++)//处理4个字节
{
for(j=1;j<=8;j++)//处理1个字节8位
{
cord=irdata[k];
if(cord>7)//大于某值为1,这个和晶振有绝对关系,这里使用12M计算,此值可以有一定误差
value|=0x80;
if(j<8)
{
value>>=1;
}
k++;
}
IRcord[i]=value;
value=0;
}
irpro_ok=1;//处理完毕标志位置1
irok=0;
switch(IRcord[2])//判断第三个数码值
{
case0x18:
num=2;break;//2
case0x08:
num=4;break;//4
case0x1c:
num=5;break;//5
case0x5a:
num=6;break;//6
case0x52:
num=8;break;//8
default:
break;
}
irpro_ok=0;//处理完成标志
returnnum;
}
/*--------------------------------------------------
红外初始化
-----------------------------------------------------*/
voidinit_ir(void){
TMOD|=0x02;//定时器0工作方式2,TH0是重装值,TL0是初值
TH0=0x00;//重载值
TL0=0x00;//初始化值
ET0=1;//开中断
TR0=1;
IT0=1;//指定外部中断0下降沿触发,INT0(P3.2)
EX0=1;//使能外部中断
EA=1;//开总中断
}
1.6.2原理
对接收到的红外信号进行解码,由于不同按键的区别在于数据码不同,所以只需解码第三个字节。
对数组irdata存储的第三个字节进行判断,一共八位,进行8次判断,利用时钟中断的叠加标志来判断是0还是1。
同时,因为采用的nec通信协议是低位在前高位在后,所以要对每次解码的1或0进行移位,最后转成数字输出。
1.7HC595程序
1.7.1程序代码
voidHC595SendData(unsignedcharSendVal)
{
unsignedchari;
for(i=0;i<8;i++)
{
if((SendVal<
elseMOSIO=0;
S_CLK=0;
NOP();
NOP();
S_CLK=1;
}
R_CLK=0;
NOP();
NOP();
R_CLK=1;
}
1.7.2原理
Q0--Q7:
八位并行输出端
Q7':
级联输出端
DS:
串行数据输入端
/MR(10脚):
低电平时将移位寄存器的数据清零。
SH_CP(11脚):
上升沿时数据寄存器的数据移位。
下降沿移位寄存器数据不变。
ST_CP(12脚):
上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。
/OE(13脚):
高电平时禁止输出(高阻态)
使用时,
1.将要准备输入的位数据移入74HC595数据输入端上,送位数据到_595。
2.将位数据逐位移入74HC595,即数据串入。
SH_CP产生一上升沿,将DS上的数据移入74HC595移位寄存器中,先送低位,后送高位。
3.并行输出数据。
即数据并出。
ST_CP产生一上升沿,将由DS上已移入数据寄存器中的数据送入到输出锁存器。
1.7.3功能
‘将串行数据转换为并行数据输出,用于控制电机,以及实现4个电机的同步pwm调速。
2main.c文件
2.1头文件与宏定义
#include
#include
#include"bas.c"
#defineucharunsignedchar
#defineuintunsignedint
ucharpwm=255;
uchartimer1_count=255;
sbitM1=P1^0;
sbitM2=P1^1;
sbitM3=P1^2;
sbitS1=P1^3;
sbitS2=P1^5;
sbitpwm_out=P1^7;//PWM输出端口
2.2PWM程序
2.2.1程序代码
/********************************
T0定时器初始化*******************
*********************************/
voidinit_timer0()
{
TMOD|=0x20;//T1方式2计时
TH1=0xb0;
TL1=0xb0;
EA=1;//总中断开
ET1=1;//定时器0开
TR1=1;//启动定时器
}
/*********************************
T0定时中断子函数******************
*********************************/
voidtimer1()interrupt3using0
{
if(pwm==timer1_count)//占空比计数器等于定时中断计数器否
{
pwm_out=1;//开通输出
}
if(timer1_count==0)//定时中断计数器为0否
{
pwm_out=0;//关断输出
timer1_count=256;//重置初始值
}
timer1_count--;
}
2.2.2原理
PWM是一项通过数字方法来获得模拟量的技术。
数字控制来形成一个方波,方波信号只有开关两种状态(也就是引脚的高低)。
通过控制开与关所持续时间的比值就能模拟到一个0到5V之间变化的电压。
高电平所占用的时间就叫做脉冲宽度,所以PWM也叫做脉冲宽度调制。
2.2.3功能
通过pwm调整占空比达到调速目的
2.3主函数
2.3.1程序代码
voidmain()//主函数
{
init_ir();
init_timer0();
while
(1){
springt(pwm);
switch(rec_ud())
{
case0:
S1=0;S2=0;break;
case1:
if(pwm!
=0){pwm--;S2=1;}
elsebeep();
break;
case2:
if(pwm!
=255){pwm++;S1=1;}
elsebeep();
break;
delay(10);
}
switch(rec_ir())
{
case2:
M1=0;M2=0;M3=0;
break;
case4:
M1=0;M2=1;M3=0;
break;
case5:
M3=1;
break;
case6:
M1=1;M2=0;M3=0;
break;
case8:
M1=1;M2=1;M3=0;
break;
}
}
}
四.实验电路
1.L293D
2.74HCT595N
五.实验问题及应对
试验中发现调用74HCT595N操控电机时,电机反馈与指令不符且毫无规律,多次修正无果后,放弃调用74HCT595N函数,使用arduino对电机控制,通过若干IO口实现和51单片机之间的通信,达到实验目的。
六.小车操作说明
1.向51单片机板提供3V至5V电压,向arduino板提供9V左右电压,向L293D电池盒中装入两节18650电池。
2.通过固定键盘按键S2,S3可以调节占空比,以达到调速目的,数值在0-255之间,并显示在数码管上,达到上限或下限会有蜂鸣器警报。
LED8号灯的显示亮度可以提供参考。
3.通过红外遥控发送指令,2为前进,4为左转,5为停止,6为右转,8为后退。
LED1号2号3号灯可以提供参考,3号灯灭为停止,1号2号4种亮灭组合对应四种行进方式。
七.应用及前景
红外遥控车功能可以进一步完善。
如加装传感器模块后,可以实现自动避障功能,循迹功能,自动导航功能等。
搭载摄像头以及小型计算机后,可以实现自动识别功能。
小车也称轮式机器人,最适合在那些人类无法工作的环境中工作,该技术可以应用于无人驾驶机动车,无人生产线,仓库,服务机器人等领域。
在危险环境下,机器人非常适合使用。
在这些险恶的环境下工作,人类必需采取严密的保护措施。
而机器人可以进入或穿过这些危险区域进行维护和探测工作,且不需要得到像对人一样的保护。