51单片机C语言程序设计经典实例(第2版)(txt+pdf+epub+mobi电子书下载)


发布时间:2020-07-04 23:14:41

点击下载

作者:侯玉宝

出版社:电子工业出版社

格式: AZW3, DOCX, EPUB, MOBI, PDF, TXT

51单片机C语言程序设计经典实例(第2版)

51单片机C语言程序设计经典实例(第2版)试读:

第2版前言

单片机是芯片级的微型计算机系统,可以嵌入到各种应用系统中,以实现智能化控制。近30年来,8位单片机以其性价比高、功耗低、易于开发等优点,加上嵌入式C语言的推广普及,片载Flash程序存储器及其在系统内可编程(ISP)和在应用中编程(IAP)技术的广泛应用,使其越来越受到广大电子工程师的喜爱。

本书第1版自2012年5月出版以来,已被许多学校或培训机构作为单片机课程的实践教材来使用,受到众多教师、学生和读者的认可,在此我们表示衷心的感谢。该书以国内最流行的80C51系列单片机的硬件和软件的设计为背景,以C语言为基础,以项目为载体,采用任务驱动方式的教学方法,通过丰富的C程序实例,由浅入深地介绍了80C51系列单片机的基础知识及各种应用开发技术。

鉴于单片机及嵌入式系统技术发展迅速,决定对本书进行修订。第2版坚持原版“项目为载体,任务带动教学”、“软硬结合,虚拟仿真”、“C语言编程,增强可读性”、“兼顾原理,注重实用”的编写原则,并在此基础上,根据读者的建议对原版进行修订与补充。

与第1版相比,本书第2版主要在以下3个方面进行了修订。

将第1版的项目一和项目二整合为一个项目,并精简为3个任务,使用的编译软件Keil和仿真软件Proteus均为最新版本。

由于篇幅原因,仅第1版项目三中的内容全部保留,而第1版其余项目中均删除了部分任务。

为了增强读者的综合实践能力,本书第2版新增加了综合应用设计实例项目。该项目中包含4个不同的综合实践任务,以进一步加强、巩固读者对定时器控制、中断控制、矩阵键盘控制、数码管动态显示控制、LCD液晶显示控制等知识的综合应用和实际设计能力。

本书由湖南涉外经济学院侯玉宝、湖南工程职业技术学院陈忠平和湖南涉外经济学院邬书跃编著。参加本书编写的还有湖南工程职业技术学院陈建忠、李锐敏、龚亮、龙晓庆、周少华,湖南航天诚远精密机械有限公司刘琼,湖南涉外经济学院高金定,湖南科技职业技术学院高见芳,湖南三一重工集团王汉其,湖南航天局7801研究所武娟梅、袁芳和葛建。全书由湖南工程职业技术学院徐刚强教授主审,在编写过程中还得到了湖南工程职业技术学院许睿等诸多高工和老师的大力支持及帮助,在此向他们表示衷心的感谢。同时,对在编写过程中参考的多部51单片机原理及相关著作的作者表示深深的谢意!由于编者知识水平和经验有限,书中难免存在缺点和错误,恳请广大读者给予批评指正。编著者

第1版前言

单片机是芯片级的微型计算机系统,具有性价比高、功耗低、易于开发等优点,可以嵌入各种应用系统中,以实现智能化控制。近20年来,嵌入式C语言的推广普及,片载Flash程序存储器及其在系统内可编程(ISP)和在应用中编程(IAP)技术的广泛采用,使得单片机越来越受到广大电子工程师的欢迎。

本书以国内最流行的80C51系列单片机的硬件和软件设计为背景,以C 语言为基础,以项目为载体,采用任务驱动方式的教学方法,通过丰富的C语言程序实例,由浅入深地介绍了80C51系列单片机的基础知识及各种应用开发技术。在编写过程中,作者注重题材的取舍,使本书具有以下4个特点。

1.项目为载体,任务带动教学

本书是“以项目为载体,采用任务驱动方式”编写而成的,强调“教、学、做”一体化,坚持理论知识够用的原则,并将知识点分散到多个任务中,使读者能够边学边做,轻松完成单片机学习之旅。

2.软硬结合,虚拟仿真

沿用传统单片机学习与开发经验,通过相关编译软件(如 Keil)编写程序并生成*.Hex文件,然后在Proteus中绘制硬件电路图(这一过程相当于硬件电路的焊接),调用*.Hex文件进行虚拟仿真(这一过程相当于硬件调试)。对于单片机初学者来讲,这样可节约学习成本,提高学习积极性;对于单片机系统开发人员来讲,可缩短开发时间,提高设计效率,降低开发成本。

