《单片机教案.doc》由会员分享,可在线阅读,更多相关《单片机教案.doc(92页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、【精品文档】如有侵权,请联系网站删除,仅供学习与交流单片机教案电子0418、0522课时11课的题目第一讲 绪言课的类型理论7 课时、上机4课时教具单片机实物、试验用电路板教学目的要求学生掌握单片机的发展、功能、概念、应用场合、及汇编语言、高级语言在开发过程中的应用教学重点单片机的概念及功能、C语言在开发中的应用教学难点单片机的概念及其组成及C语言在单片机中的应用一、 单片机的组成(1)问题的提出: 单片机要自动完成计算,它应该具有哪些最重要的部分呢? 我们以打算盘为例计算一道算术题。例:3616315616634=?。现在要进行运算,首先需要一把算盘,其次是纸和笔。我们把要计算的问题记录下来
2、,然后第一步先算163156,把它与36相加的结果记在纸上,然后计算16634,再把它从上一次结果中减去,就得到最后的结果。(2)问题的分析现在,我们用单片机来完成上述过程,显然,它首先要有代替算盘进行运算的部件,这就是“运算器ALU”;其次,要有能起到纸和笔作用的器件,即能记忆原始题目、原始数据和中间结果,还要记住使单片机能自动进行运算而编制的各种命令。这类器件就称为“存贮器”。此外,还需要有能代替人作用的控制器,它能根据事先给定的命令发出各种控制信号,使整个计算过程能一步步地进行。但是光有这三部分还不够,原始的数据与命令要输入,计算的结果要输出,都需要按先后顺序进行,有时还需等待。如上例中
3、,当在计算163156时,数字36就不能同时进入运算器。因此就需要在单片机上设置按控制器的命令进行动作的“门”,当运算器需要时,就让新数据进入。或者,当运算器得到最后结果时,再将此结果输出,而中间结果不能随便“溜出”单片机。这种对输入、输出数据进行一定管理的“门”电路在单片机中称为“口”(Port)。在单片机中,基本上有三类信息在流动,一类是数据,即各种原始数据(如上例中的36、163等)、中间结果(如16634所得的商4、余数30等)、程序(命令的集合)等。这样要由外部设备通过“口”进入单片机,再存放在存贮器中,在运算处理过程中,数据从存贮器读入运算器进行运算,运算的中间结果要存入存贮器中,
4、或最后由运算器经“出入口”输出。用户要单片机执行的各种命令(程序)也以数据的形式由存贮器送入控制器,由控制器解读(译码)后变为各种控制信号,以便执行如加、减、乘、除等功能的各种命令。所以,这一类信息就称为控制命令,即由控制器去控制运算器一步步地进行运算和处理,又控制存贮器的读(取出数据)和写(存入数据)等。第三类信息是地址信息,其作用是告诉运算器和控制器在何处去取命令取数据,将结果存放到什么地方,通过哪个口输入和输出信息等。(3)存储器的分类:存贮器又分为只读存贮器和读写存贮器两种。前者存放调试好的固定程序和常数,后者存放一些随时有可能变动的数据。顾名思义,只读存贮器一旦将数据存入,就只能读出
5、,不能更改(EPROM、E2PROM等类型的ROM可通过一定的方法来更改、写入数据编者注)。而读写存贮器可随时存入或读出数据。(4)结论 :单片机是由中央处理器(即CPU中的运算器和控制器)、只读存贮器(通常表示为ROM)、读写存贮器(又称随机存贮器通常表示为RAM)、输入/输出口(又分为并行口和串行口,表示为I/O口)实际上,人们往往把运算器和控制器合并称为中央处理单元CPU。单片机除了进行运算外,还要完成控制功能。所以离不开计数和定时。因此,在单片机中就设置有定时器兼计数器。到这里为止,我们已经知道了单片机的基本组成,即单片机是由中央处理器(即CPU中的运算器和控制器)、只读存贮器(通常表
6、示为ROM)、读写存贮器(又称随机存贮器通常表示为RAM)、输入/输出口(又分为并行口和串行口,表示为I/O口)等等组成。实际上单片机里面还有一个时钟电路,使单片机在进行运算和控制时,都能有节奏地进行。另外,还有所谓的“中断系统”,这个系统有“传达室”的作用,当单片机控制对象的参数到达某个需要加以干预的状态时,就可经此“传达室”通报给CPU,使CPU根据外部事态的轻重缓急来采取适当的应付措施。(5)新问题的提出:现在,我们已经知道了单片机的组成,余下的问题是如何将它们的各部分连接成相互关联的整体呢?实际上,单片机内部有一条将它们连接起来的“纽带”,即所谓的“内部总线”。此总线有如大城市的“干道
7、”,而CPU、ROM、RAM、I/O口、中断系统等就分布在此“总线”的两旁,并和它连通。从而,一切指令、数据都可经内部总线传送,有如大城市内各种物品的传送都经过干道进行。二、单片机指令系统与汇编语言、C语言程序(1) 硬件与软件的紧密关系:前面已经讲述了单片机的几个主要组成部分,这些部分构成了单片机的硬件。所谓硬件(Hardware),就是看得到,摸得到的实体。但是,光有这样的硬件,还只是有了实现计算和控制功能的可能性。单片机要真正地能进行计算和控制,还必须有软件(Software)的配合。软件主要指的是各种程序。只有将各种正确的程序“灌入”(存入)单片机,它才能有效地工作。单片机所以能自动地
8、进行运算和控制,正是由于人把实现计算和控制的步骤一步步地用命令的形式,即一条条指令(Instruction)预先存入到存贮器中,单片机在CPU的控制下,将指令一条条地取出来,并加以翻译和执行。就以两个数相加这一简单的运算来说,当需要运算的数已存入存贮器后,还需要进行以下几步:第一步:把第一个数从它的存贮单元(Location)中取出来,送至运算器。 第二步:把第二个数从它所在的存贮单元中取出来,送至运算器;第三步:相加;第四步:把相加完的结果,送至存贮器中指定的单元。(2)指令的含义: 前面提到的所有这些取数、送数、相加、存数等等都是一种操作(Operation),我们把要求计算机执行的各种操
9、作用命令的形式写下来,这就是指令。但是怎样才能辨别和执行这些操作呢?这是在设计单片机时由设计人员赋予它的指令系统所决定的。一条指令,对应着一种基本操作;单片机所能执行的全部指令,就是该单片机的指令系统(Iustruction Set),不同种类的单片机,其指令系统亦不同。(3) 指令的表示方式及单片机能识别的代码:用汇编语言或高级语言编写源程序及将其编译为的二进制码 使用单片机时,事先应当把要解决的问题编成一系列指令。这些指令必须是选定的单片机能识别和执行的指令。单片机用户为解决自己的问题所编的指令程序,称为源程序(Source Program)。指令通常分为操作码(Opcode)和操作数(O
10、perand)两大部分。操作码表示计算机执行什么操作,即指令的功能;操作数表示参加操作的数或操作数所在的地址(即操作数所存放的地方编号)。因为单片机是一种可编程器件,只“认得”二进码(0、1)。要单片机运作,单片机系统中的所有指令,都必须以二进制编码的形式来表示。例如,在Intel公司的MCS51系列单片机中,从存贮器中取出一数到CPU中的累加器(在运算器中,参与运算、存放运算结果的专用寄存器)的指令代码为74H,累加器内容加立即数的代码为24H,再加上立即数代码,累加器送数到内部RAM存贮器的代码为F6HF7H等。这些指令是用十六进制表示二进制的机器码。MCS51单片机的字长为8位,有时,要
11、完成某些操作用一个字节尚不能充分表达。所以,在指令系统中有单字节指令,也有多字节指令。机器码是由一连串的0和1组成,没有明显的特征,不好记忆,不易理解,易出错。所以,直接用它来编写程序十分困难。因而,人们就用一些助记符(Mue monic)通常是指令功能的英文缩写来代替操作码,如MCS51中数的传送常用MOV(Move的缩写)、加法用Add(Addition的缩写)来作为助记符。这样,每条指令有明显的动作特征,易于记忆和理解,也不容易出错。用助记符来编写的程序称为汇编语言程序。但是,助记符编写的程序便于人理解,可单片机却只认识二进制机器代码,因此,为了让单片机能“读懂”汇编语言程序必须再转换成
12、由二进制机器码构成的程序,这种转换过程,就称为“汇编”。汇编可借助于人工查表法来实现,也可借助PC机通过所谓“交叉汇编程序”来完成。(4)结论:由机器码构成的用户程序一旦“进入”了单片机,再“启动”单片机,就可让它执行输入程序所规定的任务。三、MCU-51 CPU和存储器单片机8051的CPU由运算器和控制器组成。(1)、运算器运算器以完成二进制的算术/逻辑运算部件ALU为核心,再加上暂存器TMP、累加器ACC、寄存器B、程序状态标志寄存器PSW及布尔处理器。累加器ACC是一个八位寄存器,它是CPU中工作最频繁的寄存器。在进行算术、逻辑运算时,累加器ACC往往在运算前暂存一个操作数(如被加数)
13、,而运算后又保存其结果(如代数和)。寄存器B主要用于乘法和除法操作。标志寄存器PSW也是一个八位寄存器,用来存放运算结果的一些特征,如有无进位、借位等。其每位的具体含意如下所示。PSW :CY AC FO RS1 RS0 OV P对用户来讲,最关心的是以下四位。 1进位标志CY(PSW.7)。它表示了运算是否有进位(或借位)。如果操作结果在最高位有进位(加法)或者借位(减法),则该位为1,否则为0。 2辅助进位标志AC(PSW.6)。又称半进位标志,它反映了两个八位数运算低四位是否有半进位,即低四位相加(或减)有否进位(或借位),如有则AC为1状态,否则为0。 3溢出标志位OV(PSW.2)。
14、MCS51反映带符号数的运算结果是否有溢出,有溢出时,此位为1,否则为0。 4奇偶标志P(PSW.0)。反映累加器ACC内容的奇偶性,如果ACC中的运算结果有偶数个1(如11001100B,其中有4个1),则P为0,否则,P=1。 PSW的其它位,将在以后再介绍。由于PSW存放程序执行中的状态,故又叫程序状态字?运算器中还有一个按位(bit)进行逻辑运算的逻辑处理机(又称布尔处理机)。其功能在介绍位指令时再说明。(2)、控制器控制器是CPU的神经中枢,它包括定时控制逻辑电路、指令寄存器、译码器、地址指针DPTR及程序计数器PC、堆栈指针SP等。这里程序计数器PC是由16位寄存器构成的计数器。要
15、单片机执行一个程序,就必须把该程序按顺序预先装入存储器ROM的某个区域。单片机动作时应按顺序一条条取出指令来加以执行。因此,必须有一个电路能找出指令所在的单元地址,该电路就是程序计数器PC。当单片机开始执行程序时,给PC装入第一条指令所在地址,它每取出一条指令(如为多字节指令,则每取出一个指令字节),PC的内容就自动加1,以指向下一条指令的地址,使指令能顺序执行。只有当程序遇到转移指令、子程序调用指令,或遇到中断时(后面将介绍),PC才转到所需要的地方去。8051 CPU碢C指定的地址,从ROM相应单元中取出指令字节放在指令寄存器中寄存,然后,指令寄存器中的指令代码被译码器译成各种形式的控制信
16、号,这些信号与单片机时钟振荡器产生的时钟脉冲在定时与控制电路中相结合,形成按一定时间节拍变化的电平和时钟,即所谓控制信息,在CPU内部协调寄存器之间的数据传输、运算等操作。 (3)、存储器存储器是单片机的又一个重要组成部分。其中每个存储单元对应一个地址,256个单元共有256个地址,用两位16进制数表示,即存储器的地址(00HFFH)。存储器中每个存储单元可存放一个八位二进制信息,通常用两位16进制数来表示,这就是存储器的内容。存储器的存储单元地址和存储单元的内容是不同的两个概念,不能混淆。 A、程序存储器 程序是控制计算机动作的一系列命令,单片机只认识由“0”和“1”代码构成的机器指令。如前
17、述用助记符编写的命令MOV A,20H,换成机器认识的代码74H、20H:(写成二进制就是01110100B和00100000B)。在单片机处理问题之前必须事先将编好的程序、表格、常数汇编成机器代码后存入单片机的存储器中,该存储器称为程序存储器。程序存储器可以放在片内或片外,亦可片内片外同时设置。由于PC程序计数器为16位,使得程序存储器可用16位二进制地址,因此,内外存储器的地址最大可从0000H到FFFFH。8051内部有4k字节的ROM,就占用了由0000H0FFFH的最低4k个字节,这时片外扩充的程序存储器地址编号应由1000H开始,如果将8051当做8031使用,不想利用片内4kRO
18、M,全用片外存储器,则地址编号仍可由0000H开始。不过,这时应使8051的第31脚(即EA脚)保持低电平。当EA为高电平时,用户在0000H至0FFFH范围内使用内部ROM,大于0FFFH后,单片机CPU自动访问外部程序存储器。B、数据存储器单片机的数据存储器由读写存储器RAM组成。其最大容量可扩展到64k,用于存储实时输入的数据。8051内部有256个单元的内部数据存储器,其中00H7FH为内部随机存储器RAM,80HFFH为专用寄存器区。实际使用时应首先充分利用内部存储器,从使用角度讲,搞清内部数据存储器的结构和地址分配是十分重要的。因为将来在学习指令系统和程序设计时会经常用到它们。80
19、51内部数据存储器地址由00H至FFH共有256个字节的地址空间,该空间被分为两部分,其中内部数据RAM的地址为00H7FH(即0127)。而用做特殊功能寄存器的地址为80HFFH。在此256个字节中,还开辟有一个所谓“位地址”区,该区域内不但可按字节寻址,还可按“位(bit)”寻址。对于那些需要进行位操作的数据,可以存放到这个区域。从00H到1FH安排了四组工作寄存器,每组占用8个RAM字节,记为R0R7。究竟选用那一组寄存器,由前述标志寄存器中的RS1和RS0来选用。在这两位上放入不同的二进制数,即可选用不同的寄存器组。C、特殊功能寄存器特殊功能寄存器(SFR)的地址范围为80HFFH。在
20、MCS51中,除程序计数器PC和四个工作寄存器区外,其余21个特殊功能寄存器都在这SFR块中。其中5个是双字节寄存器,它们共占用了26个字节。各特殊功能寄存器的符号和地址见附表2。其中带号的可位寻址。特殊功能寄存器反映了8051的状态,实际上是8051的状态字及控制字寄存器。用于CPU PSW便是典型一例。这些特殊功能寄存器大体上分为两类,一类与芯片的引脚有关,另一类作片内功能的控制用。与芯片引脚有关的特殊功能寄存器是P0P3,它们实际上是4个八位锁存器(每个I/O口一个),每个锁存器附加有相应的输出驱动器和输入缓冲器就构成了一个并行口。MCS51共有P0P3四个这样的并行口,可提供32根I/
21、O线,每根线都是双向的,并且大都有第二功能。其余用于芯片控制的寄存器中,累加器A、标志寄存器PSW、数据指针DPTR等的功能前已提及,而另一些寄存器的功能在后面有关部分再作进一步介绍四、单片机的发展单片机的诞生源于80年代的工业控制,主要是由于其廉价可靠适应性轻的特点。随着其的发展及技术要求,先后经历了4位机、8位机、16位机、32位机。过30多年的发展,其性能、集成元件数量、可靠性、中断控制能力、管理能力、通用性、功耗、速度等方面了大力的提高,根据应用领域的不同,针对各种应用领域出现了型号功能各部相同的单片机,如摩托罗拉,飞利浦,INTEL,埃特梅尔等。五、单片机的应用领域单片机的产生源于工
22、业控制,在野外工作等地点的抗干扰性,因此在控制领域得到大力发展,由于单片机的价格低廉及其功能强的特点,在电子、通讯、网络方面的到有力的应用。六、keil C uVision2集成开发环境uVision2IDE是基于windows的开发平台。包含一个高效的编辑器、一个项目管理器和一个make工具。支持所有的keil C51工具,包含C编译器。宏汇编器、链接/定位器、目标代码到HEX的转换。通过做几个实际的项目上机训练来达到对编开发环境的熟悉。作业:1、CPU内部结构包含那几个部分?单片机CPU与微机的CPU有什么异同? 2、当前工厂主要采用哪些开发语言? 它们之间有何差异?下位机开发 3、程序状
23、态字PSW各个位的含义是什么?班 级电子0418、0522 课时7课的题目第二讲 89c2051单片机做流水灯课的类型理论3课时、实验4课时教具单片机实物、试验用电路板教学目的1、 要求学生掌握单片机的引脚图,硬件电路的制作原理。2、 掌握单片机程序的开发过程及技巧。3、 掌握流水灯的实现过程教学重点单片机的引脚、流水灯的原理、软件的安装、简单程序的书写及其格式、振荡周期、机器周期教学难点程序的书写及其格式、流水灯工作原理一、 用单片机做流水灯的设计思路与前期准备工作流水灯就是用一排发光的灯按一个顺序循环点亮。 第一步:制作硬件电路 流水灯电原理图如下图,图中用一片AT89C2051单片机及少
24、量外围元件组成。 图中,R1R8为LED18的限流电阻;R9、C3为单片机的简易上电复位电路;C1、C2、T1组成单片机的时钟电路;印版图:1、 复位电路:在上电后由于C3、R9的作用,使单片机的RST复位脚电平先高后低,从而达到复位;2、 输出口:复位之后,在C1、C2、T1以及单片机内部时钟电路的作用下,单片机依程序将P1.0P1.7引脚拉低或抬高;拉低的引脚对应的LED点亮,抬高的引脚对应的LED熄灭。3、 注意事项: 电路制作时,AT89C2051的位置应安装20脚的IC座,以便使单片机可以从电路板中拿下去烧写程序。电路中的元件无太苛刻的要求,若LED为高亮度的,R1R8可加大到1k;
25、C3漏电不要太大;否则会造成单片机无法复位。 下一步的准备: 1、下载汇编编译器 ASM51 和KeilC编译器,这里分别讲解。 2、准备一片AT89C2051或AT89C1051;一般电子商场即可购到,当然,如果有旧片只要是好的也行。 3、准备一台可以烧写AT89C2051和 1051的编程器;4、电脑一台。 第二步:软件的编写(一)、 引言 现在,我们假设单片机可以听懂我们的汉语,那么想让LED1点亮,就说“P1.0变低”;(单片机在上电初始后,其各端口输出为高电平)LED1就点亮啦!想让LED1灭,LED2亮,就说“P1.0升高,P1.1变低”;LED1就熄灭LED2随后既点亮! 若用汉
26、语编写的流水灯程序应该是:程序部分 ;解释部分用“;”分号与程序部分隔开开始: ;“开始:”为标号 P1.0低 P1.0高 P1.1低 P1.1高 P1.2低 P1.2高 P1.3低 P1.3高 P1.4低 P1.4高 P1.5低 P1.5高 P1.6低 P1.6高 P1.7低 P1.7高 返回到开始 ;返回到“开始:”处继续循环结束 ;说明程序到此结束 这样,LED1LED8便会不停的流动点亮熄灭,从而产生流水效果。(二)、问题的提出: 然而单片机听不懂汉语,如何让它听懂呢? 单片机只能接受二进制的“10.”代码,但要用二进制代码编写流水灯程序,其意思与上述的“汉语程序”基本相同,只是“汉语
27、”改为二进制代码罢啦。 为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。 今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。这里的“程序语言”目前主要有汇编和C两种;“翻译”软件有好多种,一般依所使用的“程序语言”不同而不同,汇编语言用“宏汇编”,如上面让你下载的ASM51,C语言用FC或KC(以后会学到,现在你不必关心)。在这里我们所说的“翻译”软件,行话叫编译器,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。
28、 现在让我们将上面的“汉语”语言程序改写为汇编语言程序和C语言程序:“汉语”语言C语言汇编语言开始:Main( )star:P1.0低 do P1.0=0;clr p1.0; CLEARP1.0高P1.01;setb p1.0; SET BITP1.1低P1.1=0;clr p1.1P1.1高P1.1=1;setb p1.1P1.2低P1.2=0;clr p1.2P1.2高P1.2=1;setb p1.2P1.3低P1.3=0;clr p1.3P1.3高P1.3=1;setb p1.3P1.4低P1.4=0;clr p1.4P1.4高P1.4=1;setb p1.4P1.5低P1.5=0;cl
29、r p1.5P1.5高P1.5=1;setb p1.5P1.6低P1.6=0;clr p1.6P1.6高P1.6=1;setb p1.6P1.7低P1.7=0;clr p1.7P1.7高P1.7=1;setb p1.7返回到开始 while(1);ljmp star;LONG JUMP结束end 这里用到了四条汇编指令:clr、 setb、 ljmp 、end;clr 是将其后面指定的位清为0;setb 是将其后面指定的位置成1;ljmp 是无条件跳转指令,意思是:跳转到指定的标号处继续运行。end 是一条告诉编译器:程序到此结束的伪指令。伪指令只告诉编译器此程序到此有何要求或条件,它不参与和
30、影响程序的执行。 C语言只要考虑高电平喝低电平,用“”做附值命令起为高电平和低电平就可以了,可见非常的简单。 这里需要说明的是 A、按汇编语法要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则: 1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件; 2、源程序的扩展名应是 *.ASM; 3、一行只能写一条语句,以回车作为本句的结束,每一语句行长度应少于80个字符(即40个汉字)。 4、每行的格式应为: 标号: 命令 参数 ;注释 即一行由四部份组成,各部份的顺序不能搞错,依实际要求可以缺省其中的一部份或几部份,甚至全部省去,即空白行。需要使用标号
31、时标号后面必须有“:”(冒号),而命令语句和参数之间必须用空格分开,如果命令有多个参数,则参数与参数之间必须用“,”(逗号)分开,需要注释时注释前必须用“;”(分号),“;”后面的语句可以写任何字符,包括汉字用于解释前面的汇编语句,它将不参与汇编,不生成代码。由于汇编程序对我们还不直观,所以在编写源程序时,应当养成多写注释的习惯,这样有助于今后源程序的阅读和维护。 标号是标志程序中某一行的符号名,编译后标号的数值就是标号所在行代码的地址。在宏汇编ASM51中标号的长度不受限制,但标号中不能包含:或其它的一些特殊符号,也不能用汉字,可以用数字作标号,但必须用字母开头。当标号作参数用(如标号作转移
32、地址),在命令后面出现时,必须舍去:(如上面程序中的 LJMP STAR中的 STAR 是不能再有:)。 每行只能有一个标号,一个标号只能用在一处,如果有两行用了同一个标号,则汇编时就会出错。由于标号的长度没有限制,可以用有意义的英文或汉语拼音来说明行,使源程序读起来更方便。 源程序中的字母不区分大小写,也就是说 star 和 STAR 是一样的,请不要用大小写方式去区分不同的标号。B、按C语言编写程序,其书写和格式有以下要求: 1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件; 2、源程序的扩展名应是 *.C; 3、一行只能写一条语句,以“;”作为本句的
33、结束,。 4、每行的格式应为:标号: 命令 参数 ;注释5、用C语言写应注意包含头文件,其中必须包含功能寄存器的定义文件。如:include “reg51.h”,对于特殊命令,在Keil C 中会用颜色区分,便于编写和检查。 好拉!现在来看看前面我们编写的源程序该怎样处理,为便于以后叙述,也便于你对源程序的学习与管理,请在D盘下建立一个McuCai目录,将下载的MASM51、或KeilC和你编写的程序均放到这里。下面均认为你已建立了这个目录。(三)、编写源程序:先将上面的汇编源程序在Windows的记事本中依原样输入,之后保存为 Test.asm和Test.C. 由于ASM51为汉化版,需要中
34、文环境,在进入DOS模式后请在命令行键入 pdos95 回车 即进入中文环境;要退出中文环境,只要在命令行键入 quit 即可。(四)、编译:在命令行键入: asm51 test.asm 回车或者用KeilC软件编译同时让它生成16进制文件,如果你编写的源程序有错误,编译时编译器会提示你那一句错啦;若想详细查看编译结果,可用“记事本”打开编译后产生的test.lst列表文件。我们最后需要的便是编译后产生的 test.hex 文件(五)、烧写:回到Windows;将编程器与电脑连接好并接通电源(这里以本站介绍的AT51编程器为例),启动编程器程序,在“器件”菜单中选择“AT89C2051”;从“
35、文件”菜单中“打开HEX文件”打开C:McuCaiTest.hex文件;在编程器上装入AT89C2051芯片,先擦除,后写入。好拉,到此我们已将第一个流水灯程序编写、编译、烧写进行完啦,再下来就是将烧写好的AT89C2051从编程器上取下,安装到前面制作的电路板中通电让LED1LED8“流水”。(六)新问题的提出:由于单片机的时钟高达12MHz,8个LED发光与熄灭的时间很短,实际实验结果凭我们的眼是看不到“流水”效果的!那怎样才能让我们肉眼看到“流水”效果呢? 请同学们思考,我们继续分解。二、用单片机做流水灯的实现(一)引言 上一节的实验最后没有得到“流水”效果,主要是单片机执行每条指令的时
36、间很短,我们肉眼无法看到LED的熄灭与点亮; 单片机内部能按部就班的自动工作,正是在系统时钟的作用下,内部各逻辑硬件产生各种所需脉冲信号而实现的。这个时钟信号(既晶体振荡信号)的周期称“振荡周期”。我们这个实验中晶体使用的是12MHZ. 在单片机中,要处理最短周期的一条指令需要由12个振荡周期(既晶振振荡周期)组成的,这个叫“机器周期”。 8051核的单片机,大多数指令只用一个机器周期(既单周期),也有双周期和四周期的指令。本实验中用到的SETB P.x和CLR P.x均属于单周期指令,也就是说,执行一句 SETB P.x 用时仅1uS(微秒) 算法:1/12M *12=1uS,CLR P.x
37、 也是1uS;而我们肉眼能够看到一个灯明显的亮灭至少需要30ms以上,难怪我们前面的程序不能看到流水效果。(二)上节问题的解决: 1、汇编语言中: 现在,将程序改动一下,在每点亮一个LED后,让程序干点别的事,也就是让它等一会再将该LED熄灭,继续执行下面的程序:star: ;程序开始 clr p1.0 ;LED1亮 acall delay ;调用延时子程序 A CALL setb p1.0 ;LED1灭 clr p1.1 ;换灯,同上 acall delay setb p1.1 clr p1.2 acall delay setb p1.2 clr p1.3 acall delay setb
38、p1.3 clr p1.4 acall delay setb p1.4 clr p1.5 acall delay setb p1.5 clr p1.6 acall delay setb p1.6 clr p1.7 acall delay setb p1.7 ljmp star ;返回到开始循环delay: ;延时子程序 mov r1,#50 ;move 赋值R1 50del0: mov r2,#100del1: mov r3,#100 djnz r3,$ ;DOWN JUMP NOT ZERO 减1不为0跳转 $指本行 djnz r2,del1 djnz r1,del0 ; ret,retur
39、n ;延时子程序结束,返回到调用处的下一句end请将上面的程序保存为 Test.asm,进行编译,并烧写到AT89C2051中,之后将2051安装到实验板中实验,这回肯定“流水”啦!2、在C语言中怎么实现呢? 其实象在汇编语言中一样,在汇编的位置同样调用延时程序即可。程序如下:#include /包含51寄存器文件void delay(void);void main() /主函数 while(1)/循环P1.0=0;/ LED1亮 delay()/调用延时子程序 P1.0=1;/LED1灭 delay(); /换灯,同上 P1.1=0; delay(); P1.1=1; P1.7=1;dela
40、y( 100);void delay( int k )/延时函数 int i,j; for (i=0;ik; i+) for (j=0;j1000;j+) 3、回过头,让我们看看延时子程序是怎样工作的? A、巩固存储器知识 单片机内部有不少寄存器,这些寄存器在单片机通电时,你可以给他写入数据(是单片机按你程序要求写的数据,而不是编程器写的),当第二次给他写入新数据时,前次的数据就被新数据覆盖;当然也可以从寄存器中读取数据。当单片机没有电源供给时,寄存器内部的数据也随即消失;这些寄存器人们叫他RAM,而用编程器将我们编写的程序烧写到单片机中的存储器叫ROM;现在,我们应该清楚:RAM是让程序去使
41、用的,ROM是我们编写的程序存放的地方! 前面说过,单片机内部有不少RAM,本实验用的AT89C2051有多少寄存器?我们现在不必关心,现在只须知道单片机内部有名叫R0R7 的这8个寄存器。这8个寄存器每个都由8个单独的位寄存器组成,最大存放数据为二进制的 1111 1111,十六进制 = FF,十进制 = 255。在使用时注意不要大于其有效范围。 B、汇编语言中延时程序 先用到 mov r1,#50 ,mov是移动的意思,该句是将50这个十进制数放到r1中;50是立即数,按汇编语言要求前面要加“#”号,汇编语言还规定,十六进制数后面要加“H”,十六进制数的高位是字母时在字母前面还要加“0”,
42、例如:#0F8H;二进制数后面加“B”,例如:#11110000B。十进制不加,例如:#100 。延时程序的第二、三句为 mve r2,#100 ;mov r3,#100 ;这两句意思同前。 第四句中 djnz r3,$ 的意思是将 r3 里面的数减 1 后如果 r3 不等于 0 则跳到后面指定的程序位置,这里的“$”既要跳转的程序位置,“$”代表当前语句处,也就是说,r3不等于 0,程序返回再次执行本句。如果r3 减 1 后等于 0,程序结束本句,继续执行下面的语句。 延时程序的最后一句是 ret ,意思是退出本子程序,返回到调用本子程序处的下一句。C、c语言中延时程序 延时程序是靠循环语句
43、for做空语句来实现的,空语句就是一个“;”号。 时间长短由循环次数决定。 根据上面的解释,一进入延时子程序首先为 r1, r2, r3 寄存器装入我们需要的数据,然后先对 r3 进行减数,每次减 1 ,r3 减完后减 r2 ,减 r2 时就费事啦,因为 r2 每减 1 后不为 0 需要跳转到 del1 标号处执行下面的语句,此时 r3 再次装入数据100,并且还要再次对 r3 进行减数.,r2 减完后减 r1,减 r1的过程请研究研究看看。 每执行 djnz rn,rel (rn 指 r0r7,rel 指转移地址)指令一次,需要2个机器周期,单片机需耗时2uS(指本实验),若忽略装数等语句,
44、延时子程序从开始到结束,单片机共耗时100*100*50*2US,既1000000uS=1秒!若加上装数等语句的耗时,延时时间大于1秒。 4、结论: 到此,我们做的流水灯已成功,原理大致也明白啦,若你自认为这一课你完全明白了,那请你将“流水灯”的流向改变一下,也可以改为两边向内流,内部向外流.,我想你一定能用前面学到的方法实现这些功能。可能有些高手说,前面的编程方法是最最笨的!不错!但玩单片机初期不必讲究语言的简练,只要能完成预先要求就好,这是初学者要知道的。那么还有更好的编程思路吗?肯定有!请同学们继续思考。三、用简单命令实现单片机做流水灯 (一) 引言 在上节课中让 LED 流水是去逐个控
45、制P1端口的每个位来实现的,那么我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后让这个数据向高位移动不就实现“流水”效果啦?的确如此! (二) 问题的提出与解决 可惜,8051没有让P1数据移动的指令,但有对累加器ACC中数据左移或右移的指令,ACC是8051单片机内部算术逻辑单元中的一个“寄存器”(这里叫他寄存器是不正确的,但你可以先这样理解,ACC在指令中常写为A),他在数据传输和数据处理过程中作用十分重要,ACC为8位。他可与片内所有单字节寄存器交换数据,实际上P1和其他端口在单片机中也是一个寄存器。这样我们可以将需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样同样可以实现“流水”效果。1、汇编程序如下:star: ;开始 mov acc,#0feh ;ACC中先装入LED1熄灭的数据(即二进制的 1111 1110) mov p1,acc ;将ACC的数据送P1口 mov r0,#7 ;因上句送到p1口的数据就熄灭了一位, ;所以将数据再移动7次就完成一个8位流水过程 loop: