文档库 最新最全的文档下载
当前位置:文档库 › 单片机复习资料

单片机复习资料

单片机复习资料 // 题型 选择20*2 判断 10*1 填空 5*2 简答 4*5 编程 2*10 //本资料答案一般来自于第一版老师讲课用的教材,与第二版教材及课件略有不符之处,请自行处理,资料仅包含简答和编程,其它部分详见试卷即可。 //程序题说明:新加的为上届考题答案,不需要者自行处理。 1. 51系列单片机内部有哪些功能部件? 1个8位CPU 1个片内振荡器及时钟电路 4KB ROM程序存储器 128B RAM数据存储器 可寻址64KB外部数据存储器和64KB外部程序存储器的控制电路 32条可编程的I/O线(4个8位并行I/O接口) 2个16位的定时/计数器 1个可编程全双工串行接口 2个优先级嵌套中断结构的5个中断源。 2. 51系列单片机的存储器可以划分为几个空间?各自的地址范围和容量是多少?在使用上有什么不同? 从物理空间看,四个存储器地址空间: 片内数据存储器(00H-7FH 128字节)、片外数据存储器(0000H-FFFFH 64k) 片内程序存储器(0000H-0FFFH 4K)、片外程序存储器(0000H-FFFFH 64K) 从逻辑上看,MCS-51有三个存储器空间: 片内数据存储器、片外数据存储器 片内、片外统一编址的程序存储器 不同:程序存储器用来存放编制好的始终保留的固定程序和表格常数;外部数据存储器存放随机读写的数据、外部I/O口地址影像区;内部数据存储器存放随机读写的数据、通用寄存器区、堆栈区、运算操作数存放区、指令的操作数只能在此地址空间或特殊功能寄存器地址空间。 3. 51系列单片机片内数据存储器分为哪几个性质和用途不同的区域? (1)地址 0~1FH的前32个单元称为寄存器区 用途:① 作通用寄存器R0~R7。 ② R0与R1可作间址寄存器使用。 (2)20H~2FH为位地址区 共16个单元,每单元有八个位,每位有一个位地址,共128位,位地址范围为00H~7FH,该区既可位寻址,又可字节寻址。 (3)除选中的寄存组以外的存储器均可以作为通用RAM区。 (4)堆栈区 8XX51单片机的堆栈设在内部RAM区,深度不大于128字节,初始化时SP指向07H。 (5)特殊功能寄存器SFR 4. 51系列单片机的4个I/O端口在结构上有什么不同?使用时应注意什么?
PO口的输出驱动电路由上拉场效应管T1和驱动场效应T2组成,控制电路包括一个与门, 一个非门和一个模拟开关MUX。 P1口作通用I/O口使用,电路结构中输出驱动部分接有上拉电阻。当作输入时,同PO一样, 要先对该口写“1”。P2口的位结构比P1多了一个转换控制部分,当P2口作通用I/O口时,多路开关MUX倒向左;当扩展片外存贮器时,MUX开关打向右,P2口作高八位地址线输出高八位地址信号。P3口 P3口为双功能I/O口,内部结构中增加了第二输

