手把手教你学单片机(十三).pdf_第1页
手把手教你学单片机(十三).pdf_第2页
手把手教你学单片机(十三).pdf_第3页
全文预览已结束

手把手教你学单片机(十三).pdf.pdf 免费下载

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Mc p p c a t i 一 实用单片机讲座: 手把手教你学单片机 ( 十 口 周 兴 华 三 )I 一 I , 四、 分支程序设计 分支程序即根据条件对程序的执 行进行判断,满足指定条件则进行程序 分支转移。分支程序又可分单分支程序 及多分支程序。 1 单分支程序 在 MC S 一 5 1 指令系统中,通过条 件判断实现程序单分支的指令有 J Z、 J N Z 、 C J N Z和 D J N Z等 此外还有以位 状态作为条件实现程序分支的指令, 如: J C、 J N C、 J B 、 J N B和 J B C等。使用这些 指令, 可以完成对 0 、 正负、 大小、 溢出、 状态等各种条件判断。图 1为单分支程1 序的状态流程。 执 行 指 定 标 号 的 指 令 I I 执 行 下 一 条 指 令 MC S - 5 1 指令系统中并没有多分 支转移指令,无法使用一条指令完成多 分支转移 。 要实现多分支转移, 可根据情 况采用不同的方法, 下面分别介绍。 1) 使用CJ N E指令, 通过逐次比 较。 以转向不同的分支入I:q 。 假定分支转移值在 A中。则可使 用 C J N E A , # d a t a ,r e l 指令,其分支流程 如图 3所示。 这种多分支方法的优点 是层次清晰,程序简单易懂。 但这种方法分支速度较慢 。 特 别是层次较多时。此外分支人 口地 址 应 在 8位 偏 移 量 ( 2 5 6) 有效范围之内。 理。而散转是用散转表实现对外界随机 事件的相应处理。所不同的是中断机制 有硬件支持部分,而散转却是由纯软件 实现正确的程序转移。所以, 也可以说, 程序散转是用纯软件实现程序中断的处 理 。 下面在S 1板做一个实验 。采用散 转程序设计。 定义P 2 0 、 P 2 1 、 P 2 2 、 P 2 3 为四则运算中的 + 、 一 、 X 、 命令键 , P 2 7 跳 辑 = 跳转 bP T R AJ I P S I TB 0 T B O j 程序 0 J MP S U B l IBI j 程亭 l : : A J MP S U B n lB l l 亍 程序 l l 2) 使用 J MP 主程序 A + D P T R指令, 转向不同的分支入口。 它是一条无条件程序转移指令, 采 用基址 +变址的间接寻址方式。基址为 D P T R。相当于指令转移的基地址 , A为 偏移地址。 A中的内容不同, 使程序转移 到相对于 D P T R偏移量为 A中内容的 地址处。 从该指令看出, 散转程序设计的 关键之处在于,在程序中建立一个子程 序散转地址表,使数据寄存器 D P T R指 向表的入口地址 , 然后根据变址寄存器 A中的内容,用判断指令确定程序跳转 到散转地址表中的那一个子程序处。 还有一种方法,将 A清零。根据 D P T R的值来决定程序转向的目标地 址。DP T R的内容可以通过查表或其它 方法获得。 散转子程序设计一般有两个步骤: 首先, 用A J MP或 UMP指令构成一个 !子 程序 散转 地址 表 ,随后 用 J MP j A + D P T R指令使程序跳转到散转地址 l表相应的位置,从而实现相应子程序跳 1转( 见图4 ) 。 : 实际上 散转编程技术与中断编程 J技术类似,中断是由中断地址表实现应 1用系统对外界不同随机事件的相应处 散转表 子程序区 为输出显示键, 操作数从 P l 、 P 3口输入, 按下输出显示键后结果由P l 、 P 3口输 出并显示。 在我的文档中建立一个文件目录 ( $ 2 4) 然后建立一个 $ 2 4 u v 2的工程 项目 最后建立源程序文件( $ 2 4 a s m) 。 输入下面的程序: 序号 1 0 R G 0 o o o H 2 A j MP MAIN 3 0RG 0 3 0 H 4 MAI N: MOV R0 o F 1 m 5 M0V D P r R# 1 1 AB 6 s T A R T : J N B P 2 ,0 I X 7 J NB 1 2 1 I Ll 8 J NB 1 2 2 , t 2 9 J NB P 2 3 , I 3 l 0 J NB P 2 7 L 7 l 1 c J N E R ( 】 加 F F H ,N E x T l 2 AJ MP s T ART l 3 NE XT:MOV A R0 l 4 RL A l 5 J MP A +DP TR l 6 【 ) = AC AI J L D ELl 0 MS l 7 J B P 2 0 S TA RT l 8 M0V R0 ,# 0 0H l 9 AJ MP s 1 、 ART 2 0 Ll : ACAL L DE LI O MS 2l J B P 2 1 。sr ART 2 2 M0V R0 # 0l H 2 3 A J MP s T ART 2 4 I 2: AC AI J L DELl 0 MS 2 5 J B P 2 2s T ART 2 2 电子作 2 0 0 4年 第 1期 维普资讯 MCU Ap pl i c a t i on 2 6 M0V R 0 , # 0 2 H 2 7 A J MP S TAR T 2 8 L 3 : AC AI I J DELI O MS 2 9 J B P 2-3 S T ART 3 O M0V RO I o 3 H 3 l UMP s T ART 3 2 L 7 : L J c AI I J DE L1 0 MS 3 3 J B P 2 7 ,s T ART 3 4 MOV R0 -艄H 3 5 A J MP s T AR T 3 6 T AB:A J MP S UADD 3 7 A J MP S U S UB 3 8 A J MP S UMUL 3 9 A J MP S UDI V 4 0 A J MP DI s 4l S UADD : M0V A Pl 4 2 ADD A,P3 43 MOV Rl A 4 4 CL R A 4 5 ADDC A籼H 4 6 MOV R3 A 4 7 AJ MP s T ART 4 8 S US UB :MOV A Pl 4 9 CL R C 5 O S UBB A, P 3 5l M0V Rl A 5 2 CU A 5 3 RI J C A 5 4 M0V R3 A 5 5 A J MP sr ART 5 6 S UMUI J :M0V A Pl 5 7 M0V B , P 3 5 8 MUL AB 5 9 M0V Rl A 6 0 M0V R3 B 6 l A J MP sr AR T 6 2 S UDI V: MOV A Pl 6 3 M0V B , P 3 6 4 DIV AB 6 5 M0V Rl A 6 6 MOV R 3 B 6 7 A J MP s r AR T 6 8 DI S : MOV P1 Rl 6 9 M0V P 3 R3 7 0 AC A【 I J DEL1 0 MS 7 l A J MP s r AR T 7 2 DEL1 0MS : MOV R5 - 棚 BH 7 3 F1 : MOV R7 崩 H 7 4 F 2 : MOV R6 ,# 0 FF H 7 5 F 3 :DJ NZ R6 F 3 7 6 DJ NZ R7 F 2 7 7 D J NZ R5IFl 7 8 f 7 9 END 编译通过后,将 $ 2 4文件夹中的 h e x 文件烧录到 8 9 C 5 1 芯片中,将芯片 插入到 S l 型数码管试验板上,将 P 1口 及 P 3口外接的 l 6个短路块取下,同时 取 下 P 2 0 、 P 2 1 、 P 2 2 、 P 2 3及 P 2 7的 短 路块。接上 5 V电源,用试验线一端接 “ 0 ”电平, 另一端碰触一下 P 2 0 , 进行加 法运算。 然后将 P 1口及 P 3口外接的 l 6 个短路块插上 ( 注意 5 V电源不要 断开 , 让单片机工作 ) 。最后再用试验线碰触 一 下 P 2 7 , 激活输出, 这时 P 3 、P 1口输 出为: 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 。结果正确吗? 我们核对一下。P 3口及 P 1口外接的 l 6 个短路块取下后,由于内部弱上拉电阻 的作用。 输入均为高电平 “ 0 ”。 即 P 3 、 P l 口的输入均为十进制数 2 5 5 ,作加法后 结 果 为5 1 0 , 而P 3 、 P l 口 输 出 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 0 ,换算为十进制数正 是 5 1 0 。读者朋友也可自己进行加、 减、 乘、 除的试验。由此实验我们也可看出, 自行设计制作一台能作简单的加、减、 乘、 除的计算器也并不是一件难事。 只要 将操作数从键盘输入单片机运算并输出 驱动数码管显示即可。 我们对程序进行分析解释。 序号 l ( 程序解释 。 以下同 ) : 程序开始。 序号 2 : 跳转到 MA I N主程序处。 序号 3 : 主程序 MA I N从地址 0 0 3 0 H开始。 序号4 : 寄存器 R O 初始化工作, 置F F H 。 序号 5 : 散转表首地址送 D t r l 3 。 序号 6 : 若 P 2 0为低电平转 L 0 。 序号 7 : 若 P 2 1为低电平转 L l 。 序号 8 : 若 P 2 2为低电平转 L 2 。 序号 9 : 若 P 2 - 3为低电平转 L 3 。 序号 l O : 若 P 2 7为低电平转 L 7 。 序号 l l : R O内容不等于 F F H则转 N E X T 。 序号 l 2 : 跳转回 S T A R T处重复执行 。 序号 l 3 : 将 R O内容送累加器 A 。 序号 l 4 : A中内容左移一位。 即乘 2 。 序号 l 5 : 根据 A的内容进行散转。 序号 l 6 : 调用 1 0 m S延时子程序。 序号 l 7 : 再 判 P 2 0是否 为低电平 。 若 为低 电 平顺序执行; 不为低电平转S T A R T 。 序号 l 8 : R 0送立即数 0 0 H 。 序号 l 9 : 跳转回 S T AR T处。 序号 2 O : 调用 1 0 m S延时子程序。 序号 2 l : 再 判 P 2 1 是否 为低电平 。 若 为低 电 平顺序执行 ; 不为低电平转 S T A R T 。 序号 2 2 : R O送立即数 0 1 H。 序号 2 3 : 跳转 回 S T A R T处。 序号 2 4 : 调用 1 0 m S延时子程序。 序号 2 5 : 再判 P 2 -2是 否为低电平 , 若 为低电 平顺序执行; 不为低电平转 S T A R T 。 序号 2 6 : R O送立即数 0 2 H。 序号 2 7 : 跳转回 S T A R T处。 序号 2 8 : 调用 1 0 m S延时子程序。 序号 2 9 : 再判 P 2 3是否为低 电平 , 若为低 电 平顺序执行; 不为低电平转S T A R T 。 序号 3 0 : R 0送立即数 0 3 H。 序号 3 l : 跳转回 S T A R T处。 序号 3 2 : 调用 1 0 m S延时子程序。 序号 3 3 : 再 判 P 2 7是否为 低电平 , 若 为低 电 平顺序执行; 不为低电平转STA R T 。 序号 3 4:R O送立即数 0 4 H。 序号 3 5 : 跳转 回S T AR T处。 序号 3 6 枷 : 散转地址表 , 分别散转 至加、 减、 乘 、 除子程序。 序号 4 1 : 加法子程序开始, 将 P 1口内容读入 A 。 序号 4 2 : P 3口内容与 A内容相加 ,相加结果 在 A内。 序号4 3 : 相加结果( 低8 位 ) 送 R l 暂存。 序号4 4 : 清除A 。 序号 4 5 : 将 A内容、 立即数 0 0 H、 进位标志相加。 序号4 6 : 相加结果( 高8 位 ) 送R 3 暂存。 序号 4 7 : 跳转 回 S T A R T处。 序号 4 8 : 减法子程序开始 , 将 P l 口内容读入 A 。 序号 4 9 : 清除借位标志。 序号 5 0 : A内容减 P 3口内容 ( 即 P l 减 P 3) , 结果存 A。 序号 5 l : A送送 Rl 暂存。 序号5 2 : 清除A 。 序号 5 3 : A左环移一位, 以得到借位标志结果。 序号 5 4 :借位 结果作为高 8位显示送 R 3暂 存。 序号 5 5 : 跳转回 S T A R T处。 序号 5 6 : 乘 法子程 序开始 , 将 P l口内容 ( 被 乘数 ) 读入 A。 序号 5 7 : 将 P 3口内容 ( 乘数 ) 送寄存器 B 。 序号 5 8 : A乘 B 。 序号 5 9 : 积的低 8位暂存 Rl 。 序号 6 0 : 积的高 8位暂存 R 3 。 序号 6 l : 跳转 回 S T A R T处。 序号 6 2 : 除法子程序开始 。 将 P 1口内容 ( 被 除数 ) 读入 A。 序号 6 3 : 将 P 3口内容 ( 除数 ) 送寄存器 B 。 序号 64 : A除 B 。 序号6 5 : 整数商存于A中。 再送 R l 暂存。 序号 6 6 : 余数存于 B中, 再送 R 3暂存。 序号 6 7 : 跳转 回 S T A R T处。 序号 6 8 :显示子程序开始 。将 Rl内容送 Pl 口显示。 序号 6 9 : 将 R 3内容送 P 3口显示。 序号7 O : 调用延时子程序, 以便观察清楚。 序号 7 l : 跳转回 S T A R T处。 序号 7 2 - 7 8 : 延时子程序。 序号 7 9 : 程序结束。 五、 查表程序设计 单片机是一种控制能力强、 运算能 力有限的计算机,若控制系统要求进行 较复杂的数据处理,则可采用事先建立 系统的数学模型的方法。 如建立 y - f ( x ) 数 学模型, 并且能估计出数据范围, 则可以 将数据离散化后建立一个数据表,利用 查表指令。 求得结果。这样一来, 将复杂 的数学运算变为简单的查表运算,具有 程序简单、 执行速度快的优点, 弥补了单 片机数据运算能力有限的缺点。 事实上, 有些情况下必须采用查表来进行数据处 理, 例如, 无法建立 y - f ( x ) 的解析式的情 况下。就必须用查表方式代替数学运算 来进行数据处理 ( 如通过查表得到 L E D 七段字段码 ) 。因此查表程序设计技术 是单片机重要的软件技术之一。 查表就是根据变量 x , 在表中寻找 Y , 使 y : f ( x ) , 查表程序设计如下: 首先将 y - f ( x ) 函数离散化 , 在程序 存储器中建立一个线性数据表, y 0 , y l , 电子制作 2 0 0 4年 第 1期2 3 维普资讯 嗡 。 _ 一 ,y n 。该表一般为最常用的线性表结 构,就是用一组连续的存储单元依次存 储线性表中的各个元素 查表时根据元 素的序号来取出对应存储地址中的数据 元素即可完成查表运算,数据表一般存 放在程序存储器中。 M C S 一 5 1系列单片机主要用下面两 条指令来完成程序存储器查表运算: MOVC A, A+ PC MOVC A A + DP r r R 两条指令都采用基址加变址的间接 寻址方式访问表格中的数据,使用 A + P c基址加变址寻址时, P c是下一条指令 的地址,而A是从下条指令首地址到线 性数据表中被访问元素的偏移量, 因此数 据表只能位于当前指令后面的2 5 6个字 节内。使用 A + D t r l I 基址加变址寻址 时, D F F R为常数,是数据表的首地址, A 为从数据表首地址到被访问数据元素的 偏移量, 线性数据表可以位于程序存储器 的任意位置, 最具有通用性。 再在 S 1 板做个实验,采用查表程 序设计。使单片机演奏一段音乐。 单片机演奏音乐的原理是: 通过控 制定时器的定时来产生不同频率的方 波, 驱动喇叭后便发出不同音阶的声音, 再利用延迟来控制发音时间的长短 , 即 可控制音调中的节拍。把乐谱中的音符 和相应的节拍变换为定常数和延迟常 数, 作成数据表格存放在存储器中, 由程 序查表得到定时常数和延迟常数,分别 用以控制定时器产生方波的频率和发出 该频率方波的持续时间。当延迟时间到 时,再查下一个音符的定时常数和延迟 常数。 依次进行下去, 就可自动演奏出悦 耳动听的音乐。 下面是歌曲“ 新年好” 中的段简谱: I = C l l 1 5 l 3_ 33 3 1 l旦5 5 l4_ 33 2一l 用定时器 T D方式l 来产生歌谱中 各音符对应频率的方波, 由 P 1 7 输出 驱动喇叭发声。节拍的控制可通过调 用延时子程序 D 2 0 0( 延时 1 0 0 mS) 次 数来实现, 以每拍 4 0 0 ms 的节拍时间为 例, 那么一拍需要循环调用 D 2 0 0延时 子程序 4次。同理, 半拍就需要调用 2 次。设单片机晶振频率为近似 1 2 M Hz , 乐曲中的音符、 频率及定时常数三者的 对应关系如下: 在我的文档中建立一个文件 目录 ( $ 2 5) , 然后建立一个 $ 2 5 u v 2的工程项 S 1 型数码管试验板上, 接上5 V电源, 蜂呜 器中立即奏响 “ 新年好” 的音乐。 L 一 曼一6 _ 12 3 4 56 7 一 f 频率( H z ) 3 9 2 4 4 0 4 9 4 5 2 4 5 8 8 6 6 0 6 9 8 7 8 4 8 8 0 9 8 8 I 半周期( mS)1 2 8 1 1 4 1 0 1 0 9 5 0 8 5 0 7 6 0 7 2 0 6 4 0 5 7 0 5 1 l 定时值 F D 8 0 F D C 6 F E 0 7。 F E 2 5 F E 5 7 F E 8 4 F E 9 8 F E C 0。 F E E 3 F F 0 1 目, 最后建立源程序文件( $ 2 5 a s m) c 我们对程序进行分析解释。 输入下面的程序: 序号 1 O R G O O3 O H 2 【 I MP MAI N 3 0RG O B H 4 M0V TH ORl 5 M0V 1 r L D RO 6 CP L P1 7 7 R n 8 0RG O l o o H 9 MAI N: MOV T M0D 0l H l O M0V I E # 8 2 H l l M0V D帆扎 B l 2 L O0P:CI A l 3 M0VC AA+DP T R l 4 M0V Rl A l 5 I N C DI y I R l 6 CL R A l 7 M0VC A A+Dm l 8 M0V R0 A l 9 0RL A Rl 2 O _I Z NE X1 10 21 MOV A RO 2 2 ANL A Rl 2 3 C J NE A 0 FF H NEx T 2 4 S J MP MAI N 2 5 NE XT:MOV T HORl 2 6 M0V 1 r L nR0 2 7 S E TB TR 0 2 8 S J MP NE XTl 2 9 NE XI D : CI J TRO 3 O N EXTl : CI J A 3l I NC D I r R 3 2 M0VC A A+ DPl R 3 3 M0V R2 A 3 4 LO0Pl :ACAL L D2 o o 3 5 D J NZ R 2 I D0Pl 3 6 I NC D I y I R 3 7 A J MP L00 P 3 8 D2 o 0 :MOV R 3 # 8 1 H 3 9 D2 o o B: M0V A# 0 F F H 4 0 D2 OO A: DE C A 4l J N Z D2 o O A 4 2 DEC R3 43 C J NE R 3 a lo H D2 O 0 B 43 RE T I A B:DB DB 0 F EH,2 5 H, 0 4 H, 0 F DH, 8 0 H, 0 4 H DB 0 F EH,8 4 H, 0 2 H, 0 F EH,8 4 H,0 2 H DB 0 FE H,8 4 H, O 4 H, 0 F E H,2 5 H,O 4 H DB 0 F EH,2 5 H, 0 2 H, 0 F EH, 8 4 H,0 2 H DB O D B 0 F E H,9 8 H,0 2 H , 0 F E H , 8 4 H 2 H DB 0 F EH, 5 7 H,0 8 H,0 0 H, 0 0 H, 0 4 H DB O F F H,0 FF H E ND 编译通过后, 将$ 2 5 文件夹中的h e x 文件烧录到8 9 C 5 1 芯片中, 将芯片插入到 序号 1 ( 程序解释, 以下同 ) : 程序开始。 序号 2 : 跳转到 MA I N主程序处 。 序号 3 : 定时器 1 1 0中断入 口地址 。 序号 4 - 5 : 定时器 1 1 0重装初值 序号 6: P 1 7 取 反。 序号 7 : 定时中断子程序返回。 序号 8 : 主程序从地址 O l o o H开始。 序号 9 : 定时器 1 1 0方式 1 。 序号 l O : 允许 1 1 0中断。 序号 1 1 : 数据表格首地址。 序号 l 2 : 清除 A。 序号 l 3 : 查表。 序号 l 4 : 定时器初值高 8 位存 R l 。 序号 1 5 : D P r R加 1 。 序号 l 6 : 清

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论