单片机原理及应用——基于Proteus和Keil C(3)

2019-04-09 16:45

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

×fosc 波特率= 64

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

#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; //数据向右移位一次 if(a == 0) //判断a是否为0

a= 0x80; count --; if(count == 0) //判断是否显示够8次

{ count = 0x08; //置数软件计数器

high8 = ~high8;

low8 = ~low8; //切换高低8位并行输出

} }

15. 试设计一个8051单片机的双机通信系统,串行口工作在方式1,波特率为2400bps,编程将甲机片内RAM中40H~4FH的数据块通过串行口传送到乙机片内RAM的40H~4FH单元中。 答案:

双方约定的通信协议如下:

甲机先发送请求乙机接收信号“0AAH”,乙机收到该信号后,若为准备好状态,一个则发送数据“0BBH”作为应答信号,表示同意接收。当甲机发送完16个字节后,再向乙

机发送一个累加校验和。校验和是针对数据块进行的,即在数据发送时,发送方对块中的数据简单求和,产生一个单字节校验字符(校验和),附加到数据块结尾。在数据接收时,接收方每接收一个数据也计算一次校验和;接收完数据块后,再接收甲机发送的校验和,并将接收到的校验和与乙机求出的校验和进行比较,向甲机发送一个状态字,表示正确(00H)或出错(0FFH),出错则要求甲机重发。甲机收到收到乙机发送的接收正确应答信号(00H)后,即结束发送,否则,就重发一次数据。

甲机采用查询方式进行数据发送,乙机采用中断方式进行数据接收。双方约定传输波特率为2400bps,两机主频均为11.059MHz,双机串行口都工作于方式1,查表6-2可知SMOD=0,定时器T1采用工作模式2,初值为F4H。

甲机发送子程序:

#include #include

#define uchar unsigned char #define uint unsigned int uint i;

char data *p; //定义一个指向片内RAM地址的指针 void init() {

TMOD = 0x20; //定时器T1工作在方式2

TH1 = 0xF4; // 波特率为2400bit/s

ES = 1; //开串口中断 EA = 1; //开总中断 SCON = 0x50; //串口工作在方式1

PCON = 0x00; //SMOD = 0;

TR1=1; //打开定时器T1 }

void send(uchar data1)

//发送子程序

TL1 = 0xF4;

{

SBUF = data1; while(TI == 0); TI = 0; }

void main() {

uchar i,ack,checksum = 0; init();

p=0x40;//片内RAM地址为0x40 for(i = 0;i < 16; i++) //初始化要发送的数据

p[i] = i+1; while(1) { send(0xaa); while(!RI);


单片机原理及应用——基于Proteus和Keil C(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:2广本自动变速器452

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: