单片机应用技术(c语言版 第3版)_习题答案

更新时间:2024-06-23 14:59:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

?

1.1 单项选择题

(1) A (2)C (3)C 1.2 填空题

(1)硬件系统、软件系统 (2)时钟电路、复位电路

(3)XTAL1、XTAL2、RESET、EA (4)晶振 1.3 问答题

习 题 1

什么是单片机?它由哪几部分组成?什么是单片机应用系统?

答:单片微型计算机(Single Chip Microcomputer)简称单片机,是指集成在一个芯片上的微型计算机,它的各种功能部件,包括CPU(Central Processing Unit)、存储器(memory)、基本输入/输出(Input/Output,简称I/O)接口电路、定时/计数器和中断系统等,都制作在一块集成芯片上,构成一个完整的微型计算机。

单片机应用系统是以单片机为核心,配以输入、输出、显示等外围接口电路和控制程序,能实现一种或多种功能的实用系统。

1.4 上机操作题 (1) 参考程序:

#include //包含头文件reg51.h,定义了51单片机的专用寄存器 //函数名:delay

//函数功能:实现软件延时

//形式参数:无符号整型变量i,控制空循环的循环次数 //返回值:无

void delay(unsigned int i) {

unsigned int k; }

void main() {

while(1){ P1=0x00; delay(20000); P1=0xff; delay(20000); } } (2) 参考程序:

#include //包含头文件reg51.h,定义了51单片机的专用寄存器

//调用延时函数,实际参数为20000

//调用延时函数,实际参数为20000 //主函数