3.C语言编程,增强可读性

C语言是一种编译型程序设计语言,它兼顾了多种高级语言的特点,并具备汇编语言的功能。用C语言来编写程序会大大缩短开发周期,可以明显地增加程序的可读性,便于改进和扩充。采用C语言进行单片机程序设计是单片机开发与应用的必然趋势。许多人员在学习MCS—51单片机时,均先学习了汇编语言,然后再学习用C语言编写MCS—51程序代码,通过这种历程他们深深地感悟:汇编指令太枯燥,学习起来费时费力,用汇编语言编写一个程序或读懂程序不是一件容易的事情;使用C语言进行编程时,不必对单片机的硬件结构有很深入的了解,编写程序相对简单,且程序的可读性和可移植性均很强。

4.兼顾原理,注重实用

基本原理、基本实例一直是学习和掌握单片机应用技术的基本要求,本书侧重于实际应用,因此很少讲解相关理论知识,这样避免了知识的重复讲解。为紧随技术的发展,在编写过程中还注重知识的新2颖性和实用性,因此本书介绍了SPI总线、IC总线、1-Wire总线芯片的使用方法,使读者学习的知识能够紧随时代发展的步伐。

参加本书编写的有湖南工程职业技术学院陈忠平、徐刚强、李锐敏,湖南航天局7801研究所刘琼,湖南涉外经济学院侯玉宝、高金定,湖南科技职业技术学院高见芳,湖南三一重工集团王汉其等。全书由湖南工程职业技术学院陈建忠教授主审,在编写过程中还得到了湖南工程职业技术学院龚亮、龙晓庆、许睿等众位高工和老师的大力支持及帮助,在此向他们表示衷心的感谢。同时,对在编写过程中参考的多部51单片机原理及相关著作的作者表示深深的谢意!由于编者知识水平和经验的局限性,书中难免存在缺点和错误,敬请广大读者给予批评指正。编著者项目一单片机系统的软、硬件开发环境【知识目标】

掌握STC89C51单片机最小系统的组成及相关电路的工作原理。

掌握单片机编译软件Keil μVision 5的使用方法。

单片机虚拟仿真软件Proteus 8 Professional的使用方法。【能力目标】

学会搭建单片机最小应用系统电路。

学会利用Keil μVision 5软件对单片机C程序进行编译与调试。

学会利用Proteus 8 Professional软件进行单片机程序的硬件仿真。任务1 单片机最小应用系统的组成

单片机最小应用系统又称为单片机基本系统,是指用最少的元器件能使单片机工作起来的一个最基本的应用系统。在这种系统中,使用STC89系列单片机的一些内部资源就能够满足硬件设计需求,不需扩展外部的存储器或I/O接口等器件,通过用户编写的程序,单片机就能够达到控制的要求。

单片机的最小应用系统结构只能使用在控制较简单的场合,该系统包括单片机、时钟电路、复位电路等部分。同时,单片机要正常运行,还必须具备电源正常、时钟正常、复位正常3个基本条件。STC89C51单片机组成的最小应用系统电路原理图如图1-1所示。

从图1-1中可以看出,电路以STC89C51单片机为核心,STC89C51的第18脚、第19脚外接由C1、C2和X1构成的石英晶体振荡器电路;STC89C51的第9脚外接由K1、R1、R2和C3构成的按钮复位电路;STC89C51的第31脚外接电源,以进行片内和片外程序存储器的选择控制。当然,STC89C51单片机要正常工作,还需提供电源,因此在实际电路中,STC89C51的第20脚应该接地,而第40脚应该接电源+5V。

图1-1所示的单片机最小应用系统通上电时,单片机就开始工作,4组P端口处于高电平的状态。在这种情况下,是否说明单片机正常工作呢?单片机要完成相应的任务操作,还需要程序来进行控制,没有固化程序的单片机系统不能完成任何实质上的工作,所以图1-4所示的电路在通电后,单片机进入工作准备就绪状态。1.电源电路

电源电路是单片机工作的动力源泉。对应的接线方法为:单片机CC的第40引脚(V)为电源引脚,工作时接+5V电源;第20引脚SS(V)为接地线。2.时钟电路

时钟电路为单片机产生时序脉冲,单片机所有运算与控制过程都是在统一的时序脉冲的驱动下进行的。时钟电路就好像人的心脏,如果人的心跳停止了,人就没有生命。同样,如果单片机的时钟电路停止工作,那么单片机也就停止运行了。单片机的时钟具有两种工作模式,即片内时钟和片外时钟模式。图1-1 STC89C51单片机最小应用系统电路原理图

