单片机原理及应用(林立.pdf
第 2 章 MCS-51 单片机结构及原理习题6片内 RAM 中低 128 个单元划分为哪三个主要部分?各部分的主要功能是什么?答:片内 RAMW氐 128 个单元划分为三个部分:工作寄存器区00H-1FH,四组,每组 8 个,可作用工作寄存器切换使用;可位寻址区20H-2FH,16B,位地址为 00H-7FH 用作为按位寻址的空间;用户 RAME:30H-7FH,80B,用作普通 RAM 单元或堆栈。7程序状态字寄存器 PSW 各位的定义是什么?:辅助进位标志 AC 加法运算低四位向高上四位有进位时置 1;、:用户标志位 F0 和用户标志位 F1,保存用户的位数据;、:工作寄存器选择控制位 RS1 和 RSQ00 至 11 分别选择四组工作之一作为当前工作寄存器PSW.2:溢出标志位 OV 有符号数加、减运算结果有溢出或乘除上结果异常(乘法运算结果大于 255 即乘积在 BA 中,或除法运算除数为 0)时置 1:奇偶标志位 P,累加器 A中 1 的个数为奇数时置 1。8.什么是时钟周期?什么是机器周期?什么是指令周期?当振荡频率为 12MHz 时,一个机器周期为多少微秒?答:时钟周期又叫振荡周期或拍,用P 表示,是MCS-51 单片机中最小的时间单位,在一个时钟周期内,CPU 完成一个最基本的动作。机器周期:由 12 个时钟周期构成,完成一个基本操作指令周期:是执行一条指令所需的时间,根据指令的复杂性,可由 14 个机器周期构成。当振荡频率为 12MHz 时,一个机器周期为 1 微秒。第 4 章单片机的 C51 语言习题1.C 语言的优点是什么?C 程序的主要结构特点是什么?答:C 语言是一种高级语言,学习比低级容易,不需要具体组织、分配存储器资源和处理端口数据,可以直接驱动单片机的所有资源。C 程序以函数为单位,由一个主函数和假设干个其他函数构成,主函数是程序的入口,其他函数由主函数直接或间接调用。程序可以由一个文件或多个文件组成。文件类型包括头文件和C语言源文件,也可以是汇编语言文件,C程序可与汇编语言混合编程。5定义变量 a,b,c,其中 a 为内部 RAM 勺可位寻址区的字符变量,b 为外部数据存储区浮点型变量,c 为指向 int 型 xdata 区的指针。答:charbdataa;floatxdatab;intxdata*c;内部 RAM20H21H 和 22H23H 单元分别存放着两个无符号的 16 位数,将其中的大数置于 24H 和 25H 单元。解:方法一:#includevoidmain()unsignedint*ptr;/设置一个内部 RAM 旨针unsignedintx,y,z;ptr=0 x20;/旨向 0 x20 单元x=*ptr;/取第一个数ptr=0 x22;/旨向 0 x22 单元y=*ptr;/取第二个数z=(xy)?x:y;/将两数中的较大者赋给 zptr=0 x24;/旨向地址为 0 x24 的目标单元*ptr=z;/将大数存入目标单元方法二:#include#includevoidmain()unsignedintx,y,z;x=DBYTE0X20*256+DBYTE0X21;y=DBYTE0X22*256+DBYTE0X23;z=(xy)?x:y;/将两数中的较大者赋给 zDBYTE0X24=z/256;DBYTE0X25=z%256;方法三:#includeunsignedintx_at_0 x20;unsignedinty_at_0 x22;unsignedintz_at_0 x24;voidmain()z=(xy)?x:y;第 5 章单片机的中断系统习题1什么是中断、中断源、中断优先级和中断嵌套?答:中断是指单片机内部有一个中断管理系统,它对内部的定时器事件、串行通信的发送和接收及外部事件如键盘按键动作等进行自动的检测判断。当 CPU 正在处理某件事情例如正在执行主程序的时候,外部或内部发生的某一事件如某个引脚上电平的变化,一个脉冲沿的发生或计数器的计数溢出等 请求 CPU 迅速处理,于是,中断管理系统会置位相应标志通知 CPU暂时中止当前的工作,迅速转去处理所发生的事件。处理完该事件后,再回到原来被中止的地方,继续原来的工作,这样的过程称为中断。引发中断的事件称为中断源。将中断事件按轻重缓急分假设干级别叫中断优先级。允许中断优先级高的中断源中断正在执行的低优先级的中断服务程序叫中断嵌套。2.什么叫中断源?MCS-51 有哪些中断源?答:中断源即引发中断的事件。MCS-51 单片机有 5 个中断源,它们是外部中断 0,定时器 T0,外部中断 1,定时器T1,串行口。7.设 fosc=12MHz 利用定时器,TO(工作在方式 2)在 P1.1引脚上获取输出周期为 O.4ms的方波信号,定时器溢出时采用中断方式处理,请编写,T0 的初始化程序及中断服务程序。解:fosc=12MHz,则机器周期=1us;当 T0 工作在方式 2 时,其最大定时时间为 256us,要输出周期为即 400us 的方波信号,则其高、低电平应各为 200us,显然当定时器 T0按方式 2 工作时,只需计数到达 200 次即可,因此其时间常数初值为 256-200=56。在T0 的中断服务程序中,只需将引脚求反即可。#includesbitP1_仁P1A1;voidtimer0()interrupt1using1P1_1=!P1_1;voidmain()P1_1=0;TMOD=0 x02;TH0=56;TL0=56;IE=0 x82;TR0=1;for(;)第 6 章单片机的定时器/计数器习题2如果采用的晶振频率为 3MHz 定时/计数器 TO 分别工作在方式 0、1 和 2 下,其最大的定时时间各为多少?答:如果采用的晶振频率为3MHz 机器周期为 12X1/(3*106)=4us,由于定时/计数器 TO工作在方式 0、1 和 2 时,其最大的计数次数为 8192、65536 和 256 所以,其最大定时时间分别是:方式 0 为 8192X4us=、方式 1 为 65536X4us=、方式 2 为256X4us=1024uSo5定时器工作在方式 2 时有何特点?适用于什么应用场合?答:定时器工作在方式 2 时是一个可自动装入时间常数初值的 8 位定时/计数器,TLx 为加 1 计数器,THx 为计数初值寄存器。由于其恢复初值由硬件自动完成,所以当需要反复计数时,用方式 2 可以方便地实现精确的定时。9.设单片机的 fosc=12MHz,使 P1.O 和 P1.1 分别输出周期为 1ms 和 lOms 的方波,请用定时器 TO 方式 2 编程实现。解:fosc=12MHz,所以机器周期为 1uso要使输出周期为 1000us 的方波,可以通过定时中断方式实现,定时时间为 250us,定时计数 2 次来实现,对求反即可。要使输出周期为 10ms 的方波,也可以通过定时中断方式实现,定时时间为 5ms 当时间到时,对求反即可。由于 5ms/250us=20,所以也可以通过对 250us 的定时计数 20 次来实现。程序如下:#includesbitP1_0=P1A0;/输出周期为 400us 的方波的引脚sbitP1_仁 P1A1;/输出周期为 10ms 的方波的引脚 unsignedcharnum1=0,num2=0;/中断次数计数器,初值为 0voidmain()P1_0=0;/输出初值为 0P1_1=0;/输出初值为 0TMOD=0 x02;/T0 方式 2 定时TH0=256-250;/计 200 次,计数初值为模 256 减 200TL0=TH0;IE=0 x82;/允许 CPLP 向应中断,允许 T0 发中断请求TR0=1;/启动 T0for(;)/无限循环等待中断voidtimer0()interrupt1using1num1+;num2+;/中断次数加 1if(num1=2)/中断次数到达 2 次P1_0=!P1_0;/输出 P1_0 求反 num1=0;/中断次数复位为 0if(num2=20)/中断次数到达 20 次num2=0;/中断次数复位为 0P1_1=!P1_1;/输出 P1_1 求反第七章 7.1.无7489C51 单片机串行通信接口控制寄存器有几个?每个寄存器的含义是什么?答:有电源控制寄存器PCOb和串行口控制寄存器SCONPCO中SMO与串口通信有关。SMOD=0;串口方式 1,2,3 时,波特率正常。SMOD=1;串口方式 1,2,3 时,波特率加倍其余与串行通信无关SCO 中 SM0SM1 串行口工作方式控制位SM2 多机通信控制位 REN 串行口接收使能控制端;REN=1 时,允许接收,REN=0 寸,禁止接收 TB8:发送接收数据位 8RB8 接收数据位 8TI:发送中断标志位;TI=1 表示帧发送结束,TI 可由软件置 0RI:接收中断标志位;RI=1 表示帧接收完成,RI 可由软件置 0 第八章无 8.3 在由单片机 80C51 和一片 ADC0809 组成的数据采集系统中,假设 ADC0809的地址为 0 x7ff80 x7fff,画出接口电路图,并编写每隔 1ms 轮流采集一次 8 个通道数据的程序。采样 100 次取平均值。答:电路图书上实例有,做了如下改动控制端 ADDAADDBADD(分别接 P2A0,P2A!,P2A2.1.删去了译码器与逻辑器件器件,74LS373,74HC14,74HC02 中断检测端 EOC 接卩3八2。参考程序如下,自己写的没经过仿真,#include#include#defineucharunsignedchar/宏定义#defineuintunsignedint#defineAD_0XBYTE0 xff8定义通道访问地址#defineAD_1XBYTE0 xff9#defineAD_2XBYTE0 xffa#defineAD_3XBYTE0 xffb#defineAD_4XBYTE0 xffc#defineAD_5XBYTE0 xffd#defineAD_6XBYTE0 xffe#defineAD_7XBYTE0 xfffsbitbusy=P3A2;/定义中断请求端ucharcount=0;/定义采样次数 uchardatcode100=0;/定义数据存放数组intdat=0,dat1=0;/定义临时数据与最终平均数据 uchari,j,num;/定义变量voidmain()TMOD=0 x01;/定时器 0 工作方式 1TL0=(65536-1000)/256;/1ms 中断一次TH0=(65536-1000)%256;EA=1;/开总中断,定时器中断,打开定时器 0ET0=1;TR0=1;while(count=100)count=0;voidtimer0()interrupt1/中断函数TMOD=0 x01;TL0=(65536-1000)/256;TH0=(65536-1000)%256;AD_0=0;启动 0 通道 AD 转换while(busy=1)num=AD_0+1;把 0 通道数据附给 nun,并指向 AD_1 通道查询 datcodei+1=num;j+;if(j=7)/八次查询完毕退出循环busy=0;j=0;