您好,欢迎来到年旅网。
搜索
您的当前位置:首页单片机习题答案

单片机习题答案

来源:年旅网
 何宏《单片机原理与接口技术》习题解答

第4章 习题解答

4-1.简述下列基本概念。

答 指令:CPU根据人的意图来执行某种操作的命令。 指令系统:一台计算机所能执行的全部指令集合。

机器语言:用二进制编码表示,计算机能直接识别和执行的语言。 汇编语言:用助记符、符号和数字来表示指令的程序语言。

高级语言:于机器的,在编程时不需要对机器结构及其指令系统有深入了解的通用性语言。

4-2.什么是计算机的指令和指令系统? 答 见1题。

4-3.简述80C51汇编指令格式。

答 操作码 [目的操纵数][,源操作数]

4-4.简述80C51的寻址方式和所能涉及的寻址空间。 答 立即数寻址:程序存储器ROM。

直接寻址:片内RAM低128B和特殊功能寄存器。 寄存器寻址:R0~R7,A,AB,Cy,DPTR。 寄存器间接寻址:片内RAM低128B,片外RAM。 变址寻址:程序存储器KB。 相对寻址:程序存储器256B范围。

位寻址:片内RAM的20H~2FH字节地址,部分特殊功能寄存器。 4-5.要访问特殊功能寄存器和片外数据存储器,应采用哪些寻址方式? 答 SFR:直接寻址,位寻址,寄存器寻址;片外RAM:寄存器间接寻址。 4-6.在80C51片内RAM中,已知(30H)=38H,(38H)=40H,(40H)=48H,(48H)=90H。请分析下面各是什么指令,说明源操作数的寻址方式及按顺序执行后的结果。

答 MOV A,40H 直接寻址

MOV R0,A 寄存器寻址 MOV P1,#0F0H 立即数寻址 MOV @R0,30H 直接寻址 MOV DPTR,#3848H 立即数寻址 MOV 40H,38H 直接寻址

MOV R0,30H 直接寻址 MOV P0,R0 寄存器寻址 MOV 18H,#30H 立即数寻址 MOV A,@R0 寄存器间接寻址 MOV P2,P1 直接寻址

230

均为数据传送指令,结果(参见下图)为

30H 38H 40H 48H

(18H)=30H,(30H)=38H,(38H)=40H (40H)=40H,(48H)=90H R0=38H,A=40H,P0=38H,P1=FOH,P2=FOH,DPTR=3848H 4-7.对80C51片内RAM高128B的地址空间寻址要注意什么? 答 用直接寻址,寄存器寻址,位寻址。 4-8.指出下列指令的本质区别。 答 MOV A,data 直接寻址

MOV A,#data 立即数寻址 MOV data1,data2 直接寻址 MOV 74H,#78H 立即数寻址

4-9.设R0的内容为32H,A的内容为48H,片内RAM的32H内容为80H,40H的内容为08H。请指出在执行下列程序段后各单元内容的变化。

MOV A,@R0 ;((R0))=80H→A MOV @R0,40H ;(40H)=08H→(R0) MOV 40H,A ;(A)=80H→40H MOV R0,#35H ; 35H→R0 解 (R0)=35H (A)=80H (32H)=08H (40H)=80H

4-10.如何访问SFR,可使用哪些寻址方式? 答 访问SFR:直接寻址,位寻址,寄存器寻址。 4-11.如何访问片外RAM单元,可使用哪些寻址方式? 答 只能采用寄存器间接寻址(用MOVX指令)。 4-12.如何访问片内RAM单元,可使用哪些寻址方式?

答 低128B:直接寻址,位寻址,寄存器间接寻址,寄存器寻址(R0~R7)。 高128B:直接寻址,位寻址,寄存器寻址。

4-13.如何访问片内外程序存储器,采用哪些寻址方式? 答 采用变址寻址(用MOVC指令)。 4-14.说明十进制调整的原因和方法。

答 压缩BCD码在进行加法运算时本应逢十进一,而计算机只将其当作十六进制数处理,此时得到的结果不正确。用DAA指令调整(加06H,60H,66H)。

4-15.说明80C51的布尔处理机功能。 答 用来进行位操作。

RAM 38H 40H 48H 90H 231

4-16.已知(A)=83H,(R0)=17H,(17H)=34H,请指出在执行下列程序段后A的内容。

解 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

4-17.使用位操作指令实现下列逻辑操作。要求不得改变未涉及位的内容。 解 (1) 使ACC.0置1

SETB ACC.0 或 SETB EOH (2) 清除累加器高4位

CLR ACC.7 CLR ACC.6 CLR ACC.5 CLR ACC.4

(3)清除ACC.3,ACC.4,ACC.5,ACC.6

CLR ACC.6 CLR ACC.5 CLR ACC.4 CLR ACC.3

4-18.编写程序,将片内RAM R0~R7的内容传送到20H~27H单元。 解 MOV 27H,R7 MOV 23H,R3

MOV 26H,R6 MOV 22H,R2 MOV 25H,R5 MOV 21H,R1 MOV 24H,R4 MOV 20H,R0

4-19.编写程序,将片内RAM的20H,21H,22H三个连续单元的内容依次存入2FH,2EH,2DH中。

解 MOV 2FH,20H

MOV 2EH,21H MOV 2DH,22H

4-20.编写程序,进行两个16位数的减法:6F5DH一13B4H,结果存入片内RAM的30H和31H单元,30H存差的低8位。

解 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位结果→31H

232

4-21.编写程序,若累加器A的内容分别满足下列条件时,则程序转至LABEL存储单元。设A中有的是无符号数。

解 (1) A≥10

CJNE A,#10,L1 ;(A)与10比较,不等转L1 L2:LJMP LABEL ;相等转LABEL L1:JNC L2 ;(A)大于10,转LABEL

(2)A>10

CJNE A,#10,L1 ;(A)与10比较,不等转L1 SJMP L3 ;相等转L3 L1:JNC L2 ;(A)大于10,转L2 SJMP L4 ;(A)小于10,转L4 L2:JMP LABEL ;无条件转LABEL

(3)A≤10

CJNE A,#10,L1 ;(A)与10比较,不等转L1 L2:LJMP LABEL ;相等转LABEL L1:JC,L2 ;(A) 小于10,转LABEL

4-22.已知SP=25H,PC=2345H,(24H)=12H,(25H)=34H,(26H)=56H。问此时执行“RET”指令后,SP=? PC=?

解 SP=23H,PC=3412H

4-23.已知SP=25H,PC=2345H,标号LABEL所在的地址为3456H。问执行长调用指令“LCALL LABEL”后,堆栈指针和堆栈内容发生什么变化?PC的值等于什么?

解 SP=27H,(26H)=48H,(27H)=23H,PC=3456H

4-24.上题中LCALL能否直接换成ACALL指令,为什么? 如果使用ACALL指令,则可调用的地址范围是多少?

解 不能。ACALL是短转指令,可调用的地址范围是2 KB。

4-25.阅读下列程序,要求: (1)说明程序功能;

(2)试修改程序,使片内RAM的内容成为如图所示的结果。

233

LOOP: DONE:

MOV R2,#0AH MOV R0,#50H CLR A MOV @R0,A INC R0 DJNZ R2,LOOP

50H 51H 52H 53H H 55H 56H 57H 58H 59H

00H 01H 02H 03H 04H 05H 06H 07H 08H 09H (1)功能是将片内RAM中50H~59H单元清零。 (2)7A(OA) (7850) DA(FC)

(3)在INC R0后添一句INC A。

4-26.设(R0)=7EH,(DPTR)=10FEH,片内RAM中7EH单元的内容为0FFH,7F单元的内容为38H,试为下列程序注释其运行结果。

解 INC @R0 (7EH)=00H

INC R0 (R0)=7FH INC @R0 (7FH) =39H INC DPTR (DPTR) =10FFH INC DPTR (DPTR) =1100H INC DPTR (DPTR) =1101H

4-27.下列程序段经汇编后,从1000H开始的各有关存储单元的内容将是什么? ORG 1000H TAB1 EQU 1234H TAB2 EQU 3000H

DB “START” DW TAB1,TAB2,70H

解 (1000H)=53H (1001H)=H (1002H)=41H (1003H)=52H (1004H)=H (1005H)=12H (1006H)=34H (1007H)=30H (1008H)=00H

(1009H)=00H (100AH)=70H

4-28.阅读下列程序,并要求: (1)说明程序功能;

(2)写出涉及的寄存器及片内RAM单元(如图所示)的最后结果。

40H 98H

AFH 234

MOV R0,#40H ;40H→R0 MOV A,@R0 ;98H→A INC R0 ;41H→R0 ADD A,@R0 ;98+(A)=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。

4-29.同上题要求,程序如下:

61H F2H

MOV A,61H ;F2H→A MOV B,#02H ;02H→B

MUL AB ;F2H×02H=E4H→A ADD A,62H ;积的低8位加上CCH→A MOV 63H,A ;结果送63H 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)=BOH (H)=02H 4-30.编写程序,采用“与”运算,判断8位二进制数是奇数个1还是偶数个1。 解 MOV A,#XXH ;待判断的数→A

ANL A,#0FFH ;与0FFH相与 JB P,REL ;是奇数转REL ┇ ;是偶数程序顺序执行

REL: ┅

┇ ┇

4-31.编写程序,采用“或”运算,使任意8位二进制数的符号位必为1。

解 MOV A,XXH ;取数据→A ORL A,#80H ;使该数符号位为1 MOV XXH,A ;保存该数据

CCH 235

4-32.请思考:采用“异或”运算怎样可使一带符号数的符号位改变,数据位不变?怎样可使该数必然为零?

解 (1)符号位改变,数据位不变: MOV A,XXH ;取数据→A

XRL A,#80H ;异或80H→A (2)使该数为零:

MOV A,XXH ;该数→A MOV R0,A ;该数→R0 XRL A,R0 ;该数自身相异或

第5章 习题解答

5-1.编写程序,查找在片内RAM中的20H~50H单元中是否有0AAH这一数据。若有,则51H单元置为01H;若未找到,则51H单元置为00H。

解 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 SJMP L2 ;返回

L1: MOV 51H,#01H ;找到,01H→51H L2: RET ;返回

