基于单片机的红外遥控小车
第3章 系统软件设计
本次设计源程序是用C语言编写的,主要分为主程序、液晶显示程序、温度检测程序、电机驱动程序、调速程序、遥控解码程序等模块。
3.1 主程序
主程序主要完成各子模块的初始化,开启所有的中断,进入预定模式控制小车运行。流程图如图3-1所示。
结束 图3-1 主程序流程图
开始 初始化 开中断 Y N mode==1遥控模式 自动模式 3.2 液晶驱动子程序
液晶驱动子程序将包括:液晶的初始化、检测忙信号、写入指令、写入数据、设定显示位置等程序,1602指令操作的时序要求严格,操作起来比较复杂,尤其是在写入指令和数据之前必须检测忙信号,否则指令和数据写入无效。具体操作流程如图3-2所示,液晶初始化过程如图3-3所示。
在写入指令和数据之后要等待数据指令全部写入,因此要等待几个时钟周期,但时间不是很长,此时没必要调用延时函数,仅仅用几个_nop_()操作即可实现。例如写指令函数:
lcd_wcmd(BYTE cmd)// 写入指令数据到LCD {while(lcd_bz());//检测忙信号 rs = 0; rw = 0; ep = 0; _nop_();//短暂延时,调用空操作函数 _nop_();
第19页
基于单片机的红外遥控小车
dis_data= cmd; _nop_();_nop_();_nop_();_nop_();//等待写入完成,调用空操作函数 ep = 1; _nop_();_nop_();_nop_();_nop_(); ep = 0; }
延时15ms 延时5ms 开始 LCD初始延时设定显示位显示字符内容 返回 写指令38H(显示模式设置) 延时5ms 写指令08H(显示关闭) 延时5ms 写指令0CH(显示开及光标设置) 延时5ms 写指令06H(显示光标移动设置) 延时5ms 写指令01H(显示清屏) 延时5ms 返回 图3-2 1602显示操作过程 图3-3 1602初始化过程
3.3 温度检测子程序
由于DS18B20是在一根I/O线上读写数据,因此,对读写的数据位有着严格的时序要求,在指令的写入和数据的读取过程中采用无效的操作来代替延时函数作为等待时间既方便又简洁,还消除了函数调用带来的延时不准确的麻烦。 DS18B20有严格的通信协议来保证各位数据传输的正确性和完整性。该协议定义了几种信号的时序:初始化时序、读时序、写时序。所有时序都是将主机作为主设备,单总线器件作为从设备。而每一次命令和数据的传输都是从主机主动启动写时序开始,如果要求单总线器件回送数据,在进行写命令后,主机需启动读时序完成数据接收。数据和命令的传输都是低位在先。
程序还采用定时器1设定温度间隔采样时间,省去了在小车行进过程中专门调用温度采集程序,充分利用了单片机的时间,操作简单方便。具体操作流程如图3-4所示。
第20页
基于单片机的红外遥控小车
开始 设置DQ为1 初始化DS18B20 N 是否成功 Y 延时1ms 写44H命令(温度转换命令设置) 写0CCH命令(跳过ROM命令设置) 初始化DS18B20 N 是否成功 Y 写0CCH命令(跳过ROM命令设置) 读取温度值高低位并转化为字符显示 写0BEH命令(读取数据命令设置) 返回 图3-4 DS18B20温度读取流程图
3.4 电机驱动子程序
电机驱动程序使小车实现前进、后退、左转、右转功能。小车驱动电路采用三极管组成的H型电路,因此只要控制三极管的导通截止即可实现小车的控制。通过编译下载测试,小车可实现预先设定的功能。
#include
sbit PWM1=P0^0; //控制引脚定义 sbit PWM2=P0^1; sbit PWM3=P0^2; sbit PWM4=P0^3;
#define go PWM1=1,PWM2=0,PWM3=1,PWM4=0 #define back PWM1=0,PWM2=1,PWM3=0,PWM4=1 #define left PWM1=0,PWM2=1,PWM3=1,PWM4=0 #define right PWM1=1,PWM2=0,PWM3=0,PWM4=1
第21页
基于单片机的红外遥控小车
3.5 速度调整子程序
小车的调速是通过遥控来控制的,可实现加减速等功能,此处采用AT89S52特有的定时器2功能来实现,而且时间可编程。流程图如图3-5所示。
定时器2初始化具体操作如下:
void time2_init(void)//定时器2初始化 {T2MOD=0X00;
// 设为定时器2输出不允许,向上计数溢出中断,自动重装 EXF2=0; //定时器2外部标志位清除 TCLK=0;//
RCLK=0; //不用于波特率发生器
EXEN2=0;// 视T2EX(P1.1)端信号无效 TH2=MSB_reload_value;//设初值 TL2=LSB_reload_value;//
RCAP2H=MSB_reload_value;//设重载值 RCAP2L=LSB_reload_value;// C_T2=0;//设T2为定时模式 CP_RL2=0;//设T2为重载模式 ET2=1; //允许T2计时 TR2=1;//开始计时 }
开始 count0+Y 加速 N 减速 N Y count0>=100 Y N flag=~flag N count0<=0 Y count0-=5 count0=100 Y count0=0 flag==1 Y 正转加减速 返回 反转加减速 图3-5 电机加减速及反转控制流程图
第22页
基于单片机的红外遥控小车
3.6 红外解码子程序
本次设计采用普通电视遥控器,其处理器为TC9012。这种遥控码具有以下特征:采用脉宽调制的串行码,以脉宽为0.565ms低电平、0.56ms高电平、周期为1.125ms的组合表示二进制的“0”;以脉宽为0.565ms低电平、1.685ms高电平、周期为2.25ms的组合表示二进制的“1”。解码的关键是如何识别“0”和“1”,从位的定义我们可以发现“0”、“1”均以0.56ms的低电平开始不同的是高电平的宽度不同,“0”为0.56ms,“1”为1.68ms, 所以必须根据高电平的宽度区别“0”和“1”。如果从0.56ms低电平过后,开始延时,0.56ms以后,若读到的电平为低,说明该位为“0”,反之则为“1”,为了保险起见,延时必须比0.56ms长些,但又不能超过1.12ms,否则如果该位为“0”,读到的已是下一位的高电平,因此取(1.12ms+0.56ms)/2=0.84ms最为可,一般取0.84ms左右即可。具体操作流程如图3-6所示。
开启定时器0、外部中断1 开始
N N 是否产生外部中断1 Y startflag==1 Y count<42&&count>=3N irdata[i]=count count=0,i++ Y N count=0, startflag=1 i=0 i==33 Y irok=1,i=0 返回 图3-6 红外信号接收流程图
红外信号接收完成后,置接收标志为irok=1,通知遥控码值处理函数处理接收到的红外信号,处理完成清接收标志,接收下个信号,并置处理完成标志irpro_ok=1,通知主函数根据遥控键值控制小车。流程图见图3-7所示。
第23页