1.微处理器,RAM,ROM,以及I/O口,定时器,构成的微型计算机称为单片机。
2.指令寄存器(IR)保存当前正在执行的一条指令;指令译码器(ID)对操作码进行译码。 3.程序计数器(PC)指示出将要执行的下一条指令地址,由两个8位计数器PCH及PCL组成。
4.80C31片内没有程序存储器,80C51内部设有4KB的掩膜ROM程序存储器,87C51是将80C51片内的ROM换成EPROM,C51则换成4KB的闪存FLASHROM,51增强型的程序存储器容量是普通型的2倍。
5.C51的组成:一个8位的80C51的微处理器,片内256字节数据存储器RAM/SFR用来存放可以读/写的数据,片内4KB程序存储器FLASHROM用存放程序、数据、表格,4个8位并行I/O端口P0-P3,两个16位的定时器/计数器,5个中断源、两个中断个优先级的中断控制系统, 一个全双工UART的串行口I/O口,片内振荡器和时钟产生电路,休闲方式和掉电方式。
6.C51片内程序存储器容量为4KB,地址从0000-0FFFH开始,存放程序和表格常数,片外最多可扩展KBROM地址1000-FFFFH,片内外统一编址。单片机的内部存储空间分为数据存储器和程序存储器。
7.内部数据存储器:共256字节单元,包括低128个单元和高128个单元。低128字节又分成3个区域:工作寄存器区(00H~1FH),位寻址区(20H~2FH)和用户RAM区(30H~7FH)存放中间结果,数据暂存及数据缓冲。高128字节是供给特殊功能寄存器(SFR)使用的,因此称之为特殊功能寄存器区(80H~FFH),访问它只能用直接寻址。
内部程序存储器:在8031片内无程序存储器,8051片内具有4KB掩模ROM,8751片内具有4KBEPROM。
8. 引脚是片内外程序存储器的选择信号。当 端保持高电平时,访问内部程序存储器,但在PC(程序计数器)值超过0FFFH(对于8051/8751/80C51)或1FFFH(对于8052)时,将自动转向访问外部程序存储器。当 端保持低电平时,不管是否有内部程序存储器,则只访问外部程序存储器。由于8031片内没有程序存储器,所以在使用8031时, 引脚必须接低电平。
9.RST复位信号输入端,高电平有效。保持两个机器周期(24个时钟振荡周期)的高电平有效,完成复位,复位后,CPU和系统都处于一个确定的初始状态,在这种状态下,所有的专用寄存器都被赋予默认值,除SP=07H,P0~P3口为FFH外,其余寄存器均为0。 ALE/ :ALE输出正脉冲,频率为振荡周期的1/6,CPU访问片外存储器时,ALE输出信号作为锁存低8位地址的控制信号,看芯片好坏可以用示波器看ALE端是否有脉冲信号输出。PSEN程序存储允许输出信号端,也可以检查芯片好坏,有效即能读出片外ROM的指令,引脚信号RD/WR有效时可读/写片外RAM或片外I/O接口。
10.P0作为输出口时,必须外接上拉电阻才能有高电平输出,作为输入口时,必须先向锁存器写“1”;作为普通I/O口使用或低8位地址/数据总线使用。 P1口有上拉电阻,对FLASHROM编程和校验是P1接收低八位地址;只用作普通I/O口使用。
P2口比P1口多了一个转换控制开关;作为普通I/O口使用或高8位地址线使用时访问外部程序存储器和16位地址的外部数据存储器。
P3口比P1口增加了与非门和缓冲器;具有准双向I/O功能和第二功能。P0,P1,P2,P3准双向口。上述4个端口在作为输入口使用时,应注意必须先向端口写“1”。
11.普林斯顿结构:一个地址对应唯一的存储单元,用同类访问指令。哈佛结构:程序存储器和数据存储器分开的结构。
CPU访问片内外ROM用MOVC,访问片外RAM用MOVX,访问片内RAM用MOV. 12.
RS1 0 0 1 1 RS0 0 1 0 1 当前寄存器组 第0组工作寄存器 第1组工作寄存器 第2组工作寄存器 第3组工作寄存器 片内RAM地址 00H~07H 08H~0FH 10H~17H 18H~1FH SP总是初始化到内部RAM地址07H,堆栈的操作;PUSH、POP。DPTR是数据指针寄存器,是一个16位寄存器,用来存放16位存储器的地址,以便对KB片外RAM作间接寻址。DPTR由高位字节DPH和低位字节DPL组成。 13.指令周期:执行一条指令所需要的时间。
机器周期:CPU完成一个基本操作所需要的时间,6个状态周期和12个振荡周期。
当晶振频率为12MHz时,一个机器周期为1μs;当晶振频率为6MHz时,一个机器周期为2μs,复位时间超过4μs。
14.复位操作有:电自动,按键手动,看门狗。
15.空闲方式是CPU停止工作而RAM,定时器/计数器,串行口及中断系统都工作。掉电一切功能都暂停,保存RAM中内容。退出空闲方式;硬件将PCON.0清0,硬件复位。当CPU执行PCON.1为1,系统进入掉电方式。推出掉电只有硬件复位。 16.保留的存储单元 存储单元 0000H~0002H 0003H~000AH 000BH~0012H 0013H~001AH 001BH~0022H 0023H~002AH 保留目的 复位后初始化引导程序地址 外部中断0 定时器0溢出中断 外部中断1 定时器1溢出中断 串行端口中断 定时器2中断 002BH 17.单片机的寻址方式:寄存器寻址,直接寻址,立即数寻址,寄存器间接寻址,变址寻址,相对寻址,位寻址。
18.AJMP和SJMP的区别有: (1) 跳转范围不同。 AJMP addr1 ;短跳转范围:2KB 。SJMP rel ;相对跳转范围:-128~+127 (2) 指令长度不同。(3) 指令构成不同。AJMP、LJMP后跟的是绝对地址,而SJMP后跟的是相对地址。 不能用AJMP指令代替程序中的SJMP指令,因为如果改变的话,程序跳转到的新PC值指向的地址会不同,导致程序出现错误。
19.在c51片内RAM中30H)=38H,38H=40H,40H=48H,48H=90H。情分析下面各是什么指令,说明源操作数的寻址方式以及按顺序执行每条指令后的结果? MOV A,40H ;直接寻址 (40H)→A MOV R0,A ;寄存器寻址 (A)→R0 MOV P1,#0F0H ;立即数寻址 0F0→P1 MOV @R0,30H ;直接寻址 (30H) →(R0) MOV DPTR,#3848H ;立即数寻址 3848H→DPTR MOV 40H,38H ;直接寻址 (38H) →40H MOV R0,30H ;直接寻址 (30H) →R0
MOV P0,R0 ;寄存器寻址 ( R0 )→P0
MOV 18H,#30H ;立即数寻址 30H→18H MOV A,@R0 ;寄存器间接寻址 ((R0)) →A MOV P2,P1 ;直接寻址 (P1)→P2 最后结果:(R0)=38H,(A)=40H,(P0)=38H,(P1)=(P2)=0F0H,(DPTR)=3848H,(18H)=30H,(30H)=38H,(38H)=40H,(40H)=40H,(48H)=38H注意:→左边是内容,右边是单元
20.已知R3和R4中存放有一个16位的二进制数,高位在R3中,地位在R4中,请编程将其求补,并存回原处。 MOV A,R3 ;取该数高8位→A ANL A,#80H ;取出该数符号判断 JZ L1 ;是正数,转L1
MOV A,R4 ;是负数,将该数低8位→A CPL A ;低8位取反 ADD A,#01H ;加1
MOV R4,A ;低8位取反加1后→R4 MOV A,R3 ;将该数高8位→A
CPL A ;高8位取反
ADDC A,#00H ;加上低8位加1时可能产生的进位 MOV R3,A ;高8位取反加1后→R3
L1: RET
21.已知30H和31H中村有一个16位的二进制数,高位在前,低位在后,请编程将他们乘以2,在存回原单元中。
CLR C ;清进位位C
MOV A,31H ;取该数低8位→A RLC A ;带进位位左移1位 MOV 31H,A ;结果存回31H MOV A,30H ;取该数高8位→A
RLC A ;带进位位左移1位 MOV 30H,A ;结果存回30H
22.假设允许片内定时器/计数器中断,禁止其他中断。设置IE值。 用字节操作指令: MOV IE #8AH 或MOV A8H,#A8H 用位操作指令:SETB ET0
SETB ET1 SETB EA
23.设 C51的片外中断为高优先级,片内为低优先级,设置IP值。 用字节操作指令:MOV IP,#05H或MOV 0B8H,#05H 用位操作指令:SETB PX0 SETB PX1 CLR PS CLR PT0
CLE PT1
24.C51单片机内有两个16位定时器/计数器,即T0,T1.
单片机原理及接口技术课后习题答案 李朝青 第三章 1、 指令:CPU根据人的意图来执行某种操作的命令 指令系统:一台计算机所能执行的全部指令集合 机器语言:用二进制编码表示,计算机能直接识别和执行的语言 汇编语言:用助记符、符号和数字来表示指令的程序语言 高级语言:于机器的,在编程时不需要对机器结构及其指令系统有深入了解的通用性语言 2、 见第1题 3、 操作码 [目的操作数] [,源操作数] 4、 寻址方式 立即数寻址 直接寻址 寄存器寻址 寄存器间接寻址 变址寻址 相对寻址 位寻址 程序存储器ROM 片内RAM低128B、特殊功能寄存器 工作寄存器R0-R7、A、B、C、DPTR 片内RAM低128B、片外RAM 程序存储器(@A+PC,@A+DPTR) 程序存储器256B范围(PC+偏移量) 片内RAM的20H-2FH字节地址、部分SFR 寻址空间 5、 SFR:直接寻址,位寻址,寄存器寻址;片外RAM:寄存器间接寻址 6、 MOV A,40H ;直接寻址 (40H)→A MOV R0,A ;寄存器寻址 (A)→R0 MOV P1,#0F0H ;立即数寻址 0F0→P1 MOV @R0,30H ;直接寻址(30H)→(R0) MOV DPTR,#3848H ;立即数寻址 3848H→DPTR MOV 40H,38H ;直接寻址(38H)→40H MOV R0,30H ;直接寻址(30H)→R0 MOV P0,R0 ;寄存器寻址 (R0)→P0 MOV 18H,#30H ;立即数寻址 30H→18H MOV A,@R0 ;寄存器间接寻址((R0))→A MOV P2,P1 ;直接寻址(P1)→P2 最后结果:(R0)=38H,(A)=40H,(P0)=38H,(P1)=(P2)=0F0H,(DPTR)=3848H,(18H)=30H,(30H)=38H,(38H)=40H,(40H)=40H,(48H)=38H 注意:→左边是内容,右边是单元 7、 用直接寻址,位寻址,寄存器寻址 8、 MOV A,DATA ;直接寻址 2字节1周期 MOV A,#DATA ;立即数寻址 2字节1周期 MOV DATA1,DATA2 ;直接寻址 3字节2周期 MOV 74H,#78H ;立即数寻址 3字节2周期 9、 MOV A,@R0 ;((R0))=80H→A MOV @R0,40H ;(40H)=08H→(R0) MOV 40H,A ;(A)=80→40H MOV R0,#35H ;35H→R0 最后结果:(R0)=35H (A)=80H,(32H)=08H,(40H)=80H 10、用直接寻址,位寻址,寄存器寻址 11、只能采用寄存器间接寻址(用MOVX指令)
12、低128字节:直接寻址,位寻址,寄存器间接寻址,寄存器寻址(R0~R7) 高128字节:直接寻址,位寻址,寄存器寻址 13、采用变址寻址(用MOVC指令)
14、压缩BCD码在进行加法运算时应逢十进一,而计算机只将其当作十六进制数处理,此时得到的结果不正确。用DA A指令调整(加06H,60H,66H) 15、用来进行位操作
16、ANL A,#17H ;83H∧17H=03H→A
ORL 17H,A ;34H∨03H=37H→17H XRL A,@R0 ;03H⊕37H=34H
CPL A ;34H求反等于CBH 所以(A)=CBH 17、(1)SETB ACC.0或SETB E0H ;E0H是累加器的地址
(2)CLR ACC.7 CLR ACC.6 CLR ACC.5 CLR ACC.4 (3)CLR ACC.6 CLR ACC.5 CLR ACC.4 CLR ACC.3 18、MOV 27H,R7 MOV 26H,R6 MOV 25H,R5 MOV 24H,R4 MOV 23H,R3 MOV 22H,R2 MOV 21H,R1 MOV 20H,R0
19、MOV 2FH,20 MOV 2EH,21 MOV 2DH,22 20、CLR C
MOV A,#5DH ;被减数的低8位→A MOV R2,#B4H ;减数低8位→R2
SUBB A,R2 ;被减数减去减数,差→A MOV 30H,A ;低8位结果→30H MOV A,#6FH ;被减数的高8位→A MOV R2,#13H ;减数高8位→R2
SUBB A,R2 ;被减数减去减数,差→A MOV 31H,A ;高8位结果→30H
注意:如果在你的程序中用到了进位位,在程序开始的时候要记得清0进位位 21、(1)A≥10
CJNE A,#0AH,L1 ;(A)与10比较,不等转L1 LJMP LABEL ;相等转LABEL L1:JNC LABEL ;(A)大于10,转LABEL 或者:CLR C
SUBB A,#0AH JNC LABEL
(2)A>10
CJNE A,#0AH,L1 ;(A)与10比较,不等转L1 RET ;相等结束
L1:JNC LABEL ;(A)大于10,转LABEL RET ;(A)小于10,结束 或者: CLR C SUBB A,#0AH JNC L1 RET
L1:JNZ LABEL RET (3)A≤10
CJNE A,#0AH,L1 ;(A)与10比较,不等转L1 L2:LJMP LABEL ;相等转LABEL L1:JC L2 ;(A)小于10,转L2
RET 或者: CLR C SUBB A,#0AH JC LABEL JZ LABEL RET
22、(SP)=23H,(PC)=3412H 参看书上80页
23、(SP)=27H,(26H)=48H,(27H)=23H,(PC)=3456H 参看书上79页 24、不能。ACALL是短转指令,可调用的地址范围是2KB。
在看这个题的时候同时看一下AJMP指令。同时考虑调用指令ACALL和LCALL指令和RET指令的关系。 25、 MOV R2,#31H ;数据块长度→R2 MOV R0,#20H ;数据块首地址→R0 LOOP:MOV A,@R0 ;待查找的数据→A CLR C ;清进位位
SUBB A,#0AAH ;待查找的数据是0AAH吗 JZ L1 ;是,转L1
INC R0 ;不是,地址增1,指向下一个待查数据 DJNZ R2,LOOP ;数据块长度减1,不等于0,继续查找 MOV 51H,#00H ;等于0,未找到,00H→51H RET
L1:MOV 51H,#01H ;找到,01H→51H RET
26、 MOV R2,#31H ;数据块长度→R2 MOV R0,#20H ;数据块首地址→R0 LOOP:MOV A,@R0 ;待查找的数据→A JNZ L1 ;不为0,转L1 INC 51H ;为0,00H个数增1
L1:INC R0 ;地址增1,指向下一个待查数据 DJNZ R2,LOOP ;数据块长度减1,不等于0,继续查找 RET
27、 MOV DPTR,#SOURCE ;源首地址→DPTR MOV R0,#DIST ;目的首地址→R0 LOOP:MOVX A,@DPTR ;传送一个字符 MOV @R0,A
INC DPTR ;指向下一个字符 INC R0
CJNE A,#24H,LOOP ;传送的是“$”字符吗?不是,传送下一个字符 RET
28、 MOV A,R3 ;取该数高8位→A ANL A,#80H ;取出该数符号判断 JZ L1 ;是正数,转L1
MOV A,R4 ;是负数,将该数低8位→A CPL A ;低8位取反 ADD A,#01H ;加1
MOV R4,A ;低8位取反加1后→R4 MOV A,R3 ;将该数高8位→A CPL A ;高8位取反
ADDC A,#00H ;加上低8位加1时可能产生的进位 MOV R3,A ;高8位取反加1后→R3 L1:RET
29、 CLR C ;清进位位C MOV A,31H ;取该数低8位→A RLC A ;带进位位左移1位 MOV 31H,A ;结果存回31H MOV A,30H ;取该数高8位→A RLC A ;带进位位左移1位 MOV 30H,A ;结果存回30H 30、 MOV R2,#04H ;字节长度→R2 MOV R0,#30H ;一个加数首地址→R0 MOV R1,#40H ;另一个加数首地址→R1 CLR C ;清进位位 LOOP:MOV A,@R0 ;取一个加数
ADDC A,@R1 ;两个加数带进位位相加 DA A ;十进制调整 MOV @R0,A ;存放结果 INC R0 ;指向下一个字节 INC R1 ;
DJNZ R2,LOOP ;数据块长度减1,不等于0,继续查找 RET
31、 MOV R2,#08H ;数据块长度→R2 MOV R0,#30H ;数据块目的地址→R0 MOV DPTR,#2000H ;数据块源地址→DPTR LOOP:MOVX A,@ DPTR ;传送一个数据 MOV @R0,A
INC DPTR ;指向下一个数据 INC R0 ;
DJNZ R2,LOOP ;数据块长度减1,没传送完,继续传送 RET
32、(1)MOV R0,0FH ;2字节,2周期 4字节4周期(差) MOV B,R0 ;2字节,2周期
(2)MOV R0,#0FH ;2字节,1周期 4字节3周期(中) MOV B,@R0 ;2字节,2周期
(3)MOV B,#0FH ;3字节,2周期 3字节2周期(好) 33、(1)功能是将片内RAM中50H~51H单元清0。
(2)7A0A(大家可以看一下书上,对于立即数寻址的话,后面一个字节存放的是立即数) 7850(第一个字节的后三位是寄存器,前一个条指令是010也就是指的R2,在这里是R0,所以应该是78,后一个字节存放的是立即数) DAFC (这里涉及到偏移量的计算,可以参考书上56页) 34、 INC @R0 ;(7EH)=00H INC R0 ;(R0)=7FH INC @R0 ;(7FH)=39H INC DPTR ;(DPTR)=10FFH INC DPTR ;(DPTR)=1100H INC DPTR ;(DPTR)=1101H
35、解:(1000H)=53H (1001H)=H (1002H)=41H (1003H)=52H (1004H)=H (1005H)=12H (1006H)=34H (1007H)=30H (1008H)=00H (1009H)=70H
36、MOV R0,#40H ;40H→R0
MOV A,@R0 ;98H→A INC R0 ;41H→R0
ADD A,@R0 ;98H+(41H)=47H→A INC R0
MOV @R0,A ;结果存入42H单元 CLR A ;清A
ADDC A,#0 ;进位位存入A INC R0
MOV @R0,A ;进位位存入43H
功能:将40H,41H单元中的内容相加结果放在42H单元,进位放在43H单元,(R0)=43H,(A)=1,(40H)=98H,(41H)=AFH,(42H)=47H,(43H)=01H 37、 MOV A,61H ;F2H→A MOV B,#02H ;02H→B
MUL AB ;F2H×O2H=E4H→A ADD A,62H ;积的低8位加上CCH→A MOV 63H,A ;结果送62H CLR A ;清A
ADDC A,B ;积的高8位加进位位→A MOV H,A ;结果送H
功能:将61H单元的内容乘2,低8位再加上62H单元的内容放入63H,将结果的高8位放在H单元。(A)=02H,(B)=01H,(61H)=F2H,(62H)=CCH,(63H)=B0H,(H)=02H 39、MOV A,XXH
ORL A,#80H MOV XXH,A 40、(2)MOV A,XXH MOV R0,A XRL A,R0
第五章
1、什么是中断和中断系统?其主要功能是什么?
答:当CPU正在处理某件事情的时候,外部发生的某一件事件请求CPU迅速去处理,于是,CPU暂时中止当前的工作,转去处理所发生的事件,中断服务处理完该事件以后,再回到原来被终止的地方,继续原来的工作。这种过程称为中断,实现这种功能的部件称为中断系统。功能:
(1) 使计算机具有实时处理能力,能对外界异步发生的事件作出及时的处理 (2) 完全消除了CPU在查询方式中的等待现象,大大提高了CPU的工作效率 (3) 实现实时控制
2、试编写一段对中断系统初始化的程序,使之允许INT0,INT1,TO,串行口中断,且使T0中断为高优先级中断。
解:MOV IE,#097H MOV IP,#02H
3、在单片机中,中断能实现哪些功能?
答:有三种功能:分时操作,实时处理,故障处理 4、C51共有哪些中断源?对其中端请求如何进行控制? 答:(1)C51有如下中断源
①:外部中断0请求,低电平有效 ②:外部中断1请求,低电平有效 ③T0:定时器、计数器0溢出中断请求 ④T1:定时器、计数器1溢出中断请求 ⑤TX/RX:串行接口中断请求
(2)通过对特殊功能寄存器TCON、SCON、IE、IP的各位进行置位或复位等操作,可实现各种中断控制功能
5、什么是中断优先级?中断优先处理的原则是什么? 答:中断优先级是CPU相应中断的先后顺序。原则:
(1) 先响应优先级高的中断请求,再响应优先级低的
(2) 如果一个中断请求已经被响应,同级的其它中断请求将被禁止
(3) 如果同级的多个请求同时出现,则CPU通过内部硬件查询电路,按查询顺序确定应该响应哪
个中断请求
查询顺序:外部中断0→定时器0中断→外部中断1→定时器1中断→串行接口中断 6、说明外部中断请求的查询和响应过程。
答:当CPU执行主程序第K条指令,外设向CPU发出中断请求,CPU接到中断请求信号并在本条指令执行完后,中断主程序的执行并保存断点地址,然后转去响应中断。CPU在每个S5P2期间顺序采样每个中断源,CPU在下一个机器周期S6期间按优先级顺序查询中断标志,如果查询到某个中断标志为1,将在接下来的机器周期S1期间按优先级进行中断处理,中断系统通过硬件自动将相应的中断矢量地址装入PC,以便进入相应的中断服务程序。中断服务完毕后,CPU返回到主程序第K+1条指令继续执行。 7、C51在什么条件下可响应中断? 答:
(1) 有中断源发出中断请求
(2) 中断中允许位EA=1.即CPU开中断
(3) 申请中断的中断源的中断允许位为1,即中断没有被屏蔽 (4) 无同级或更高级中断正在服务 (5) 当前指令周期已经结束
(6) 若现行指令为RETI或访问IE或IP指令时,该指令以及紧接着的另一条指令已执行完毕 8、简述C51单片机的中断响应过程。
答:CPU在每个机器周期S5P2期间顺序采样每个中断源,CPU在下一个机器周期S6期间按优先级顺序查询中断标志,如查询到某个中断标志为1,将在接下来的机器周期S1期间按优先级进行中断处理,中断系统通过硬件自动将相应的中断矢量地址装入PC,以便进入相应的中断服务程序。一旦响应中断,C51首先置位相应的中断“优先级生效”触发器,然后由硬件执行一条长调用指令,把当前的PC值压入堆栈,以保护断点,再将相应的中断服务的入口地址送入PC,于是CPU接着从中断服务程序的入口处开始执行。对于有些中断源,CPU在响应中断后会自动清除中断标志。 9、在C51内存中,应如何安排程序区?
答:主程序一般从0030H开始,主程序后一般是子程序及中断服务程序。在这个大家还要清除各个中断的中断矢量地址。
10、试述中断的作用及中断的全过程。
答:作用:对外部异步发生的事件作出及时的处理 过程:中断请求,中断响应,中断处理,中断返回
11、当正在执行某一个中断源的中断服务程序时,如果有新的中断请求出现,试问在什么情况下可响应新的中断请求?在什么情况下不能响应新的中断请求? 答:(1)符合以下6个条件可响应新的中断请求:
a) 有中断源发出中断请求
b) 中断允许位EA=1,即CPU开中断
c) 申请中断的中断源的中断允许位为1,即中断没有被屏蔽 d) 无同级或更高级中断正在被服务 e) 当前的指令周期已结束
f) 若现行指令为RETI或访问IE或IP指令时,该指令以及紧接着的另一条指令已被执
行完
12、C51单片机外部中断源有几种触发中断请求的方法?如何实现中断请求? 答:有两种方式:电平触发和边沿触发
电平触发方式:CPU在每个机器周期的S5P2期间采样外部中断引脚的输入电平。若为低电平,使IE1(IE0)置“1”,申请中断;若为高电平,则IE1(IE0)清零。
边沿触发方式:CPU在每个机器周期S5P2期间采样外部中断请求引脚的输入电平。如果在相继的两个机器周期采样过程中,一个机器周期采样到外部中断请求为高电平,接着下一个机器周期采样到外部中断请求为低电平,则使IE1(IE0)置“1”申请中断;否则,IE1(IE0)置0。
13、C51单片机有五个中断源,但只能设置两个中断优先级,因此,在中断优先级安排上受到一定的。试问以下几种中断优先顺序的安排(级别由高到低)是否可能:若可能,则应如何设置中断源的中断级别:否则,请简述不可能的理由。
⑴ 定时器0,定时器1,外中断0,外中断1,串行口中断。 可以,MOV IP,#0AH
⑵ 串行口中断,外中断0,定时器0,外中断1,定时器1。 可以,MOV IP,#10H
⑶ 外中断0,定时器1,外中断1,定时器0,串行口中断。
不可以,只能设置一级高级优先级,如果将INT0,T1设置为高级,而T0级别高于INT1. ⑷ 外中断0,外中断1,串行口中断,定时器0,定时器1。 可以,MOV IP,#15H
⑸ 串行口中断,定时器0,外中断0,外中断1,定时器1。 不可以
⑹ 外中断0,外中断1,定时器0,串行口中断,定时器1。 不可以
⑺ 外中断0,定时器1,定时器0,外中断1,串行口中断。 可以,MOV IP,#09H
14、C51各中断源的中断标志是如何产生的?又是如何清0的?CPU响应中断时,中断入口地址各是多少?
答:各中断标志的产生和清“0”如下:
(1) 外部中断类
外部中断是由外部原因引起的,可以通过两个固定引脚,即外部中断0和外部中断1输入信号。 外部中断0请求信号,由P3.2脚输入。通过IT0来决定中断请求信号是低电平有效还是下跳变有效。一旦输入信号有效,则向CPU申请中断,并且使IE0=1。硬件复位。 外部中断1请求信号,功能与用法类似外部中断0 (2) 定时中断类
定时中断是为满足定时或计数溢出处理需要而设置的。当定时器/计数器中的计数结构发生计数溢出的,即表明定时时间到或计数值已满,这时就以计数溢出信号作为中断请求,去置位一个溢出标志位。这种中断请求是在单片机芯片内部发生的,无需在芯片上设置引入端,但在计数方式时,中断源可以由外部引入。
TF0:定时器T0溢出中断请求。当定时器T0产生溢出时,定时器T0请求标志TF0=1,请求中断处理。使用中断时由硬件复位,在查询方式下可由软件复位。 TF1:定时器T1溢出中断请求。功能与用法类似定时器T0 (3) 串行口中断类
串行口中断是为串行数据的传送需要而设置的。串行中断请求也是在单片机芯片内部发生的,但当串行口作为接收端时,必须有一完整的串行帧数据从RI端引入芯片,才可能引发中断。
RI或TI:串行口中断请求。当接收或发送一串帧数据时,使内部串行口中断请求标志RI或TI=1,并请求中断。响应后必须软件复位。 CPU响应中断时,中断入口地址如下: 中断源 入口地址 外部中断0 0003H 定时器T0中断000BH 外部中断1 0013H 定时器T1中断001BH 串行口中断 0023H
15、中断响应时间是否为确定不变的?为什么?
答:中断响应时间不是确定不变的。由于CPU不是在任何情况下对中断请求都予以响应的;此外,不同的情况对中断响应的时间也是不同的。下面以外部中断为例,说明中断响应的时间。
在每个机器周期的S5P2期间,端的电平被所存到TCON的IE0位,CPU在下一个机器周期才会查询这些值。这时满足中断响应条件,下一条要执行的指令将是一条硬件长调用指令“LCALL”,使程序转入中断矢量入口。调用本身要用2个机器周期,这样,从外部中断请求有效到开始执行中断服务程序的第一条指令,至少需要3个机器周期,这是最短的响应时间。
如果遇到中断受阻的情况,这中断响应时间会更长一些。例如,当一个同级或更高级的中断服务程序正在进行,则附加的等待时间取决于正在进行的中断服务程序:如果正在执行的一条指令还没有进行到最后一个机器周期,附加的等待时间为1~3个机器周期;如果正在执行的是RETI指令或者访问IE或IP的指令,则附加的等待时间在5个机器周期内。
若系统中只有一个中断源,则响应时间为3~8个机器周期。 16、中断响应过程中,为什么通常要保护现场?如何保护?
答:因为一般主程序和中断服务程序都可能会用到累加器,PSW寄存器及其他一些寄存器。CPU在进入中
断服务程序后,用到上述寄存器时,就会破坏它原来存在寄存器中的内容;一旦中断返回,将会造成主程序的混乱。因而在进入中断服务程序后,一般要先保护现场,然后再执行中断处理程序,在返回主程序以前再恢复现场。
保护方法一般是把累加器、PSW寄存器及其他一些与主程序有关的寄存器压入堆栈。在保护现场和恢复现场时,为了不使现场受到破坏或者造成混乱,一般规定此时CPU不响应新的中断请求。这就要求在编写中断服务程序时,注意在保护现场之前要关中断,在恢复现场之后开中断。如果在中断处理时允许有更高级的中断打断它,则在保护现场之后再开中断,恢复现场之前关中断。
17、清叙述中断响应的CPU操作过程,为什么说中断操作是一个CPU的微查询过程? 答:在中断响应中,CPU要完成以下自主操作过程:
a) 置位相应的优先级状态触发器,以标明所响应中断的优先级别 b) 中断源标志清零(TI、RI除外)
c) 中断断点地址装入堆栈保护(不保护PSW)
d) 中断入口地址装入PC,以便使程序转到中断入口地址处
在计算机内部,中断表现为CPU的微查询操作。C51单片机中,CPU在每个机器周期的S6状态,查询中断源,并按优先级管理规则处理同时请求的中断源,且在下一个机器周期的S1状态中,响应最高级中断请求。
但是以下情况除外:
a) CPU正在处理相同或更高优先级中断
b) 多机器周期指令中,还未执行到最后一个机器周期
c) 正在执行中断系统的SFR操作,如RETI指令及访问IE、IP等操作时,要延后一条指令 18、在中断请求有效并开中断状况下,能否保证立即响应中断?有什么条件?
答:在中断请求有效并开中断状况下,并不能保证立即响应中断。这是因为,在计算机内部,中断表现为CPU的微查询操作。C51单片机中,CPU在每个机器周期的S6状态下,查询中断源,并按优先级管理规则处理同时请求的中断源,且在下一个机器周期的S1状态中,响应最高级中断请求。 在以下情况下,还需要有另外的等待: a) CPU正在处理相同或更高优先级中断
b) 多机器周期指令中,还未执行到最后一个机器周期
c) 正在执行中断系统的SFR操作,如RETI指令及访问IE、IP等操作时,要延后一条指令
第6章习题答案
1、定时器模式2有什么特点?适用于什么场合?
答:(1) 模式2把TL0(或TL1)配置成一个可以自动重装载的8位定时器/计数器。TL0计数溢出时不仅使溢出中断标志位TF0置1,而且还自动把TH0中的内容重新装载到TL0中。TL0用作8位计数器,TH0用以保存初值。
(2) 用于定时工作方式时间(TF0溢出周期)为,用于计数工作方式时,最大计数长度(TH0初值=0)为28=256个外部脉冲。
这种工作方式可省去用户软件重装初值的语句,并可产生相当精确定时时间,特别适于作串行波特率发生器。
2、单片机内部定时方式产生频率为100KHZ等宽矩形波,假定单片机的晶振频率为12MHZ,请编程实现。 答:T0低5位:1BH
T0高8位:FFH
MOV TMOD,#00H ;设置定时器T0工作于模式0 MOV TL0,#1BH ;设置5ms定时初值 MOV TH0,#0FFH
SETB TR0 ;启动T0
LOOP:JBC TF0,L1 ;查询到定时时间到?时间到转L1
SJMP LOOP ;时间未到转LOOP,继续查询 L1:MOV TL0,#1BH ;重新置入定时初值
MOV TH0,#0FFH
CPL P1.0 ;输出取反,形成等宽矩形波 SJMP LOOP ;重复循环
3、C51定时器有哪几种工作模式?有何区别? 答:有四种工作模式:模式0,模式1,模式2,模式3
(1) 模式0:选择定时器的高8位和低5位组成一个13位定时器/计数器。TL低5位溢出时向TH进位,TH溢出时向中断标志位TF进位,并申请中断。
定时时间t=(213-初值)×振荡周期×12;计数长度位213=8192个外部脉冲
(2) 模式1:与模式0的唯一差别是寄存器TH和TL以全部16位参与操作。定时时间t=(216-初值)×振荡周期×12;计数长度位216=65536个外部脉冲
(3) 模式2:把TL0和TL1配置成一个自动重装载的8位定时器/计数器。TL用作8位计数器,TH用以保存初值。TL计数溢出时不仅使TF0置1,而且还自动将TH中的内容重新装载到TL中。 定时时间t=(28-初值)×振荡周期×12;计数长度位28=256个外部脉冲 (4) 模式3:对T0和T1不大相同
若设T0位模式3,TL0和TH0被分为两个相互的8位计数器。TL0为8位计数器,功能与模式0和模式1相同,可定时可计数。
TH0仅用作简单的内部定时功能,它占用了定时器T1的控制位TR1和中断标志位TF1,启动和关闭仅受TR1控制。
定时器T1无工作模式3,但T0在工作模式3时T1仍可设置为0~2。
4、C51内部设有几个定时器/计数器?它们是由哪些特殊功能寄存器组成? 答:C51单片机内有两个16位定时器/计数器,即T0和T1。
T0由两个8位特殊功能寄存器TH0和TL0组成;T1由TH1和TL1组成。
5、定时器用作定时器时,其定时时间与哪些因素有关?作计数器时,对外界计数频率有何? 答:定时时间与定时器的工作模式,初值及振荡周期有关。 作计数器时对外界计数频率要求最高为机器振荡频率的1/24。 6、简述定时器4种工作模式的特点,如何选择设定?
答:(1) 模式0:选择定时器的高8位和低5位组成一个13位定时器/计数器。TL低5位溢出时向TH进位,TH溢出时向中断标志位TF进位,并申请中断。
定时时间t=(213-初值)×振荡周期×12;计数长度位213=8192个外部脉冲. 置TMOD中的M1M0为00 (2) 模式1:与模式0的唯一差别是寄存器TH和TL以全部16位参与操作。定时时间t=(216-初值)×振荡周期×12;计数长度位216=65536个外部脉冲 置TMOD中的M1M0为01
(3) 模式2:把TL0和TL1配置成一个自动重装载的8位定时器/计数器。TL用作8位计数器,TH用以保存初值。TL计数溢出时不仅使TF0置1,而且还自动将TH中的内容重新装载到TL中。
定时时间t=(28-初值)×振荡周期×12;计数长度位28=256个外部脉冲 置TMOD中的M1M0为10 (4) 模式3:对T0和T1不大相同
若设T0位模式3,TL0和TH0被分为两个相互的8位计数器。TL0为8位计数器,功能与模式0和模式1相同,可定时可计数。
TH0仅用作简单的内部定时功能,它占用了定时器T1的控制位TR1和中断标志位TF1,启动和关闭仅受TR1控制。
定时器T1无工作模式3,但T0在工作模式3时T1仍可设置为0~2。 置TMOD中的M1M0为11
7、当T0用作模式3时,由于TR1已被T0占用,如何控制T1的开启和关闭?
答:用T1控制位C/T切换定时器或计数器工作方式就可以使T1运行。定时器T1无工作模式3,将T1设置为工作模式3,就会使T1立即停止计数,关闭。
8、以定时器/计数器1进行外部时间计数,每计数1000个脉冲后,定时器/计数器1转为定时工作方式,定时10ms后又转为计数方式,如此循环不止。假定为6WHZ,用模式1编程。 解:T1为定时器时初值:
T1为计数器时初值:
所以:L1:MOV TMOD,#50H ;设置T1为计数方式且工作模式为1
MOV TH1,#0FCH ;置入计数初值 MOV TL1,#18H
SETB TR1 ;启动T1计数器
LOOP1:JBC TF1,L2 ;查询计数溢出?有溢出(计数满1000个)转L2
SJMP LOOP1 ;无溢出转LOOP1,继续查询
L2:CLR TR1 ;关闭T1
MOV TMOD,#10H ;设置T1为定时方式且工作与模式1
MOV TH1,#0ECH ;置入定时10ms初值 MOV TL1,#78H
SETB TR1 ;启动T1定时
LOOP2:JBC TF1,L1 ;查询10ms时间到?时间到,转L1 SJMP LOOP2 ;时间未到,转LOOP2,继续查询
9、一个定时器定时时间有限,如何实现两个定时器的串行定时以满足较长定时时间的要求? 答:当一个定时器溢出时,设置另一个定时器的初值为0开始定时。 10、使用一个定时器,如何通过软硬件结合方法实现较长时间的定时?
答:设定好定时器的定时时间,采用中断方式用软件设置计数次数,进行溢出次数累计,从而得到较长的时间。
11、C51定时器作定时和计数时其计数脉冲分别由谁提供?
答:作定时器时计数脉冲由C51片内振荡器输出经12分频后的脉冲提供,作计数时计数脉冲由外部信号通过引脚P3.4和P3.5提供。
12、C51定时器的门控信号GATE设置为1时定时器如何启动?
答:只有(或)引脚为高电平且由软件使TR0(或TR1)置1时,才能启动定时器工作。
13、已知C51单片机的fosc=6MHz,请利用T0和P1.0输出矩形波。矩形波高电平宽50μs,低电平宽300μs。 解:T0采用模式2作为50μs定时时的初值: 所以
作300μs定时时的初值: 所以
MOV TMOD,#02H ;设置定时器T0工作于模式2 L2:CLR P1.0 ;P1.0输出低电平
MOV TH0,#6AH ;置入定时300μs初值 MOV TL0,#6AH
SETB TR0 ;启动T0
LOOP1:JBC TF0,L1 ;查询300μs时间到?时间到,转L1
SJMP LOOP1 ;时间未到,转LOOP1,继续查询 L1:SETB P1.0 ;P1.0输出高电平
CLR TR0 ;关闭T0
MOV TH0,#0E7H ;置入定时300μs初值 MOV TL0,# 0E7H
SETB TR0 ;启动T0
LOOP2:JBC TF0,L2 ;查询50μs时间到?时间到,转L2
SJMP LOOP2 ;时间未到,转LOOP2,继续查询
14、已知C51单片机的fosc=12MHz,用T1定时。试编程由P1.0和P1.1引脚分别输出周期为2ms和500μs的方波。
解:采用模式0作定时初值: 所以
MOV R2,#04H ;R2为“250μs”计数器,置入初值4 CLR P1.0 ;P1.0输出低电平 CLR P1.1 ;P1.1输出低电平 MOV TMOD,#00H
L2:MOV TH1,#0F8H ;置入定时250μs初值
MOV TL1,#06H
SETB TR1 ;启动T1
LOOP:JBC TF1,L1 ;查询250μs时间到?时间到,转L1
SJMP LOOP ;时间未到,转LOOP,继续查询 L1:CPL P1.1 ;P1.1输出取反,形成周期为500μs
CLR TR1 ;关闭T1
DJNZ R2,L2 ;“250μs”计数器减1,到1ms吗?未到转L2 CPL P1.0 ;P1.0输出取反,形成周期为2ms方波 MOV R2,#04H ;重置“250μs”计数器初值4 LJMP L2 ;重复循环
15、单片机8031的时钟频率为6MHz,若要求定时值分别为0.1ms,1ms,10ms,定时器0工作在模式0、模式1和模式2时,其定时器初值各应是多少? 解:(1) 0.1ms
模式0:T0低5位01110B=0EH T0高8位:11111110B=FEH 模式1: 模式2:
(2) 1ms
模式0: T0低5位01100B=0CH T0高8位:11110000B=F0H 模式1:
模式2:在此情况下最长定时为512μs,无法一次实现定时1ms,可用0.1ms循环10次
(3) 10ms
模式0: T0低5位11000B=18H T0高8位:01100011B=63H 模式1:
模式2:在此情况下最长定时为512μs,无法一次实现定时10ms,可用0.1ms循环100次
16、C51单片机的定时器在何种设置下可提供三个8位计数器定时器?这时,定时器1可作为串行口波特率发生器。若波特率按9600b/s,4800b/s,2400b/s,1200b/s,600b/s,100b/s来考虑,则此时可选用的波特率是多少(允许存在一定误差)?设fosc=12MHz。
解:当T0为模式3,T1为模式2时,可提供3个8位定时器。 可选100b/s
17、试编制一段程序,功能为:当P1.2引脚的电平上跳时,对P1.1的输入脉冲进行计数;当P1.2引脚的电
平下跳时,停止计数,并将计数值写入R6,R7。
解: MOV TMOD,#05H ;T0为计数方式且工作于模式1
JNB P1.2,$ ;等待P1.2引脚电平上跳 MOV TH0,#00H ; P1.2电平上跳,置入计数初值 MOV TL0,#00H
SETB TR0 ;启动T0
JB P1.2,$ ;等待P1.2引脚电平下跳 CLR TR0 ;电平下跳,关闭T0 MOV R7,TH0 ;计数初值写入R7,R6 MOV R6,TL0
18、设fosc=12MHz。试编制一段程序,功能为:对定时器T0初始化,使之工作在模式2,产生200μs定时,并用查询T0溢出标志的方法,控制P1.0输出周期为2ms的方波。 解:T0作定时器时初值: 所以
程序1: CLR P1.0 ;P1.0输出低电平
MOV R2,#05H ;R2为“200μs”计数器,置入初值5,计1ms MOV TMOD,#02H ;设定时器T0工作于模式2 L2:MOV TH0,#38H ;置入定时初值
MOV TL0,#38H
SETB TR0 ;启动T0
LOOP:JBC TF0,L1 ;查询200μs时间到?时间到,转L1
SJMP LOOP ;时间未到,转LOOP,继续查询 L1:CLR TR0 ;关闭T0
DJNZ R2,L2 ;“200μs”计数器减1,到1ms吗?未到,转L2 CPL P1.0 ;到1ms,P1.0取反,形成周期为2ms的方波 MOV R2,#05H ;重置“200μs”计数器初值 LJMP L2 ;重复循环
程序2:
MAIN:MOV TMOD,#02H ;设定时器T0工作于模式2
CLR P1.0 ;P1.0输出低电平
LOOP1:MOV R2,#05H ;R2为“200μs”计数器,置入初值5,计1ms LOOP:MOV TH0,#38H ;置入定时初值
MOV TL0,#38H
SETB TR0 ;启动T0
JNB TF0,$ ;查询200μs时间到?时间到,继续查询 CLR TR0 ;关闭T0
DJNZ R2,LOOP ;“200μs”计数器减1,到1ms吗?未到,转LOOP CPL P1.0 ;到1ms,P1.0取反,形成周期为2ms的方波 SJMP LOOP1 ;重复循环
19、以中断方法设计单片机秒、分脉冲发生器。假定P1.0每秒产生1个机器周期的正脉冲,P1.1每分产生1个周期的正脉冲。 参考书上例题6-6
第七章
1、什么是串行异步通信,它有哪些作用?
答:在异步串行通信中,数据是一帧一帧(包括一个字符代码或一字节数据)传送的,每一帧的数据格式
参考书。通信采用帧格式,无需同步字符。存在空闲位也是异步通信的特征之一。 2、C51单片机的串行口由哪些功能部件组成?各有什么作用?
答:C51单片机的串行接口由发送缓冲期SBUF,接收缓冲期SBUF、输入移位寄存器、串行接口控制器SCON、定时器T1构成的波特率发生器等部件组成。
由发送缓冲期SBUF发送数据,接收缓冲期SBUF接收数据。串行接口通信的工作方式选择、接收和发送控制及状态等均由串行接口控制寄存器SCON控制和指示。定时器T1产生串行通信所需的波特率。 3、简述串行口接收和发送数据的过程。
答:串行接口的接收和发送是对同一地址(99H)两个物理空间的特殊功能寄存器SBUF进行读和写的。当向SBUF发“写”命令时(执行“MOV SBUF,A”),即向缓冲期SBUF装载并开始TXD引脚向外发送一帧数据,发送完便使发送中断标志位TI=1。
在满足串行接口接收中断标志位RI(SCON.0)=0的条件下,置允许接收位REN(SCON.4)=1,就会接收一帧数据进入移位寄存器,并装载到接收SBUF中,同时使RI=1。当发读SBUF命令时(执行“MOV A, SBUF”),便由接收缓冲期SBUF取出信息通过C51内部总线送CPU。
4、C51串行口有几种工作方式?有几种帧格式?各工作方式的波特率如何确定? 答:C51串行口有4种工作方式:
方式0(8位同步移位寄存器),方式1(10位异步收发),方式2(11位异步收发),方式3(11位异步收发)。 有2种帧格式:10位,11位
方式0:方式0的波特率≌fosc/12(波特率固定为振荡频率1/12) 方式2:方式2波特率≌2SMOD/×fosc
方式1和方式3:方式1和方式3波特率≌2SMOD/32×(T1溢出速率) 如果T1采用模式2则:
5、若异步通信接口按方式3传送,已知其每分钟传送3600个字符,其波特率是多少? 答:已知每分钟传送3600个字符,方式3每个字符11位,则: 波特率=(11b/字符)×(3600字符/60s)=660b/s 6、C51中SCON的SM2,TB8,RB8有何作用?
答:c51SCON的SM2是多机通信控制位,主要用于方式2和方式3.若置SM2=1,则允许多机通信。 TB8是发送数据的第9位,在方式2或方式3中,根据发送数据的需要由软件置位或复位。它在许多通信协议中可用作奇偶校验位;在多机通信中作为发送地址帧或数据帧的标志位。
RB8是接收数据的第9位,在方式2或方式3中接收到的第9位数据放在RB8位。它或是约定的奇偶校验位,或是约定的地址/数据标示位。
7、设fosc=11.059MHz,试编写一段程序,其功能为对串行口初始化,使之工作与方式1,波特率为1200b/s;并用查询串行口状态的方法,读出接收缓冲器的数据并回送到发送缓冲器。 解: START:MOV SCON,#40H ;串行接口工作于方式1
MOV TMOD,#20H ;定时器T1工作于模式2 MOV TH1,#0E8H ;赋定时器计数初值 MOV TL1,#0E8H
SETB TR1 ;启动定时器T1 MOV A,SBUF ;读出接收缓冲器数据 MOV SBUF,A ;启动发送过程 JNB TI,$ ;等待发送完 CLR TI ;清TI标志 SJMP $ ;结束
8、若晶振为11.0592MHz,串行口工作与方式1,波特率为4800b/s。写出用T1作为波特率发生器的方式字和计数初值。
解: MOV TMOD,#20H ;定时器T1工作于模式2
MOV TH1,#0FAH ;赋定时器计数初值 MOV TL1,#0FAH
9、为什么定时器T1用作串行口波特率发生器时,常选用工作模式2?若已知系统时钟频率和通信用的波特率,如何计算其初值?
答:因为工作模式2是自动重装初值定时器,编程时无需重装时间参数(计数初值),比较使用。若选用工作模式0或工作模式1,当定时器T1溢出时,需在中断服务程序中重装初值。 已知系统时钟频率fosc和通信用的波特率fbaud,可得出定时器T1模式2的初值
10、若定时器T1设置成模式2作波特率发生器,已知fosc=6MHz。求可能产生的最高和最低的波特率。 解:最高波特率为T1定时最小值时,此时初值为255,并且SMOD=1,有: 最高波特率为T1定时最大值时,此时初值为0,并且SMOD=0,有: 11、串行通信的总线标准是什么?有哪些内容?
答:美国电子工业协会(EIA)正式公布的串行总线接口标准有RS-232C,RS-422,RS-423和RS-485等。 在异步串行通信中应用最广的标准总线是RD-232C。它包括了按位串行传输的电气和机械方面的规定,如适用范围、信号特性、接口信号及引脚说明等,适用于短距离(<15m)或带调制解调的通信场合。采用RS-422, RS-485标准时,通信距离可达1000m。 12、简述单片几多机通信的原理。
答:当一片C51(主机)与多片C51(从机)通信时,所有从机的SM2位都置1.主机首先发送的一帧数据为地址,即某从机机号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。各从机根据收到的第9位数据(RB8中)的值来决定从机可否再接收主机的信息。若(RB8)=0,说明是数据帧,则使接收中断标志位RI=0,信息丢失;若(RB8)=1说明是地址帧,数据装入SBUF并置RI=1,中断所有从机,只有被寻址的目标从机清除SM2(SM2=0),以接收主机发来的一帧数据(点对点通信)。其他从机仍然保持SM2=1.
13、当C51串行口按工作方式1进行串行数据通信时。假定波特率为1200b/s,以中断方式传送数据。请编写全双工通信程序。
解:设系统时钟频率fosc=6.0MHZ。查教材表9-2可知,可取SMOD=0,T1的计数初值为F3H。程序如下: ORG 0000H
AJMP MAIN ;上电,转向主程序 ORG 0023H ;串行口的中断入口地址 AJMP SERVE ;转向中断服务程序 ORG 0040H ;主程序 MAIN: MOV SP,#60H ;设置堆栈指针 MOV SCON ,#50H MOV PCON ,#00H
MOV TMOD,#20H MOV TH1,#0F3H MOV TL1,#0F3H
SETB TR1
MOV R0 ,#20H ;置发送数据区首地址
MOV R1 ,#40H ;置接收数据区首地址
MOV R7 ,#10H ;置发送字节长度
MOV R6 ,#10H ;置接收字节长度
SETB ES ;允许串行口中断 SETB EA ;CPU允许中断
MOV A ,@R0 ;取第一个数据发送 MOV SBUF ,A ;发送第一个数据 SJMP $ ;等待中断
SERVE: JNB RI ,SEND ;TI=1,为发送中断
CLR RI
MOV A ,SBUF ;读出接收缓冲区内容 MOV @R1 ,A ;读入接收缓冲区
DJNZ R6 ,L1 ;判断数据块发送完否 SJMP L2 ;数据块接收完,转L2 L1:INC R1 ;修改数据区指针 L2:RETI ;中断返回 SEND:
CLR TI ;清除发送中断标志
DJNZ R7 ,L3 ;判断数据块发送完否 SJMP L4 ;数据块接收完,转L4
L3: MOV A ,@R0 ;取数据发送
MOV SBUF ,A ;发送数据 INC R0 ;修改数据地址 L4:
RETI ;中断返回 END
14、以C51串行口按工作方式3进行串行数据通信。假定波特率为1200b/s,第9数据位作奇偶校验位,以中断方式传送数据。请编写通信程序。 解:
ORG 0000H
AJMP MAIN ;上电,转向主程序 ORG 0023H ;串行口的中断入口地址 AJMP STOP ;转向中断服务程序 ORG 0040H ;主程序 MAIN: MOV SP,#60H
MOV TMOD,#20H MOV TH1,#0E8H MOV TL1,#0E8H
SETB TR1
MOV SCON ,#0D0H MOV PCON ,#00H
MOV R0 ,#20H ;置发送数据区首地址
MOV R1 ,#40H ;置接收数据区首地址
SETB ES ;允许串行口中断 SETB EA ;CPU允许中断 MOV A ,@R0
MOV C, PSW.0 ;P→C CPL C MOV TB8 ,C
MOV SBUF ,A ;发送第一个数据 SJMP $
STOP: JNB RI SOUT ;TI=1,为发送中断
CLR RI
MOV A ,SBUF ;读出接收缓冲区内容
MOV C ,PSW.0 ;P→C CPL C ;形成奇校验
JC LOOP1 ;判断接收端的奇偶值,C=1转LOOP1 JNB RB8 ,LOOP2 ;C=0,RB8=0,转LOOP2 SJMP ERROR ;C=0,RB8=1,转出错处理
LOOP1: JB RB8 ,LOOP2 ;C=1,RB8=1,转LOOP2
SJMP ERROR ;C=0,RB8=1,转出错处理
LOOP2:
MOV @R1 ,A ;将接收数据送入接收数据区 INC R1 ;修改数据区指针 RETI
SOUT: CLR TI ;是发送中断,清除发送中断标志
INC R0 ;修改数据区指针 MOV A ,@R0
MOV PSW.0, C ;P→C CPL C MOV TB8 ,C
MOV SBUF ,A ;发送第一个数据
RETI
ERROR:„„
15、某异步通信接口,其帧格式由1个起始位(0),7个数据位,1个奇偶校验位和1个停止位(1)组成。当该接口每分钟传送1800个字符时,试计算出传送波特率。
解:该异步通信接口的帧格式为10b/字符,当该接口每分钟传送1800个字符时: 波特率=(10b/字符)×(1800字符/60s)=300b/s
16、串行口工作在方式1和方式3时,其波特率与fosc、定时器T1工作模式2的初值及SMOD位的关系如何?设fosc=6MHz,现利用定时器T1模式2产生的波特率为110b/s。试计算定时器初值。 解:关系如下
当波特率为110b/s,fosc=6MHz,令SMOD=0,有:
17、设计一个单片机的双机通信系统,并编写通信程序。将甲机内部RAM 40H--4FH存储区中去。 参考教材例题7-12
第八章:
1.下图831是4片8K×8位存储器芯片的连接图。请确定每片存储器芯片的地址范围。 答:设地址线A0-A7分别接在P0.0-P0.7引脚,A8-A15分别接在P2.0-P2.7引脚,则:
1#芯片地址:0000H-1FFFH,2#芯片地址:2000H-3FFFH,3#芯片地址:4000H-5FFFH,4#芯片地址:6000H-7FFFH,
2. 用8255的A口做输入口,B口做输出口。假设8255工作在方式1,控制口地址为7FH,写出相应的初始化程序。
答: MOV R0,#07FH ;8255控制字地址
MOV A,#10110000B ;或1011*00*B,*表示任意 MOVX @R0,A
3.用到三片74HC373的某C51应用系统的电路如上图所示。现要求通过74HC373(2)输出80H,请编写相应的程序。
答:从图中可知74HC373(1)的地址为012H ,74HC373(2)的地址为02H, 74HC373(3)的地址为04H,且芯片的使能端与单片机的WR端相连是作为外部存储器扩展,所以程序如下: MOV R0,#02H MOV A,#80h MOVX @R0,A
第九章
1.设计一个3×3行列式键盘电路并编写键扫描子程序。
答: 图略,设P0.0-P0.2接行扫描口,P1.0-P1.2接列扫描口。程序如下:
KEY:LCALL KS;调用判断有无键按下子程序 JZ KEY;无键按下,重新扫描键盘
LCALL T10 ms;有键按下,延时去抖动 LCALL KS JZ KEY
MOV R2,#0FEH;首列扫描字送R2 MOV R4,#00H;首列号#00H送入R4 MOV P0,#0FFH
LK1: MOV P1,R2;列扫描字送P1口 MOV A,P0
JB ACC.0,ONE;0行无键按下,转1行
MOV A,#00H;0行有键按下,该行首号#00H送A LJMP KP;转求键号
ONE:JB ACC.1,TWO;1行无键按下,转下列 MOV A,#03H;1行有键按下,该行首号#03H送A LJMP KP;转求键号
TWO: JB ACC.2,NEXT;1行无键按下,转下列 MOV A,#06H;2行有键按下,该行首号#06H送A KP: ADD A,R4;求键号,键号=行首键号+列号 PUSH ACC;键号进栈保护 LK: LCALL KS;等待键释放 JNZ LK;未释放,等待 POP ACC;键释放,键号送A
RET;键扫描结束,出口状态: (A)=键号 NEXT:INC R4;列号加1 MOV A,R2;判断三列扫描完了吗 JNB ACC.3,KND;三列扫描完,返回 RL A;未扫描完,扫描字左移一位 MOV R2,A;扫描字入R2 AJMP LK1;转扫下一列 KND:AJMP KEY
KS: MOV P1,#0F8H;全扫描字送P1口 MOV P0, #0FFH
MOV A,P0;读入P0口行状态
CPL A;取正逻辑,高电平表示有键按下 ANL A,#03H;保留P0口低2位(屏蔽高6位) RET;出口状态: (A)≠0时有键按下 T10 ms:MOV R7,#10H;延迟10 ms子程序 TS1: MOV R6,#0FFH TS2: DJNZ R6,TS2 DJNZR7,TS1 RET
2.设计一个有6位LED显示、8个按键的显示键盘电路。
答:(1)利用串行口的(课堂上的例子),可去掉一行键盘,2位数百管。
(2)直接利用并行口扩展。
3.在一个fOSC为12 MHz的C51系统中接有一片A/D器件ADC0809,它的地址为7FF8H~7FFFH。试画出有关逻辑框图,并编写ADC0809初始化程序和定时采样通道2的程序(假设采样频率为1 ms/次,采样4个数据,存于C51内部RAM 70H~73H中)。 答:电路如下图所示:
参考程序如下:(用延时程序实现1ms延时,也可使用定时器实现延时,请自行设计) MOV R0,#70H MOV R7,#4
MOV DPTR,#7FFAH;通道2地址 LP:MOVX @DPTR,A LCALL DELAY1ms MOVX A,@DPTR MOVX @R0,A INC R0 DJNZ R7,LP RET
4.在一个C51单片机与一片DAC0832组成的应用系统中,DAC0832的地址为7FFFH,输出电压为0~5 V。试画出有关逻辑框图,并编写产生矩形波,其波形占空比为1∶4,高电平时电压为2.5 V,低电平时电压为1.25 V的转换程序。 答:电路如下图所示:
(1)题目中没有要求输出频率,故可设为任意值,但要求占空比为1:4,则低电平时间应该为高电平时间
的3倍。
(2)要求高电平时输出电压为2.5V,则单片机送入DAC0832的数字量应该为:2.5*255/5=128(127),低电平时输出电压为1.25V,则单片机送入DAC0832的数字量应该为:1.25*255/5=。 参考程序如下: MOV DPTR,#7FFFH LP:MOV A,#128 MOVX @DPTR,A LCALL DELAY MOV A,# MOVX @DPTR,A LCALL DELAY LCALL DELAY LCALL DELAY SJMP LP
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- sarr.cn 版权所有 赣ICP备2024042794号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务