1)片内时钟模式STC89系列单片机的内部也有1个高增益单级反相放大器,XTAL1为反相放大器的输入端,XTAL2为反相放大器的输出端。单片机的这个反相放大器与作为反馈元件的片外晶体或陶瓷谐振器和电容一起构成了稳定的自激振荡器,发出的脉冲直接送入内部的时钟电路,作为单片机CPU的时钟。图1-2所示为片内时钟模式电路的连接方法。图1-2 片内时钟模式电路

当外接晶振时,电容C1和C2容量值通常选择30pF;外接陶瓷谐振器时,C1和C2的典型值约为47pF。在设计印制电路板(PCB)时,晶体或陶瓷谐振器和电容应尽可能安装在单片机芯片附近,以减少寄生电容,保证振荡器稳定和可靠工作。为了提高温度稳定性,应采用NPO电容(具有温度补偿特性的单片陶瓷电容器)。C1、C2对频率有微调作用,晶振频率越高,系统时钟频率也越高,单片机的运行也就越快。运行速度越快,对存储器的速度要求就越高,对PCB的工艺要求也越高。

使用片内时钟模式时,如何判断单片机的外接晶振是否工作呢?可以使用电压法来进行检测。具体操作是:使用高阻电压表分别测量XTAL1和XTAL2两引脚的对地电压,在正常情况下,两引脚的对地电压应该是电源电压的1/2或者更低一些,且XTAL2引脚上的电压要高于XTAL1引脚上的电压。

注意:使用此方法时,会对频率有一点影响,严重的会导致晶振停振,这是因为电压表一加上去相当于在振荡电路上又并上或串上了分布电容、电阻和电感等,这样就影响了原来电路的状态。

2)片外时钟模式在系统中,若有多片单片机时,为了使各单片机之间时钟信号同步,应当引入唯一的公用外部脉冲信号作为各单片机的振荡脉冲。这个外时钟信号由外部振荡器产生,可以为有源晶振或其他的时钟芯片。但是,对于不同工艺类型的单片机,外部时钟的输入引脚不同。

对于普通的8051单片机,外部时钟信号由XTAL2引脚接入后,直接送到单片机内部的时钟发生器,而引脚XTAL1则应直接接地,如图1-3(a)所示。

注意:由于XTAL2引脚的逻辑电平不是TTL信号,因此需要外接一个上拉电阻。

对于CMOS型的单片机,和普通的8051不同的是其内部的时钟发生器的信号取自于反相放大器的输入端。因此,外部的时钟信号应该从单片机的XTAL1引脚输入,而XTAL2引脚则需要悬空,如图1-3(b)所示。这里单片机有80C51、80C52、AT89S52、STC89C51等。图1-3 片外时钟模式电路

外部脉冲信号通过一个二分频的触发器而成为内部时钟信号,故对外部信号的占空比没有什么要求,但最小的高电平和低电平持续时间应符合产品技术的要求。如果STC89系列单片机的时钟频率超过33MHz时,应直接使用外部有源晶振。

STC89系列单片机时钟电路中R的阻值、C1和C2容量的大小与单片机的时钟模式、晶振频率有关,见表1-1。对于STC89C5xD+和STC89LV5xD+单片机而言,外接晶振的频率范围则与单片机的工作电压有关,见表1-2。表1-1 R、C1和C2的规格选择表1-2 STC89C5xD+和STC89LV5xD+单片机时钟频率范围3.复位电路

单片机的复位操作,使CPU和系统中的其他部件都处于一个确定的初始状态,并从这个初始状态开始工作。只要单片机的复位端 RST 保持高电平,单片机便保持复位状态。复位后,除SP值为0x07、P1~P3口为0xFF 外,其他所有特殊功能寄存器 SFR 的复位值均为0x00。

单片机通常采用上电复位和按钮复位两种方式。图1-4(a)所示为上电复位电路,图1-4(b)和(c)所示为按钮复位电路。

上电复位是利用电容的充放电来实现的,上电瞬间,RST 端的CC电位与 V相同,RC 电路充电,随着充电电流的减少,RST 端的电CC位逐渐下降。只要 V的上升时间不超过1ms,振荡器的建立时间不超过10ms,该时间就足以保证完成复位操作。上电复位所需的最短时间是振荡周期建立时间加上24个时间周期,在这个时间内,RST 端的电平就维持高于施密特触发器(Schmidt Trigger)的下阈值。

