单片机原理及应用(C51版) 习题答案汇 张春光 第3-7章_第1页
单片机原理及应用(C51版) 习题答案汇 张春光 第3-7章_第2页
单片机原理及应用(C51版) 习题答案汇 张春光 第3-7章_第3页
单片机原理及应用(C51版) 习题答案汇 张春光 第3-7章_第4页
单片机原理及应用(C51版) 习题答案汇 张春光 第3-7章_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

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

文档简介

第3章习题答案已知片内RAM的30H单元和40H单元各存放了一个8位无符号数,试编写程序比较这两个数的大小。若(30H)≥(40H),则将地址为20H的内存单元置0;否则,则将地址为20H的内存单元置1。方法一:#defineucharunsignedchardataucharx_at_0x30;datauchary_at_0x40;dataucharz_at_0x20;voidmain(){ if(x>=y)z=0x00; elsez=0x01; while(1);}方法二:#include<absacc.h>#definexDBYTE[0x30]#defineyDBYTE[0x40]#definezDBYTE[0x20]voidmain(){ if(x>=y)z=0x00; elsez=0x01; while(1);}2.已知片内RAM的20H单元中存放着一个无符号数X,试编写程序求出下式的函数值Y,并将结果存放在21H单元中。方法一:#defineucharunsignedchardataucharx_at_0x20;datauchary_at_0x21;voidmain(){ if(x>0x10)y=0xaa; elseif(x==0x10)y=0x00; elsey=0xff; while(1);}方法二:#include<absacc.h>#definexDBYTE[0x20]#defineyDBYTE[0x21]voidmain(){ if(x>0x10)y=0xaa; elseif(x==0x10)y=0x00; elsey=0xff; while(1);}3.已知片内RAM的20H单元中存放着一个有符号数X,试编写程序求出下式的函数值Y,并将结果存放在21H单元中。方法一:datacharx_at_0x20;datachary_at_0x21;voidmain(){ if(x==0)y=0x00; elseif((x&0x80)==0)y=0x01; elsey=0xff; while(1);}方法二:#include<absacc.h>#definexDBYTE[0x20]#defineyDBYTE[0x21]voidmain(){ if(x==0)y=0x00; elseif((x&0x80)==0)y=0x01; elsey=0xff; while(1);} 试编写程序,将片内RAM以30H为起始地址的10个单元中的数据求和,并将结果送入40H单元。假设和不大于255。参考程序:#defineucharunsignedchardataucharbuffer[10]_at_0x30;dataucharsum_at_0x40;voidmain(){ uchari; for(i=0;i<10;i++) sum+=buffer[i]; while(1);}试编写程序,查找片内RAM以30H为起始地址10个单元数据的最小值,并将结果送入40H单元。参考程序:#defineucharunsignedchardataucharbuffer[10]_at_0x30;dataucharx_at_0x40;voidmain(){ uchari; x=0xff; for(i=0;i<10;i++) if(buffer[i]<x)x=buffer[i]; while(1);}试编写程序,将片内RAM30H~50H单元的数据块,全部搬移到片外RAM从1000H起始的存储区域,并将原数据区全部填为00H。参考程序:#defineucharunsignedchardataucharbuffer1[33]_at_0x30;xdatauchar buffer2[33]_at_0x1000;voidmain(){ uchari; for(i=0;i<33;i++) { buffer2[i]=buffer1[i]; buffer1[i]=0; } while(1);}试编写程序将片内RAM以40H为起始地址的数据块传送到片外RAM以2000H为起始地址的区域,直到发现“$”字符,传送停止。参考程序:(假设长度为10个单元)#defineucharunsignedchardataucharbuffer1[10]_at_0x40;xdataucharbuffer2[10]_at_0x2000;voidmain(){ uchari; i=0; while(buffer1[i]!=0x24) { buffer2[i]=buffer1[i]; i++; } while(1);}8.试编写程序,求平方和c=a2+b2,设a、b分别存于内部RAM的30H、31H两个单元(假设a、b均小于10),计算结果存在内部RAM的32H单元中。方法一:#defineucharunsignedchardataucharx_at_0x30;datauchary_at_0x31;dataucharz_at_0x32; ucharcodesquare[10]={0,1,4,9,16,25,36,49,64,81};ucharfuction(ucharnumber){ returnsquare[number];} voidmain() { z=fuction(x)+fuction(y); while(1);}方法二:#defineucharunsignedchar#include<absacc.h>#definexDBYTE[0x30]#defineyDBYTE[0x31]#definezDBYTE[0x32]ucharcodesquare[10]={0,1,4,9,16,25,36,49,64,81};ucharfuction(ucharnumber){ returnsquare[number];} voidmain() { z=fuction(x)+fuction(y); while(1);}6.对于图4-5所示的电路,试编程实现如下功能:每按动K0按键一次,从左向右依次点亮8个发光二极管中的一个。参考程序:#include <reg51.h> //51系列单片机头文件#include <intrins.h> //包含_crol_函数所在的头文件#define ucharunsignedchar //宏定义uchar temp; //定义一个变量,用来给P1口赋值void main() //主函数{ EA=1; //开总中断 EX0=1; //开外中断0 PX0=1; //外中断0设成高级别中断 IT0=1; //外中断0设成边沿触发 temp=0x7f; //赋初值,预备右边第一个灯亮while(1);}void int0()interrupt0using0//外部中断1的中断服务函数{P1=temp;temp=_cror_(temp,1)}7.对于图4-5所示的电路,试编程实现如下功能:当无外部中断请求时,每隔1s,从左向右依次点亮8个发光二极管中的1个;当按键K0被按下时,上下4只发光二极管交替闪烁显示(假设二极管点亮及熄灭的时间都是1s),闪烁8次后,返回中断前状态;当按键K1被按下时,8只发光二极管全部闪烁(假设二极管点亮及熄灭的时间都是1s),闪烁10次后,返回中断前状态。假设系统时钟频率为12MHz,外部中断0为低优先级,外部中断1为高优先级。参考程序:#include <reg51.h> //51系列单片机头文件#include <intrins.h> //包含_crol_函数所在的头文件#define ucharunsignedchar //宏定义#define uintunsignedint //宏定义uchar temp; //定义一个变量,用来给P1口赋值void delaynms(uintn) //延时nms函数{uint i,j;for(i=0;i<n;i++)for(j=0;j<125;j++);}void main() //主函数{ EA=1; //开总中断 EX1=1; EX0=1; PX1=1; PX0=0; IT1=1; IT0=1; temp=0x7f; //赋初值,预备左边第一个灯亮while(1){P1=temp; //输出到P1口 temp=_cror_(temp,1); delaynms(1000); //延时1s}void int0()interrupt0{ucharm;for(m=0;m<8;m++){P1=0x0f; delaynms(1000); //延时1sP1=0xf0; delaynms(1000); }}void int1()interrupt2{ucharn;for(n=0;n<10;n++){P1=0; delaynms(1000); P1=0xff; delaynms(1000); }}8.假设多故障检测电路如图4-8所示,试编程实现如下功能:当系统无故障时,4个故障源输入端X1~X4全为高电平,对应的4个显示灯全灭;当某个设备出现故障时,点亮对应的发光二极管。其中,发光二极管LED1~LED4对应4个输入端X1~X4,X1~X4与P1口的P1.0~P1.3引脚相连,4个发光二极管LED1~LED4分别与P1口的P1.4~P1.7相连。图4-8多故障检测电路#include <reg51.h> //51系列单片机头文件sbit X1=P1^0; //将X1定义为P1.0引脚sbit X2=P1^1; //将X2定义为P1.1引脚sbit X3=P1^2; //将X3定义为P1.2引脚sbit X4=P1^3; //将X4定义为P1.3引脚sbit LED1=P1^4; //将LED1定义为P1.4引脚sbit LED2=P1^5; //将LED2定义为P1.5引脚sbit LED3=P1^6; //将LED3定义为P1.6引脚sbit LED4=P1^7; //将LED4定义为P1.7引脚void main() //主函数{ EA=1; //开总中断 EX1=1; //开外中断0 IT1=1; //外中断0设成边沿触发 P1=0xff; //令发光二极管熄灭,同时在输入数据前先向对应口输出“1”while(1); //循环等待}void int1()interrupt2 //外部中断0的中断服务函数{if(X1==0)LED1=0; //判断设备X1是否故障?if(X2==0)LED2=0; //判断设备X2是否故障?if(X3==0)LED3=0; //判断设备X3是否故障?if(X4==0)LED3=0; //判断设备X4是否故障?}3.假设系统时钟频率为12MHz,利用定时器T0编程实现如下功能:使P1.0引脚上输出一个周期为40ms的方波。计算初值X:X=216-20000us/1us=65536-20000=45536=B1E0H因此T0的初值为TH0=0B1H,TL0=0E0H。参考程序:#include <reg51.h> //51系列单片机头文件sbit P1_0=P1^0 ; //位定义void main() //主函数{ TMOD=0x01; //设T0工作在方式1,定时模式TH0=0xb1; //装入计数初值TL0=0xe0;EA=1; //开总中断 ET0=1; //T0开中断 TR0=1; //启动T0 while(1); //等待中断}void counter0()interrupt1 //T0的中断服务函数{P1_0=!P1_0; //P1.0位取反TH1=0xb1; //重新装载计数初值TL1=0xe0;}4.假设系统时钟频率为6MHz,编程实现用定时器T1产生定时脉冲,每隔2ms从P1.5引脚输出脉宽为3个机器周期的正脉冲。计算初值X:X=65536-2000us/2us=65536-1000=64536=FC18H因此T1的初值为TH1=0FCH,TL1=18H。参考程序(采用中断工作方式):#include <reg51.h> //51系列单片机头文件#include<intrins.h> //包含_nop_函数所在的头文件sbit P1_5=P1^5 ; //位定义void main() //主函数{ TMOD=0x10; //设T1工作在方式1,定时模式TH1=0xfc; //装入计数初值TL1=0x18;EA=1; //开总中断 ET1=1; //T0开中断 TR1=1; //启动T0P1_5=0; //将输出口P1的第0位清0(输出脉冲的起始值) while(1); //等待中断}void timer1()interrupt3 //T1的中断服务函数{P1_5=1; //产生脉冲信号高电平_nop_();_nop_(); P1_5=0; //产生脉冲信号低电平 TH1=0xfc; //重新装载计数初值TL0=0x18;}5.假设系统时钟频率为12MHz,利用定时器T1编程实现如下功能:要求从P2.1引脚输出一个脉冲波形,高电平持续3ms,低电平持续10ms。分析:(1)选择工作方式:因为Tcy=12/fosc=1us,由定时器各种工作方式的特性,可计算出方式1最长可定时65.536ms,方式2、3最长可定时256us。本题中定时时间t1=3ms、t2=10ms选择T0的工作方式1来完成此任务。假设此时T1不工作,则方式控制字为TMOD=01H。(2)计算初值X:高电平初值:X1=65536-3000us/1us=65536-3000=62536=F448H因此T0的初值为TH0=0F4H,TL0=48H。低电平初值:X2=65536-10000us/1us=65536-10000=55536=D8F0H因此T0的初值为TH0=0D8H,TL0=0F0H。参考程序(采用中断工作方式):#include <reg51.h> //51系列单片机头文件sbit P2_1=P2^1 ; //位定义bitflag=0;//定义一个位变量,实现高低电平切换void main() //主函数{ TMOD=0x01; //设T0工作在方式1,定时模式EA=1; //开总中断 ET0=1; //T0开中断 TH0=0xd8; //装入低电平计数初值TL0=0xf0;P2_1=0; //将输出口P2的第1位清0TR0=1; //启动T0,(输出低电平开始) while(1); //等待中断}void timer0()interrupt1 //T0的中断服务函数{flag=!flag; if(flag==0){P2_1=0; TH0=0xd8; //装入低电平计数初值TL0=0xf0;}else{P2_1=1; TH0=0xf4; //装入高电平计数初值TL0=0x48;} }6.假设系统时钟频率为12MHz,改写例5-7的程序,使之变成通过定时器0实现8个发光二极管每隔2s从左向右依次循环点亮。计算计数初值:X=65536-50000us/1us=15536=3CB0H因此TH0=3CH,TL0=B0H。(3)20次计数的实现:采用循环程序的方法实现中断20次计数。参考程序:#include <reg51.h> //51系列单片机头文件#include <intrins.h> //包含_cror_函数所在的头文件#define ucharunsignedchar //宏定义uchar num; //循环计数器初值void main() //主函数{ TMOD=0x01; //设T0工作在方式1,定时模式TH0=0x3c; //装入计数初值TL0=0xb0;EA=1; //开总中断 ET0=1; //T0开中断 TR0=1; //启动T1num=0; //记录中断次数 P2=0xfe; //点亮最右边发光二极管while(1); //等待中断}void timer0()interrupt1 //T0的中断服务函数{num++; //中断次数加1if(num==40) //判断是否到达循环次数,50ms×20=1s{num=0; //重新计数P2=_cror_(P2,1); //左环移一次}TH0=0x3c; //重新装载计数初值TL0=0xb0;}7.假设系统时钟频率为12MHz,利用定时器T0设计两个不同频率的方波,P1.0输出频率为200Hz,P1.1输出频率为100Hz。因为连个方波的频率是倍数关系,所以只计算频率高的初值。计算初值X:X=65536-2500us/1us=65536-2500=63036=F63CH因此T0的初值为TH0=0F6H,TL0=3CH。参考程序(采用中断工作方式):#include <reg51.h> //51系列单片机头文件sbit P200=P1^0 ; //位定义sbit P100=P1^1 ;unsignedcharx=0;void main() //主函数{ TMOD=0x01; //设T0工作在方式1,定时模式EA=1; //开总中断 ET0=1; //T0开中断 TH0=0xf6; //装入低电平计数初值TL0=0x3c;TR0=1; //启动T0,(输出低电平开始) while(1); //等待中断}void timer0()interrupt1 //T0的中断服务函数{P200=!P200;x++; if(x==2)//进两次中断后取反{P100=!P100;x=0;}TH0=0xf6; //装入低电平计数初值TL0=0x3c;} }8.假设系统时钟频率为12MHz,利用定时器T0编程实现如下功能:要求从P1.7引脚输出一个脉冲频率为2kHz、占空比为7:10的脉冲宽度调制(PWM)信号。计时的时间为整个周期的1/10,1➗2000➗10=50us,因而采用T0的方式2计算初值X:X=256-50us/1us=256-50=206因此T0的初值为TH0=206,TL0=206。参考程序(采用中断工作方式):#include <reg51.h> //51系列单片机头文件sbit P1.7=P1^7 ; //位定义void main() //主函数{unsignedcharx=0; TMOD=0x02; //设T0工作在方式1,定时模式EA=1; //开总中断 ET0=1; //T0开中断 TH0=206; //装入低电平计数初值TL0=206;TR0=1; //启动T0,(输出低电平开始) while(1); //等待中断}void timer0()interrupt1 //T0的中断服务函数{x++; if(x<7)//进两次中断后取反{P1.7=1;}elseif(x<10){P1.7=0;}elsex=0;}设计一个MCS-51单片机的双机通信系统,试编程将甲机片內RAM的30H~3FH的数据块通过串行口发送到乙机片外RAM的1000H~100FH单元中去,要求接收和发送均采用中断方式。设晶振频率为11.0592MHz,波特率为2400b/s。(1)求初值:假设SMOD=0(2)参考程序(中断方式)//甲机发送#include <reg51.h> #define ucharunsignedchardataucharbuffer1[16]_at_0x30;uchari; void main() {i=0;SCON=0x40;TMOD=0x20;TH1=0xf4;TL1=0xf4;TR1=1;EA=1;ES=1;SBUF=buffer1[i];//启动串行发送while(1);}voidsend()interrupt4{TI=0;i++;SBUF=buffer1[i];if(i==15)ES=0;}//乙机接收#include<reg51.h> #define ucharunsignedcharxdatauchar buffer2[16]_at_0x1000;uchari; void main() { i=0;SCON=0x50;TMOD=0x20;TH1=0xf4;TL1=0xf4;TR1=1;EA=1;ES=1;while(1);}voidreceiver()interrupt4{RI=0;buffer2[i]=SBUF;i++;if(i==16)ES=0;}参考程序(查询方式)//甲机发送#include <reg51.h> #define ucharunsignedchardataucharbuffer1[16]_at_0x30;uchari; void main() {SCON=0x40;TMOD=0x20;TH1=0xf4;TL1=0xf4;TR1=1;for(i=0;i<16;i++){SBUF=buffer1[i];//启动串行发送while(!TI);TI=0;}while(1);}//乙机接收#include<reg51.h> #define ucharunsignedcharxdatauchar buffer2[16

温馨提示

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

评论

0/150

提交评论