湖南涉外经济学院
课程设计报告
课程名称:专业综合课程设计
报告题目:智能小车设计 学生姓名:
所在学院:信息科学与工程学院 专业班级: 学生学号: 指导教师:廖亦凡
20 15 年 7 月1日
课程设计任务书
摘要
STC89C52单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。本系统以设计题目的要求为目的,采用STC89C52单片机为控制核心,利用超声波传感器检测道路上的障碍,控制电动小汽车的自动避障,快慢速行驶,以及自动停车,并可以自动记录时间、里程和速度,自动寻迹和寻光功能。整个系统的电路结构简单,可靠性能高。实验测试结果满足要求,本文着重介绍了该系统的硬件设计方法及测试结果分析。
在智能小车控制系统的设计中,以STC89C52为核心,用L293D驱动两个直流电机,当产生信号驱动小车前进时,是通过寻迹模块里的红外对管是否寻到黑线产生的电平信号通过LM393再返回到单片机,单片机根据程序设计的要求做出相应的判断送给电机驱动模块,让小车来实现前进、左转、右转、停车等基本功能。寻白线时,外部环境光线的强弱对小车的运动会产生很大的影响,基于此原因,本实验中的寻迹是指在白色地板上寻黑线。寻迹是指通过红外发射管和接收管识别路径。
关键词:智能小车、单片机、STC89C52、超声波传感器;
目录
一、系统设计........................................................ 1
1.基本要求 ...................................................... 1 二、方案设计与论证.................................................. 1
2.1循迹模块..................................................... 1 2.2避障模块..................................................... 3 2.3电机控制模块................................................. 5 2.4遥控模块..................................................... 8 三、总原理图....................................................... 14
1.总原理图 ..................................................... 14 2.实物图 ....................................................... 14 四、结论与心得..................................................... 16 五、参考文献....................................................... 16
一、系统设计
1.基本要求
(1)智能小车能在设计好的线路上自动循迹;
(2)智能小车利用红外管进行探测,遇到障碍开启报警,实现避障功能; (3)使用遥控器对智能小车进行控制,实现前后左右运动,并在数码管上显示相应的数字;
(4)采用声控装置,用拍手来控制小车的启动与停止; (5)采用光敏二极管完成管控模块。
二、方案设计与论证
根据基本要求确定方案,在现有的智能小车上,实现对车的速度,运动状况进行检测,并将测量数据传送至单片机进行处理,然后有单片机根据所检测的各种数据实现对智能小车的智能控制。
2.1循迹模块
2.1.1循迹原理
本车红外对管设计是红外发射管一直发射信号,接收管时刻准备接收信号。 两对对着地的红外管发射红外信号,信号在白色的地面上反射回接收管,通过接收管把信号送回单片机进行处理,完成相应的动作。假如左右红外发射管发射的红外线对准地面白色的区域,则红外线被反射回来被接收管接收后转变成电信号送至单片机的P3.5和P3.6。此时P3.5=P3.6=0,当单片机信号检测到此电平时,便会判断出小车处于白色区域,这时小车就会沿直线行走,当红外发射管左边对准黑线(黑胶带),右边对准白线(白色地面)时,左边的红外线被黑线吸收,红外线无法反射回,则左边呈现高电平,即单片机检测到P3.5=1(左边)、P3.6=0,这时,小车便向左边修正(左转弯),使左边传感器重新回到白色区域。右转弯过程与左转弯相类似。
图1 循迹控制电路图
2.1.3循迹流程图
图2 循迹程序流程
2.1.4循迹主要程序代码
void main()
{ while(1)
//while(1);等待 通常使用在主函数的最后一条 定时器的后面 { if(zuod==0&youd==0) //如果左右两个传感器没有检测到黑线
{ qian(); //直走 out=ZM[1]; }
if(zuod==1&youd==0) //如果左边的传感器检测到黑线
{ while(1) { zuo();
out=ZM[3]; //左转 D1=0; // 蔽障
if(zuod==0) //一直左转到传感器检测不到为止
{D1=1;
break; //跳出循环
} }
}
if(youd==1&zuod==0) { while(1)
{ you(); out=ZM[4]; D2=0; if(youd==0) { D2=1; break; }
}
}
} } //效果:沿着黑线转圈
2.2避障模块
2.2.1避障原理
避障电路由单片机、比较芯片L393、红外发射对管等元器件构成。电路工作过程如下:首先,比较芯片的2脚为基准电压输入,该引脚通过电源串联分压,取得一个大约2.5V基准电压作为比较电压。比较芯片的3脚为比较电压的输入端,该电压取之反馈回来的红外信号。当小车前进过程中,前方无障碍,则红外接收管的阻值会很大,从而输出一个高电平(约5V)给比较芯片的3脚,这样经过比较芯片的比较,在比较芯片的2脚输出一个高电平给单片机P3.7引脚。单片机根据接收到的电平就可以判别前方有无障碍。当前方有障碍时V2的阻值会很小,输出低电平给比较芯片的3脚,比较芯片从而输出低电平给单片机P3.7。 2.2.2避障控制原理图
图3 避障控制电路
2.2.3 避障程序流程框
图4 避障报警程序流程图 2.2.4避障主要程序代码 void main() { while(1) {
{ if(zuod==0&youd==0) //如果左右两个传感器没有检测到黑线
{ qian();
//直走
//如果在直走的过程中遇见障碍物
//延时判断是否为干扰
out=ZM[1]; if(qiand==0)
{ delay(50);
//不是干扰
//蜂鸣器
//右转200毫秒
hou();
//后退半秒
if(qiand==0)
jiao=0; out=ZM[2];
delay(500); you(); out=ZM[4]; delay(200);
jiao=1;
}
//取消报警
}
}
if(zuod==1&youd==0) //如果左边的传感器检测到黑线
{ while(1) { zuo();
out=ZM[3]; //左转 D1=0;
if(zuod==0) //一直左转到传感器检测不到为止
{
D1=1;
break; //跳出循环
}
}
}
2.3电机控制模块 2.3.1电机控制电路
图5电机控制电路图
2.3.2 直流电机H桥驱动电路工作原理
图6 直流电机H桥驱动电路工作原理
2.3.3电机控制程序流程图
图7 电机控制程序流程图
2.3.4电机运行程序 #include
#define uint unsigned int #define uchar unsigned char sbit left1=P0^0; sbit left2=P0^1; sbit right1=P0^2; sbit right2=P0^3; sbit SB1=P3^2; sbit SB2=P3^4; void delay(uint x) {
uchar i; while(x--)
for(i=0;i
void qianjin() {
left1=0;
left2=1;//左边往前 right1=0;
right2=1;//右边往前 }
void houtui() {
left1=1;
left2=0;//左边往后 right1=1;
right2=0;//右边往后
}
void left() { left1=1; left2=0;//左边往后 right1=0; right2=1;//右边往前 }
void right() { left1=0; left2=1;//左边往前 right1=1; right2=0;//右边往后 }
void tingzhi() {
left1=1; left2=1; right=1; right2=1; }
main()
{ while(1) { if(SB1==0) { qianjin(); } if(SB2==0)
{ houtui(); } } }
2.4遥控模块
2.4.1遥控原理
红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。把遥控程序下载到智能小车芯片上,利用红外接收头接受遥控器发出的信号,对智能小车进行前后左右的控制,并使用智能小车上面的数码管,把控制小车各运行方向的数值显示出来。 2.4.2遥控主要程序 #include #include typedef unsigned int uint; typedef unsigned char uchar;
uint IR_time;
uchar code table[]={0x9f,0x24,0x0d,0x99,0xff};//数码管编码 uchar TIME[33]={0};//存放33个波形时间 uchar Time_dat[4]={0};//存放4个解码完成的数据
sbit left0 = P0^0; sbit left1 = P0^1; sbit right0 = P0^2; sbit right1 = P0^3; sbit fmq = P3^3;
bit IR_ok;
bit IR_chuli_ok; //将波形时间转换成逻辑电平的标志 bit start; //标志位,开始计时标志位
void qianjin() {
//前进子函数
left0 = 1; left1 = 0; right0 = 1;
}
void houtui()
{ left0 = 0; left1 = 1;
right0 = 0; right1 = 1;
}
void youzhuan()
{ left0 = 1; left1 = 0; right0 = 0; right1 = 1;
}
void zuozhuan() { left0 = 0; left1 = 1; right0 = 1; right1 = 0; }
void stop()
{ left0 = 0; left1 = 0; right0 = 0; right1 = 0;
}
void EX1_init(void) { IT1 = 1;
EA = 1;
//后退子函数
//右转子函数 //左转子函数 //停止子函数
//外部中断下降沿触发
}
//定时器工作在方式2(8位自动重装)
void Time1_init(void) { }
TMOD |= 0x20; TH1 = 0; TL1 = 0; ET1 = 1; TR1 = 1;
void IR_chuli(void) {
//将时间值转化为逻辑电平(转换成16进制函数)
uchar i,j;
uchar NUM = 1; //去除引导码,因为引导码存在数组下标为0的位uchar HL_time; //定义一个时间变量,用于单个按键波形处理 uchar byte = 0x00; //定义一个字节变量,用于存储转换的16进制数 for(i=0;i
for(j=0;j
Time_dat[i] = byte;
HL_time = TIME[NUM];
if(HL_time > 6) //((1.125+2.25)
byte |= 0x80; byte = byte;
byte >>= 1; //因为最先处理低位数据,所以要用右移方法,将
置,即第1位,数据从第2位开始)
码)
/2=1.687ms,277us*6=1.66ms,判断为1,否则为0)
else if(j
低位移7次,回到本来位置)
NUM++;
}
}
if(Time_dat[2] == ~Time_dat[3]) //比较数据码与数据反码是否相等,相等,IR_chuli_ok = 1;
//处理成功的标志,
表示处理成功。
void play(void) {
switch(Time_dat[2]) {
case 0x0c:DataPort=dofly_DuanMa[1];break;//1 显示相应的按键值 case 0x18:qianjin();P2=table[0];break;//2 case 0x5e:;break;//3
case 0x08:zuozhuan();P2=table[2];break;//4 case 0x1c:;break;//5
case 0x5a:youzhuan();P2=table[3];break;//6 case 0x42:;break;//7
case 0x52:houtui();P2=table[1];break;//8 case 0x47:switc_h = ~switc_h;break;//9
// // // // // }
}
default:break;
/*********************************************************
遥控器1(小)码值: 45 46 47 44 40 43 07 15 09 16 19 0d 0c 18 5e 08 1c 5a 42 52 4a
遥控器2(大)码值:
05 04 06 07 09 08 0a 0b 0d 0c 0e 0f 15 14 16 17 19 18 1a 1b 11 10 12 13 01 00 02 03 1d 1c 1e 1f
***********************************************************/
void main()
}
void EX1_(void) interrupt 2 //外部中断 接收波形时间 {
}
else if(start) //第二个下降沿到第33个下降沿 {
if((IR_time = 32))
//剔除引导码4*8=32(引导码
static uchar xx = 0; if(!start) {
start = 1;
IR_time = 0; //将按键按下前的时间清除
// 设置记录波形的变量;计数 0 ~33(记录34
个波形的时间)
//第一个下降沿触发 表示解码开始
while(1) { }
if(IR_ok) { }
if(IR_chuli_ok) {
IR_chuli_ok=0; }
play(); //调用符合键值的处理函数
IR_ok = 0;
IR_chuli(); //将键值时间转换成16进制处理函数。
// 按键的键值时间存储完毕标志
EX1_init(); Time1_init();
为9000US,在8.8MS与13.8MS之间认为是引导码)
}
}
TIME[xx] = IR_time; //存储按键码值时间(引导码存在数组的第一个IR_time = 0; //每个码时间不一样
//if((xx == 1)&&(TIME[1]>9)) //连发码处理,可以去掉 //{ // xx = 0; //} xx++; if(xx == 33) { }
xx = 0;
IR_ok = 1; start = 0;
//按键键值时间存储完成的标志,等于1表
位置,TIME[]为键值时间存储数组)
// TIME[1] = 0;
示完成
void Time1(void) interrupt 3 //定时器中断 {
IR_time++;
//每经过256*(12/11.0592)us触发一次中
断(约277US)
if(IR_time>390) // 不要这条语句的话按一下,就是长按,长按处理,处理连发码的时间参数(见PDF文档,约108MS,相当于长按有效,否则,按一下键,动的不明显,277*390=108MS)
{ }
IR_chuli_ok = 0;//将标志清零,停止判断。 stop(); //按键松开,电机停转 P2 = table[4]; //数码管灭
start = 0; //清零,方便下一次重新计数。
}
三、总原理图
1.总原理图
图8 总原理
2.实物图
图9 实物图
表3.1 学生情况统计表
序
姓名 性出生日期 学号
专业 联系电话 备注
号 1
万智亮
别 男
1994.03
[1**********]069
电子信息工程
[1**********]
四、结论与心得
历时一周月的设计过程中,我首先边查资料,边在实验室焊接小车的线路板。在焊接过程中,我感觉到即使是一个简单的电路,要想很轻松的焊好,也不是很容易的事情。有时是“虚焊”的原因,有时可能是阻值选错。在焊接显示电路时,我就错将15千欧的电阻焊成了1.5千欧。这使我深深感受到理论与实际间的差距。通过这样的设计,提高了我的动手能力。每天在实验室除了焊接线路板,还可以上机编程,使我软件调试知识也提高了。本次毕业设计已经告一段落。经过自己不断的搜索努力以及廖老师的耐心指导和热情帮助,本设计已经基本完成。在这段时间里,廖老师严谨的治学态度和热忱的工作作风令我十分钦佩,他的指导使我受益非浅。同时通过自己的不懈努力加细心琢磨最终完成本次课程设计,通过这次课程设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了大学三年来的学习成果。虽然在这次设计中对于知识的运用和衔接还不够熟练。但是我将在以后的工作和学习中继续努力、不断完善。这一个月的设计是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。
由于自身水平有限,设计中一定存在很多不足之处,敬请老师批评与指正,在此深表感谢。
五、参考文献
【1】林立,张俊亮.单片机原理及应用.北京:电子工业出版社,2013. 【2】李广弟,单片机基础,北京:北京航空航天大学出版社,2001,56~64 【3】何希才,新型实用电子电路400例,电子工业出版社,2000年,60~65 【4】王东峰,王会良,董冠强.单片机C语言应用100例.北京:电子工业出版社,2009.
【5】程继红,常健.传感器原理及工程应用(第四版).西安:西安电子科技大学出版社,2014.
17
18
湖南涉外经济学院
课程设计报告
课程名称:专业综合课程设计
报告题目:智能小车设计 学生姓名:
所在学院:信息科学与工程学院 专业班级: 学生学号: 指导教师:廖亦凡
20 15 年 7 月1日
课程设计任务书
摘要
STC89C52单片机是一款八位单片机,他的易用性和多功能性受到了广大使用者的好评。本系统以设计题目的要求为目的,采用STC89C52单片机为控制核心,利用超声波传感器检测道路上的障碍,控制电动小汽车的自动避障,快慢速行驶,以及自动停车,并可以自动记录时间、里程和速度,自动寻迹和寻光功能。整个系统的电路结构简单,可靠性能高。实验测试结果满足要求,本文着重介绍了该系统的硬件设计方法及测试结果分析。
在智能小车控制系统的设计中,以STC89C52为核心,用L293D驱动两个直流电机,当产生信号驱动小车前进时,是通过寻迹模块里的红外对管是否寻到黑线产生的电平信号通过LM393再返回到单片机,单片机根据程序设计的要求做出相应的判断送给电机驱动模块,让小车来实现前进、左转、右转、停车等基本功能。寻白线时,外部环境光线的强弱对小车的运动会产生很大的影响,基于此原因,本实验中的寻迹是指在白色地板上寻黑线。寻迹是指通过红外发射管和接收管识别路径。
关键词:智能小车、单片机、STC89C52、超声波传感器;
目录
一、系统设计........................................................ 1
1.基本要求 ...................................................... 1 二、方案设计与论证.................................................. 1
2.1循迹模块..................................................... 1 2.2避障模块..................................................... 3 2.3电机控制模块................................................. 5 2.4遥控模块..................................................... 8 三、总原理图....................................................... 14
1.总原理图 ..................................................... 14 2.实物图 ....................................................... 14 四、结论与心得..................................................... 16 五、参考文献....................................................... 16
一、系统设计
1.基本要求
(1)智能小车能在设计好的线路上自动循迹;
(2)智能小车利用红外管进行探测,遇到障碍开启报警,实现避障功能; (3)使用遥控器对智能小车进行控制,实现前后左右运动,并在数码管上显示相应的数字;
(4)采用声控装置,用拍手来控制小车的启动与停止; (5)采用光敏二极管完成管控模块。
二、方案设计与论证
根据基本要求确定方案,在现有的智能小车上,实现对车的速度,运动状况进行检测,并将测量数据传送至单片机进行处理,然后有单片机根据所检测的各种数据实现对智能小车的智能控制。
2.1循迹模块
2.1.1循迹原理
本车红外对管设计是红外发射管一直发射信号,接收管时刻准备接收信号。 两对对着地的红外管发射红外信号,信号在白色的地面上反射回接收管,通过接收管把信号送回单片机进行处理,完成相应的动作。假如左右红外发射管发射的红外线对准地面白色的区域,则红外线被反射回来被接收管接收后转变成电信号送至单片机的P3.5和P3.6。此时P3.5=P3.6=0,当单片机信号检测到此电平时,便会判断出小车处于白色区域,这时小车就会沿直线行走,当红外发射管左边对准黑线(黑胶带),右边对准白线(白色地面)时,左边的红外线被黑线吸收,红外线无法反射回,则左边呈现高电平,即单片机检测到P3.5=1(左边)、P3.6=0,这时,小车便向左边修正(左转弯),使左边传感器重新回到白色区域。右转弯过程与左转弯相类似。
图1 循迹控制电路图
2.1.3循迹流程图
图2 循迹程序流程
2.1.4循迹主要程序代码
void main()
{ while(1)
//while(1);等待 通常使用在主函数的最后一条 定时器的后面 { if(zuod==0&youd==0) //如果左右两个传感器没有检测到黑线
{ qian(); //直走 out=ZM[1]; }
if(zuod==1&youd==0) //如果左边的传感器检测到黑线
{ while(1) { zuo();
out=ZM[3]; //左转 D1=0; // 蔽障
if(zuod==0) //一直左转到传感器检测不到为止
{D1=1;
break; //跳出循环
} }
}
if(youd==1&zuod==0) { while(1)
{ you(); out=ZM[4]; D2=0; if(youd==0) { D2=1; break; }
}
}
} } //效果:沿着黑线转圈
2.2避障模块
2.2.1避障原理
避障电路由单片机、比较芯片L393、红外发射对管等元器件构成。电路工作过程如下:首先,比较芯片的2脚为基准电压输入,该引脚通过电源串联分压,取得一个大约2.5V基准电压作为比较电压。比较芯片的3脚为比较电压的输入端,该电压取之反馈回来的红外信号。当小车前进过程中,前方无障碍,则红外接收管的阻值会很大,从而输出一个高电平(约5V)给比较芯片的3脚,这样经过比较芯片的比较,在比较芯片的2脚输出一个高电平给单片机P3.7引脚。单片机根据接收到的电平就可以判别前方有无障碍。当前方有障碍时V2的阻值会很小,输出低电平给比较芯片的3脚,比较芯片从而输出低电平给单片机P3.7。 2.2.2避障控制原理图
图3 避障控制电路
2.2.3 避障程序流程框
图4 避障报警程序流程图 2.2.4避障主要程序代码 void main() { while(1) {
{ if(zuod==0&youd==0) //如果左右两个传感器没有检测到黑线
{ qian();
//直走
//如果在直走的过程中遇见障碍物
//延时判断是否为干扰
out=ZM[1]; if(qiand==0)
{ delay(50);
//不是干扰
//蜂鸣器
//右转200毫秒
hou();
//后退半秒
if(qiand==0)
jiao=0; out=ZM[2];
delay(500); you(); out=ZM[4]; delay(200);
jiao=1;
}
//取消报警
}
}
if(zuod==1&youd==0) //如果左边的传感器检测到黑线
{ while(1) { zuo();
out=ZM[3]; //左转 D1=0;
if(zuod==0) //一直左转到传感器检测不到为止
{
D1=1;
break; //跳出循环
}
}
}
2.3电机控制模块 2.3.1电机控制电路
图5电机控制电路图
2.3.2 直流电机H桥驱动电路工作原理
图6 直流电机H桥驱动电路工作原理
2.3.3电机控制程序流程图
图7 电机控制程序流程图
2.3.4电机运行程序 #include
#define uint unsigned int #define uchar unsigned char sbit left1=P0^0; sbit left2=P0^1; sbit right1=P0^2; sbit right2=P0^3; sbit SB1=P3^2; sbit SB2=P3^4; void delay(uint x) {
uchar i; while(x--)
for(i=0;i
void qianjin() {
left1=0;
left2=1;//左边往前 right1=0;
right2=1;//右边往前 }
void houtui() {
left1=1;
left2=0;//左边往后 right1=1;
right2=0;//右边往后
}
void left() { left1=1; left2=0;//左边往后 right1=0; right2=1;//右边往前 }
void right() { left1=0; left2=1;//左边往前 right1=1; right2=0;//右边往后 }
void tingzhi() {
left1=1; left2=1; right=1; right2=1; }
main()
{ while(1) { if(SB1==0) { qianjin(); } if(SB2==0)
{ houtui(); } } }
2.4遥控模块
2.4.1遥控原理
红外遥控的发射电路是采用红外发光二极管来发出经过调制的红外光波;红外接收电路由红外接收二极管、三极管或硅光电池组成,它们将红外发射器发射的红外光转换为相应的电信号,再送后置放大器。把遥控程序下载到智能小车芯片上,利用红外接收头接受遥控器发出的信号,对智能小车进行前后左右的控制,并使用智能小车上面的数码管,把控制小车各运行方向的数值显示出来。 2.4.2遥控主要程序 #include #include typedef unsigned int uint; typedef unsigned char uchar;
uint IR_time;
uchar code table[]={0x9f,0x24,0x0d,0x99,0xff};//数码管编码 uchar TIME[33]={0};//存放33个波形时间 uchar Time_dat[4]={0};//存放4个解码完成的数据
sbit left0 = P0^0; sbit left1 = P0^1; sbit right0 = P0^2; sbit right1 = P0^3; sbit fmq = P3^3;
bit IR_ok;
bit IR_chuli_ok; //将波形时间转换成逻辑电平的标志 bit start; //标志位,开始计时标志位
void qianjin() {
//前进子函数
left0 = 1; left1 = 0; right0 = 1;
}
void houtui()
{ left0 = 0; left1 = 1;
right0 = 0; right1 = 1;
}
void youzhuan()
{ left0 = 1; left1 = 0; right0 = 0; right1 = 1;
}
void zuozhuan() { left0 = 0; left1 = 1; right0 = 1; right1 = 0; }
void stop()
{ left0 = 0; left1 = 0; right0 = 0; right1 = 0;
}
void EX1_init(void) { IT1 = 1;
EA = 1;
//后退子函数
//右转子函数 //左转子函数 //停止子函数
//外部中断下降沿触发
}
//定时器工作在方式2(8位自动重装)
void Time1_init(void) { }
TMOD |= 0x20; TH1 = 0; TL1 = 0; ET1 = 1; TR1 = 1;
void IR_chuli(void) {
//将时间值转化为逻辑电平(转换成16进制函数)
uchar i,j;
uchar NUM = 1; //去除引导码,因为引导码存在数组下标为0的位uchar HL_time; //定义一个时间变量,用于单个按键波形处理 uchar byte = 0x00; //定义一个字节变量,用于存储转换的16进制数 for(i=0;i
for(j=0;j
Time_dat[i] = byte;
HL_time = TIME[NUM];
if(HL_time > 6) //((1.125+2.25)
byte |= 0x80; byte = byte;
byte >>= 1; //因为最先处理低位数据,所以要用右移方法,将
置,即第1位,数据从第2位开始)
码)
/2=1.687ms,277us*6=1.66ms,判断为1,否则为0)
else if(j
低位移7次,回到本来位置)
NUM++;
}
}
if(Time_dat[2] == ~Time_dat[3]) //比较数据码与数据反码是否相等,相等,IR_chuli_ok = 1;
//处理成功的标志,
表示处理成功。
void play(void) {
switch(Time_dat[2]) {
case 0x0c:DataPort=dofly_DuanMa[1];break;//1 显示相应的按键值 case 0x18:qianjin();P2=table[0];break;//2 case 0x5e:;break;//3
case 0x08:zuozhuan();P2=table[2];break;//4 case 0x1c:;break;//5
case 0x5a:youzhuan();P2=table[3];break;//6 case 0x42:;break;//7
case 0x52:houtui();P2=table[1];break;//8 case 0x47:switc_h = ~switc_h;break;//9
// // // // // }
}
default:break;
/*********************************************************
遥控器1(小)码值: 45 46 47 44 40 43 07 15 09 16 19 0d 0c 18 5e 08 1c 5a 42 52 4a
遥控器2(大)码值:
05 04 06 07 09 08 0a 0b 0d 0c 0e 0f 15 14 16 17 19 18 1a 1b 11 10 12 13 01 00 02 03 1d 1c 1e 1f
***********************************************************/
void main()
}
void EX1_(void) interrupt 2 //外部中断 接收波形时间 {
}
else if(start) //第二个下降沿到第33个下降沿 {
if((IR_time = 32))
//剔除引导码4*8=32(引导码
static uchar xx = 0; if(!start) {
start = 1;
IR_time = 0; //将按键按下前的时间清除
// 设置记录波形的变量;计数 0 ~33(记录34
个波形的时间)
//第一个下降沿触发 表示解码开始
while(1) { }
if(IR_ok) { }
if(IR_chuli_ok) {
IR_chuli_ok=0; }
play(); //调用符合键值的处理函数
IR_ok = 0;
IR_chuli(); //将键值时间转换成16进制处理函数。
// 按键的键值时间存储完毕标志
EX1_init(); Time1_init();
为9000US,在8.8MS与13.8MS之间认为是引导码)
}
}
TIME[xx] = IR_time; //存储按键码值时间(引导码存在数组的第一个IR_time = 0; //每个码时间不一样
//if((xx == 1)&&(TIME[1]>9)) //连发码处理,可以去掉 //{ // xx = 0; //} xx++; if(xx == 33) { }
xx = 0;
IR_ok = 1; start = 0;
//按键键值时间存储完成的标志,等于1表
位置,TIME[]为键值时间存储数组)
// TIME[1] = 0;
示完成
void Time1(void) interrupt 3 //定时器中断 {
IR_time++;
//每经过256*(12/11.0592)us触发一次中
断(约277US)
if(IR_time>390) // 不要这条语句的话按一下,就是长按,长按处理,处理连发码的时间参数(见PDF文档,约108MS,相当于长按有效,否则,按一下键,动的不明显,277*390=108MS)
{ }
IR_chuli_ok = 0;//将标志清零,停止判断。 stop(); //按键松开,电机停转 P2 = table[4]; //数码管灭
start = 0; //清零,方便下一次重新计数。
}
三、总原理图
1.总原理图
图8 总原理
2.实物图
图9 实物图
表3.1 学生情况统计表
序
姓名 性出生日期 学号
专业 联系电话 备注
号 1
万智亮
别 男
1994.03
[1**********]069
电子信息工程
[1**********]
四、结论与心得
历时一周月的设计过程中,我首先边查资料,边在实验室焊接小车的线路板。在焊接过程中,我感觉到即使是一个简单的电路,要想很轻松的焊好,也不是很容易的事情。有时是“虚焊”的原因,有时可能是阻值选错。在焊接显示电路时,我就错将15千欧的电阻焊成了1.5千欧。这使我深深感受到理论与实际间的差距。通过这样的设计,提高了我的动手能力。每天在实验室除了焊接线路板,还可以上机编程,使我软件调试知识也提高了。本次毕业设计已经告一段落。经过自己不断的搜索努力以及廖老师的耐心指导和热情帮助,本设计已经基本完成。在这段时间里,廖老师严谨的治学态度和热忱的工作作风令我十分钦佩,他的指导使我受益非浅。同时通过自己的不懈努力加细心琢磨最终完成本次课程设计,通过这次课程设计,使我深刻地认识到学好专业知识的重要性,也理解了理论联系实际的含义,并且检验了大学三年来的学习成果。虽然在这次设计中对于知识的运用和衔接还不够熟练。但是我将在以后的工作和学习中继续努力、不断完善。这一个月的设计是对过去所学知识的系统提高和扩充的过程,为今后的发展打下了良好的基础。
由于自身水平有限,设计中一定存在很多不足之处,敬请老师批评与指正,在此深表感谢。
五、参考文献
【1】林立,张俊亮.单片机原理及应用.北京:电子工业出版社,2013. 【2】李广弟,单片机基础,北京:北京航空航天大学出版社,2001,56~64 【3】何希才,新型实用电子电路400例,电子工业出版社,2000年,60~65 【4】王东峰,王会良,董冠强.单片机C语言应用100例.北京:电子工业出版社,2009.
【5】程继红,常健.传感器原理及工程应用(第四版).西安:西安电子科技大学出版社,2014.
17
18