5-2.编写程序,查找在片内RAM中的20H~50H单元中出现00H的次数,并将查找结果存入51H单元。

解 MOV R2,#31H ;数据块长度→R2

MOV R0,#20H ;数据块首地址→R0

MOV 51H,#00H ;51H单元清零,以记录00H的个数 LOOP: MOV A,@R0 ;待查找的数据→A

ANL A,#0FFH ;与0FFH相与,判断该数据是否为零 JNZ L1 ;不为零,转L1 INC 51H ;为零,00H个数增1

L1: INC R0 ;地址增1,指向下一个待查数据

236

DJNZ R2,LOOP ;数据块长度减1,不等于零,继续查找 RET ;全部查找完,返回

5-3.外部数据RAM中有一个数据块,存有若干字符、数字,首地址为SOURCE。要求将数据块传送到内部RAM以DIST开始的区域,直到遇到字符“$”时结束。(“$”也要传送,它的ASCII码为24H。)

解 MOV DPTR,#SOURCE ;源首地址→DPTR

MOV R0,#DIST ;目的首地址→R0 L1: MOVX A,@DPTR ;传送一个字符 MOV @R0,A

INC DPTR ;指向下一个字符 INC R0

CJNE A,#24H,L1 ;传送的是“$”字符吗?不是,传送下一个字符 RET ; 是,结束传送

5-4.已知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位求反后→R3 L1: RET

5-5.已知30H和31H中存有一个16位的二进制数,高位在前,低位在后。编写程序将其乘2,并存回原处。

解 CLR C ;清进位位C MOV A,31H ;取该数低8位→A

RLC A ;带进位位左移一位 MOV 31H,A ;结果存回31H MOV A,30H ;取该数高8位→A RLC A ;带进位位左移一位 MOV 30H,A ;结果存回30H

5-6.内存中有2个4B以压缩BCD码形式存放的十进制数,一个存放在30H~33H的单元中,一个存放在40H~43H的单元中。编写程序求它们的和,结果存放在30H~33H中。

解 MOV R2,#04H ;字节长度→R2

237

MOV R0,#30H ;一个加数首地址→R0 MOV R1,#40H ;另一个加数首地址→R1 CLR C ;清进位位 L1; MOV A,@R0 ;取一个加数

ADDC A,@R1 ;两个加数带进位相加 DAA ;十进制调整 MOV @R0,A ;存放结果 INC R0 ;指向下一个字节 INC R1

DJNZ R2,L1 ;字节长度减l,没加完,转L1,继续相加 RET ;全加完,返回

5-7.编写程序,把片外RAM从2000H开始存放的8个数传送到片内30H开始的单元中。

解 MOV R2,#08H ;数据块长度→R2

MOV R1,#30H ;数据块目的地址→R1 MOV DPTR,#2000H ;数据块源地址→DPTR LOOP: MOVX A,@DPTR ;传送一个数据

MOV @R1,A

INC DPTR ;指向下一个数据 INC R1

DJNZ R2,LOOP ;长度减1,没传送完,转LOOP,继续传送 RET ;传送完,返回 5-8. 解

MOV DPTR,#2000H ;数据块源地址→DPTR

MOVX A,@DPTR ;传送一个数据 CPL A

SETB ACC.0 ;指向下一个数据 SETB ACC.7 ;指向下一个数据

MOVX A,@DPTR ;存放结果 RET

5-9.

解 MOV R0,#20H ;一个加数首地址→R0

MOV A,@R0 ;取数组长度 MOV R2,A ;数组长度→R2 INC R0 ;指向数组字节 CLR A ;清A L1; ADD A,@R0 ;加一个加数 INC R0 ;指向下一个字节

DJNZ R2,L1 ;数组长度减l,没加完,转L1,继续相加

238

MOV @R0,A ;存放结果

RET ;全加完,返回

第6章 习题解答

6-1.什么是中断和中断系统?其主要功能是什么?

答 当CPU正在处理某件事情的时候,外部发生的某一事件请求CPU迅速去处理,于是,CPU暂时中止当前的工作,转去处理所发生的事件,中断服务处理完该事件以后,再回到原来被终止的地方,继续原来的工作。这种过程称为中断,实现这种功能的部件称为中断系统。

功能1;使计算机具有实时处理功能,能对外界异步发生的事件作出及时的处理。 功能2:完全消除了CPU在查询方式中的等待现象,大大提高了CPU的工作效率。 功能3:实现实时控制。

6-2.试编写一段对中断系统初始化的程序,使之允许INT0、INT1、TO、串行接口中断,且使TO中断为高优先级中断。 解 MOV IE,#097H

6-3.在单片机中,中断能实现哪些功能?

答 有三种功能:分时操作,实时处理,故障处理。

6-4.80C51有哪些中断源?对其中断请求如何进行控制? 答 (1)80C51有如下中断源:

①INT0:外部中断0请求,低电平有效(由P3.2输入)。 ②INT1:外部中断1请求,低电平有效(由P3.3输入)。 ③TO:定时器/计数器0溢出中断请求。 ④TI:定时器/计数器1溢出中断请求。 ⑤TX/RX:串行接口中断请求。

(2)通过对特殊功能寄存器TCON、SCON、IE、IP的各位进行置位或复位等操作,可实现各种中断控制功能。

6-5.什么是中断优先级?中断优先处理的原则是什么? 答 中断优先级是CPU响应中断的先后顺序。

原则:(1)先响应优先级高的中断请求,再响应优先级低的。

(2)如果一个中断请求已被响应,同级的其他中断请求将被禁止。 (3)如果同级的多个中断请求同时出现,则CPU通过内部硬件查询电路,按查询顺序确定应该响应哪个中断请求。

查询顺序:外部中断0→定时器0中断→外部中断1→定时器1中断→串行接口中断

MOV IP,#02H

1 0 0 1 0 1 1 1 IE 0 0 0 0 0 0 1 0 IP

239

6-6.说明外部中断请求的查询和响应过程。

答 当CPU执行主程序第K条指令时,外设向CPU发出中断请求,CPU接到中断请求信号并在本条指令执行完后,中断主程序的执行并保存断点地址,然后转去响应中断。CPU在每一个S5P2期间顺序采样每个中断源,CPU在下一个机器周期S6期间按优先级顺序查询中断标志,如查询到某个中断标志为1,将在接下来的机器周期S1期间按优先级进行中断处理,中断系统通过硬件自动将相应的中断矢量地址装入PC,以便进入相应的中断服务程序。中断服务完毕后,CPU返回到主程序第K+1条指令继续执行。

6-7.80C51在什么条件下可响应中断? 答 (1)有中断源发出中断请求。

(2)中断总允许位EA=1,即CPU开中断。

(3)申请中断的中断源的中断允许位为1,即中断没有被屏蔽。 (4)无同级或更高级中断正在服务。 (5)当前指令周期已经结束。

(6)若现行指令为RETI或访问IE或IP指令时,该指令以及紧接着的另一条

指令已执行完毕。

6-8.简述80C51单片机的中断响应过程。

答 CPU在每个机器周期S5P2期间顺序采样每个中断源,CPU在下一个机器周期S6期间按优先级顺序查询中断标志,如查询到某个中断标志为1,将在接下来的机器周期S1期间按优先级进行中断处理,中断系统通过硬件自动将相应的中断矢量地址装入PC,以便进入相应的中断服务程序。一旦响应中断,8051首先置位相应的中断“优先级生效”触发器,然后由硬件执行一条长调用指令,把当前的PC值压人堆栈,以保护断点,再将相应的中断服务的入口地址送人PC,于是CPU接着从中断服务程序的人口处开始执行。对于有些中断源,CPU在响应中断后会自动清除中断标志。

6-9.在80C51 ROM中,应如何安排程序区?

答 主程序一般从0030H开始,主程序后一般是子程序及中断服务程序。 中断源 中断矢量地址 INT0 0003H TO 000BH INT1 0013H T1 001BH 串行接口 0023H

6-10.试述中断的作用及全过程。

答 作用:对外部异步发生的事件作出及时的处理。

过程:中断请求,中断响应,中断处理,中断返回。

6-11.在执行某一中断源的中断服务程序时,如果有新的中断请求出现,试问在什么情况下可响应新的中断请求?在什么情况下不能响应新的中断请求?

答 (1)符合以下6个条件可响应新的中断请求:

①有中断源发出中断请求。

②中断总允许位EA=1,即CPU开中断。

240

③申请中断的中断源的中断允许位为1,即中断没有被屏蔽。 ④无同级或更高级中断正在被服务。 ⑤当前的指令周期已结束。

⑥若现行指令为RETI或访问IE或IP指令时,该指令以及紧接着的另一条

指令已执行完。

(2)如果新的中断请求“优先级”低于正在执行的中断请求或与其同级,则不能被响应。

6-12.80C51单片机外部中断源有几种触发中断请求的方法?如何实现中断请求?

答 有两种方式:电平触发和沿触发。

电平触发方式:CPU在每个机器周期的S5P2期间采样外部中断引脚的输入电平。若为低电平,使IE1(IE0)置“1”,申请中断;若为高电平,则IE1(IE0)清零。

边沿触发方式:CPU在每个机器周期的S5P2期间采样外部中断请求引脚的输入电子。如果在相继的两个机器周期采样过程中,一个机器周期采样到外部中断请求为高电平,接着下—个机器周期采样到外部中断请求为低电平,则使IE1(IE0)置1,申请中断,否则,IE1(IE0)置0。

6-13.8051单片机有五个中断源,但只能设置两个中断优先级,因此在中断优先级安排上受到一定的,试问以下几种中断优先级的安排(由高到低)是否可能?若可能,则应如何设置中断源的中断级别?否则请简述不可能的理由。

解 同级优先次序为:INT0,TO,INT1,T1,TX/RX。

(1)定时器0,定时器1,外部中断0,外部中断1,串行接口中断。 ●可以,将TO,T1设置为高级。 MOV IP,#0AH

(2)串行接口中断,外部中断0,定时器0溢出中断,外部中断1,定时器1溢出中断。 ●可以,将串行接口中断设置为高级。 MOV 0B8H,#10H

