单片机程序设计 PPT
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图4-4 多分支选择结构
8051的散转指令和比较指令均可以实现多分支转移。 散转指令 JMP @A+DPTR 比较指令 CJNE A,direct,rel (共有4条)
使用散转指令前,先将各分支程序编写好,存放在程序存 储器中,并将各分支程序的入口地址组成一个表格放在 一起,把表首地址送入DPTR,把子程序的序号放入A中。
;把结果在P1.5口输出
3.3 分支程序设计
分支程序的主要特点是程序包含有判断环节,不同的条件
对应不同的执行路径。编程的关键任务是合理选用 具有逻辑判断功能的指令。由于选择结构程序的走
向不再是单一的,因此,在程序设计时,应该借助程序 框图(判断框)来明确程序的走向,避免犯逻辑错误。一 般情况下,每个选择分支均需单独一段程序,并有特定 的名字,以便当条件满足时实现转移。 1.单分支选择结构 当程序的判断是二选一时,称为单分支选择结构。通常用 条件转移指令实现判断及转移。单分支选择结构有三种 典型表现形式。
【例】 逻辑运算。逻辑操作是控制过程中经常使用的,掌握 逻辑运算的特点是提高程序效率的重要途径。在逻辑运算 中,进位标标志CY的地位很特殊,它是逻辑累加器,大多 数逻辑操作要通过CY来完成。用程序实现图4-2所示的逻 辑电路功能。
图3-2 逻辑电路
参考程序如下:
ORG 0000H
LJMP START
ORG 0100H MOV P1,#0FFH LOOP:MOV C,P1.1 ORL C, P1.2
CPL C ANL C,P1.0
CPL C MOV 07H,C MOV C,P1.3 ANL C,/P1.4
CPL C ORL C,07H MOV P1.5,C
SJMP $
END
;P1口初始化 ;P1.1与P1.2逻辑或运算 ;取反 ;C与P1.0逻辑与运算 ;暂存于07H单元中 ;P1.3与P1.4的反逻辑与运算
Y A←64H
A为负数? N
A=0? N
A←X+2
A←|X|
存数,(31H)←A(30H) 结束
参考程序如下:ORG 1000H
MOV A,30H
;取数
JB ACC.7,NEG
;负数,转NEG
JZ ZER0
;为零,转ZER0
ADD A,#02H
;为正数,求X+2
AJMP SAVE
;转到SAVE,保存数据
单片机程序设计
3.1汇编语言程序设计方法
汇编语言程序设计同高级语言程序设计一样,是有章可循 的,只要按照一定的方法步骤去做,程序设计就会变成一 件轻松愉快的事情,设计的程序也会规范、清晰、易读、 易懂。使用汇编语言设计程序大致上可分为以下几个步骤。 1. 分析题意,明确要求。 2. 确定算法。 3. 画程序流程图。 4. 分配内存工作单元。 5. 编写源程序。 6. 程序优化。 7. 上机调试。
3.2 顺序程序设计
【例】程序初始化。初始化就是为变量、寄存器、存储单元
赋一初值,是最简单、最常用的操作。如将R0-R3,P1,
30H,40H单元初始化为00H,把R4,R5初始化为0FFH。
参考程序如下:
ORG 0000H
;PC起始地址
LJMP START
;转主程序
ORG 0100H
;主程序起始地址
对于第三种形式,可用程序段1重复执行的次数作为判断条 件,当重复次数达到某一数值时,停止重复,程序顺序往下
执行。这是分支结构的一种特殊情况,这实际是循环结构程
序。用这种方式可方便实现状态检测。
【例】:LOOP: JB P1.1,LOOP 单分支程序一般要使用状态标志,应注意标志位的建立。
【例】设a存放在累加器A中,b存放在寄存器B中,若a≥0,
大家应该也有点累了,稍作休息
大家有疑问的,可以询问和交流
图3-3 单分支选择结构
(a)当条件满足时执行分支程序1,否则执行分支程序2。 (b)当条件满足时跳过程序段1,从程序段2顺序执行;否则,
顺序执行程序段1和程序段2。 (c)当条件满足时程序顺序执行程序段2;否则,重复执行程
序段1,直到条件满足为止。 由于条件转移指令均属相对寻址方式,其相对偏移量rel是个 带符号的8位二进制数,可正可负。因此,它可向高地址方向 转移,也可向低地址方向转移。
Y=a-b;若a<0,则Y=a+b。
这里的关键是判a是正数,还是负数;可通过判断ACC.7确定。
ORG 0000H
LJMP BR
ORG 0100H
BR: JB ACC.7,MINUS
;负数,转到MINUS
CLR C
;清进位位
SUBB A,B
;A-B
SJMP DONE
MINUS:ADD A,B
;A+B
DONE:SJMP $
;等待
END
2.双向分支程序设计举例 【例4.3】 设X存在30H单元中,根据下式
X+2 X>0
Y = 100 X=0
∣X∣ X<0
求出Y值,将Y值存入 31H单元。
解:根据数据的符号位判别该数的正负, 若最高位为0,再判别该数是否为0。程序 流程如图4-4所示。
开始 取数,A←(30H)
START:MOV R0,#00H
;初始化
MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
MOV P1,#00H
MOV R4,#0FFH MOV R5,#0FFH MOV 30H,#00H MOV 40H,#00H HERE:SJMP HERE ;反复执行该指令,相当于等待
END 用立即数比较直观,但用MOV A,#00H ,MOV R0, A 指 令赋值,效果更好。
ZER0:MOV A,# 64H ;数据为零,Y=100
AJMP SAVE
;转到SAVE,保存数据
NEG:DEC A
CPL A
;求பைடு நூலகம்X∣
SAVE: MOV 31H,A
;保存数据
SJMP $ ;暂停
2.多分支选择结构 当程序的判别输出有两个以上的出口流向时,称为多分支选 择结构。8051的多分支结构程序还允许嵌套,即分支程序中 又有另一个分支程序。汇编语言本身并不限制这种嵌套的层 次数,但过多的嵌套层次将使程序的结构变得十分复杂和臃 肿,以致造成逻辑上的混乱。多分支选择结构通常有两种形 式,如图4-4所示。
在8051指令中,还有4条功能极强的比较转移指令: CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE @Ri,#data,rel 这4条指令对指定单元内容进行比较,当不相等时程序作相
8051的散转指令和比较指令均可以实现多分支转移。 散转指令 JMP @A+DPTR 比较指令 CJNE A,direct,rel (共有4条)
使用散转指令前,先将各分支程序编写好,存放在程序存 储器中,并将各分支程序的入口地址组成一个表格放在 一起,把表首地址送入DPTR,把子程序的序号放入A中。
;把结果在P1.5口输出
3.3 分支程序设计
分支程序的主要特点是程序包含有判断环节,不同的条件
对应不同的执行路径。编程的关键任务是合理选用 具有逻辑判断功能的指令。由于选择结构程序的走
向不再是单一的,因此,在程序设计时,应该借助程序 框图(判断框)来明确程序的走向,避免犯逻辑错误。一 般情况下,每个选择分支均需单独一段程序,并有特定 的名字,以便当条件满足时实现转移。 1.单分支选择结构 当程序的判断是二选一时,称为单分支选择结构。通常用 条件转移指令实现判断及转移。单分支选择结构有三种 典型表现形式。
【例】 逻辑运算。逻辑操作是控制过程中经常使用的,掌握 逻辑运算的特点是提高程序效率的重要途径。在逻辑运算 中,进位标标志CY的地位很特殊,它是逻辑累加器,大多 数逻辑操作要通过CY来完成。用程序实现图4-2所示的逻 辑电路功能。
图3-2 逻辑电路
参考程序如下:
ORG 0000H
LJMP START
ORG 0100H MOV P1,#0FFH LOOP:MOV C,P1.1 ORL C, P1.2
CPL C ANL C,P1.0
CPL C MOV 07H,C MOV C,P1.3 ANL C,/P1.4
CPL C ORL C,07H MOV P1.5,C
SJMP $
END
;P1口初始化 ;P1.1与P1.2逻辑或运算 ;取反 ;C与P1.0逻辑与运算 ;暂存于07H单元中 ;P1.3与P1.4的反逻辑与运算
Y A←64H
A为负数? N
A=0? N
A←X+2
A←|X|
存数,(31H)←A(30H) 结束
参考程序如下:ORG 1000H
MOV A,30H
;取数
JB ACC.7,NEG
;负数,转NEG
JZ ZER0
;为零,转ZER0
ADD A,#02H
;为正数,求X+2
AJMP SAVE
;转到SAVE,保存数据
单片机程序设计
3.1汇编语言程序设计方法
汇编语言程序设计同高级语言程序设计一样,是有章可循 的,只要按照一定的方法步骤去做,程序设计就会变成一 件轻松愉快的事情,设计的程序也会规范、清晰、易读、 易懂。使用汇编语言设计程序大致上可分为以下几个步骤。 1. 分析题意,明确要求。 2. 确定算法。 3. 画程序流程图。 4. 分配内存工作单元。 5. 编写源程序。 6. 程序优化。 7. 上机调试。
3.2 顺序程序设计
【例】程序初始化。初始化就是为变量、寄存器、存储单元
赋一初值,是最简单、最常用的操作。如将R0-R3,P1,
30H,40H单元初始化为00H,把R4,R5初始化为0FFH。
参考程序如下:
ORG 0000H
;PC起始地址
LJMP START
;转主程序
ORG 0100H
;主程序起始地址
对于第三种形式,可用程序段1重复执行的次数作为判断条 件,当重复次数达到某一数值时,停止重复,程序顺序往下
执行。这是分支结构的一种特殊情况,这实际是循环结构程
序。用这种方式可方便实现状态检测。
【例】:LOOP: JB P1.1,LOOP 单分支程序一般要使用状态标志,应注意标志位的建立。
【例】设a存放在累加器A中,b存放在寄存器B中,若a≥0,
大家应该也有点累了,稍作休息
大家有疑问的,可以询问和交流
图3-3 单分支选择结构
(a)当条件满足时执行分支程序1,否则执行分支程序2。 (b)当条件满足时跳过程序段1,从程序段2顺序执行;否则,
顺序执行程序段1和程序段2。 (c)当条件满足时程序顺序执行程序段2;否则,重复执行程
序段1,直到条件满足为止。 由于条件转移指令均属相对寻址方式,其相对偏移量rel是个 带符号的8位二进制数,可正可负。因此,它可向高地址方向 转移,也可向低地址方向转移。
Y=a-b;若a<0,则Y=a+b。
这里的关键是判a是正数,还是负数;可通过判断ACC.7确定。
ORG 0000H
LJMP BR
ORG 0100H
BR: JB ACC.7,MINUS
;负数,转到MINUS
CLR C
;清进位位
SUBB A,B
;A-B
SJMP DONE
MINUS:ADD A,B
;A+B
DONE:SJMP $
;等待
END
2.双向分支程序设计举例 【例4.3】 设X存在30H单元中,根据下式
X+2 X>0
Y = 100 X=0
∣X∣ X<0
求出Y值,将Y值存入 31H单元。
解:根据数据的符号位判别该数的正负, 若最高位为0,再判别该数是否为0。程序 流程如图4-4所示。
开始 取数,A←(30H)
START:MOV R0,#00H
;初始化
MOV R1,#00H
MOV R2,#00H
MOV R3,#00H
MOV P1,#00H
MOV R4,#0FFH MOV R5,#0FFH MOV 30H,#00H MOV 40H,#00H HERE:SJMP HERE ;反复执行该指令,相当于等待
END 用立即数比较直观,但用MOV A,#00H ,MOV R0, A 指 令赋值,效果更好。
ZER0:MOV A,# 64H ;数据为零,Y=100
AJMP SAVE
;转到SAVE,保存数据
NEG:DEC A
CPL A
;求பைடு நூலகம்X∣
SAVE: MOV 31H,A
;保存数据
SJMP $ ;暂停
2.多分支选择结构 当程序的判别输出有两个以上的出口流向时,称为多分支选 择结构。8051的多分支结构程序还允许嵌套,即分支程序中 又有另一个分支程序。汇编语言本身并不限制这种嵌套的层 次数,但过多的嵌套层次将使程序的结构变得十分复杂和臃 肿,以致造成逻辑上的混乱。多分支选择结构通常有两种形 式,如图4-4所示。
在8051指令中,还有4条功能极强的比较转移指令: CJNE A,direct,rel CJNE A,#data,rel CJNE Rn,#data,rel CJNE @Ri,#data,rel 这4条指令对指定单元内容进行比较,当不相等时程序作相