《2022年单片机程序设计方法 .pdf》由会员分享,可在线阅读,更多相关《2022年单片机程序设计方法 .pdf(28页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第十六课单片机程序设计方法程序设计是单片机开发最重要的工作程序设计就是利用单片机的指令系统根据应用系统即目标产品的要求编写单片机的应用程序其实我们前面已经开始这样做过了这一课我们不是讲如何来设计具体的程序而是教您设计单片机程序的基本方法不过在讲解之前还是有必要先了解一下单片机的程序设计语言一 程序设计语言这里的语言与我们通常理解的语言是有区别的它指的是为开发单片机而设计的程序语言如果 您没有学过程序设计可能不太明白我给大家简单解释一下您知道微软的VB VC 吗VB VC 就是为某些工程应用而设计的计算机程序语言通俗地讲它是一种设计工具只不过这种工具是用来设计计算机程序的要想设计单片机的程序当然
2、也要有这样一种工具说设计语言更确切些单片机的设计 语言基本上有三类1 完全面向机器的机器语言机器语言就是能被单片机直接识别和执行的语言计算机能识别什么以前我们讲过-是数字 0 或 1 所以机器语言就是用一连串的0 或 1 来表示的数字比如 MOV A 40H 用机器语言来表示就是11100101 0100000 很显然用机器语言来编写单片机的程序不太方便也不好记忆 我们必须想办法用更好的语言来编写单片机的程序于是就有了专门为单片机开发而设计的语言2 汇编语言汇编语言也叫符号化语言它使用助记符来代替二进制的0 和 1 比如刚才的MOV A 40H 就是汇编语言指令显然用汇编语言写成的程序比机器语
3、言好学也好记所以单片机的指令普遍采用汇编指令来编写用汇编语言写成的程序我们就叫它源程序或源代码可是计算机不能识别和执行用汇编语言写成的程序啊怎么办当然有办法我们可以通过翻译把源代码译成机器语言这个过程就叫做汇编汇编工作现在都是由计算机借助汇编程序自动完成的不过在很早以前它是靠手工来做的 道听途说我也没经历过呵呵名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 28 页 -值得注意的是汇编语言也是面向机器的它仍是一种低级语言每一类计算机都有它自己的汇 编语言比如51 系列有它的汇编语言PIC 系列也有它的汇编语言微机也有它自己的汇编语言它 们的指令系统是各不相同的也就是说不同的单片机
4、有不同的指令系统它们之间是不通用的这就是为什么世界上有很多单片机类型的缘故了为了解决这个问题人们想了很多的办法设计了许多的高级计算机语言而现在最适合单片机编程的要数C 语言3 C 语言 高级单片机语言C 语言是一种通用的计算机程序设计语言它既可以用来编写通用计算机的系统程序也可以用 来编写一般的应用程序由于它具有直接操作计算机硬件的功能所以非常适合用来编写单片机的程序与其他的计算机高级程序设计语言相比它具有以下的特点1 语言规模小使用简单在现有的计算机设计程序中C 语言的规模是最小的ANSIC 标准的C 语言一共只有32 个关键字9 种控制语句然而它的书写形式却比较灵活表达方式简洁使用简单的方
5、法就可以构造出相当复杂的数据类型和程序结构2 可以直接操作计算机硬件C 语言能够直接访问单片机的物理空间地址KEIL C51 软件中的C51 编译器更具有直接操作 51 单片机内部存储器和I/O 口的能力亦可直接访问片内或片外存储器还可以进行各种位操作3 表达能力强表达方式灵活C 语言有丰富的数据结构类型可以采用整型实型字符型数组类型指针类型结构类型联合类型枚举类型等多种数据类型来实现各种复杂数据结构的运算利用C 语言提供的多种运算符我们可以组成各种表达式还可以采用多种方法来获得表达式的值从而使程序设计具有更大的灵活性名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 28 页 -5
6、5-4 可进行结构化设计结构化程序是单片机程序设计的组成部分C 语言中的函数相当于汇编语言中的子程序KEIL C51 的编译器提供了一个函数库其中包含有许多标准函数如各种数学函数标准输入输出函数等此外还可以根据用户需要编制满足某种特殊需要的自定义函数C 语言程序就是由许多个函数组成的一个函数即相当于一个程序模块所以C 语言可以很容易地进行结构化程序设计5 可移植性前面我们讲过由于单片机的结构不同所以不同类型的单片机就要用不同的汇编语言来编写程序 而 C 语言则不同它是通过汇编来得到可执行代码的所以不同的机器上有80%的代码是公用的下册中专门来讲解C 语言的应用及其编程原理不过作为单片机初学者想
7、要学会C 语言也并不是一件容易的事因此对于大多数人来说汇编语言仍是编写单片机程序的主要语言我们上册的教程将全部以汇编语言来编写单片机的程序了解了单片机编程的设计语言下面我们来看单片机编程的基本过程和步骤二 单片机程序设计的步骤名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 28 页 -单片机的程序设计通常包括根据任务绘制程序流程图编写程序及汇编等几个步骤1 绘制流程图所谓流程图就是用各种符号图形箭头把程序的流向及过程用图形表示出来绘制流程图是 单片机程序编写前最重要的工作通常我们的程序就是根据流程图的指向采用适当的指令来编写的下面的图形和箭头就是我们绘制流程图用的工具图中左边所示
8、绘制流程图时首先画出简单的功能流程图粗框图再对功能流程图进行扩充和具体化即对存储器标志位等单元做具体的分配和说明把功能图上的每一个粗框图转化为具体的存储器或地址单元 从而绘制出详细的程序流程图即细框图下面举个例子给大家演示一下请看下面的程序主程序LOOP:SETB P1.0 LCALL DELAY 名师资料总结-精品资料欢迎下载-名师精心整理-第 4 页,共 28 页 -CLR P1.0 LCALL DELAY LJMP LOOP 子程序DELAY MOV R7#250 D1 MOV R6#250 56-D2 DJNZ R6 D2 DJNZ R7 D1 RET END 还记得吗这是我们第四课中
9、做过的LED 灯闪烁的实验以前我们曾对程序进行过分析现在让 我们用流程图来把这段程序的主程序部分画出来看上图的右边部分这就是程序的流程图在单片机的编程过程中绘制流程图能看清楚程序执行的步骤以及程序的流向事实上 程序的编写就是根据流程图的功能完成的下面我们来把第十五课中的那个程序也用流程图画出来程序如下ORG 0000H 名师资料总结-精品资料欢迎下载-名师精心整理-第 5 页,共 28 页 -LJMP START ORG 30H START MOV SP#5FH MOV P1#0FFH MOV P3#0FFH L1 JNB P3.5 L2 P3.5 上接有一只按键它按下时P3.5=0 JNB
10、P3.6 L3 P3.6 上接有一只按键它按下时P3.6=0 LJMP L1 L2 CLR P1.0 亮 LED1 名师资料总结-精品资料欢迎下载-名师精心整理-第 6 页,共 28 页 -LJMP L1 L3 SETB P1.0 暗 LED1 LJMP L1 END 先不看图自己画一下看是不是同我画的一样在实际的程序设计中根据框图采用适当的指令编写出实现流程图的源程序就是我们编写程序的最后工作2 编写程序和汇编程序编写完之后我们要把它汇编成机器语言这种机器语言就是十六进制文件后缀名为*.HEX 文件以前还要把它转换成二进制文件后缀名为*.BIN 文件不过现在的编程器都能直接读入十六进制文件就
11、不需要转换了最后用编程器把程序写入单片机这些以前都讲过了这里就不重复了下 面来讲本课的主题程序设计的方法三 单片机程序设计的方法要想搞清楚程序设计的方法我们首先要知道单片机到底有哪几类程序单片机的程序分为名师资料总结-精品资料欢迎下载-名师精心整理-第 7 页,共 28 页 -结构57-在单片机的程序中既有复杂的程序也有简单的程序但不论哪种程序它们都是由一个个基 本的程序结构组成的这些基本结构有顺序结构分支结构和循环结构1 顺序结构程序的设计顺序结构的程序一般用来处理比较简单的算术或逻辑问题它的执行过程是按照程序存储器PC 自动加1 的顺序执行的主要用数据传递类指令和数据运算类指令来实现比如我
12、们前面第六课中的I/O 口输入实验就是典型的顺序结构的程序试试看把这个程序的流程图写出来下面再看一个例子将内部RAM 中 20H 单元和30H 单元的无符号数相加存入R0 高位和R1 低位中先画出流程图名师资料总结-精品资料欢迎下载-名师精心整理-第 8 页,共 28 页 -根据流程图编写源代码如下MOV A 20H ADD A 30H MOV R0 A CLR A ADDC A#00H MOV R0 A MOV A 30H ADD A R1 MOV R1 A 名师资料总结-精品资料欢迎下载-名师精心整理-第 9 页,共 28 页 -CLR A ADDC A R0 MOV R0 A 这就是顺序
13、结构程序程序的原理就不分析了我们接着讲分支结构的程序设计这里说明一点最近有朋友提出这一课的有些程序看不懂的确如此这一课的有几个程序实例58-我们从来没有学过之所以放在这里原本是为了让大家理解程序设计的方法举几个示例证明一下没想到反而增加了大家的难度其实这些示例你不需要刻意的去理解它只要明白它的设计方法就可以了 因为这一课的主要内容是程序设计的方法而不是程序执行的原理和结果如果以后有更好的示例我会修改一下2 分支结构程序的设计所谓分支结构就是利用条件转移指令使程序执行某一指令后根据所给的条件是否满足来改变程序执行的顺序也就是本条指令执行完后并不是象顺序结构那样执行下一条指令而是看本条指令所给的条
14、件是否满足如果满足条件就跳转到其他的指令如果不满足就顺序执行当然也可以是满足条件顺序执行而不满足条件跳转执行看十五课实验程序中的下面两条名师资料总结-精品资料欢迎下载-名师精心整理-第 10 页,共 28 页 -这就是分支结构的程序如果P3.5 为 0 就转移反之就顺序执行当然也可以改成P3.5=0 顺序执行而 P3.5=1 则转移不过此时的程序就要用JB 指令了在 51 系列单片机中可以直接用于分支程序的指令有JBJNBJCJNCJZJNZCJNE JBC 等这几条它们可以完成诸如正负判断大小判断和溢出判断等等在分支结构的指令设计中大家必须注意执行一条判断指令只可以形成两路分支如果要形成多路
15、分支就必须进行多次判断也就是多条指令连续判断下面给大家举两个例子A 单分支结构的程序实例假设有两个数在内部RAM 单元的40H 和 41H 中 现在要求找出其中较大的一个数并将较大的数存入 40H 中 而将较小的一个数存入41H 中 根据程序的要求我们先画出程序的流程图左图名师资料总结-精品资料欢迎下载-名师精心整理-第 11 页,共 28 页 -再根据流程图写出程序的源代码如下MOV A 40H CLR C SUBB A 41H JNC WAIT MOV A 41H XCH A 41H 59-MOV 40H A WAIT SJMP W AIT END 程序的原理请大家自行分析一下接下来再举一
16、个多分支结构的实例看下面的程序MOV A 20H 取数JZ ZERO A=0 转移 A=1 顺序执行JB ACC 7 STORE 名师资料总结-精品资料欢迎下载-名师精心整理-第 12 页,共 28 页 -A 为负数转移ADD A#3 A 为正数则加 3 SJMP STORE ZERO MOV A#20 STORE MOV 21H A 自己画一下本例的流程图再和上面的右图比较一下看是不是一样这里有一条指令给大家解 释一下JB ACC.3 STORE ACC.3 表示累加器A 中的D3 位 这条指令的意思就是看一下累加器中的D3 位是正还是负D3 是什么呢在这里就是0 20H 的二进制10000
17、000 上一课刚讲过不要说又忘了 接下来再讲第三种循环结构的程序设计3 循环结构程序的设计循环程序是最常用的程序结构形式在单片机的程序设计中有时要碰到一段程序需要重复执行多次的情况此时就要用到循环结构程序比如第四课中的实验-LED 灯闪烁程序的子程序DELAY MOV R7#250 1 D1 MOV R6#250 2 D2 DJNZ R6 D2 3 DJNZ R7 D1 4 RET 5 名师资料总结-精品资料欢迎下载-名师精心整理-第 13 页,共 28 页 -END 在这段程序中为了延时需要多次执行DJNZ 指令 此时若用循环结构程序就可以大大地简化程序初始化部分主要用来设置循环的初始值包括
18、预值数计数器和数据指针的初值比如上例中的#250 就是预值数初值B 循环处理部分循环处理部分是程序的主体部分也称为程序体通过它可以完成程序处理的任务C 循环控制部分循环控制部分可以控制程序循环的次数并修改预值数或计数器和指针的值检查该循环是否执 行了足够的次数如果到了足够的次数就采用条件转移指令或判断指令来控制循环的结束 比如上例中的 3 4 指令就是当R6 或 R7 中的值为0 时就转移C 循环结束部分循环结束后必须返回一般用RET 或 RETI 指令这里注意以上四个部分中第一和第四部分 只能执行一次而第二和第三部分可以执行多次典型的循环结构程序的流程图可画成如下左图所示也可以将处理部分和控
19、制部分位置对调如 右图在循环程序设计中循环控制部分是程序设计的关键环节常用的循环控制方式有计数器控制和条件控制两种计数器控制就是把要循环的次数即预值数放入计数器中程序每循环一次计数器的值就减1 一直到计数器的内容为零时循环结束一般用DJNZ 指令而条件控制方式常预先不知名师资料总结-精品资料欢迎下载-名师精心整理-第 14 页,共 28 页 -道要循环的次数只知道循环的有关条件此时就可以根据给定的条件标志位来判断程序是否继续一 般参照分支结构方法中的条件来判别指令并执行下面举几个例子来分别解释一下 希望大家能以此类程序一用计数器控制的单重循环程序源程序如下CLR A MOV R2 20H MO
20、V R1 22H LOOP ADD A R1 INC R1 DJNZ R2 LOOP MOV 21H A 这段程序的作用是从22H 单元开始存放一个数据块其长度存放在20H 单元中将数据块求和要求将和存放入21H 单元中和不超过255 下面再举一个条件控制的循环程序程序二用条件控制的单重循环程序设字符串存放在内部RAM 的 21H 开始的单元中以结束作标志要求计算出该字符串的长度 并 将其存放在20H 单元中源程序如下CLR A MOV R0#21H 将地址指针指向21H 单元 LOOP CJNZ R0#24H NEXT 与 比较SJMP COMP 找到结束NEXT INC A 不为 0 计数
21、器加1 名师资料总结-精品资料欢迎下载-名师精心整理-第 15 页,共 28 页 -INC R0 修改地址指针SJMP LOOP COMP MOV 20H A 存放结果试试看自己把上面两段程序的流程图画出来下面再看一个例子DELAY MOV R7#250 D1 MOV R6#250 D2 DJNZ R6 D2 DJNZ R7 D1 RET END 61-这是一段约125mS 的延时程序现在我们来把它改成下面表格中的程序右边的程序名师资料总结-精品资料欢迎下载-名师精心整理-第 16 页,共 28 页 -DELAY MOV R7#250 DELAY MOV R7#250 D1 MOV R6#25
22、0 D1 MOV R6#250 D2 DJNZ R6 D2 D2 MOV R5#250 DJNZ R7 D1 D3 DJNZ R5 D3 RET DJNZ R6 D2 END DJNZ R7 D1 RET END 从这里可以引出一个概念程序的嵌套什么是嵌套比如早上我骑自行车从家里到单位去上班当走到半路上时太太叫我去孩子学校拿点东西到了学校老师又叫我把学校的一台电脑修一下修 好电脑一个朋友又打电话叫我去他那里拿了一本单片机与嵌入式系统杂志完了之后再去上班这就是生活中的嵌套在单片机的程序设计中也有类似的现象有时为了达到某个目的往往要在一段循环程序中再加入另一段循环程序这就是单片机的程序嵌套通常我们
23、把一个循环体中不再包含循环的叫做单重嵌套如果一个循环体中还包括有循环则叫做多重嵌套上面的表格中左边的程序就是单重嵌套而右边的程序则是多重嵌套另外须注意在多重嵌套中不允许各个循环体互相交叉也不允许从外循环跳入内循环否则编译时会出错了解了结构化程序的设计下面再来看子程序的设计方法2 子程序的设计方法什么是子程序如何设计子程序要解释这个问题让我们先同样从生活中的一个例子说起请 看下面的数学题目28*33+65+47*33+65+875*33+65在这道题中我们一般是怎么算的也许大家都知道一般总是先把33+65=98 代出来然后再用 28+47+875*98 来计算最后的结果为什么会这样这是因为在这道
24、题中我们多次用到了33+65 这个中间结果在单片机的程序设计名师资料总结-精品资料欢迎下载-名师精心整理-第 17 页,共 28 页 -中 有时也有这样的情况比如下面的程序主程序LOOP:SETB P1.0 LCALL DELAY CLR P1.0 LCALL DELAY LJMP LOOP 子程序DELAY:MOV R7,#250 D1:MOV R6,#250 D2:DJNZ R6,D2 DJNZ R7,D1 RET END 这是大家非常熟悉的LED 灯延时程序在这段程序中两次调用到了DELAY 这段程序为了简化程序的设计我们就把DELAY 这段程序单独地列了出来这段列出的程序我们就叫它子程
25、序而调用子程序的程序我们则叫它主程序LOOP 的程序段在主程序执行时每当要用到子程序时我们就用LCALL 指令来调用子程序子程序执行完之后必须返回主程序返回就用RET 指令 这我们以前都讲过了这里不再重复另外 如果子程序执行的过程中还要再次调用其他的子程序这种现象我们就称它为子程序的 嵌套看上面右边的图就是一个两层子程序的嵌套结构图这里有个问题在子程序的执行过程中有时可能要使用到累加器和某些工作寄存器而在调用 子程序前这些寄存器中可能已经存放有主程序的中间结果它们在子程序返回后仍要使名师资料总结-精品资料欢迎下载-名师精心整理-第 18 页,共 28 页 -用 这样就需62-要在进入子程序之前
26、将要使用的累加器和寄存器中的内容预先转移到安全的地方保存起来这叫现场保护 当子程序执行完即将返回主程序之前还要将这些内容先取出来送回到累加器和原来的工作寄存器中这个过程叫恢复现场保护现场和恢复现场通常使用堆栈即在进入子程序之前将需要保护的数据压入堆栈在返回 之前再将压入的数据弹出到原来的工作单元中恢复原来的状态看下面的例子LOOP PUSH 03H 将 03H 单元中的值压入堆栈保护PUSH ACC 将累加器中的值压入堆栈保护由于堆栈的操作是后进先出先进后出所以编写指令时必须把后压入堆栈的数据先弹出来才能保证恢复到原来的状态在实际的程序设计中由于每个应用程序的不同还必须根据具体的情况来考虑是否
27、需要保护哪些数据需要保护等等这就是单片机的堆栈为什么能够变化的原因关于堆栈的操作先讲这些后面的实验中我们还将结合具体的实验来分析接下来再看另一种程序-综合程序的设计方法名师资料总结-精品资料欢迎下载-名师精心整理-第 19 页,共 28 页 -3 综合程序的设计方法综合程序有查表程序散转程序数据排序程序代码转换程序等等作为初学者要想全面的掌握也确实有一定的难度所以只给大家简单地提一下详细的内容就留到下则的课程中再来解释四 本课总结程序设计是单片机开发最重要的工作掌握程序设计的基本步骤和方法对于单片机的软件编写是至关重要的这一课的内容较多对于一时无法搞清的部分大家可以结合以后的实际应用慢慢去理解
28、不要急于求成千万记住一点学习使用单片机绝不是一朝一夕的事如果你不是天才想速成单片机我还是劝你赶紧改行五 第 16 课习题1 什么是单片机的程序设计语言2 单片机的程序设计包括哪几个步骤3 画出单片机的流程图符号并简述它的作用4 单片机的分支结构程序指令有哪几条5 什么是单片机的程序嵌套想想生活中还有哪些现象与单片机的嵌套类似63-第十七课单片机的定时/计数器通过前面十几节课的学习我们已经掌握了很多的单片机知识也许您已经可以用它来开发具体的产品了不过在有些工业及民用控制中我们往往需要定时检测某个参数或按一定的时间间隔来进行某项控制比如家里的闹钟定时电动机的Y/控制等等此时您就要用到定时器或计数器
29、因此几乎所有的单片机系统内部都有几个定时/计数器89C51 有两个16 位的定时/计数器而 89C52 则有3 名师资料总结-精品资料欢迎下载-名师精心整理-第 20 页,共 28 页 -1 定时/计数的概念从选票的统计谈起画 正这就是计数生活中计数的例子处处可见例 线缆行业在电线生产出来之后要计米也就是测量长度怎么测量呢用尺量不现实太长不说要一边做一边量怎么办呢行业中有很巧妙的方法用一个周长是1 米的轮子将电缆绕在上面一周由线带动轮子转这样轮子转一周不就是线长1 米嘛所以只要记下轮子转了多少圈就可以知道走过的线有多少米了2 计数器的容量从生活中的一个例子看起一个水盆在水龙头下水龙没关紧水一滴
30、一滴地滴入盆中水滴不 断落下盆的容量是有限的过一段时间之后水就会逐渐变满换句话说计数是有容量的 那么单片机中的计数器有多大的容量呢89C51 的两个计数器分别称之为T0 和 T1 这两个计数器都是由两个8 位的RAM 单元组成的即每个计数器都是16 位的计数器最大的计数容量是216=65536 记住是从 0-65535 因为在计算机中往往把0 作为起始点比如P0 P1.0 T0 等等3 定时器的原理单片机中的计数器除了可以作为计数用还可以用作定时器定时器的用途当然很大如闹钟的 定时手机的定时开关机等等那么计数器是如何作为定时器来用的呢一个闹钟如果我们将它定时在 1 个小时后闹响就相当于秒针走了
31、3600 次 在这里时间就转化成为了秒针走的次数可见 计数的次数和时间之间的确有关那么单片机的定时/计数器是怎么回事呢请看下面的图从图中我们可以得出这样的结论只要计数脉冲的间隔相等那么计数值就代表了时间的流逝其实 单片机中的定时器和计数器是一个东西只不过计数器记录的是外界发生的事情而定时器则是名师资料总结-精品资料欢迎下载-名师精心整理-第 21 页,共 28 页 -由单片机提供一个非常稳定的计数源然后把计数源的计数次数转化为定时器的时间图中的 C/T 开 关就是起这个作用的那么提供给定时器的计数源又是从哪里来的呢继续看上面的图原来它就是由64-单片机的晶振经过12 分频后获得的一个脉冲源我们
32、知道晶振的频率是很准的所以这个计数脉冲的时间间隔当然也很准这里提个问题一个12M 的晶振它提供给计数器的脉冲时间间隔是多少呢不知大家是否还记得 那就是1us 也就是1 个微秒4 溢出的原理继续让我们看水滴的例子当盆中的水不断落下最终会有一滴水使得盆中的水变满这时如果再有一滴水落下就会发生什么现象水会溢出来用个单片机的术语叫溢出水溢出是流到地上而计数器溢出后会使得TF0 由 0 变为1 至于TF0 是什么我们稍后再谈一旦TF0 由 0 变为 1 就是发生了变化发生了变化就会引发事件就象闹钟的定时时间一到铃声就会响一样 那 么单片机的溢出会引发什么事件呢我们下节课再具体介绍这里我们来研究另一个问题
33、 要有多少个计数脉冲才会使TF0 由 0 变为1 5 任意定时及计数的方法刚才已经讲过51 系列单片机的计数器是16 位的也就是最大的计数值范围是0-65535 因此计数器计到65536 个脉冲就会产生溢出这个不是问题问题是我们在实际应用中经名师资料总结-精品资料欢迎下载-名师精心整理-第 22 页,共 28 页 -常会有少于65536 个计数脉冲的要求如药品生产线上一箱为50 瓶 一瓶为100 粒 怎么样才能满足这个要求呢提示 如果是一个空的盆要1 万滴水滴进去才会满我们在开始滴水之前就预先放入一勺水还 需要1 万滴嘛单片机计数也是如此如果我要计5000 个脉冲就先放进60535 个 再来
34、5000 个 不 就到了65535 了吗定时器同样如此每个脉冲是1 微秒则计满65536 个脉冲需时65.536 毫秒但 现在我只要10 毫秒就可以了怎么办10 个毫秒为10000 微秒所以只要在计数器里预先放进55536 就可以了这种计数方法我们把它称之为预置数计数法那么单片机的定时/计数器是由什么来控制的呢 下面就来讨论这个问题二 定时/计数器的方式控制字从上一节我们已经知道单片机中的定时/计数器可以有两种用途那么我们怎样才能让它们工作于我们所需要的用途呢这就需要通过定时/计数器的方式控制字实际上就是与定时/计数器有关的特殊功能寄存器来设置在单片机中有两个特殊功能寄存器与定时/计数器有关它
35、们是TMOD 和 TCON 顺便说一下TMOD 和 TCON 是名称我们在写程序时既可以直接用这个名称来指定它们也可以直接用它们的地址89H 和 88H 来指定它们其实用名称也就是直接用地址只不过汇编软件帮你翻译一下而已具体使用稍后讲现在先来看特殊功能寄存器TMOD 的组成看下表1 特殊功能寄存器TMOD89H 用于 T1 用于T0 GATE C/T M1 M0 GATE C/T M1 M0 从表中可以看出TMOD 被分成两部份每部份4 位分别用于控制T1 和 T0 至于这里名师资料总结-精品资料欢迎下载-名师精心整理-第 23 页,共 28 页 -面是什么意思我们稍后介绍先看另一个与定时/计
36、数器有关的特殊功能寄存器TCON 2 特殊功能寄存器TCON88H 用于定时/计数器用于中断TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 TCON 也被分成两部份高4 位用于定时/计数器低4 位则用于中断我们暂时不管而TF0 我们前面已提到了当计数溢出后TF0 将由0 变为1 原来TF0 在这儿那么TR0 TR1 又是什么呢看前面的图计数脉冲要想进入计数器还真不容易有层层关要通过最起码就是 TR0 要为1 开关才能合上脉冲才能过来因此TR0 我们称之为运行控制位当要使用T0 时必须用指令SETB 来置位以启动计数/定时器工作用指令CLR 可关闭定时/计数器的工作这一切就在您的
37、掌握中了知道了TF0 和 TR0 TF1 和 TR1 的作用也清楚了讲到这里我们还是没有讲清楚单片机定时/计数器是如何来工作的别着急接着往下看三 定时/计数器的四种工作方式65-名师资料总结-精品资料欢迎下载-名师精心整理-第 24 页,共 28 页 -单片机的定时/计数器共有四种工作方式下面我们分别加以介绍1 工作方式0 定时/计数器的工作方式0 称之为13 位定时/计数器方式它由TL0/1 的低 5 位和 TH0/1 的 8 位构成13 位的计数器此时TL0/1 的高 3 位未用请看各位的功能1M1M0 定时/计数器一共有四种工作方式就是用TMOD 的 M1M0 来控制的两位正好是4 种组
38、合2C/T 前面我们说过定时/计数器既可作定时器用也可作计数器用到底作什么用由我们根据需要自 行决定也说是决定权在我们编程者手中如果 C/T=0 就是用作定时器开关往上打如果 C/T=1 就 用作计数器开关往下打顺便提一下一个定时/计数器同一时刻要么作定时用要么作计数用不能同时使用这一点请大家注意3GATE 当我们选择了定时/计数器工作方式后定时/计数脉冲却不一定能到达计数器端中间还有一个 开关很显然如果这个开关不合上计数脉冲就没法通过那么开关什么时候合上呢它有两种情况A GATE=0 分析一下逻辑GATE 非 后是1 进入或 门或门总是输出1 和或 门的另一个输入端INT0 中断0 什么是中
39、断先不去管它无关在这种情况下开关的打开 合上只取决于TR0 只要TR0=1 开关就合上计数脉冲得以畅通无阻而如果TR0=0 则开关打开 计数脉冲无法通过因此定时/计数是否工作在这里只取决于TR0 B GATE=1 在这种情况下计数脉冲通路上的开关不仅要由TR0 来控制而且还要受到INT0 引脚的控制只有TR0=1 且 INT0 也是高电平开关才能合上计数脉冲才得以通过名师资料总结-精品资料欢迎下载-名师精心整理-第 25 页,共 28 页 -那么为什么在这种模式下只用13 位呢干吗不用16 位 这是为了和51 的前辈48 系列兼容而设的一种工作方式如果你觉得用起来不顺手那就干脆用工作方式1 吧
40、2 工作方式1 工作方式1 是 16 位的定时/计数器方式将 TMOD 的 M1M0 设为01 即可其它特性与工作 方式 0 相同 这里就不详细介绍了3 工作方式2 在介绍这种工作方式之前先让我们思考一个问题前面我们提到过任意计数及任意定时的问题比如我要计5000 个数可是 16 位的计数器要计到65535 才溢出怎么办呢我们讨论后得出的办法是采用预置数的办法-先在计数器里放上60535 个 再来5000 个脉冲不就行了吗是的但是计满了之后我们又该怎么办呢要知道计数总是不断重复的流水线上计满后马上又要开始下一次计数下 一次的计数还是5000 吗 当计满并溢出后计数器里面的值又变成了0 为什么可
41、以参考前面课程的说明因此下一次将要计满65535 后才会溢出这可不符合要求怎么办当然办法很简单 就 是每次一溢出时执行一段程序这通常是需要的要不然要溢出干吗可以在这段程序中做把预置数60535 送入计数器中的工作所以采用工作方式0 或 1 都要在溢出后做一个重置预置数的工作 做工作当然就得要时间一般来说这点时间不算什么可是有一些场合我们还是要计较的所以就有了工作方式 2-自动再装入预置数的工作方式既然要自动装入预置数那么预置数就得放在一个地方要不然装什么呢那么预置数放在什么 地方呢它放在T0 或 T1 的高8 位中那么这高8 位不就不能参与计数了吗是的在工作方式2 中 只有低8 位参与计数而高
42、8 位是不参与计数的用作预置数的存放这样计数范围就小了当然做任何事总是有代价的关键看值不值如果我根本不需要计那么多数那就可以用这种工作方式了看前面的图每当计数溢出就会打开T0 或 T1 的高低 8 位之间的开关预置数就进入低8 位当然这是由硬件自动完成的不需要我们去操心名师资料总结-精品资料欢迎下载-名师精心整理-第 26 页,共 28 页 -通常工作方式2 用于波特率发生器我们将在下册的串行接口中讲解对于这种用途定时器就是为了提供一个时间基准计数溢出后不需做任何的事情要做的仅仅只有一件就是重新装入预置数 再开始计数而且中间不能有任何的延迟可见这个任务用这种工作方式来完成是最妙不过了4 工作方
43、式3 在这种工作方式下T0 被拆成2 个独立的定时/计数器来用其中TL0 可以构成8 位的定时器或计数器工作方式而 TH0 则只能作为定时器用我们知道定时/计数器使用时需要有控制计满后溢出需要有溢出标记T0 被分成两个来用那就要两套控制及溢出标记了 从何而来呢TL0 还是用原来的T0 的标记而 TH0 则借用T1 的标记如此一来T1 不是无标记控制可用了吗是的在一般情况下只有在T1 以工作方式2 运行时才让T0 工作于方式3 四 定时器/计数器的定时/计数范围那么单片机的这四种工作方式的计数范围是如何确定的呢1 工作方式0 13 位的定时/计数器工作方式因此 最多可以计到2 的 13 次方也就
44、是8192 次2 工作方式1 16 位的定时/计数器工作方式因此 最多可以计到2 的 16 次方也就是65536 次3 工作方式2 和 3 工作方式2 和工作方式3 都是8 位的定时/计数器工作方式因此最多可以计到2 的 8 次方 也说是 256 次预置值计算用最大计数量减去需要的计数次数即可例如流水线上一个包装是24 盒 要求 每到24 盒就产生一个动作用单片机的工作方式0 来控制应当预置多大的值呢对了就是8192-24=8168 以上是计数器的原理明白了这个道理定时器也一样前面的课程已经提到过就不再重复名师资料总结-精品资料欢迎下载-名师精心整理-第 27 页,共 28 页 -了请大家参考
45、前面的例子自行分析本来想在这里做个实验可有的问题可能还解释不清楚所以等大家学完了下一课的中断后一块 儿来实验吧请继续把下一课的内容看完五 本课总结本课主要讲述了单片机的定时/计数器的原理和工作方式定时/计数器是单片机的重要组成部分 如果您在用单片机开发产品时需要用到定时器或计数器那么本课的内容是必须掌握的所以希望大家能认真地看一下这一课的内容后面我们还会结合具体的实验来讲解它们的使用方法六 第 17 课习题1 89C51 中有几个定时/计数器它们的计数范围是多少2 什么是单片机的溢出溢出后会产生什么现象3 定时/计数器有关的两个SFR 是什么它们的地址为什么4 单片机有几种工作方式它们的定时/计数范围是多少67 名师资料总结-精品资料欢迎下载-名师精心整理-第 28 页,共 28 页 -