(3)外部中断0,定时器1溢出中断,外部中断1,定时器0溢出中断,串行接口中断。 ●不可以,只能设置一级高级优先级,将INT0、T1设置为高级,而TO级别高于INT1。 (4)外部中断0,外部中断1,串行接口中断,定时器1溢出中断,定时器0溢出中断。 ●不可以,若将INT0,INT1,TX/RX设置为高级,而TO高于T1。

(5)串行接口中断,外定时器0溢出中断,外部中断0,外部中断1,定时器1溢出中断。 ●不可以,RX/TX级别最低,可将其设为最高级,而INT0优先级又高于TO。 (6)外部中断0,外部中断1,定时器0溢出中断,串行接口中断,定时器1溢出中断。 ●不可以,RX/TX级别最低,可设为最高级,而TO优先级又高于INTl。 (7)外部中断0,定时器1溢出中断,定时器0溢出中断,外部中断1,串行接口中断。 ●可以,将INT0,T1设为最高级。 MOV 0B8H,#09H

241

6-14.以中断方法设计单片机秒、分脉冲发生器,假定P1.0每秒钟产生一个机器周期的正脉冲,P1.1每分钟产生一个机器周期的正脉冲。

解 程序1(中断法): 1s=50ms×14H=50ms×20 1min=1s×3CH=1s×60 设

fOSC16

=12MHz T=0.05s=50ms T0 模式1 即TMOD=01H

16

6

3

定时时间t=(2一定时器初值X)×12×振荡周期=(2-X)×12/(12×10) 所以 X=2-50×10=65536-50000=15536=3CBOH

ORG 0000H AJMP MAIN ORG 000BH AJMP INSER ORG 0100H

MAIN: MOV R0,#00H ;R0为50ms计数器

MOV R1,#00H ;R1为秒计数器 MOV TMOD,#01H ;定时器T0工作于模式1 MOV TH0,#3CH ;置50 ms定时初值 MOV TL0,#0BOH

SETB ET0 ;允许T0中断

SETB EA ;CPU开放中断 SETB TR0 ;启动定时器T0

LOOP: AJMP LOOP ;等待50ms时间到 ORG 0200H

INSER: MOV TH0,#3CH ;重新置人定时初值

MOV TL0,#0BOH

INC R0 ;50 ms计数器增1

CJNE R0,#14H,L1 ;未到1s,转L1,中断返回 CLR P1.0

SETB P1.0 ;到ls,发一个正脉冲 CLR P1.0

MOV R0,#00H ;清R0

INC R1 ;秒计数器增1

CJNE R1,#3CH,L1 ;未到1min,转L1,中断返回 CLR P1.1

SETB P1.1 ;到1min,发一个正脉冲 CLR P1.1

MOV R1,#00H ;清R1 L1: RETI ;中断返回

16

242

解 程序2(中断法): 1s=50ms×14H=50ms×20 1min=1s×3CH=1s×60 设

fOSC16

=12MHz T=0.05s=50ms T0 模式1 即TMOD=01H

16

6

3

定时时间t=(2一定时器初值X)×12×振荡周期=(2-X)×12/(12×10) 所以 X=2-50×10=65536-50000=15536=3CBOH

ORG 0000H 16

MAIN: LOOP: INSER: L1:

000BH 0100H

R0,#14H ;R0为“50ms”计数器,置入初值20(计1s)

R1,#3CH ;R1为秒计数器,置入初值60(计1min) TMOD,#01H ;定时器T0工作于模式1 TH0,#3CH ;置50 ms定时初值 TL0,#0BOH

ET0 ;允许T0中断

SETB EA ;CPU开放中断 TR0 ;启动定时器T0

LOOP ;等待50ms时间到 0200H

MOV TH0,#3CH ;重新置人定时初值

TL0,#0BOH

R0,L1 ;“50ms”计数器减1,到1s吗? 未到转L1,中断返回 P1.0

P1.0 ;到ls,发一个正脉冲 P1.0

R0,#14H ;“50ms”计数器,置入初值20(计下1s) R1,L1 ;秒计数器减1,到1min吗? 未到转L1,中断返回 P1.1

P1.1 ;到1min,发一个正脉冲 P1.1

MOV R1,#3CH ;秒计数器,置入初值60(计下1min)

RETI ;中断返回 243

AJMP MAIN ORG AJMP INSER ORG MOV MOV MOV MOV MOV SETB SETB AJMP ORG MOV DJNZ CLR SETB CLR MOV DJNZ CLR SETB CLR

程序2(查询法):计算初值,

16

6

fOSC=12MHz,T0计时50ms,

-3

(2一X)×12/(12×10)=50×10 (作50ms定时) 则初值 X=15536D=3CBOH 1s= 50ms×l4H

1min=1s×3CH

ORG 0000H SJMP MAIN ORG 0040H

MAIN: MOV TMOD,#0lH ;设定时器T0工作于模式1

MC: MOV R1,#3CH ;R1为秒计数器,置入初值60(计1min) MCH: MOV R0,#14H ;R0为“50ms”计数器,置入初值20(计1s) CHV: MOV THO,#3CH ;T0设置50ms定时

MOV TL0,#0BOH

SETB TR0 ;启动T0

LOOP: JNB TF0,$ ;查询50ms时间到,时间未到,继续查询

DJNZ R0,CHV ;到50ms,“50ms”计数器减1,到1s吗? 未到转CHV CLR TR0 ;到1s,关闭T0 CLR P1.0

SETB P1.0 ;发一个正脉冲 CLR P1.0

DJNZ R1,MCH ;秒计数器减1,到1min吗? 未到转MCH CLR P1.1

SETB P1.1 ;到1min,发一个正脉冲 CLR P1.1

SJMP MC ;转MC END

第7章 习题解答

7-1.定时器方式2有什么特点?适用于什么应用场合? 答

(1)方式2把TL0(或TL1)配置成一个可以自动重装载的8位定时器/计数器。TL0计数溢出时不仅使溢出中断标志位TF0置1,而且还自动把TH0中的内容重新装载到TL0中。TL0用作8位计数器,TH0用以保存初值。

(2)用于定时工作方式时间(TF0溢出周期)为T=(2-TH0初值)×振荡周期×12,用于计数工作方式时,最大记数长度(TH0初值=0)为2=256个外部脉冲。

这种工作模式可省去用户软件重装初值的语句,并可产生相当精确定时时间,特别适于作串行波特率发生器。

88

244

7-2.单片机用内部定时方式产生频率为100 KHz等宽矩形波,假定单片机的晶振频率为12MHz,请编程实现。

解 程序1(中断法):f=100kHz,T=1×10-5秒

设 OSC=12MHz t=0.5×10-5s=5us T0 模式0 即TMOD=00H

定时时间t=(213一定时器初值X)×12×振荡周期 0.5×10-5=(213-X)×12/(12×106) X=8187=1111111111011 TO低5位:1BH TO高8位:FFH

fORG 0000H AJMP MAIN ORG 000BH AJMP INSER ORG 0100H

MAIN: MOV TMOD,#00H ;定时器T0工作于模式0

MOV TH0,#0FFH ;置5us定时初值 MOV TL0,#1BH

SETB ET0 ;允许T0中断

SETB EA ;CPU开放中断 SETB TR0 ;启动定时器T0

LOOP: AJMP LOOP ;等待5us时间到 ORG 0200H

INSER: MOV TH0,#0FFH ;重新置人定时初值

MOV TL0,#1BH

CPL P1.0 ;输出取反,形成等宽矩

形波

RETI ;中断返回

解 程序2(中断法):f=100kHz,T=1×10-5秒

设 OSC=12MHz t=0.5×10-5s=5us T0 模式1 即TMOD=01H

定时时间t=(216一定时器初值X)×12×振荡周期 0.5×10-5=(216-X)×12/(12×106)

245

f X=65531=1111111111111011 TO低8位:FBH

TO高8位:FFH

ORG 0000H AJMP MAIN ORG 000BH AJMP INSER ORG 0100H

MAIN: MOV TMOD,#01H ;定时器T0工作于模式1

MOV TH0,#0FFH ;置5us定时初值 MOV TL0,#0FBH

SETB ET0 ;允许T0中断

SETB EA ;CPU开放中断 SETB TR0 ;启动定时器T0

LOOP: AJMP LOOP ;等待5us时间到 ORG 0200H

INSER: MOV TH0,#0FFH ;重新置人定时初值

MOV TL0,#0FBH

CPL P1.0 ;输出取反,形成等宽矩

形波

RETI ;中断返回

解 程序3(中断法):f=100kHz,T=1×10-5秒

设 OSC=12MHz t=0.5×10-5s=5us T0 模式2 即TMOD=02H

定时时间t=(28一定时器初值X)×12×振荡周期 0.5×10-5=(28-X)×12/(12×106)

X=251=11111011 TO低8位:FBH TO高8位:

FBH

f246

ORG 0000H

AJMP MAIN ORG 000BH AJMP INSER ORG 0100H

MAIN: MOV TMOD,#02H ;定时器T0工作于模式2

MOV TL0,#0FBH ;置5us定时初值 MOV TH0,#0FBH ;置自动重装载常数 SETB ET0 ;允许T0中断

SETB EA ;CPU开放中断 SETB TR0 ;启动定时器T0

LOOP: AJMP LOOP ;等待5us时间到 ORG 0200H

INSER: CPL P1.0 ;输出取反,形成等宽矩形波

RETI ;中断返回

7-3.80C51定时器有哪几种工作方式?有何区别? 答 有模式0,模式1,模式2,模式3。

(1)模式0:选择定时器(TO或T1)的高8位和低5位组成一个13位定时器/计数器。TL低5位溢出时向TH进位,TH溢出时向中断标志位TF0进位,并申请中断。

定时时间t=(2一初值)×振荡周期×12;计数长度为2=8192个外部脉冲。 (2)模式1:与模式0的唯一差别是寄存器TH和TL以全部16位参与操作。 定时时间t=(2一初值)×振荡周期×12,计数长度为2=65536个外部脉冲。 (3)模式2:把TL0和TL1配置成一个可以自动重装载的8位定时器/计数器。TL用作 8位计数器,TH用以保存初值。TL计数溢出时不仅使TF0置1,而且还自动将TH中的内容重新装载到TL中。

定时时间t=(2一初值)×振荡周期×12,计数长度为256个外部脉冲。 (4)模式3:对TO和T1不大相同。

若TO设为模式3,TLO和THO被分为两个相互的8位计数器。TL0为8位计数