入/输出功能。 注意事项: 1.如果单片机内部有程序存贮器,不需要扩展外部存贮器和I/O接口,单片机的四个口均可作I/O口用。 2.四个口在作输入口使用时,均应先对其写“1”,以避免误读。 3.P0口作I/O口使用时应外接10K的上拉电阻,其它口则可不必。 4.P2可某几根线作地址使用时,剩下的线不能作I/O口线使用。 5.P3口的某些口线作第二功能时,剩下的口线可以单独作I/O口线使用。 5. 51系列单片机的4个I/O端口的作用是什么? PO口—1.作为输入/输出口。 2.作为地址/数据总线 ,接外围芯片时PO口分时输出低 8 位地址与数据信号。 P1口—1.作为输入/输出口。 2.在增强型(52系列)和ISP型(在系统编程型)中有如下功能: P1.0 T2引脚,定时/计数器2外部计数脉冲输入 P1.1 T2EX引脚,定时/计数器2触发和方向控制 P1.5 MOSI引脚,在系统编程数据输入 P1.6 MISO引脚,在系统编程数据输出 P1.7 SCK引脚,在系统编程时钟输入 P2口— 1.作为输入/输出口。 2.作为高8位地址总线。 P3口—P3口为双功能 1.作第一功能使用时,其功能为输入/输出口。 2.作第二功能使用时,每一位功能定义如下表所示: P3.0 RXD (串行输入线) P3.1 TXD (串行输出线) P3.2 INT0(外部中断0输入线) P3.3 INT1 (外部中断1输入线) P3.4 T0 (定时器0外部计数脉冲输入) P3.5 T1 (定时器1外部计数脉冲输入) P3.6 WR (外部数据存储器写选通信号输入) P3.7 RD (外部数据存储器读选通信号输入) 6. 51系列单片机具有几个中断源,分别是如何定义的?其中哪些中断源可以被定义为高优
先级中断,如何定义?中断服务程序入口地址分别是多少? 共5个中断源,3个片内,2个片外 符号 名 称 中断引起原因 中断服务程序入口 INT0 外部中断 0 P3.2引脚的低电平或下降沿信号 0003H INT1 外部中断 1 P3.3引脚的低电平或下降沿信号 0013H T0 定时器0中断 定时计数器0计数回零溢出 000BH T1 定时器1中断 定时计数器1计数回零溢出 001BH TI/RI 串行口中断 串行通信完成一帧数据发送或接收引起中断 0023H 五个中断源的优先级别由IP寄存器管理,相应位置1,则该中断源优先级别高,置0的优先级别低.当某几个中断源在IP寄存器相应位同为1或同为零时,由内部查询确定优先级,查询的顺序是:INT0->TO->INT1->T1->串行口 7. 51系列单片机具有几个中断源,各中断标志是如何产生的,如何清除? 共5个中断源,IE寄存器的各位对应相应的中断源,如果允许该中断源中断则该位置1,禁止中断则该位0 。中断请求标志及外部

中断方式选择寄存器TCON中:IT0和IT1为外中断INT0 和INT1中断触发方式选择,若选下降沿触发则相应位置1;若选低电平触发 ,IT相应位置0。 某中断源有中断请求,该中断标志置1,无中断请求,该中断标志置0。 串行口中断标志在SCON的RI和TI位。CPU响应中断后,应撤除该中断请求标志,对定时计数器T0、T1的溢出中断,CPU响应中断后,硬件自动清除中断请求标志TF0 TF1。对边沿触发的外部中断INT1和INT0,CPU响应中断后硬件自动清除中断请求标志IE0和IE1。对于串行口中断,CPU响应中断后,必须用软件清除,对电平触发的外部中断,CPU在响应中断时也不会自动清除中断标志,因此,在CPU响应中断后应立即撤除INT1或INT0的低电平信号。 8. 51系列单片机的串行口有哪几种工作发?各有什么特点? 1.方式0 方式0的数据格式为8位,低位在前,高位在后 RXD为串行数据的发送端或接收端, TXD输出频率为 fosc/12的时钟脉冲。 波特率固定为fosc/12 (fosc为单片机晶振频率) 2.方式1 为10位异步通信方式,几每帧数据由1个起始位“0”.八个数据位 和1个停止位“1”共10位构成.其中起始位和停止位在发送时是自动插入的. 以TXD为串行数据的发送端,T1提供位时钟,RXD为数据的接收端,由T1提供移位时钟,是波特率可变方式 波特率=(2SMOD/32)×(TI的溢出率)=(2SMOD/32)×(fosc/12(256-x) ) 3. 方式2 11位异步发送/接收方式,即每帧数据由有一个起始位“0”,9个数据位和1个停止位“1”组成.发送时九个数据位,由SCON寄存器的TB8位 提供,接收到的第九位数据存放在SCON寄存器的RB8位. 第九位数据可作为检验位,也可用于多机通信中识别传送的是地址还是数据的特征位。
波特率固定为(2SMOD/64)×fosc. 4. 方式3 数据格式同方式 3,所不同的是波特率可变,计算方式同方式 1。 9. 51系列单片机中与串行口相关的特殊功能寄存器有哪些?寄存器各位如何定义? 串行口的控制寄存器SCON SM0 SM1: 方式选择 SM2:多机控制 REN:串行接收允许/ 禁止 TB8: 欲发的第九位 RB8:收到的第九位 TI:发送中断有/无 RI:接收中断有/无 电源控制寄存器PCON SMOD : 波特率加倍位。在计算串行方式 1、 2、 3的波特率时, SMOD= 0—不加倍; SMOD= 1— 加倍 10. 51系列单片机的定时/计数器有哪几种工作方式?各有什么特点? 1.方式 0 ★定时器(T0或T1)工作于13位定时、计数方式。 用于计数方式时最大计数值为 213 = 8192个脉冲 用于定时工作时,定时时间为:t=(213一T0初值) ×时钟周期×12 ★在这种模式下,16寄存器(THX和TLX)只用13位,其中THX占高8位。其中TLX占低5位, TLX的高3位末用。 ★当TLX的低5位溢出时向THX进位,而THX溢