按钮复位有按钮脉冲复位和按钮电平复位两种方法,如图1-4(b)和(c)所示。按钮脉冲复位是由单片机外部提供一个复位脉冲,此脉冲保持宽于24个时钟周期;复位脉冲过后,由内部下拉电阻保证RST端为低电平。按钮电平复位是上电复位和手动复位相结合的方案,上电复位的工作过程与图1-4(a)相同,在手动复位时,按下复位按钮 RESET,电容对R1迅速放电,RST端变为高电平,RESET 松开后,电容通过电阻 R2进行充电,使RST端恢复为低电平。图1-4 单片机复位电路4.控制引脚的接法

控制引脚为片内、片外程序存储器的选择控制引脚,当为低电平时,单片机从外部程序存储器取指令;当接高电平时,单片机从内部程序存储器中取指令。5.四组I/O端口P0、P1、P2和P3

P0(P0.0~P0.7)∶ 8位三态双向I/O端口。在访问外部存储器时,它是分时作为低8位地址线和8位双向数据总线用的。在不访问外部存储器时,作为通用I/O端口用于传送CPU的I/O数据。P0端口能以吸收电流的方式驱动8个LSTTL负载,一般作为扩展时地址/数据总线使用。

P1(P1.0~P1.7)∶ 带内部上拉电阻的8位准双向 I/O 端口(作为输入时,端口锁存器置1)。对P1端口写1时,P1端口被内部的上拉电阻拉为高电平,这时可作为输入口。当 P1端口作为输入端口时,因为有内部上拉电阻,那些被外部信号拉低的引脚会输出一个电流。P1端口能驱动(吸收或输出电流)4个 TTL负载,它的每个引脚都可定义为输入或输出口,其中 P1.0、P1.1兼有特殊的功能。

♢T2/P1.0∶ 定时器/计数器2的外部计数输入/时钟输出。

♢T2EX/P1.1∶ 定时器/计数器2重装载/捕捉/方向控制。

P2(P2.0~P2.7)∶ 带内部上拉电阻的8位准双向 I/O 端口。当外部无扩展或扩展存储器容量小于256B时,P2端口可作为一般 I/O端口使用,扩充容量在64KB 范围时,P2口为高8位地址输出端口。当作为一般 I/O口使用时,可直接连接外部 I/O设备,能驱动4个 LSTTL负载。

P3(P3.0~P3.7)∶ 带内部上拉电阻的8位准双向 I/O 端口。向 P3端口写入1时,P3端口被内部的上拉电阻上拉为高电平,可用做输入口。当作为输入时,被外部拉低的 P3端口会因为内部上拉而输出电流。第一功能作为通用 I/O端口,第二功能作为控制口,见表1-3。表1-3 P3端口引脚的第二功能任务2 Keil C51编译软件的使用

Keil C51标准C编译器是众多单片机应用开发优秀软件之一,它集编辑、编译、仿真于一体,支持汇编语言、PLM语言和C语言的程序设计,界面友好,易学易用。本任务通过P1端口输入、P0端口输出实验为例,简单介绍Keil C51软件的基本操作方法。1.Keil C51软件基本操作

1)启动Keil C51 软件双击桌面Keil μVision5 快捷图标,弹出图1-5 所示的画面。之后,进入μVision5 集成开发环境,如图1-6 所示。

2)创建一个新的工程项目在图 1-6 的界面中,执行菜单命令“Project”→“Close Project”,关闭已打开的项目。执行菜单命令“Project”→“New μVision Project”,弹出“Create New Project”对话框,在此对话框中选择保存路径,并输入项目名,如图1-7所示。

输入项目名后,单击“保存”按钮,弹出“Select Device for Target′ Target 1′ …”对话框,如图1-8所示。因Keil μVision5中没有STC单片机型号,可以用 Intel 公司的8052/87C52/87C54/87C58、Atmel 公司的 AT89C/5152/55/55WD或NXP公司的P87C52/P87C54/P87C58/P87C51RD+等替代。在图1-8中将其当做Atmel公司的AT89C51RC。图1-5 启动Keil时的画面图1-6 μVision5集成开发环境图1-7 “Create New Project”对话框

选择目标芯片后,单击“OK”按钮,弹出如图1-9所示的对话框,询问用户是否将标准的8051启动代码复制到项目文件夹并将该文件添加到项目中。在此单击“否”按钮,项目窗口中将不添加启动代码;单击“是”按钮,项目窗口中将添加启动代码。这二者的区别如图1-10所示。图1-8 “Select Device for Target′Target 1′…”对话框图1-9 询问是否添加启动代码对话框图1-10 是否添加启动代码的区别