for(k=0;k

//延时函数

//函数名:delay

//函数功能:实现软件延时

//形式参数:无符号整型变量i,控制空循环的循环次数 //返回值:无

void delay(unsigned int i) {

unsigned int k; }

void main() {

while(1){ P1=0x55; delay(20000); P1=0xff; delay(20000); } }

?

2.1 单项选择题 (1)C (2)A 2.2 填空题

(1)外部程序存储器、外部数据存储器、内部程序存储器、内部数据存储器 (2)程序存储器

(3)工作寄存器组、位寻址区、用户RAM (4)1us、2us

(5)按键复位、上电复位 (6)2、高 2.3 回答题

(1)P3口的第二功能是什么? 答: P3口各引脚的第二功能如下表。

第一功能 P3.0 P3.1 P3.2 P3.3 P3.4 P3.5 P3.6 第二功能 RXD TXD INT0INT1 //延时函数

for(k=0;k

//主函数

//调用延时函数,实际参数为20000

//调用延时函数,实际参数为20000

习 题 2

(3)A (4)A (5)A (6)D (7)C (8)A (9)A (10)C

第二功能信号名称 串行数据接收 串行数据发送 外部中断0申请 外部中断1申请 定时/计数器0的外部输入 定时/计数器1的外部输入 T0 T1 WR 外部RAM或外部I/O写选通 P3.7

RD 外部RAM或外部I/O读选通 (2)画出单片机时钟电路,并指出石英晶体和电容的取值范围。 答:单片机时钟电路单片机时钟电路如下图。

一般地,电容C1和C2取30 pF左右;晶体振荡器,简称晶振,频率范围是1.2~12 MHz。晶体振荡频率越高,系统的时钟频率也越高,单片机的运行速度也就越快。在通常情况下,使用振荡频率为6 MHz或12 MHz的晶振。如果系统中使用了单片机的串行口通信,则一般采用振荡频率为11.0592 MHz的晶振。

(3)什么是机器周期?机器周期和晶振频率有何关系?当晶振频率为6MHz时,机器周期是多少? 答:

51单片机采用定时控制方式,有固定的机器周期。规定一个机器周期的宽度为6个状态,即12个振荡脉冲周期,因此机器周期就是振荡脉冲的十二分频。

当晶振频率为6MHz时,机器周期是2us。

(4)51单片机常用的复位方法有几种?画电路图并说明其工作原理。 答:2种,上电复位和按键复位。单片机常见的复位电路下图所示。

(a)为上电复位电路。它利用电容充电来实现复位,在接电瞬间,RST端的电位与VCC相同,随着充电电流的减少,RST的电位逐渐下降。只要保证RST为高电平的时间大于两个机器周期,便能正常复位。

(b)为按键复位电路。该电路除具有上电复位功能外,还可以按图2.5(b)中的RESET键实现复位,此时电源VCC经两个电阻分压,在RST端产生一个复位高电平。图1.23中的信号灯控制电路就采用按键复位电路。

(5)51单片机片内RAM的组成是如何划分的?各有什么功能?

答:8051的内部RAM共有256个单元,通常把这256个单元按其功能划分为两部分:低128单元(单元地址0x00~0x7F)和高128单元(单元地址0x80~0xFF)。

片内RAM的低128个单元用于存放程序执行过程中的各种变量和临时数据,称为DATA区。内部RAM的高128单元地址为0x80~0xFF,是供给专用寄存器SFR(Special Function Register,也称为特殊功能寄

存器)使用的。

(6)51单片机有多少个特殊功能寄存器?它们分布在什么地址范围?

答:51单片机有21个可寻址的专用寄存器,它们不连续地分布在片内RAM的高128单元中,尽管其中还有许多空闲地址,但用户不能使用。另外还有一个不可寻址的专用寄存器,即程序计数器PC,它不占据RAM单元,在物理上是独立的。

(7)简述程序状态寄存器PSW各位的含义,单片机如何确定和改变当前的工作寄存器组。

答:程序状态字PSW是一个8位寄存器,用于存放程序运行中的各种状态信息。PSW的各位定义如下表所示。

位 地 址 位 名 称 0xD7 CY 0xD6 AC 0xD5 F0 0xD4 RS1 0xD3 RS0 0xD2 OV 0xD1 F1 0xD0 P CY(PSW.7):进位标志位。存放算术运算的进位标志。

AC(PSW.6):辅助进位标志位。存放算术运算中低4位向高4位进位或借位。 F0(PSW.5):用户标志位。供用户定义的标志位,需要利用软件方法置位或复位。 RS1和RS0(PSW.4,PSW.3):工作寄存器组选择位。上电或复位后,RS1 RS0=00。 OV(PSW.2):溢出标志位。存放带符号数加减运算的溢出位。 F1(PSW.1):保留未使用。

P(PSW.0):奇偶标志位。存放累加器ACC数据的二进制形式中1的个数的奇偶性。一般用于异步串行通信中的奇偶校验。

(8)C51编译器支持的存储器类型有哪些?

答:单片机的存储器结构包括4个物理存储空间,C51编译器对这4个物理存储空间都能支持。常见的C51编译器支持的存储器类型如下表所示。

存储器类型 data bdata idata pdata xdata code 描 述 直接访问内部数据存储器,允许最快访问(128 B) 可位寻址内部数据存储器,允许位与字节混合访问(16 B) 间接访问内部数据存储器,允许访问整个内部地址空间(256 B) “分页”外部数据存储器(256 B) 外部数据存储器(64 KB) 程序存储器(64 KB) (9)当单片机外部扩展RAM和ROM时,P0口和P2口各起什么作用?

答:P0口可以分时复用作为8位数据总线和低8位地址线,P2口作为高8位地址线。 (10)在单片机的C语言程序设计中,如何使用SFR和可寻址位? 答:采用sfr和sbit来定义专用寄存器和位。 2.4 上机操作题

(1)修改程序ex2_1.c,使得蜂鸣器发出有变化的报警声。 提示:修改延时参数,声音就会有改变。

(2)利用单片机控制蜂鸣器和发光二极管,设计一个声光报警系统。

提示:增加一个LED发光二极管,采用一个I/O口来控制,当报警时,发出声音的同时,灯也闪动。 (3)利用单片机控制按键和发光二极管,设计一个单键控制单灯亮灭的系统。 参考电路如下图:

参考程序如下:

//功能:单键控制单灯程序 #include

sbit P1_0=P1^0; //定义P1.0引脚名称为P1_0 sbit P3_0=P3^0; //定义P3.0引脚名称为P3_0 void main() {

bit led; //定义位变量led

P3_0=1; //P3.0作为输入口,置1 led=P3_0; //读P3.0

if(led==1) P1_0=1; //判断按键是否按下,没有按下,灯熄灭 if()led==0 P1_0=0; //按键按下,灯点亮 }

(4)利用单片机控制4个按键和4个发光二极管,设计一个4人抢答器,要求当有某一参赛者首先按下抢答开关时,相应的LED灯亮,此时抢答器不再接受其他输入信号,需按复位按键才能重新开始抢答。

参考电路如下图。

//主函数

参考程序如下。

//功能:实用4路抢答器程序 #include

sbit P3_0=P3^0; //定义P3.0引脚名称为P3_0

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)

while(1) {

for(i=0;i<60;i++) {

t=(((i/10)<<4)|(i));// 将i转换为BCD码 P1=~t; delay1s(); } } }

(3)可控霓虹灯设计。系统包括8个发光二极管,连接在P3.2引脚的一个按键,通过按键改变霓虹灯的显示方式。要求正常情况下8个霓虹灯依次顺序点亮,循环显示,时间间隔为1 s。按键按下后8个霓虹灯同时亮灭一次,时间间隔为0.5 s。(按键动作采用外部中断0实现)。 答:

参考程序如下:

//功能:可控信号灯程序

#include //函数名:delay0_5s

//函数功能:用T0的方式1编制0.5秒延时程序,假定系统采用12MHz晶振,定 // 时器1、工作方式1定时50ms,再循环10次即可定时到0.5秒 //形式参数:无 //返回值:无 void delay0_5s() {

unsigned char i; for(i=0;i<0x0a;i++) { TH0=0x3c; TL0=0xb0;

TR0=1; TF0=0; } }

//函数名:delay_t

//函数功能:实现0.5秒~128秒延时 //形式参数:unsigned char t; // 延时时间为0.5秒×t //返回值:无

void delay_t(unsigned char t) {

unsigned char i;

for(i=0;i

// 启动T0

while(!TF0); // 查询计数是否溢出,即定时50ms时间到,TF0=0

// 50ms定时时间到,将定时器溢出标志位TF0清零

// 设置定时器初值 // 设置10次循环次数

// 计数值取反后送P1口显示 // 调用1秒延时函数

//函数名:int_0

//函数功能:外部中断0中断函数,当CPU响应外部中断0的中断请求时,自动执行该 // 函数,实现八个信号灯闪烁 //形式参数:无 //返回值:无

void int_0() interrupt 0 //外部中断0的中断号为0 {

P1=0x00; P1=0xff; delay0_5s(); } void main() {

unsigned char i,w; EA=1; EX0=1; IT0=1; while(1){

w=0x01; // 显示码初值为01H for(i=0;i<8;i++){ P1=~w;

// w取反后送P1口,点亮相应LED灯

w<<=1; // 点亮灯的位置移动

delay_t(2); // 调用延时函数delay_t(),实际参数为2,延时1秒

} } }

// 打开中断总允许位

// 打开外部中断0允许位

// 设置外部中断为边沿(下降沿)触发方式

//主函数

//熄灭八个信号灯 //调用0.5秒延时函数 //点亮八个信号灯

delay0_5s();

//调用0.5秒延时函数

TMOD=0x01; // 设置T0为工作方式1

习 题 6

6.1 单项选择题

(1)A (2)B (3)D (4)C (5)B (6)C (7)B (8)C (9)C (10)A (11)C (12)D (13)A

6.2 问答题

(1)什么是串行异步通信?有哪几种帧格式? 答:

在异步通信中,数据通常是以字符为单位组成字符帧传送的。字符帧由发送端一帧一帧地发送,每一帧数据是低位在前,高位在后,通过传输线由接收端一帧一帧地接收。发送端和接收端分别使用各自独立的时钟来控制数据的发送和接收,这两个时钟彼此独立,互不同步。

在串行通信中,两相邻字符帧之间可以没有空闲位,也可以有若干空闲位,这由用户来决定。

(2)定时器T1做串行口波特率发生器时,为什么采用工作方式2? 答:

实际上,当定时器T1做波特率发生器使用时,通常是工作在定时器的模式2下,即作为一个自动重装载的8位定时器,TL1做计数用,自动重装载的值在TH1内。

7.3 编程题

(1)利用串行口设计4位静态LED显示,画出电路图并编写程序,要求4位LED每隔1 s交替显示“1234”和“5678”。

参考电路在教材第207页图6.16的基础之上再添加两片74LS164和两个数码管即可。 参考程序如下:

#include \包含头文件reg51.h,定义51单片机的专用寄存器 unsigned char da[]={0xF9,0xA4,0xB0,0x99}; //定义1~4的共阳极字型显示码 unsigned char da1[]={0x92,0x82,0x0F8,0x80}; //定义5~8的共阳极字型

void delay1s() {

unsigned char i; for(i=0;i<0x20;i++) { TH0=0x3c; TL0=0xb0;

TR0=1; TF0=0; } } main() {

unsigned char i; P1=0xff; SCON=0x00; while(1){

for (i=0;i<4;i++) {

SBUF=da[i]; TI=0;

while(!TI); }

//送显示数据5678 //等待发送完毕

//等待发送完毕

//送显示数据1234

//P1.0置1,允许串行移位 //设串行口方式0

// 设置T0为工作方式1

// 启动T0

while(!TF0); // 查询计数是否溢出,即定时50ms时间到,TF0=0

// 50ms定时时间到,将定时器溢出标志位TF0清零

// 设置定时器初值 // 设置20次循环次数

TMOD=0x01;

delay1s(); for (i=0;i<4;i++) {

SBUF=da1[i]; TI=0;

while(!TI);

}

}

}

(2)编程实现甲乙两个单片机进行点对点通信,甲机每隔1 s发送一次“A”字符,乙机接收到以后,在LCD上能够显示出来。

参考电路图略。 参考程序如下: 甲机发送程序:

//功能:甲机发送数据程序,采用查询方式实现

#include //包含头文件reg51.h,定义51单片机的专用寄存器 void main() {

unsigned char i;

TMOD=0x20; //定时器T1工作于方式2 TL1=0xf4; //波特率为2400bps TH1=0xf4; TR1=1;

//主函数

while(1) { }

乙机接收程序略。

(3)编写一个实用的串行通信测试软件,其功能为:将PC机键盘的输入数据发送给单片机,单片机收到PC机发来的数据后,回送同一数据给PC机,并在屏幕上显示出来。只要屏幕上显示的字符与所键入的字符相同,说明二者之间的通信正常。

通信协议: 第1字节,最高位(MSB)为1,为第1字节标志;第2字节,MSB为0,为非第1字节标志,依次类推,最后1字节为前几字节后7位的异或校验和。

单片机串行口工作在方式1,晶振为11.0592 MHz,波特率为4800 bps。 通信程序略。

SCON=0x40; //定义串行口工作于方式1 while(TI==0); // 查询等待发送是否完成 TI=0; }

// 发送完成,TI由软件清0

SBUF=0x41; // 发送A

delay1s(); //1秒延时函数参见7.3(1)题

习 题 7

7.1 单项选择题

(1)D (2)A (3)C (4)D (5)A

7.2 填空题

(1)模拟,数字,数字,模拟 (2)分辨率、建立时间 7.3 问答题

(1)判断A/D转换是否结束,一般可采用几种方式?每种方式有何特点? 答:

查询方式,CPU通过查询转换结束标志位确认转换结束后,再执行后面的操作,占用CPU时间; 中断方式,转换结束后向CPU申请中断,CPU在中断服务函数中读取转换值,不占用CPU时间;

延时方式,如果知道A/D转换时间,可以在转换开始后直接延时超过该时间的时间,占用CPU时间。 7.4 应用题

(1)设计一个锯齿波发生器系统。 提示:程序ex7_3.c中修改数组sin据即可。

(2)EEPROM芯片AT24C02采用的也是I2C总线接口,请设计51单片机扩展EEPROM的软硬件系统。

提示:请查阅AT24C02资料,参考电路(AT24C01)

//功能:EEPROM读写程序,从AT24C01的4个连续存储单元中读出4个字节的数据,然后将4 //

个新的数值写入AT24C01的对应4个存储单元中,再重新读出。

//_nop_()函数所在的头文件

//器件地址选择及写数据地址0xa0 //器件地址选择及读数据地址0xa1

#include

#include #define AddWr 0xa0 #define AddRd 0xa1 sbit SDA= P3^4; sbit SCL= P3^3; bit ack_bit;

/******************************位定义及预定义*******************************/

//串行数据输入/输出位定义 //串行时钟位定义 //应答标志 //延时函数声明 //开始函数 //停止函数

/******************************函数声明************************************/ void mDelay(unsigned char ms); void Start(void); void Stop(void);

本文来源:https://www.bwwdw.com/article/yu23.html

Top