单片机应用技术项目教程( C 语言版)习题答案
项目一 1-1 填空题
( 1 )8031,8751
( 2 )存储器,定时器 / 计数器,输入 / 输出接口电路
( 3 )上电自动复位,手动复位
( 4 )12, 1μs , 1 , 4
( 5 ) 1
( 6 ) 4 , 1 , 2 , 5 1-2选择题
( 1 ) A
( 2 ) C
( 3 ) D
( 4 ) C
( 5 ) A 1-3
( 1 ) Keil C51 软件的主要功能
Keil C51软件提供了丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
μVision2 集成开发环境可以完成工程建立和管理、编译、连接、目标代码的生成、软件仿真 和硬件仿真等完整的开发流程。
( 2 ) PROTEUS 软件的主要功能
Proteus不仅是模拟电路、数字电路、模 / 数混合电路的设计与仿真平台,也是目前较 先进的单片机和嵌入式系统的设计与仿真平台。在计算机上,能完成从原理图与电路设计、
电路分析与仿真、单片机代码级调试与仿真、系统测试与功能验证到形成PCB的完整的电子 设计、研发过程。
1-4 简叙单片机的发展及发展趋势。
单片机的发展主要有以下几个方面:
( 1 )增加字长,提高数据精度和处理的速度;
( 2 )改进制作工艺,提高单片机的整体性能;
( 3 )由复杂指令集 CISC 转向简单指令集 RISC 的技术;
( 4 )多功能模块集成技术,使一块“嵌入式”芯片具有多种功能;
( 5 )微处理器与DSP技术相结合;
( 6 )融入高级语言的编译程序;
项目二 LED 循环点亮控制
( 7 )低电压、宽电压、低功耗。
目前,国际市场上 8 位、16位单片机系列已有很多,32位的单片机也已经进入了实用 阶段。随着单片机技术的不断发展,新型单片机还将不断涌现,单片机技术正以惊人的速度 向前发展。
1-5 简叙单片机的主要应用领域。
单片机的主要应用领域:工业控制、智能仪表、外设控制、家用电器、机器人、军事 装置等。
1-6 简叙单片机的主要特点。
( 1 )体积小、重量轻,价格低、功能强,电源单一、功耗低,可靠性高、抗干扰能 力强。
( 2 )使用方便灵活、通用性强。
( 3 )大多数单片机采用哈佛( Harvard )结构体系,单片机的数据存储器空间和程 序存储器空间相互独立。
( 4 )突出控制功能的指令系统。
( 5 )较低的处理速度和较小的存储容量。
1-7 如果只使用片外 ROM , 引脚应该如何接?为什么?
( 1 ) 引脚应该接地
( 2 )当 EA 为高电平时,访问内部程序存储器,当超过内部程序存储器地址范围后 ,
自动转向外部程序存储器;当EA 为低电平时,则访问外部程序存储器。
1-8 在工作模块2 中,如果把LED闪烁程序的延时函数 Delay() 写在 main() 后面,程 序应该如何修改?
要在 main() 函数前面,对 Delay() 函数的原型进行声明,代码如下:
void Delay();
1-9 单片机最小系统由哪几部分组成?现要求LED的阳极接在 P1.0 引脚上,请完成 LED点亮电路和 C 语言程序设计。
2
项目二 LED 循环点亮控制
( 1 )最小系统就是指由单片机和一些基本的外围电路所组成的一个可以工作的单片 机系统。一般来说,它包括单片机、晶振电路和复位电路。
( 2 )电路如下:
R1
10k
C1
30pF
C2
30pF
X1
CRYSTAL
C3
10uF
XTAL2 18
XTAL1 19
30 ALE 31 EA 29 PSEN
9 RST
P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32
P1.0/T2 1
P1.1/T2EX 2
3 P1.2 4 P1.3 5 P1.4 6 P1.5 7 P1.6 8 P1.7
P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WRP3.5/T1 1615 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27
U1
AT89S52
R2
220
D1
LED-RED
( 3 )程序如下:
#include <AT89X52.H> //包含 AT89X52.H 头文件 sbit LED=P1^0; //定义 LED 为 P1.0 引脚 void main (void)
{
LED=1; //P1.0 引脚输出高电平,点亮 LED while(1);
}
1-10 请完成用开关控制LED闪烁快和慢两种效果的电路和 C 语言程序设计。
( 1 )电路如图1-20所示
( 2 )程序如下:
#include <AT89X52.H> //包含 AT89X52.H 头文件
sbit SW=P3^0; //定义 SW 是 P3.0 位对应的引用符号 sbit LED=P1^0; //定义 LED 是 P1.0 位对应的引用符号 void Delay() //延时函数
3
项目二 LED 循环点亮控制 {
unsigned char i, j;
for (i=0;i<255;i++) for (j=0;j<255;j++);
}
void main (void) {
while(1) {
if(SW==0) //开关闭合 SW=0:LED 闪烁快 {
LED = 0; // P1.0=0,LED 点亮 Delay(); //延时
LED = 1; // P1.0=1,LED 熄灭 Delay();
}
Else //开关断开 SW=1:LED 闪烁慢 {
LED = 0; // P1.0=0,LED 点亮 Delay(); Delay(); //延时时间变长 LED = 1; // P1.0=1,LED 熄灭
Delay(); Delay();
} }
}
项目二 2-1 填空题
( 1 ) 20H ,2FH, 21H
( 2 )确定工作寄存器组
( 3 ) 00H ,1FH, 4
( 4 ) P0 , P2
( 5 ) 07H , 0000H , 00H , 0FFH
( 6 ) 3 , 18H ~1FH
( 7 ) bit , 20H ~2FH
( 8 ) 0 ~ 255 , 0 ~ 65535 2-2 选择题
4
项目二 LED 循环点亮控制
( 1 ) B , A
( 2 ) B
( 3 ) C
( 4 ) C
( 5 ) B
( 6 ) D
2-3 P0口、 P1 口、 P2 口和 P3 口的负载能力是多少?它们是否具有位寻址功能?
( 1 ) P0 口负载能力为 8 个TTL门电路, P1 口、 P2 口和 P3 口负载能力为 4 个 TTL门电路。
( 2 )具有位寻址功能
2-4 在输出时, P0 口为什么要外接上拉电阻才能有高电平输出?
由于 P0 口的输出电路是漏极开路电路,所以必须外接上拉电阻才能有高电平输出。
2-5 MCS-51 单片机有哪几个存储空间?是如何分布的?
( 1 ) MCS-51 单片机有程序存储器和数据存储器 2 个存储空间。
( 2 ) MCS-51 单片机存储器在物理结构上可分为 4 个存储空间:内部数据存储器、
内部程序存储器、外部数据存储器和外部程序存储器。
从逻辑上分,即从用户使用的角度看, MCS-51 单片机存储器分为 3 个逻辑空间:片 内外统一编址的程序存储器地址空间、内部数据存储器地址空间和外部数据存储器地址空间。
2-6 MCS-51 单片机内部 RAM 分成几个不同区域及地址范围?
内部数据存储器在物理上和逻辑上都分为两个地址空间: 00H ~ 7FH 单元组成的低 128字节数据存储器空间和 80H ~FFH单元组成的高 128 字节特殊功能寄存器空间。
2-7 PSW的作用是什么?常用的状态标志有哪几位?其作用是什么?能否位寻址 ? 5
项目二 LED 循环点亮控制
PSW 是一个 8 位特殊功能寄存器,用于存放程序运行中的各种状态信息,可以位寻 址。
( 1 ) CY (PSW.7):高位进位标志位。
( 2 ) AC (PSW.6):辅助进位标志位。
( 3 ) F0 (PSW.5):用户标志位。
( 4 ) RS1 (PSW.4)、 RS0 (PSW.3):寄存器组选择位。
( 5 ) OV (PSW.2):溢出标志位。
( 6 )-(PSW.1):保留位,无定义。
( 7 ) P (PSW.0):奇偶校验位。
2-8 bit和 sbit 有什么区别?
bit 声明的是位变量,必须定位在 MCS-51 单片机内部 RAM 的位寻址空间中。
sbit声明的是可寻址位,用于定义某些特殊位,利用它可以访问芯片内部的 RAM 中 的可寻址位或特殊功能寄存器中的可寻址位。
2-9 在 C 语言里,sbit P1_0 = 0x90 语句作用是什么?能不能直接使用 P1.0 (说明原 因)?
( 1 )sbit P1_0 = 0x90语句作用是声明 P1_0 为 P1 中的P1.0引脚。
( 2 )由于 C 语言规定标识符是由字母、数字和下划线组成,所以不能直接使用P1.0 作为标识符。
2-10 试一试能否将工作模块 3 的LED循环点亮改为LED双向循环点亮。
LED双向循环点亮代码如下:
#include <AT89X52.H> //包含 AT89X52.H 头文件 void Delay() //延时函数
{
unsigned char i, j;
for (i=0;i<255;i++) for (j=0;j<255;j++);
6
项目二 LED 循环点亮控制 }
void main() {
unsigned char i;
unsigned char temp;
P1 = 0xff; //十六进制全 1,熄灭所有 LED while(1)
{
temp = 0x01; //正方向,初始控制码为 0x01 for (i=0;i<8;i++)
{
P1 = ~ temp; //temp 值取反送 P1 口 Delay();
temp = temp << 1 ; //temp 值左移一位,获得下一个控制码 }
temp = 0x80; //反方向,初始控制码为 0x80 for (i=0;i<8;i++)
{
P1 = ~ temp; //temp 值取反送 P1 口 Delay();
temp = temp >> 1 ; //temp 值右移一位,获得下一个控制码 }
} }
2-11 设计用开关控制步进电机转向的AT89S52单片机控制系统,功能要求:开关闭 合,正转;开关断开,反转。
( 1 )电路如下:
A B C D A B
D C
XTAL2 18
XTAL1 19
30 ALE 31 EA 29 PSEN
9 RST
P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32
1 P1.0 2 P1.1 3 P1.2 4 P1.3 5 P1.4 6 P1.5 7 P1.6 8 P1.7
P3.0/RXD 10 P3.1/TXD 11 P3.2/INT0 12 P3.3/INT1 13 P3.4/T0 14 P3.7/RD 17 P3.6/WRP3.5/T1 1615 P2.7/A15 28 P2.0/A8 21 P2.1/A9 22 P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27
U1
AT89C52
R1
10k
C1
30pF
C2 X1 30pF
CRYSTAL
1B 1 16 1C
2B 2 15 2C
3B 3 14 3C
4B 4 13 4C
5B 5 12 5C
6B 6 11 6C
7B 7 10 7C
9 COM
U2
ULN2003A
1
U3:A2
74LS04 3
U3:B4
5
U3:C6
13
U3:D12
R2 R3 R4 R5
10k
+88.8
C3
10uF
R6
10k
7
项目二 LED 循环点亮控制
( 2 )程序如下:
#include <AT89X52.H>
sbit SW=P3^0; //符号 SW 表示 P3.0 引脚 //由 delay 参数确定延迟时间
void mDelay (unsigned int delay) {
unsigned int i;
for(;delay >0; delay--) for(i=0;i<124;i++);
}
void main() {
while(1) {
if(SW==0) // SW 闭合,正转 {
P1=0x03; //A、B 绕组励磁 mDelay (50);
P1=0x06; //B、C 绕组励磁 mDelay (50);
P1=0x0C; //C、D 绕组励磁 mDelay (50);
P1=0x09; //D、A 绕组励磁 mDelay (50);
}
else // SW 断开,反转
{
P1=0x03; //A、B 绕组励磁 mDelay (50);
P1=0x09; //D、A 绕组励磁 mDelay (50);
P1=0x0C; //C、D 绕组励磁 mDelay (50);
P1=0x06; //B、C 绕组励磁 mDelay (50);
} }
}
2-12 设 计 开 关 控 制 电 灯 点 亮 的 AT89S52 单 片 机 控 制 系 统 , 驱 动 电 路 采 用 ULN2003A和继电器。功能要求:开关闭合,电灯点亮;开关断开,电灯熄灭。提示:参考
【技能训练 2-2 】单片机驱动继电器电路设计。
8
项目五 定时/计数器综合应用
项目三
3-1填空题
(1)if,switch
(2)无限
(3)1000
(4)\0
(5)该变量在 C51 硬件系统中所使用的存储区域,并在编译时准确的定位
(6)code
(7)动态,静态
(8)C0H 3-2选择题
(1)A
(2)A
(3)D
(4)A
(5)A
(6)C(因为使用的是汉字状态下的双引号)
(7)C
(8)B
3-3 LED数码管有哪两种结构?是如何实现的?
(1)LED 数码管有共阴极和共阳极两种结构。
(2)共阴极结构:是把所有发光二极管的阴极作为公共端(com)连起来。共阳极结 构:是把所有发光二极管的阳极作为公共端(com)连起来。
3-4 请简要说明 LED 数码管静态显示和动态显示的特点,实际设计时应如何选择?
(1)采用静态显示方式,较小的电流就可以获得较高的亮度,且占用 CPU 时间较少 编程简单,显示便于检测和控制,但其占用的 I/O 口线较多,硬件电路复杂,成本高,只 适合显示位数较少的场合。
(2)当显示位数较多时,采用动态扫描方式可以节省 I/O 端口资源,硬件电路也较简 单;但其稳定度不如静态显示方式;由于 CPU 要轮番扫描,将占用更多的 CPU 时间。
3-5 动态显示的过程是什么?
动态扫描过程如下:
(1)首先从段选线上送出字型编码,再控制位选端,字符就显示在指定数码管上,其 他位选端无效的数码管都处于熄灭状态,持续 1.5ms 时间,然后关闭所有显示;
(2)接下来又送出新的字型编码,按照上述过程又显示在另外一位数码管上;
(3)直到每一位数码管都扫描完为止.
动态扫描显示,数码管其实是轮流依次点亮的,但由于人的视觉驻留效应,因此当每 个数码管点亮的时间小到一定程度时,人就感觉不出字符的移动或闪烁,觉得每位数码管 都一直在显示,达到一种稳定的视觉效果。
3-6 在用共阳极数码管显示的电路中,如果直接将共阳极数码管换成共阴极数码管,
能否正常显示?为什么?应采取什么措施?
(1)不能显示。
(2)由于在共阳极数码管显示的电路中,其公共端(com)是接电源(+5V)的,而 共阴极数码管的公共端(com)必须接地。
(3)把接电源的公共端,改接为地。
9
项目五 定时/计数器综合应用
3-7 工作模块八中,如果轻触开关改接 P1.7,并且要求实现 0~59 循环计数,程序应如 何修改?
(1)把“P1_0==0”都修改为“P1_7==0”
(2)把“if(Count==100)”修改为“if(Count==60)”
3-8 工作模块七,数码管动态显示程序设计时如果把延时时间改为 1s,会出现什么情 况?
(1)6 个数码管轮流依次显示“1、2、3、4、5、6”,每个数码管显示时间是 1s;
(2)在 6 个数码管轮流依次显示“123456”的 6 个数字之间,6 个数码管会熄灭 1s。
3-9 如何设计 0~999 的计数器。
(1)采用动态扫描显示
(2)在工作模块七的基础上,使用高 3 位数码管。
(3)程序如下:
#include <AT89X52.h> //包含 AT89X52.H 头文件 /*定义 0~9 十个数字的字型码表*/
unsigned char code Tab[]=
{0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};
unsigned char code Col[]={0xfe,0xfd,0xfb}; //位码 unsigned int Count; //定义变量放置计数数值 unsigned char buf[]={0,0,0};
void Delay() {
unsigned char i;
for(i=0;i<250;i++);
}
void main() //同时显示 123456 {
unsigned char j;
Count=0; //计数变量初始为 0 while(1)
{
buf[0]=[Count/100]; //获得百位数 buf[1]=[Count/10%10]; //获得十位数 buf[2]=[Count%10]; //获得个位数
for(j=0;j<3;j++) {
P0=Tab[buf[j]];
P1=Col[j-1]; //开(共阴)数码管 Delay();
P1=0xff; //关数码管 Delay();
}
Count++; //计数加 1
if(Count==1000) //判断计数是否到 1000 {
Count=0; //到 1000,计数器清 0 }
} }
项目四
10
项目五 定时/计数器综合应用
4-1填空题
(1)10ms
(2)5,2,外部中断 0( INT0 ),中断允许寄存器 IE,中断优先级寄存器 IP
(3)0003H,001BH
(4)电平触发方式,边沿触发方式 4-2选择题
(1)C
(2)A
(3)B
(4)C
(5)B
4-3什么叫中断?中断有什么优点?
(1)当 CPU 正在执行某个程序时,由计算机内部或外部的原因引起的紧急事件向 CPU发出请求处理的信号,CPU 在允许的情况下响应请求处理信号,暂时停止正在执行的 程序,保护好断点处的现场,转向执行一个用于处理该紧急事件的程序,处理完后又返回 被中止的程序断点处,继续执行原程序,这一过程就称为中断。
(2)能大大地提高计算机处理事件的能力,提高效率,增强实时性。
4-4什么叫中断源? MCS-51 系列单片机有几个中断源,各中断标志是如何产生的,
又如何清 0 的?CPU 响应中断时,它们的中断矢量地址分别是多少?
(1)向 CPU 发出中断请求的来源,或引起中断的原因称为中断源。
(2)MCS-51 系列单片机有 5 个中断源,它们的中断标志是由硬件自动置“1”,其中 只有串口的发送中断标志位 TI(串口的接收中断标志位 RI)是由软件清 0 的,其它中断标 志是由硬件自动清 0。
(3)CPU 响应中断时,它们的中断矢量地址如下表所示:
中断源 中断入口地址
外部中断 0 0003H
定时器 T0 中断 000BH
外部中断 1 0013H
定时器 T1 中断 001BH
串行口中断 0023H
4-5外部中断有哪两种触发方式?对触发脉冲或电平有什么要求?如何选择和设定?
(1)外部中断有电平触发方式和边沿触发方式两种触发方式。
(2)在电平触发方式下,CPU 响应中断后硬件不能自动使 IE1 清 0,也不能由软件使 IE1清 0,所以在中断返回前必须撤消 INT1 引脚上的低电平,使 IE1 置 0,否则将产生另一 次中断请求,造成出错;在边沿触发方式下,为保证 CPU 在两个机器周期内检测到先高后 低的负跳变,输入高低电平的持续时间至少要保持 12 个时钟周期。
(3)设置 IT0(IT1)为 0 时,表示外部中断为电平触发方式;设置 IT0(IT1)为 1 时,
表示外部中断为边沿触发方式。
4-6 MCS-51 系列单片机的中断系统中有几个优先级?如何设定?
(1)MCS-51 系列单片机的中断系统中有 2 个优先级,分别为高优先级和低优先级。
11
项目五 定时/计数器综合应用
(2)中断优先级寄存器 IP 的作用是设定各中断源的优先级别,IP 的每一位均可以由 软件来置 1 或清 0,置 1 是高优先级,清 0 是低优先级。
4-7 CPU响应中断有哪些条件?在什么情况下中断响应会受阻?
(1)CPU 并非在任何时刻都响应中断请求,而是在条件满足之后才会响应。响应中断 的条件是:
1)有中断源发出中断请求。
2)总中断开启,即中断总允许位 EA=1。
3)申请中断的中断源的中断允许位为 1。
在满足以上条件的基础上,CPU 一般会响应中断。
(2)有下列任何一种情况存在,中断响应都会受到阻断:
1)CPU 正在响应一个同级或更高优先级的中断。
2)当前指令尚未执行完。
3)正在执行中断返回或访问专用寄存器 IE、IP 的指令。CPU 在执行完上述指令之后,
要再执行一条指令才能响应中断请求。
4-8 MCS-51 单片机中断处理的过程如何描述?
中断处理过程可以分为三个阶段:中断响应、中断处理、中断返回。
(1)中断响应是 CPU 对中断源发出的中断请求进行的响应,包括保护断点和把程序 转向中断服务函数的入口地址。
(2)中断处理就是执行中断服务函数。中断服务函数从中断入口地址开始执行,直到 函数结束为止。
(3)中断返回是指中断服务完成后,CPU 返回到原来程序的断点(即原来断开的位 置),继续执行原来的程序。
4-9 机械式按键组成的键盘,如何消除按键抖动?独立式按键和矩阵式按键分别有什 么特点?实用于什么场合?
(1)消除抖动常用的方法有下列两种:硬件去抖和软件去抖。在键数较少时,可采用 硬件去抖;当键数较多时,采用软件去抖。
(2)独立式按键的特点是每个按键单独占用一根 I/O 口线,每个按键的工作不会影响 其他 I/O 线的状态;矩阵式按键的特点是由行线和列线组成,按键位于行、列的交叉点上,
节省了很多 I/O 口。
(3)在键数较少时,可采用独立式按键;在在键数较少时,可采用矩阵式按键。
4-10 如何使用 C 语言书写定时器 1 中断的中断服务程序的首部?要求使用寄存器组 2 代码如下:
void t1 (void) interrupt 3 using 2
项目五
5-1 填空题
(1)机器周期,外部的事件
(2)定时器
(3)工作方式控制寄存器 TMOD,控制寄存器 TCON
(4)10H,15H 5-2选择题
(1)C
(2)C
(3)B
12
项目五 定时/计数器综合应用
(4)D
5-3 定时器/计数器有哪几种工作方式?各有什么特点?
(1)定时器/计数器有方式 0、方式 1、方式 2 和方式 3 四种工作方式。
(2)方式 0 是 13 位计数器;方式 1 是 16 位计数器;方式 2 是自动重装初值 8 位计数 器;方式 3 的定时器 0 分为两个独立的 8 位计数器,方式 3 的定时器 1 无中断的计数器。
5-4 控制寄存器 TMOD 和 TCON 各位的定义是什么?怎样确定各定时器/计数器的工作 方式?
(1)TMOD(地址为 89H)的作用是设置 T0、T1 的工作方式。低 4 位用于控制 T0,
高 4 位用于控制 T1;TCON(地址为 88H)的作用是控制定时器的启动与停止,并保存 T0、T1 的溢出和中断标志。
(2)是通过工作方式控制位 M0 和 M1,来确定各定时器/计数器工作方式的,如下表 所示:
M1 M0 工作方式
0 0 方式 0
0 1 方式 1
1 0 方式 2
1 1 方式 3
5-5 在工作方式 3 中,定时器/计数器 T0 和 T1 的应用有什么不同?
定时器 0 分为两个独立的 8 位加 1 计数器 TH0 和 TL0。TL0 既可用于定时,也能用于 计数;TH0 只能用于定时。
定时器 1 不能工作在方式 3 下。
5-6 定时器/计数器作定时器用时,其定时时间与哪些因素有关?作计数器时,对外界 计数频率有何限制?
(1)定时器的定时时间与系统的时钟频率有关。因一个机器周期等于 12 个时钟周期,
所以计数频率应为系统时钟频率的 1/12(即机器周期)。如晶振频率为 12MHz,则机器周 期为 1ms。通过改变定时器的定时初值,并适当选择定时器的长度(8 位、13 位或 16 位),
以调整定时时间长短。
(2)外部计数脉冲的频率不能高于晶振频率的 1/24。
5-7当定时器 T0 工作于方式 3 时,如何使运行中的定时器 T1 停止下来?
当定时器 T0 工作于方式 3 时,T1 的控制位 TR1、TF1 和中断源都被 T0 占用了。这时 若要使运行中的定时器 T1 停止下来,可将 T1 设为方式 3。
5-8 晶振 fosc=6MHZ,T0 工作在方式 1,最大定时等于多少?
最大定时时间等于 131.072ms。
5-9 已知单片机时钟频率 fosc=12MHZ,当要求定时时间为 50ms 和 25ms 时,试编写定 时器/计数器的初始化程序。
(1)定时时间为 50ms 时,定时器/计数器的初始化程序:
TMOD =0x01; //T0 方式 1 计时 50ms TH0 = (65536-50000)/256; //定时器 T0 的高 8 位 TL0 = (65536-50000)%256;
EA = 1; //允许所有中断 ET0 = 1; //允许 T0 中断 TR0 = 1;
(2)定时时间为 25ms 时,定时器/计数器的初始化程序:
TMOD =0x01; //T0 方式 1 计时 25ms TH0 = (65536-25000)/256; //定时器 T0 的高 8 位
13
项目五 定时/计数器综合应用
TL0 = (65536-25000)%256;
EA = 1; //允许所有中断 ET0 = 1; //允许 T0 中断 TR0 = 1;
5-10已知 AT89C51 时钟频率 fosc=6MHZ,试利用定时器编写程序,使 P1.0 输出一个占 空比为 1/4 的脉冲波。
假设,脉冲周期是 100ms。占空比为 1/4 时:高电平是 25ms,低电平是 75ms。使 P1.0 输出一个占空比为 1/4 的脉冲波,代码如下:
#include <AT89x52.H>
int t;
void main() {
EA = 1; //允许所有中断 ET0 = 1; //允许 T0 中断 TMOD =0x01; //T0 方式 1 计时 25ms TH0 = (65536-25000)/256; //定时器 T0 的高 8 位 TL0 = (65536-25000)%256;
TR0 = 1;
while(1);
}
/* 定时器 0 中断服务子程序 */
void intserv1 (void) interrupt 1 using 1 {
TH0= -25000/256;
TL0= -25000%256;
P1_0=0; //P1.0 输出低电平,保持 75ms
t++;
if(t==3) //t 为 3 时,75ms 定时时间到,低电平变为高电平
{ t=0;
P1_0=1; //75ms 定时时间到,P1.0 输出高电平,保持
25ms } }
5-11 试用中断方式设计秒发生器,即在 AT89C51 的 P1.0 口每秒产生一个机器周期的 正脉冲,由 P1.1 口每分钟产生一个机器周期的正脉冲。
假设,时钟频率为 12MHZ,机器周期既为 1 微妙。代码如下:
#include <AT89x52.H>
#include <intrins.h>
unsigned char Second,t;
void main() {
EA = 1; //允许所有中断 ET0 = 1; //允许 T0 中断 TMOD =0x01; //T0 方式 1 计时 50ms TH0 = (65536-50000)/256; //定时器 T0 的高 8 位 TL0 = (65536-50000)%256;
TR0 = 1;
P1_0=0;
P1_1=0;
while(1);
}
/* 定时器 0 中断服务子程序 */
14
项目五 定时/计数器综合应用
void intserv1 (void) interrupt 1 using 1 {
TH0= -25000/256;
TL0= -25000%256;
t++;
if(t==20) //t 为 20 时,1 秒计时时间到 {
t=0;
P1_0=1; //1 秒计时时间到,P1.0 输出高电平
_nop_;
P1_0=0;
Second++;
if(Second>=60) {
Second=0;
P1_1=1; //1 分钟计时时间到,P1.1 输出高电平
_nop_;
P1_1=0;
} } }
5-12 试用定时器中断技术设计一个秒闪电路,要求使发光二极管 LED 每秒闪亮 400ms,设时钟频率为 6MHZ。
假设,LED 阴极接 P1.0 引脚,电路在此省略。时钟频率为 6MHZ,机器周期为 2 微妙。
代码如下:
#include <AT89x52.H>
unsigned char t10,t4;
void main() {
EA = 1; //允许所有中断 ET0 = 1; //允许 T0 中断
TMOD =0x01; //T0 方式 1 计时 100ms TH0 = (65536-50000)/256; //定时器 T0 的高 8 位 TL0 = (65536-50000)%256;
TR0 = 1;
P1_0=0;
while(1);
}
/* 定时器 0 中断服务子程序 */
void intserv1 (void) interrupt 1 using 1 {
TH0= -25000/256;
TL0= -25000%256;
t10++;
t4++;
if(t10==10) //t10 为 10 时,1 秒计时时间到
{
t10=0;
t4=0;
P1_0=1; //1 秒计时时间到,P1.0 输出高电平
}
If(t4==4) {
t4=0;
P1_0=0; //400ms 计时时间到,P1.0 输出低电平
15
项目五 定时/计数器综合应用
} }
项目六
6-1填空题
(1)8,A/D 转换器,8
(2)数字,模拟
(3)0.0196
(4)两级数据输入锁存
(5)500k,定时器中断,定时器中断服务程序
6-2 A/D和 D/A 转换器的作用分别是什么?各在什么场合下使用?
(1)A/D 转换器就是把模拟量转变成数字量,以适应单片机对其进行处理;D/A 转换 器就是把单片机输出的数字量转变成模拟量,以驱动外围部件。
(2)A/D 转换器使用在单片机的输入部分,因为外界物理量通常都是模拟信号,而单 片机内均是数字信号,所以在单片机的输入端需要模/数转换;D/A 转换器在单片机的输出 部分,因为执行机构的控制量通常都是模拟信号,而单片机内均是数字信号,因此在单片 机的输出端需要数/模转换。
6-3 D/A转换器的主要性能指标有哪些?设某 DAC 有二进制 14 位,满量程模拟输出电 压 10V,试问它的分辨率和转换精度各为多少?
(1)D/A 转换器的主要性能指标有:分辨率、线性度、转换精度、建立时间、工作温 度范围、电源抑制比、输入形式、输出形式等。
( 2 ) 分 辨 率 是 D/A 转 换 器 能 分 辨 的最 小 值, 14 位 DAC 的 分 辨 率 为 10V/16384=0.61mV。
(3)转换精度是 D/A 转换器将数字量转换为模拟量的理论值与实际值相比。
6-4决定 ADC0809 模拟电压输入路数的引脚有哪几条?
有 3 位地址输入线 ADDA、ADDB 和 ADDC,其中 ADDA 为低位地址,ADDC 为高位 地址。
6-5 试述 ADC0809 的特性。
ADC0809主要特性有以下几个方面:
(1)8 路 8 位 A/D 转换器,即分辨率 8 位;
(2)具有转换起停控制端;
(3)转换时间为 100μs;
(4)单个+5V 电源供电;
(5)模拟输入电压范围 0~+5V,不需零点和满刻度校准;
(6)工作温度范围为-40~+85 摄氏度;
(7)低功耗,约 15mW。
6-6 ADC0809的时钟如何提供,通过采用的频率是多少?
ADC0809的内部没有时钟电路,有时钟信号引脚,所需时钟信号由外界提供,通常使 用频率为 500kHz 的时钟信号。
6-7 简述 DAC0832 的用途和特性。
DAC0832是 8 位的 D/A 转换集成芯片,在单片机应用系统中得到广泛的应用。其主要 特性如下:
(1)分辨率为 2-8位,即 DAC0832 分辨率是 1/256。数字量的位数越多,分辨率就越 高,转换器对输入量变化的敏感程度就越高;
16
项目五 定时/计数器综合应用
(2)电流稳定时间 1us;
(3)可单缓冲、双缓冲或直接数字输入;
(4)只需在满量程下调整其线性度;
(5)单一电源供电(+5V~+15V);
(6)低功耗,20mW。
6-8 DAC0832和 MCS-51 接口时有哪三种工作方式?各有什么特点?适合在什么场合 下使用?
DAC0832有直通方式、单缓冲方式和双缓冲方式三种工作方式。
(1)直通方式:单片机输出的数字量可以被数模转换器直接转换输出。
(2)单缓冲方式:DAC0832 的两个输入寄存器中有一个处于直通方式,另一个处于 受控的锁存方式。在实际应用中,如果只有一路模拟量输出,或虽有几路模拟量但并不要 求同步输出的情况,就可采用单缓冲方式。
(3)双缓冲方式。把 DAC0832 的两个锁存器都设置成受控锁存方式。双缓冲方式用 于多路数/模转换系统,以实现多路模拟信号同步输出的目的。
6-9 编程输出 10KHZ 的方波、三角波。
(1)电路图如图 6-13 所示。
(2)输出 10KHZ 的方波
10KHZ方波的周期=1/10KHZ=100 微妙,既高电平保持 50 微妙、低电平保持 50 微妙。
在 T0 方式 1、晶振 12MHz 的条件下,定时 50μs 的定时初值为:X=65536-50。代码如下:
#include<absacc.h> //绝对地址头文件
#include<at89x52.h> //AT89S52 的头文件
#define dac0832 XBYTE[0x7fff] //绝对地址的处理
delay() //50μs 的延时函数,定时器 T0 中断采用查询方式
{
TH0=(65536-50)/256;
TL0=(65536-50)%256;
TR0=1;
while(!TF0);
TF0=0;
} main() {
TMOD= 0x01; //设置 T0 工作方式 1 while(1)
{
dac0832=0; //DA 转换输出低电平
delay(); //低电平保持 50μs
dac0832=0; //DA 转换输出高电平
delay(); //高电平保持 50μs
} }
(3)输出三角波
输出三角波的程序,工作模块 17 实现的是正锯齿波输出。在工作模块 17 基础上在增 加一个反锯齿波输出,既先输出一个正锯齿波,紧接着输出一个反锯齿波。这样就可以输 出三角波了,代码如下:
#include<absacc.h> //绝对地址头文件
#include<at89x52.h> //AT89S52 的头文件
#define dac0832 XBYTE[0x7fff] //绝对地址的处理
delay() //1ms 的延时函数
{
TH0=0xfc;
17
项目五 定时/计数器综合应用
TL0=0x18;
TR0=1;
while(!TF0);
TF0=0;
} main() {
int i;
TMOD = 0x01; //设置 T0 工作方式 1 while(1)
{
for(i=0;i<=255;i++) //形成正锯齿波的输出
{
dac0832=i; //DA 转换输出
delay();
}
for(i=255;i>=0;i--) //形成反锯齿波的输出
{
dac0832=i; //DA 转换输出
delay();
}
} }
项目七
7-1选择题
(1)D
(2)C
(3)C
(4)D
(5)D
(6)B
(7)A
(8)A
7-2 串行数据传送与并行数据传送相比的主要优点和用途是什么?
并行通信是指将待发送数据的各位同时传送,串行通信则将数据一位一位的按顺序传 送。
串行数据传送与并行数据传送相比的主要优点是传输线少,长距离传送时成本低,且 可以利用电话网等现成的设备。串行数据传送在单片机双机、多机以及单片机与 PC 机之 间通信等方面被广泛应用。
7-3 简述 MCS-51 系列单片机串行口四种工作方式的接收和发送数据的过程。
(1)方式 0。串行接口工作方式 0 为同步移位寄存器方式,其波特率是固定的,为 fosc(振荡频率)的 1/12。
1)方式 0 发送:数据从 RxD 引脚串行输出,TxD 引脚输出同步脉冲。
2)方式 0 接收:在满足 REN=1 和 RI=0 的条件下,串行口处于方式 0 输入。
(2)方式 1。在方式 1 时,串行口被设置为波特率可变的 8 位异步通信接口。
1)方式 l 发送。串行口以方式 1 发送时,数据位由 TxD 端输出,发送 1 帧信息为 10 位,其中一位起始位、八位数据位(先低位后高位)和一个停止位“1”。
2)方式 1 接收。当串行口设置为方式 1,且 REN=1 时,串行口处于方式 1 的输入状态。
当检测到起始位有效时,开始接收一帧的其余信息。
18
项目五 定时/计数器综合应用
(3)方式 2。被定义为 9 位异步通信接口。
1)方式 2 发送。发送数据由 TXD 端输出,发送一帧信息为 11 位,其中一位起始位
(0)、八位数据位(先低位后高位)、一位可控位 1 或 0 的第 9 位数据和一位停止位“1”。
2)方式 2 接收。当串行口置为方式 2 时,且 REN=1,串行口以方式 2 接收数据。方式 2的接收与方式 1 基本相似。
(4)方式 3。方式 3 为波特率可变的 9 位异步通信方式,除了波特率有所区别之外,
其余都与方式 2 相同。
7-4 串行口有几种工作方式?各工作方式的波特率如何确定?
(1)串行口有 4 种工作方式,分别为方式 0、方式 1、方式 2 和方式 3。
(2)各工作方式波特率的确定如下:
1)方式 0 的波特率确定
在方式 0 下,串行口通信的波特率是固定的,其值为 fosc/12(fosc 为主机频率)。
2)方式 2 的波特率确定
在方式 2 下,通信波特率为 fosc/32 或 fosc/64.用户可以根据 PCON 中 SMOD 位状态来 驱使串行口在那个波特率下工作。选定公式为:
2 *
64
波特率 SMOD fOSC
这 就 是 说 , 若 SMOD=0 , 则 所 选 波 特 率 为 fosc/64 ; 若 SMOD=1 , 则 波 特 率 为 fosc/32。
3)方式 1 或方式 3 的波特率确定
在这两种方式下,串行口波特率是由定时器的溢出率决定的,因而波特率也是可变的。
相应公式为:
2 * 1
32
SMOD
T
波特率定时器溢出率 定时器 T1 溢出率的计算公式为:
1 * ( 1 )
12 2
OSC k
T f
定时器溢出率
初值
式中,K 为定时器 T1的位数,它和定时器 T1的设定方式有关。即:
若定时器 T1 为方式 0,则 K=13 若定时器 T1 为方式 1,则 K=16 若定时器 T1 为方式 2 或 3,则 K=8
由上两式可知,方式 1 或方式 3 下所选波特率常常需要通过计算来确定初值,因为该 初值是要在定时器 T1 初值化时使用的。
7-5 定时器 1 做串行口波特率发生器时,为什么常采用方式 2 ?
因为定时器 T1 在方式 2 下工作时,TH1 和 TLl 分别设定为两个 8 位重装计数器(当 TL1从全“1”变为全“0”时,TH1 重装 TLl)。这种方式,不仅可使操作方便,也可避免因重 装初值(时间常数初值)而带来的定时误差。
7-6 使用 AT89S52 的串行口按工作方式 1 进行串行数据通讯,假定波特率为 2400b/s,
以中断方式传送数据,请编写全双工通讯程序。
(1)串口波特率设置如下:
采用时钟频率 fosc=11.0592MHz,SMOD=1,定时器 T1 方式 2,且串行传输波特率为 2400b/s;根据公式变换可得 T1 定时初值计算公式为:
*2 2 *32*12
osc SMOD
k f
初值 波特率
19
项目五 定时/计数器综合应用
根据以上条件可得初值为 232。
(2)串行口按工作方式 1 进行串行数据通讯,其中发送采用查询方式,接收采用中断 方式。代码如下:
#include <AT89X52.h>
unsigned char tmp; //存放接收数据 unsigned char send; //存放发送数据 void main(void)
{
TMOD=0x20; //T1 为方式 2 TH1=232; //波特率为 2400b/s TL1=232;
PCON = 0x80; //SMOD = 1
IE=0x90; //开启串行口中断
TR1=1;
IP=0x10; //设置串行口中断为高优先级 SCON=0x50; //设串口为方式 1、允许串行口接收 while(1)
{
SBUF=send; //发送数据
while(!TI); //等待发送数据结束(数据发送完, TI 由硬件置 位)
TI=0; //TI 复位 }
}
/* 串行口的中断服务子程序 */
void serial(void) interrupt 4 using 1 {
if(RI==1) {
RI=0; //接收中断标志位复位
tmp=SBUF; //接收发送端传送来的数据
} }
7-7 简述串口通信初始化步骤。
(1)确定定时器 T1 的工作方式——写 TMOD 寄存器。
(2)计算定时器 T1 的初值——装载初值。
(3)启动定时器 T1——TR1。
(4)确定串口的工作方式——写 SCON 寄存器。
(5)使用串口中断方式时——开启中断源、确定中断优先级。
7-8 简述多机通信的过程。
( 1 ) 主 、 从 机 工 作 于 方 式 2 或 方 式 3 , 主 机 置 SM2=0 , REN=1 ; 从 机 置 SM2=1,REN=1。
( 2 ) 主 机 置 位 TB8=1 , 向 从 机 发 送 寻 址 地 址 帧 , 各 从 机 因 满 足 接 收 条 件 (SM2=1,RB8=1),从而接收到主机发来的地址,并与本机地址进行比较。
(3)地址一致的从机(被寻址机)将 SM2 清 0,并向主机返回地址,供主机核对。
地址不一致的从机(未被寻址机)保持 SM2=1。
(4)主机核对返回的地址,若与此前发出的地址一致则准备发送数据;若不一致则返 回第 2 步重新发送地址帧。
(5)主机向从机发送数据,此时主机的 TB8=0,只有被选中的那台从机能接收到该 数据。其他从机则舍弃该数据。
20
项目五 定时/计数器综合应用
(6)本次通信结束后,从机重新置 SM2=1,等待下次通信。
21