单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第7章习题答案_第1页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第7章习题答案_第2页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第7章习题答案_第3页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第7章习题答案_第4页
单片机原理与应用(C51编程+Proteus仿真) 习题及答案 刘霞 第7章习题答案_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章习题答案一、填空1.AT89S52的串行异步通信口为(单工/半双工/全双工)。答:全双工2.AT89S52单片机串行口的4种工作方式中,波特率传输速率可调且与定时器/计数器T1的溢出率有关是方式和方式。答:方式1和方式33.帧格式为1个起始位,8个数据位和1个停止位的异步串行通信方式是方式。答:方式14.串行口工作在方式2,设置SM0=、SM1=。答:1、05.串行口工作在方式1,即可发送数据又可接收数据,设置SCON=。答:0x506.当用串行口进行串行通信时,为减小传输误差,常用的晶振频率为MHz(11.0592MHz/12MHz)。答:11.0592MHz7.AT89S52单片机通过引脚和引脚和外界进行串行通信。答:P3.0(RXD)和P3.1(TXD)8.传输速率是每秒传送的位数,量纲是\o"B"。答:二进制、位/秒(bps)

9.在串行通信中,收发双方对传输速率的设定应该是的(相同/不同)。答:相同10.计算机的串行接口采用的是电平标准。答:RS232二、选择1.当AT89S52扩展并行输出口时,串行接口工作方式选择。A.方式0B.方式1C.方式2D.方式3答:A2.AT89S52的串口工作方式中适合点对点通信的是。

   A.方式0   B.方式1   C.方式2   D.方式3

答:B3.AT89S52单片机用串口工作方式0时。

   A.数据从RXD串行输入,从TXD串行输出

   B.数据从RXD串行输出,从TXD串行输入

   C.数据从RXD串行输入或输出,同步信号从TXD输出

   D.数据从TXD串行输入或输出,同步信号从RXD输出答:C4.AT89S52单片机有关SBUF中是不正确的。

   A.发送SBUF和接收SBUF在物理上是相互独立的,具有相同的地址

   B.发送SBUF和接收SBUF在物理上是相互独立的,具有不同的地址

   C.发送SBUF只能写入数据,不能读出数据

   D.接收SBUF只能读出数据,不能写入数据

答:B5.串口方式1是不正确的。

   A.通信传输速率是可变的,与T1的溢出速率有关

   B.帧格式由11位组成,包括1位起始位+8位数据位+1位可编程位+1位停止位

   C.帧格式由10位组成,包括1位起始位+8位数据位+1位停止位

   D.可实现点对点通信

答:B6.下列关于串行口方式3,是不正确的。

   A.可实现多机通信   B.通信传输速率是可变的,与T1的溢出速率有关

   C.帧格式由11位组成,包括1位起始位+8位数据位+1位可编程位+1位停止位

   D.多机通信时,SM2一直保持为1,TB8设置为1

答:D7.串口中断号是。A.0B.1C.2D.3E.4答:E8.关于串口中断标志位RI/TI,是不正确的。A.都由硬件自动置位B.都由硬件自动清零

   C.必须由软件清零

   D.可以查询RI/TI标志位

答:B三、问答题1.波特率和字符的实际传输速率一样吗?

有什么区别?

