软件设计调试结论范例.docx
- 文档编号:6748028
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:15
- 大小:279.18KB
软件设计调试结论范例.docx
《软件设计调试结论范例.docx》由会员分享,可在线阅读,更多相关《软件设计调试结论范例.docx(15页珍藏版)》请在冰点文库上搜索。
软件设计调试结论范例
4软件设计
4.1主程序设计
软件设计主要包括主程序,键盘扫描程序,电机驱动程序,LCD显示程序,首先选择小车运行速度,使小车前进,然后红外传感器GP2D12交互式检测路上的障碍物,把反馈到的信号送单片机。
无障碍物时,单片机按照预定的速度控制小车行驶;有障碍物时,蜂鸣器发声,小车右转,如此循环往复,采用LCD实时显示小车行驶的状态总体流程图如图4.1所示。
图4.1主程序流程图
4.2键盘软件设计
本设计实验采用4×4键盘,选择P0口来分时控制键盘的行和列键盘扫描程序流程如图4.2所示。
程序中,使用低电平扫描,低电平扫描是将键盘公共点连接VCC,在没有任何按键按下时,P0低4位能始终保持为高电平,送入扫描信号中只有一个为低电平,其余为高电平。
图4.2键盘扫描流程图
其中判断键值子函数如下:
intGetkey()
{charcol,row;//行列
charscan,keyin,kcode;//扫描信号列按键值扫描码
scan=0xef;
for(col=0;col<4;col++)//开始行扫描
{P0=scan;
keyin=rowkey();
if(keyin!
=0)//有键按下
{for(row=0;row<4;row++)
{if(keyin==(0x01< {kcode=row+4*col;//计算出键码 break; } } while(rowkey()! =0); debouncer();//防抖动函数 } scan=(scan<<1)|0x01;//产生左移一位扫描信号 } return(kcode); } rowkey()为(~P0)&0x0f,也就是将P0读入的按键状态反向,再与0x0f进行AND运算,其目的是屏蔽高4位(使之为0),而低4位(按键状态)保持原状。 在"if(keyin==(0x01< 若输入的按键状态与0x01左移row位的状态一样,表示该列的按键被按下。 "kcode=row+4*col"指令是将当时扫描的列值(row),加上4倍的行(col)值,作为定位按键的方法。 "scan=(scan<<1)|0x01"指令是将扫描码左移一位,而其最右边填入1.例如原本扫描码为"11111110",左移一位变成"11111100",再与0x01进行OR运算,就变成"11111101"。 4.3中断程序设计 中断是暂时放下目前所执行的程序,先去执行特定的程序(即中断子程序),待完成特定的程序后,再返回执行刚才放下的程序。 因为键盘扫描常以中断的形式出现。 8051提供5个中断服务,即外部中断INT0,外部中断INT1,定时器/计数器中断TF0,定时器/计数器中断TF1与串行口中断UART(RI/TI).中断常用到3个寄存器: 中断启用寄存器IE: 开闭中断功能的开关,可位寻址的8位寄存器。 中断优先级寄存器IP: 判断各中断优先级的开关,可位寻址的8位寄存器。 定时器/计数器控制寄存器TCON: 是一个8位的可位寻址寄存器,其中IT0,IT1两位分别为INT0,INT1的采样信号设置位。 若要采用负边缘触发信号,则可将它设定为1;若要采用低电平动作信号,则可将它设定为0. 中断的应用包括中断向量的设置以及中断子程序的编写。 (1)中断设定: 中断的设定包括开启中断开关(即IE寄存器的设定),中断优先级的设定(即IP寄存器的设定),中断信号的设定(即TCON寄存器的设定)。 我们可以在程序中直接设定IE寄存器,IP寄存器及TCON寄存器,例如要开启“总开关”,“INT0”开关,可以使用以下命令: IE=0x80;//启用INT0中断 其中0x80就是10000001,相当于把IE寄存器中的EA与EX0设定为1.同理,若要开启“总开关”,“INT0开关”及“INT1开关”,我们可以使用下面的命令: IE=0x85;//启用INT0,INT1中断 对于中断优先级的设定,也使用类似的命令,只是操作的对象为IP寄存器,例如要提高INT1的优先级,可以使用以下命令: IP=0x04;//设定INT1中断具最高优先级 而外部中断信号的种类,可在TCON寄存器里设定,例如INT1中断采用负边缘触发方式,可以使用以下命令: TCON=0x08;//设定INT1采用负边缘触发 (2)中断子程序; 中断子程序是一种特殊的子程序(函数),其第一行的格式如下: void中断子程序名称(void)interrupt中断编号using寄存器组 例如要定义一个INT1(其中断编号为2)的中断子程序,其名称定义为“song”,而在该中断子程序中使用RB1寄存器组,则应作如下声明: voidsong(void)interrupt2using1//INT1的中断子程序,使用RB1 接着可以编写此中断子程序的内容。 4.4LCD显示程序设计 LCD指令说明: 由于MCU可以直接访问模块内部的IR和DR,作为缓冲区域,IR和DR在模块进行内部操作之前,可以暂存来自MPU的控制信息.这样就给用户在MPU和外围控制设备的选择上,增加了余地.模块的内部操作由来自MPU的RS,R/W,E以及数据信号DB0-DB7决定,这些信号的组合形成了模块的指令. 4.4.1LCD控制指令 LCD常用指令如下表4.1. 表4.1LCD控制指令 功能 控制线总线 RSR/WDB7DB6DB5DB4DB3DB2DB1DB0 清除显示屏 0000000001 清除显示屏,并把光标移至左上角 光标归位 000000001× 光标移至左上角,显示内容不变 设定输入模式 00000001I/DS I/D=1: 地址递增,I/D=0: 地址递减 S=1: 开启显示屏,S=0: 关闭显示屏 开关显示屏 0000000DCB D=1开启显示屏,D=0关闭显示屏 C=1开启光标,C=0关闭光标 B=1光标所在位置的字符闪烁,B=0光标所在位置的字符不闪烁 移位方式 000001S/CR/L×× S/C=1显示屏移位,S/C=0光标右移 R/L=1向右移,R/L=0向左移 功能设定 00001DL×RE×× DL=1数据长度为8位,DL=0数据长度为4位 RE=1采用扩展指令,RE=0采用一般指令 CGRAM寻址 0001CGRAM地址 将所要操作的CGRAM地址放入地址计数器 DDRAM寻址 001DDRAM地址 将所要操作的DDRAM地址放入地址计数器 读取BF与AC 01BF地址计数器内容 读取地址计数器,并查询LCM是否忙碌 BF=1表示LCM忙碌,BF=0表示LCM可接受指令或数据 写入数据 10所要写入的数据 将数据写入内部存储器(GDRAM,IRAM,CGRAM,DDRAM) 读取数据 11所要读取的数据 读取内部存储器(GDRAM,IRAM,CGRAM,DDRAM) 4.4.2LCD程序设计 LCD流程图: 图4.3LCD显示流程 LCD常用函数: LCD初始化: voidinit_LCM(void) { write_inst(0x30);//设定功能 write_inst(0x38);//设定两列 write_inst(0x08);//关闭显示 write_inst(0x01);//清除显示屏 write_inst(0x06);//设定输入模式 write_inst(0x0e);//开启显示 } 程序主要作用是清空显示屏,确定8位数据传输模式。 "write_inst(0x01)"指令作用为清空显示屏,并将光标移至左上角。 "write_inst(0x30)"指令为功能设定指令,使DL=1,即数据长度为8位。 写入指令: voidwrite_inst(charinst) { RS=0;RW=0;//写入指令模式 en=1;//启用 LCDP=inst;//写入指令 en=0; check_BF();//检查忙碌 } 写入数据: voidwrite_char(charcharacter) { RS=1;RW=0;//写入数据模式 en=1;//启用 LCDP=character;//写入字符 en=0; check_BF();//检查忙碌 } 写入指令与写入数据是LCD很常用的操作,将其写成子函数,可以使整个程序更加简洁。 本论文设计经常使用这两个函数进行写入指定位置操作。 4.5A/D转换程序设计 charADC_Read() {charresult; ADC_Start();//开始转换子函数 delay(100); ADC_CS=0;//选通 delay (1); ADC_RD=0;//允许读取数据锁存器 delay (1); result=ADC_DATA; delay (1); ADC_RD=1;//关允许 delay (1); ADC_CS=1;//关使能 returnresult; } 程序中,是通过子函数ADC_Start先将CS与RD接入低电平,开启ADC0804,将数模转换后数据存入锁存器。 "ADC_CS=1""ADC_RD=1"是打开数据锁存器,将数据送出。 4.6直流电机运行程序设计 本系统以单片机的P2口来控制小车左右两个直流电机,要求达到目标: 电机有良好的驱动特性,可正、反转动,且转动平稳、有力。 电机驱动程序流程如图4.4所示。 图4.4直流电机控制流程图 电机前进: voidforward(charon) {inti; for(i=0;i<10;i++) { en1=1;en2=2;//使能左右马达 on11=1;on12=0;on21=1;on22=0;//左右马达正向旋转 delay(on);//开延时 on11=0;on12=0;on21=0;on22=0;//左右马达停止 delay(100-on);//关延时,形成PWM控速 } } 电机右转: voidback(charon) {inti; for(i=0;i<10;i++) { en1=1;en2=1;//使能 on11=1;on12=0;on21=0;on22=0;//左马达继续,右马达停止 delay(on);//开延时 on11=0;on12=0;on21=0;on22=0;//左右马达停止 delay(100-on);//关延时,形成PWM控速 } } 程序中通过"on"来进行PWM控速,例如on=20时,PWM信号占空比为1: 4,电机转速较慢;on=50时,占空比为1: 1,电机转速较快。 "en1=1;en2=1"指令是将左右两个电机开启,如此就能通过控制on11,on12,on21,on22来使马达前进,左转,右转,后退。 on11,on12,on21,on22是控制马达转向的2对端口, "on11=1;on12=0;on21=1;on22=0"指令使左右马达均正向前进, "on11=1;on12=0;on21=0;on22=0"指令使左马达继续前进,右马达停止,实现右转。 同理,若要使左右马达后退,则使用指令 "on11=0;on12=1;on21=0;on22=1"。 5系统调试 5.1Keil编程软件介绍 KeilC51µVision3集成开发环境是KeilSoftware,Inc/KeilElektronikGmbH开发的基于80C51内核的微处理器软件开发平台,内嵌多种符合当前工业标准的开发工具,可以完成从工程建立到管理、编译、链接、目标代码的生成、软件仿真、硬件仿真等完整的开发流程尤其是C编译工具在产生代码的准确性和效率方面达到了较高的水平,而且可以附加灵活的控制选项,在开发大型项目时非常理想。 KeilC51集成开发环境的主要功能有以下几点: ●µVision3forWindows: 是一个集成开发环境,它将项目管理、源代码编辑和程序调试等组合在一个功能强大的环境中; ●C51国际际准化C交叉编译器: 从C源代码产生可重定位的目标模块; ●A51宏汇编器: 从80C51汇编源代码产生可重定位的目标模块; ●BL51链接器/定位器: 组合由C51和A51产生的可重定位的目标模块,生成绝对目标模块; ●LIB51库管理器: 从目标模块生成连接器可以使用的库文件; ●OH51目标文件至HEX格式的转换器,从绝对目标模块生成IntelHEX文件; ●RTX-51实时操作系统: 简化了复杂的实时应用软件项目的设计。 这个工具套件是为专业软件开发人员设计的,但任何层次的编程人员都可以使用,并获得80C51单片机的绝大部分应用。 KeilSoftware提供了一流的80C51系列开发工具软件,下面描述每个套件及其内容: (1)PK51专业开发套件。 PK51专业开发套件提供了所有工具,适合专业开发人员建立和调试80C51系列微控制器的复杂嵌入式应用程序。 专业开发套件可针对80C51及其所有派生系列进行配置使用。 (2)DK51开发套件。 DK51开发套件是PK51的精简版,它不包括RTX51Tiny实时操作系统。 开发套件可针对80C51及其所以派生系列进行配置使用。 (3)CA51编译器套件。 如果开发者只需要一个C编译器而不需要调试系统,则CA51编译器套件就是最好的选择。 CA51编译器套件只包含µVision2IDE集成开发环境,CA51不提供µVision2调试器的功能。 这个套件包括了要建立嵌入式应用的所有工具软件,可针对80C51及其所有派生系列进行配置使用。 (4)A51汇编器套件。 A51汇编器套件包括一个汇编器和创建嵌入式应用所需要的所有工具。 它可针对80C51及其所有派生系列进行配置使用。 (5)RTX51实时操作系统(FR51)。 RTX51实时操作系统是80C51系列微控制器的一个实时内核。 RTX51Full提供RTX51Tiny的所以功能和一些扩展功能,并且包括CAN通信协议接口子程序。 1、建立工程文件 在项目开发中,并不是仅有一个源程序就行了,还要为这个项目选择CPU(Keil支持数百种CPU,而这些CPU的特性并不完全相同),确定编译、汇编、连接的参数,指定调试的方式,有一些项目还会有多个文件组成等,为管理和使用方便,Keil使用工程(Project)这一概念,将这些参数设置和所需的所有文件都加在一个工程中,只能对工程而不能对单一的源程序进行编译(汇编)和连接等操作,下面我们就一步一步地来建立工程。 点击菜单栏中“Project”选项,在其下拉菜单中选择“NewProject”并选择“uversion3”,此时会出现一个对话框,在编缉框中输入一个名字以新建一个工程,无需扩展名。 在点击“保存”按钮之后,将再次出现一个对话框,这个对话框要求选择目标CPU(即你所用芯片的型号),Keil支持的CPU类型很多,我们选择Atmel公司89C52芯片。 点击ATMEL前的“+”号,展开该层,选中其中的89C52,选定型号之后,点击“确定”按钮,回到主界面,此时,在工程窗口的文件页中,出现了“Target1”。 然后新建一个文件,将源程序输入文件中,在程序输入完毕之后,点击菜单栏中“保存”选项,然后在弹出的对话框中输入文件名,并保存为“.c”格式文件。 点击“target1”前面的“+”,弹出下一层的“SourceGroup1”,选择“SourceGroup1”并点击鼠标选项,在弹出的选项菜单中选择“AddfiletoGroup“SourceGroup1”,这时将弹出一个对话框,在这个对话框中选择之前保存的文件,双击之后则将该文件添加到了工程之中(注意,在文件加入项目后,该对话框并不消失,等待继续加入其它文件)。 但初学时常会误认为操作没有成功而再次双击同一文件,这时会出现的对话框,提示你所选文件已在列表中,此时应点击“确定”,返回前一对话框,然后点击“Close”即可返回主界面,返回后,点击“SourceGroup1”前的加号,会发现exam1.asm文件已在其中。 双击文件名,即打开该源程序。 2、工程的详细设置 工程建立好以后,还需要对工程进行进一步的设置才能满足要求。 选择Project窗口的Target1,然后在引出的选项框中选择“Optionfortarget‘target1’”即出现对工程设置的对话框。 这个设置对话框很复杂,共有8个页面,但绝大部分只需取默认值就行。 在设置对话框中的“Target”设置界面中,Xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高可用频率值,AT89C52的最高频率是24MHz,该数值不会影响最终代码,只用于软件模拟调试过程。 一般将其设置成与硬件所用晶振频率相同,以使显示时间与实际所用时间一致。 这里设置为12.0。 设置对话框中的OutPut页面中也有多个选择项,其中的CreatHexfile选项用于生成可执行代码文件(可以用编程器写入单片机芯片的HEX格式文件,文件的扩展名为.HEX),默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项,这一点是初学者易疏忽的,在此特别提醒注意。 选中Debuginformation将会产生调试信息,这些信息用于调试,如果需要对程序进行调试,应当选中该项。 Browseinformation是产生浏览信息,该信息可以用菜单view->Browse来查看,这里取默认值。 按钮“SelectFolderforobjects”是用来选择最终的目标文件所在的文件夹,默认是与工程文件在同一个文件夹中。 在NameofExecutable后的文本框用于输入目标文件名,默认与工程同名,这项一般不需要更改。 对于工程设置对话框中的其它页面选项,均取默认值,不作修改。 以下仅对一些有关页面中常用的选项作一个简单介绍。 Listing标签页用于调整生成的列表文件选项。 在汇编或编译完成后将产生(*.lst)的列表文件,在连接完成后也将产生(*.m51)的列表文件,该页用于对列表文件的内容和形式进行细致的调节,其中比较常用的选项是“CCompileListing”下的“AssambleCode”项,选中该项可以在列表文件中生成C语言源程序所对应的汇编代码。 设置完成后点击确认按钮,返回主界面,此时工程文件建立、设置完毕。 5.2程序下载过程 将Keil编辑好的文件生成2进制文件或者16进制文件以后,我们必须把它下载到单片机里面,然后才能在实验板上看到我们预想的效果。 程序下载步骤: 1、插入下载线至USB口,弹出硬件安装对话框; 2、手动找到驱动“USBasp”位置,点击“安装”。 使用avr_fighter下载程序。 该程序专门为STC芯片下载使用,支持所以兼容引脚的STC芯片,需要硬件设备,9针串口线或者USB转串口线。 STC单片机烧写程序步骤: (1)打开STC下载软件,界面如图5.1所示 图5.1下载软件界面 (2)选择单片机的型号为STC89C52RC,然后点击“打开文件”打开选择对话框,在弹出的对话框中双击要所要下载是芯片中的“.hex”文件。 如图5.5所示。 (3)选择COM口,然后点击下载文件,当出现滴答声后,说明已经连接上。 然后给单片机接上电。 等待大约3秒钟之后程序就进入单片机内部了。 图5.2下载软件界面 5.3运行效果 在无外界干预条件下,小车实现了运行及避碰功能,LCD正常显示状态参数,蜂鸣器等正常运行。 避碰车硬件连接如图5.6所示,实现避碰效果如图5.7所示. + 图5.6硬件连接图 图5.7避碰效果 结论 本系统设计的基于单片机的自动避碰车应用了AT89C52单片机、GP2D12红外传感器和LM298电机驱动等器件完成了距离检测、小车转向、电机驱动、状态显示以及报警等功能。 由于电路模块化,所以使用起来比较方便。 本次设计完成并实现了预期的效果,其中实现的功能包括以下几个方面: 1、距离测量与避障,距离检测与转向是整个系统的关键部分,检车的距离数据经过AD转换器在电路搭接正确的前提下,配以控制命令,实现了预期的避障效果。 2、LM298电机驱动部分,这个部分包含测距及其显示,两个电机的转速会随着被测物的距离的变化而变化,当距离小于20厘米时,小车转向躲避障碍。 3实现了显示功能,当正常运行时LCD显示占空比,但遇到障碍物时显示turnningright,蜂鸣器响。 本次设计中,虽然系统运行正常,主体目标得以实现,但有些设计功能因为时间和技术水平上欠缺等等原因未获得理想的效果,希望在日后的学习时间中加以完善。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 调试 结论 范例