单片机原理与应用—基于Proteus和KeilC课后答案复习题解答.doc
第 2 章 MCS-51 单片机结构及原理习题
1. MSC- 51 单片机部由哪些功能部件组成,各有什么功能?
答:以 80C51 单片机为例,其部功能部件有:
控制器:是对取自程序存储器中的指令进行译码,在规定的时刻发出各种操作所需的控制信
号,完成指令所规定的功能;
运算器:根据控制器发来的信号,执行算术逻辑运算操作;
存储器:包括程序存储和数据存储器;
定时器计数器: 2 个 16 位定时器 / 计数器,可对机器周期计数,也可对外部输入脉冲计数;
中断系统:可响应三个部中断源和两个外部中断源的中断请求;输入输出接口: 4 个 8 位并行
口和一个全双工串行口;
2. MSC- 51 单片机外部引脚的名称是什么?各有什么功能?
答: (1)电源及晶振引脚
VCC(40 脚 ) : +5V 电源引脚
VSS(20 脚 ) :接地引脚
XTAL1(19 脚 ) ;外接晶振引脚(置放大器输入端)
XTAL2(18 脚 ) :外接晶振引脚(置放大器输出端)
(2)控制引脚
RST/VPD(9)为复位 /备用电源引脚
ALE/PROG(30)为地址锁存使能输出/编程脉冲输入
PSEN(29):输出访问片外程序存储器读选通信号
EA/ VPP (31):外部ROM允许访问/编程电源输入
(3)并行 I/O 口引脚
P0.0 ~ P0.7 ( 39~ 32 脚)—— P0 口;
P1.0 ~ P1.7 ( 1~ 8 脚)—— P1 口;
P2.0 ~ P2.7 ( 21~ 28 脚)—— P2 口;
P3.0 ~ P3.7 ( 10~ 17 脚)—— P3 口。
3. 51 系列单片机的封装有哪些类型?请说明每一种封装引脚之间的距离。
答: 51 系列单片机的封装有:
40 引脚双列直插封装( DIP—— dual in-line package ),引脚之间的距离是 100mil(2.54mm) ;
44 引脚方形扁平封装( QFP —— quad flat package )方式,引脚之间的距离是 2.54mm;44 引脚带引线的塑料芯片载体PLCC(Plastic Leaded Chip Carrier) 。
4.什么是复位?单片机复位电路有哪几种,工作原理分别是什么?
答:复位——使单片机恢复原始默认状态的操作。
单片机复位电路有: 上电复位电路,由电阻和电容构成,通过上电时,电容相当于短路而使
复位引脚在晶振有效的情况下保持 2 个机器周期的高电平;按钮开关复位电路,由两个电阻
2 个机器周期的高电
的分压构成,通过手工按下按钮,使复位引脚在晶振有效的情况下保持
平。
5.通常的微机系统存储器结构有哪几种?MCS-51单片机存储器属于哪一类?
CS-51 可寻址多大空间?
答:通常的微机系统存储器结构有两种结构,即哈佛结构和诺依曼结构( 也叫普林斯顿结构) ,MCS-51单片机存储器属于, MCS-51可寻址空间是两个64KB,即 64KB的程序存储空间和64KB 的数据存储空间。
6.片 RAM中低 128 个单元划分为哪三个主要部分?各部分的主要功能是什么?
答:片 RAM中低 128 个单元划分为三个部分:
①工作寄存器区( 00H-1FH),四组,每组 8 个,可作用工作寄存器切换使用;②
可位寻址区( 20H-2FH), 16B,位地址为 00H-7FH,用作为按位寻址的空间;③
用户 RAM区( 30H-7FH), 80B,用作普通 RAM单元或堆栈。
7.程序状态字寄存器PSW各位的定义是什么?
答:程序状态字寄存器PSW各位的定义如下:
PSW.7:进 / 借位标志 CY,加法有进位时置1,减法有借位时置1;
PSW.6:辅助进位标志AC,加法运算低四位向高上四位有进位时置1;
PSW.5、 PSW.1:用户标志位F0 和用户标志位F1,
保存用户的位数据;
RS0, 00 至11 分别选择四组工作之一作为当PSW.4、 PSW.3:工作寄存器选择控制位RS1
和
前工作寄存器
PSW.2 :溢出标志位OV,有符号数加、减运算结果有溢出或乘除上结果异常( 乘法运算结果
大于255 即乘积在BA中,或除法运算除数为0) 时置 1
PSW.0:奇偶标志位P,累加器 A 中1 的个数为奇数时置1。
8.什么是时钟周期?什么是机器周期?什么是指令周期?当振荡频率为12MHz时,一个机
器周期为多少微秒?
答:时钟周期又叫振荡周期或拍,用P 表示,是MCS-51单片机中最小的时间单位,在一个
时钟周期, CPU完成一个最基本的动作。
机器周期:由12 个时钟周期构成,完成一个基本操作
指令周期:是执行一条指令所需的时间,根据指令的复杂性,可由1~4 个机器周期构成。
当振荡频率为12MHz时,一个机器周期为 1 微秒。
9. P0、 P1、 P2 和P3 口的结构和功能分别是什么?
答: P0 口的每一位由 1 个锁存器、 2 个三态缓冲器、 1 个输出控制电路(非门X 、与门、
电子开关MUX、输出驱动电路构成,其功能既可以作为通用I/O 口实现输入/ 输出功能,也
可作片机地址的低8 位和数据外部展功能。在用作入出口,需外接上
拉阻。
P1 口的每一位由 1 个存器、 1 个效管器 V 和 2 个三冲器构成,其作用是
用作入出口
P2 口的每一位由 1 个存器、 2 个三冲器、 1 个出控制元、 1 个出元构成,
其功能是用作入出口,或地址的高8 位。
P3 口的每一位由 1 个存器、 2 个三冲器、 1 个第二功能控制元、1 个出元
构成,其作用是用作入出口或第二功能。
10. 80C51 片机引脚ALE 的作用是什么?当80C51 不外接存器,ALE上的出的脉冲
率是多少?
答:80C51 片机引脚 ALE的作用是外部存址存 P0 口出的低 8 位地址,当 80C51 不外接存器,ALE上的出的脉冲率是 fosc/6 。
第 3 章片机的言与程序
1. MCS-51片机有哪几种址方式?适用于什么地址空?
答: MCS-51片机有7 种址方式:直接址、寄存器址、寄存器接址、立即址、
址址、位址、相址。
直接址方式:操作数的地址由指令直接出,适用于片RAM的所有地址空;如MOV A, 68H
MOV A, PSW
寄存器址方式:指令出的是寄存器的,操作数在指定的寄存器中,适用于片
00H 至1FH 的32 个字,用R0, ? ,R7 表示,通PSW
的RS1
和
RS0号确定32
个字中的其中8 个,有累加器A,以及乘除法指令中的 A 和B 寄存器,位址方式中的
布累加器C;
MOV A, R1
MUL AB
INC DPTR
寄存器接址方式:指令出的是寄存器的,操作数地址在指定的寄存器中,适用于片 RAM的全部空,其中52 系列中的80H 至 FFH只能用寄存器接址;如MOV A, R0
MOV A, R1
MOVX A, DPTR
立即址方式:操作数本身在指令中直接,出适用于用8 位立即数片RAM所有地址元,也可用16 位立即数DPTR;如
MOV A, #0E2H
MOV DPTR,#2000H
址址方式:以 DPTR或 PC作基地址寄存器,以累加器 A 作址寄存器,将基址寄存
器与变址寄存器的容相加形成操作数的实际地址的一种寻址方式,变址寻址方式适用于程序
存储器 ROM,仅有三条指令如下:
MOVC A, A+DPTR
MOVC A, A+PC
JMP A+DPTR
位寻址方式:指令中直接给出操作数所在单元的位地址,适用于片RAM中地
址
20H 至2FH
中的16 个字节中的128 个位地址空间和80H
至FFH中地址中可以
被
8 整除的所有SFR中的
每个位地址空间;如
MOV C, 7FH
MOV F0, C
MOV C, ACC.7
相对寻址方式:为相对转移指令而设,指令中直接给出转移的相对偏移量,其转移目标在当前指令 -128 至+ 127 字节围的地址空间。如
SJMP START
HERE:SJMP HERE;等效于:SJMP$
2.MCS-51单片机的 PSW程序状态字中无ZERO(零 ) 标志位,怎样判断某部数据单元的容是否
为零?
答: MCS-51单片机的 PSW程序状态字中无 ZERO(零 ) 标志位,判断某部数据单元的容是否为
零是能通过取数到 A 累加器,再判断 A 中的每一位是否为零来确定其值是否为零。
3.编程将部RAM的 20H--30H 单元容清零。
解:设一个片RAM指针 R0,先指向首地址20H,通过累加器 A 清零,然后采用间接寻址方式依次将 A 中的零值传送到指针所指的片RAM单元,每传送一个字节,地址指针加1,直到达
到地址为30H或达到计数器规定
的17 个字节为止。
程序 1:
MOV R0,#20H ; 设地址指针初值
CLR A ; 累加器清 0
CONT: MOV R0,A ; 置 0 指针所指单元
INC R0 ; 地址指针加 1
CJNE R0,#31H,CONT ; 指针未超过终点则继续
SJMP $ ; 暂停
程序 2:
MOV R0,#20H ; 设地址指针初值
CLR A ; 累加器清 0
MOV R7,#17 ; 计数器赋初值,从20H 到 30H 共 17 个字节CONT: MOV R0,A ; 置 0 指针所指单元
INC R0 ; 地址指针加 1
DJNZ R7, CONT ; 计数器减1,非0,则继续
SJMP $ ; 暂停
4.编程查找部 RAM的 32H~ 41H 单元中是否有 0AAH这个数据,若有这一数据,则将50H 单元置为 0FFH,否则将 50H 单元清零。
解:设一个片 RAM指针 R0,先指向首地址 32H,比较 R0 与 #0AAH,若相等,则退出循环,给
50H单元赋 0FFH,若不相等,则 R0 加 1 为继续比较下一个字节做准备,直到达到地址为 41H 或达到计数器规定的16 个字节为止还没找到,则给50H 单元赋 00H
程序 1:
MOV R0,#32H ; 设地址指针初值
CONT: CJNE R0,#0AAH,NEXT;比较查找值与指针所指单元的值,不相等转移
MOV A,#0FFH ; 相等,则准备好要赋的标志值0FFH
SJMP DOWN ; 转存到保存结果处
NEXT: INC R0 ; 修改地址指针
CJNE R0,#42H,CONT ; 若指针未越过终点,则继续
MOV A,#00H ; 查找失败,则将00H存入结果标志单元
DOWN: MOV 50H,A ; 将比较结果标志存入50H 单元
SJMP $ ; 暂停
END
程序 2:
MOV R7,#16 ; 计数器赋初值,从20H 到 30H共 16 个字节
MOV R0,#32H ; 设地址指针初值
CONT: CJNE R0,#0AAH,NEXT ; 比较查找值与指针所指单元的值,不相等转移MOV A,#0FFH ; 相等,则准备好要赋的标志值0FFH
SJMP DOWN ; 转存到保存结果处
NEXT: INC R0 ; 修改地址指针
DJNZ R7,CONT ; 计数器减 1,非 0,则继续
MOV A,#00H ; 查找失败,则将00H存入结果标志单元
DOWN: MOV 50H,A ; 将比较结果标志存入50H 单元
SJMP $ ; 暂停
END
5.查找 20H~ 4FH 单元中出现00H的次数,并将查找结果存入50H 单元。
解:从20H到 4FH 共 48 个字节
MOV R7,#48 ; 字节计数器赋初值
MOV R0,#20H ; 设地址指针初值
CONT: CJNE R0,#00H,NEXT ; 比较查找值与指针所指单元的值,不相等转移INC R6 ; 相等, 0 的个数计数器加 1
NEXT: INC R0 ; 修改地址指针
DJNZ R7,CONT ; 计数器减 1,非 0,则继续
MOV 50H,R6 ; 保存 O的个数计数值到 50H 单元
SJMP $ ; 暂停
END END
6.已知 A=83H, R0=17H, (17H)=34H ,写出下列程序段执行之后的 A 中的容。
ANL A,#17H
ORL 17H,A
XRL A,R0
CPL A
END
答:
ANL A,#17H ;A=03H
ORL 17H,A ;(17H)=0011 0100 ∨ 0000 0011=0011 0111
XRL A,R0 ;A= 0000 0011 ∨ 0011 0111 =0011 0100
CPL A ;A=1100 1011
7.已知单片机的晶振频率为12MHz,分别设计延时为0.1s 、 1s 的子程序。
答:已知单片机的晶振频率为12MHz,则机器周期为1us,延时子程序是通过执行指令序列中机器周期数来达到,如果要0.1s ,即 100ms,也就是100000us ,所以需要机器周期数达到 100000。要延时达到1S,可通过对延时为0.1 秒的子程序调用10 次来实现。DELAY100MS: MOV R6,#200 ;1 个机器周期
D1: MOV R7,#250 ;1 个机器周期
D2: NOP;1 个机器周期
DJNZ R7,D2 ;2 个机器周期,3*251=753
DJNZ R6,D1 ;2 个机器周期,(1+753+2)*132=99792
RET ;2 个机器周期,1+99792+2=99795, 约100ms
DELAY1S: MOV R7,#10 ; 计数 10 次 1
LOOP: ACALL DELAY100MS ; 延时 100ms 子程序99795+2
DJNZ R7,LOOP ; 未达到 10 次则继续 10*(2+99795+2)
RET ; 返回 2+10*(2+99795+2)=997992
8.部 RAM从 20H单元开始处有一数据块,以ODH为结束标志,试统计该数据块的长度,将该数据块送到外部数据存储器7E01H开始的单元,并将长度存入7E00H单元。
解:从20H的指针用 R0,从外部 RAM7E01开始的指针用 DPTR,计数器用 R7 MOV R7,#0 ; 字节计数器赋初值
MOV R0,#20H ; 设片 RAM地址指针初值
MOV DPTR,#7E01H ;设片外 RAM地址指针初值
CONT: MOV A,R0 ; 取片 RAM中的一个字节
MOVX DPTR,A ; 存入片外 RAM指针所指单元
INC R7 ; 长度计数器加 1
INC R0 ; 片 RAM地址指针加 1
INC DPTR ; 片外 RAM地址指针加 1
CJNE A,#0DH,CONT ;未达到结束标志
MOV A,R7 ; 取块计数长度值
MOVX DPTR,A ; 保存
SJMP $ ; 暂停
END
9.部 RAM从 DATA开始的区域中存放着10 个单字节十进制数,求其累加和,并将结果存入SUM和 SUM+1单元。
解: R7 计数, R6 保存累加和高8 位, R0 用作地址指针
ORG 0000H
LJMP MAIN
ORG 100H
SUM EQU 30H
DATAA EQU 40H
MAIN: MOV R7,#10 ; 字节计数器赋初值
MOV R0,#DATAA ; 设片 RAM地址指针初值
CLR A ; 累加器清 0
MOV R6,A ; 累加结果的高 8 位
CONT: ADD A,R0 ; 加 RAM中的一个字节
到ACC
DA A
JNC NEXT ; 若无进位则不用管高8 位
INC R6 ; 有进位,高 8 位加 1
NEXT: INC R0 ; 片 RAM地址指针加 1
DJNZ R7,CONT ; 未完继续
MOV SUM,A ; 保存低 8 位
MOV SUM+1,R6 ; 保存高 8 位
SJMP $ ; 暂停
END
10.部 RAM从 DATA1和 DATA2单元开始处存放着两个等长的数据块,数据块的长度在LEN 单元中。请编程检查这两个数据块是否相等,若相等,将0FFH写入 RESULT单元,否则将 0 写入 RESULT单元。
解:从 DATA1开始的指针用R0,从 DATA2开始的指针用R1,计数器用 R7
LEN EQU 10
DATA1 EQU 30H
DATA2 EQU 40H
RESULT EQU 50H
MOV R7,#LEN ; 字节计数器赋初值
MOV R0,#DATA1 ; 设片 RAM地址指针初值
MOV R1,#DATA2 ; 设片外 RAM地址指针初值
CONT: MOV A,R0 ; 取片 RAM R0所指的的一个字节
MOV 7FH,R1 ; 将 R1 所指单元容取到片 RAM地址 7FH 中
CJNE A,7FH,NOEQ ; 比较,不相等则结束
INC R0 ;DATA1 RAM地址指针加 1
INC R1 ;DATA2 RAM地址指针加 1
DJNZ R7,CONT ; 未完,继续
MOV A,#0FFH ; 相等 , 准备写入 FFH
SJMP DOWN ; 转写入结果处
NOEQ: MOV A,#0 ; 不相等 , 准备写入 00H
DOWN: MOV RESULT,A ; 保存比较结果标志
SJMP $ ; 暂停
END
11.编制程序,将部RAM中 M1、M2、M3和 M4单元中的无符号数xl 、x2、x3 和 x4 相加,并把和存入 RO和 R1(R0 中为高 8 位 ) 中。
解:
M1 EQU 30H
M2 EQU 40H
M3 EQU 45H
M4 EQU 4FH
MOV A,M1 ; 取第一个数
ADD A,M2 ; 与第二个数相加
JNC NEXT1 ; 如果无进位,则转移至第三个相加
MOV R0,#1 ; 有进位,高 8 位置 1
NEXT1: ADD A,M3 ; 与第三个数相加
JNC NEXT2 ; 没有进位,则转至第四个数相加
INC R0 ; 有进位,高 8 位加 1
NEXT2: ADD A,M4 ; 与第四个数相加
JNC NEXT3 ; 没有进位,则转至结束
INC R0 ; 有进位,高 8 位再加 1
NEXT3: MOV R1,A ; 低 8 位保存到 R1
SJMP $ ; 暂停
END
第 4 章单片机的C51语言习题
1. C 语言的优点是什么? C 程序的主要结构特点是什么?
答: C语言是一种高级语言,学习比低级容易,不需要具体组织、分配存储器资源和处理端
口数据,可以直接驱动单片机的所有资源。
C程序以函数为单位,由一个主函数和若干个其他函数构成,主函数是程序的入口,其他函
数由主函数直接或间接调用。程序可以由一个文件或多个文件组成。文件类型包括头文件和
C语言源文件,也可以是汇编语言文件, C 程序可与汇编语言混合编程。
2. C51 语言的变量定义包含哪些关键因素?为何这样考虑?
答: C语言的变量定义格式如下:
[ 存储种类 ] 数据类型[ 存储类型 ] 变量名
其中:
存储种类与标准 C 语言相同,包括:自动型(auto) 、外部型 (extern) 、静态型 (static) 、寄存器型 (register) 。
数据类型除了包含标准 C 语言类型的字符型(char) ,整型 (int) ,长整型 (long) ,浮点型(float) ,双精度型 (double) 外,还有二进制位型 (bit) ,特殊功能寄存器型 (sfr) ,SFR 可位寻址的位类型 (sbit) 。
存储类型包括:片 RAM区 (data) 、片可位寻址区 (bdata) ,片 RAM间接寻址区 (idata) ,片外RAM页寻址区 (pdata) ,片外 RAM区 (xdata) 、 ROM区 (code) 。
只所以比标准 C 语言多了存储类型,就是因为 MCS- 51 单片机的存储结构中有四个物理存储
空间 ( 片 RAM、片 ROM,片外 RAM,片外 ROM),三个逻辑地址空间( 片 RAM,片外 RAM, ROM),
而且有多种寻址方式(直接寻址、间接寻址、页面寻址、位寻址)所致,所以在定义变量时,
要根据其所在位置和寻址方式明确指定存储类型。
3. C51 与汇编语言的特点各有哪些?怎样实现两者的优势互补?
答:C51是结构化语言,代码紧凑;接近自然语言,程序可读性强,易于调试、维护;库
函数丰富,编程工作量小,可使产品开发周期短;具有机器级控制能力,功能很强,适合于
嵌入式系统开发;汇编指令无关,易于掌握,上手快。
汇编语言优点是编写的程序代码精炼、执行速度快,在相同功能下,汇编语言程序可能
比C 语言程序效率高。缺点是对程序员要求高,必须对单片机的硬件结构非常熟悉才能编程,
不便于编写比较复杂的程序。
可根据需要对要求时间性很强的代码用汇编语言编写,其它部分用 C 语言编写,两者混合编程就可以实现优势互补。
4.指出下面程序的语法错误:
#include
main(){
a=C;
int a=7,C
void delay();{
cgar i ;
for(i=O; i<=255; ”++”);
}
答:
#include
main(){
a=C;int a=7,C delay(10) //a和C必须先定义才可使用
// 缺分号,应该提在使用前说明
// 延时子程序必须先定义,或先有函数原型说明
void delay();{
//作为函数定义,有函数定义不能嵌套的问题,
// 即不能在一个函数定义另一个函数,而且“{ ”前不应有分号
//作为函数原型说明,应该放在函数调用之前, 且其后不应该接函数体
cgar i ;// 字符型应该是unsigned char
for(i=O; i<=255; ”++” );// ” ++”应改成i++
}
//主函数没有结束,缺” } ”
5.定义变量a,b,c,其中 a 为部RAM的可位寻址区的字符变量, b 为外部数据存储区浮点型变量, c 为指向 int 型xdata 区的指针。
答:char bdata a;
float xdata b;
int xdata *c;
6.编程将 8051 的部数据存储器20H单元和 35H 单元的数据相乘,结果存到外部数据存储器中(任意位置 ) 。
解:方法二:单用 C语言编程实现
#include
#include
int movdata(char);
void main()
{
unsigned int xdata x;
unsigned char *ptr,a,b;
ptr=0x25;
a=*ptr;
b=*ptr;
x=a*b;
}
7. 8051 的片数据存储器25H 单元中存放有一个0~ 10 的整数,编程求其平方根( 精确到 5 位有效数字 ) ,将平方根放到30H 单元为首址的存中。
解:方法二:单用C语言编程实现
//MAIN.C
#include
#include
int movdata(char);
void main()
{
char n;
char *ptr;
float *ptr2;
float f;
ptr=0x25;
n=*ptr;
f=sqrt(n);
ptr2=0x30;
*ptr2=f;
}
8.将外部RAM 10H~ 15H 单元的容传送到部RAM 10H~ 15H单元。
解:方法二:单用C语言编程实现
//MAIN.C
#include
int movdata(char);
void main()
{
char n=6;
char *ptr1=0x10;
char xdata *ptr2;
ptr2=0x20;
while(n--){
*ptr2++=*ptr1++;
}
}
9.部 RAM20H、21H 和 22H、23H 单元分别存放着两个无符号的16 位数,将其中的大数置于24H
和
25H单元。
解:方法一:
#include
void main()
{
unsigned int *ptr; // 设置一个部RAM指针
unsigned int x,y,z;
ptr=0x20; // 指向0x20 单元
x=*ptr; // 取第一个数
ptr=0x22; // 指向0x22 单元
y=*ptr; // 取第二个数
z=(x>y)?x:y; ptr=0x24; *ptr=z; // 将两数中的较大者赋给z // 指向地址为0x24 的目标单元// 将大数存入目标单元
}
第 5 章单片机的中断系统习题
1.什么是中断、中断源、中断优先级和中断嵌套?
答:中断是指单片机部有一个中断管理系统,它对部的定时器事件、串行通信的发送和接收
及外部事件(如键盘按键动作)等进行自动的检测判断。当CPU正在处理某件事情(例如正在执行主程序)的时候,外部或部发生的某一事件(如某个引脚上电平的变化,一个脉冲沿
的发生或计数器的计数溢出等)请求 CPU迅速处理,于是,中断管理系统会置位相应标志通
知CPU暂时中止当前的工作,迅速转去处理所发生的事件。处理完该事件后,再回到原来被中止的地方,继续原来的工作,这样的过程称为中断。
引发中断的事件称为中断源。
将中断事件按轻重缓急分若干级别叫中断优先级。
允许中断优先级高的中断源中断正在执行的低优先级的中断服务程序叫中断嵌套。
2.什么叫中断源?MCS-51 有哪些中断源?各有什么特点?它们的中断向量地址分别是多
少?
答:中断源即引发中断的事件。
MCS-51单片机有 5 个中断源,它们是外部中断0,定时器T0,外部中断1,定时器T1,串
行口。
外部中断源是由引脚的触发信号引起的中断,定时器中断源是由于定时器计数器的溢出引发
的中断,串行口是由于串行通信的发送或接收引发的中断。
外部中断0,定时器 T0,外部中断 1,定时器 T1,串行口五个中断源的中断向量地址依次为:
0003H, 000BH, 0013H, 001BH, 0023H。
3. MCS-51中断的中断响应条件是什么?
答: (1)中断源有中断请求;
(2)此中断源允许位为 1,即中断源可以向 CPU发中断请求;
(3)CPU 开总中断 , 即 EA=1;
(4)无同级或者更高级中断正在服务
4. MCS-51的中断响应过程是怎样的?
答: (1)将相应的中断优先级状态触发器置1,以阻断后来的同级和低级中断请求;
(2)由硬件清除相应的中断请求标志,串行口的发送和接收中断除外;
(3)执行一条硬件 LCALL指令,即把程序计数器 PC的容压入堆栈保存,再将相应的中断服务
程序的入口地址送入 PC;
5.编写出外部中断 1 为下跳沿触发的中断初始化程序。
解:
void Int1_init(){
IT1=1;
EA=1;EX1=1; //IE=0x84;// IE|=0x84;
}
RAM30H单元开6.有一外部中断源,接入端,当其中有中断请求时,要求CPU把一个从
部
1000H 开始的连续存储区。请编写对应的程序。
始的50 个字节的数据块传送到外部RAM
从
解:
#include
void main(){
IT0=1 ;
EA=1;
EX0=1;
while(1) ;
}
void intx0() interrupt 0 using 1{
char * ptr1=0x30;
char xdata * ptr2=0x1000;
for(i=0;i<50;i++) *ptr2++=*ptr1++;
}
7.设fosc = 12MHz ,利用定时器,TO(工作在方式2) 在 P1.1 引脚上获取输出周期为O.4ms 的方波信号,定时器溢出时采用中断方式处理,请编写,T0 的初始化程序及中断服务程序。解: fosc = 12MHz ,则机器周期=1us ;当T0 工作在方式 2 时,其最大定时时间为256us,
要输出周期为0.4mS 即400us 的方波信号,则其高、低电平应各为200us,显然当定时器T0 按方式 2 工作时,只需计数达到200 次即可,因此其时间常数初值为256-200=56 。在T0 的中断服务程序中,只需将P1.1 引脚求反即可。
#include
sbit P1_1=P1^1;
void timer0()interrupt 1 using 1{
P1_1=!P1_1;
}
void main(){
P1_1=0;
TMOD=0x02;
TH0=56;
TL0=56;
IE=0x82;
TR0=1;
for(;;){}
}
8.设 fosc = 6MHz ,要求每隔50ms,从部 RAM以 30H 开始的数据存储区传送一个字节数据
到外部 RAM以 2000H 开始的连续存储区,共传送50 个数据。要求:采用定时器T1 以方式 2 实现定时,数据传送在中断服务程序中完成。
解: fosc = 6MHz,机器周期 =12/6*10-6S=2us,T1 工作在方式 2 时,最大定时时间为512us ,要定时 50ms,可以计数 100 次,每次定时 500us 来实现,方式 2 定时 500us 需计数250 次,故其时间常数为256-250=6 。
#include
char intcnt=0;
char movcnt=0;
char * ptr1=0x30;
char xdata *ptr2=0x2000;
void timer1()interrupt 3 using 1{
intcnt++;
if(intcnt==100){
if(mocnt<50){
*ptr2++=*ptr1++;
movcnt++;
}
else EX1=0;
intcnt=0;
}
}
void main(){
TMOD=0x20;
TH1=6;
TL1=6;
IE=0x84;
TR1=1;
for(;;){}
}
9.805l 单片机只有两个外部中断源,若要扩展成8 个外部中断源,请画出实现这种扩展的
硬件线路图,并说明如何确定各中断源的优先级。
解:用按钮开关模拟中断源的中断请求,INT0 单独作为一个中断源,INT1 扩展成7 个中断源,有中断请求时,借助于P2 口识别是这七个中断源是哪个请求中断,为了验证正确性,
如果是INT0 中断,则在P0 口的数码管上显示0,是INT1 中断,则根据从上到下是哪个中
断源在P0 口的数码管上显示1— 7。具体电路和程序如下:#include
char led_mod[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07};
void INT0_srv (void) interrupt 0 using 1//外部中断0 处理程序
{
P0=led_mod[0];
}
void INT1_srv (void) interrupt 2 using 2//外部中断 1 处理程序
{
char intnum;
intnum=P2;
switch(intnum){
case 0xfe:P0=led_mod[1];break;
case 0xfd:P0=led_mod[2];break;
case 0xfb:P0=led_mod[3];break;
case 0xf7:P0=led_mod[4];break;
case 0xef:P0=led_mod[5];break;
case 0xdf:P0=led_mod[6];break;
case 0xbf:P0=led_mod[7];
}
}
void main(){
EA=1;
EX0=1;
EX1=1;
P0=0;
while(1);
}
第 6 章单片机的定时器/ 计数器习题
1. MCS-51 系列的 8051 单片机有几个定时 / 计数器?每个定时 / 计数器有几种工作方式?如
何选择?
答:MCS-51系列的 8051 单片机有 2 个定时 / 计数器,即 T0 和 T1,每个都可以编程为定时器
或计数器, T0 有四种工作方式 ( 方式 0—13 位、方式 1— 16 位、方式 2- 可自动装入初值的 8 位、方式 3- 两个 8 位 ) ,T1 有三种工作方式 ( 与 T0 相同的前三种 ) ,通过对 TMOD的设置选择,其高四位选择 T1,低四位选择 T0。
2.如果采用的晶振频率为3MHz,定时 / 计数器 TO分别工作在方式0、 1 和 2 下,其最大的定时时间各为多少?
答:如果采用的晶振频率为3MHz,机器周期为12×1/(3*106)=4us ,由于定时 / 计数器 TO 工作在方式 0、 1 和 2 时,其最大的计数次数为8192、 65536 和 256 所以,其最大定时时间
分别是:方式 0 为 8192× 4us = 32.768ms、方式 1 为 65536× 4us= 262.144ms 、方式 2 为 256 ×4us = 1024us 。
3.定时 / 计数器 TO作为计数器使用时,其计数频率不能超过晶振频率的多少?
答:由于定时 / 计数器 TO作为计数器使用时,是对外部引脚输入的脉冲进行计数,CPU 在每个机器周期采样一次引脚,当前一次采样为高电平,后一次采样为低电平,则为一次有效计数脉冲,所以如果晶振频率为fosc ,则其采样频率fosc/12 ,两次采样才能决定一次计数
有效,所以计数频率不能超过fosc/24 。
4.简单说明定时 / 计数器在不同工作模式下的特点。
答:方式 0 为 13 位的定时 / 计数器,由 THx的 8 位和 TLx 的低 5 位构成、方式 1 为 16 位的定时 / 计数器 , 由 THx 的 8 位和 TLx 的 8 位构成,方式 2 为 8 位的定时 / 计数器, TLx 为加 1 计数器, THx为计数初值寄存器。方式 3 只能用于 T0,是将T0 的低 8 位用作一个独立的定
时/ 计数器,而高 8 位的 TH0用作一个独立的定时器,并借用 T1 的 TR1和 TF1 作为高 8 位定时器的启停控制位和溢出标志位。
5.定时器工作在方式 2 时有何特点?适用于什么应用场合?
答:定时器工作在方式 2 时是一个可自动装入时间常数初值的8 位定时 / 计数器, TLx 为加 1 计数器, THx为计数初值寄存器。由于其恢复初值由硬件自动完成,所以当需要反复计数时,用方式 2 可以方便地实现精确的定时。
6.一个定时器的定时时间有限,如何采用两个定时器的串行定时来实现较长时间的定时?
答:一个定时器的定时时间有限,可采用两个定时器的串行定时来实现较长时间的定时,比如,当 fosc = 12MHz时,单个定时 / 计数器采用方式 1 的最大定时时间为65.536ms,此时若
用另一个定时 / 计数器按方式 1 进行溢出次数计数,在定时器溢出中断时,给计数器发一个
计数脉冲,且两者均为方式一,则两者串行可达到的定时时间为65536 ×65.536ms=4294967.296ms 。
7.设MCS-51单片机的晶振频率为12MHz,请编程使P1.O 端输出频率为20kHz 的方波。
解: fosc = 12MHz ,所以机器周期为1us 。 20kHz 的方波周期为1/(20 × 1000)=50us ,方波
即高电平和低电平和时间相等,所以只需设一个定时器定时25us 将P1.O 求反一次即可。由
于题目没有规定,所以可以用查询方式,也可以用中断方式进行编程实现。
方法一:采用查询方式实现
#include
sbit P1_0=P1^0;// 定义输出引脚变量
void main(){
P1_0=0; // 输出初值为 0
TMOD=0x02; //T0 方式 2 定时
TH0=256-25; // 计 25 次,计数初值为模256 减 25
TL0=TH0;
TR0=1; // 启动 T0
while(1) // 无限循环
if(TF0){ // 查询 T0 溢出标志
TF0=0; // 溢出标志复位
P1_0=!P1_0;// 输出求反
}
}
8.采用定时/ 计数器TO对外部脉冲进行计数,每计数10O 个脉冲, TO切换为定时工作方式。
定时1ms 后,又转为计数方式,如此循环不止。假定MCS-5l 单片机的晶体振荡器的频率为
6MHz,要求T0 工作在方式 1 状态,请编写出相应程序。
解:晶体振荡器的频率为6MHz,则机器周期为12× 1/(6*106)= 2us, 要定时1ms,需计数次
数为1000/2=500 次
#include
sbit P1_0=P1^0;
void main(){
while(1){
TMOD=0x05;//T0计数,方式一
TH0=(65536-100)/256;//计数100次
TL0=(65536-100)%256;
TR0=1;
while(!TF0);//等待计数100 次的溢出
TF0=0;// 溢出标志复位
TMOD=0x01;//T0定时,方式一
TH0=(65536-500)/256;//计数100次
TL0=(65536-500)%256;
TR0=1; // 启动 T0
while(!TF0); // 等待定时时间到1ms的溢出
TF0=0; // 溢出标志复位
}
}
9.设单片机的 fosc = 12MHz ,使 P1.O 和 P1.1 分别输出周期为1ms 和 lOms 的方波,请用定时器 TO方式 2 编程实现。
解: fosc = 12MHz ,所以机器周期为1us。
要使 P1.0 输出周期为 1000us 的方波,可以通过定时中断方式实现,定时时间为250us,定时计数 2 次来实现,对 P1.0 求反即可。
要使 P1.1 输出周期为 10ms 的方波,也可以通过定时中断方式实现,定时时间为5ms,当时间到时,对 P1.1 求反即可。由于5ms/250us=20 ,所以也可以通过对250us 的定时计数 20 次来实现。程序如下:
#include
sbit P1_0=P1^0;// 输出周期为 400us 的方波的引脚
sbit P1_1=P1^1; // 输出周期为 10ms的方波的引脚
unsigned char num1=0,num2=0;// 中断次数计数器,初值为 0
void main(){
P1_0=0; // 输出初值为 0
P1_1=0; // 输出初值为 0
TMOD=0x02; //T0 方式 2 定时
TH0=256-250;// 计 200 次,计数初值为模256 减 200
TL0=TH0;
IE=0x82; // 允许 CPU响应中断,允许T0 发中断请求
TR0=1; // 启动 T0
for(;;){} // 无限循环等待中断
}
void timer0()interrupt 1 using 1{
num1++;num2++; // 中断次数加 1
if(num1==2) // 中断次数达到 2 次
{ P1_0=!P1_0; // 输出 P1_0 求反
num1=0; // 中断次数复位为 0
}
if(num2==20){ // 中断次数达到20 次
num2=0; // 中断次数复位为0
P1_1=!P1_1; // 输出 P1_1 求反
}
}
10.编写程序,要求使用TO,采用方式 2 定时,在P1.0 输出周期为400us 占空比为10:1 的矩形脉冲。
解:设fosc = 12MHz ,则机器周期为1us 。设P1.0 初值为0。
周期为400us ,可定义方式 2 定时,计数初值为256-40 ,一个周期中断10 次为400us ,在中断计数为 1 和2( 或任意两次计数之间) 时,对P1.0 求反即可。
#include
sbit P1_0=P1^0; //输出周期引脚
unsigned chart=0; //中断次数计数器,初值为0
void main(){
P1_0=0;// 输出初值为0
TMOD=0x02;//T0 方式 2 定时
TH0=256-40;// 计 40 次,计数初值为模256 减 40
TL0=TH0;
IE=0x82; //允许CPU响应中断,允许T0 发中断请求
TR0=1;// 启动 T0
for(;;){} //无限循环等待中断
}
void timer0()interrupt 1 using 1{
t++;// 中断次数加 1
if(cnt==1||cnt==2) P1_0=!P1_0; //
if(cnt==10)cnt=0; //中断次数达到中断次数为
10 时复位为
1 或
2 时对输出引脚求反
}