816

16

13

13

247

器,功能与模式0和模式1相同,可定时可计数。

THO仅用作简单的内部定时功能,它占用了定时器T1的控制位TR1和中断标志位TF1,启动和关闭仅受TR1的控制。

定时器T1无工作模式3,但TO在工作模式3时T1仍可设置为模式0~2。 7-4.80C51单片机内部设有几个定时器/计数器?它们是由哪些特殊功能寄存器组成?

答 8051单片机内有两个16位定时器/计数器,即TO和T1。 TO由两个8位特殊功能寄存器THO和TL0组成;T1由TH1和TL1组成。

7-5.定时器用作定时器时,其定时时间与哪些因素有关?作计数器时,对外界计数频率有何?

答 定时时间与定时器的工作模式,初值及振荡周期有关。 作计数器时对外界计数频率要求最高为机器振荡频率的1/24。 7-6.筒述定时器4种工作模式的特点,如何选择设定? 答

(1)模式0:TH0 TL0只用了13位。

定时时间t=(2一初值)×振荡周期×12,计数8192个。 置TMOD中的M1M0为00。

(2)模式l:TH0 TL0以全部16位参与操作。

定时时间t=(2一初值)×振荡周期×12,计数65536个。 置TMOD中的M1M0为01。

(3)模式2:TL0溢出时不仅把TF0置1,还自动将TH0内容重装到TL0。

定时时间t=(2一初值)×振荡周期×12,计数256个。 置TMOD中的M1M0为10。

(4)模式3:只有To可工作在模式3。TL0可工作在定时器或计数器方式,TH0只可用作简单的内部定时功能。T0工作在模式3时T1仍可置为模式0~2。

置TMOD中的M1M0为11。

7-7.当定时器To用作模式3时,由于TR1位已被To占用,如何控制T1的开启和关闭?

答 用T1控制位C/T切换其定时器或计数器工作方式可以使T1运行。见《教

材》P107。

定时器T1无工作模式3,将T1设置为模式3,就会使T1立即停止计数,关闭。 7-8.以定时器/计数器1进行外部计数,每计数1000个脉冲后,定时器/计数器1转为定时工作方式,定时10ms后又转为计数方式,如此循环不止。假定6MHZ,用模式1编程。

解 T1为定时器时初值:

10×10=(2-X) ×12/(6×10)

所以 X=2-10×10×6×10/12=65536-5000=EC78H T1为计数器时初值:

X+1000=2所以 X=536=FCl8H

16

16

-3

6

-3

16

6

8

1

1

1

16

1

1

13

1

1

fOSC为

248

L1: MOV TMOD,50H ;设置T1为计数方式且工作于模式1 MOV TH1,#0FCHl ;置入计数初值 MOV TL1,#18H

SETB TR1 ;启动T1计数器

LOOP1: JBC TF1,L2 ;查询计数溢出?有溢出(计满1 000个)转L2 SJMP LOOP1 ;无溢出转LOOP1,继续查询 L2: CLR TR1 ;关闭T1

MOV TMOD,#10H ;设置T1为定时方式且工作于模式1 MOV TH1,#OECH1 ;置入定时10 ms初值 MOV TL1, #78H

SETB TR1 ;启动T1定时

LOOP2: JBC TF1,L1 ;查询10ms时间到?时间到,转L1

SJMP LOOP2 ;时间未到,转LOOP2,继续查询

7-9.一个定时器的定时时间有限,如何实现两个定时器的串行定时以满足

较长定时时间的要求?

答 当一个定时器定时溢出时,设置另一个定时器的初值为。开始定时。 7-10.使用一个定时器,如何通过软硬件结合方法实现较长时间的定时? 答 设定好定时器的定时时间,采用中断方式用软件设置计数次数,进行溢出次数累计,从而得到较长的时间。

7-11.80C51定时器作定时和计数时其计数脉冲分别由谁提供?

答 作定时器时计数脉冲由8051片内振荡器输出经12分频后的脉冲提供;作计数器时计数脉冲由外部信号通过引脚P3.4和P3.5提供。

7-12.80 C 51定时器的门控信号GATE设置为1时定时器如何启动? 答 只有INT0 (或INT1)引脚为高电平且由软件使TR0(或TR1)置1时,才能启动定时器工作。

7-13.已知80 C 51单片机的

f6

OSC形波高电平宽50s,低电平宽300s。 50×10= (2-X) ×12/ (6×10)

-6

8

=6MHz,利用TO和P1.0输出矩形波,矩

解 T0采用模式2作50s定时时的初值: 所以 X=256—50×10×6×10/12=231=E7H 作300s定时时的初值:

300×10=(2一X) ×12/(6×10)

所以 X=256—300×10×6×10/12=106=6AH

MOV TMOD,#02H ;设置定时器T0工作于模式2

L2: CLR P1.0 ;P1.0输出低电平

MOV THO,#6AH ;置入定时300μs初值 MOV TL0,#6AH

SETB TR0 ;启动T0

LOOP1:JBC TF0,L1 ;查询300s时间到?时间到,转L1

SJMP LOOP1 ;时间未到,转LOOP1,继续查询

-6

6

-6

8

6

-6

6

249

L1: SETB P1.0 ;P1.0输出高电平

CLR TR0 ;关闭T0

MOV TH0, #0E7H ;置入定时50μs初值 MOV TL0, #0E7H

SETB TR0 ;启动T0

LOOP2: JBC TF0,L2 ;查询50μs时间到?时间到,转L2

SJMP LOOP2 ;时间未到,转LOOP2,继续查询

7-14.已知80C51单片机

fOSC别输出周期为2ms和500s的方波。

=12MHZ,用T1定时,试编程由P1.0和P1.1引脚分

解 程序1(中断法):

用T1分别定时250us和1ms。硬件定时250us,配合软件计数4次实现1ms定时

设 OSC=12MHz t=250us T1 模式0 即TMOD=00H

定时时间t=(213一定时器初值X)×12×振荡周期 250×10-6=(213一X) ×12/(12×106)

X=7492=1111100000110B T1低5位:06H T1

高8位:F8H

f250

ORG 0000H

AJMP MAIN ORG 001BH AJMP INSER ORG 0100H

MAIN: MOV TMOD MOV TH1 MOV TL1 MOV R2置入初值4(计1ms)

CLR P1.0 CLR P1.1 SETB ET1 SETB EA SETB TR1 LOOP: AJMP LOOP ORG 0200H

INSER: MOV TH1 MOV TL1 CPL P1.1 500s的方波

DJNZ R2到1ms吗?未到转L1

CPL P1.0 2ms的方波

MOV R2入初值4(计下1ms)

L1: RETI

,#00H ,#0F8H ,#06H

,#04H ,#0F8H ,#06H

,L1 ,#04H 251

;定时器T1工作于模式0

;置250us定时初值 ;R2为“250s”计数器,;P1.0输出低电平 ;P1.1输出低电平

;允许T1中断 ;CPU开放中断 ;启动定时器T1

;等待5us时间到 ;重新置人定时初值

;输出取反,形成周期为

250s”计数器减1,;输出取反,形成周期为

;“250s”计数器,置;中断返回

;“

解 程序2(中断法):

用T1分别定时250us和1ms。硬件定时250us,配合软件计数4次实现1ms定时

设 OSC=12MHz t=250us T1 模式1 即TMOD=10H

定时时间t=(216一定时器初值X)×12×振荡周期 250×10-6=(216一X) ×12/(12×106)

X=65286=1111111100000110B T1低8位:06H

T1高8位:FFH

ORG 0000H AJMP MAIN ORG 001BH AJMP INSER ORG 0100H

MAIN: MOV TMOD,#10H ;定时器T1工作于模式0

MOV TH1,#0FFH ;置250us定时初值 MOV TL1,#06H

MOV R2,#04H ;R2为“250s”计数器,置入初值4(计1ms)

CLR P1.0 ;P1.0输出低电平 CLR P1.1 ;P1.1输出低电平

SETB ET1 ;允许T1中断 SETB EA ;CPU开放中断 SETB TR1 ;启动定时器T1

LOOP: AJMP LOOP ;等待5us时间到

f252

ORG 0200H

INSER: MOV TH1,#0FFH ;重新置人定时初值

MOV TL1,#06H

CPL P1.1 ;输出取反,形成周期为

500s的方波

DJNZ R2,L1 ;“250s”计数器减1,到1ms吗?未到转L1

CPL P1.0 ;输出取反,形成周期为

2ms的方波

MOV R2,#04H ;“250s”计数器,置入初值4(计下1ms)

L1: RETI ;中断返回

解 程序3(中断法):

用T1分别定时250us和1ms。硬件定时250us,配合软件计数4次实现1ms定时

设 OSC=12MHz t=250us T1 模式2 即TMOD=20H

定时时间t=(28一定时器初值X)×12×振荡周期 250×10-6=(28一X) ×12/(12×106)

X=6=00000110B T1低8位:06H T1高8位:

06H

f253

ORG 0000H AJMP MAIN ORG 001BH AJMP INSER ORG 0100H

MAIN: MOV TMOD,#20H ;定时器T1工作于模式0

MOV TL1,#06H ;置250us定时初值 MOV TH1,#06H ;置自动重装载常数

MOV R2,#04H ;R2为“250s”计数器,置入初值4(计1ms)

CLR P1.0 ;P1.0输出低电平 CLR P1.1 ;P1.1输出低电平

SETB ET1 ;允许T1中断 SETB EA ;CPU开放中断 SETB TR1 ;启动定时器T1

LOOP: AJMP LOOP ;等待5us时间到 ORG 0200H

INSER: CPL P1.1 ;输出取反,形成周期为500s的方波

DJNZ R2,L1 ;“250s”计数器减1,到1ms吗?未到转L1

CPL P1.0 ;输出取反,形成周期为

2ms的方波

MOV R2,#04H ;“250s”计数器,置入初值4(计下1ms)

L1: RETI ;中断返回

7-15.单片机80C51的时钟频率为6MHz,若要求定时为0.1ms、1ms、10ms,定时器工作在模式0、模式1、模式2,其定时器初值各应是多少? 解 (1) 0.1ms

模式0:0.1×10=(2-X) ×12/(6×10) 所以 X=8142=1111111001110B T0低5位:01110B=0EH T0高8位:11111110B:FEH

