单片机原理及应用总结.docx
《单片机原理及应用总结.docx》由会员分享,可在线阅读,更多相关《单片机原理及应用总结.docx(25页珍藏版)》请在冰豆网上搜索。
单片机原理及应用总结
页眉内容
单片机原理及应用
第一章绪论
1.什么叫单片机?
其主要特点有哪些?
在一片集成电路芯片上集成微处理器、存储器、I/O接口电路,从而构成了单芯片微型计算机,即单片机。
特点:
控制性能和可靠性高、体积小、价格低、易于产品化、具有良好的性价比。
第二章80C51的结构和原理
1.80C51的基本结构
a.CPU系统
8位CPU,含布尔处理器;
时钟电路;
总线控制逻辑。
b.存储器系统
4K字节的程序存储器
(ROM/EPROM/FLASH,可外扩至64KB);
128字节的数据存储器(RAM,可
外扩至64KB);
特殊功能寄存器SFR。
c.I/O口和其他功能单元
4个并行I/O口;
2个16位定时/计数器;
1个全双工异步串行口;
中断系统(5个中断源,2个优先级)
2.80C51的应用模式
a总线型单片机应用模式
总线型应用的“三总线”模式;非总线型应用的“多I/O”模式
3.80C51单片机的封装和引脚
a总线型DIP40引脚封装
RST/Vpo:
复位信号输入引脚/备用
电源输入引脚;
ALE/PROG:
地址锁存允许信号
输出引脚/编程脉冲输入引脚;
EA/Vpp:
内外存储器选择引脚/片
内EPROM编程电压输入引脚;
PSEN:
外部程序存储器选通信号
输出引脚
b.非总线型DIP20封装的引脚
RST:
复位信号输入引脚
4.80C51的片内存储器
增强型单片机片内数据存储器为256字节,地址范围是00H~FFH。
低128字节的配情况与基本型单片机相同。
高128字节一般为RAM,仅能采用寄存器间接寻址方式询问。
注意:
与该地址范围重叠的特殊功能寄存器SFR空间米用直接寻址方式询问。
5.80C51的时钟信号
晶振周期为最小的时序单位。
一个时钟周期包含2个晶振周期。
晶振信号12分频后形成机器周期。
即一个机器周期包含12个晶振周期或6个时钟周期。
6.80C51单片机的复位
定义:
复位是使单片机或系统中的其他部件处于某种确定的初始状态。
a.复位电路
两种形式:
一种是上电复位;另一种
是上电与按键均有效的复位。
b.单片机复位后的状态
单片机的复位操作使单片机进入初始化状态。
初始化后,程序计数器
PC=0000H,所以程序从0000H地址单元开始执行。
特殊功能寄存器复位后的状态是确定
的。
P0~P3为FFH,SP为07H,SBUF不定,IP、IE和PCON的有效位为0,其余的特殊功能寄存器的状态为00H.相应的意义为:
P0~P3=FFH,相当于各口锁存器已写入1,此时不但可用于输出,也可以用于输入;
SP=07H,堆栈指针指向片内RAM
的07单元;
IP、IE和PCON的有效位为0,各中断源处于低优先级且均被关断、串行通讯的波特率不加倍;PSW=OOH,当前工作寄存器为0组。
7.80C51的存储器组织
功能:
存储信息(程序和数据)
a.程序存储器低端的一些地址被固定地用作特定的入口地址:
0000H:
单片机复位后的入口地址;
0003H:
外部中断0的中断服务程序入口地址;
000BH:
定时/计数器0溢出中断服务程序入口地址;
0013H:
外部中断1的中断服务程序入口地址;
001BH:
定时/计数器1溢出中断服务程序入口地址;
0023H:
串行口的中断服务程序入口地址。
8.80C51单片机的数据存储器配置80C51单片机数据存储器分为片外RAM和片内RAM两大部分。
80C51片内RAM的128B部分分成工作寄存器区、位寻址区、通用RAM三大部分。
基本型单片机片内RAM的地址范围是00H~7FH。
增强型单片机片内除地址范围为
00H~7FH的128BRAM夕卜,又增加了80H~FFH的高128B的RAM。
增加的这部分RAM仅能采用间接寻址方式访问。
片外RAM地址空间为64KB,地址范围是0000H~FFFFH。
与程序存储器地址空间不同的是,片外RAM地址空间与片内RAM地址空
间在地址的低端0000H~007FH是重叠的。
访问片外RAM时采用指令MOVX实现,访问片内RAM采用指令MOV,无读写信号产生。
a.工作寄存器区
80C51单片机片内RAM低端的00H~1FH共32B,分成4个工作寄存器组,每组占8个单元。
寄存器0组:
地址00H~07H;寄存器1组:
地址08H~0FH;寄存器2组:
地址10H~17H;寄存器3组:
地址18H~1FH。
程序运行时,只能有一个工作寄存器组作为当前工作寄存器组;当前工作寄存器组的选择由特殊功能寄存器中得程序状态字寄存器PSW的RS1、RS0来决定。
b.位寻址区
内部RAM的20H~2FH共16个字节是位寻址区。
其128位的地址范围是00H~7FH。
c.通用RAM区
位寻址区之后的30H~7FH共80个字节为通用RAM区。
这些单元可以作为数据缓冲器使用。
实际应用中,常需在RAM区设置堆栈。
80C51的堆栈一般设在30H~7FH的范围内,栈顶的位置由堆栈指针SP指示。
复位时SP的初值为07H,在系统初始化时可以重新设置。
9.80C51单片机的特殊功能寄存器
a.程序状态字寄存器PSW,8位。
含义如下:
CY:
进位、借位标志。
有进位、
借位时CY=1,否则CY=0;
AC:
辅助进位、借位标志
F0:
用户标志位,由用户自己定义RS1、RS0:
当前工作寄存器组选择位
OV:
溢出标志位。
有溢出时OV=1,否则0V=0
P:
奇偶标志位。
存于ACC中的运算结果有奇数个“1”时P=1,否则P=0。
10.P0口、P2口的结构
P0口作为分时复用的低8位地址/数据总线,P2口作为高8位地址总线。
a.P0口的结构
P0用作通用I/O口
输出驱动级工作在需外接上拉电阻的漏极开路方式;
P0口在作为通用I/O口,属于准双向口。
P0用作地址/数据总线
b.P2口的结构
P2口的输出驱动电路与P0口不同,内部设有上拉电阻。
P2用作通用I/O口
P2口在作为通用I/O口,属于准双向口。
P2用作地址总线
11.P3口结构
a.P3用作第一功能的通用I/O口
b.P3用作第二功能使用
P3.0:
RXD(串行口输入);
P3.1:
TXD(串行口输出);
P3.2:
INT0(外部中断0输入);
P3.3:
(外部中断1输入);
P3.4:
T0(定时器0的外部输入);
P3.5:
T1(定时器1的外部输入);
P3.6:
WR(片外数据存储器“写”
选通控制输出);
P3.7:
RD(片外数据存储器“读”选通控制输出)。
第三章80C51的指令系统
1.80C51的寻址方式
表3.1寻址方式所对应的寄存器和存储空间
序号
寻址方式
寄存器或存储空间
1
寄存器寻址
寄存器R0~R7,A、AB、DPTR和C
(布尔累加器)
2
直接寻址
片内RAM低128字节、SFR
3
奇存器间接寻址
片内RAM(@R0,@R1,SP)片外RAM(@R0,@R1,@DPTR)
4
立即寻址
ROM
5
扩展方式
变址寻址
ROM(@A+DPTR,@A+PC)
6
相对寻址
ROM(PC当前值的-128~+127字节)
7
位寻址
可寻址位(内部RAM20H~2FH单元
的位和部分SFR的位)
2.特殊传送指令
表3.3特殊传送指令
编号
指令分类
指令
机器码字节
机器周期数
1
ROM查表
MOVCA,@A+DPTR
93H
2
2
MOVCA,@A+PC
83H
2
3
读片外RAM
MOVXA,@DPTR
E0H
2
4
MOVXA,@Ri
E2H(~E3H)
2
5
写片外RAM
MOVX@DPTR,A
F0H
2
6
MOVX@Ri,A
F2H(~F3H)
2
7
堆栈操作
PUSHdirect
C0H
2
direct
8
POPdirect
D0H
2
direct
堆栈操作
在80C51单片机中,堆栈的生长方向是向上的。
入栈操作时,先将SP+1,然后将指令指定的直接地址单元的内容存入SP指向的单元;出栈操作时,将SP指向的单元内容传送到指令指定的直接地址单元,然后SP-1。
系统复位时,SP的内容位07H。
SP的值越小,堆栈深度越深。
PUSHdirect:
SP(SP)1,(SP)「(direct)
POPdirectdirect「((SP)),SP(SP)-1
一般在中断、子程序调用时发生堆栈操作
MOV、MOVX、MOVC区别
MOV:
单片机内部数据传递;MOVX:
单片机与片外RAM和I/O口电路的数据
传递;MOVC:
ROM的查表
3.逻辑运算与循环类指令
逻辑与:
编号
指令分类
指令
1
逻辑与
ANLdirect,A
2
ANLdirect,#data
3
ANLA,Rn
4
ANLA,direct
5
ANLA,@Ri
6
ANLA,#data
前两条把源操作数与直接地址指示内容相与;
后四条是把源操作数与累加器A的内容相与,送入A逻辑或:
编号
指令分类
指令
1
逻辑或
ORLdirect,A
2
ORLdirect,#data
3
ORLA,Rn
4
ORLA,direct
5
ORLA,@Ri
6
ORLA,#data
逻辑异或:
编号
指令分类
指令
1
XRLdirect,A
2
XRLdirect,#data
3
XRLA,Rn
4
XRLA,direct
5
XRLA,@Ri
6
XRLA,#data
累加器清0和取反
CLR
A
清0
CPL
A
取反
累加器循环移位
RR
右移
RRC
RL
左移
RLC
4.控制转移类指令
短跳转:
AJMP;长跳转:
LJMP;相对跳转:
SJMP。
由于LJMP指令提供的是16位地址,因此程序可以转向64KB的程序存储器地址空间的任何单元。
累加器判0转移:
JZrel:
(A)=0,则PCPCrel;
JNZrel:
(A)=0,则PCPCrel
比较不相等转移(目的字节与源字节不相等则转移):
CJNEA,direct,rel
A
CJNE^Rn>#data,rel
@Ri.
减1不为0转移:
DJNZ
Rn,rel
DJNZ
direct,rel
将操作数的循环控制单元的内容减1,并判断是否为0.若不为0,—直循环。
若为0,程序往下执行。
调用:
ACALL短调用;LCALL长调用
返回:
RET子程序返回指令;RETI中断服务子程序返回指令
CPL取反
第四章
1.查表程序
有一变量存放在片内RAM的20H单元,其取值范围为00H~05H。
要求编制一段程序,根据变量值求平方值,并存入片内RAM的21H单元。
程序如下:
ORG1000H
START:
MOVDPTR,#2000H
MOVA,20H
MOVCA,@A+DPTR
MOV21H,A
SJMP$
ORG2000H
TABLE:
DB00,01,04,09,16,25
END
2.双字节无符号数加法
设被加数存放在内部RAM的51H、50H单元,加数存放在内部RAM的61H、60H单元,相加的结果存放在内部RAM的51H、50H单元,进位存放在位寻址区的00H位中,实现此功能的程序段如下:
MOVR0,#50H;被加数的低字节地址
MOVR1,#60H;加数的低字节地址
MOVA,@R0;取被加数低字节
ADDA,@R1;加上加数低字节
MOV@R0,A;保存低字节相加结果
INCR0;指向被加数高字节
INCR1;指向加数高字节
MOVA,@R0;取被加数高字节
ADDCA,@R1;加上加数高字节(带进位加)
MOV@R0,A;保存高字节相加结果
MOV00H,C;保存进位
3.双分支程序
设变量x以补码的形式存放在片内RAM的30H单元,变量y与x的关系是:
当x>0时,y=x;当x=0时,y=20H;当x<0时,y=x+5。
编制程序,根据x的大小求y并返回原单元。
程序段如下:
START:
MOV
A,30H
JZ
NEXT
ANL
A,#80H;判断符号位
JZ
LP
MOV
A,#05H
ADD
A,30H
MOV
30H,A
SJMP
LP
NEXT:
MOV
30H,#20H
LP:
SJMP
$
4.多分支程序根据R7的内容转向相应的处理程序。
设R7的内容为0~N,对应的处理程序的入口地址分别为PP0~PPN。
程序段如下:
START:
MOV
DPTR,#TAB;置分支入口地址表首址
MOV
A,R7
ADD
A,R7
MOV
R3,A
MOVC
A,@A+DPTR;取高位地址
XCH
A,R3
INC
A
MOVC
A,@A+DPTR;取低位地址
MOV
DPL,
A;
MOV
DPH,
R3
CLR
A
JMP
@A+DPTR
DW
PP0
DW
PP1
DW
PPN
TAB:
先判断后执行
处理程序入口地址低8位送DPL
;处理程序入口地址高8位送DPH
5.循环程序
先执行后判断;
50ms延时程序
若晶振频率为12MHZ,则一个机器周期为1Q,执行一条DJNZ指令需要机器周期,即2Q。
采用循环计数法延时,循环次数可通过计算获得,并选择先执行后判断的循环结构。
程序段如下:
DEL:
:
MOVR7,#200;1pS
DEL1:
MOVR6,#123;1ps
NOP;1g
DEL2:
DJNZR6,DEL2;2ps共(2*123)ps
DJNZR7,DEL1;2p共[(2*123+2+2)*200+1]g,即50.001msRET
6.子程序及其调用
a.现场保护与恢复的结构
在主程序实现
在子程序中实现
b.子程序调用时,参数的传递方法
利用累加器或寄存器
利用存储器
利用堆栈操作
7.常用程序举例
a.多字节无符号数的加法
设两个N字节的无符号数分别存放在内部RAM中以DATA1和DATA2开始的单元中。
相加后的结果要求存放在DATA2数据区中。
程序段如下:
MOVR0,#DATA1
MOVR1,#DATA2
MOVR7,#N;置字节数
CLRC
LOOP:
MOV
ADDC
MOV
INC
INC
A,@R0
A,@R1;求和
@R1,A;存结果
R0;修改指针
R1
DJNZR7,LOOP
b.
多字节无符号数的减法元中。
相减后的结果要求存放在DATA2数据区中。
程序段如下:
MOV
R0,
#DATA1
MOV
R1,
#DATA2
MOV
R7,
#N;置字节数
CLR
C
LOOP:
MOVA,@R0
SUBBA,@R1;求差
MOV@R1,A;存结果
INCR0;修改指针
INCR1
DJNZR7,LOOP
c.十六进制数与ASCII码间的转换
当十六进制数在0~9之间时,其对应的ASCII码值为该十六进制数加30H;当十六进制数在A~F之间时,其对应的ASCII码值为该十六进制数加37H
d.BCD码与二进制数之间的转换
双字节二进制数转换成BCD码
设(R2R3)为双字节二进制数,(R4R5R6)为转换完的压缩型BCD码。
程序段如下:
DCDTH:
CLRA
MOVR4,A
;R4清0
MOVR5,A
;R5清0
MOVR6,A
;R6清0
MOVR7,#16;计数初值
LOOP:
CLRC
MOVA,R3
RLCA
MOVR3,A;
R3左移一位并送回
MOVA,R2
RLCA
MOV
R2,A;
R2左移一位并送回
MOV
A,R6
ADDC
A,R6
DA
A
MOV
R6,A;
(R6)乘2并调整后送回
MOV
A,R5
ADDC
A,R5
DA
A
MOV
R5,A;
(R5)乘2并调整后送回
MOV
A,R4
ADDC
A,R4
DA
A
MOV
R4,A;
(R4)乘2并调整后送回
DJNZ
R7,LOOP
第五章80C51的中断系统及定时/计数器
1或清0同样的效果。
一个周期采样到为低电平,则在IE0或IE1中将所存一个逻辑1。
边沿触发方式适合于以负脉冲形式输入的外部中断请求。
4.80C51的定时/计数器
80C51单片机片内集成有两个可编程的定时/计数器:
T0和T1,它们既可以工作于定时模式,也可以工作于外部事件计数模式,此外,T1还可以作为串行口的波特率发生器。
5.定时/计数器的控制
TMOD用于设置其工作方式;TCON用于控制其启动和中断申请。
定时模式C斤=0;计数模式C斤=1
6.定时/计数器的定时方式和计数方式的区别
定时方式的计数脉冲源自内部的时钟脉冲,每个机器周期寄存器的值+1,计数频率为震荡频率的
1/12;
计数方式的计数脉冲源自相应的外部输入引脚T0或T1,每个下降沿寄存器值+1,最咼计数频率为振荡频率的1/24.
7.定时/计数器的工作方式
80C51单片机定时/计数器T0有4种工
2•中断响应条件
CPU响应中断的条件是:
第一,中断源有中断请求;第二,此中断源的中断允许位为1;第三是CPU开中断(即EA=1)。
同时满足这3个条件时,CPU才可能响应中断。
3•中断返回(使用RETI指令)RETI指令能使CPU结束中断服务程序的执行,返回到曾经被中断过的程序处,继续执行主程序。
功能:
将中断响应时压入堆栈保存的断点地址从栈顶弹出送回PC,CPU从原来中断的地方继续执行程序;将相应中断优先级状态触发器清
0,通知中断系统,中断服务程序已执行完毕。
注:
外部中断定义为电平触发方式,中断标志位的状态随CPU在每个机器周期采样到的外部中断输入引脚的电平变化而变化。
电平触发方式适合于外部中断输入以低电平输入且在中断服务程序中能清除外部中断的情况。
外部中断定义为边沿触发方式,在相继连续的两次采样中,一个周期采样到外部中断输入为高电平,下
作方式(方式0、1、2、3),T1有3
8.定时/计数器的应用举例
a利用定时/计数器T0方式1,产生10ms的定时,并使P1.0引脚上输出周期为20ms的方波,采用中断方式,设系统时钟频率为12MHZ。
解:
(1)计算计数初值X:
由于晶振为12MHZ,所以机器周期Tcy为1g。
所以:
N=t/Tcy=10*10—3/1*10—6=10000
X=216—N=65536—10000=55536=D8F0H
即应将D8H送入TH0中,F0H送入TL0中。
(2)求T0的方式控制字TMOD:
M1M0=01,GATE=0,C/T=0,可取方式控制字为01H。
(3)程序清单如下
ORG
0000H
LJMP
MAIN;跳转到主程序
ORG
000BH;T0的中断入口地址
LJMP
DVT0;转向中断服务程序
ORG
0100H
MAIN:
MOV
TMOD,#01H;置T0工作于方式1
MOV
TH0,#0D8H;装入计数初值
MOV
TL0,#0F0H
SETB
ET0;T0开中断
SETB
EA;CPU开中断
SETB
TR0;启动T0
SJMP
$;等待中断
DVT0:
CPL
P1.0;P1.0取反输出
MOV
TH0,#0D8H;重新装入计数值
MOVTLO,#OFOH
RETI;中断返回
END
b.利用定时/计数器TO从P1.0输出周期为1s,脉宽为20ms的正脉冲信号,晶振频率为12MHZ。
试设计程序。
解:
采用定时20ms,然后再计数1、49次的方法实现。
a.T0工作在定时方式1时,控制字TMOD配置:
M1M0=01,GATE=0,C斤=0,可取方式控制字为01H。
b.计算计数初值X:
晶振为12MHZ,所以机器周期Tcy为1g。
所以:
N=t/Tcy=20*107/1*10-6=20000
X=216-N=65536—20000=45536=4E20H
即应将4EH送入TH1中,20H送入TL1中。
c.实现程序如下
:
ORG
0000H
AJMP
MAIN;跳转到主程序
ORG
0030H
MAIN:
MOV
TMOD,#01H;置T0工作于方式1
MOV
TH0,#4EH;装入循环计数初值
MOV
TL0,#20H;首次计数值
LP0:
SETB
P1.0
ACALL
NT0
CLR
P1.0
MOV
R7,#49;计数49次
LP1:
ACALL
NT0
DJNZ
R7,LP1
AJMP
LP0
NT0:
MOV
TH0,#4EH
MOV
TL0,#20H
SETB
TR0
JNB
TF0,$
CLR
TR0
CLR
TF0
RET
END
c.要求从P1.1引脚输出1000HZ方波,晶振频率为12MHZ。
试设计程序。
解:
采用T0实现。
1T0工作在定时方式1时,控制字TMOD配置:
M1M0=01,GATE=0,C/T=0,可取方式控制字为01H。
2计算计数初值:
晶振为12MHZ,所以机器周期Tcy为1血。
1/1000=1*10—3。
所以:
N=t/Tcy=0.5*10—3/1*10—6=500
X=216-N=65536—500=65036=FE0CH即应将FEH送入TH0中,0CH送入TL0中
③实现程序如下:
ORG
0000H
AJMP
MAIN;跳转到主程序
ORG
000BH;T0的中断入口地址
LJMP
DVT0
ORG
0030H
MAIN:
M