出时硬件置位TF0,并申请中断。 ★ 定时、计数溢出否可查询TF0是否置位,如果开中断则产生溢出中断。 2 .方式1 当TMOD中M1M0=01时,定时计数器工作在方式1。 ★该模式是一个16位定时/计数方式。 寄存器TH0和TL0是以全16位参与操作, 计数方式时最大计数 216=65536(个外部脉冲) 用于定时工作方式时,定时时间为: t=(216一T0初值) ×时钟周期×12 ★ 16寄存器(THX和TLX) 中THX提供高8位、TLX提供低8位计数初值 3. 方式2 当TMOD中M1M0=10时,定时器工作在方式2。 方式2是8位的可自动重装载的定时计数方式。 ★16位的计数器被拆成两个8位,其中TL0用作8位计数器, TH0用以保持计数初值。当TL0计数溢出,置位TF0,TH0中的初值自动装入TL0,继续计数,循环重复计数。 ★用于计数工作方式时,最大计数值为: 28=256(个外部脉冲)。 用于定时工作方式时,其定时时间为; t=(28—TH0初值)×振荡周期×12 ★这种工作方式可省去用户重装常数的程序,并可产生精确的定时时间,特别适用作串行口波待率发生器。
4.方式3 当TMOD中M1M0=11时,定时器工作在方式3。 ★若将T0设置为模式3,TL0和TH0被分成为两个互相独立的8位计数器TH0和 TL0 。 ★ TL0可工作为定时方式或计数方式。占用原T0的各控制位、引脚和中断源。即C/T、GATE、TR0、TF0和T0 (P3.4)引脚、INT0 (P3.2)引脚。 TH0只可用作定时功能,占用定时器T1的控制位TR1和T1的中断标志位TF1,其启动和关闭仅受TRl的控制。 ★定时器T1无模式 3, 可工作于方式0、1、2,但不能使用中断方式。 ★ 只有将T1用做串行口的波特率发生器时,T0才工作在方式3,以便增加一个定时器。 11. 51系列单片机中与定时器相关的特殊功能寄存器有哪些?寄存器各位如何定义? 工作模式寄存器TMOD(89H) TMOD D7 D6 D5 D4 D3 D2 D1 D0 (89H) GATE C/T M1 M0 GATE C/T M1 M0 GATE:门控信号 GATE=0,TRx=1时即可启动定时器工作 ; GATE=1, 除TRx=1 外,还需INTx=1才可启动定时器工作。 ★ C/T:定时器/计数器选择位 C/T=1,为计数器方式; C/T=0,为定时器方式。 ★ M1 M0 工作模式选择位 M1M0=00 工作方式0(13位方式)。 M1M0=01 工作方式1(16位方式)。 M1M0=10 工作方式2(8位自动再装入方式)。 M1M0=11 工作方式3(T0为2个8位方式)。 控制寄存器TCON(88H) TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 T1请求 有/无 T1工作 启/停 T0请求 有/无 T0 工作 启/停 INT请求 有/无 INT1方式下沿/ 低电平 INT请求 有/无 INT0方式 下沿/低电平 TCON寄存器 中定时器控制 仅用了其中高四位,其意义如下:
★TF1:T1

