基于单片机的应用系统开发
本章主要讲解单片机的设备(STC89C52RC)、开发环境(Keil μVision 4、烧录软件STC-ISP),并为读者提供5个实验案例,从简单的流水灯、呼吸灯和数码管显示,逐步扩展到在LCD12864液晶显示字符串以及利用时钟芯片DS1302显示日期。通过对案例的练习,让读者更好地去理解单片机的工作原理,提高程序代码编写能力,进而了解怎样利用单片机去实现从物理世界到计算机世界的转换,例如按键的检测、温度的转换、时间和字符串的显示等内容。
3.1 单片机简述
目前,各个领域都有单片机的踪迹,不只是手机、计算机、玩具、冰箱、空调、电磁炉等和我们生活息息相关的物件,也包括汽车、机器人、飞机、导弹导航装备等高科技设备,这些设备都包含一个或多个单片机。可以说,我们每天用到的电子设备基本都有单片机的存在。如果读者想成为一名硬件工程师,单片机的学习是了解计算机原理和结构的最佳选择。
一台计算机需要由CPU、RAM、ROM、输入/输出设备等部件构成,这些部件被分成多个芯片并安装在主板上。单片机将这些部件集中安装到一块集成电路芯片上,具有体积小、质量轻、价格便宜的特点,为学习、应用和开发提供了便利条件。
单片机是一种控制芯片,它是一个微型计算机。如果在单片机的基础上添加了晶振、存储器、锁存器、逻辑门、译码器、按钮等部件就组成了单片机系统。一般的单片机有40脚封装,也有一些功能强大的单片机有更多引脚,如68引脚,早期的单片机也有10个或者20个引脚。一般主流的单片机包括CPU、4KB容量的RAM、128 KB容量的ROM、 2个16位定时/计数器、4个8位并行口、全双工串行口、ADC/DAC、SPI、I2C、ISP、IAP。
单片机支持汇编编程和C51编程,两种编程方法各有利弊。汇编编程使用传统的汇编代码,具有代码精简、占用资源少、运行效率高的优点,然而可读性不强、不易移植;C51编程使用专用的C语言编程,C语言具有模块化管理编程方便、可移植性强、适合编写大程序等优点,缺点是占用资源较多,执行效率没有汇编高。本书采用Keil c51进行编程。
3.2 认识STC89C52RC单片机
STC89C52RC单片机是宏晶科技有限公司推出的一种具有高速、低功耗、超强抗干扰特点的小型单片机,其程序的电可擦写特性,使得开发与实验比较容易,为很多嵌入式控制系统提供了一种高性价比的方案。
3.2.1 STC89C52RC单片机的特点
(1)它是增强型的8051单片机,可以任意选择6时钟/机器周期和12时钟/机器周期,指令系统和引脚上完全兼容MCS-51系列的单片机。
(2)工作电压范围:3.8~2.0V(3V单片机)/5.5~3.3V(5V单片机)。
(3)工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可 达48MHz。
(4)用户应用程序空间:8KB。
(5)片上集成RAM:512B。
(6)通用I/O口(32个),复位后为:P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
(7)ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(输入口RXD /P3.0,输出口TXD /P3.1)直接下载用户程序。
(8)具有EEPROM(带电可擦写可编程只读存储器)和看门狗功能。
(9)具有3个16位定时器/计数器。即定时器T0、T1、T2。
3.2.2 STC89C52RC工作模式
(1)掉电模式:典型功耗<0.1μA;可由外部中断唤醒,中断返回后,再继续执行原程序。
(2)空闲模式:典型功耗2mA。
(3)正常工作模式:典型功耗4~7mA。
3.2.3 STC89C52RC引脚图
如图3-1所示,具体功能说明如下。
图3-1 STC89C52RC引脚图
(1)VCC(40引脚):电源电压。
(2)GND(20引脚):接地。
(3)P0端口(P0.0~P0.7,39~32引脚):P0端口是一个漏极开路的8位双向I/O口。作为输出端口,每个引脚能驱动8个TTL负载,对端口P0写入“1”时,可以作为高阻抗输入。在访问外部程序和数据存储器时,P0口也可提供低8位地址和8位数据的复用总线,P0端口内部上拉电阻有效。在Flash ROM编程时,P0端口接收指令字节,而在校验程序时,则输出指令字节,注意在验证时,需外接上拉电阻。
(4)P1端口(P1.0~P1.7,1~8引脚):P1端口是一个带内部上拉电阻的8位双向I/O口。P1端口的输出缓冲器可驱动(吸收或者输出电流方式)4个TTL输入。P1端口用作输入口使用时,端口写入1,通过内部的上拉电阻把端口拉到高电位,这样被外部拉低的引脚会输出一个电流。在对Flash ROM编程和程序校验时,P1端口接收低8位地址。此外,P1.0和P1.1还可以作为定时器/计数器2的外部技术输入(P1.0/T2)和定时器/计数器2的触发输入(P1.1/T2EX),具体功能如表3-1所示。
表3-1 P1.0和P1.1引脚复用功能
引脚号
功 能 特 性
P1.0
T2(定时器/计数器2外部计数输入),时钟输出
P1.1
T2EX(定时器/计数器2捕获/重装触发和方向控制)
(5)P2端口(P2.0~P2.7,21~28引脚):P2端口是一个带内部上拉电阻的8位双向I/O端口。P2端口的输出缓冲器可以驱动(吸收或输出电流方式)4个TTL输入。P2端口用作输入口时,端口写入1时,通过内部的上拉电阻把端口拉到高电平,被外部信号拉低的引脚会输出一个电流。在对Flash ROM编程和程序校验期间,P2端口可以接收高位地址和一些控制信号。
(6)P3端口(P3.0~P3.7,10~17引脚):和P2端口类似,P3端口也是一个带内部上拉电阻的8位双向I/O端口。P3端口的输出缓冲器可驱动(吸收或输出电流方式)4个TTL输入。P3端口作为输入口使用时,对端口写入1,通过内部的上拉电阻把端口拉到高电位,因此那些被外部信号拉低的引脚会输入一个电流。在对Flash ROM编程或程序校验时,P3端口会接收一些控制信号。P3端口除作为一般I/O口外,还有其他一些复用功能,如表3-2所示。
表3-2 P3端口引脚复用功能
引脚号
复 用 功 能
P3.0
RXD(串行输入口)
P3.1
TXD(串行输出口)
P3.2
(外部中断0输入)
P3.3
(外部中断1输入)
P3.4
T0(定时器0的外部计数输入)
P3.5
T1(定时器1的外部计数输入)
P3.6
(外部数据存储器写选通输出)
P3.7
(外部数据存储器读选通输出)
(7)RST(9引脚):复位输入。当输入连续两个机器周期以上的高电平时有效,用来完成单片机的复位初始化操作。看门狗计时完成后,RST引脚输出96个晶振周期的高电平。特殊寄存器AUXR上的DISRTO位可以使此功能无效。DISRTO默认状态下,复位高电平是有效的。
(8)ALE/(30引脚):ALE(地址锁存控制信号)是访问外部程序存储器时,锁存低8位地址的输出脉冲。在Flash编程时,引脚也用作编程输入脉冲。一般情况下,ALE以晶振六分之一的固定频率输出脉冲,可用来作为外部定时器或时钟使用。然而,需要注意的是,每次访问外部数据存储器时,ALE脉冲将会跳过。可以通过将ALE使能标志位(地址位8EH的SFR的第0位)置为“1”,ALE操作将会无效,置“1”后,ALE仅在执行MOVX或MOV指令时有效,否则ALE将被拉高。
(9)(29引脚):是外部程序存储器选通信号。当AT89C51RC从外部程序存储器执行外部代码时,在每个机器周期被激活两次,而访问外部数据存储器时,将不被激活。
(10)/VPP(31引脚):是访问外部程序存储器控制信号。为使能从0000H到FFFFH的外部程序存储器读取指令,需接GND。加密方式为1时,将内部锁定位RESET,如需执行内部程序指令,需接VCC。在Flash编程期间,也接收12V的VPP电压。
(11)XTAL1(19引脚):振荡器反相放大器和内部时钟发生电路的输入端。
(12)XTAL2(18引脚):振荡器反相放大器的输入端。
3.3 开发工具——Keil μVision 4
Keil μVision是美国Keil Software公司出品的MCS51架构兼容单片机C语言软件开发环境,它集编辑、编译、仿真等于一体,其界面和常用的微软VC++的界面相似,界面友好,易学易用,具有强大的软件仿真功能。Keil 提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案。使用汇编语言或C语言需要使用编译器,以便把写好的程序编译为机器码,才能把HEX可执行文件写入单片机内。Keil μVision是众多单片机应用开发软件中最优秀的软件之一,很多开发MCS51系列单片机应用的工程师或普通单片机爱好者,都在使用Keil μVision完成开发工作。
3.3.1 安装
(1)运行安装程序,如图3-2所示。
图3-2 运行安装Keil程序
(2)按照提示,完成安装过程,如图3-3所示。
(3)完成安装,出现如图3-4所示图标即表示安装完成。
图3-3 Keil安装过程 图3-4 完成Keil安装
3.3.2 如何创建一个项目
使用Keil软件新建一个项目并编译运行生成HEX文件。
(1)启动Keil软件,双击图标,运行?Vision。
(2)创建一个工程文件。在菜单栏里单击Project→New ?Vision Project菜单项,如图3-5所示,将打开一个对话框,如图3-6所示,输入文件名即可成功创建一个新的工程,?Vision将会创建一个以*.uvproj为名字的新工程文件。建议每个工程都使用独立的文件夹。工程文件创建后,从设备数据库中选择一个CPU芯片(一般用的是Atmel的AT89C51或AT89C2051,本书选择AT89C52微控制器),如图3-7所示。
图3-5 创建工程文件截图
图3-6 新建工程文件对话框截图
图3-7 选择CPU芯片截图
(3)创建成功一个工程后,?Vision会给所选择的CPU芯片添加合适的启动代码,单击“是”按钮,完成新建项目,如图3-8所示。
图3-8 添加启动代码截图
(4)创建一个新的源文件,并将源文件加载到新建的工程中。通过单击File→New菜单项可以创建一个新的源文件,这时会打开一个空的文本编辑窗口,输入相应代码,通过File→Save As可以保存为.c文件。源文件创建好后,需要将此文件添加到工程中,通过右击Project Workspace→Files页中的文件组,然后在弹出的菜单中选择Add Files to Group菜单项,将打开文件对话框,选择已创建好的*.c源文件,就完成了源文件的添加,如图3-9所示。
图3-9 添加源文件到项目中截图
(5)第一次使用时,需要进行设置,确保每次运行项目都生成HEX文件。右击Target 1,选择Options for 'Target 1'菜单项,在弹出的对话框中选择Target标签页,填写晶体的大小,再选择Output标签页,选中Create HEX File多选按钮,单击OK按钮确定,如图3-10所示。设置完成后,每次编译都会生成一个十六进制文件。
图3-10 编译生成十六进制文件选项截图
(6)编写完成代码。
(7)编译运行项目。选择菜单Project→Rebuild All Target Files,或单击快捷方式图标,在Build Output窗口,提示“creating hex file from "XXX"... "XXX" - 0 Error(s), 0 Warning(s)”,如图3-11所示,则表示编译成功,且生成HEX文件成功。
图3-11 Build Output编译成功窗口截图
3.4 烧录软件——STC-ISP
STC-ISP 是一款单片机下载编程烧录软件,是针对STC系列单片机而设计的,可下载STC89系列、12C2052系列、12C5410等系列的STC单片机,使用简便,现已被广泛使用。
将生成的HEX文件烧到单片机的过程如下。
(1)连接单片机和计算机,打开烧录工具(本书使用的是STC-ISP烧录工具),如图3-12所示。
图3-12 烧录工具STC-ISP界面截图
(2)进行设置,如图3-12左上角选择相应的单片机型号(如选STC89C52),选择正确的端口号(如COM4)。
(3)打开程序文件。单击如图3-12所示的“打开程序文件”按钮,将弹出对话框,如图3-13所示,选择之前生成的*.hex文件。
(4)下载/编程。单击如图3-12所示的“下载/编程”按钮,重新关闭、打开单片机开关,如果提示“……操作成功!”表示烧录工作成功完成,如图3-14所示。
图3-13 选择*.hex文件对话框截图
图3-14 完成烧录工作界面截图
3.5 案例——流水灯显示
LED灯显示流水的效果,时间间隔为0.1s,硬件电路如图3-15所示,单片机的P1.0~P1.7接口上分别接了8个LED灯,输出为“0”时,LED灯亮,重复循环P1.0→P1.1→ P1.2→…→P1.7→P1.0→P1.1→P1.2→…→P1.7亮。通过该案例进一步熟悉Keil仿真软件和烧录工具的使用,了解并熟悉单片机I/O口和LED等的电路结构。
图3-15 流水灯的硬件电路图
1. 要点分析
(1)延时程序的设计。由于单片机指令执行的时间很短(μs数量级),如果要达到LED灯间流水的时间间隔为0.1s,在执行某一条指令时,需要引用一个延时程序。石英晶体的频率是12MHz,一个机器周期=1/12MHz*12=1μs,因此我们可以设计延时程序如下:
void delay10ms(void)
{
unsigned char i,j,k;
for(i=5;i>0;i--)
for(j=4;j>0;j--)
for(k=248;k>0;k--);
……