sbit P3_1=P3^1; //定义P3.1引脚名称为P3_1 sbit P3_2=P3^2; //定义P3.2引脚名称为P3_2 sbit P3_3=P3^3; //定义P3.3引脚名称为P3_3 void main() { }
?
3.1 单项选择题
(1)C (2)A (3)A (4)D (5)D (6)D (7)A (8)B (9)C (10)A (11)void delay (unsigned int i)、delay、delay
3.2 填空题
(1)main (2)sbit FLAG=P3^1; (3)sfr (4)顺序、选择和循环
(5)表达式和分号 (6)if、switch (7)do-while语句、while语句 (8)无限次 (9)10000 (10)unsigned char
(11)指定该变量在51单片机硬件系统中所使用的存储区域,并在编译时准确的定位。
习 题 3
bit flag; //定义位变量flag
while(!flag) {
if(!P3_0) { }
P1=0xfe; } else if(!P3_1) {
P1=0xfd;
flag=1; } flag=1;
//主函数
else if(!P3_2) {
P1=0xfb; }
flag=1;
else if(!P3_3) {
P1=0xf7; }
flag=1;
while(flag);
(12)’\\0’
3.3 上机操作题
(1)感应灯控制系统设计。实现当照明灯感应到有人接近时自动开灯,当人离开后自动关灯的功能。 提示:采用热释电红外传感器模块和发光二极管模拟电灯
(2)自动滑动门开关控制系统设计。实现当滑动玻璃门感应到有人接近时自动开门,当人离开后自动关门的功能。
提示:采用热释电红外传感器模块和电机模拟自动开关门
?
4.1 单项选择题
习题 4
(1)C (2)A (3)C (4)B (5)B (6)D (7)B (8)C (9)D (10)D (11)C 4.2 填空题
(1)led[k] delay(); (2)’\\0’ (3)程序存储器
4.3 在任务10的图4.1中,如果直接将共阳极数码管换成共阴极数码管,能否正常显示?为什么?应采取什么措施? 答:
不能正常显示。因为共阳极数码管和共阴极数码管的显示码不同,二者是反相关系。修改程序,或者将显示码数组disp中的显示码换成共阴极显示码,或者在程序中增加取反操作即可。
4.4 七段LED静态显示和动态显示在硬件连接上分别具有什么特点,实际设计时应如何选择使用? 答:
静态显示是指使用数码管显示字符时,数码管的公共端恒定接地(共阴极)或+5 V电源(共阳极)。将每个数码管的8个段控制引脚分别与单片机的一个8位I/O端口相连。只要I/O端口有显示字型码输出,数码管就显示给定字符,并保持不变,直到I/O端口输出新的段码。数码管动态显示电路通常是将所有数码管的8个显示段分别并联起来,仅用一个并行I/O端口控制,称为“段选端”。各位数码管的公共端,称为“位选端”,由另一个I/O端口控制。
实际应用时,当显示位数少于2位时,可以采用静态显示方式;当显示位数较多时,建议采用动态显示方式。
4.5 LED大屏幕显示一次能点亮多少行?显示的原理是怎样的? 答:
LED大屏幕显示一次能点亮1行,采用逐行点亮的方式。
显示原理:先给第1行送高电平(行高电平有效),同时给8列送该行显示码(列低电平有效);然后给第2行送高电平,同时给8列送显示码,??最后给第8行送高电平,同时给8列显示码。每行点亮延时时间为约1 ms,第8行结束后再从第1行开始循环显示。利用视觉驻留现象,人们看到的就是一个稳定的字符。
4.6 机械式按键组成的键盘,应如何消除按键抖动? 答:
按键的机械抖动可采用硬件电路来消除,也可以采用软件方法进行去抖。软件去抖编程思路:在检测到有键按下时,先执行10 ms左右的延时程序,然后再重新检测该键是否仍然按下,以确认该键按下不是因抖动引起的。同理,在检测到该键释放时,也采用先延时再判断的方法消除抖动的影响。 4.7 独立式按键和矩阵式按键分别具有什么特点?适用于什么场合?
答:
在单片机应用系统中,如果系统需要按键数量较少,一般采用独立式按键接口,每个按键单独占用一根I/O端口线,按键的工作不会影响其他I/O端口线的状态,独立式按键的电路配置灵活,软件结构简单,但每个按键必须占用一根I/O端口线,因此,在按键较多时,I/O端口线浪费较大,不宜采用。
为了节约单片机硬件接口资源,当系统需要按键数量较多时,一般采用矩阵键盘接口方式。由4根行线和4根列线组成,例如:P0.0~P0.3控制行线,P2.0~P2.3控制列线,按键位于行、列线的交叉点上,且行线通过上拉电阻接到+5 V电源上,构成了一个4×4(16个按键)的矩阵式键盘。
习 题 5
5.1 单项选择题
(1)C (2)A (3)D (4)A (5)A (6)B (7)A (8)A (9)C (10)A (11)C (12)C (13)C (14)D
5.2 填空题
(1)T0、T1、方式寄存器TMOD和控制寄存器TCON (2)GATE=0 (3)0x50 (4)设置定时器的工作方式
(5)控制定时器的启动、停止、标识定时器的溢出和中断情况
(6)中断标志寄存器TCON、串行口控制寄存器SCON、中断允许控制寄存器IE和中断优先级控制寄存器IP
(7)中断标志寄存器TCON和串行口控制寄存器SCON、中断允许控制寄存器IE和中断优先级控制寄存器IP
(8)电平触发方式 (9)软件方法、硬件方法、硬软结合 5.3 问答题
(1)51单片机定时/计数器的定时功能和计数功能有什么不同?分别应用在什么场合? 答:
T0或T1用做计数器时,分别对从芯片引脚T0(P3.4)或T1(P3.5)上输入的脉冲进行计数,外部脉冲的下降沿将触发计数,每输入一个脉冲,加法计数器加1。计数器对外部输入信号的占空比没有特别的限制,但必须保证输入信号的高电平与低电平的持续时间都在一个机器周期以上。一般用于需要计数的场合,对时间没有要求。
用做定时器时,对内部机器周期脉冲进行计数,由于机器周期是固定值,故计数值确定时,定时时间也随之确定。如果51单片机系统采用12MHz晶振,则计数周期为:T机器周期=1/(12×106 /12)=1?s,这是最短的定时周期。适当选择定时器的初值可获取各种定时时间。一般用于对时间有要求的场合。
(2)软件定时与硬件定时的原理有何异同? 答:
软件定时是靠CPU运行空操作实现的,CPU在定时时不能进行其它操作,白白占用CPU时间。硬件定时是指采用单片机内部定时器实现定时,当定时器进行计数操作时,CPU可以进行其它操作。
(3)51单片机的定时/计数器是增1计数器还是减1计数器?增1和减1计数器在计数和计算计数初值时有什么不同?
答:51单片机的定时/计数器是增1计数器。
增1计数器是在初值基础上加1计数,直到翻转;减1计数器是在初值基础上减1计数,直到翻转。
(10)0
计算初值时,增1计数的初值需要用最大计数值(模值)减去计数值;减1计数的初值就是计数值。
(4)当定时/计数器在工作方式1下,晶振频率为6 MHz,请计算最短定时时间和最长定时时间各是多少?
答:工作方式1的计数模值是65536,机器周期2us,所以最短定时时间为2us,最长定时时间为:2us*65536=130ms。
(5)51单片机定时/计数器四种工作方式的特点有哪些?如何进行选择和设定?
答:工作方式0是13位定时计数器,工作方式1是16位定时计数器,工作方式2是初值自动重载的8位定时计数器,工作方式3下只有T0可以设置为工作方式3,T1设置为工作方式3后不工作。
可根据应用场合和定时时间来确定工作方式,在TMOD寄存器中设定。 (6)什么叫中断?中断有什么特点? 答:
中断是指通过硬件来改变CPU的运行方向。计算机在执行程序的过程中,外部设备向CPU发出中断请求信号,要求CPU暂时中断当前程序的执行而转去执行相应的处理程序,待处理程序执行完毕后,再继续执行原来被中断的程序。这种程序在执行过程中由于外界的原因而被中间打断的情况称为“中断”。
中断特点:同步工作、实时处理、异常处理等。
(7)51单片机有哪几个中断源?如何设定它们的优先级? 答:
中断源有5个,分别为外部中断0请求INT0、外部中断1请求INT1、T0溢出中断请求TF0、T1溢出中断请求TF1和串行口中断请求RI或TI。
51单片机有两个中断优先级:高优先级和低优先级。
每个中断源都可以通过设置中断优先级寄存器IP确定为高优先级中断或低优先级中断,实现二级嵌套。同一优先级别的中断源可能不止一个,因此,也需要进行优先权排队。同一优先级别的中断源采用自然优先级。中断优先级寄存器IP,用于锁存各中断源优先级控制位。IP中的每一位均可由软件来置1或清零,1表示高优先级,0表示低优先级。
(8)外部中断有哪两种触发方式?如何选择和设定? 答:
外部中断有电平触发方式和下降沿触发方式。由TCON中的IT位设定,例如:
当IT1 = 0时,外部中断1控制为电平触发方式;当IT1 = 1时,外部中断1控制为边沿(下降沿)触发方式。
(9)中断函数的定义形式是怎样的? 答:
C51编译器支持在C源程序中直接以函数形式编写中断服务程序。中断函数的定义形式如下:
void 函数名() interrupt n
其中n为中断类型号,C51编译器允许0~31个中断,n的取值范围为0~31。 5.4 操作题
(1)设计时间间隔为1 s的流水灯控制程序。 参考程序如下:
//功能:间隔显示时间为1秒的流水灯程序
#include \包含头文件REG51.H,定义了MCS-51单片机的特殊功能寄存器 //函数名:delay1s
//函数功能:用T1工作在方式1下的1秒延时函数,采用查询方式实现 //形式参数:无 //返回值:无
void delay1s() {
unsigned char i;
for(i=0;i<0x14;i++){ //设置20次循环次数 TH1=0x3c; TL1=0xb0;
TR1=1; TF1=0; } }
void main() {
unsigned char i,w;
TMOD=0x10; //设置T1为工作方式1 while(1){
w=0x01; //显示码初值为01H for(i=0;i<8;i++){ P1=~w; delay1s(); }
}
(2)用单片机控制8个LED发光二极管,要求8个发光二极管按照BCD码格式循环显示00~59,时间间隔为1 s。
提示:
BCD(Binary Coded Decimal)码是用二进制数形式表示十进制数,例如十进制数45,其BCD码形式为0x45。BCD码只是一种表示形式,与其数值没有关系。
BCD码用4位二进制数表示一位十进制数,这4位二进制数的权为8421,所以BCD码又称为8421码。用4位二进制数表示一个十进制数,例如十进制数56、87和143的BCD码表示形式如下:
0101 0110
(56) (87)
1000 0111 答:
参考程序如下:
//功能:采用BCD码格式显示的0~59简易秒表程序 #include
void delay1s() //1秒延时函数,参见任务7程序ex4_1.c void main() {
unsigned char i, t; TMOD=0x10;
// 置T1为工作方式1
}
//w取反后送P1口,点亮相应LED灯
//调用1秒延时函数
w<<=1; //点亮灯的位置移动
//主函数
//启动T1
while(!TF1); //查询计数是否溢出,即定时50ms时间到,TF1=1
//50ms定时时间到,将T1溢出标志位TF1清零
//设置定时器初值为3CB0H
0001 0100 0011 (143)