题目:基于C52的智能小车设计与制作
1设计目的
通过构建智能小车,培养设计并实现自动控制系统的能力,在实践过程中,熟悉以单片机为核心控制芯片,设计小车的检测,驱动和显示等外围电路,采用智能控制算法实现小车的流水灯,蜂鸣器,数码管,机动等的结合。灵活应用机电等相关学科实现方法,达到理论与实践的统一。在此过程中,加深对控制理论的理解和认识。
2功能要求及技术指标
功能要求:
- 按键控制小车功能,使小车功能多样化。
- 小车的前进,后退左右转弯及原地旋转。
- 通过小车车灯红外功能实现小车自行循迹。
- 脱离轨道蜂鸣器自动报警。
技术指标:
可熟练运用按键复用,中断等技术,熟练掌握分模块编程,调用协调函数。各模块各司其职,协调配合,以此达到自己预期想要的效果,同时分模块编程,便于日后小车的维护。
3 总体设计方案
方框图直接用软件VISIO 2003 画出。对方框图应有文字描述:方框图的功能、组成和工作过程(各方框图的相互关系)等。
4 硬件电路设计
主控芯片:
蜂鸣器工作原理:蜂鸣器的发声原理由振动装置和谐振装置组成,而蜂鸣器又分为无源他激型与有源自激型,蜂鸣器的发声原理为:
1、无源他激型蜂鸣器的工作发声原理是:方波信号输入谐振装置转换为声音信号输出。
2、有源自激型蜂鸣器的工作发声原理是:直流电源输入经过振荡系统的放大取样电路在谐振装置作用下产生声音信号。
蜂鸣器工作原理图:
电机驱动原理:
所谓步进电机驱动器就是一种将电脉冲转化为角位移的执行机构;更通俗一点讲:当步进驱动器接收到一个脉冲信号,它就驱动步进电机按设定的方向转动一个固定的角度。我们可以通过控制脉冲的个数来控制电机的角位移量,从而达到***定位的目的;同时还可以通过控制脉冲频率来控制电动机转动的速度和加速度,从而达到调速的目的。目前,比较常用的步进电动机包括反应式步进电动机(VR)、永磁式步进电动机(PM)、混合式步进电动机(HB)和单相式步进电动机等。
电机驱动原理图:
5 软件设计
程序流程图直接用软件VISIO 2003 画出。注意绘制的程序流程图要规范,具体有如下要求:(1)开始框两边要是椭圆的;(2)判断框要是菱形,菱形框内的文字后要以问号?结尾,两条分支分别要有“Y”和“N”分支条件;(3)带箭头的流向线能到线的,尽量到线。
对程序程序流程图应有文字描述:程序流程图的功能、初始化的过程、工作流程等。
6 系统测试与结果分析
基于物联网技术的智能家居控制系统的实验样机图如图5所示,用1台YB1731A2A型直流稳压电源提供+5V的电压,1台DMM4040型6位半数字万用表同时接入系统分别测量系统的输入电压、输入电流、输出电压。用0~10Ω/50W可调电阻做负载对该系统进行性能测试。
7 使用说明
按下S2键小车启动。放入事先准备好的跑道。小车自动向前行驶,脱离轨道后会发出警报声,根据相对应的程序。小车能够自主在准备好的轨道上行驶而不至于脱离轨道。
8 设计总结
经过为期一周的课设,我们不仅在技术方面得到了很大启发与进步,还在心性方面得到了很大的磨练。在本次实验中,我们了解了AT80C51单片机的基本硬件构成,学习并实践了流水灯、数码管、蜂鸣器、电机、定时器、按键及中断的代码编写,将硬件与代码结合,设计了基于51单片机的智能小车。
有些知识上课听起来云里雾里没怎么搞懂,通过这次自己动手操作,我们把学到的书本知识转化成了实际的应用,加深了我们对知识的掌握,实践和理论结合,让人感到更有意思。这一周中,我们遇到许许多多的困难,同时也不断克服困难。通过这几天的学习与钻研,我们再次培养了实践能力和协作精神,这对我们以后的工作和学习有很大的用处。总的来说,这次学的到了技术,也收获了很多处理问题的技巧与方法,果然实践才是掌握真理的唯一标准。
在这期间和老师的相处也特别的愉快,特别喜欢这种一起努力一起讨论的感觉,也享受这种经过自己的努力将问题解决发自内心的喜悦。
实验代码:
#include<reg52.h>
#include "main.h"
#include"beep.h"
#include"car.h"
sfr IPH = 0xB7;
extern unsigned short pwm_left_val ;
extern unsigned short pwm_right_val;
extern unsigned int pwm_t;
unsigned char car_state = 0;
Input_Filter_t input;
Input_Flag_t input_flag;
void timer0() interrupt 1
{
pwm_t++;
if(pwm_t == pwm_left_val)
EN1 = 0;
if(pwm_right_val == pwm_t)
EN2 = 0;
if(pwm_t == FREQUENCY * 5)
{
EN1 = 1;
EN2 = 1;
pwm_t = 0;
}
}
void Timer0_init()
{
TMOD |= 0x02;
TH0 = 235;
TL0 = 235;
ET0 = 1;
EA = 1;
IPH &= ~(1<<1);
IP |= 1<<1;
TR0 = 1;
}
void key()
{
while(1)
{
if(key_s2 == 0)
{
return;
}
}
}
void xj()
{
if(left_led1 == 1 && right_led1 == 1)
{
forword();
BEEP=BEEPOFF;
}
else if(left_led1 == 0 && right_led1 == 1)
{
right();
BEEP=BEEPON;
}
else if(left_led1 == 1 && right_led1 == 0)
{
left();
BEEP=BEEPON;
}
else
{
BEEP=BEEPOFF;
}
}
void Obstacle_Avoidance(void)
{
//if(input_flag.left_led2_flag == 1 && input_flag.right_led2_flag == 1 && car_state != CAR_FORWARD)
if(input_flag.left_led1_flag == 1 && input_flag.right_led1_flag == 1 )
{
forword();
//car_state = CAR_FORWARD;
}
else if(input_flag.left_led1_flag == 1 && input_flag.right_led1_flag == 0 || car_state != CAR_TRUN_LEFT)//修正
{
left();
car_state = CAR_TRUN_LEFT;
}
else if(input_flag.left_led1_flag == 0 && input_flag.right_led1_flag == 1 car_state != CAR_TRUN_RIGHT) //右转修正
{
right();
car_state = CAR_TRUN_RIGHT;
}
//else if(car_state != CAR_CLOCKWISE)
else
{
//Back();
//Clockwise_Run();
//car_state = CAR_CLOCKWISE;
}
}
void Input_Check(void)
{
if(left_led2 == 0)
{
input.Input_down_filter[0]++;
input.Input_up_filter[0] = 0;
if(input.Input_down_filter[0] == 100)
{
input_flag.left_led2_flag = 0;
}
}
else
{
input.Input_up_filter[0]++;
input.Input_down_filter[0] = 0;
if(input.Input_up_filter[0] == 100)
{
input_flag.left_led2_flag = 1;
}
}
if(right_led2 == 0)
{
input.Input_down_filter[1]++;
input.Input_up_filter[1] = 0;
if(input.Input_down_filter[1] == 100)
{
input_flag.right_led2_flag = 0;
}
}
else
{
input.Input_up_filter[1]++;
input.Input_down_filter[1] = 0;
if(input.Input_up_filter[1] == 100)
{
input_flag.right_led2_flag = 1;
}
}
if(left_led1 == 0)
{
input.Input_down_filter[2]++;
input.Input_up_filter[2] = 0;
if(input.Input_down_filter[2] == 100)
{
input_flag.left_led1_flag = 0;
}
}
else
{
input.Input_up_filter[2]++;
input.Input_down_filter[2] = 0;
if(input.Input_up_filter[2] == 100)
{
input_flag.left_led1_flag = 1;
}
}
if(right_led1 == 0)
{
input.Input_down_filter[3]++;
input.Input_up_filter[3] = 0;
if(input.Input_down_filter[3] == 100)
{
input_flag.right_led1_flag = 0;
}
}
else
{
input.Input_up_filter[3]++;
input.Input_down_filter[3] = 0;
if(input.Input_up_filter[3] == 100)
{
input_flag.right_led1_flag = 1;
}
}
}
void main()
{
key();
Timer0_init();
Motor_Init();
while(1)
{
xj();
}
}