2.3 单片机开发六步走
本节中,将以一个LED流水灯为例,教你一步一步学习单片机开发,为单片机初学者寻找一条通向成功的“正确之路”“光明之路”。
2.3.1 第一步:硬件电路设计与制作
硬件电路设计是一门大学问,若设计不周,轻则完不成任务,达不到要求,重则可能发生短路、烧毁元件等事故。要想设计一个功能完善、电路简捷的硬件电路,不但要熟悉掌握电子元器件、模拟电路、数字电路等基本知识,还要学会Protel(Altium Designer)软件的使用。
Protel是电子爱好者设计原理图和制作PCB图的首选软件,在国内的普及率很高,几乎所有的电子公司都要用到它。
Protel软件发展很快,主要版本有Protel 99 SE、Protel DXP、Protel DXP 2004,从Protel DXP 2004以后,Protel改名为Altium Designer,主要版本有Altium Designer 6.0、Altium Designer 6.9、Altium Designer 8.3等,目前最新版本为Altium Designer 18。使用Protel(Altium Designer)软件,既可以绘制规范的电路原理图,又可以制作出漂亮的PCB板。对于从事电子工程的技术人员,必须熟练掌握Protel;对于电子爱好者和初学者,如果还不能掌握,也可以使用市场上常见的万用板来代替PCB板。用万用板进行组装的特点是:方法简单,用料便宜,但组装时对焊接和连线有较高的要求。
在本书以后的实验中,基本都采用实验开发板进行学习和实验,也就是说,硬件电路我们已为你设计好了。但如果在实践中进行单片机开发,硬件电路设计与制作是必不可少的步骤,甚至非常重要。
为了方便,我们仍以前面介绍的流水灯为例进行演示,在前面介绍的“低成本单片机开发板2”上(实物图参见图2-5)进行实验,流水灯电路原理图参见图2-1。
2.3.2 第二步:编写程序
想让单片机按你的意思(想法)完成一项任务,必须先编写供其使用的程序,编写单片机的程序应使用该单片机可以识别的“语言”,否则你将是对“机”弹琴。通过前面的学习我们知道,单片机编程语言主要有汇编语言和C语言,这里,我们会选用C语言进行编程。
编写程序时需要软件开发平台,我们选用Keil软件。Keil软件是51单片机实验、开发中应用最为广泛的软件,界面友好,易学易用,在调试程序、软件仿真方面也有很强大的功能。因此,很多开发51应用的工程师或普通的单片机爱好者,都对它十分喜欢。
Keil软件提供了文本编辑处理、编译链接、项目管理、窗口、工具引用和软件仿真调试等多种功能,通过一个集成开发环境(μVision IDE)将这些部分组合在一起。使用Keil软件,可以对汇编语言程序进行汇编,对C语言程序进行编译,对目标模块和库模块进行链接以产生一个目标文件,生成Hex文件,对程序进行调试等。另外,Keil还具有强大的仿真功能,在仿真功能中,有两种仿真模式:软件模拟方式和硬件仿真。在软件模拟方式下,不需要任何51单片机硬件即可完成用户程序仿真调试,极大地提高了用户程序开发效率;在硬件仿真方式下,借助仿真器(仿真芯片),可以实现用户程序的实时在线仿真。
总之,Keil软件功能强大,应用广泛,无论是单片机初学者,还是单片机开发工程师,都必须掌握好、使用好。
下面,我们就开始启动Keil,用C语言编写8位流水灯程序。
1. 先在F盘(其他位置也可以)新建一个文件夹,命名为my_8LED,用来保存8位流水灯程序。点击“Project”菜单,选择下拉式菜单中的“New μVision Project”,弹出文件对话窗口,选择你要保存的路径,在“文件名”中输入你的第一个C程序项目名称,这里我们用“my_8LED”,如图2-10所示。
图2-10 保存文件对话框
保存后的文件扩展名为uvproj,这是Keil项目文件扩展名,以后我们可以直接点击此文件以打开先前做的项目。
2. 点击“保存”后,这时会弹出一个选择器件对话框,要求你选择单片机的型号,你可以根据你使用的单片机来选择。Keil几乎支持所有的51核的单片机,在这里,我们选择AT89S52,如图2-11所示,然后单击【OK】按钮。
图2-11 选择单片机型号对话框
Keil中没有STC89C系列单片机型号,如果你制作的实验开发板采用STC89C52等单片机,仍然可以选用AT89S52。由于STC89C52单片机中的个别寄存器和AT89S52有所不同,因此,在使用这些不同的寄存器,需要在程序中用sfr关键字进行声明。
值得庆幸的是,宏晶科技公司的下载软件,提供了一项功能,可以把STC单片机加载到Keil软件,这为选择和使用STC单片机提供了极大的方便。
加载和使用方法如下。
(1)到宏晶科技公司官网下载STC-ISP软件,打开STC-ISP V6.85软件(其他版本也可以),点击软件右侧的“Keil仿真设置”选项卡。再点击“添加型号和头文件到Keil中,添加STC仿真器驱动到Keil中”按钮,如图2-12所示。点击后,就把STC芯片的型号和仿真程序与Keil软件绑定在一起。这样Keil软件中,就可以选择、使用STC单片机了。
图2-12 Keil仿真设置选项卡
(2)回到Keil软件中,将刚才制作的my_8LED项目删除,再重新加载STC单片机。
点击“Project”菜单,选择下拉式菜单中的“New μVision Project”,弹出文件对话窗口,选择你要保存的路径,在“文件名”中输入“my_8LED”,点击“保存”后,这时会弹出一个选择器件对话框,就会出现STC MCU Database选择对话框,如图2-13所示。这里,我们选择“STC MCU Database”。
图2-13 STC MCU Data base选择对话框
(3)然后,要求你选择单片机的型号,在这里,我们就可以选择STC89C52了,如图2-14所示,然后单击【OK】按钮。
图2-14 选择STC89C52单片机
3. 随后弹出如图2-15所示的对话框,询问是否添加标准的启动代码到你的项目,一般情况下选“否”即可。
图2-15 询问添加启动代码对话框
4. 回到主窗口界面,单击“File”菜单,再在下拉菜单中单击“New”选项,出现文件编辑窗口。此时光标在编辑窗口里闪烁,这时可以键入用户的应用程序了。但建议首先保存该空白的文件,单击菜单上的“File”,在下拉菜单中选中“Save As”,出现文件“另存为”对话框,在“文件名”栏右侧的编辑框中,输入文件名,同时必须输入正确的扩展名。注意,采用C语言编写程序时,扩展名为(.c);用汇编语言编写程序时,扩展名必须为(.asm)。这里选用文件名和扩展名为my_8LED.c,如图2-16所示,然后单击【保存】按钮。
图2-16 保存文件对话框
5. 回到主窗口界面后,单击“Target 1”前面的“+”号,然后在“Source Group 1”上单击右键,在弹出的快捷菜单上,然后单击“Add File to Group ‘Source Group 1’”,出现增加源文件对话框。选中“my_8LED.c”,如图2-17所示。然后单击【Add】按钮。
图2-17 增加源文件对话框
重点提示:单击【Add】按钮后,增加源文件对话框并不消失,等待继续加入其他文件,但不少人员误认为操作没有成功而再次单击【Add】按钮,这时会出现如图2-18所示的警告提示窗口,提示你所选文件已在列表中,此时应点击【确定】,返回前一对话框,然后点击【Close】即可返回主界面。
图2-18 警告提示窗口
6. 单击“Source Group 1”前的加号,此时会发现my_8LED.c文件已加入到其中,如图2-19所示。
图2-19 加入源文件后的窗口
7. 在编辑窗口中输入前面介绍的流水灯的C语言源程序。这个程序的功能就是让P2口的8个LED灯按流水灯的形式进行显示,每个灯显示时间约0.5s,循环往复。输入完毕后,主窗口界面如图2-20所示。
图2-20 输入程序后的主窗口
8. 工程建立好以后,还要对工程进行进一步的设置,以满足要求。
用鼠标右键单击主窗口“Target1”,在出现的快捷菜单中选择“Option for target ‘target1’”,选择“Option for target ‘target1’”后,即出现工程设置对话框。这个对话框共有10多个页面,单击Target,可对Target页中的有关选项进行设置,其中,Xtal后面的数值是晶振频率值,默认值是所选目标CPU的最高可用频率值,该值与最终产生的目标代码无关,仅用于软件模拟调试时显示程序执行时间。正确设置该数值可使显示时间与实际所用时间一致,一般将其设置成与你的硬件所用晶振频率相同,如果没必要了解程序执行的时间,也可以不设。这里,将Xtal设置为11.0592,其他保持默认设置,如图2-21所示。
图2-21 Target页的设置
课外阅读:在Target页中,还有几项设置,简要说明如下。
Memory Model用于设置RAM使用情况,有以下三个选择项。
① Small:所有变量都在单片机的内部RAM中。
② Compact:可以使用一页(256字节)外部扩展RAM。
③ Large:可以使用全部外部的扩展RAM。
Code rom size用于设置ROM空间的使用,同样也有三个选择项。
① Small:只用低于2KB的程序空间。
② Compact:单个函数的代码量不能超过2KB,整个程序可以使用64KB程序空间。
③ Large:可用全部64KB空间。
这些选择项必须根据所用硬件来决定,对于本例,按默认值设置。
Operating项是操作系统选择,Keil提供了两种操作系统:Rtx tiny和Rtx full,通常我们不使用任何操作系统,即使用该项的默认值None。
Off-Chip Code memory用以确定系统扩展ROM的地址范围,Off-Chip xData memory组用于确定系统扩展RAM的地址范围,这些选择项必须根据所用硬件来决定,一般均不需要重新选择,按默认值设置。
9. 单击OutPut页,里面也有多个选择项,其中Creat Hex file用于生成可执行代码文件,其格式为Intel HEX格式,文件的扩展名为.HEX,默认情况下该项未被选中,如果要写片做硬件实验,就必须选中该项,这里我们选择该项。选中该项后,在编译和链接时将产生*.hex代码文件,该文件可用编程器去读取并烧写到单片机中,再用硬件实验板看到实验结果。最后设置的情况如图2-22所示。
图2-22 OutPut页的设置
10. 单击Debug页,该页用于设置调试器。Keil提供了两种工作模式,即Use Simulator(软件模拟仿真)和Use(硬件仿真)。Use Simulator是将Keil设置成软件模拟仿真模式,在此模式下不需要实际的目标硬件就可以模拟51单片机的很多功能,这是一个非常实用的功能。Use是硬件仿真选项,当进行硬件仿真时,应选中此项,另外,还从右侧的下拉框中选择所用的硬件仿真器,例如,STC Monitor-51 Driver(STC单片机仿真器),如图2-23所示。
图2-23 Debug页
需要说明的是,如果你安装的Keil软件没有加载STC单片机型号及仿真器,在下拉框中不会出现STC Monitor-51 Driver选项。如果要使用STC仿真器,必须打开STC-ISP软件,点击软件右侧的“Keil仿真设置”选项卡进行加载(具体方法参见前面介绍的内容)。
以上工程设置对话框中的其他选项页与C51编译器、A51汇编器、BL51连接器等用法有关,这里均取默认值,不做任何修改。设置完成后,单击【OK】按钮进行确认。
2.3.3 第三步:编译程序
以上编写的8位流水灯程序是提供给我们看的,在学完C语言后我们完全可以看懂,但是,单片机可看不懂,它只认识由0和1组成的机器码。因此,这个程序还必须进行编译,将程序“翻译”成单片机可以“看懂”的机器码。
要将编写的源程序转变成单片机可以执行的机器码过程叫编译。用于51单片机的编译软件较多,其中Keil软件最为优秀,通过Keil对源程序进行汇编,可以产生目标代码,生成单片机可以“看懂”的.hex(十六进制)或.bin(二进制)目标文件,用编程器烧写到单片机中,单片机就可以按照我们的意愿工作了。
用Keil对8位流水灯程序编译的方法如下。
在Keil主窗口左上方,有三个和编译有关的按钮。
这三个按钮的作用有所不同,左边的是编译按钮,不对文件进行链接;中间的是编译链接按钮,用于对当前工程进行链接,如果当前文件已修改,软件会对该文件进行编译,然后再链接以产生目标代码;右边的是重新编译按钮,每点击一次均会再次编译链接一次,不管程序是否有改动,确保最终产生的目标代码是最新的。这三个按钮也可以在“project”菜单中找到。
这个项目只有一个文件,你按这三个按钮中的任何一个都可以编译。这里,为了产生目标代码,我们选择按中间的编译链接按钮或右边的重新编译按钮。在下面的“Build output”窗口中可以看到编译后的有关信息,如图2-24所示。提示获得了名为“my_8LED.hex”的目标代码文件。编译完成后,打开my_8LED文件夹,会发现,文件夹里多出了一个my_8LED.hex文件。
图2-24 编译后的有关信息
如果源程序有语法错误,会有错误报告出现,用户应根据提示信息,更正程序中出现的错误,重新编译,直至正确为止。
2.3.4 第四步:仿真调试
程序编译通过后,只是说明源程序没有语法错误,至于源程序中存在的其他错误,往往还需要通过反复的仿真调试才能发现。所谓仿真即是对目标样机进行排错、调试和检查,一般分为硬件仿真和软件仿真两种,下面分别进行说明。
1. 硬件仿真
硬件仿真是通过仿真器与用户目标板进行实时在线仿真。一块用户目标板包括单片机部分及外围接口电路部分,例如,我们在前面设计的8位流水灯电路,单片机部分由STC89C52最小系统组成,外围接口电路则由8位发光二极管及限流电阻组成。硬件仿真就是利用仿真器来代替用户目标板的单片机部分,由仿真器向用户目标板的接口电路部分提供各种信号、数据进行测试、调试的方法。这种仿真可以通过单步执行、连续执行等多种方式来运行程序,并能观察到单片机内部的变化,便于修改程序中的错误。
如果你手头上有实验开发板,只需要取下单片机,将硬件仿真接板插到活动插座上,然后再将开发板和计算机连接起来,即可以进行硬件仿真了。有关硬件仿真的详细内容,本书不打算进行详细的介绍,感兴趣的读者可以到宏晶科技公司官网参阅相关文章进行学习。
对于初学者,实际编程时,所写的程序一般不太复杂,加之STC单片机下载程序十分方便,因此,可以采用下载的方法进行编程。方法是:直接将程序下载到单片机中进行观察,如果与实验不符,再修改、再下载,直到符合要求为止。因此,初学者可以跳过硬件仿真这一步。
2. 软件仿真
在Keil软件中,内建了一个仿真CPU,可用来模拟执行程序,该仿真CPU功能强大,可以在没有用户目标板和硬件仿真器的情况下进行程序的模拟调试,这就是软件仿真。
软件仿真不需要硬件,简单易行。不过,软件仿真毕竟只是模拟,与真实的硬件执行程序还是有区别的,其中最明显的就是时序。软件仿真是不可能和真实的硬件具有相同的时序的,具体的表现就是程序执行的速度和各人使用的计算机有关,计算机性能越好,运行速度越快。
如果读者没有制作实验开发板,也没有仿真器,可以采用软件仿真的方法进行模拟,具体方法如下。
(1)单击菜单“Project→Option for target ‘target1’”,出现工程设置对话框,在Debug 页中,选择Use Simulator,即设置Keil为软件仿真状态。
(2)按Ctrl+F5,进入仿真状态,再按菜单Peripherals→I/O Ports→Port2,打开Port2观察窗口,如图2-25所示。
图2-25 Port2调试窗口
图中,框内打“√”者为高电平,未打“√”者为低电平。按F5全速运行,会发现窗口中的“√”在Port2调试窗口中不停地闪动,不能看到具体的效果,这时我们可以采用过程单步执行的方法进行调试,不停地按动工具栏上的按钮(Step Over),可以看到Port2调试窗口中未打“√”的小框(表示低电平)不停地右移。也就是说,Port2调试窗口模拟了P2口的电平状态。
2.3.5 第五步:烧写程序
仿真调试通过后,用STC89C系列单片机下载软件STC-ISP将my_8LED.hex代码文件下载到实验板STC89C52中,就可以欣赏到你的第一个“产品”了。烧写程序的步骤如下。
(1)将USB线一端接PC USB口,另一端接开发板USB口(这里选用前面介绍的低成本单片机开发板2)。
(2)安装USB转串口芯片CH340芯片驱动程序(如果你的计算机是Windows 10操作系统,无须安装CH340驱动,可自动识别),安装完成之后,PC会提示发现新硬件,同时会建立一个虚拟的串口号,这个串口号可在PC的设备管理器上查看,这时会看到“USBSERIAL CH340(COM3)”一栏,这就是开发板上CH340的虚拟串口(COM3),如图2-26所示。
图2-26 USB转串口线虚拟的串口号
注意,对于不同的计算机,这个虚拟的串口号可能有所不同。
(3)了解到这个串口号后,打开STC下载软件,在“串口选择”一栏中选择相应的串口号(这里选择COM3),在单片机型号一栏中,选择STC89C52(开发板上插座上安装的是此单片机),如图2-27所示。
图2-27 选择串口号和单片机型号
(4)单击窗口中的“打开程序文件”按钮,打开需要写入的十六进制文件,这里选择8路流水灯文件my_8LED.hex。单击窗口中的“下载/编程”按钮,此时在下载软件文本框中显示“正在检测目标单片机”,此时,给开发板通电,开始下载程序,下载完成后,出现“下载OK、校验OK、已加密”等信息,如图2-28所示。此时,会发现开发板上的8个LED发光管循环点亮。
图2-28 下载完成
2.3.6 第六步:脱机运行检查
你不可能一次完美无缺地将源程序写好,这就需要反复修改源程序,反复编译、仿真、烧写到单片机中,反复将单片机装到电路中去实验,针对硬件或软件出现的问题进行修改,逐步进行完善。确认硬件电路没有问题,确认程序没有“臭虫”后,整个实验开发过程也就结束了。
以上描述是以制作一个8位流水灯为例,全面介绍了单片机实验开发的全过程,包括硬件电路设计与制作、编写程序、编译程序、仿真调试、烧写程序、脱机运行检查六个步骤,在本书的后续章节中,仿真调试我们一般省略跳过,但其他五个步骤是必需的。