模式1:0.1×10=(2-X) ×12/(6×10)

-3

16

6

-3

13

6

2

所以 X=686=FFCEH

模式2:0.1×10=(2-X) ×12/(6×10) 所以 X=206=CEH (2) 1ms

模式0: 1×10=(2-X) ×12/(6×10) 所以 X=7692=1111000001100B T0低5位:01100B=0CH T0高8位:11110000B=FOH

模式1:1×10=(2-X) ×12/(6×10) 所以 X=65036=FEOCH 模式2:在

-3

16

6

-3

13

6

-3

8

6

fOSC=6 MHZ时,最长定时为512

s,无法一次实现定时1ms,可用

0.1 ms循环10次。 (3) 10 ms

模式0:10×10=(2-X) ×12/(6×10)

所以 X=3192=110001111000B T0低5位:11000B=18H T0高8位:01100011B=63H

模式1:10×10=(2-X) ×12/(6×10)

所以 X=60536=EC78H 模式2:可用0.1ms循环100次。

7-16.80C51单片机的定时器在何种设置下可提供3个8位计数器/定时器?这时,定时器1可作为串行接口波特率发生器。若波特率按1600b/s,4800b/s,2400b/s,1200b/s,600b/s,100b/s来考虑,则此时可选用的波特率是多少?(允许存在一定误差。)设

-3

16

6

-3

13

6

fOSC=12MHZ。

解 当T0为模式3,T1为模式2时,可提供3个8位定时器。

Tf

MAX=256×12/12=256s =3906.25b/s(T1溢出率)

MIN 可选100 bps。

7-17.试编制一段程序功能为:当P1.2引脚的电平上跳时,对P1.1的输入脉冲进行计数;当P1.2引脚的电平下跳时停止计数,并将数值写入R6、R7。 解

MOV TMOD,#05H ;T0为计数方式且工作于模式1 JNB P1.2,$ ;等待P1.2引脚电平上跳 MOV THO,#00H1 ;P1.2电平上跳,置入计数初值 MOV TL0,#00H

SETB TR0 ;启动T0

JB P1.2,$ ;等待P1.2引脚电平下跳 CLR TR0 ;电平下跳,关闭T0

255

MOV R7, TH0 ;计数值写入R6、R7 MOV R6, TL0 7-18.设波。

解 T0作定时器时初值:200×10=(2-X) ×12/(6X10)

所以 X=56=38H

程序1:

CLR P1.0 ;P1.0输出低电平

MOV R2,#05H ;R2为“200s”计数器,置入初值5,计1ms MOV TMOD,#02H ;设定时器T0工作于模式2 L2: MOV THO,#38H ;置入定时初值 MOV TL0,#38H

L00P: JBC TF0,L1 ;查询200s时间到?时间到,转L1 SJMP L00P ;时间未到,转L00P,继续查询 L1: CLR TR0 ;关闭T0

DJNZ R2,L2 ;“200s”计数器减1,到l ms吗?未到,转L2 CPL P1.0 ;到1ms,P1.0输出取反,形成周期为2ms的方波 MOV R2,#05H ;重置“200s”计数器初值 LJMP L2 ;重复循环 程序2:

MAIN: MOV TMOD,#02H ;设定时器T0工作于模式2

LOOP1: MOV R0,#05H ;R0为“200s”计数器,置入初值5(计1ms) LOOP: MOV TH0,#38H ;置入定时初值 MOV TL0,#38H

SETB TR0 ;启动T0

JNB TF0,$ ;查询200s时间到?时间未到,继续查询 CLR TR0 ;时间到,关闭T0

DJNZ R0,LOOP ;“200s”计数器减1,到1ms吗?未到,转LOOP CPL P1.0 ;到1ms,P1.0输出取反,形成周期为2ms的方波 SJMP LOOP1

SETB TR0 ;启动T0

-6

8

6

fOSC=12MHz,试编写程序,功能为:对定时器TO初始化,使之工

作在模式2产生200μs定时,并用查询TO溢出标志的方法控制P1.0输出2ms周期方

解 程序3(中断法):

用 T0 硬件定时200us,配合软件计数5次实现1ms定时 设

fOSC=12MHz t=200us T0 模式2 即TMOD=02H

8

定时时间t=(2一定时器初值X)×12×振荡周期 200×10=(2一X) ×12/(12×10)

X=56=00000110B T0低8位:38H T0高8位:38H ORG 0000H

-6

8

6

256

AJMP MAIN ORG 000BH AJMP INSER ORG 0100H

MAIN: MOV TMOD,#02H ;定时器T0工作于模式0

MOV TL0,#38H ;置200us定时初值

MOV R2,#05H ;R2为“200s”计数器,置入初值5(计1ms) CLR P1.0 ;P1.0输出低电平

SETB ET0 ;允许T1中断 SETB EA ;CPU开放中断 SETB TR0 ;启动定时器T1

LOOP: AJMP LOOP ;等待5us时间到

INSER: DJNZ R2,L1 ;“200s”计数器减1,到1ms吗?未到转L1 MOV R2,#05H ;“200s”计数器,置入初值5(计下1ms)

L1: RETI ;中断返回

CPL P1.0 ;输出取反,形成周期为2ms的方波 ORG 0200H

MOV TH0,#38H ;置自动重装载常数

第8章 习题解答

8-1.什么是串行异步通信,它有哪些特征?

答 在异步通信中,数据是一帧一帧(包括一个字符代码或一字节数据)传送的,每一帧的数据格式如《教材》P179图所示。通信采用帧格式,无需同步字符。存在空闲位也是异步通信的特征之一。

8-2.80C51单片机的串行接口由哪些功能部件组成?各有什么作用? 答 80C51单片机的串行接口由发送缓冲器SBUF、接收缓冲器SBUF、输入移位寄存器、串行接口控制寄存器SCON、定时器T1构成的波特率发生器等部件组成。

由发送缓冲器SBUF发送数据,接收缓冲器SBUF接收数据。串行接口通信的工作方式选择、接收和发送控制及状态标志等均由串行接口控制寄存器SCON控制和指示。定时器T1产生串行通信所需的波特率。 8-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取出信息通过80C51内部总线送CPU。

257

8-4.80C51串行接口有几种工作方式?有几种帧格式?各工作方式的波特率如何确定?

答 80C51串行接口有4种工作方式:

方式0(8位同步移位寄存器),方式1(10位异步收发),方式2(1l位异步收发),方式3(11位异步收发)。

有2种帧格式:10位,11位。 方式0:

方式0的波特率≌ʃ 方式2:

osc

/12(波特率固定为振荡频率l/12)

 方式2的波特率 方式1和方式3:

2SMODfOSC

 方式1和方式3的波特率

2SMOD32fOSC12(256x- ) 定时器T1用作波特率发生器时,通常选用工作模式2(自动重装初值定时器)。 8-5.若异步通信接口按方式3传送,已知其每分钟传送3600个字符,其波特率是多少?

解 已知每分钟传送3 600个字符,方式3每个字符11位,则: 波特率=(11b/字符)×(3600字符/60s)=660b/s 8-6.80C51中SCON的SM2、TB8、RB8有何作用?

答 80C51中SCON的SM2是多机通信控制位,主要用于方式2和方式3。若置SM2=1,则允许多机通信。

TB8是发送数据的第9位,在方式2或方式3中,根据发送数据的需要由软件置位或复位。它在许多通信协议中可用作奇偶校验位;在多机通信中作为发送地址帧或数据帧的标志位。

RB8是接收数据的第9位,在方式2或方式3中,接收到的第9位数据放在RB8位。它或是约定的奇/偶校验位,或是约定的地址/数据标识位。 8-7.设

fOSC=11.0592MHz,试编写一段程序,其功能为对串行接口初始化,

使之工作于方式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,$ ;等待发送完

258

CLR TI ;清TI标志 SJMP $ ;结束

8-8.若晶振为11.059 2MHz,串行接口工作于方式1,波特率为4800b/s。写出用T1作为波特率发生器的模式字和计数初值。

MOV TMOD,#20H ;定时器T1工作于模式2 MOV TH1,#0FAH ;赋定时器计数初值 MOV TL1,#0FAH ;赋重装值

8-9.为什么定时器T1用作串行接口波特率发生器时,常选用工作模式2?若已知系统时钟频率和通信用的波特率,如何计算其初值?

答 因为工作模式2是自动重装初值定时器,编程时无需重装时间常数(计数初值),比较实用。若选用工作模式0或工作模式1,当定时器T1溢出时,需在中断服务程序中重装初值。 已知系统时钟频率初值X:

fOSC和通信用的波特率

fbaud,可得出定时器T1模式2的

X256

fOSC(SMOD1)384fbaud

8-10.若定时器T1设置成模式2作波特率发生器,已知产生的最高和最低的波特率。

fOSC=6MHz。求可能

最高波特率为T1定时最小值时,此时初值为255,并且SMOD=1,有

最低波特率为T1定时最大值时,此时初值为0,且SMOD=0,有

ffOSCfOSC2231250baud3212(256-x)3212(256-255)

SMOD

8-11.80C51单片机4种工作方式的波特率应如何确定? 答 方式0:

方式0的波特率 方式2:

fbaud2fOSC1613212(256-x)3212(256-0)

SMODOSCffOSC12(波特率固定为振荡频率1/12)

 方式2的波特率 方式1和方式3:

2SMODfOSC

 方式1和方式3的波特率

2SMOD32fOSC12(256-x)

8-12.简述单片机多机通信的原理。

259

答 当一片80C51(主机)与多片80C51(从机)通信时,所有从机的SM2位都置1。主机首先发送的一帧数据为地址,即某从机机号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。各个从机根据收到的第9位数据(RB8中)的值来决定从机可否再接收主机的信息。若(RB8) =0,说明是数据帧,则使接收中断标志位RI=0,信息丢失,若(RB8) =1,说明是地址帧,数据装入SBUF并置RI=1,中断所有从机,只有被寻址的目标从机清除SM2(SM2=0),以接收主机发来的一帧数据(点对点通信)。其他从机仍然保持SM2=1。

8-13.以80C51串行接口按工作方式1进行串行数据通信。假定波特率为1200b/s,以中断方式传送数据。请编写全双工通信程序。 解 设系统时钟频率时钟频率