3)新建C51源程序文件创建新的项目后,执行菜单命令“File”→“New”,或者在工具栏中单击图标,将打开一个空的文本编辑窗口。在此窗口中输入以下源程序代码:

#include "reg52.h"

#define uint unsigned int

sbit BZ=P3^7;

sbit key=P1^0;

void delayms(uint ms)

{uint i;while(ms--){for(i=0;i<120;i++);}

}

void main(void){while(1){if(key==0){BZ=0x0;delayms(10);BZ=0x1;delayms(50);P0=0xFF;}else{P0=~P0;delayms(500);}}

}

源程序输入好后,执行菜单命令“File”→“Save”,弹出“保存”对话框。在此对话框中输入保存的文件名称,保存时后缀名为.c。在项目窗口的“Target1”→“Source Group 1”上单击鼠标右键,在弹出的菜单中选择“Add Existing Files to Group′Source Group 1′”,然后选择刚才所保存的源程序代码文件,并单击“ADD”按钮,即可将其添加到项目中,如图1-11所示。

4)编译文件添加源程序文件后,执行菜单命令“Project”→“Build target”,或者在工具栏中单击图标,进行源程序的编译。编译完成后,μVision5将会在输出窗口(Output Window)的编译页(Build)中显示相关信息。如果编译的程序有语法错误,双击错误信息,光标将会停留在μVision5文本编辑窗口中出现该错误或警告的源程序位置上。修改好源程序代码后,再次执行菜单命令“Project”→“Build target”,或者在工具栏中单击图标,对源程序重新进行编译。

5)HEX文件的生成写入51系列单片机中的文件一般为.HEX文件。要得到.HEX文件,在Keil中需进行相关设置。执行菜单命令“Project”→“Options for Target′Target 1′”,或者在工具栏中单击图标,然后在弹出的“Options for Target′ Target 1′”对话框中选择“Output”选项卡,选中“Create HEX File”选项即可,如图1-12所示。图1-11 在项目中添加源程序文件图1-12 选中生成.HEX文件选项

设置好后,再次进行编译,如果源程序文件没有语法错误或警告提示时,将会在编译输出窗口(Build Output)中显示已创建一个以.HEX为后缀名的目标文件,如图1-13所示。图1-13 提示已生成.HEX目标文件2.Keil程序调试与分析

1)寄存器和存储器窗口分析执行菜单命令“Debug”→“Start/Stop Debug Session”或在工具栏中单击图标,即可进入调试状态。执行菜单命令“Debug”→“Run”,或者单击图标,全速运行源程序。

在源程序运行过程中,可以通过存储器窗口(Memory Window)来查看存储区中的数据(若在调试状态下没有此窗口,可执行菜单命令“View”→“Memory Window”,或者单击图标将其打开)。在存储器窗口的上部,有供用户输入存储器类型的起始地址的文本输入栏,用于设置关注对象所在的存储区域和起始地址,如“D: 0x30”。其中,前缀表示存储区域,冒号后为要观察的存储单元的起始地址。常用的存储区前缀有 d 或 D(表示内部RAM的直接寻址区)、i或I(表示内部RAM的间接寻址区)、x或X(表示外部RAM区)、c或C(表示ROM区)。由于P0端口属于SFR(特殊功能寄存器),片内RAM字节地址为80H,所以在存储器窗口的上部输入“D: 0x80”时,可查看P0端口的当前运行状态,如图1-14所示。图1-14 存储器窗口

2)delayms()延时函数的调试与分析在源程序编辑状态下,执行菜单命令“Project”→“Options for Target′Target 1′”,或者在工具栏中单击图标,然后在弹出的对话框中选择“Target”选项卡,在“Xtal(MHz):”栏中输入12(即设置单片机的晶振频率为12MHz)。在工具栏中单击图标,对源程序再次进行编译。

在源程序中,分别在delayms函数的起始行与结束行前双击,即设置了两个断点。执行菜单命令“Debug”→“Start/Stop Debug Session”,或者在工具栏中单击图标,进入调试状态。刚进入调试状态时,项目工作区(Project Workspace)“Registers”选项卡的“Sys”项中sec值为0.00039700,如图1-15(a)所示,表示进入调试花费了0.00039700s。单击和图标后,“Sys”项的sec值为0.00186800,如图1-15(b)所示。因此,此函数的延时时间为二者之差,即0.00147100s。

试读结束[说明:试读内容隐藏了图片]

下载完整电子书


相关推荐

最新文章


© 2020 txtepub下载