(2025年)单片机C5复习题(课后习题及答案)_第1页
(2025年)单片机C5复习题(课后习题及答案)_第2页
(2025年)单片机C5复习题(课后习题及答案)_第3页
(2025年)单片机C5复习题(课后习题及答案)_第4页
(2025年)单片机C5复习题(课后习题及答案)_第5页
已阅读5页,还剩22页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

(2025年)单片机C5复习题(课后习题及答案)一、选择题1.以下关于8051单片机内部结构的描述,错误的是()A.片内包含4KB的ROM(或Flash)和128B的RAMB.有4个8位并行I/O口(P0-P3)C.包含2个16位定时器/计数器(T0、T1)D.所有型号的8051单片机均不支持串口通信功能答案:D(部分8051兼容型号支持串口通信,如STC89C52)2.执行指令“MOVA,0x30”后,累加器A的内容是()A.0x30(十六进制)B.30(十进制)C.00110000(二进制)D.以上均正确答案:D(三种表示方式等价)3.若单片机晶振频率为11.0592MHz,定时器T0工作于模式1(16位定时器),要产生1ms定时中断,需设置的初值为()A.TH0=0xFC,TL0=0x66B.TH0=0x66,TL0=0xFCC.TH0=0xCD,TL0=0x6BD.TH0=0xB0,TL0=0xDC答案:A(机器周期=12/11.0592MHz≈1.085μs,1ms=1000μs,计数次数=1000/1.085≈921,初值=65536-921=64615=0xFC66)4.8051单片机的中断优先级寄存器IP中,若设置PS=1、PT0=1、PX1=0、PT1=0、PX0=0,则中断优先级从高到低排列为()A.串口中断>T0中断>外部中断1>T1中断>外部中断0B.外部中断0>T1中断>外部中断1>T0中断>串口中断C.串口中断>T0中断>外部中断0>T1中断>外部中断1D.T0中断>串口中断>外部中断1>T1中断>外部中断0答案:A(IP中对应位为1表示高优先级,PS(串口)=1最高,PT0(T0)=1次之,其余为0则按默认顺序:外部中断0>T0>外部中断1>T1>串口,但此处PS和PT0被设为高优先级,故调整为串口>T0>外部中断1>T1>外部中断0)5.以下哪种寻址方式不能访问片外RAM?()A.寄存器间接寻址(@DPTR)B.直接寻址(MOVXA,@R0)C.立即寻址(MOVA,0x50)D.变址寻址(MOVCA,@A+DPTR)答案:C(立即寻址用于访问指令中的常数,不涉及RAM)6.若P1口作为输出口驱动8个LED(共阳极),要使P1.2和P1.5对应的LED点亮,应向P1口写入()A.0xFB(二进制11111011)B.0x9F(二进制10011111)C.0xDF(二进制11011111)D.0xE7(二进制11100111)答案:A(共阳极LED需低电平点亮,P1.2(第2位)和P1.5(第5位)置0,其余位为1,即二进制11111011=0xFB)7.串口工作于方式1(10位异步通信)时,一帧数据包含()A.1位起始位+8位数据位+1位停止位B.1位起始位+7位数据位+1位奇偶校验位+1位停止位C.2位起始位+8位数据位+0位停止位D.1位起始位+8位数据位+2位停止位答案:A(方式1为10位格式:1起始+8数据+1停止)8.执行指令“CJNEA,0x50,LOOP”后,若A=0x50,则程序()A.跳转到LOOP处执行B.顺序执行下一条指令C.进入中断D.复位答案:B(CJNE比较不相等时跳转,相等则顺序执行)9.以下特殊功能寄存器(SFR)中,用于控制定时器启停的是()A.TMODB.TCONC.SCOND.IE答案:B(TCON中的TR0、TR1位控制T0、T1的启动/停止)10.若单片机需要扩展8KB的外部RAM,至少需要()根地址线A.13B.14C.15D.16答案:A(8KB=8×1024=8192=2^13,故需13根地址线)二、填空题1.8051单片机的程序计数器PC是____位寄存器,其寻址范围为____。答案:16;64KB(0000H-FFFFH)2.片内RAM的____区(地址____)可进行位寻址,其中位地址0x30对应字节地址____的第____位。答案:位寻址;20H-2FH;26H(0x20+0x06=0x26);0(位地址=字节地址×8+位序号,0x30=0x26×8+0)3.定时器T0工作于模式2(自动重装模式)时,其最大定时时间(晶振12MHz)为____μs,此时TH0和TL0的初值关系为____。答案:256×1=256;TH0=TL0(自动重装时TH0保存初值,TL0溢出后自动从TH0重装)4.外部中断0的中断入口地址是____,若设置为边沿触发方式,需将TCON中的____位设为____。答案:0003H;IT0;15.串口控制寄存器SCON中,REN位的作用是____,TI位的作用是____。答案:允许串口接收(1为允许);发送中断标志(发送完成后置1)6.执行“ANLP1,0x0F”后,P1口的高4位被____,低4位____。答案:清零;保持不变7.若DPTR=0x2000,执行“MOVXA,@DPTR”后,单片机从____地址读取数据到A中。答案:外部RAM的0x20008.中断服务程序的最后必须执行____指令,其作用是____。答案:RETI;恢复断点并开放中断9.8051单片机的ALE引脚在访问____时会输出时钟脉冲,其频率为晶振频率的____。答案:外部存储器;1/610.若要将累加器A的内容循环左移一位,应使用____指令;若要将A的低4位与高4位交换,应使用____指令。答案:RLA;SWAPA三、简答题1.简述8051单片机中断响应的条件及过程。答案:条件:(1)中断源有中断请求;(2)总中断允许(EA=1);(3)对应中断的允许位(如EX0、ET0等)=1;(4)无更高优先级或同优先级中断正在执行。过程:(1)检测中断请求;(2)保护断点(PC值压栈);(3)清除中断标志(部分需软件清除,如串口TI/RI);(4)跳转到对应中断入口地址(如外部中断0为0003H);(5)执行中断服务程序;(6)执行RETI指令,恢复断点,继续执行主程序。2.说明定时器/计数器的4种工作模式及适用场景。答案:模式0:13位定时器(TLx低5位+THx高8位),兼容早期8048单片机,现较少使用;模式1:16位定时器,适用于较长时间定时(如1ms以上);模式2:8位自动重装模式,适用于需要重复定时(如波特率发生器);模式3:仅T0可用,拆分为两个独立的8位定时器(T0和T1的一部分),适用于需要3个定时器的场景(但此时T1只能作为串口波特率发生器)。3.设计一个基于8051的按键检测电路(消抖),说明硬件连接和软件实现方法。答案:硬件连接:按键一端接VCC,另一端接单片机I/O口(如P3.2),I/O口内部或外部下拉电阻(或利用内部上拉,按键按下时I/O口为低电平)。软件实现:(1)检测按键输入(如P3.2=0);(2)延时10-20ms消抖;(3)再次检测P3.2是否仍为0,确认按键按下;(4)执行按键处理函数;(5)检测按键释放(P3.2=1),再次延时消抖,确认释放完成。4.串口通信中,为何8051单片机常用11.0592MHz晶振?说明串口方式1的波特率计算公式。答案:11.0592MHz晶振可使串口波特率计算时避免误差(如9600bps时,波特率=晶振频率/(32×12×(2^SMOD)/16)),11.0592MHz时,SMOD=0时,(11.0592×10^6)/(32×12×16)=9600,无误差)。方式1波特率公式:波特率=(2^SMOD/32)×(晶振频率/(12×(256-TH1))),其中TH1为定时器T1模式2的初值。5.简述D/A转换器(如DAC0832)与8051单片机的接口方式及单缓冲模式下的工作流程。答案:接口方式:DAC0832为8位电流输出型D/A转换器,与单片机通过数据总线(D0-D7)、写信号(WR1、WR2)、片选(CS)、传送控制(XFER)连接。单缓冲模式:将WR2和XFER接地(常选通),仅控制WR1和CS。工作流程:(1)单片机向DAC0832的数据寄存器写入8位数字量;(2)WR1和CS同时有效(低电平),数据锁存到DAC寄存器;(3)DAC0832输出对应模拟电流,通过运放转换为电压输出。四、编程题1.设计一个LED流水灯程序(P1口接8个共阴极LED),要求从P1.0到P1.7依次点亮,每个LED亮500ms,循环执行。晶振11.0592MHz,使用定时器T0中断实现延时。答案:```cinclude<reg52.h>defineucharunsignedchardefineuintunsignedintucharled_mod=0x01;//初始点亮P1.0(共阴极,低电平点亮)uintcount=0;//中断计数变量voidTimer0_Init(){TMOD=0x01;//T0模式1(16位定时器)TH0=0xFC;//1ms初值(11.0592MHz晶振)TL0=0x66;ET0=1;//允许T0中断EA=1;//总中断允许TR0=1;//启动T0}voidTimer0_ISR()interrupt1{TH0=0xFC;//重装初值TL0=0x66;count++;if(count>=500){//500次中断=500mscount=0;led_mod<<=1;//左移一位,下一个LED点亮if(led_mod==0x00)led_mod=0x01;//循环P1=~led_mod;//共阴极需低电平,取反}}voidmain(){P1=~led_mod;//初始化P1口Timer0_Init();while(1);//等待中断}```关键说明:定时器T0模式1产生1ms中断,每500次中断(500ms)移动一次LED位置,通过左移操作实现流水效果,共阴极LED需输出低电平(故对led_mod取反后赋值P1)。2.编写程序实现:通过P3.4检测按键(按下为低电平),按键按下时启动定时器T1计时,再次按下时停止计时并通过串口(方式1,9600bps)发送计时时间(单位:ms)。晶振11.0592MHz,SMOD=0。答案:```cinclude<reg52.h>defineucharunsignedchardefineuintunsignedintsbitKEY=P3^4;uinttime_cnt=0;//计时变量(ms)bitstart_flag=0;//计时启动标志voidUart_Init(){TMOD|=0x20;//T1模式2(自动重装)TH1=0xFD;//9600bps初值(11.0592MHz,SMOD=0)TL1=0xFD;SCON=0x50;//串口方式1,允许接收TR1=1;//启动T1EA=1;//总中断允许}voidTimer1_Init(){TMOD|=0x10;//T1模式1(16位定时器,仅用于计时)TH1=0xFC;//1ms初值TL1=0x66;ET1=1;//允许T1中断}voidSend_Byte(uchardat){SBUF=dat;//发送字节while(!TI);//等待发送完成TI=0;//清除标志}voidSend_Time(uintt){ucharh,l;h=t/100;//百位l=t%100;//十位和个位Send_Byte(h+'0');//发送百位字符Send_Byte((l/10)+'0');//十位Send_Byte((l%10)+'0');//个位Send_Byte('m');//发送单位Send_Byte('s');}voidmain(){Uart_Init();Timer1_Init();while(1){if(!KEY){//检测按键按下delay_ms(10);//消抖(需自行实现delay_ms)if(!KEY){start_flag=!start_flag;if(start_flag){TR1=1;//启动计时time_cnt=0;//清零计时}else{TR1=0;//停止计时Send_Time(time_cnt);//发送时间}while(!KEY);//等待按键释放delay_ms(10);//消抖}}}}voidTimer1_ISR()interrupt3{TH1=0xFC;//重装初值TL1=0x66;time_cnt++;//每1ms递增}```关键说明:T1模式1用于1ms计时,串口模式1通过T1模式2产生9600bps波特率。按键检测使用消抖,第一次按下启动计时,第二次按下停止并通过串口发送时间(转换为字符格式)。3.利用DS18B20温度传感器设计温度采集系统,编写初始化、读温度、显示(P0口接4位共阴数码管)的主程序框架。答案:```cinclude<reg52.h>include<intrins.h>defineucharunsignedchardefineuintunsignedintsbitDQ=P3^7;//DS18B20数据总线ucharcodeseg_table[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};//共阴数码管段码表uchartemp_buf[4];//温度显示缓冲区(十位、个位、小数位、符号位)//DS18B20初始化函数bitDS18B20_Init(){bitack;DQ=1;_nop_();DQ=0;//拉低总线delay_us(480);//延时480μsDQ=1;//释放总线delay_us(60);//等待响应ack=DQ;//读取应答信号(0为存在)delay_us(420);//完成初始化时序returnack;}//写一个字节到DS18B20voidDS18B20_Write(uchardat){uchari;for(i=0;i<8;i++){DQ=0;//起始位_nop_();DQ=dat&0x01;//写最低位delay_us(60);DQ=1;//释放总线dat>>=1;//右移一位}}//从DS18B20读一个字节ucharDS18B20_Read(){uchari,dat=0;for(i=0;i<8;i++){DQ=0;//起始位_nop_();DQ=1;//释放总线_nop_();dat>>=1;if(DQ)dat|=0x80;//读取当前位delay_us(60);}returndat;}//读取温度值(返回整数部分×10,如25.6℃返回256)intRead_Temp(){ucharTL,TH;inttemp;DS18B20_Init();DS18B20_Write(0xCC);//跳过ROMDS18B20_Write(0x44);//启动温度转换delay_ms(750);//等待转换完成DS18B20_Init();DS18B20_Write(0xCC);//跳过ROMDS18B20_Write(0xBE);//读取温度寄存器TL=DS18B20_Read();//低8位TH=DS18B20_Read();//高8位temp=(TH<<8)|TL;//组合为16位温度值return(temp>>4)10+(temp&0x0F)0.625;//转换为×10格式}//数码管显示函数(动态扫描)voidDisplay(){staticucharpos=0;P2=0x00;//消隐switch(pos){case0:P2=0x01;P0=seg_table[temp_buf[3]];break;//符号位case1:P2=0x02;P0=seg_table[temp_buf[0]/10];break;//十位case2:P2=0x04;P0=seg_table[temp_buf[0]%10]|0x80;break;//个位(带小数点)case3:P2=0x08;P0=seg_table[temp_buf[1]];break;//小数位}pos=(pos+1)%4;delay_ms(2);//扫描间隔}voidmain(){inttemp;while(1){temp=Read_Temp();//读取温度值(×10)if(temp<0){//处理负温度temp_buf[3]=0x40;//符号位('-'对应段码0x40)temp=-temp;}else{temp_buf[3]=0x00;//无符号}temp_buf[0]=temp/10;//整数部分(如25℃)temp_buf[1]=temp%10;//小数部分(如6)Display();//动态显示}}```关键说明:DS18B20通过单总线通信,需严格遵循初始化、写、读时序。温度值为16位补码,其中低4位为小数部分(0.0625℃/位),转换为×10格式便于显示。数码管采用动态扫描,依次显示符号位、十位、个位(带小数点)、小数位。4.设计一个PWM控制直流电机转速的程序(P2.0输出PWM波,占空比0%-100%可调,按键P3.1增加占空比,P3.2减少占空比,步长5%)。答案:```cinclude<reg52.h>defineucharunsignedchardefineuintunsignedintsbitMOTOR=P2^0;sbitKEY_ADD=P3^1;sbitKEY_SUB=P3^2;ucharpwm_duty=0;//占空比(0-20,对应0%-100%,步长5%)ucharpwm_cnt=0;//PWM周期计数器(0-19)voidTimer0_Init(){TMOD=0x02;//T0模式2(

温馨提示

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

评论

0/150

提交评论