版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
PAGE17《单片机技术及C51程序设计》(第2版)习题解(注:问答题略)习题1部分习题解1-1给出下列有符号数的原码、反码和补码(设计算机字长为8位)。+37-86-105+112-79解:+37:原码=00100101B;反码=00100101B;补码=00100101B-86:原码=11010110B;反码=10101001B;补码=10101010B-105:原码=11101001B;反码=10010110B;补码=10010111B+112:原码=01110000B;反码=01110000B;补码=01110000B-79:原码=11001111B;反码=10110000B;补码=10110001B1-28位补码表示的定点整数的范围是多少?解:-128~+1271-3已知X、Y是两个有符号数的定点整数,它们的补码为:[X]补=00010011B,[y]补=11111001B,求[X+Y]补等于多少?解:[X+Y]补=[X]补+[y]补=00001100B1-4请选择正确答案填在括号中:将-33以补码形式存入8位寄存器中,寄存器中的内容为(A)A.DFH B.A1H C.5FH D.DEH1-5请选择正确答案填在括号中:如果X为负数,由[X]补求[-X]补是将(D)A.[X]补各值保持不变B.[X]补符号位变反,其他各位不变C.[X]补除了符号位外,各位变反,末位加1D.[X]补连同符号位一起各位变反,末位加11-6请选择正确答案填在括号中:设有二进制数X=-1101110,若采用8位二进制数表示,则[X]补的结果是(D)。A.11101101 B.10010011 C.00010011 D.100100101-78051与8751的区别是(C)A.内部数据存储数目的不同 B.内部数据存储器的类型不同C.内部程序存储器的类型不同 D.内部寄存器的数目不同1-8单片机与普通计算机的不同之处在于其将(CPU)(存储器)和(I/O接口)三部分集成于一块芯片上(的单片微机)1-9MCS-51单片机内部提供了哪些资源?略1-10单片机有哪些应用特点?主要应用在哪些领域?略1-11MCS-51单片机如何进行分类?各类有哪些主要特性?略习题2部分习题解2-1填空题1.MCS-51单片机中P3端口的第5位(P3.5)的位地址是(B5H)。2.堆。3.MCS-51系列单片机的一个机器周期包含(6)个时钟周期。4.MCS-50)组,此时R0~R7对应的地址范围是(00H)~(07H)。5.设(PSW)=88,则Cy=(1),P=(0)。选择的是第(1)组通用寄存器,该组寄存器在片内RAM中的地址为(08H~0FH)。6.单片机的特殊功能寄存器只能采用(直接)寻址方式。7.如果8051单片机采用6MHz的晶振,那么该系统一个机器周期为(2)微秒(µs),一个状态周期(或称时钟周期)为(2/6)微秒(µs)。8.8051单片机采用12MHz的晶振频率,设无外扩存储器,单片机运行时ALE引脚输出的正脉冲的频率是(2)MHz。2-2选择题1.若RS0=0,RS1=0,则当前使用的工作寄存器组为(A)。A.第0组 B.第1组 C.第2组 D.第3组2.若Fosc=12MHz,则8051的机器周期为(B)。A.0.5s B.1s C.2s D.4s3.堆栈遵循的原则是(B)。A.先进先出,后进先出 B.先进后出,后进先出C.先进先出,后进后出 D.先进后出,后进后出4.8051有(B)个可编程的16位定时/计数器。A.1 B.2 C.3 D.45.MCS-5l单片机中不是准双向I/O接口的是(A)。A.P0 B.P1 C.P2 D.P36.在MCS-51系统中扩展一片2732(EPROM存储芯片,容量4K×8)需要(C)根地址线。A.10 B.11 C.12 D.137.8051单片机有(C)个中断源。A.3 B.4 C.5 D.68.片内RAM的20H~2FH为位寻址区,所包含的位地址是(B)。A.00H~20H B.00H~7FH C.20H~2FH D.00H~FFH10.8051单片机复位后的P0~P3的值为(D)。A.00H B.0FH C.F0H D.FFH2-3简答题(略)1.简述在MCS-51系列单片机中哪些地址单元具有位地址?2.MCS-51系列单片机的P0~P3口有何使用特点?各自的第二功能是哪些?3.决4.MCS-51系列单片机的PSW寄存器各位标志的意义是什么?若PSW=91H,请问其包含的信息是什么?5.MCS-51系列单片机由哪几个功能部件组成?6.MCS-51系列单片机的存储器结构有何特点?存储器的空间如何划分?各地址空间的寻址范围是多少?7.MCS-51系列单片机的控制总线主要信号有哪些?各信号的作用如何?8.MCS-51系列单片机有哪几种低功耗工作模式?简述这几种低功耗工作模式特点及退出该低功耗模式的方法。9.MCS-51系列单片机在存储器组织上分为四个物理上相互独立的空间,单片机是如何实现对这四个空间进行访问的?习题4部分习题解4-1C语言有哪些特点?略4-2有哪些数据类型是MCS-51单片机直接支持的?略4-3C51特有的数据结构类型有哪些?略4-4C51中存储类型有几种,它们分别表示的存储器区域是什么?略4-5C51中,bit位与sbit位有什么区别?略4-6在C51中,通过绝对地址来访问存储器的有几种?略4-7在C51中,中断函数与一般函数有什么不同?略4-8按给定存储器类型和数据类型,写出下列变量的说明形式。在data区定义字符变量va11。解:chardataval1;在idata区定义整型变量va12。解:intidataval2;在xdata区定义无符号字符数组va13[4]。解:externcharxdatava13[4];在xdata区定义一个指向类型的指针px。解:uintxdata*px;定义可寻址位变量flag。解:bitbdataflag;定义特殊功能寄存器变量p3。解:sfrP3=0xB0;定义特殊功能寄存器变量SCON。解:sfrSCON=0xB8;定义16位的特殊功能寄存器T0。解:sfr16T0=0x8C8A;4-9写出下列关系表达式或逻辑表达式的结果,设a=3,b=4,c=5。a+b>c&&b==c解:a+b>c&&b==c不成立,结果为假(0)a‖b+c&&b-c解:a‖b+c&&b-c表达式为非零,逻辑结果为1!(a>b)&&!c‖1解:!(a>b)&&!c‖1表达式为非零,逻辑结果为1!(a+b)+c1&&b+c/2解:!(a+b)+c1&&b+c/2表达式为非零,逻辑结果为14-10在C51语言中,设变量a,b都为unsignedchar类型,a=78(十进制),b=209(十进制),用十六进制表示以下表达式的计算结果:a&b=ox40;a^b=0xdf;b>>2=0x34;~a=0xb1;(a>b)?a:b=0xd1。4-11C51程序是基于MCS-51系列单片机的C程序,在C51程序中,int型数据所能表示的数值范围是多少?。解:-32768~+327674-13用分支结构编程实现,当输入“1”显示“A”,输入“2”显示“B”,输入“3”显示“C”,输入“4”显示“D”,输入“5”结束。解:…switch(grade)case'1':printf("A\n");break;case'2':printf("B\n");break;case'3':printf("C\n");break;case'4':printf("D\n");break;case'5':printf("END\n");break;default:printf("error"\n)}4-14输入三个无符号字符数据,要求按由大到小的顺序输出。解:#include<reg52.h> //包含特殊功能寄存器库#include<stdio.h> //包含I/O函数库voidmain(void) //主函数{inta,b,c,t; //定义整型变量a,b,c,tSCON=0x52; //串口初始化TMOD=0x20;TH1=0XF3;TR1=1;printf("inputa,b,c:\n"); //输出提示信息scanf("%d,%d,%d",&a,&b,&c); //输入a,b和c的值,无符号数据。printf("\n");//输出换行if(a>b){t=a;a=b;b=t;}if(a>c){t=a;a=c;c=t;}if(b>c){t=b;b=c;c=t;} printf("%d,%d,%d",c,b,a); while(1); //结束}4-15用三种循环结构编写程序实现输出1到10的平方之和。解:1、通过while语句实现计算并输出1到10的平方之和。#include<reg52.h> //包含特殊功能寄存器库#include<stdio.h> //包含I/O函数库voidmain(void) //主函数{inti,s=0; //定义整型变量i和si=1;SCON=0x52; //串口初始化TMOD=0x20;TH1=0Xf3;TR1=1;while(i<=10) //累加1~10的平方之和在s中{s=s+i*i;i++;}printf("%d\n",s);while(1);}2、通过do...while语句实现计算并输出1到10的平方之和。#include<reg52.h> //包含特殊功能寄存器库#include<stdio.h> //包含I/O函数库voidmain(void) //主函数{inti,s=0; //定义整型变量i和si=1;SCON=0x52; //串口初始化TMOD=0x20;TH1=0Xf3;TR1=1;do {s=s+i*i;//累加1~10的平方之和在s中i++;}while(i<=10);printf("%d\n",s);while(1);}3、用for语句实现计算,并输出1到10的平方之和。#include<reg52.h> //包含特殊功能寄存器库#include<stdio.h> //包含I/O函数库voidmain(void) //主函数{inti,s=0; //定义整型变量i和si=1;SCON=0x52; //串口初始化TMOD=0x20;TH1=0Xf3;TR1=1;for(i=1;i<=10;i++)s=s+i*i; //累加1~10的平方之和在s中printf("d\n",s);while(1);}4-16对一个5个元素的无符号字符数组按由小到大顺序排序。解:#include<reg52.h> //包含特殊功能寄存器库#include<stdio.h> //包含I/O函数库voidmain(void) //主函数{inti,j,min,temp,a[5]; //定义整型变量x和ySCON=0x52; //串口初始化TMOD=0x20;TH1=0XF3;TR1=1;printf("input:\n"); //输出提示信息for(i=0;i<5;i++){printf("a[%d]=",i);scanf("%d",&a[i]);}for(i=0;i<5-1;i++)//排序{min=i;for(j=i;j<5;j++)if(a[min]>a[j])min=j;temp=a[j];a[j]=a[min];a[min]=temp;}for(i=0;i<5;i++)//输出printf("%5d",a[i]);}4-17用指针实现,输入3个无符号字符数据,按由大到小的顺序输出。解:#include<reg52.h> //包含特殊功能寄存器库#include<stdio.h> //包含I/O函数库voidmain(void) //主函数{inta,b,c,t; //定义整型变量a,b,c,tint*p,*p1,*p2,*p3;//定义指针变量SCON=0x52; //串口初始化TMOD=0x20;TH1=0XF3;TR1=1;printf("inputa,b,c:\n"); //输出提示信息scanf("%d,%d,%d",&a,&b,&c); //输入a,b和c的值,无符号数据。printf("\n");//输出换行p1=&a;p2=&b;p3=&c;if(a>b){p=p1;p1=p2;p2=p;}if(a>c){p=p1;p1=p3;p3=p;}if(b>c){p=p2;p2=p3;p3=p;} printf("%d,%d,%d",*p3,*p2,*p1); while(1); //结束}4-18有3个学生,每个学生包括学号、姓名、成绩,要求找出成绩最高的学生的姓名和成绩。解:#include<reg52.h> //包含特殊功能寄存器库#include<stdio.h> //包含I/O函数库Structstudent{charnum[6];charname[8];intscore[4];}stu[3];voidmain(void) //主函数{inti,tem,max,maxi;printf("input3studentinformation:\n");//提示输入信息for(i=0;i<3;i++){printf("name:");//提示输入姓名scanf("%s,stu[i].name);printf("studentid:");//提示输入学号scanf("%s,stu[i].num);printf("score:");//提示输入分数scanf("%d,stu[i].score);}max=0;maxi=0;for(i=0;i<3;i++){tem=0;tem=stu[i].score;if(tem>max){max=tem;maxi=i;}printf("student%s,maxscore:%d.",stu[maxi].name.num,max);//打印}习题5部分习题解5-15单片机用内部定时方法产生频率为10kHz方波,设单片机晶振频率fosc为12MHz,请编程实现。解:频率10kHz的方波,其周期为:T=1/10k=100us,定时时间为50us。设选用定时器0,方式2,10kHz方波从P1.0口输出。C51参考程序:#include<reg51.h> //包含特殊功能寄存器库sbitP1_0=P1^0;voidmain(){ TMOD=0x02; //使用定时器T0的模式2 TH0=256-50; //定时器T0的高8位赋初值 TL0=256-50; //定时器T0的低8位赋初值 EA=1; //开总中断 ET0=1; //定时器T0中断允许 TR0=1; //启动定时器T0 while(1);}voidtime0_int(void)interrupt1 //中断服务程序{P1_0=!P1_0; //取反 }5-16使用定时器0以定时方法在P1.0输出周期为400s,占空比为20%的矩形脉冲,设单片机晶振频率fosc为12MHz,编程实现。解:其周期为400μs,占空比为20%的矩形脉冲,即定时时间分别为输出高电平80μs,输出低电平320μs(是输出高电平的4倍)。根据题意,选用定时器0,方式1,从P1.0口输出。C51参考程序:#include<reg51.h> //包含特殊功能寄存器库sbitP1_0=P1^0;sbitf;sbiti;voidmain(){ TMOD=0x02; //使用定时器T0的模式1 TH0=256-80; //定时器T0的高8位赋初值 TL0=256-80; //定时器T0的低8位赋初值 EA=1; //开总中断 ET0=1; //定时器T0中断允许 TR0=1; //启动定时器T0f=1; while(1);}voidtime0_int(void)interrupt1 //中断服务程序{if(f==1)(P1_0=0;F=0; )else(i++;if(i==4)(P1_0=1;f-1;))}5-23参照图5-2电路图,编程实现灯亮移位程序,要求8只发光二极管每次点亮一个,点亮时间为250ms,顺序是从下到上一个一个地循环点亮。设fosc=6MHz。解:fosc=6MHz,每个机器周期=2us。C51参考程序:#include<reg51.h>unsignedcharcodetable[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};unsignedchari,j;voidmain(void){TMOD=0x01;TH0=(65536-25000)/256;TL0=(65536-25000)%256;EA=1;ET0=1;i=0;j=0;TR0=1;while(1);}voidtime0_int(void)interrupt1TH0=(65536-25000)/256;TL0=(65536-25000)%256;j++;if(j==5){j=0;if(i!=7){P1=table[i];i++;}else{P1=table[i];i=0;}}5-24利用单片机的串行口扩展并行I/O接口,控制16个发光二极管依次发光,请画出电路图且编程实现。解:电路图如下所示:C51参考程序:#include<reg51.h>//包含特殊功能寄存器库#include<intrins.h>//包含函数_nop_()定义的头文件sbitP1_7=P1^7;unsignedcharcodetable[]={0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80};voidmain(){unsignedcharj,i;SCON=0x00;j=0;for(;;){ P1_7=0; _nop_();//延时一个机器周期 _nop_();//延时一个机器周期,保证清0完成P1_7=1; SBUF=table[j];j++; while(!TI){;} TI=0;SBUF=table[j];j++; while(!TI){;} TI=0; for(i=0;i<=3000;i++){;}//延时 if(j==16)j=0;}}习题7部分习题解7-5修改本章例7-8的程序,用数组表的方式编程实现在图7-18所示电路上动态显示“1234”。解:C51参考程序:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharcode[4]={0xfe,0xfd,0xfb,0xf7};//位选码表uchartel[4]={0x06,0x5b,0x4f,0x66};//共阴极1,2,3,4字段吗voiddelay(void) //延时函数,延时一段时间{uchari,j; for(i=0;i<250;i++) for(j=0;j<250;j++);}voidmain(void){uchark,d;while(1) //无限循环{for(k=0;k<4;k++){P2=code[k]; //送出位选码P0=tel[k];delay(); //延时}}}7-6参照图7-18动态显示接口电路,试编写一段程序,在6个数码管上从右到左依次显示一个“3”字,直至出现6个“3”字为止。解:设数码管增至6个,为共阴极。C51参考程序:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharcode[6]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0};//位选码表voiddelay(uinti)//延时函数{uintj;for(j=0;j<i;j++){}}voidmain(void){uchark,d;P0=0x4f;//3的字段码for(k=0;k<6;k++){P2=code[k];//送出位选码delay(200);//延时10ms}}7-7参照上题编写一段程序,在6个数码管上从左到右循环显示一个“8”字(每次只点亮一个数码管)。解:设数码管增至6个,为共阴极。C51参考程序:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintucharcode[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf}; //位选码表voiddelay(uinti) //延时函数{uintj;for(j=0;j<i;j++){}}voidmain(void){uchark,d;P0=0x7f; //8的字段码while(1) //无限循环{for(k=0;k<6;k++){P2=code[k]; //送出位选码delay(200); //延时10ms}}}7-8试编写一段程序,在图7-18所示的动态显示接口电路上先从左到右循环显示一个P字,循环3次后,显示自己学号的后6位。解:设数码管增至6个,为共阴极。C51参考程序:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedintuchardisbuffer[8]={2,0,1,2,0,4};//学号的后6位ucharcodevalue[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//0~F的字段码表ucharcode[6]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//位选码表voiddelay(uinti)//延时函数{uintj;for(j=0;j<i;j++){}}voidmain(void){uchark,d;P0=0x73;//P的字段码for(d=0;k<3;d++)//“P”循环3遍{for(k=0;k<6;k++){P2=code[k];//送出位选码delay(200);//延时10ms}}while(1){display();//调显示函数}}//***********显示函数voiddisplay(void)//定义显示函数{uchari,p,temp;for(i=0;i<6;i++){p=disbuffer[i];//取学号当前显示的字符temp=codevalue[p];//查得学号显示字符的字段码P0=temp;//送出字段码temp=code[i];//取当前的位选码P2=temp;//送出位选码delay(20);//延时1ms}i=0;}习题8部分习题解8-4设已知8051单片机的晶振频率为12MHz,0809口地址为CFFFH,采用中断工作方式,要求对8路模拟信号不断循环A/D转换,转换结果存入以30H为首地址的内RAM中。请画出该8路采集系统的电路图,并编写程序。解:电路图如下图示:C语言中断方式参考程序:#include<reg51.h>#include<absacc.h> //定义绝对地址访问#defineucharunsignedchar#defineIN0XBYTE[0xCFF8] //定义IN0为通道0的地址staticuchardatax[8]; //定义8个单元的数组,存放结果ucharxdata*ad_adr; //定义指向通道的指针uchari=0;voidmain(void){IT0=1; //初始化EX0=1;EA=1;i=0;dataucharx[0]=0x30;ad_adr=&IN0; //指针指向通道0*ad_adr=i; //启动通道0转换for(;;){;} //等待中断}voidint_adc(void)interrupt0 //中断函数{x[i]=*ad_adr; //接收当前通道转换结果i++;ad_adr++; //指向下一个通道if(i<8){*ad_adr=i; //8个通道未转换完,启动下一个通道返回}}8-5在题8-2中,假如0809的口地址为FEFFH,采用P1.7查询方式,请画出相应的电路连接图,并编写对该8路模拟信号依次A/D转换后求出累加和,分别放入30H、31H单元的程序。解:电路图如下图示:C语言查询方式参考程序:#include<reg51.h>#include<absacc.h> //定义绝对地址访问#defineucharunsignedchar#defineIN0XBYTE[0xFEF8] //定义IN0为通道0的地址ucharpdata*dp1,*dp2; //定义2个指针变量,存放结果ucharxdata*ad_adr; //定义指向通道的指针sbitp1_7=p1^7;uchartem,j,i=0;intsum=0;voidmain(void){IT0=1; //初始化p1_7=1;dp1=0x30;dp2=0x31;ad_adr=&IN0; //指针指向通道0*ad_adr=i; //启动通道0转换do{if(p1_7=0){tem=*ad_adr;sum=sum+tem;i++;ad_adr++;*ad_adr=i;}}while(i<8);*dp1=tem/256;*dp2=tem%256;while(1);}8-8试画出DAC0832单缓冲典型应用电路,并编程设计一个频率为50Hz的矩形波发生电路。解:频率为50Hz的矩形波其周期为20ms,即定时为10ms。电路图如下图示:C语言参考程序:#include<reg51.h>#include<absacc.h> //定义绝对地址访问#defineucharunsignedchar#defineDAC0832XBYTE[0xFFFE]voiddelay(void);voidmain(){uchari;while(1){TMOD=0X01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;EA=1;ET0=1;i=0;DAC0832=0; //输出低电平TR0=1;//开始定时DAC0832=0xff; //输出高电平TR0=1; //开始定时}}Voidtime0(void)interrupt1//中断服务程序,定时10ms{TH0=(65536-10000)/256;TL0=(65536-10000)%256;i++;if(i==50){TR0=0;i=0;}习题9部分习题解9-1简述RT-1602C液晶显示模块的各引脚功能。略9-2利用书中给出的LCD显示函数,编程并实现在RT-1602C液晶显示模块的第一行显示“2016年9月10日星期六,第二行显示14∶20∶15”。解:#include<reg51.h>#defineucharunsignedsbitRS=P2^0;sbitRW=P2^1;sbitE=P2^7;voiddelay(void);voidinit(void);voidwc51r(ucharj);voidwc51ddr(ucharj);voidfbusy(void);//主函数voidmain(){Sp=0x50;Init();wc51r(0x80); //写入显示缓冲区起始地址为第1行第1列wc51ddr(0x32); //第1行第1列显示数字“2”wc51ddr(0x30); //第1行第2列显示数字“0”wc51ddr(0x31); //第1行第3列显示数字“1”wc51ddr(0x36); //第1行第4列显示数字“6”wc51ddr(0x2E); //第1行第5列显示符号“.”wc51ddr(0x39); //第1行第6列显示数字“9”wc51ddr(0x2E); //第1行第7列显示符号“.”wc51ddr(0x31); //第1行第8列显示数字“1”wc51ddr(0x30); //第1行第9列显示数字“0”wc51r(0Xc0); //写入显示缓冲区起始地址为第2行第1列wc51ddr(0x31); //第2行第1列显示数字“1”wc51ddr(0x34); //第2行第2列显示数字“4”wc51ddr(0x3A); //第2行第3列显示符号“:”wc51ddr(0x32); //第2行第4列显示数字“2”wc51ddr(0x30); //第2行第5列显示数字“0”wc51ddr(0x3A); //第2行第6列显示符号“:”wc51ddr(0x31); //第2行第7列显示数字“1”wc51ddr(0x35); //第2行第8列显示数字“5”while(1);}//初始化函数voidinit(){wc51r(0x01); //清屏wc51r(0x38); //使用8位数据,显示2行,使用5×7字形wc51r(0x0e); //显示器开,光标开,字符不闪烁wc51r(0x06); //字符不动,光标自动右移一格}//检查忙函数voidfbusy(){RS=0;RW=1;E=1;E=0;wwhile(P1&0x80); //忙,等待delay();}//写命令函数voidwc51r(ucharj){voidfbusy();E=0;RS=0;RW=0;E=1;P1=j;E=0;delay();}//写数据函数voidwc51ddr(ucharj){voidfbusy();E=0;RS=1;RW=0;E=1;P1=j;E=0;delay();}//延时函数voiddelay(){uchary;for(y=0;y<0xff;y++){;}}9-3简述I2C总线的工作过程。略9-4简述I2C总线的特点。略9-5利用RT-1602C液晶显示模块、时钟芯片DS1302和其他电路,试设计一个简单的电子时钟。程序较长,请参考教科书。略习题10部分习题解10-1参照图10-1的硬件电路,自己设计一流水灯,要求两位两位地左移一周后再右移一周,一直循环。试写出设计思路,画出流程图,并编写相应程序。解:C51参考程序:#include<reg51.h>unsignedcharcodetable[]={0xfc,0xf3,0xcf,0x3f,0xcf,0xf3};unsignedchari=0;voiddelay(void){unsignedcharm,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}voidmain(void){while(1){if(i!=6){P1=table[i];i++;delay();}elsei=0;}}10-2参照图10-9的硬件电路,设计内容:当按下S1键时,P3口的8位LED循环从左右两边向中间逐一点亮;按下S2键时,P3口的8位LED循环从中间向左右两边逐一点亮;按下S3键时,P3口的8位LED从左到右两盏循环点亮;按下S4键时,P3口的8位LED从右到左两盏循环点亮。解:C51参考程序:#include<reg51.h>sbitS1=P1^4; //将S1位定义为P1.4引脚sbitS2=P1^5; //将S2位定义为P1.5引脚sbitS3=P1^6; //将S3位定义为P1.6引脚sbitS4=P1^7; //将S4位定义为P1.7引脚unsignedcharkeyval; //储存按键值unsignedcharcodets1[]={0x7e,0xbd,0xdb,0xe7};unsignedcharcodets2[]={0xe7,0xdb,0xbd,0x7e};unsignedcharcodets3[]={0xfc,0xf3,0xcf,0x3f};unsignedcharcodets4[]={0x3f,0xcf,0xf3,0xfc};voidled_delay(void) //数码显示延时函数量{unsignedchari,j;for(i=0;i<250;i++)for(j=0;j<250;j++);}voiddelay30ms(void) //软件消抖延时{unsignedchari,j;for(i=0;i<100;i++)for(j=0;j<100;j++);}voidforward(void) //正向流水点亮{unsignedcharm;for(m=0;m<4;m++){P3=ts1[m];led_delay();}P3=0xff;}voidbackward(void) //反向流水点亮{unsignedcharn=0;for(n=0;n<4;n++){P3=ts2[n];led_delay();}P3=0xff;}voidstop(void) //灯关闭函数{unsignedchark;for(k=0;k<4;k++){P3=ts3[k];led_delay();}P3=0xff;}voidflash(void) //灯闪烁点亮函数{unsignedchard;for(d=0;d<4;d++){P3=ts4[d];led_delay();}P3=0xff;}voidkey_scan(void) //键扫描函数{if((P1&0xf0)!=0xf0) //第一次检测到有键按下delay30ms(); //延时20ms再去检测if((P1&0xf0)!=0xf0){if(S1==0) //按键S1被按下 keyval=1;if(S2==0) //按键S2被按下keyval=2;if(S3==0) //按键S3被按下keyval=3;if(S4==0) //按键S4被按下keyval=4;}}voidmain(void) //主函数{keyval=0; //按键值初始化为0,什么也不做while(1){key_scan();switch(keyval){case1:forward();break;case2:backward();break;case3:stop();break;case4:flash();break;}}}10-3参照图10-2的硬件电路,用定时器中断的方式来产生1kHz和500Hz的音频输出信号,画出流程图,并编写相应程序。解:频率1kHz,周期为1ms,定时0.5ms;频率500Hz,周期为2ms,定时1ms。设晶振频率为12MHZ.C51参考程序:#include<reg51.h> //包含特殊功能寄存器库sbitP1_0=P1^0;sbitP1_7=P1^7;sbitf;unsignedcharm,n,d;voidmain(){ TMOD=0x01; //使用定时器T0的模式1 TH0=(65536-500)/256; //定时器T0的高8位赋初值 TL0=(65536-500)%256; //定时器T0的低8位赋初值 EA=1; //开总中断 ET0=1; //定时器T0中断允许 TR0=1; //启动定时器T0f=1; while(1);}voidtime0_int(void)interrupt1 //中断服务程序{if(f==1)(n++;if(n<200){P1_0=~P1_0;}elseF=0; )else(m++;d++;if(m==2)(if(d<400){P1_0=~P1_0;m=0;}else{f=1;d=0;}))}10-4参照图10-7的硬件电路,设计一个60s的马表,试编写相应的程序。解:C51参考程序:#include<reg51.h>unsignedcharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};unsignedcharsecond;unsignedcharkeycnt;unsignedinttcnt;voidmain(void)//主函数{unsignedchari,j;TMOD=0x02;ET0=1;EA=1;second=0;P0=dispcode[second/10];P2=dispcode[second%10];while(1){if(P3_5==0){for(i=20;i>0;i--)for(j=248;j>0;j--);if(P3_5==0)//去抖动{keycnt++;//键扫描switch(keycnt){case1:TH0=0x06;TL0=0x06;TR0=1;break;case2:TR0=0;break;case3:keycnt=0;second=0;P0=dispcode[second/10];
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年葡萄糖酸铜行业分析报告及未来发展趋势报告
- 四川省阿坝员额法官遴选面试考题及答案
- 2026年其他个人护理行业分析报告及未来发展趋势报告
- 永泰县公安辅警招聘知识考试题库附答案
- 2025年物业车辆安全试题及答案
- 2026年内审员试题及答案
- 2026年介入治疗师考试题及答案
- 2026年学生会宿管部面试常见问题及答案
- 【2025年】注册城乡规划师考试题库及答案
- 2026年儿科护理学题库自考真题及答案解析
- 雨课堂学堂在线学堂云《跨文化交际英语(北京理工)》单元测试考核答案
- 2026季华实验室科研部门及公共技术部门招聘10人(广东)笔试备考试题及答案解析
- 300MW火电机组检修定额及规范
- 建工律师培训
- 2025-2030中国清真食品市场盈利模式分析及投资发展趋势预判研究报告
- 2025年安徽交控集团招聘笔试及答案
- 骨科护理中的人文关怀与沟通
- 2026年高考上海卷历史试题(附答案)
- 浅谈输水管道设计技术要求
- 2025年项目合作协议终止及风险评估
- 智能时代需要工匠精神
评论
0/150
提交评论