答:二者不一样,波特率为每秒传送二进制数码的位数,用于表示数据传输的速率,波特率越高,数据传输的速率越快。但波特率和字符的实际传输速率不同,字符的实际传输速率是每秒所传字符帧的帧数,和字符帧格式有关。2.AT89S52单片机的串行口有几种工作方式?有几种帧格式?各种工作方式的波特率如何确定?答:有4种工作方式:方式0、方式1、方式2、方式3;有3种帧格式,方式2和3具有相同的帧格式;方式0的发送和接收都以fosc/12为固定波特率,方式1的波特率=2SMOD/32×定时器T1的溢出率方式2的波特率=2SMOD/64×fosc方式3的波特率=2SMOD/32×定时器T1的溢出率3.简述点对点通信时进行奇偶校验的编程原理。答:将欲发送数据的奇偶校验值P送入SCON寄存器中的TB8位并连同数据一起发出。接收端接收数据时,将该数值取出放入SCON寄存器中的RB8位。待计算出接收数据的实际奇偶校验值后与RB8进行比较,即可判断收发过程是否有误。4.为什么T1用作串行口传输速率发生器时,常采用方式2?答:因为定时器T1在方式2下,初值可自动重装,这就避免了执行重装参数的指令所带来的时间误差。5.说明以TTL电平串行传输数据的方式有什么缺点?若进行远距离传输可采用哪些电平标准?说明各自的优缺点。答:直接以TTL电平串行传输数据的方式的缺点是传输距离短,抗干扰能力差。因此在串行传输距离较远时,常采用RS-232C、RS-422A和RS-485标准串行接口。主要是对传输的电信号不断改进,如RS-232C传输距离只有几十米远,与直接以TTL电平串行传输相比,采用了负逻辑,增大“0”、“1”信号的电平差。而RS-422A和RS-485都采用了差分信号传输,抗干扰能力强,距离可达1000多米。RS-422A为全双工,RS-485为半双工。四、双机通信仿真任务要求:两个AT89S52单片机进行串口方式1通信,两机fosc为11.0592MHz,传输速率为4800bps,SMOD=1。甲机循环发送数字0~9,并根据乙机返回值决定是否发送新数据(若发送值与返回值相等,继续发送下一数字,否则重复发送当前数值);乙机接收数据后返回接收值。双机都将当前值显示在数码管(共阳)上;甲机采用查询方式发送接收数据,乙机采用中断方式接收数据。答:1.硬件电路设计根据任务要求,串行口工作在方式1,甲机和乙机通过P2口连接数码管(共阳),限流电阻为330Ω。甲机TXD引脚与乙机RXD引脚连接,甲机RXD引脚与乙机TXD引脚连接。仿真电路如图7-27所示。最小系统电路省略。图1扩展并行输出口仿真电路图说明:在Proteus中点击P挑选元器件:AT89C52、RES(电阻)、7SEG-MPX1-CA(数码管共阳)。2.软件设计分析:双机通信,需要编写2个独立的程序,甲机发送程序和乙机接收程序。甲机采用查询方式发送数据,软件编程的关键环节为:①串口初始化:串行口工作在方式1,甲机即发送数据也接收数据,设允许接收,语句利用SCON=0x50;(SM0SM1=01、REN=1、TI=0;其他没用到各位都清零,SCON=01010000B)。②波特率设置:fosc为11.0592MHz,波特率为4800bps,SMOD=1。查7-8表可知T1的初值为0xf4,T1工作方式2。TMOD=00100000B=0x20;TH1=TL1=0xf4;TR1=1;PCON=10000000B=0x80;③串口发送的数据:要发送的数据放在数组sendbuf[]中,使用语句发送数据SBUF=sendbuf[index];④数码管显示:甲机收到乙机发送的数据,和发送的数据相同,则显示。共阳数码管0~9段码表seg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80};【甲机查询发送参考程序】:#include<reg52.h>#defineucharunsignedchar#defineuintunsignedintucharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳0-9段码ucharcodesendbuf[]={0,1,2,3,4,5,6,7,8,9};//发送数据/****************延时函数*****************/voiddelay(uintxms)//延时函数{uinti,j;for(i=0;i<xms;i++)for(j=0;j<100;j++);}/****************串口初始化****************/voiduart_init(){ SCON=0x50;//串口方式1,TI和RI清零,允许接收; PCON=0x80; //波特率不加倍 TMOD=0x20;//T1定时方式2 TH1=0xf4; TL1=0xf4;//4800b/s TR1=1;}/****************主函数****************/voidmain(){ucharindex=0;//发送数据索引uart_init();while(1){ SBUF=sendbuf[index]; //发送数据while(TI==0); //等待发送完成TI=0; //清TI标志位while(RI==0); //等待乙机回答RI=0; if(SBUF==sendbuf[index]) //若返回值与发送值相同,组织新数据 { P2=seg[sendbuf[index]];//显示已发送值 index++; if(index>=9)index=0;//修正索引值 delay(1000);}}} 乙机采用中断方式接收数据,软件编程的关键环节为:①串口初始化:通信双方,要保持相同的数据格式,所以乙机也采用方式1,乙机即发送数据也接收数据,串口初始化和甲机相同。②波特率设置:通信双方,要保持相同的波特率,和甲机的波特率设置相同。③采用中断接收数据:开串口中断ES=1;EA=1;写中断服务程序voiduart_receive()interrupt4。码管显示:显示方法和甲机收相同。【乙机中断接收参考程序】:#include<reg52.h>#defineucharunsignedcharucharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//共阳0-9段码ucharreceivebuf;//定义接收缓冲/****************串口初始化****************/voiduart_init(){SCON=0x50;//串口方式1,TI和RI清零,允许接收;PCON=0x80;//波特率不加倍TMOD=0x20;//T1定时方式2TH1=0xf4;TL1=0xf4;//4800b/sTR1=1;//启动T1ES=1;//开串口中断允许EA=1; //开总中断 }/****************主函数****************/voidmain(void){ uart_init(); while(1); }/*************串口中断服务函数*********/voiduart_receive()interrupt4{ if(RI==1)//接收完成 { RI=0; //清RI标志位 receivebuf=SBUF; //取得接收值 SBUF=receivebuf; //结果返送主机 while(TI==0); //等待发送结束 TI=0; //清TI标志位 P2=seg[receivebuf];//显示接收值 }}3.仿真运行甲乙两机的程序是独立的,因而需要建立各自的工程文件,并在其中完成相应程序的编辑和编译,形成两个hex文件,分别加载到2个单片机中,并修改晶振为11.0592MHz。点击运行按钮,运行结果如图7-28所示。每隔1s甲乙两机都显示相同的数字,证明通信正确。图2双机通信仿真运行效果图五、多机通信仿真任务要求:设计1个主机和2个从机的主从式串行通信系统。主机设计2个按键与从机通信,每按1次按键,主机向相应从机顺序发送1位0~F间的字符,即按下一次按键,发送一个字符。主机用虚拟终端观察发送的数据。从机收到数据帧后在数码管(共阳)上显示。系统晶振频率为11.0592MHz。采用串口方式3,波特率为9600bps,主机采用查询发送发送数据,从机采用中断方式接收数据。答:1.硬件电路设计主机的TXD引脚和虚拟终端的RXD引脚相连,与1#、2#从机的RXD引脚相连。1#、2#从机分别通过P2口连接数码管(共阳),限流电阻为330Ω。仿真电路如图7-35所示。最小系统电路省略。图3多机通信仿真电路图说明:在Proteus中点击P挑选元器件:AT89C52、RES(电阻)、7SEG-MPX1-CA(数码管共阳)。主机电路中采用虚拟终端显示串口发出的数据。单击Proteus原理图界面左侧工具箱中的虚拟仪器图标,在预览窗口中显示的各种虚拟仪器选项,点击“VIRTUALTERMINAL”项,放置虚拟终端。双击虚拟终端,弹出编辑元件对话框,修改波特率为9600。2.软件设计软件编程的关键环节为:①串口初始化:主机工作在方式3(SM0SM1=11),主机发送数据。SCON其他没用到各位都清零。初始化语句SCON=11000000B=0xc0;乙机工作在方式3(SM0SM1=11),接收数据(REN=1),多机通信(SM2=1),其他没用到各位都清零。SCON=11110000B=0xf0;②主从机波特率设置:fosc为11.0592MHz,波特率为9600bps。查7-8表可知T1的初值为0xfd,SMOD=0,T1工作方式2定时。初始化语句PCON=00000000B=0x00;TMOD=00100000B=0x20;TH1=TL1=0xfd;TR1=1;③主机在主函数中以查询法进行按键检测,并以键值作为发送函数的传递参数。在发送函数中查询TI标志位,分两步发送地址帧和数据帧。④从机在初始化后进入等待状态。在中断接收函数中,先对地址帧进行判断,随后将接收的字符转化为数组顺序号,通过查表输出其显示字模。【主机参考程序】:include<reg52.h>#defineucharunsignedchar#defineuintunsignedint#defineSlave1_ADDR1//1#从机地址#defineSlave2_ADDR2//2#从机地址voiddelay(uintxms);//延时函数voiduart_init();//串口初始化函数voidkey_send(ucharnode_number);//按键发送函数ucharKeyValue=0; //键值ucharcodestr[]="0123456789ABCDEF";//字符集ucharpointer_1=0,pointer_2=0; //从机当前发送字符指针/*************主函数*********/voidmain(){ while(1) { P1=0xff; while(P1==0xff); //检测按键 switch(P1) { //切换子机 case0xfe:key_send(Slave1_ADDR);break; case0xf7:key_send(Slave2_ADDR);break; } }}/*************延时函数*********/voiddelay(uintxms){uinti,j;for(i=0;i<xms;i++)for(j=0;j<100;j++);}/*************串口初始化函数*********/voiduart_init(){ SCON=0xc0;//方式3、禁止接收 TMOD=0x20; //T1定时方式2 TH1=TL1=0xfd;//9600bps SMOD=0 TR1=1; //启动T1}/*************按键发送函数*********/voidkey_send(ucharnode_number){ delay(500); uart_init(); TB8=1; //发送地址码 SBUF=node_number;//发送从机地址 while(TI==0); //等待发送结束 TI=0; //清TI标志 TB8=0; //发送数据码 switch(node_number) { case1: { SBUF=str[pointer_1++];//1#从机数据帧 if(pointer_1>=16)pointer_1=0;//修改发送指针 break; } case2: { SBUF=str[pointer_2++]; //2#从机数据帧 if(pointer_2>=16)pointer_2=0;//修改发送指针 break; } default:break; while(TI==0); //等待数据帧发送结束 TI=0;}}【1#从机参考程序】:#include<reg52.h>#defineSlave1_ADDR1#defineucharunsignedcharvoiduart_init();//串口初始化函数voiddisplay(ucharch);//显示函数ucharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳0-F段码 /*************主函数*********/voidmain(){ uart_init(); while(1);}/*************串口中断服务函数*********/voidreceive(void)interrupt4{ RI=0; if(RB8==1) { if(SBUF==Slave1_ADDR) SM2=0; return; } display(SBUF); SM2=1;}/*************串口初始化函数*********/ voiduart_init(){ SCON=0xf0; //串口方式3、多机通信、允许接收、中断标志清零 TMOD=0x20; //T1定时方式2 TH1=TL1=0xfd; //9600bps TR1=1; //启动T1 ES=1; EA=1; //开中断}/*************显示函数*********/voiddisplay(ucharch){ if((ch>=48)&&(ch<=57)) P2=seg[ch-48]; elseif((ch>=65)&&(ch<=70)) P2=seg[ch-55];}【2#从机参考程序】:#include<reg51.h>#defineSlave2_ADDR2#defineucharunsignedcharvoiduart_init();//串口初始化函数voiddisplay(ucharch);//显示函数ucharcodeseg[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳0-F段码 /*************主函数*********/voidmain(){ uart_init(); while(1);}/*************串口中断服务函数*********/voidreceive(void)interrupt4{ RI=0; if(RB8==1) { if(SBUF==Slave2_ADDR) SM2=0; return; } display(SBUF); SM2=1;}/*************串口初始化函数*********/ voiduart_init(){ SCON=0xf0; //串口方式3、多机通信、允许接收、中断标志清零 TMOD=0x20; //T1定时方式2 TH1=TL1=0xfd; //9600bps TR1=1; //启动T1 ES=1; EA=1; //开中断}/*************显示函数*********/voiddisplay(ucharch){ if((ch>=48)&&(ch<=57)) P2=seg[ch-48]; elseif((ch>=65)&&(ch<=70)) P2=seg[ch-55];}由以上程序可以看出,除从机地址不一样以外,两个从机程序完全一样。3.仿真运行将主机和从机的程序分别进行编辑和编译,生成三个hex文件,分别加载到3个单片机中,并修改晶振为11.0592MHz。点击运行按钮,运行结果如图7-36所示。每按一次1#从机通信按键,主机依次发送0~F中的一个字符,并显示在数码管上,1#从机接收到数据显示在数码管上。每按一次2#从机通信按键,主机依次发送0~F中的一个字符,并显示在数码管上,2#从机接收到数据显示在数码管上。虚拟终端界面显示主机发送的字符与从机接收的字符完全一致。图4多机通信仿真运行效果图六、单片机与计算机通信仿真任务要求:计算机向单片机发送数据1、2、3、4。单片机接收到1点亮LED,收到2熄灭LED,收到3控制蜂鸣器响,收到4控制蜂鸣器不响。且单片机收到数据后将数据返回计算机。单片机系统晶振频率为11.0592MHz。采用串口方式1,波特率为9600bps。答:1.硬件电路设计单片机RXD引脚和COMPIM插头的RXD引脚相连,单片机TXD引脚和COMPIM插头的TXD引脚相连,单片机的P2口与数码管(共阳)的段码端相连,限流电阻为330Ω。单片机的P1.0连接LED,P1.0连接蜂鸣器。仿真电路如图5所示。最小系统电路省略。图5单片机与计算机通信仿真电路图说明:在Proteus中点击P挑选元器件:AT89C52、RES(电阻)、COMPIM(DB9接口)、PNP(三极管)、BUZZER(蜂鸣器)。双击元器件设置参数:AT89C52的ClockFrequency修改为11.0592MHz;COMPIM的PhysicalBaudRate和VirtualBaudRate都设置为9600,Physicalport设置为COM2。BUZZER的OperatingVoltage设置位5V。如图6所示。图5蜂鸣器编辑元件图2.软件设计分析:计算机向单片机发送数据,单片机侧即接收数据又发送数据。计算机端可通过串口调试助手观发送数据。单片机接收发送程序,软件编程的关键环节为:①串口初始化:串行口工作在方式1,接收发送数据。SCON=01010000B=0x50;②波特率设置:fosc为11.0592MHz,波特率为9600bps,SMOD=0。查7-8表可知T1的初值为0xfd,T1工作方式2定时。PCON=00000000B=0x00;TMOD=00100000B=0x20;TH1=TL1=0xfd;TR1=1;③串口接收发送数据:采用查询方式接收数据,while(RI==0);一帧数据没有

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论