考试范围:PPT,作业
实验20%平时30%考试50%
奶妈の单片机笔记
第〇章 概述
单片机概念:单片机,全称单片微型计算机(英语:single-chip microcomputer),又称微控制器(microcontroller),是把中央处理器、存储器、定时/计数器(timer/counter)、各种输入输出接口等都集成在一块集成电路芯片上的微型计算机
单片机应用 :家用电器 。办公自动化领域 。工业自动化领域。智能仪表 。汽车电子、航空航天领域 。
特点:结构紧凑,成本低。使用灵活,方便。 易构成嵌入式系统
理解内部结构图:
第一章 单片机基本结构
51单片机内部结构: I/O端口。振荡器、时钟电路与时序。复位电路。存储器。
CPU,运算器:
进行算术逻辑运算
位处理操作和数据传送
ALU,暂存器(TMP),ACC,B,PSW
算术逻辑运算单元ALU:完成基本的算术运算、逻辑原酸和位处理操作
暂存器:作为ALU的两个输入,暂时存放参加运算的数据
累加器ACC:8位寄存器,使用频率最高,是ALU运算所需数据的来源之一,也是数据传送的中间站。
寄存器B:执行乘除法指令前,用来存放乘数或除数,另一个输入来自于ACC,指令完成后B存放乘积的高8位或除法的余数,也可以作为一般用途的寄存器。
程序状态寄存器PSW
8位标志寄存器 ◦用来存放当前指令执行后的有关状态,为以后指令的执行提供状态条件。
CY: 高位进位标志
AC: 辅助进位标志(低半字节向高半字节进位)
F0: 用户标志位
RS1,RS0: 工作寄存器组选择位
OV: 溢出标志位(运算结果超出了目的寄存器A所能表示的符号数的范围(-128~+127)
—: 保留位
P: 奇偶校验标志位
标志位 ◦RS1,RS0: 工作寄存器组选择位 ◦OV: 溢出标志位(运算结果超出了目的寄存器A所能表示的符号数的范围(-128~+127) ◦—: 保留位 ◦P: 奇偶校验标志位
中央控制器
控制指令的读入、译码和执行,并对指令执行过程进行定时和逻辑控制
PC, IR, ID, SP, DPTR
程序计数器PC:
16位计数器
存放下一条将要执行程序的地址
寻址范围64KB(0000H~FFFFH)
复位时PC内容为0000H(程序必须从程序存储器0000H单元开始执行)。
指令寄存器IR:存放指令代码
指令译码器ID:产生指令执行所需要的控制信号
堆栈指针SP
栈顶地址有SP指示
RAM中开辟堆栈
先进后出
数据指针寄存器DPTR
16位
可分开为两个8位寄存器(DPL, DPH)
I/O端口,I/O口一位锁存器和缓冲器结构
P3口的第二功能
P3.0——RXD(串行输入口)。
P3.1——TXD(串行输出口)。
P3.2——INT0(外部中断0)。
P3.3——INT1(外部中断1)。
P3.4——T0(定时器0外部输入)。
P3.5——T1(定时器1外部输入)。
P3.6——WR(外部数据存储器写控制)。
P3.7——RD(外部数据存储器读控制)。
I/O端口总结
时钟电路
时序
MCS-51单片机的复位(理解透了)
理解复位电路:
存储器
MCS—51系列单片机其存储结构特点是:
将程序存储器和数据存储器分开,并有各自的寻址机构和寻址方式,这种结构的单片微机称为哈佛型结构单片微机。
在物理上
有4个相互独立的存储空间:
片内和片外程序存储器;片内和片外数据存储器。
在逻辑上
有三个彼此独立的地址空间:
1、片内外统一编地址的64KB程序存储器地址间;
2、256字节的片内数据存储器地址空间;
3、64KB片外数据存储器地址空间
数据存储器(RAM)
程序存储器(ROM)
掩膜存储器ROM(出厂固化)
可编程只读程序存储器PROM(可擦写一次)
紫外线可擦写只读存储器EPROM(可反复擦写,但时间较长)
电可擦写只读存储器E2PROM
电可擦写闪速只读存储器FLASH
程序存储器
作用:存放程序和常量(如表格数据)
寻址范围:64KB
程序计数器PC——地址指针(16位)
片内ROM(8051 4k,8052 8k)
片外ROM(可扩展64k)
数据存储器总结(看一看就可以):
1)根据地址总线宽度,在片外可扩展的存储器最大容量为64KB,地址范围为0000H~FFFFH。
2)片外数据存储器与程序存储器的操作使用不同的指令和控制信号,允许两者的地址重复。因此,片外要扩展的数据存储器与程序存储器各为64KB。
3)片外数据存储器与片内数据存储器的操作指令亦不同(对片外RAM用MOVX指令),所以也允许两者的地址重复,内部数据存储器的地址00 ~ FFH,外部扩展数据存储器的地址可以从0000H ~ FFFFH。
注意:采用R0、R1或DPTR寄存器间址方式访问片外数据存储器。当采用R0、R1间址时只能访问低256字节,采用DPTR间址可访问整个64K字节空间。
第二章 51单片机汇编语言
重点:
指令的寻址方式、功能、使用方法 。
程序设计的一般方法和技巧。
熟悉111条基本指令,7种寻址方式。
寻址方式
一、立即寻址
立即寻址是指在指令中直接给出其操作数,该操作数称为立即数。为了与直接寻址指令中的直接地址相区别,在立即数前面必需加上前缀“#”。
例如:MOV R0,#30H
二、直接寻址
直接寻址是指在指令中直接给出存放数据的地址(注意:不是立即数,并且只限于片内RAM范围)。直接寻址只能访问特殊功能寄存器、内部数据存储器和位地址空间。
例如:MOV A,30H
三、寄存器寻址
寄存器寻址是指指令中的操作数为寄存器中的内容。
例如:MOV A,R1
四、寄存器间接寻址
寄存器间接寻址是指指令中的操作数在寄存器的内容所指的地址单元中。
例如:MOV R1,#30H ;把立即数30H送R1寄存器
MOV A,@R1 ;把30H单元中的数送到A中
五、变址寻址
变址寻址用于访问程序存储器中的一个字节,该字节的地址是:基址寄存器(DPTR或PC)的内容与变址寄存器A中的内容之和。
例如: MOV DPTR,#3000H ;立即数3000H送DPTR
MOV A,#02H ;立即数02H送A
MOVC A,@A+DPTR ;取ROM中3002H单元中的数送A
六、相对寻址
以PC当前值为基准,加上相对偏移量rel形成转移地址
转移范围:以PC当前值起始地址,相对偏移在-128~+127 字节单元之间。相对寻址方式为相对转移指令所采用。
转移的目的地址为:
目的地址=转移指令所在地址+转移指令字节数+rel
七、位寻址
位寻址是指对片内RAM的位寻址区(20H~2FH)、可以位寻址的专用寄存器的各位,并进行位操作的寻址方式。
例如:MOV C,00H ;把20H单元中D0位的值送C位
MOV P1.0,C ;把C位中的值送P1口的D0位
SETB 20H. 0 ;把00H位
位地址的表示方法
位名称 例:CY、RS0
寄存器名加序号 例:ACC.1、P0.1
字节地址加序号 例:20H.3
直接位地址 例:00H、 07H
操作数的7种寻址方式和寻址的空间
指令分类介绍
MCS—51汇编语言指令格式如下:
标号:操作码 操作数1,操作数2,操作数3 ;注释
其中标号实际上为符号地址,表示这条指令在程序存储器中的存放首地址,以字母开始,后可跟1~8个字母或数字,但标号不能用操作码或专用符号。
操作码规定了指令的具体操作。
指令中的操作数为指令的具体操作对象,有些指令中有3个操作数,有些只有一个,有些无操作数,仅有操作码。
一、数据传送与交换类指令
特点:除第一操作数为A的指令影响P位外,其它并不影响标志位
有三种传送指令
MOV 片内RAM和特殊功能寄存器之间的传送
MOVX 片外RAM与ACC之间的传送
MOVC 程序存储器的数据送ACC
1)以累加器ACC 为目的操作数
.MOV A ,Rn ;
. MOV A, direct;
MOV A, @Ri (R1,R0)
MOV A, #data
2)以 Rn 为目的操作数
MOV Rn, A
MOV Rn, direct
MOV Rn, #data
3)以直接地址为目的操作数
MOV direct,A
MOV direct,Rn
MOV direct,#data
MOV direct,@Ri(R1,R0)
MOV direct,direct ;
4)以 寄存器间址 为目的操作数
MOV @Ri, direct;
MOV @Ri, A;
MOV @Ri, #data
5)16位数据送数据指针 DPTR
MOV DPTR,#Ddata16
例如:MOV 30H,#7AH ;将立即数7AH送片内RAM 30H单元中
MOV R0,#30H ;将立即数30H送R0寄存器
MOV A,@R0 ;将R0指定的30H中的数7AH送A中
MOV DPTR,#1000H ;将1000H送DPTR寄存器
MOVX @DPTR,A
练习:将R1中的内容送R2
2.用于片外RAM传送的指令(共4条)
片外RAM单元的地址为16位,一般用DPTR间接寻址;也可使用Ri来间接寻址(低8位编址时)。
1)外部RAM低256字节单元与A之间的传送
MOVX A, @Ri
MOVX @Ri, A
2)64KB外部RAM单元与A之间的传送
MOVX A,@DPTR
MOVX @DPTR, A
例: MOV DPTR, #2000H
MOVX A,@DPTR ;将外部RAM中2000H单元内容→A
思考:将片内RAM 50H单元
内容 →片外RAM 5000H单元
3.用于ROM传送的指令(共2条)
MOVC A,@A+DPTR ;(A)←((A)+DPTR))
MOVC A,@A+PC ;(A)←((A)+(PC))
以PC的当前值为基址,A为变址
例:在ROM 1000H开始存有5个字节数,编程将第二个字节数取出送片内RAM 30H单元中。程序段如下:
MOV DPTR,#1000H ;置ROM地址指针(基址)DPTR
MOV A,#01H ;表内序号送A(变址)
MOVC A,@A+DPTR ;从ROM 1000H单元中取数送到A
MOV 30H,A ;再存入内RAM 30H中
ORG 1000H ;伪指令,定义数表起始地址
TAB: DB 55H,67H,9AH,…;在ROM 1000H开始的空间中定义5个
; 字节
例:设某数N已存于20H单元(N≤10),查表求N平方值,存入21H单元。
程序段如下:
MOV A,20H ;取数N
ADD A,#01 ;加查表偏移量
MOVC A,@A+PC ;查表
NOP
TAB:DB 00H,01H,04H,09…… ;定义数表
由于PC为程序计数器,总是指向下一条指令的地址在执行第二条指令“MOVC A,@A+PC”时,在查表前应在A累加器中加上该指令与表之间的偏移量。
用DPTR查表时,表格可放在ROM的64K范围(不用考虑偏移量),用MOVC A,@A+PC指令时则必须把表格就放在该条指令下面开始的255个字节的空间中。
4.交换指令(共5条)
其中3条为整个字节相互交换,XCHD指令为低4位相互交换,SWAP为ACC中的高、低4位互换。
1)字节交换
XCH A, Rn ; (A)←→(Rn)
XCH A, direct
XCH A, @Ri
2)半字节交换
XCHD A, @Ri ;
SWAP A
例:已知(A)=34H,(R6)=29H,执行以下指令后,(A)=?
XCH A,R6
SWAP A
思考:用不同的方法实现片内RAM
(20H)→R1
5.堆栈操作指令(共2条)
堆栈是在内RAM开辟的一个数据的暂存空间,遵守“后进先出”原则操作,其地址指针为SP,它指出栈顶的位置,复位时SP=07H。
入栈:PUSH direct ;SP先增1,再将数据压栈。
出栈;POP direct ;数据先出栈,再SP减1。
例如,已知(A)=44H,(30H)=55H,执行
MOV SP,#5FH ;栈起点设置为5FH
PUSH ACC ;A中的44H压到60H中保存
PUSH 30H ;30H中的55H压到61H中保存
POP 30H ;把61H中的55H弹出到30H
POP ACC ;把60H中的44H弹出到A中
【例】 将片内RAM 30H单元与40H单元中的内容互换。
方法1(直接地址传送法):
MOV 31H,30H
MOV 30H,40H
MOV 40H,31H
SJMP $
方法2(间接地址传送法):
MOV R0,#40H
MOV R1,#30H
MOV A,@R0
MOV B,@R1
MOV @R1,A
MOV @R0,B
SJMP $
方法3(堆栈传送法):
PUSH 30H
PUSH 40H
POP 30H
POP 40H
SJMP $
方法4(字节交换传送法):
MOV A,30H
XCH A,40H
MOV 30H,A
SJMP $
二、算术运算类指令
加法和减法指令的第一操作数都是A,并将运算结果放在A中
算术运算类指令有加、减、乘、除法指令,增1和减1指令,十进制调整指令,共24条,使用时应注意判断各种结果对哪些标志位(CY、OV、AC、P)产生影响。
1.不带进位的加法指令ADD(4条)
ADD A,Rn ;A←(A)+ (Rn)
ADD A,direct ;A←(A)+(direct)
ADD A,@Ri ;A←(A)+ ((Ri))
ADD A,#data ;A←(A)+ data
练习3-3 98H+75H
分析各标志位的置位情况
例:将双字节数(R2)(R3)右移一位
CLR C
MOV A,R2
RRC A
MOV R2,A
MOV A,R3
RRC A
MOV R3,A
分析执行过程
四、控制程序转移类指令
控制程序转移类指令主要功能是控制程序转移到新的PC所指地址去执行程序。
1.无条件转移指令(4条)
(1)长转移指令
LJMP addr16 ;PC ← addr16 范围 64K
(2)绝对转移指令
AJMP addr11 ;PC10~0 ← addr11
指令中包含有11位的目的地址(a10 a9…… a0), PC 高5位不变
*转移范围2K字节 ——目的地址必须和 PC+2 在同一页内
*机器码为两字节
a10 a9 a8 0 0 0 0 1
a7---------------a0
(3)短(相对)转移指令
SJMP rel ; PC ← PC + 2 + rel
其目的地址是由PC中的当前值和指令的第二字节中带符号的相对地址相加而成的。因此本指令转移的范围为:下一条指令的(-128~+127)字节内,即本指令的(-126~+129)字节内。
实际应用时,addr16、addr11、rel一般用符号地址形式。
(4)间接转移指令(又称散转指令)
JMP @A+DPTR ;PC ← (A) + (DPTR
目的地址由指针DPTR和变址A的内容之和形成,范围达 64K 。
2.条件转移指令(8条)
此类指令均为相对寻址指令。
(1)累加器判零转
JZ rel;A=0 转,PC=PC+2+rel
JNZ rel;A<>0转
(2)CY位条件判转
JC rel; CY=1 转PC=PC+2+rel
JNC rel;CY=0 转
(3)数值比较转 均为三字节
CJNE A,#data,rel
CJNE A,direct,rel
CJNE Rn,#data ,rel
CJNE @Ri,#data, rel
指令功能为两数比较不相等 转移,操作过程为
第一数减第二数 状态标志送PSW,但不改变原来 的操作数
注意:参与比较的数为无符号数
(4)可寻址位条件判转 (三字节)
JB bit,rel; (bit)=1 转
JNB bit,rel ;(bit)=0 转
JBC bit,rel ;(bit)=1 转, 并将该位清零
(5)循环控制指令DJNZ
DJNZ Rn,rel
DJNZ direct,rel;
指令功能是把源操作数减1,结果送回原操作数中,再判结果不为0就转到目的地去,否则继续下面一条指令执行。
主要应用在循环结构的编程中,作循环结束控制用。
条件转移指令的应用:
根据A中的数是大于/等于/小于64H这三种情况去执行三种不同的处理程序。
比较两无符号数的大小 求R1、R2中较大的数,结果存R3 中。
解: ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:MOV A,R1
CJNE A,02H,NEXT
NEXT:JC/JNC DONE (?)
MOV A,R2
DONE:MOV R3,A
LP:SJMP JP
END
3.子程序调用及返回指令(4条)
(1)长调用指令
LCALL addr16 ;PC←PC+3,SP←SP+1,(SP)←PC7~10
SP←SP+1,(SP)←PC15~8 , PC←addr16
(2)绝对调用指令
ACALL addr11;PC ←PC+2,SP←SP+1,(SP)←PC7~0
SP ← SP+1,(SP)← PC15~8,PC10~0←addr1
(3)子程序返回指令
RET
(4)中断返回
RETI
注意:不能用RET指令代替RETI。
4.空操作指令(1条)
NOP; 指令的执行时间为一个机器周期,占一个字节。
五、位操作类指令
1.位传送指令(2条)
MOV C,bit; C←(bit)
MOV bit,C; bit←C
指令中必须有一个位操作数是布尔累加器C,另一个才可以是直接可寻址的位。
例:MOV P1.5,C;把C中的值送到P1.5口线输出
2.位修改指令(6条)
CLR C ; C←0
CLR bit ;(bit)←0
SETB C ;C←1
SETB bit ;(bit)←1
CPL C ;C←/C
CPL bit ;(bit)←/(bit)
五、位操作类指令
3.位逻辑运算指令(4条)
这组指令的第一操作数必须是C,两位逻辑运算的结果送C中,式中的斜杠是位取反,但并不影响操作数本身的值。
ANL C,bit ; C←C∧(bit)
ANL C,/bit ;C←C∧/(bit)
ORL C,bit ;C←C∨(bit)
ORL C,/bit ; C←C∨/(bit)
程序设计方法
用汇编语言编写程序,一般可分为以下几个步骤:
1)分析题意,确定算法;
2)设计程序流程图;
3)确定数据结构:合理地选择和分配内存单元以
及工作寄存器;
4)编写源程序:
5)上机调试程序。
MCS-51单片机汇编语言,包含两类不同性质的指令。
(1)基本指令:即指令系统中的指令。它们都是机器能够执行的指令,每一条指令都有对应的机器码。
(2)伪指令:汇编时用于控制汇编的指令。它们都是机器不执行的指令,无机器码
汇编语言的语句格式
汇编语言一般由四部分组成。
标号: 操作码 操作数 ;注释
START: MOV A,30H ;A←(30H)
(1)标号段 —— 标号是用户根据需要设定的符号地址。通常是在一段程序的入口或程序的转向点设置一个标号。使用标号便于程序的阅读、修改及转移指令的书写。标号由英文字母开头的1~8个字母数字串组成。
标号以“:”结束,且同一个标号名在一个程序中只能使用一次,不能重复定义。
(2)操作码段——即指令系统中的助记符。它规定了语句执行的操作属性,是不可缺少的。
(3)操作数段——操作数用于给指令的操作提供具体数据和地址。
操作数可以是一项或用逗号分开的两项、三项,也可以是空白(例如DA A 指令)。
(4)注释段——注释用于对语句或一段程序进行解释和说明,有利于交流和阅读。注释的长度不限,但应尽量简明扼要。注释与操作数之间用“;”分开。
一、伪指令简介
1.分支程序
1.分支程序
例:设X,Y均为带符号数,
存放在地址为M和N单元中,
编程计算Y=f(x)
1 当x>0
Y = 0 当x=0
-1 当x<0 思路: 进行两次判断,第一次 利用指令JZ,第二次利用 指令JNB判断此符号位。 M EQU 40H ;定义数据地址 N EQU 41H ORG 0100H MOV A,M ;取出X JZ NEXT2 ;当X=0,则跳转到NEXT2 JNB ACC.7,NEXT1 ;当X>0,则跳转到NEXT1
MOV A,#0FFH ;当X<0,把-1的补码送A SJMP NEXT2 NEXT1: MOV A,#01H ;当X>0,01H送A
NEXT2: MOV N,A ;存结果
SJMP $
当程序出现多重分支时,常用无条件间接转移指令实现散转。
JMP @A+DPTR
下面是一个实现5种分支转移的程序:
MOV DPTR,#JTAB ;转移指令表首地址送DPTR
MOV A, #NUM ;转移分支编号(0~4)送A
MOV B , #03H
MUL AB
JMP @A+DPTR
JTAB: LJMP CASE0
LJMP CASE1
LJMP CASE2
LJMP CASE3
LJMP CASE4
2.循环程序
☆循环程序一般包括如下四个部分:
(1)初始化 (2)循环体
(3)循环控制 (4)结束
☆循环程序按结构形式,有单重循环与多重循环。
☆在多重循环中,只允许外重循环嵌套内重循环。
☆不允许循环相互交叉,也不允许从循环程序的外部跳入循环程序的内部。
循环/结束控制常有两种结构:一种为计数器控制循环结构;一种为条件控制循环结构。循环程序的一般结构如图
(1)单循环程序
在片内RAM 40H开始存放了一串单字节数,串长度为8,编程求其中最大值并送R7中。
思路:对数据块中的数逐一两两相比较,较大值暂存于A中,直到整串比完,A中的值就为最大值。
MOV R0,#40H ;数据块首址送地址指针R0
MOV R2,#7 ;循环次数送R2
MOV A,@R0 ;取第一个数,当作极大值
LOOP: INC R0 ;修改地址指针
MOV B,@R0 ;暂存B中
CJNE A,B,NEXT ;比较后产生标志(CY)
NEXT : JNC NEXT1 ;CY=0?
MOV A,@R0 ;更大数送A
NEXT1: DJNZ R2,LOOP ; 循环次数结束?
MOV R7,A ;存最大值
练习:外部RAM3000H 开始有 50个数传送到内部RAM 30H开始的区域
算法分析:取地址指针DPTR=3000H、 R0=30H、计数器R7=50
MOV DPTP,#3000H
MOV R0,#30H
MOV R7,# 32H
LOOP:MOVX A,@DPTR
MOV @R0,A
INC DPTR
INC R0
DJNZ R7,LOOP
SJMP $
END条件判断控制循环
设在外RAM的TAB处开始有一个ASCⅡ字符串,该字符串以0结尾,编程把他们从80C51的P1口输出。
MOV DPTR,#TAB ;设字符串首地址指针
SOUT:MOVX A,@DPTR ;取字符
JZ NEXT ;整串结束则转跳
MOV P1,A
INC DPTR ;修改地址指针
SJMP SOUT ;没结束继续取数发送
NEXT: ┋ ;结束处理
ORG 2000H
(2)多重循环
多重循环就是循环的嵌套,既一个循环程序包含了其他循环程序,即循环内套循环的结构形式,也称多重循环。一般内层循环完成后,外层才执行一次,然后再逐次类推,层次分明。
三、分支程序与循环程序设计
2ms延时程序,已知晶振频率为12MHZ,则机器周期为1us。
解:DELAY2ms:MOV R7,#10 ;1T
DL1:MOV R6,#48 ;1T
DL2:NOP ;1T
NOP ;1T
DJNZ R6, DL2 ;2T
DJNZ R7, DL1 ;2T
RET ;2T
该段程序耗时为: 1+[1+(1+1+2)×48+2]×10+2 = 1953 (us)
第三节 程序设计方法
四、子程序及其调用程序设计
所谓调用子程序,暂时中断主程序的执行,而转到子程序的入口地址去
执行子程序,子程序执行完后返回主程序继续执行。
子程序的形式与要求:
1)名称、地址、功用(标明子程序的入口地址或名称,以方便调用);
2)指出入口与出口参数,以正确进行参数传递;
参数传递 —— 在调用子程序前,主程序应先把有关参数(即入口参数)放到某些约定的位置,子程序在运行结束返回前,也应该把运算结果(出口参数)送到约定的位置/ 单元。常采用工作寄存器或累加器、地址指针寄存器或堆栈。
3)注意保护现场
5)子程序的末尾用RET返回指令结束;
有关指令:
1、进栈操作 PUSH direct;
2、出栈操纵 POP direct;
3、子程序的调用
1)绝对调用指令
ACALL addrll;断点入栈----PC当前值, SP ←(SP)+2
PC11~15保持不变,addr11---PC底11位
2)长调用指令
LCALL addr16;(PC)+3---PC , 断点入栈
转地址addr16执行
分析入口参数? 出口参数?
编程完成20H~28H和30H~39H两段区域清零.
例3-19(P54):在内RAM40H、50H开始的空间中,分别存有单字节的无符号数据块,长度分别为12和8。编程求这两个数据块中的最大数,存入MAX单元。
思路:用子程序求某数据块的最大值,
入口参数:数据块的首地址存入R0,长度存入R2,出口参数在A中,即最大数。
FMAX: MOV A,@R0 ;取第一个数
LOOP0: INC R0
MOV B,@R0 ;取下一个数
CJNE A,B,$+3 ;比较
JNC LOOP1
MOV A,B ;把大的数送A
LOOP1:DJNZ R2,LOOP0
RET ;出口参数在A中
主程序 ORG 1000H
MAX EQU 30H
MOV R0,#40H ;设置入口参数R0,R2
MOV R2,#12-1
ACALL FMAX
MOV MAX,A ;出口参数暂存MAX中
MOV R0,#50H ;设置入口参数R0,R2
MOV R2,#8-1
ACALL FMAX
CJNE A,MAX,$+3 ;比较两个数中较大值
JC NEXT
MOV MAX,A
NEXT:SJMP $
3.用堆栈来传递函数
方法:在调用子程序之前,先把参与运算的操作数压入堆栈;在执行子程序过程中,通过堆栈指针SP间接访问到堆栈中的操作数,取出参加运算,最后把运算的结果压入堆栈,由主程序再从堆栈中弹出结果。
第四节 应用程序设计举例
一、非数值运算程序设计举例
例3-21:将8位二进制数据转换为压缩式BCD码。
例3-23: 编程求带符号数组中正数、零和负数的个数。
#对数组数据处理时,常采用寄存器间接寻址方式,并为循环程序结构。
#确定正数、零、负数的个数时用JZ(JNZ)和 JB(JNB)等指令。
例3-24: 片外RAM中无符号数按递减次序重新排列。
# 将(DPH)→P2后,用@Ri寻址
# 采用“冒泡法”进行排序,R7外循环次数计数器,R6内循环次数计数器
注意问题:由于调用子程序时,主程序的断点地址被自动压入堆栈,占用了堆栈的两个字节,所以在子程序中弹出参数时一定要用修改SP指针,指向该参数;同时,在子程序返回指令RET之前一定要作相应修改SP指令,以便SP指向断点地址,确保能正确返回主程序。
ORG 0000H
MAIN: MOV R0,#30H置数据地址指针
MOV 40H,#00;结果单元清零
MOV 41H,#00;
MOV 42H,#00;
MOV R2,#10;置循环次数
LOOP :MOV A,@R0
JNZ NEXT1
INC 41H ;为零,个数加1
SJMP DONE
NEXT1 : JB ACC.7,NEXT2 ;
INC 40H ;正数个数加1
SJMP DONE
NEXT2:INC 42H ;负数个数加1
DONE: INC R0
DJNZ R2 , LOOP
SJMP $
二、算术运算程序设计
例1:多字节BCD码加法程序
多字节BCD码加法同样从低字节开始相加(ADDC),但在加法指令后必须是(DA A)指令。注意和的字节数,及子程序返回时和的首地址处理。
例2:多字节无符号数减法子程序。
减法只有SUBB指令,注意多字节数运算时先清借位。另外注意差的符号标志处理。
例3:乘除法程序
MCS-51指令系统自有8位的乘法和除法指令,进行16位或更多位的乘除运算时须编程实现。
乘法——用8位乘法指令编程实现
除法——用移位相减的方法编程实现
例:16位×8位无符号数乘法
例4:双字节无符号数除法子程序
入口参数:被除数R5R4,除数R3R2。
出口参数:商放在R5R4,余数R7R6,
溢出标志00H。
算法分析: “移位相减”法,余数寄存器R7R6都清0;将余数寄存器R7R6与被除数寄存器R5R4都左移一位;将余数寄存器R7R6与除数R3R2作比较,若大于除数,则商上1(商放在R5R4刚才左移一位空出的部分),并用R7R6减去除数R3R2,然后再同样R7R6R5R4都左移一位,重复上述过程.直到被除数的各位都参与这运算为止。
最后结果:商在R5R4中,余数在R7R6中。如对余数需要四舍五入,可先判余数最高位为1吗?若为1,商加1;否则将余数乘2再与除数比较,若大于除数则说明原余数大于除数的一半,商也应加1。
三、I/O口控制程序设计
例1:要求在P1.0脚上产生周期为20ms的方波。
FB: CPL P1.0 ;P1.0取反
ACALL DL10ms
SJMP FB
DL10ms: ┋ ;延时10ms的子程序
RET
例2:编写一程序,实现图中的逻辑运算电路。其中P3.1、P1.1、P1.0分别是单片机端口线上的信息,30H、31H是两个位地址,运算结果由P1.0输出。
例3:如图所示,编程实现当按K一次则蜂鸣器“嘀、嘀”响二声。
STA: MOV R2,#2
CLR P1.4
STA1: JB P1.0,STA1
LCALL DL10ms
JB P1.0,STA1
JNB P1.0, $
LOOP: SETB P1.4 ;产生二个短脉冲
LCALL DL300ms
CLR P1.4
LCALL DL300ms
DJNZ R2, LOOP
LJMP STA
DL10ms: ┋ ;延时10ms的子程序
RET
例4:8只LED发光二极管在圆周上均匀分布,控制原理图见图3-20,编一控制程序实现单一发光点的顺转和逆转,点亮间隔时间都为1秒,重复循环。
第三章 中断系统
中断请求标志(理解)
(1)TCON的中断标志
TCON是专用寄存器,字节地址为88H,它锁存了外部和的中断请求标志及T0和T1的溢出中断请求标志
1)IT0:选择外部中断0(INT0)触发方式控制位。 IT0=0 INT0为电平触发方式。
2)IE0:外部中断0请求标志位。IE0=1,外部中断0向CPU申请中断。
3)IT1:选择外部中断1(INT1)触发方式控制位。
4)1E1:外部中断1请求标志位。IE1=1时,外部中断1向CPU申请中断。
5)TF0:片内定时器T0溢出中断请求标志。T0被启动后,从初始值开始进行加1计数,当最高位产生溢出时置TF0=1,向CPU申请中断,直到CPU响应该中断时,才由硬件自动将TF0清0,也可由软件查询该标志,并用软件清0。
6)TF1:片内定时器T1溢出中断请求标志,其操作功能与TF0类同。
(2)SCON的中断标志
SCON是串行口控制寄存器,与中断有关的是它的低两位TI和RI。
1) TI(SCON.1):串行口发送中断标志位。每发送完一个串行帧,由硬件置位TI。CPU响应中断时,不能清除TI,TI必须由软件清除。
2)RI(SCON.0):串行口接收中断标志位,当允许串行口接收数据时,每接收完一个串行帧,由硬件置位RI。同样,RI必须由软件清除。
例1 一个外部中断源时的编程
如图所示电路,设外部中断信号为负脉冲,引入外部中断1引脚。要求每中断一次,从P1.4~P1.7输入外部开关状态,然后从P1.0~P1.3输出
程序清单:
ORG 0000H ;主程序
SJMP MAIN
ORG 0013H
AJMP INT1 ;转入服务程序
ORG 0030H
MAIN: SETB IT1 ;设INT1为边沿触发
SETB ET1 ;允许INT1中断
SETB EA ;开放总允许
SJMP $
INT1: ORL P1,#0F0H ;中断服务程序:
MOV A,P1 ;从P1口输入开关状态
SWAP A ;交换高、低4位
MOV P1,A ;输出
RETI
第四章 定时/计数器
一、定时/计数器的逻辑结构(理解)
二、定时/计数器的工作原理
定时/计数器的核心部件是加1计数器,其输入的计数脉冲有两个来源。当加到计数器为全“1”时,再输入一个脉冲,就使计数器回零,同时产生溢出脉冲使TCON中溢出中断标志TF0或TF1置1,并可向CPU申请中断。
1.定时器工作方式时,对机器周期TM计数。这时计数器的计数脉冲由振荡器的12分频信号产生,即每经过一个机器周期,计数值加1,直至计满溢出。在机器周期固定的情况下,定时时间的长短与计数器事先装入的初值有关,装入的初值越大,定时越短。
2.计数器工作方式时,通过引脚T0(P3.4)和T1(P3.5)对外部脉冲信号计数。当T0或T1脚上输入的脉冲信号出现由1到0的负跳变时,计数器值加1。
一、定时/计数器的管理与控制 (一定要记住)
1.工作方式寄存器TMOD
用于选定定时/计数器的工作方式、启动方式等。
二、定时/计数器的工作方式
通过控制TMOD中的M1,M0位选择定时器4种工作方式。这4种工作方式的实质是对T0(或T1)的两个8位计数器TH0、TL0(或TH1、TL1)的计数操作方式而言。
方式0下工作时:
(1)C/T=1为计数工作方式,计数脉冲由T1引脚输入。计数个数
N=( 213—初值x)
(2)C/T=0为定时工作方式,计数脉冲为时钟频率fosc/12。
定时时间t=(213—初值x)时钟周期12
X = 213-定时时间t/时钟周期*12
2.方式1
定时/计数器工作于方式1时为一个16位的计数器。其逻辑结构、操作及运行控制几乎与方式0完全—样,差别仅在于计数器的位数不同。
定时工作方式1时,定时时间为:
定时时间 t =(216-计数初值TC)×机器周期
用于计数器工作方式时,
最大计数值为: 216=65536
3.方式2
定时/计数器工作于方式2时,将两个8位计数器THx、TLx分成独立的两部分,组成一个可自动重装载的8位定时/计数器。其逻辑结构如图所示。
4.方式3
方式3只适用于定时器T0。在方式3下,T0被分成两个相互独立的8位计数器TL0和TH0,如图所示 。
定时/计数器的应用
一、定时/计数器计数初始化
(1)初始化步骤
1)分析定时器/计数器的工作方式,将方式字写入TMOD寄存器;
( 定/计、内/外启动、工作方式)
2)计算T0或T1中的计数初值,并将其写入TH0、TL0或TH1、TL1;
3)根据需要开放CPU和定时/计数器的中断,即对IE和IP寄存器编程;
4)启动定时器/计数器工作:若要求用软件启动,编程时对TR0或TR1置位即可启动;若由外部中断引脚电平启动,则对TR0或TR1置位后,还需给外引脚(或)提供启动电平。
定时/计数器初始化举例
编写初始化程序的步骤;
1)方式控制字送
TMOD MOV TMOD,#——
2)计数器的初值送TH、TL(0/1)
MOV TH0,#——
MOV TL0,#——
3)根据需要开放中断和设定优先级
即对IE和IP赋初值(可位寻址)
4) 启动T0/T1开始工作---置位TR0/1
SETB TR0/1
5)等待溢出信号的出现(如何进入处理程序?)
(查询法或中断法)
例4-2: 要求利用定时/计数器T0对T0引脚(P3.4)出现的脉冲计数,每计数100个脉冲向CPU申请中断,设由由软件启动。编写初始化程序段。
解:1)经分析,可设定时器T0工作于方式2计数,方式控制字为0000110B=06H
2)要求的计数值N=100,则计数初值为 28-100=156
初始化程序段如下:
MOV TMOD,#06H ;写入工作方式字
MOV TH0,#156 ;写入计数初值
MOV TL0,#156
SETB ET0 ;开放T0、 CPU中断
SETB EA
SETB TR0 ;启动T0工作
注意:方式2时初值必须同时写入TH和TL
定时/计数器计数应用举例
在应用定时/计数器时,溢出标志TFx置位后既可由硬件向CPU申请中断,也可通过用户程序查询TFx的状态,因此对计数溢出信息的处理有以下两种方法。
中断法——在定时器初始化时要开放对应的源允许(ET0或ET1)和总允许,在启动后等待中断。当计数器溢出中断,CPU将程序转到中断服务程序入口,因此应在中断服务程序中安排相应的处理程序。
查询法——既在定时器初始化并启动后,在程序中安排指令查询TFx的状态。
LP:JBC TF0,NEXT ;TF0为1,转后面的处理程序,并将TF0复位
SJMP LP ;TF0为0,继续查询
NEXT:┋
注意:中断法时,CPU响应中断会自动清TF
采用查询方式时的一般编程模式:
ORG 0030H
MAIN: MOV TMOD,#——
MOV TH0,#——
MOV TL0,#——
--------------
SETB TR0
WAIT: JBC TF0,NEXT;
SJMP WAIT;
NEXT:MOV TH0,#——;重装
MOV TL0,#—— ;初值
- --------- ;处理程序
- ---------
SLMP WAIT
采用中断方式时的一般编程模式:
ORG 0000H
SJMP MAIN
ORG 000BH (001BH)
LJMP T0FW
ORG 0030H
MAIN: MOV TMOD,#——
MOV TH0,#——
MOV TL0,#——
SETB ET0 ;
SETB EA ;
------------------ ;置其他初值
SETB TR0 ;
SJMP $
T0FW: ------------- ; 重装初值
-------------- ;处理程序
--------------
RETI
二、定时/计数器计数应用举例
1. 定时模式的应用
例4-3: 利用定时/计数器定时产生周期信号。要求用定时器T0定时,在P1.7引脚上输出周期为50Hz的方波。设晶振频率为12MHz。
解:1)按题意分析:方波周期T=1/50=20ms,可用T0方式1定时10ms,使P1.7每隔10ms取反一次,即可得到周期为20ms的方波。设T0工作在方式1,由软件启动。
2)TMOD控制字为 0000 0001 B
3)初值计算:fosc=12MHz,机器周期为1µs。
初值=216-10×103/1=65536-10000=55536=D8F0H,
即有TH0=D8H,TL0=F0H。
CPL P1.7 ; 定时处理,P1.7取反输出方波
例:要求用定时器T1定时,在P1.0引脚上输出如图方波。设晶振频率为12MHz。
解:1)按题意分析:可用T1为16位定时器模式(方式1)定时1ms。判断P1.0为高电平时,溢出二次才对端口取反。
2)TMOD控制字为 0001 0000 B
3)初值计算:fosc=12MHz,机器周期为1µs。
初值=216 - 12× 106 × 10-3 / 12= 65536-1000=64536=FC18H,
即 TH1=FCH,TL1=18H。
若采用查询法,编程如下:
ORG 0030H
STAR:MOV TMOD,#10H ;写入工作方式字
MOV TH1,#0FCH ;写入计数初值
MOV TL1,#18H
MOV R2 , #2
SETB TR1 ;启动T1
LOOP: JBC TF1,CPLP ; TF1为1转CPLP并清TF1
SJMP LOOP ; TF1为0转LOOP等待
CPLP:MOV TH1,#0FCH ;重装初值
MOV TL1,#18H
JB P1.0,CPLP1 ;P1.0为1转CPLP1
CPL P1.0 ;P1.0为0则取反
MOV R2,#2 ;R2重赋初值
AJMP LOOP ;转LOOP等定时时间到
CPLP1:DJNZ R2,LOOP ;2ms未到转LOOP
CPL P1.0 ;2ms到P1.0取反
AJMP LOOP ;转LOOP等定时时间到
END
计数模式的应用
例4-4: 某系统要求用定时器T1对由P3.5(T1)引脚输入的脉冲计数,每计满100个脉冲,在P1.0引脚输出一个正脉冲。
解:1)据题意分析,可将定时器T1设置为方式2计数,由软件启动。
2)方式控制 TMOD=01100000B=60H
3)计数初值 TC1=28-100=156=9CH,即有 TH1=TL1=9CH
例:T0即P3.4输入负脉冲,要求T0发生负跳变时P1.0输出如图同步脉冲。
第五章 串行口
重点:
MCS-51单片机串行接口的工作原理及工作方式
MCS-51单片机串行接口应用程序设计方法
一、 并行通信与串行通信(理解)
1.并行通信
并行通信是指所传送的数据各位同时进行传送。其优点是传送速度快,缺点是传输线多,通信线路费用较高,并行传送适用于近距离、传送速度高的场合。
2.串行通信
串行通信时,传送数据的各位按分时顺序一位一位地传送(例如先低位、后高位)。其优点是传输线少,传送通道费用低,故适合长距离数据传送。缺点是传送速度较低。
当通信的距离在30m以上时,应采用串行通信方式。
三、同步通信和异步通信
为了准确地发送、接收信息,发送者和接受者双方必须协调工作。这种协调方法,从原理上可分成两种:同步串行I/O和异步串行I/O。
1.异步通信方式
异步通信方式时,数据一帧一帧地传送,不需要同步时钟,实现简单。
在异步方式中,为了避免连续传送过程中的误差积累,每个字符都要独立确定起始和结束(即每个字符都要重新同步),字符和字符间还可能有长度不定的空闲时间。
二、串行口控制寄存器SCON
SCON是一个可位寻址的专用寄存器,用来设定串行口的工作方式、控制串行口的接收/发送以及状态标志。SCON的字节地址为98H,位地址为98H~9FH。其格式如下:
1)SM0、SMl:串行口工作方式选择位,可选择四种工作方式
2)SM2:为多机通信控制位
在工作方式2和方式3中:
若SM2=1:当接收到第9位数据(RB8)为1,才将接收到的前8位
数据装入SBUF,并置位RI;否则将接收到的数据丢弃。
若SM2=0:不论第9位数据(RB8)是否为1,都将接收到的前8位数
据装数据装入SBUF,并置位RI。
在方式1中:若SM2=1,则只有接收到有效的停止位时,才置位RI。
在方式0中:必须使SM2=0
多机通信时,SM2必须置1。双机通信时,通常使SM2=0。
3)REN:允许串行接收位。该位由软件置位或清零。
4)TB8: 在工作方式2或方式3时,该位为发送的第9位数据,可按需要由软件置位或清零。在许多通信协议中,该位常作为奇偶校验位。在MCS-5l多机通信中,TB8的状态用来表示发送的是地址帧还是数据帧,TB8=0时,为地址帧,TB8=1时,为数据帧。
5)RB8:在工作方式2或方式3时,存放接收到的第9位数据,代表着接收数据的某种特征。例如,可能是奇偶位,或为多机通信中的地址/数据标识位。
在方式0中,RB8未用。
在方式1中,若SM2=0,RB8是已接收到的停止位。
6)TI:发送中断标志位。方式0中,串行发送完第8位数据后,由硬件置位;在其它方式中,在发送停止位开始时,由硬件置位。TI=1时,表示帧发送结束,其状态既可供软件查询使用,也可申请中断。在任何方式中,TI都必须由软件清0。
7)RI:接收中断标志。在方式0中,接收完第8位数据后,由硬件置位;在其它方式中,当接收到停止位的中间时由硬件置位。RI=1时,表示帧接收结束,其状态既可供软件查询使用,也可申请中断。RI也必须靠软件清0。
单片机复位时,SCON中的所有位均为0。
注意:不管是否采用中断控制,数据发送前必须用软件将TI清零;接收数据后将RI清零;
三、电源控制寄存器PCON
PCON的直接地址为87H,不能位寻址。
PCON中只有最高位SMOD与串行口工作有关,其余几位用于电源的控制。PCON的格式如下:
SMOD:串行口波特率倍增位。
当SMOD=1时,串行口波特率加倍;复位时,SMOD=0。
MCS—51串行通信接口的工作方式
MCS—51单片机的串行口为可编程口,可编程选择四种工作方式,其中方式0主要用于扩展并行输入输出口,方式1~方式3为异步串行通信方式。
一、方式0
串行口工作方式0为同步移位寄存器输入输出方式,其数据传输波特率固定为foc/12。串行数据由RXD(P3.0)端输入/输出,同步移位脉冲由TXD(P3.1)端输出。数据的发送/接收以8位为一帧,低位在前,无起始位、奇偶位及停止位。
执行一条写SBUF指令就开始发送;接收完成后8位数据进入SBUF。
2.接收过程
当允许串行输入位REN置1后,开始接收数据。
当一帧数据接收完毕,将8位数据装入接收缓冲器SBUF,停止位装入RB8,井将RI置1,申请中断。
例5-1:选用定时器T1,工作方式2作波特率发生器,波特率为2400波特。已知fosc=11.0592MHz,求计数初值X。
解:设波特率控制位SMOD=0,不增倍时
X=256一(11.0592×106×20)/(384×2400)=0F4H
如果串行通信选用很低的波特率,设置定时器T1为方式0或方式l定时模式时,当T1产生溢出时,需要重装计数初值,故波特率会产生一定的误差。
五、SMOD位及晶振频率对串行通讯波特率的影响
可能产生误差
选用各种常用波特率时,T1的工作方式、计数初值及对应fosc的选用值见表5-2。
串行口的应用程序设计举例
一、方式0应用举例
方式0为同步移位寄存器式输入输出,8位数据从RXD(P3.0)引脚输入输出,由TXD(P3. 1)引脚输出移位时钟使系统同步,波特率固定为fosc/12。====
串行接口工作在方式0状态下,单片机和外接的移位寄存器结合扩展I/O接口。
编程如下: MOV R7,#14H ;设置读入字节数 MOV R0,#50H ;设片内RAM指针 SETB F0 ;设置读入字节奇偶数标志 RCV0: CLR P1.0 ;并行口输入数据 SETB P1.0 ;允许74165串行移位 RCV1: MOV SCON,#10H ;设串行口方式0并启动接收 JNB RI,$ ;等待接收一帧数据 CLR RI ;清接收中断标志 MOV A,SBUF ;取缓冲器数据 MOV @R0,A INC R0 CPL F0 JB F0,RCV2 ;判是否接收完偶数帧,
;接收完则重新并行置入
DEC R7 SJMP RCV1 ;否则再接收一帧 RCV2: DJNZ R7,RCV0 ;判是否已读入预定的字节数 ……… ;对读入数据进行处理
二、异步通信程序设计举例
串行口方式1用于点对点的异步通信
例5-3:设图5-11中,A机发送,B机接收,波特率2400bit/s,晶振6MHz,T1作为波特率发生器,串行口工作在方式1。A机送出数据为内部RAM 50H开始的16个字节数据。B机接收数据存放在外部RAM 3000H~300FH单元中,编写通信程序。
解:双机通讯串行口工作在方式1,定时器T1工作在方式2。
定时常数:X=256 -(fosc(SMOD+1))/( 384波特率)
若SMOD=0,则X=249.49,误差较大。 取SMOD=1,则X=242.98=243=F3H, 误差较小。
采用查询方式编程,A机发送程序如下:
MOV TMOD ,#20H ;定时器(波特率)初始化
MOV TL1 ,#0F3H
MOV TH1 ,#0F3H
CLR ET1 ;关定时器T1中断
SETB TR1 ;启动T1
MOV SCON ,#40H ;串行口初始化(方式1)
MOV PCON ,#80H ;SMOD=1
MOV R0 ,#50H
MOV R7 ,#10H
TRS: MOV A ,@R0
MOV SBUF ,A ;启动发送
WAIT: JBC TI ,CONT ;查询是否一帧数据发送完
AJMP WAIT
CONT: INC R0 ;一帧发送完,指针加1
CLR TI
DJNZ R7,TRS
B机接收程序:
MOV TMOD ,#20H ;定时器(波特率)初始化
MOV TL1 ,#0F3H
MOV TH1 ,#0F3H
CLR ET1 ;关定时器T1中断
SETB TR1 ;启动T1
MOV SCON ,#50H ;串行口初始化(方式1,允许输入)
MOV PCON ,#80H
MOV DPTR ,#3000H
MOV R7 ,#10H
WAIT: JBC RI ,READ ;等待接收一帧数据完
AJMP WAIT
READ:MOV A ,SBUF ;取接收数据存放
MOVX @DPTR ,A
INC DPTR
CLR RI
DJNZ R7 ,WAIT
第六章 键盘
第七章 显示
没啥可讲的
第八章 AD-DA
课上讲了...
发表评论