fOSC=6.0MHZ。查《教材》P194表9—2可知,当系统

fOSC=6.0MHZ,波特率为1200b/s时,可取SMOD=0,T1的计数初值为

F3H。程序如下:

ORG 0000H AJMP MAIN ORG 0023H AJMP SERVE1 ORG 0040H

MAIN: MOV SP, #60H ;置堆栈指针

MOV TMOD,#20H ;置T1工作于模式2 MOV TH1, #0F3H ;赋T1计数初值 MOV TL1, #0F3H ;赋T1重装值 STEB TR1 ;启动T1

MOV SCON,#50H ;置串行接口工作于方式1,允许接收 MOV PCON,#00H ;设SMOD=0

MOV R0, #20H ;置发送数据区首址 MOV R1, #40H ;置接收数据区首址 MOV R7, #10H ;置发送字节长度 MOV R6, #10H ;置接收字节长度 SETB EA ;CPU允许中断 SETB ES ;允许串行接口中断 MOV A, @R0 ;取第一个数据发送 MOV SBUF,A ;发送数据 SJMP $ ;等待中断

SERVE: JNB RI,SEND ;不是接收中断,转发送

CLR RI ;是接收中断,清除接收中断标志 MOV A,SBUF ;接收数据

MOV @R1,A ;将接收数据送人接收数据区

DJNZ R6,L1 ;数据块未接收完,转L1

SJMP L2 ;数据块接收完,转L2 L1: INC R1 ;修改数据区指针

260

L2: RETI ;中断返回

SEND: CLR TI ;是发送中断,清除发送中断标志

DJNZ R7,L3 ;数据块未发送完,转L3

SJMP L4 ;数据块发送完,转L4 L3: MOV A,@R0 ;取数据发送

MOV SBUF,A ;发送数据 INC R0 ;修改数据区指针

L4: RETI ;中断返回

8-14.以80C51串行接口按工作方式3进行串行数据通信。假定波特率为1200b/s,第9数据位作奇偶校验位,以中断方式传送数据。请编写通信程序。 解 查《教材》P190表8—2可知,当系统时钟频率

ORG 0000H AJMP MAIN ORG 0023H AJMP STOP ORG 0040H

MAIN: MOV SP, #60H ;置堆栈指针

MOV TMOD,#20H ;置T1工作于模式2 MOV TH1, #0E8H ;赋T1计数初值 MOV TL1, #0E8H ;赋T1重装值 SETB TR1 ;启动T1

MOV SCON,#0DOH ;置串行接口工作于方式3,允许接收 MOV PCON,#00H ;设SMOD=0

MOV R0,#20H ;置发送数据区首址 MOV R1,#40H ;置接收数据区首址 SETB EA ;CPU允许中断 SETB ES ;允许串行接口中断 MOV A,@R0 ;取第一个数据发送 MOV C,PSW.0 ;将奇偶标志送C CPL C ;形成奇校验 MOV B8,C ;奇校验标志送TB8 MOV BUF,A ;发送数据 SJMP $ ;等待中断

STOP: JNB RI,SOUT ;不是接收中断,转发送

CLR RI ;是接收中断,清除接收中断标志 MOV A,SBUF ;接收数据 MOV C,PSW.0 ;将奇偶标志送C CPL C ;形成奇校验

JC LOOP1 ;判断接收端的奇偶值,C=1转LOOP1

fOSC=11.0592MHz,波

特率为1200b/s时,可取SMOD=0,T1的计数初值为E8H。串行通信按奇校验传送:

261

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=1,RB8=0,转出错处理 LOOP2: MOV @R1,A ;将接收数据送人接收数据区 INC R1 ;修改数据区指针 RETI ;中断返回

SOUT: CLR TI ;是发送中断,清除发送中断标志 INC RO ;修改数据区指针 MOV A,@R0 ;取数据发送 MOV C,PSW.0 ;将奇偶标志送C CPL C ;形成奇校验 MOV TB8,C ;奇校验标志送TB8 MOV SBUF,A ;发送数据 RETI ERROR: ┅

8-15.某异步通信接口,其帧格式由1个起始位“0”、7个数据位、1个偶校验和1个停止位“1“组成。当该接口每分钟传送1 800个字符时,试计算出传送波特率。

解 该异步通信接口的帧格式为10b/字符,当该接口每分钟传送1800个字符时:

波特率=(10b/字符) ×(1800字符/60s)=300b/s 8-16.串行接口工作在方式1和方式3时,其波特率与模式2的初值及SMOD位的关系如何? 设几 解 关系如下:

fOSC、定时器T1工作

fOSC=6 MHz,现利用定时器T1工作模

式2产生的波特率为110b/s,试计算定时器初值。

 方式1和方式3的波特率 当波特率=110b/s,

2SMOD32fOSC12(256-x)

fOSC=6MHZ,令SMOD=0,有

0661025623212110=256-142=114=72H T1的初值x=

8-17.设计一个单片机的双机通信系统,并编写通信程序。将甲机片内RAM 30H~3FH存储区的数据块通过串行接口传送到乙机片内40H~4FH存储区中去。 解 设当系统时钟频率 甲机发送程序:

ORG 0000H

fOSC=11.0592MHZ,波特率为1200b/s时,可取

SMOD=0,T1的计数初值为E8H。串行通信采用查询方式,甲机发送,乙机接收。

262

AJMP MAIN ORG 0040H

MAIN: MOV SP,#60H ;置堆栈指针

MOV TMOD,#20H ;置T1工作于模式2 MOV TH1,#0E8H ;赋T1计数初值 MOV TL1,#0E8H ;赋T1重装值 STEB TR1 ;启动T1

MOV SCON,#50H ;置串行接口工作于方式1,允许接收 MOV PCON,#00H MOV R0,#30H MOV R7,#10H SEND: MOV A,#3FH MOV SBUF,A JNB TI,$ CLR TI JNB RI,$ CLR RI MOV A,SBUF CJNE A,#2EH,SEND MOV A,R7

MOV SBUF,A JNB TI,$ CLR TI SEND1: MOV A,@R0

MOV SBUF,A JNB TI,$ CLR TI INC R0 DJNZ R7,SEND1 SJMP $ 乙机接收程序:

ORG 0000H AJMP MAIN ORG 0040H

MAIN: MOV SP,#60H MOV TMOD,#20H MOV TH1,#0E8H MOV TL1,#0E8H STEB TR1 MOV SCON,#50H MOV PCON,#00H ;设SMOD=0

;置发送数据区首址 ;置发送数据字节长度

;联络信号‘?’,即3FH送A

;发送联络信号 ;等待发送完 ;发送完,清TI ;等待乙机应答 ;乙机应答后,清RI

;接收乙机应答字,‘.’即2EH 应答正确否? 不正确转SEND,重新联络;应答正确,发送数据字节长度 ;等待字节长度发送完 ;发送完,清TI

;发送一字节数据 ;等待发送完 ;发送完,清TI ;修改数据区地址指针 ;数据块未发送完,转SEND1 ;发送完毕

;置堆栈指针

;置T1工作于模式2 ;赋T1计数初值 ;赋T1重装值 ;启动T1

;置串行接口工作于方式1,允许接收 ;设SMOD=0

263

; MOV R1,#40H ;置接收数据区首址 MOV R7,#00H ;接收数据字节长度单元清0

RECE: JNB RI,$ ;等待接收甲机联络信号

CLR RI ;接收甲机联络信号后,清RI MOV A,SBUF

CJNE A,#3FH,RECE ;接收联络信号不是‘?’,转RECE,重新联络

MOV A,#2EH

MOV SBUF,A ;接收联络信号是’.’,发应答信号’.’,即2EH JNB TI,$ ;等待发送完 CLR TI ;发送完,清TI JNB RI,$ ;等待接收字节长度 CLR RI ;接收字节长度后,清RI MOV A,SBUF

MOV R7,A ;接收字节长度送R7

RECE1: JNB RI,$ ;等待接收数据

CLR RI

MOV A,SBUF ;接收一字节数据

MOV @R1,A ;将接收数据送接收数据区 INC R1 ;修改数据区地址指针 DJNZ R7,RECE1 ;数据块未接收完转RECE1 SJMP $ ;接收完毕

第9章 习题解答

9-1.以80C51为主机的系统,采用2片27 EPROM 芯片扩展 16KB 程序存储器,请设计出硬件结构图。

解 硬件结构图如图13—1所示。

图13—1 题3硬件连接图

9-2.80C51 的PO口是否可无限多的扩展 74LS273 芯片? 如不够,如何解决多片扩展问题?

答 不能。P0口可带8个TTL,若不够,可以在口上加驱动器(如74LS244)。 9-3.说明8155有哪几种工作方式?怎样进行选择?

答 8155的PA口、PB口均有2种工作方式,PC口有4种工作方式,其内部定时器/计数器也有4种工作方式。可将8位控制字写入8155命令寄存器(地址为XXXXX000),就确定了PA口、PB口、PC口和定时器的工作方式和功能。见《教材》

2

P132图。

9-5.试编程对8155进行初始化,设A口为选通输出,B口为选通输入,C口作为控制联络口,并启动定时器/计数器按方式1工作,工作时间为10ms,定时器计数脉冲频率为单片机的时钟频率24分频, 解 算得初值=5000=1388H。

MOV DPTR,#7F04H ;定时器低8位寄存器地址→DPTR MOV A,#88H ;低8位初值→A

MOVX @DPTR,A ;低8位初值→低8位寄存器 INC DPTR ;DPTR指向定时器高8位寄存器 MOV A,#13H, ;高8位初值→A

MOVX @DPTR,A ;高8位初值→高8位寄存器 MOV DPTR,#7F00H ;8155命令寄存器地址→DPTR MOV A,#0C5H ;命令字→A,

MOVX @DPTR,A ;命令字→命令寄存器

注:定时器的计数范围是2H~3FFFH,此题忽略了2H.

9-6.在一个80C51应用系统中控制一片27、一片8155和一片62,试画出其系统框图并指出所扩展的各个芯片的地址范围。 解 系统硬件连接如图13—2所示。

图13—2 题8硬件连接图

地址范围:(1)27:0000H~1FFFH (2)62:2000H~3FFFH

