{
TMOD=0x02; TL0=16; TH0=16; TR0=1;
ET0=1; EA =1; P1=0; cou=0; tim=1; While(1);
}
void serve() interrupt 1 {
tim++;
if(tim==500) {
P1=0x01< if(cou==8) cou=0; } } 15.设fosc=12MHz。试编写一段程序,对定时器T1初始化,使之工作在模式2,产生200μs定时,并用查询T1溢出标志的方法,控制P1.1输出周期为2ms的方波。 #include void main() { unsigned char i; TMOD=0x20; TL1=56; TH1=56; TR1=1; while(1) { while(TF1=1) { TF1=0; i++; if(i==5) 26 } } { P1_1=~P1_1; i=0; } } 16.使用一个定时器,如何通过软、硬件结合的方法,实现较长时间的定时? 答:先使用硬件实现单位时间的定时,通过软件设置计数来实现较长时间的定时。 27 第7章 习题答案 1.什么是串行异步通信,它有哪些作用? 答:单位信息的各位数据被分时一位一位依次顺序传送的通信方式称为串行通信,通过起始位和停止位来进行同步的串行通信称为串行异步通信。适用于速度较慢的数据传输。 2.89C52单片机的串行口由哪些功能部件组成?各有什么作用? 答:89C52通过引脚RXD(P3.0,串行数据接收端)和引脚TXD(P3.1,串行数据发送端)与外界进行通信,单片机内部的全双工串行接口部分,包含有串行发送器和接收器,有两个物理上独立的缓冲器,即发送缓冲器和接收缓冲器SBUF。发送缓冲器只能写入发送的数据,但不能读出;接收缓冲器只能读出接收的数据,但不能写入。控制状态寄存器SCON ,用于定义串行通信口的工作方式和反映串行口状态。 3.简述串行口接收和发送数据的过程。 答:在发送过程中,当执行一条将数据写入发送缓冲器SBUF(99H)的指令时,串行口把SBUF中8位数据以fosc/l2的波特率从RXD(P3.0)端输出,发送完毕置中断标志TI=1。写SBUF指令在S6P1处产生一个正脉冲,在下一个机器周期的S6P2处,数据的最低位输出到RXD(P3.0)脚上;再在下一个机器周期的S3、S4和S5输出移位时钟为低电平时,在S6及下一个机器周期的Sl和S2为高电平,就这样将8位数据由低位至高位一位一位顺序通过RXD线输出。并在TXD脚上输出fosc/12的移位时钟。在“写SBUF”有效后的第10个机器周期的SlPl将发送中断标志TI置位。 接收时,用软件置REN=1(同时,RI=0),即开始接收。当使SCON中的REN=1(RI=0)时,产生一个正的脉冲,在下一个机器周期的S3P1~S5P2,从TXD(P3.1)脚上输出低电平的移位时钟,在此机器周期的S5P2对P3.0脚采样.并在本机器周期的S6P2通过串行口内的输入移位寄存器将采样值移位接收。在同一个机器周期的S6P1到下一个机器周期的S2P2,输出移位时钟为高电平。于是,将数据字节从低位至高位接收下来并装入SBUF。在启动接收过程(即写SCON,清RI位),将SCON中的RI清0之后的第l0个机器周期的SlPl将RI置位。这一帧数据接收完毕,可进行下一帧接收。 4.89C52串行口有几种工作方式?有几种帧格式?各工作方式的波特率如何确定? 答:89C52串行口有4 种工作方式,有2种帧格式。 方式0的波特率=fosc/12 2SMOD方式2的波特率=×fosc 642SMOD串行口方式1、方式3的波特率=×(T1溢出速率) 32 5.若异步通信接口按方式3传送,已知每分钟传送3 600个字符,其波特率是多少? 答:波特率是3600*9/60=5400bit/s。 28 6.89C52中SCON的SM2、TB8、RB8有何作用? 答:SM2:多机通信控制位。 TB8:发送数据的第9位。 RB8:接收数据的第9位。 7.设fsoc=11.059 2MHz,试编写一段程序,其功能为对串行口初始化,使之工作于方式1,波特率为1 200b/s;并用查询串行口状态的方法,读出接收缓冲区的数据并回送到发送缓冲区。 #include void main() { unsigned char temp; SCON=0x50; TMOD=0x20; TH1=0xE8; TL1=0xE8; TR1=1; while(RI==0); temp=SBUF; RI=0; SBUF=temp; } 8.若晶振为11.059 2MHz,串行口工作于方式1,波特率为4 800b/s。写出用T1作为波特率发生器的方式字和计数初值。 答:SCON=0x50; TMOD=0x20; TH1=0xE8; TL1=0xE8; 9.为什么定时器T1用作串行口波特率发生器时,常选用工作模式2?若已知系统时钟频率和通信用波特率,如何计算其初值? 答:工作模式2有自动重装入功能。 X=256-fosc?(SMOD?1) 384?波特率 10.若定时器T1设置成模式2作波特率发生器,已知fosc=6MHz,求可能产生的最高和最低的波特率。 答:最高波特率为8Mb/s。 最低波特率为15625b/s。 11.简述单片机多机通信的原理。 29 答:若置SM2=1,则允许多机通信。多机通信协议规定,第9位数据(D8)为1,说明本帧数据为地址帧;若第9位为0,则本帧为数据帧。当一片89C52(主机)与多片89C5l(从机)通信时,所有从机的SM2位都置l。主机首先发送的一帧数据为地址,即某从机机号,其中第9位为1,所有的从机接收到数据后,将其中第9位装入RB8中。各个从机根据收到的第9位数据(RB8中)的值来决定从机可否再接收主机的信息。若(RB8)=0,说明是数据帧,则使接收中断标志位RI=0,信息丢失;若(RB8)=1,说明是地址帧,数据装入SBUF并置RI=1,中断所有从机,被寻址的目标从机清除SM2,以接收主机发来的一帧数据。其他从机仍然保持SM2=1。 12.当89C52串行口按工作方式1进行串行数据通信时,假定波特率为1 200b/s,以中断方式传送数据,请编写全双工通信程序。 #include unsigned char data txbuf; unsigned char data rebuf; void main() { unsigned char temp; SCON=0x50; TMOD=0x20; TH1=0xE8; TL1=0xE8; TR1=1; ES=1; EA=1; } void comre() { rebuf=SBUF; } void comtx() { SBUF=txbuf; } void serial_server() interrupt 4 { if(TI) TI=0; else { 30