溢出中断请求标志。 TF1=1,T1有溢出中断请求。 TF1=0,T1无溢出中断请求。 ★TR1:T1运行控制位。 TR1=1,启动T1工作。 TR1=0,停止T1工作。 ★TF0:T0溢出中断请求标志。 TF0=1,T0有溢出中断请求。 TF0=0,T0无溢出中断请求。 ★TR0:T0运行控制位。 TR0=1,启动T0工作。 TR0=0,停止T0工作。 12. 51系列单片机中与中断相关的特殊功能寄存器有哪些?寄存器各位如何定义? 中断控制寄存器IE EA - ET2 ES ET1 EX1 ET0 EX0 中断总控允/禁 不 用 T2 允/禁 串行口 允/禁 T1 允/禁 INT1 允/禁 T0 允/禁 INT0 允/禁 中断请求标志及外部中断方式选择寄存器TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 T1 请求 有/无 T1 工作 启/停 T0 请求 有/无 T0 工作 启/停 INT1 请求 有/无 INT1 方式 下沿/ 低电平 INT0 请求 有/无 INT0 方式 下沿/低电平 中断源的优先级别IP寄存器 ---- ---- PT2 PS PT1 PX1 PT0 PX0
无 用 位 无 用 位 T2 高/低 串行口 高/低 T1 高/低 INT1 高/低 T0 高/低 INT0 高/低 编程题 1. 键盘与显示 1.1在 下图中8XX51接有五个共阴极数码管的动态显示接口电路,开关打向位置“1”时,显示“12345”字样,当开关打向“2”时,显示"HELLO"字样,C语言编程程序清单如下。 #include #define uint unsigned int #deefine uchar unsigned char sbitP17=P1^7; main ( ){ uchar code tab1[5]={0x86,0xdb,0xcf,0xe6,0xed} ; /*“1~5”的字形码,因P1.7接的开关,最高位送的“1”*/ uchar code tab2[5]={0xf8,0xf9,0xb8,0xb8,0x,bf}; /*“HELLO”的段码 “1”*/ uchar i; unit j; while(1) { p3=0x011 for(i=0;i++) { if(p17==1)P1=tab1[i]; elseP1=tab2[i]; P3<<=1; for(j=0;j<=25000;j++); }}} 1.2以P1.0~P1.3作输出线,以P1.4~P1.7作输入线,如图4-6所示4×4矩阵键盘: #include #define uchar unsigned char #define uint unsigned int void dlms (void); uchar kbscan(void); / * 函数说明 * /
void main (void0; { uchar key; while (1) { key=kbscan( ); / * 键盘扫描函数,返回键码送key保存 * / dlms( ); } } void dlms (void) /* 延时 * / {uchar i; for (i=200;i>0;i- -){ } } uchar kbscan(void) / * 键盘扫描函数 * / {uchar sccode,recode; P1=0xf0; / *P1.0~P1.3发全0,P1.4~P1.7输入 * / if ( (P1 & 0xf0)! =0xf0) / * 如P1口高四位不全为1有键按下 * / {dlms( ); / * 延时去抖动 * / if ( (P1 & 0xf0) ! =0xf0) / * 在读输入值 * / {sccode =0xfe / * 最低位置0 * / while ( (

sccode & 0x10)! =0) / * 不到最后一行循环 * / {P1 =sccode; /*P1口输出扫描码 * / If ( (P1 & 0xf0)! =0xf0) / * 如P1.4~P1.7不全为1,该行有键按下 * / {recode = (P1 & 0xf0;); / * 保留P1口高四位输入值,低四位变为全“1”, 作为列值 * / return( (sccode) + (recode) ); /*行码+列值=键编码返回主程序 * / } else sccode =(sccode<<1) | 0x01; / * 如该行无键按下,查下一行,行扫描值左移一位*/ } } } return( 0 ); / * 无键按下,返回值为0 * / } 2. 产生方波、测量高电平宽度、测量频率 在P1.7端接一个发光二极管LED,要求利用定时控制使LED亮一秒灭一秒周而复始,
设fosc=6MHz。 #include 〈reg51.h〉 sbit P1_0=P1^0; sbit P1_7=P1^7; timer0() interrupt 1 using 1 /* T0中断服务程序 */ { P1_0=! P1_0; /* 100ms到P1.0反相*/ TH0=-50000/256; /* 重载计数初值 */ TL0=-50000%256; } timerl() interrupt 3 using 2 /* T1中断服务程序 */ { P1_7=! P1_7; /* 1s到,灯改变状态 */ } main (){ P1_7=0; /* 置灯初始灭 */ P1_0=1; /* 保证第一次反相便开始计数 */ TMOD=0x61; /* T0方式 1 定时,T1方式 2 计数 */ TH0=-50000/256; /* 预置计数初值 */ TL0=-50000%256; TH1=-5; TL1=-5; IP=0x08; /* 置优先级寄存器 */ EA=1;ET0=1;ET1=1; /* 开中断 */ TR0=1;TR1=1; /* 启动定时/计数器 */ for(;;){} /* 等待中断 */ } 3. 串行口的初始化、发送、接收。 在内部数据存贮器20H~3FH单元中共有32个数据,要求采用方式1串行发送出去, 传送速率为1200波特,设fosc=12MHZ。 波特率= (2SMOD/32)×fosc/(12×(256-x)) 1200=(1/32)×(12×106) )/ (12×(256-x) x=230=E6H 发送程序:#include main( ) { unsingned char i; char *p; TMOD=0x20;
TH1=0xe6;TL1=0xe6; TR1=1; SCON=0x40; p=0x20; for (i=0;i<=32;i++){ SBUF=*p p++ while (!TI); TI=0; } } 接收程序: #include main( ) { unsingned char i; char *p; TMOD=0x20; TH1=0xe6;TL1=0xe6; TR1=1; SCON=0x50; p=0x20; for (i=0;i<=32;i++){ while (!RI); RI=0; *p=SBUF; p++ } } 二:定时器 (1) 方波 题目: 12MHZ产生50KHZ的方波,定时器需如何设置? 解答:12MHZ方波周期为1us,50KHZ方波周期为20us,所以半周期计数为10,每10
次输出信号取反,就能形成一个周期为20us的方波 利用方式二: TMOD=2; IE=OX82; Sbitp1_0=P1; TH0=OXF6;TL0=OXF6;TR0=1; WHILE(1); VOID Int(void) interrupt 1{ P1_0=!p1_0;} (2)测脉冲宽度 题目:测高电平,从INT0引入,在p3_2口

输出信号 Int seci; TMOD=ox5; TL0=ox0; TH0=ox0; Seci=0; While(p3_2==1){ TR0=1; IE=ox82;} While(p3_2==0); While(p3_2==1); Void int1(void)interrupt1{ Seci++;} (3)同编程题第二个 三、串行口初始化、接受、发送 波特率为9600,fosc=11.0592,利用公式所求可得到256-X=3; TMOD=ox20; TH1=oxFC; TH0=oxFC; TR1=1; PCON=0; SCON=ox50; (1) 查询方式: While(1){ If(RI){ RI=0; CH=SBUF; If(TI){ TI=0;
SBUF=CH;}}} (2) 中断方式: ES=1;EA=1; While(1); Void comm(void)interrupt 4{ While(RI==1||TI==1){ IF(RI){ RI=0; CH=SBUF; SBUF=CH;} IF(TI){TI=0;}}} (3) INBUF和OUTBUF函数 While(T1==1||R1==1){ If(RI){ Ri=0; inBUF(inptr)=SBUF; inptr++;} if(TI){ TI=0; If(outptr!=inptr){ SBUF=outBUF(outptr); Outptr++;}}}
Welcome To Download !!! 欢迎您的下载,资料仅供参考!

相关文档
相关文档 最新文档