资源描述
第一章
1. 什么是单片机?
在一块集成电路芯片上集成了微处理器、存储器、输入接口、输出接口、定时器/计数器、中断等基本电路所构成的单片微型计算机,简称单片机(Single-Chip-Microcomputer)。
单片机有较强的控制功能,主要取决于单片机在其结构上的设计,包括单片机硬件、指令系统及I/O处理功能等方面都有独到之处。虽然单片机只是一个芯片,但无论从组成还是从其逻辑功能上来看,都具有微机系统的含义。
2.单片机应用灵活性体现在哪些方面?
单片机以其自身的特点,其应用领域已渗透入各个领域。
单片机的主要特点是体积小、功耗低、价格低廉、使用方便,控制功能强、便于进行位运算且具有逻辑判断、定时计数等多种功能。
单片机应用系统设计灵活,在系统硬件不变的情况下,可通过不同的程序可实现不同的功能,因此这从根本改变了传统控制系统的设计思想和设计方法。过去必须由模拟电路、数字电路及继电器控制电路实现的大部分功能,现在已能用单片机并通过软件方法实现。由于软件技术的飞速发展,各种软件系列产品的大量涌现,可以极大地简化硬件电路。“软件就是仪器”已成为单片机应用技术发展的主要特点。
3.简述单片机的发展历程。
1976年,Inter公司推出了MCS-48系列8位单片机
到目前为止,世界各地厂商已相继研制出大约50个系列300多个品种的单片机产品。代表产品有Intel公司的MCS-51系列(以下简称51系列)机(8位机)
目前,市场上的主流产品是51系列兼容机:由STC公司推出的高性价比的STC89系列单片机和Atmel公司生产的AT89系列单片机。
随着集成电路的发展,随之出现内核为32位的ARM处理器,
在单片机家族的众多成员中,51系列单片机以其优越的性能、成熟的技术及高可靠性和高性能价格比,迅速占领了工业测控和自动化工程应用的主要市场,
在8位单片机的基础上,又推出超8位单片机,其功能进一步加强,同时16位单片机也相继产生,代表产品有Intel公司的MCS-96系列以及ATMEL推出的AVR单片机。
4.计算机能够识别的数值是什么?为什么要引进十六进制数?
在计算机中,由于所采用的电子逻辑器件仅能存储和识别两种状态的特点,计算机内部一切信息存储、处理和传送均采用二进制数的形式。可以说,二进制数是计算机硬件能直接识别并进行处理的惟一形式。十六进制数可以简化表示二进制数。
5. 数值转换。
(1)37=( 100101 )B=( 25 )H
(2) 12.875=( 1100.111 )B=( 0CE )H
(3) 10110011B=( 0B3 )H=( 179 )10
(4) 10111.101B=(17.A )H=(23.625 )10
(5) 56H=( 01010110 )B=(86 )10
(6) 3DFH=( 0011 1101 1111 )B=(991 )10
(7)1A.FH =(1 1010.1111 )B=( 26.9375 )10
(8) 3C4DH=(11 1100 0100 1101 )B=( )10
6. 对于二进制数10001001B,若理解为无符号数,则该数对应十进制数为多少?若理解为有符号数,则该数对应十进制数为多少?若理解为BCD数,则该数对应十进制数为多少?
137 -119 89
7. 列出下列数据的反码、原码和补码。
(1) +123 (2) -127 (3) +45 (4) -278
(1)01111011 01111011 01111011
(2)10000000 11111111 10000001
(3)101101 101101 101101
(4)1111111011101001 1000000100010110 1111111011101010
8. 简述单片机的仿真过程和开发过程。
可以使用protues仿真软件首先建立电路原理图,然后调入由keil编译连接的.hex 文件(参考本章项目实例);
开发过程:(参考第8章)
第2章
1. 51单片机包括哪些主要逻辑功能部件?各功能部件的主要作用是什么?简单说明不同型号的差别。
8051单片机内部由CPU、4KB的ROM、128B的RAM、4个8位的I/O并行端口、一个串行口、两个16位定时/计数器及中断系统等组成。
2. 程序状态字寄存器PSW各位的定义是什么?
PSW是一个8位寄存器,用于寄存当前指令执行后的某些状态,即反映指令执行结果的一些特征信息。
Cy(PSW.7):即PSW的D7位,进位/借位标志。
AC(PSW.6):即PSW的D6位,辅助进位标志。
F0(PSW.5)及F1(PSE.1):即PSW的D5位、D1位,用户标志位。
RS1及RS0(PSW.4及PSW.3):即PSW的D4位、D3位,寄存器组选择控制位。
OV(PSW.2):即PSW的D2位,溢出标志。
3. 51存储器结构的主要特点是什么?程序存储器和数据存储器各有何不同?
MCS-51单片机的存储器结构与一般微机存储器的配置方法不同,一般微机把程序和数据共存同一存储空间,各存储单元对应惟一的地址。而MCS-51的存储器把程序和数据的存储空间严格区分开。
数据存储器用于存放程序运算的中间结果、状态标志位等。
程序存储器用于存放已编制好的程序及程序中用到的常数。
4. 51单片机内部RAM可分为几个区?各区的主要作用是什么?
内部数据存储器分为高、低128B两大部分。
低128B为RAM区,地址空间为00H~7FH,可分为:寄存器区、位寻址区、堆栈及数据存储区。存放程序运算的中间结果、状态标志位等。
高128B为特殊功能寄存器(SFR)区,地址空间为80H~FFH,其中仅有21个字节单
元是有定义的。
5. 51单片机的P0~P3四个I/O端口在结构上有何异同?使用时应注意哪些事项?
P0口是一个8位漏极开路型双向I/O端口。
P1口是一个内部带上拉电阻的8位准双向I/O端口。
P2口也是一个内部带上拉电阻的8位准双向I/O端口
P3口是一个内部带上拉电阻的8位多功能双向I/O端口。
在使用时应注意以下方面:
① P0~P3都是准双向I/O口,即CPU在读取数据时,必须先向相应端口的锁存器写入“1”。各端口名称与锁存器名称在编程时相同,均可用P0~P3表示。当系统复位时,P0~P3端口锁存器全为“1”,故可直接对其进行读取数据。
② P0口每一输出位可驱动8个LS型TTL负载,P0口可作通用输入、输出端口使用,此时,若要驱动NMOS或其他拉电流负载时,需外接上拉电阻,才能使该位高电平输出有效。
在单片机进行外部存储器扩展时,P0口必须作为地址/数据复用线使用,此时,不必外接上拉电阻,P0也不能作通用I/O口使用。
③ P1、P2、P3口输出均接有内部上拉电阻,输入端无需外接上拉电阻,每一位输出可以驱动4个LS型TTL电路。
④ P0、P2口除可以作通用I/O端口、以实现与外部进行数据交换外,更主要的是,当CPU访问外部存储器时,CPU将自动地把外部存储器的地址线信号(16位)送P0、P2口,作为地址总线(P0口输出低8位地址,P2口输出高8位地址),向外部存储器输出16位存储单元地址。在控制信号作用下,该地址低8位被锁存后,P0口自动切换为数据总线,这时经P0口可向外部存储器进行读、写数据操作。此时,P2口不再作通用I/O端口,P0口为地址/数据复用口。
6. 指出8051可进行位寻址的存储空间。
00~7FH(即20H.0~2FH.7)及SFR地址能被8整除的寄存器中的各位。
7. 在访问外部ROM或RAM时,P0和P2口各用来传送什么信号?P0口为什么要采用片外地址锁存器?
P0口传送地址低八位后可复用数据线,所以,P0口要采用片外地址锁存器。P2口传送地址高八位。
8. 什么是时钟周期?什么是机器周期?什么是指令周期?当振荡频率为12MHz时,一个机器周期为多少微秒?
时钟周期:也称振荡周期,即振荡器的振荡频率fosc的倒数,是时序中最小的时间单位。机器周期:执行一条指令的过程可分为若干个阶段,每一阶段完成一规定的操作,完成一个规定操作所需要的时间称为一个机器周期,一个机器周期包含12个时钟周期。
当振荡频率为12MHz时,一个机器周期为12/(12×1000000)秒=1微秒
指令周期:定义为执行一条指令所用的时间。
9. 51单片机有几种复位方法?复位后,CPU从程序存储器的哪一个单元开始执行程序?
MCS-51的复位电路包括上电复位电路和按键(外部)复位电路 0000H
10. 8051单片机引脚ALE的作用是什么?当8051不外接RAM和ROM时,ALE上输出的脉冲频率是多少?其作用是什么?
地址锁存使能输出ALE:当单片机访问外部存储器时,外部存储器的16位地址信号由P0口输出低8位,P2口输出高8位,ALE可用作低8位地址锁存控制信号;当不用作外部存储器地址锁存控制信号时,该引脚仍以时钟振荡频率的1/6固定地输出正脉冲,可以驱动8个LS型TTL负载。
第3章
1. MCS-51汇编指令格式是什么,如何通过汇编指令格式来判断指令字节数?
MCS-51指令系统中的每一条指令都有两级指令格式:
l CPU可直接识别并执行的机器语言指令。
l 汇编语言指令(简称汇编指令)。
MCS-51汇编语言指令格式由以下几个部分组成:
[标号:] 操作码 [目的操作数] [,源操作数] [; 注释]
其中,[ ]中的项表示为可选项。
指令寻址方式是判断指令字节数的依据之一。
2. 有哪几种寻址方式?其特征对象分别是什么?做表说明。
MCS-51指令系统的寻址方式有以下7种:
立即寻址方式:操作数直接出现在指令中。
直接寻址方式中:操作数的单元地址直接出现在指令中。
寄存器寻址方式中:寄存器中的内容就是操作数。
寄存器间接寻址方式中,指定寄存器中的内容是操作数的地址,该地址对应存储单元的内容才是操作数。
变址寻址方式是以程序指针PC或数据指针DPTR为基址寄存器,以累加器A作为变址寄存器,两者内容相加(即基地址+偏移量)形成16位的操作数地址,
相对寻址是以程序计数器PC的当前值作为基地址,与指令中的第二字节给出的相对偏移量rel进行相加,所得和为程序的转移地址。
位地址:内部RAM地址空间的可进行位寻址的128位和SFR地址空间的可位寻址的11个8位寄存器的88位。位寻址给出的是直接地址。
3. 位寻址和字节寻址如何区分?在使用时有何不同?
由寻址方式可以看出,不同的寻址方式所寻址的存储空间是不同的。正确地使用寻址方式不仅取决于寻址方式的形式,而且取决于寻址方式所对应的存储空间。字节寻址必须是对8位存储单元,位寻址的存储空间只能是片内RAM的20H~2FH字节地址中的所有位(位地址为00H~7FH)和部分SFR的位,决不能是该范围之外的任何单元的任何位。
4. 要访问专用寄存器和片外数据寄存器,应采用什么寻址方式?举例说明。
访问专用寄存器:可采用直接寻址或寄存器寻址。
访问片外数据寄存器:寄存器间接寻址
5. 什么是堆栈?其主要作用是什么?如何使用?
堆栈是后进先出的数据存储区
一般用于中断处理过程中,若需要保护现场数据(如内部RAM单元的内容),可使用入栈指令,将数据压入堆栈,中断处理过程执行完后,再使用出栈指令恢复现场数据。
6. 编程将片外数据存储器2000H~20FFH单元内容清零。
MOV DPTR,#2000H
MOV A,#0
MOV R3,#100H
LOP :MOV @DPTR,A
INC DPTR
DJNZ R3,LOP
7. 已知A=83H,R0=17H,(17H)=34H,写出下列程序段执行完后的A中的内容。
ORL A, #17H
ANL 17H, A
XRL A, @R0
CPL A
(A)=11001011B=0CBH
8. 已知单片机的fosc=6MHz,分别设计延时0.1s、1s、1min的子程序。
这里取单片机常用的晶振频率为12MHz,一个机器周期为1µs。
(若fosc=6MHz,读者可参考下列程序修改)
延时1ms的子程序: 执行时间(机器周期)
DELAY: MOV R7, #0FFH 1
LOOP: NOP 1
NOP 1
DJNZ R7, LOOP 2
RET 2
该程序段的总的执行时间为:
(1+4×255+2)ms=1023µs≈1ms
延时时间为100ms的子程序:
DELAY: MOV R5,#64H 对延时1ms的子程序循环100次。
LOP1: MOV R7, #0FFH
LOOP: NOP
NOP
DJNZ R7, LOOP
DJNZ R5,LOP1
RET
延时时间为1s的子程序:
DELAY1: MOV R3, #0AH 对延时100ms的子程序循环10次
DELAY: MOV R5,#64H 。
LOP1: MOV R7, #0FFH
LOOP: NOP
NOP
DJNZ R7, LOOP
DJNZ R5,LOP1
DJNZ R3, DELAY
RET
延时时间为60s的子程序: 对延时1s的子程序循环60次
9. MCS-51汇编语言中有哪些常用的伪指令?各起什么作用?
BIT(地址符号命令)
END(结束汇编)
EQU(等值)
DB(定义字节)
DW(定义字)
DS(定义存储单元)
ORG(汇编起始地址)
10. 比较下列各题中的两条指令是否相同,若不同,请指出其区别?
① MOV A, R1; MOV ACC, R1 指令功能相同,寻址方式表示不同
② MOV A, P0; MOV A, 80H 指令功能相同,寻址方式表示不同
③ LOOP: SJMP LOOP; SJMP $ 指令功能相同
11. 下列程序段汇编后,从3000H开始各有关存储单元的内容是什么?
ORG 3000H
TAB1 EQU 1234H
TAB2 EQU 5678H
DB 65,13,"A"
DW TAB1,TAB2,9ABCH
ORG 3000H
TAB1: EQU 1234H
TAB2: EQU 5678H
DB 65,13,"abcABC"
DW TAB1,TAB2,9ABCH
3000H: 65
3001H: 13
3002H: ‘A’
3003H: 34H
3004H: 12H
3005H: 78H
3006H: 56H
3007H: BCH
3008H: 9AH
12. 为了提高汇编语言程序的可读性和编译效率,在编写时应注意哪些问题?
(1) 把要解决的问题化成一个个具有一定独立性的功能模块,各模块尽量采用子程序完成其功能。
(2) 力求少用无条件转移指令,尽量采用循环结构。
(3) 对主要的程序段要下功夫精心设计,这样会收到事半功倍的效果。
(4) 能用8位数据解决问题的就不要使用16位数据。
(5) 累加器是信息传递的枢纽,在调用子程序时应通过累加器传送子程序的参数,通过累加器向主程序传送返回参数。所以,在子程序中一般不把累加器推入堆栈。若需保护累加器的内容时,应先把累加器的内容存入其他寄存器单元,然后再调用子程序。
(6)为了保证程序运行的安全可靠,应考虑使用软件抗干扰技术,如数字滤波技术、指令冗余技术、软件陷井技术,用汇编语言程序实现这些技术,不需要增加硬件成本,可靠性高,稳定性好,方便灵活。
13. 有一输入设备,其端口地址为20H,要求在1秒钟时间内连续采样10次读取该端口数据,求其算术平均值,结果存放在内部RAM区20H单元。
MOV R0,#20H
MOV R2,#0
MOV A,#0
MOV R4,#0
LOP : MOV R3,#0AH
IN : ACALL DELAY
MOVX A, @R0
MOV R2 , A
MOV A, R4
ADD A, R2
MOV R4, A
DJNZ R3, IN
MOV B,#0AH
DIV AB
MOV 20H,A
AJMP LOP
DELAY: MOV R5,#64H 延时时间为0.1s的子程序:
LOP1: MOV R7, #0FFH
LOOP: NOP
NOP
DJNZ R7, LOOP
DJNZ R5,LOP1
RET
END
14. 现需对外部某2个信号进行异或操作,请使用单片机完成其要求。
MOV DPTR,#2000H
MOVX A,@DPTR
MOV 20H, A
INC DPTR
MOVX A, @DPTR
XRL A,20H
15. 简单说明两条查表指令使用上的区别。
查表是程序设计中使用的基本方法。只要适当地组织表格,就可以十分方便地利用表格进行多种代码转换和算术运算等。
MOVC A,@A+PC与MOVC A, @A+DPTR两条指令的区别:
前者查表的范围与存放该指令的地址有关,由于PC的值已经确定及8位累加器A的限制,数据表格只能存放在该指令后面的256个字节单元之内。而后者查表范围通过改变DPTR的值可达整个程序存储器64KB的任何地址空间(即DPTR的值为表格的首地址),其数据表格可以为各个程序模块共享。
将要查表的数据字作为偏移量送累加器A中,通过改变变址寄存器A的内容即可改变表格中的位置,执行该指令即可获得所需的内容(即将该位置单元的内容传送给A)。因此,可以根据需要设计表格的内容,将A的内容实现换码。
第4章
1. C51扩展了哪些数据类型?
sbit sfr sfr16 bit
2. 简述C51存储器类型关键字与8051存储空间的对应关系。
程序存储器(code)
内部数据存储器:
data 内部RAM直接寻址128B(0x00~0x7F)
idata 内部RAM间接寻址256B(0x00~0xFF)
bdata 内部RAM 16B(0x20~0x2F)的128位进行位寻址
外部数据存储器:
xdata 外部存储器64KB的任何单元
pdata 访问外部存储器(一页)低256B
3. 在定义int a=1,b=1后,分别指出表达式b=a、b=a++和b=++a执行后变量a和b的值。
b=a;
b=a++; a=2 b=1
b=++a; a=2 b=2
4. 用C51编程实现当P1.0输入为高电平时,P1.2输出控制信号灯点亮。
#include<reg51.h>
sbit key1=P1^0;
sbit led=P1^2;
void main()
{ bit a;
for( ; ; )
{key1=1;
a=key1;
if(a) led=1;
else led=0;
}
while(1);
}
5. 使用选择结构编写程序,当输入的数字为“1”、“2”、“3”、“4”时,输出显示“A”、“B”、“C”、“D”,当输入数字“0”时,程序结束。
#include<reg51.h>
void main( )
{ char ch;
SCON=0x52; /*对串口实现初始化,以便调试时调用scanf()和printf()*/
TMOD=0x20; /*在keil c串行窗口#0中输入或显示数据*/
TH1=0Xf3; /*若不使用scanf()和printf()函数,则程序中不需要蓝色语句*/
TR1=1;
printf("请输入:") ;
while(1)
{ scanf("%c" , &ch) ;
switch(ch)
{
case ‘1’ : printf("A"); break ;
case ‘2’ : printf("B"); break ;
case ‘3’ : printf("C"); break ;
case ‘4’ : printf("D"); break ;
case ‘0’ : break ;
default : printf("输入错误\n") ;
}
if(ch==’0’) break;
}
while();
}
6. 编一个函数sum,求数组a中各元素的数据和。
要求在main函数中输入数组元素的数据,通过调用sum函数并输出返回的数据和。
#include<reg51.h>
int sum(int b[ ] , int n)
{ int i ,s =0;
for (i=0 ; i<n ; i++)
s+=b[i];
return s;
}
void main( )
{ int a[10]={10,20,30,40,50,90,80,70,60 ,0} i ,total;
SCON=0x52; /*对串口实现初始化,以便调试时调用scanf()和printf()*/
TMOD=0x20; /*在keil c串行窗口#0中可以输入或显示数据*/
TH1=0Xf3; /*若不使用scanf()和printf()函数,则程序中不需要蓝色语句*/
TR1=1;
total= sum(a , 10) ;
printf("%d " ,total) ;
while(1);
}
7. 编一个函数len,求一个字符串s的长度。
要求在main函数中输入字符串,通过调用len函数并输出返回的字符串长度。
#include “string.h”
#include<reg51.h>
int len(char *s)
{int n ;
n=strlen(s) ;
return n;
}
void main( )
{ char *ch=”china”;
int a;
a= len(ch ) ;
while(1);
}
8. C51中断函数如何定义,在使用时应注意哪些问题?
C51中,中断服务程序是以中断函数的形式出现的。
单片机中断源以对应中断号的形式出现在C51中断函数定义中
中断函数定义语法格式如下:
void 函数名(void) interrupt n [using n]
{
函数体
}
关键字interrupt定义该函数为中断服务函数,n为中断号。
使用时应注意:
1)在中断函数中不能使用参数。
2)在中断函数中不能存在返回值。
3)中断函数的执行是由中断源的中断请求后系统调用的。
4)中断函数的中断号在不同的单片机中其数量也不相同,具体情况察看具体的处理器手册。
9. 用C51编写流水灯控制程序,要求由8051的P1口控制8个发光二极管(采用共阳极连接)依次轮流点亮,循环不止。
#include <reg51.h>
#include <intrins.h>
#define uchar unsigned char
#define led P1
void delay(uchar m); //声明延时函数
void main()
{
uchar s_data = 0xFE ;
while(1)
{
led = ~s_data;
s_data = _crol_(s_data , 1);
delay(200);
}
}
void delay(uchar m) //延时函数(形式参数m,调用时,m=200)
{
unsigned char a,b,c;
for(c=m;c>0;c--)
for(b=142;b>0;b--)
for(a=20;a>0;a--);
}
10.用c51编写外部中断“0”的中断函数,该中断函数的功能实现从P1口读入8位数据存放在一数组中,如果数据全为0,则置P2.1输出1,否则P2.1输出0。
#include<reg51.h>
sbit out P2^1;
void main(void)
{
IT0=1; /*设置中断触发方式为边沿出发,setb ie0*/
EA=1; /* 打开全局中断,setb ea*/
EX0=1; /* 打开外部中断0, setb ex0*/
while(1); /*等待中断*/
}
void external0(void) interrupt 0 /*定义外部中断0中断函数处理程序*/
{ int a;
EX0=0; /*关闭外部中断0, clr ex0*/
P1=0xff;
a=P1;
if(a) out=1;
else out=0;
EX0=1;
}
第5章
(注:题后附有本章补充习题)
1. MCS-51系列单片机能提供几个中断源、几个中断优先级?各个中断源的优先级怎样确定?在同一优先级中,各个中断源的优先顺序怎样确定?
答:MCS-51系列单片机能提供5个中断源,2个中断优先级。各个中断源的优先级是由特殊功能寄存器IP来确定,IP中和各个中断源对应位为1时,此中断源为高优先级,否则为低优先级。在同一优先级中,各个中断源的优先顺序是由自然优先级来确定的。
2. 简述MCS-51系列单片机的中断响应过程。
答:MCS-51系列单片机的中断响应过程是按照以下顺序执行的:开中断-----中断请求------中断判断-------中断响应-------中断返回。
3. MCS-51系列单片机的外部中断有哪两种触发方式?如何设置?对外部中断源的中断请求信号有何要求?
答:MCS-51系列单片机的外部中断有电平触发和边沿触发两种方式。是由特殊功能寄存器TCON中IT0,IT1的状态确定的,如:IT0为1时外部中断0为边沿触发方式,当INT0外部引脚出现下降沿时向CPU提出中断请求, 否则为电平触发方式,当INT0外部引脚出现低电平时向CPU提出中断请求。
4. MCS-51单片机中断响应时间是否固定?为什么?
答:MCS-51单片机中断响应时间不固定,因为当中断源向CPU提出中断请求时,CPU正在执行的指令的指令周期是不一样的。
5. MCS-51单片机如果扩展6个中断源,可采用哪些方法?如何确定它们的优先级?
答:一般可采取中断加查询方式,软件先查询到的为高优先级,最后查询到的为低优先级。
6. 试用中断技术设计一发光二极管LED闪烁电路,闪烁周期为2s,要求亮1s再暗1s。
提示:在外部中断0的控制下,使用定时器实现延时。
7. 当正在执行某一中断源的中断服务程序时,如果有新的中断请求出现,问在什么情况下可响应新的中断请求?在什么情况下不能响应新的中断请求?
答:当正在执行某一中断源的中断服务程序时,如果有新的中断请求出现,当新中断源中断级别比正在执行中断源的中断级别高时可响应新的中断请求,否则不能响应新的中断请求。
8. 异步通信和同步通信的主要区别是什么?MCS-51串行口有没有同步通信功能?
答案:
异步通信因为每帧数据都有起始位和停止位,所以传送数据的速率受到限制。但异步通信不需要传送同步脉冲,字符帧的长度不受限制,对硬件要求较低,因而在数据传送量不很大。同步通信一次可以连续传送几个数据,每个数据不需起始位和停止位,数据之间不留间隙,因而数据传输速率高于异步通信。但同步通信要求用准确的时钟来实现发送端与接收端之间的严格同步。
MCS-51串行口有同步通信功能。
9. 解释下列概念:
1) 并行通信、串行通信。
2) 波特率。
3) 单工、半双工、全双工。
4) 奇偶校验。
答案:
(1)并行通信:数据的各位同时进行传送。其特点是传送速度快、效率高,数据有多少位,就需要有多少根传输线。当数据位数较多和传送距离较远时,就会导致通信线路成本提高, 因此它适合于短距离传输。
串行通信:数据一位一位地按顺序进行传送。其特点是只需一对传输线就可实现通信,当传输的数据较多、距离较远时,它可以显著减少传输线,降低通信成本,但是串行传送的速度慢。
(2)波特率:每秒钟传送的二进制数码的位数称为波特率(也称比特数),单位是bps(bit per second),即位/秒。
(3)单工:只允许数据向一个方向传送,即一方只能发送,另一方只能接收。
半双工:允许数据双向传送,但由于只有一根传输线,在同一时刻只能一方发送,另一方接收。
全双工:允许数据同时双向传送,由于有两根传输线,在A站将数据发送到B站的同时,也允许B站将数据发送到A站。
(4)奇偶校验:为保证通信质量,需要对传送的数据进行校验。对于异步通信,常用的校验方法是奇偶校验法。
采用奇偶校验法,发送时在每个字符(或字节)之后附加一位校验位,这个校验位可以是“0”或“1”,以便使校验位和所发送的字符(或字节)中“1”的个数为奇数——称为奇校验,或为偶数——称为偶校验。接收时,检查所接收的字符(或字节)连同奇偶校验位中“1”的个数是否符合规定。若不符合,就证明传送数据受到干扰发生了变化,CPU可进行相应处理。
10. MCS-51串行口控制寄存器SCON中SM2、TB8、RB8有何作用?主要在哪几种方式下使用?
答案:
SM2:多机通信控制位,主要在方式1、2、3下使用;
TB8:存放发送数据的第9位,主要在方式2、3下使用;
RB8:存放接收数据的第9位或停止位,主要在方式1、2、3下使用。
11. 试分析比较MCS-51串行口在四种工作方式下发送和接收数据的基本条件和波特率的产生方法。
答案:发送数据的基本条件:
方式0、1、2、3:CPU执行一条将数据写入发送缓冲器SBUF的指令;
接收数据的基本条件:
方式0:用软件使REN=1(同时RI=0);方式1:用软件使REN=1,一帧数据接收完毕后,必须同时满足以下两个条件:①RI=0;②SM2=0或接收到的停止位为1,这次接收才真正有效,将8位数据送入SBUF,停止位送RB8,置位RI。否则,这次接收到的数据将因不能装入SBUF而丢失。方式2、3:软件使REN=1,同时满足以下两个条件:① RI=0;② SM2=0或接收到的第9位数据为1(SM2=1),则这次接收有效,8位数据装入SBUF,第9位数据装入RB8,并由硬件置位RI。否则,接收的这一帧数据将丢失。
波特率的产生方法:
在方式0下,串行口的波特率是固定的,即波特率=fosc /12;在方式1、3下,串行口波特率由定时器T1的溢出率和SMOD值同时决定。相应公式为:波特率=2SMOD×T1溢出率/32;在方式2下,串行口的波特率可由PCON中的SMOD位控制:若使SMOD=0,则所选波特率为fosc/64;若使SMOD=1,则波特率为fosc/32。即
2SMOD
64
×fosc
波特率=
12. 为何T1用作串行口波特率发生器时常用模式2?若fosc=6MHz,试求出T1在模式2下可能产生的波特率的变化范围。
答案:定时器T1作为波特率发生器可工作于模式0、模式1和模式2。其中模式2在T1溢出后可自动装入时间常数,避免了重装参数,因而在实际应用中除非波特率很低,一般都采用模式2。
若fosc=6MHz,T1在模式2下可能产生的波特率的变化范围为:61.04 bps ~ 15625 bps。
13. 简述多机通信原理。
答案:当主机选中与其通信的从机后,只有该从机能够与主机通信,其他从机不能与主机进行数据交换, 而只能准备接收主机发来的地址帧。上述要求是通过SCON寄存器中的SM2和TB8来实现的。当主机发送地址帧时使TB8=1,发送数据帧时使TB8=0,TB8是发送的一帧数据的第9位,从机接收后将第9位数据作为RB8,这样就知道主机发来的这一帧数据是地址还是数据。另外,当一台从机的SM2=0时,可以接收地址帧或数据帧,而当SM2=1时只能接收地址帧,这就能实现主机与所选从机之间的单独通信。
14. 试用8051串行口扩展I/O口,控制16个发光二极管自右向左以一定速度轮流发光,画出电路并编写程序。
程序如下:
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
sbit high8 = P1^1;
sbit low8 = P1^0;
uchar a = 0x80;
uchar count = 0x08;
void init()
{
SCON = 0x00; //串口工作方式0
ES = 1; //开串口中断
EA = 1; //开总中断
low8 = 1; //打开低8位并行输出
high8 = 0; //关闭高8位并行输出
}
void delay(void) //M ms 延时程序 误差 0us (6M)
{
unsigned char a,b,c;
for(c=23;c>0;c--)
for(b=152;b>0;b--)
for(a=70;a>0;a--);
}
int main()
{
init();
SBUF = 0x00; //串行口发送数据
while(1); //等待中断
}
void recv() interrupt 4
{
TI = 0; //清除发送标志位
SBUF = a;
delay();
a = a >> 1; //数据向右移位一次
展开阅读全文