(3)8155 I/O端口:C000H~C005H ;8155片内RAM:4000H~40FFH。 9-7.设计符和下列要求的80C51系统,外接8KB程序存储器(用一片27)和2KB数据存储器(用一片6116),有两个8位扩展输入口(用两片74LS244)。 解 系统硬件连接如图13—3所示。

图13—3 题9硬件连接图 地址范围:(1)27:E000H~FFFFH (2)6116:D800H~DFFFH

(3)74LS244 1#:BFFFH;74LS244 2#:7FFFH。

9-8.用到三片74LS373的某80C51应用系统的电路如习题图9-8所示,现要求通过74LS373(2)输出80H,请编写相应程序。

fOSC=12MHz。

265

MOV DPTR,#0F2H MOV A,#80H MOVX @DPTR,A

9-9.试设计符合下列要求的80C51微机系统,外接8KB程序存储器(用一片27),有两个8位扩展输出口(两片74LS377),要选通点亮6个数码。 解 系统硬件连接如图13—5所示。

图13—5 题11电路连接图

9-10.设单片机采用80C51,未扩展片外ROM,片外RAM采用一片6116,编程将其片内ROM从0100H单元开始的10B的内容依次外接到片外RAM从100H单元开始的10B中去。 解

MOV R2,#OOH ;源数据缓冲区地址偏移量00H→A MOV R3,#0AH ;字节长度→R3

MOV DPTR,#0100H ;源数据缓冲区首地址(也是目的数据缓冲区首地址)→DPTR

L1: MOV A,R2 ;源地址偏移量→A MOVC A @A+DPTR MOVX @DPTR, A

INC DPTR ;源地址(目的地址)加1

DJNZ R3,L1 ;数据全部传送完?没传送完,转L1,继续传送 SJMP $ ;传送完毕,结束

9-11.习题9-11是4片8 KB×8位存储器芯片的连接图。请确定每片存储器芯片的地址范围。

习题9-11图

解: 存储器芯片的地址范围如下:

A15 A14 A13 A12 ..........A0 #1 0 0 0 0....,.......0 0000H 1 ...........1 1FFFH #2 0 0 1 0............0 2000H 1............1 3FFFH #3 0 1 0 0............0 4000H 1.....,......1 5FFFH #4 0 1 1 0............0 6000H 1............1 7FFFH

9-12.为什么要消除键盘的机械抖动?有哪些方法?

答 通常的按键所用开关为机械弹性开关。由于机械触点的弹性作用,按

266

键在闭合及断开的瞬间均伴随有一连串的抖动。键抖动会引起一次按键被误读多次。为了确保CPU对键的一次闭合仅作一次处理,必须去除键抖动。

消除键抖动的方法有硬件和软件两种方法。硬件方法常用RS触发器电路。软件方法是当检测出键闭合后执行一个5ms~10ms的延时程序,再一次检测键的状态,如仍保持闭合状态,则确认真正有键按下。 9-13.试述A/D转换器的种类及特点

答 A/D转换器的种类有很多,主要有计数比较型、逐次逼近型、双积分型等等。

逐次逼近型A/D转换器的特点是精度、速度和价格都适中,是比较常用的A/D转换器。双积分型A/D转换器的特点是精度高,抗干扰性好,价格低廉,但转换速度慢。

9-14.设计一个2×2行列式键盘电路并编写键扫描子程序。 解 (1)2×2行列式键盘电路如图13—7所示。

图13—7 2×2行列式键盘电路图

(2)键扫描子程序:

KEY1: ACALL KS1 ;调用判断有无键按下子程序 JNZ LK1 ;有键按下,转LK1 AJMP KEY1 ;无键按下,返回 LK1: ACALL T12MS ;调延时12ms子程序 ACALL KS1 ;查有无键按下

JNZ LK2 ;若有,则为键确实按下,转逐列扫描 AJMP KEY1 ;无键按下,返回 LK2: MOV R4,#00H ;首列号→R4 MOV R2,#0FEH ;首列扫描字→R2 LK4: MOV A,R2 ;列扫描字→P1口 MOV P1,A ;使第0列线为0 MOV A,P1 ;读入行状态

JB ACC.0,LONE ;第0行无键按下,转查第1行

MOV A,#00H ;第0行有键按下,该行首键号#00H→A AJMP LKP ;转求键号

LONE; JB ACC.1,NEXT ;第1行无键按下,转查下一列 MOV A,#02H ;第1行有键按下,该行首键号#02→A LKP: ADD A,R4 ;键号=首行号+列号 PUSH ACC ;键号进栈保护 LK3: ACALL KS1 ;等待键释放 JNZ LK3 ;未释放,等待 POP ACC ;键释放,键号→A

267

RET ;键扫描结束,出口状态:(A)=键号 NEXT: INC R4 ;列号加1,指向下一列 MOV A,R2 ;列扫描字→A

JNB ACC.1,KND ;判断2列全扫描完?全扫描完,转KND

RL A ;没扫描完,扫描字左移一位,形成下一列扫描字 MOV R2,A ;扫描字→R2 AJMP LK4 ;扫描下一列 KND: AJMP KEY1 ;全扫描完,返回 KS1: MOV A,#0FCH ;全扫描字11111100B→A MOV P1,A ;全扫描字一所有行 MOV A,P1 ;读取列值

CPL A ;取正逻辑,高电平表示有键按下 ANL A,#0COH ;屏蔽低6位,取高2位

RET ;出口状态(A)不等于0,有键按下 9-15.试设计一个LED显示器/键盘电路。 解 LED显示器/键盘电路如图13—8所示。

图13—8 LED显示器/键盘电路

9-16.在—个C5l应用系统中,C5l以中断方式通过并行接口74LS244读取A/D器件5G14433的转换结果。试画出有关逻辑电路,并编写读取A/D结果的中断服务程序。 解

(1)逻辑电路如图13—9所示。

(2)读取A/D结果的中断服务程序: MOV DPTR,#0FE00H MOVX A,@DPTR MOV 30H,A RETI

9-17.在一个

fOSC为12MHz的C51系统中接有一片D/A器件DAC0832,它的地

址为7FFFH,输出电压为0V~5V。请画出有关逻辑框图,并编写一个程序,使其运率为1V/格)。 解

