单片机复习ZZZ修正添加版.docx
- 文档编号:10828206
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:18
- 大小:147.47KB
单片机复习ZZZ修正添加版.docx
《单片机复习ZZZ修正添加版.docx》由会员分享,可在线阅读,更多相关《单片机复习ZZZ修正添加版.docx(18页珍藏版)》请在冰豆网上搜索。
单片机复习ZZZ修正添加版
一、概念题
1.MCS-51单片机的存储系统结构
XCODE/CODE,DATA/XDATAP14-19
2.MCS-51单片机的三个周期
1.时钟周期:
晶体振荡器的周期。
2.机器周期:
一个机器周期包括12个时钟周期。
3.指令周期:
执行一条指令的时间。
6M晶振机器周期为2us12M为1us
3.MCS-51单片机的指令系统:
指令设计方法寻址方式
1)立即寻址
操作数在指令代码中直接给出,在操作码之后,称为立即数,用“#”表示。
如:
MOVA,#80H;把立即数80H送累加器A
MOVR7,#0F5H
MOVDPTR,#1245H
2)直接寻址
操作数直接以存储单元地址的形式给出。
如:
MOVA,40H;把内部RAM中40H单元的内容送累加器A
MOVA,80H;P0口内容送A
MOVA,P0;P0口地址为80H
3)寄存器寻址
对当前选定的R0~R7、A、B、DPTR中的数进行操作。
例:
MOVA,R7;将R7工作寄存器中的数据送到累加器A中去。
MOVR6,A;将累加器A中的数据送到R6工作寄存器中去。
4)寄存器间接寻址
如:
MOVA,@R0
MOVXA,@R0
MOVXA,@DPTR
5)变址寻址(基址寄存器+变址寄存器间接寻址方式)
如:
MOVDPTR,#0400H
MOVA,#05H
MOVCA,@A+DPTR;把程序存储器0405H单元内容送A
是专门针对程序存储器的寻址方式,常用于查表操作。
4.MCS-51单片机的I/O系统:
编址方法输入/输出编程技巧
编址方法:
统一编址方式I/O寄存器与数据存储器单元同等对待,统一编址。
5.MCS-51单片机的内部数据存储器:
P16
寄存器工作区位地址/字节地址堆栈/堆栈的操作PSW/PC/SP
6.MCS-51单片机的中断:
中断源中断优先级P54中断服务程序(流程)P62断点保护/恢复
中断的扩展(T0、T1、查询)P63-65
7.MCS-51单片机的定时器P69-82
GATE位的应用(脉冲的测量)P79
8.外部数据/程序存储器(课件例题)
RD/WR/PSEN
扩展及地址范围:
现有2K*8位存储器芯片,需扩展8K*8位存储结构采用线选法进行扩展
现有2K*8位存储器芯片,需扩展8K*8位存储结构采用译码法进行扩展
用4片6116进行8KB数据存储器扩展,用译码法实现
9.MCS-51串行通信(朱7,朱10)
二、例题:
(课件例题,可做参考)
1,利用定时器T0的方式1产生一个50Hz的方波,由P1.0输出。
采用12MHz时钟,假设CPU不做其他工作,以查询方式实现。
解:
因要输出50Hz方波,故输出信号的周期为20ms,定时器需实现10ms的定时。
计算初值:
(216–X)*10-6=10-2
X=45536=0B1E0H
程序设计:
MOVTMOD,#01H;T0为方式1
SETBTR0;启动T0
LOOP:
MOVTH0,#0B1H;T0置初值
MOVTL0,#0E0H
LOOP1:
JNBTF0,LOOP1;查询T0是否溢出
CLRTF0;软件清除TF0
CPLP1.0;P1.0取反
SJMPLOOP
2,采用6MHz时钟,用定时器T0产生1s定时
解:
系统时钟6MHz,机器周期2us,方式0最长可定时213*2us=214us=16.384ms,方式1最长可定时131.072ms,方式2最长可定时512us。
可选方式1,每100ms中断一次,中断10次为1s。
计算初值:
(216–X)*2*10-6=10-1
X=15536=3CB0H
程序设计:
ORG0000H
RESET:
LJMPMAIN
ORG000BH
LJMPIT0P
ORG1000H
MAIN:
MOVSP,#60H
MOVB,#0AH;设循环次数
MOVTMOD,#01H;T0工作方式1
MOVTL0,#0B0H;置初值
MOVTH0,#3CH
SETBTR0;启动T0
SETBET0;T0开中断
SETBEA;开总中断
HERE:
SJMPHERE;原地循环等待中断
IT0P:
MOVTL0,#0B0H;重装初值
MOVTH0,#3CH
DJNZB,LOOP
CLRTR0;1s时间到,T0停止
LOOP:
RETI
END
3,利用定时器T1的方式2对外部信号计数,要求每计满100个数,将P1.0取反。
解:
T1应设置为计数模式工作在方式2,故TMOD=60H。
计算T1初值:
X=(28–100)=156=9CH
程序设计:
ORG0000H
RESET:
LJMPMAIN
ORG001BH
CPLP1.0
RETI
ORG0100H
MAIN:
MOVTMOD,#60H
MOVTL1,#9CH
MOVTH1,#9CH
SETBTR1;启动T1
HERE:
SJMPHERE;原地循环等待中断
4,假设两个外部中断源已被占用,且定时器T1工作在方式2作为波特率发生器,现要求增加一个外部中断源,并控制P1.0引脚输出一个5kHz的方波。
时钟频率为6MHz。
解:
因为T1用作波特率发生器,而现在又需要两个定时/计数器,一个用来扩展外部中断,一个用来定时控制输出方波,故T0应工作在方式3。
计算初值:
TL0扩展外部中断初值应为0FFH。
TH0定时时间100us,初值设为X
(28-X)*2*10-6=1*10-4
X=9CH
ORG0000H
LJMPMAIN
ORG000BH;T0中断入口
LJMPTL0INT
ORG001BH;T1中断入口
LJMPTH0INT
ORG0100H
MAIN:
MOVTMOD,#27H;T1方式2定时T0方式3计数
MOVTL0,#0FFH;置TL0初值
MOVTH0,#9CH;置TH0初值
MOVTL1,#DATA;DATA根据波特率常数确定
MOVTH1,#DATA
MOVTCON,#55H;启动TL0和TH0
MOVIE,#9FH;开中断
…
TL0INT:
MOVTL0,#FFH;重装初值
…;中断处理
RETI
TH0INT:
MOVTH0,#9CH;重装初值
CPLP1.0
RETI
5,两个8位无符号数相加,和仍为8位。
假设两个无符号数X1,X2分别存放于内部RAM60H、61H单元中,求其和并将和送入62H单元。
6,两个无符号双字节数相加。
设被加数存放在内部存储器30H(高位字节)、31H(低位字节)单元,加数存放在内部存储器40H(高位字节)、41H(低位字节)单元,和存入30H(高位字节)、31H(低位字节)单元。
7,编写16位二进制数求补程序,低8位存放在R0中,高8位存放在R1中,求补的结果低8位放R3,高8位放R4二进制数的求补可归结为“求反加1”的过程,求反可用CPL指令实现;加1时应注意,加1只能加在低8位的最低位上。
因为现在是16位数,有两个字节,因此要考虑进位问题,即低8位取反加1,高8位取反后应加上低8位加1时可能产生的进位,还要注意这里的加1不能用INC指令,因为INC指令不影响CY标志。
8,将外部RAM中100H单元中的内容送入外部RAM中200H单元中。
MOVDPTR,#0100H
MOVXA,@DPTR
MOVDPTR,#0200H
MOVX@DPTR,A
例:
用查表指令取出程序存储器7010H单元表格的数据,并保护数据指针(DPTR)=3A00H,设表格为:
7010H:
02H7011H:
04H
执行程序MOVA,#10H
PUSHDPH
PUSHDPL
MOVDPTR,#7000H
MOVCA,@A+DPTR
POPDPL
POPDPH
程序运行后累加器内容(A)=02H
数据指针的内容(DPTR)=3A00H
三、作业内容:
(可能有错,自行改正)
来至小朱的复习材料
2.将外部数据存储器0x1000H-0x100FH的内容传送到0x1200H-0x1207H内
参考代码:
ORG0000H
LJMPMAIN
ORG0050H
MAIN:
MOVR0,#10H;传送数据个数
MOVR1,#200H
MOVDPTR,#1000H
LOOP:
MOVXA,@DPTR
MOVDPH,#12H
MOVX@DPTR,A
INCDPL
MOVDPH,#10H
DJNZR0,LOOP
SJMP$
END
3.通过查表求10到15的立方
ORG0000H
LJMPMAIN
ORG0100H
MIAN:
SUBBA,#0AH;假设A中存储需要求立方的数
RLA
MOVR2,A
MOVDPTR,#1000H
MOVCA,@A+DPTR
MOVR0,A;结果的高8位存储在R0中
INCR2
MOVA,R2
MOVCA,@A+DPTR
MOVR1,A;结果的低8位存储在R1中
SJMP$
ORG1000H
DW1000,1331,1728,2197,2744,3375;分别为10到15的立方
4.用外部中断0方式将20H-2FH单元的数据传送到30H-3FH,每次脉冲只传送一个字节
ORG0000H
LJMPMAIN
ORG0003H
LJMPINT0
ORG0040H
MIAN:
MOVR1,#20H
MOVR2,#30H
MOVR3,#10H
CLRF0
SETBIT0;设为边沿触发
SETBEA
SETBEX0;开中断
SJMP$
END
INT0:
MOVA,@R1
MOV@R2,A
INCR1
INCR2
DJNZR3,EXIT1
CLREA;数据传送完毕后关中断
CLREX0
EXIT1:
RETI
如果每两个脉冲传送一个字节,则中断服务程序改为:
INT0:
JNBF0,EXIT1
MOVA,@R1
MOV@R2,A
INCR1
INCR2
CLRF0
DJNZR3,EXIT
SJMPEXIT2
EXIT1:
SETBF0
SJMPEXIT
EXIT2:
;数据传送完毕后关中断
CLREA
CLREX0
EXIT
RETI
5.计数器T0做为外部中断源的使用
ORG0000H
LJMPMAIN
ORG0000B
LJMPCOUNT0
ORG0040H
MIAN:
MOVTMOD,#06H;设置T0工作在方式2,计数器模式
MOVTL0,#0FFH
MOVTH0,#0FFH
SETBTR0;启动计数器,开中断
SETBET0
SETBEA
SJMP$
COUNT0:
;中断服务程序
6.系统时钟频率为12MHZ,采用定时器T1,从P1.0输出一个周期为1ms,占空比为50%的方波
因为周期为1ms,所有每500us就要对P1.0取反
而机器周期=12/晶振频率=12/12MHZ=1us,也就是说要计数500次,方式2只有8位,最多只能计数256次,故采用两次中断取反P1.0,每次计数250次,故TL1初值为256-250=6
ORG0000H
AJMPMAIN
ORG001BH
AJMPTIMER
ORG0100H
MAIN:
MOVSP,#60H
MOVTMOD,#20H;T1工作在方式2,定时器
MOVTL1,#06H
MOVTH1,#06H
SETBF0
SETBTR1;启动定时器T1
SETBET1;允许T1中断
SETBEA
SJMP$
TIMER:
JNBF0,OUT
SJMPEXIT
OUT:
CPLP1.0
EXIT:
CPLF0
RETI
7.工作在方式0接收16位数据,分别存储在R1、R2(图这里无法画,自己想办法)
MOVSCON,#10H
JNBRI,$
MOVA,SBUF
CLRRI
MOVR1,A
JNBRI,$
MOVA,SBUF
CLRRI
MOVR2,A
10工作在方式1,采用中断的方式接收16位数据
ORG0000H
LJMPMAIN
ORG0023H
LJMPCOM_INT
ORG0100H
MAIN:
MOVSP,#53H
MOVTMOD,#20H
MOVTH1,#0F3H
MOVTL1,#0F3H
MOVPCON,#80H
SETBTR1
MOVSCON,#50H
MOVIE,#90H
CLRF0
SJMP$
COM_INT:
MOVA,SBUF
JBF0,SECOND
MOVR1,A
SETBF0
AJMPRETN
SECOND:
MOVR2,A
CLREA
CLRES
RETN:
CLRRI
RETI
END
四、编程及分析(考纲)有时间后期补上
1.假设IP=05H,请列出所有中断源的优先级顺序P57-58
当IP为05H时,即PS=0,PT1=1,PX1=0,PT0=0,PX0=1.所以这是有定时器1和外部中断0是高优先级,由于同一优先级中又有一个辅助优先级结构(外部中断0---T0溢出中断---外中断1---T1溢出中断---串行口中断)
所以最后中断优先级顺序为:
外部中断0----外部中断1----定时器中断0---定时器中断1---串口中断。
2.编程实现将数据存储器10H-50H清零/预置数
3.编程实现两个内存块:
20H-2FH和30H-3FH之间的数据交换(朱2,3)
4.如何实现用T0/T1扩展外部中断(优先级可设置)P63-67(例4,朱5)
6.编程实现对(20H)、(21H)中的数据求补/求反(例7)
7.32位定时器的实现(类题:
例题1,3)
解题思路:
T0T1设置为方式1,一个定时,一个计数,定时器在IO产生一个电平变化(如:
p0.1由1变为0),计数器计数p0.1口变化
8.30H/31H和40H/41H中分别存有不带符号的16位数据,编程实现加法/减法运算,结果存30H/31H/32H。
(例5,6)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 复习 ZZZ 修正 添加
![提示](https://static.bdocx.com/images/bang_tan.gif)