《单片机学习资料 第09讲程序设计》由会员分享,可在线阅读,更多相关《单片机学习资料 第09讲程序设计(23页珍藏版)》请在金锄头文库上搜索。
1、n键控移位 例:有一电路如图所示,设计一个程序实现以下功 能:SW按下第1次,VD1发光;SW按下第2次, VD1、VD2发光; SW按下第3次,VD1、VD2、 VD3发光 SW按下第7次,VD1VD7发光; SW按下第8次,VD1发光; SW按下第9次,VD1 、VD2发光依次轮回。 解题思路:本例涉及到查询按键按下的过程, SW没有按下时P2.0为高电平,按下为低电平。实 际应该查询的是P2.0的下降沿, P2.0有一个下降沿 ,表明有一个按键按下,LED的状态应该改变一次 。1第09讲2第09讲程序清单 SW BIT P2.0ORG 0000H LOOP0:SETBSW MOV A,#
2、01H MOV R7,#07H LOOP1:MOV C,SW MOV R6,#255 DELAY:NOP NOP DJNZ R6,DELAY ANL C,/SW JNC LOOP1置P2.0为输入 方式,确定循 环次数为7延时消抖判断是否有下降沿, 有则移位,否则继续 查询初态次态3第09讲n数据排序程序 例:将片内RAM中20H-27H中的数据按照从小到 大的顺序重新排列。 解题思路:见下图RLCA ORLA,#01H MOV P2,A DJNZ R7,LOOP1 SJMP LOOP0 END显示输出,如果 循环次数到则重 新开始4第09讲RAM地址20H21H22H23H24H25H26H
3、27H原始数据66H11H10H34H67H01H89HA0H101H11H10H34H67H66H89HA0H201H10H11H34H67H66H89HA0H301H10H11H34H67H66H89HA0H401H10H11H34H66H67H89HA0H501H10H11H34H66H67H89HA0H601H10H11H34H66H67H89HA0H701H10H11H34H66H67H89HA0H5第09讲R120H , R0 (R1)+1 R3 08HB(R1) ,R2 (R3)-1 查找最小值并和(R1)单元互换R3-1=0?ENDR1 (R1)+1NY程序流程:6第09讲程序
4、清单:ORG 0000HMOV R1, #20H MOV R3, #08H LOOP1: MOV A, R1 ;R0(R1)+1INC AMOV R0, A MOV A, R3 ; R2(R3)-1DEC AMOV R2, AMOV B, R1LOOP: MOV A, R0CJNE A, B, MM7第09讲MM: JNC SS ;如果AB跳转MOV B, AMOV 28H, R0SS: INC R0DJNZ R2, LOOPMOV R0, 28H ;最小值单元和20H单元内 容互换MOV A, R1 ;数据MOV R0, AMOV R1, BINC R1DJNZ R3, LOOP1END 8
5、第09讲3.查表程序设计程序使用的专用指令:MOVC A, A+PCMOVC A, A+DPTR 一般情况下, 常使用后者 程序设计一般规则: n先确定表格存放的位置 n在表格中填入相应的数据 n查表时先将表格的首地址给DPTR,再将要查 表的数据送给A,最后用MOVC A, A+DPTR9第09讲例1:假如在MCS-51单片机内部RAM中40H单元 内存放的是一个角度(范围0- 90),设计一段 程序,计算出200sin(),把结果存入41H单元中 (结果只取整数)。 解题思路:先建立一个相应的数值表格,定义 在程序存储器中,利用输入的值进行查表。10第09讲例程:ORG0000HMOVDP
6、TR,#TABLEMOVA,40HMOVC A,A+DPTRMOV41H,ASJMP $ TABLE:DB0,3,7,10,14,17,21,24,28,31,35,38DB41,45,48199,200,200END查表表格内容11第09讲例2:假如在MCS-51单片机内部RAM中40H单 元内存放的是一个参数x(范围0-10),设计一 段程序,计算出5x3+4x2+3x+1,把结果存入41H和 42H单元中(高位在前)。 解题思路:先建立一个相应的数值表格(每 个为2个字节),定义在程序存储器中,利用输 入的值进行查表。12第09讲例程: ORG0000HMOV DPTR,#TABLEMO
7、V A,40HRLC APUSHACCMOVCA,A+DPTRMOV 41H,APOP ACCINC AMOVCA,A+DPTRMOV 42H,ASJMP$ TABLE: DW0000H,000DH,003FH,00B5H,018DHDW 02D1H,04DBH,078DH,0B19H,0F9DH,1537HEND查表,得到高 两位数表格内容查表,得到低 两位数13第09讲例3:假如在内部RAM的30H单元中存放有一个BCD编码的 十进制数,查出其共阴7段显示代码,并送到外部RAM的CFA0H 单元中。 程序清单MOV DPTR,#0050HMOV A,30HMOVC A,A+DPTRMOV
8、DPTR,#0CFA0HMOVX DPTR,AORG 0050HDB 3FH ;0的7段共阴显示代码DB 06H ;1的7段共阴显示代码DB 5BH ;2的7段共阴显示代码查表,得到数值送出数值表格内容14第09讲思考:1、如果在你设计的一个程序中将计算cos10o 、 cos15o 、 cos60o的值,如何计算。2、如果在R0中存放有一个16进制数,要将它的 ASCII码放到40H单元中,该如何设计程序。15第09讲n子程序设计基础 在编写程序时,经常有一些的程序会被频繁的使用。通常情 况下,我们将这些程序段定义成子程序,使程序变的便于调 试和阅读,同时也缩小了程序的长度。在编写子程序时,
9、应 注意以下几点: n子程序的第一条指令地址为子程序的入口地址。 n主程序调用子程序利用指令LCALL、ACALL指令进行 ,返回使用RET。 n在子程序的内部有转移指令时,最好使用相对转移指令 。 n在使用子程序时,要注意现场的保护,在退出时要恢复 现场。4.子程序设计16第09讲2) 子程序参数传递 在调用子程序时,经常要进行参数的传递,常用 的方法有以下几种:a)利用工作寄存器或累加器进行传递。b)利用可间接寻址的寄存器进行传递。c)使用堆栈进行参数传递。例:假如在MCS-51单片机外部RAM中00H07H单元 中依次存放有8个无符号数Xi(i为0-7),设计一段程序 计算出Yi=Xi2
10、,并把结果存于外部RAM 10H开始的16 个单元中( Yi 占用两个字节,高位在前);再计算 Zi=Xi2,并把Zi 依次存放在Xi 所在的单元。17第09讲解题思路:在本例中, Yi=Xi2和Zi=Xi2都比较复杂,我们可以分 别使用子程序。 程序清单:ORG0000H MOVR0,#00H MOVR1,#10H MOVR2,#08H LOOP: MOVXA,R0 LCALLDIVIDE LCALLSQUARE MOVXR1,B INCR1 MOVXR1,A DJNZR2,LOOP SJMP$R0和R1作为数 据指针,R2为 循环次数。传递参数,调 用运算子程序存放结果18第09讲DIVI
11、DE:PUSH ACC CLR C RRC A MOVX R0,A POP ACC RET SQUARE:MOVB,A MUL AB RET ENDZi=Xi2运算子 程序Yi=Xi2运算子程序19第09讲5.定时程序n单重循环延时 例1:假设单片机的fosc=12MHz,计算单片机执行下面 程序消耗的时间。 DELAY: MOV R5,#TIME ;1机器周期MM: NOP ;1机器周期DJNZ R5,MM ;2机器周期RET ;2机器周期 执行完以上4条语句,所花时间: T=(1+(1+2)TIME)+2 1s 推广计算式: T(机器周期数)=(循环体机器周期数) 循环次数+ 初始化机器周
12、期数20第09讲n多重循环延时 例1:假设单片机的fosc=12MHz,计算单片机执行下面程 序消耗的时间。 DELAY2: MOV R3,#TIME1 ;1机器周期LOOP1: MOV R2,#TIME2 ;1机器周期LOOP2: NOP ;1机器周期DJNZ R2,LOOP2 ;2机器周期DJNZ R3,LOOP1 ;2机器周期RET ;2机器周期执行完以上6条语句,所花时间:T=(1+(1+(1+2)TIME2+2)TIME1 +2) 1s21第09讲思考1: 如果单片机的主振频率是6MHz,以上两个程序 可实现的最长延时时间是多长?思考2: 对于固定主振频率的单片机系统,要求提高延 时时间,应该如何处理?比如延时1秒。22第09讲小 结本章要求: 了解MCS-51单片机的7种寻址方式; 掌握数据传送与交换、算术运算、逻辑运算、控制 转移、位操作5类共111条指令的功能,特别是每一类指 令中比较常用的指令; 掌握MCS-51单片机汇编语言程序的基本格式及伪 指令; 了解程序的基本结构(顺序结构、分支结构、循环 结构)和程序设计的基本方法; 掌握数制转换、算术运算、极值查找等典型程序的 设计; 掌握子程序的设计方法及其参数传递方法。23第09讲