行后能在示波器上显示锯齿波(设示波器X方向扫描频率为50s/格,y方向扫描频

(1)逻辑电路及工作原理如图13—10和图13—11所示。图中C51的P2.7接DAC0832的片选,这是因为DAC0832地址为7FFFH。

(2)程序设计;因为示波器X方向扫描频率为50s/格,y方向扫描频率为1V/格,

268

所以选择DAC0832的输出电压为0V~2V,对应数字量为00H~66H(0—102);每次数据量增值为3,共34次循环,34×5s=170s,如图13—11所示。 ORG 0080H

MAIN: MOV DPTR, #7FFFH ;DAC0832口地址 LOOP1: MOV A, #00H ;初始数据量为00H LOOP2: MOVX @DPTR, A ;输出进行D/A转换 ADD A, #03H ;增值3

CJNE A, #66H,LOOP2 ;未到2V,继续增值转换输出 SJMP LOOP1 ;到2V,从00H开始转换输出

9-18.在一个

fOSC为12MHz的C51系统中接有一片A/D器件ADC0809,它的

地址为7FF8H~7FFFH。试画出有关逻辑框图,并编写ADC0809初始化程序和定时采样通道2的程序(假设采样频率为1ms一次,每次采样4个数据,存于C51片内RAM 70H~73H中)。 解

(1)逻辑电路如图13-12所示。

图13-12 逻辑电路图

(2)程序如下: ORG 0000H LJMP MAIN ORG 0013H LJMP IEX1 ORG 0100H

MAIN: MOV SP,#60H ;设堆栈指针

MOV DPTR,#7FFAH ;选择通道2

SETB IT1 ;脉冲触发方式 SETB EX1 ;允许INT1中断 SETB EA ;CPU开放中断 LOOP1: MOV R0,#70H ;R0指向数据暂存区首地址

MOV R7, #04H ;每次采样数据个数→R7

LOOP2: MOVX @DPTR,A ;启动A/D转换 HERE: SJMP HERE ;等待中断

DJNZ R7,LOOP2 ;本次采样完否?未采完转LOOP2,继续采样 LCALL D1MS ;采完,调用1 ms延时子程序 SJMP LOOP1 ;重复循环

269

D1MS: MOV R5,#32H D1MSl: MOV R6,#H

D1MS2: DJNZ R6,D1MS2 ;1ms延时子程序 DJNZ R5,D1MSl RET ORG 0200H

IEX1: MOVX A,@DPTR ;读取数据 MOV @R0,A ;存放数据 RETI ;中断返回

9-19.在一个C51系统中扩展一片74LS245,通过光电隔离器件外接8路TTL开关量输入信号。试画出其有关的硬件电路。 解 硬件电路如图13—13所示。

图13—13 硬件电路图

9-20.用C51的P1口作8个按键的键盘接口。试画出其中断方式的接口电路及其相应的键盘处理程序。 解

(1)逻辑电路如图13-14所示。

(2)键盘处理程序:

ORG 0000H LJMP MAIN ORG 0013H LJMP IEX1 ORG 0100H

MAIN: MOV SP,#60H ;设置堆栈指针

SETB IT1 ;脉冲触发方式 SETB EX1 ;允许INT1中断 SETB EA ;CPU开放中断 SJMP $ ;等待中断

IEX1: MOV A,#0FFH ;输入时先置P1口为全1

MOV P1,A

MOV A,P1 ;键状态输入 JNB ACC.7,P7F ;7号键按下转P7F JNB ACC.6,P6F ;6号键按下转P6F JNB ACC.5,P5F ;5号键按下转P5F JNB ACC.4,P4F ;4号键按下转P4F JNB ACC.3,P3F ;3号键按下转P3F JNB ACC.2,P2F ;2号键按下转P2F JNB ACC.1,P1F ;1号键按下转P1F JNB ACC.0,POF ;0号键按下转POF

270

RETI

P7F: LJMP PROM7 P6F: LJMP PROM6 P5F; LJMP PROM5

P4F: LJMP PROM4 ;入口地址表(键功能处理程序地址入口) P3F: LJMP PROM3 P2F: LJMP PROM2 P1F: LJMP PROM1 POF: LJMP PROM0 „

9-21.试说明非编码键盘的工作原理。如何去键抖动?如何判断是否释放? 答:

(1)非编码键盘是靠软件识别的键盘。根据系统中按键数目的多少来选择不同的键盘结构。键数少时,可采用式按键结构;当键数多时可采用行列式按键结构。无论采用什么结构,都是通过单片机对它控制,因此可有三种控制方式:程序控制扫描方式、定时扫描方式及中断扫描方式。以行列式非编码键盘,采用程序控制扫描方式为例,其工作原理为:首先判断键盘上有无键按下,若有键按下则去键的机械抖动影响,然后逐列(行)扫描,判别闭合键的键号,再判别键是否释放,如果键释放则按键号处理相应程序。

(2)当判断有键按下时,执行5ms~10ms的延时程序后再判断键盘的状态。如果仍为键按下状态,则认为确实有一个键按下;否则按照键抖动处理。

(3)判断键是否释放时,先判断键是否仍为闭合状态,如果为是,则执行5ms~10ms延时程序后再判断键直到键释放,以便达到对键的一次闭合仅作一次处理。 9-22.试设计一个用8155与有32个按键的键盘连接的接口电路。编写程序实现以下功能:用8155定时器定时,每隔2s读一次键盘,并将其读入的键值存入8155片内RAM 40H开始的单元中。 解:

(1) 接口电路如图13-15所示

图13-15 32个按键的键盘接口电路图 (2)程序设计:

(a)8155的口地址分别为:

控制口:7F00H;PA口:7F01H;PB口:7F02H;PC口:7F03H;定时器低位:7F04H;定时器高位:7F05H;片内RAM地址:7E00H~7EFFH。 (b)定时2 s的设计:

设C51晶振为6 MHz,则ALE输出频率为1 MHz作为8155定时器的时钟输入,其时钟周期为1s。定时2s要计数2000000个脉冲。

因为8155为14位减1计数器,且终值为2,最大计数个数为:3FFFH一2=3FFDH=16381。所以,现选用8155计数10000个,再用软件计数200个8155定时输出的脉冲中断,达到定时2s的时间。 14位计数常数:10002=2712H。

271

定时器输出方式:连续脉冲。 (c)8155的工作方式:

PA口为基本输出方式,PC口为基本输入方式。 (3)程序清单

ORG 0000H LJMP MAIN ORG 0013H LJMP IEX1 ORG 0080H

MAIN: MOV SP, #60H

MOV R5,#200 ;中断次数计数值

MOV DPTR,#7F00H

MOV A,#11000001 ;8155初始化

MOVX @DPTR,A

MOV DPTR,#7F04H ;8155定时器低8位地址 MOV A,#12H ;低8位 MOVX @DPTR,A

INC DPTR ;指向定时器高6位地址 MOV A,#27H ;高6位及定时器输出方式 MOVX @DPTR,A

MOV DPTR,#7E40H ;8155片内RAM地址 SETB EX1 SETB EA SJMP $ ;中断服务程序

IEX1: DJNZ R5,RETURN

LCALL KEY1 ;调用键盘扫描及求键值子程序 MOVX @DPTR,A ;存键值 INC DPTR ;修改地址 RETURN: RETI ;中断返回 ;键盘扫描及求键值子程序(详见《教材3P146》

KEY1: ACALL KS1 ;调用判断有无键按下子程序

JNZ LK1 ;有键按下时,(A)≠0,转消抖动延时 AJMP KEY1 ;无键按下返回 LK1: ACALL T12MS ;调延时12ms子程序

ACALL KS1 ;查有无键按下,若有则为键确实按下 JNZ LK2 ;键按下,(A) ≠0,转逐列扫描 AJMP KEY1 ;不是键按下返回

LK2: MOV R4,#00H ;首列号入R4 MOV R2,#0FEH ;首列扫描字入R2

LK4: MOV A,R2 ;第一次列扫描

272

MOV DPTR,#7F01H ;列扫描字送至8155PA口 MOVX @DPTR,A ;使第0列线为0 INC DPTR ;指向8155PC口 INC DPTR

MOVX A,@DPTR ;8155PC口读入行状态

JB ACC.0,LONE ;第0行无键按下,转查第1行,ACC.0=0时为有键按下 MOV A,#00H ;第0行有键按下,该行首键号#00→A AJMP LKP ;转求键号

LONE: JB ACC.1,LTWO MOV A,#08H AJMP LKP

LTWO: JB ACC.2,LTHR MOV A,#10H LJMP LKP

LTHR: JB ACC.3,NEXT MOV A,#18H LKP: ADD A,R4 PUSH ACC LK3: ACALL KS1 JNZ LK3 POP ACC RET NEXT: INC R4 MOV A,R2, JNB ACC.7,KND RL A MOV R2,A AJMP LK4 KND: AJMP KEY1

KS1: MOV DPTR,#7F0lH MOV A,#00H MOVX @DPTR,A INC DPTR INC DPTR

MOVX A,@DPTR CPL A ANL A,#0FH RET ;延时12ms子程序

T12MS: MOV R7,#18H TM: MOV R6,#0FFH

;第1行无键按下,转查第2行 ;第1行有键按下,该行首键号#08→A ;第2行无键按下,转查第3行 ;第2行有键按下,该行首键号#10H→A ;第3行无键按下,转查下一列 ;第3行有键按下,该行首键号#18H→A ;键号=行首键号+列号 ;键号进栈保护 ;等待键释放 释放,等待 释放,键号→A

;键扫描结束,出口状态:(A)=键号 ;指向下一列,列号加1 ;判断8列扫描完没有 ;8列扫描完,返回

;扫描字左移一位,转变为下一列扫描字 ;扫描字入R2 ;转下一列扫描 ;指向PA口

;全扫描字#00H=00000000B ;全扫描字入PA口 ;指向PC口 ;读入PC口行状态

;变逻辑,以高电平表示有键按下 ;屏蔽高4位

;出口状态:(A)≠0时有键按下 273

;未 ;键 TM6: DJNZ R6,TM6 DJNZ R7,TM RET

9-23.DAC0832与C51单片机连接时有哪些控制信号?其作用是什么? 答

(1)DAC0832与C51单片机连接时的控制信号有: ILE:数据锁存允许信号。 CS:输入寄存器选择信号。

WR1:输入寄存器的“写”选通信号。 WR2:DAC寄存器的“写”选通信号。 XFER:数据转移控制信号线。

(2)作用(对应《教材》P174图):

WR1=0,ILE1=1时, 当CS=0,DAC0832片内输入寄存器的锁存信号, ILE11==1,输入寄存器的输出随输入变化;当CS=0,ILE1=1,WR1变高时,ILE0,输入寄存器便将输入数据锁存。

当WR2=0,XFER=0时,DAC0832片内DAC寄存器的锁存信号ILE2=1,DAC寄存器的输出随寄存器的输入变化;当XFER=0,WR2变高时,输入寄存器的信息锁存在DAC寄存器中。

9-24.在一个C51单片机与一片DAC0832组成的应用系统中,DAC0832的地址为7FFFH,输出电压为0V~5V。试画出有关逻辑电路图,并编写产生矩形波,其波形占空比为1:4,高电平为2.5V,低电平为1.25V的转换程序。 解 (1)逻辑电路如图13—16所示。

图13—16 逻辑电路

V V (2)

OUTOUT=2.5V,D=2.5×256/5=128=80H;

=1.25V,D=1.25×256/5==40H;

程序如下:

MOV DPTR,#7FFFH

NEXT: MOV A,#80H MOVX @DPTR,A ACALL DELAY MOV R4,#04H MOV A,#40H MOVX @DPTR,A LOOP: ACALL DELAY DJNZ R4,L00P

274

AJMP NEXT DELAY: ┇

9-25.在一个由C51单片机与一片ADC0809组成的数据采集系统中,ADC0809的地址为7FF8H一7FFFH。试画出有关逻辑电路图,并编写出程序,每隔1ms轮流采集一次8个通道数据共采集100次,其采样值存入片外RAM 3000H开始的存储单元中。 解

(1)逻辑电路如图13-17所示。 (2)设

fOSC=6 MH2,用定时器定时100 ms,用软件记数10×60实现定时1min。

A/D转换采用查询(P1.0)方式。程序如下: ORG 0000H AJMP MAIN ORG 001BH AJMP SERVE

MAIN: MOV SP,#60H ;设堆栈指针 MOV R7,#100 ;置采集次数 MOV R1,#30H ;片外RAM地址高位 MOV R0,#00H ;片外RAM地址低位

MOV R2,#10 ;R2为“100ms”计数器,置入初值10(计1s) MOV R3,#60 ;R3为秒计数器,置入初值60(计1min)

MOV TOMD,#10H ;定时器T1工作于模式1 MOV TH1,#3CH ;计数器初值 MOV TL1,#0BOH

SETB ET1 ;定时器T1允许中断 SETB EA ;开中断

SETB TR1 ;启动定时器T1 LOOP:SJMP LOOP ;等待中断

DJNZ R7,LOOP ;是否到100次?

SJMP $

SERVE:MOV TH1,#3CH ;中断服务程序,重新赋计数器初值

MOV TL1,#0BOH

DJNZ R2,RETURN ;1s未到,返回

MOV R2,#0AH ;重新置“100ms”计数器初值 DJNZ R3,RETURN ;1min未到,返回 MOV R6,#8 ;8个通道计数器初值 MOV DPTR,#7FF8H ;IN0地址

NEXT:MOVX @DPTR,A ;启动A/D转换

JB P1.0,$ ;判转换是否结束 MOVX A,@DPTR ;读取转换结果

PUSH DPH ;将通道地址压入堆栈 PUSH DPL

MOV DPH,R1 ;将片外RAM地址送DPTR MOV DPL,R0

MOVX @DPTR,A ;将转换结果存入片外RAM

275

INC DPTR ;片外RAM地址增1 MOV R1,DPH ;保存片外RAM地址 MOV R0,DPL

POP DPL ;恢复通道地址 POP DPH

DJNZ R6,NEXT ;8个通道是否采集结束 RETURN:RETI ;中断返回

答 RAM是指数据存储器,可读可写,掉电信息丢失。

276

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- oldu.cn 版权所有 浙ICP备2024123271号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务