单片机原理与应用及C51程序设计第二版课后答案.docx
《单片机原理与应用及C51程序设计第二版课后答案.docx》由会员分享,可在线阅读,更多相关《单片机原理与应用及C51程序设计第二版课后答案.docx(40页珍藏版)》请在咨信网上搜索。
第一章1.给出下列有符号数的原码、反码和补码(假设计算机字长为8位)。 +45 -89 -6 +112 答:【+45】原=00101101,【+45】反=00101101,【+45】补=00101101 【-89】原=11011001,【-89】反=10100110,【-89】补=10100111 【-6】原=10000110,【-6】反=11111001,【-6】补=11111010 【+112】原=01110000,【+45】反=01110000,【+45】补=01110000 2. 指明下列字符在计算机内部的表示形式。 AsENdfJFmdsv120 答:41H 73H 45H 4EH 64H 66H 4AH 46H 6DH 64H 73H 76H 31H 32H 30H 3. 什么是单片机? 答:单片机是把微型计算机中的微处理器、存储器、I/O接口、定时器/计数器、串行接口、中断系统等电路集成到一个集成电路芯片上形成的微型计算机。因而被称为单片微型计算机,简称为单片机。 4. 单片机的主要特点是什么? 答:主要特点如下: 1) 在存储器结构上,单片机的存储器采用哈佛(Harvard)结构 2) 在芯片引脚上,大部分采用分时复用技术 3) 在内部资源访问上,采用特殊功能寄存器(SFR)的形式 4) 在指令系统上,采用面向控制的指令系统 5) 内部一般都集成一个全双工的串行接口 6) 单片机有很强的外部扩展能力 5. 指明单片机的主要应用领域。 答:单机应用:1) 工业自动化控制;2) 智能仪器仪表;3) 计算机外部设备和智能接口;4) 家用电器 多机应用:功能弥散系统、并行多机处理系统和局部网络系统。 第二章 1. MCS-51单片机由哪几个部分组成? 答:MCS-51单片机主要由以下部分组成的:时钟电路、中央处理器(CPU)、存储器系统(RAM和ROM)、定时/计数器、并行接口、串行接口、中断系统及一些特殊功能寄存器(SFR)。 2. MCS-51的标志寄存器有多少位,各位的含义是什么? 答:MCS-51的标志寄存器PSW有8位; D7 D6 D5 D4 D3 D2 D1 D0 C AC F0 RS1 RS0 OV - P 含义如下: C(PSW.7):进位或借位标志位。 AC(PSW.6):辅助进位或借位可标志位。 F0(PSW.5):用户标志位。是系统预留给用户自己定义的标志位。 RS1、RS0(PSW.4、PSW.3):寄存器组选择位。可用软件置位或清零,用于从四组工作寄存器中选定当前的工作寄存器组。 OV(PSW.2):溢出标志位。在加法或减法运算时,如运算的结果超出8位二进制数的范围,则OV置1,标志溢出,否则OV清零。 P(PSW.0):奇偶标志位。用于记录指令执行后累加器A中1的个数的奇偶性。若累加器A中1的个数为奇数,则P置位,若累加器A中1的个数为偶数,则P清零。 其中PSW.1未定义,可供用户使用。 3. 在8051的存储器结构中,内部数据存储器可分为几个区域?各有什么特点? 答:片内数据存储器按功能可以分成以下几个部分:工作寄存器组区、位寻址区、一般RAM区和特殊功能寄存器区,其中还包含堆栈区。工作寄存器组区,00H~1FH单元,可用R0~R7等8个寄存器访问;位寻址区,20H~2FH单元,可按位方式访问;一般RAM区,30H~7FH单元;堆栈区,可从08到7F单元;特殊功能寄存器区位于80H~FFH单元。 4. 什么是堆栈?说明MCS-51单片机的堆栈处理过程。 答:堆栈是按先入后出、后入先出的原则进行管理的一段存储区域。CS-51单片机的堆栈是向上生长型的,存入数据是从地址低端向高端延伸,取出数据是从地址高端向低端延伸。入栈和出栈数据是以字节为单位的。入栈时,SP指针的内容先自动加1,然后再把数据存入到SP指针指向的单元;出栈时,先把SP指针指向单元的数据取出,然后再把SP指针的内容自动减1。 5. MCS-51单片机有多少根I/O线?它们和单片机的外部总线有什么关系? 答:MCS-51单片机有32根I/O线,由P0口经地址锁存器提供低8位(A7~A0),P2口提供高8位(A15~A8)而形成。数据总线宽度为8位,由P0口直接提供。控制总线由第二功能状态下的P3口和4根独立的控制线RST、EA、ALE和PSEN组成。 6. 什么是机器周期? MCS-51单片机的一个机器周期包括多少个时钟周期? 答:机器周期:机器周期是单片机的基本操作周期,每个机器周期包含S1、S2、¼、S66个状态,每个状态包含两拍P1和P2,每一拍为一个时钟周期(振荡周期)。因此,一个机器周期包含12个时钟周期。 7. 如果时钟周期的频率为12MHz,那么ALE信号的频率为多少? 答:2MHZ 第三章 1.在MCS-51单片机中,寻址方式有几种?其中对片内RAM可以用哪几种寻址方式?对片外RAM可以用哪几种寻址方式? 答:寻址方式 2.在对片外RAM单元寻址中,用Ri间接寻址与用DPTR间接寻址有什么区别? 答:片外数据存储器寻址中,用Ri间接寻址只能访问低端的256字节单元,而用DPTR作指针间接访问可访问整个64K字节。 3.在位处理中,位地址的表示方式有哪几种? 答:1.直接位地址(00H~0FFH)。例如:20H 2.字节地址带位号。例如:20H.3表示20H单元的3位。 3.特殊功能寄存器名带位号。例如:P0.1表示P0口的1位。 4.位符号地址。例如:TR0是定时/计数器T0的启动位 4.写出完成下列操作的指令。 (1)R0的内容送到R1中。 MOV A,R0 MOV R1,A (2)片内RAM的20H单元内容送到片内RAM的40H单元中。 MOV 40H,20H (3)片内RAM的30H单元内容送到片外RAM的50H单元中。 MOV A,30H MOV R0,#50H MOVX @R0,A (4)片内RAM的50H单元内容送到片外RAM的3000H单元中。 MOV A,50H MOV DPTR,#3000H MOVX @DPTR,A (5)片外RAM的2000H单元内容送到片外RAM的20H单元中。 MOV DPTR,#2000H MOVX A,@DPTR MOV 20H,A (6)片外RAM的1000H单元内容送到片外RAM的4000H单元中。 MOV DPTR,#1000H MOVX A,@DPTR MOV DPTR,#4000H MOV @DPTR,A (7)ROM的1000H单元内容送到片内RAM的50H单元中。 MOV A,#0 MOV DPTR,#1000H MOVC A,@A+DPTR MOV 20H,A (8)ROM的1000H单元内容送到片外RAM的1000H单元中。 MOV A,#0 MOV DPTR,#1000H MOVC A,@A+DPTR MOVX @DPTR,A 5.区分下列指令有什么不同? (1)MOV A,20H和MOV A,#20H 答:前者源操作数是直接寻址,后者源操作数立即寻址。 (2)MOV A,@R1和MOVX A,@R1 答:前者源操作数是访问片内数据存储器,后者源操作数访问片外数据存储器低256字节。 (3)MOV A,R1和MOV A,@R1 答:前者源操作数是寄存器寻址,后者源操作数寄存器间接寻址。 (4)MOVX A,@R1和MOVX A,@DPTR 答:前者源操作数是访问片外数据存储器低256字节,后者源操作数访问片外数据存储器整个64K字节。 (5)MOVX A,@DPTR和MOVC A,@A+DPTR 答:前者源操作数是访问片外数据存储器,后者源操作数访问程序数据存储器。 6.设片内RAM的(20H)=40H,(40H)=10H,(10H)=50H,(P1)=0CAH。分析下列指令执行后片内RAM的20H、40H、10H单元以及P1、P2中的内容。 MOV R0,#20H MOV A,@R0 ;A=40H MOV R1,A ;R1=40H MOV A,@R1 ;A=10H MOV @R0,P1 ;(40H)=0CAH MOV P2,P1 P2=0CAH MOV 10H,A (10H)=10H MOV 20H,10H (20H)=10H 结果:(20H)=10H、(10H)=10H、(40H)=0CAH、P2=0CAH和P1=0CAH 7.已知(A)=02H,(R1)=7FH,(DPTR)=2FFCH,片内RAM(7FH)=70H,片外RAM(2FFEH)=11H,ROM(2FFEH)=64H,试分别写出以下各条指令执行后目标单元的内容。 (1)MOV A,@R1 结果:累加器A等于70H (2)MOVX @DPTR,A 结果:片外RAM(2FFCH)单元等于02H (3)MOVC A,@A+DPTR 结果: 累加器A等于64H (4)XCHD A,@R1 结果:累加器A等于00H,片内RAM(7FH)单元等于72H 8.已知:(A)=78H,(R1)=78H,(B)=04H,CY=1,片内RAM(78H)=0DDH,(80H)=6CH,试分别写出下列指令执行后目标单元的结果和相应标志位的值。 (1)ADD A,@R1 ;累加器A等于55H,CY等于1 (2)SUBB A,#77H ;累加器A等于00H,CY等于0 (3)MUL AB ;累加器A等于E0H,B寄存器等于01H,CY等于1,OV等于0 (4)DIV AB ;累加器A等于1EH,B寄存器等于00H,CY、OV等于0 (5)ANL 78H,#78H ;片内RAM(78H)单元等于58H (6)ORL A,#0FH ;累加器A等于7FH (7)XRL 80H,A ;片内RAM(80H)等于14H 9.设(A)=83H,(R0)=17H,(17H)=34H,分析当执行完下面指令段后累加器A、R0、17H单元的内容。 ANL A,#17H ;A=03H ORL 17H,A ;(17H)=37H XRL A,@R0 ;A=34H CPL A ;A=CBH 结果:A=CBH,(R0)=17H,(17H)=37H 10.写出完成下列要求的指令。 (1)累加器A的低2位清零,其余位不变。 ANL A,#11111100B (2)累加器A的高2位置“1”,其余位不变。 ORL A,#11000000B (3)累加器的高4位取反,其余位不变。 XRL A,#11110000B (4)累加器第0位、2位、4位、6位取反,其余位不变。 XRL A,#01010101B 11.说明LJMP指令与AJMP指令的区别? 答:LJMP 12.设当前指令CJNE A,#12H,10H的地址是0FFEH,若累加器A的值为10H,则该指令执行后的PC值为多少?若累加器A的值为12H呢? 答:指令执行后的PC值为1011H,若累加器A的值为12H,则指令执行后的PC值为1001H。 13.用位处理指令实现P1.4=P1.0Ù(P1.1ÚP1.2)Ú/P1.3的逻辑功能。 程序: MOV C,P1.1 ORL C,P1.2 ANL C,P1.0 ORL C,/P1.3 MOV P1.4,C 14.下列程序段汇编后,从1000H单元开始的单元内容是什么? ORG 1000H TAB: DB 12H,34H DS 3 DW 5567H,87H 答:(1000H)=12H,(1001H)=34H,(1002H)=00H,(1003H)=00,(1004H)=00,(1005H)=67H,(1006H)=55H,(1007H)=87H,(1008H)=00H 15.试编一段程序,将片内RAM的20H、21H、22H单元的内容依次存入片外RAM的20H、21H、22H中。 程序: MOV R0,#20H MOV R2,#03H LOOP:MOV A,@R0 MOVX @R0,A INC R0 DJNZ R2,LOOP SJMP $ 16.编程实现将片外RAM的2000H~2030H单元的内容,全部搬到片内RAM的20H单元开始位置,并将源位置清零。 程序: MOV R0,#20H MOV DPTR,#2000H MOV R2,#30H LOOP: MOVX A,@DPTR MOV @R0,A MOV A,#00 MOVX @DPTR,A INC DPTR INC R0 DJNZ R2,LOOP SJMP $ 17.编程将片外RAM的1000H单元开始的100个字节数据相加,结果放于R7R6中。 程序: MOV DPTR,#1000H MOV R2,#100 MOV R7,#00 MOV R6,#00 LOOP: MOVX A,@DPTR ADD A,R6 MOV R6,A MOV A,R7 ADDC A,#0 MOV R7,A INC DPTR DJNZ R2,LOOP SJMP $ 18.编程实现R4R3´R2,结果放于R7R6R5中。 程序: ORG 0100H MUL1:MOV A,R2 MOV B,R3 MUL AB ;R2´R3,结果的低字节直接存入积的R5 MOV R5,A ;结果的高字节存入R6中暂存起来 MOV R6,B MUL2:MOV A,R2 MOV B,R4 MUL AB ;R2´R4,结果的低字节与R6相加后,再存入R6中 ADD A,R6 MOV R6,A MOV A,B ;结果的高字节加上进位位后存入R7中 ADDC A,#00 MOV R7,A SJMP $ 19.编程实现把片内RAM的20H单元的0位、1位,21H单元的2位、3位,22H单元的4位、5位,23H单元的6位、7位,按原位置关系拼装在一起放于R2中。 程序: MOV C,20H.0 MOV A.0,C MOV C,20H.1 MOV A.1,C MOV C,21H.2 MOV A.2,C MOV C,21H.3 MOV A.3,C MOV C,22H.4 MOV A.4,C MOV C,22H.5 MOV A.5,C MOV C,23H.6 MOV A.6,C MOV C,23H.7 MOV A.7,C MOV R2,A 20.用查表的方法实现一位十六进制数转换成ASCII。 程序:(设一位十六进制数放在R2中,轮换的ASCII也放于R2中) C16STASC:MOV DPTR,#TAB MOV A,R2 MOVC A,@A+DPTR MOV R2,A RET TAB:DB 30H,31H,32H,33H,34H,35H,36H,37H DB 38H,391H,41H,42H,43H,44H,45H,46H 21.编程统计从片外RAM2000H开始的100个单元中“0”的个数放于R2中。 程序: MOV DPTR,#2000H MOV R3,#100 MOV R2,#00 LOOP: MOVX A,@DPTR JNZ NEXT INC R2 NEXT:INC DPTR DJNZ R3,LOOP SJMP $ 第四章 1. C语言有哪些特点? 答:C语言具有以下特点: 1) 语言简洁、紧凑,使用方便、灵活 2) 运算符丰富 3) 数据结构丰富,具有现代化语言的各种数据结构 4) 可进行结构化程序设计 5) 可以直接对计算机硬件进行操作 6) 生成的目标代码质量高,程序执行效率高 7) 可移植性好 2. 有哪些数据类型是MCS-51单片机直接支持的? 答:MCS-51单片机直接支持的数据类型标准分为基本数据类型和组合数据类型,基本数据类型有字符型char、短整型short、整型int、长整型long、浮点型float、双精度型double、特殊功能寄存器型和位类型,其中char型与short型相同,float型与double型相同。组合数据类型有数组类型、结构体类型、共同体类型和枚举类型,另外还有指针类型和空类型。 3. C51特有的数据类型有哪些? 答:C51特有的数据类型有特殊功能寄存器型和位类型。 4. C51中的存储器类型有几种,它们分别表示的存储器区域是什么? 答:C51中的存储器类型有6种,分别如下: data:直接寻址的片内RAM低128B,访问速度快 bdata:idata:pdata:用Ri间接访问的片外RAM低256B xdata:用DPTR间接访问的片外RAM,允许访问全部64KB片外RAM code:程序存储器ROM 64KB空间 5. 在C51中,bit位与sbit位有什么区别? 答:bit位类型符用于定义一般的位变量。存储器类型只能是bdata、data、idata,只能是片内RAM的可位寻址区,严格来说只能是bdata。 sbit位类型符用于定义在可位寻址字节或特殊功能寄存器中的位,定义时需指明其位地址,可以是位直接地址,可以是可位寻址变量带位号,也可以是特殊功能寄存器名带位号。 6. 在C51中,通过绝对地址来访问的存储器有几种? 答:通过绝对地址来访问存储器有三种方法:1. 使用C51运行库中预定义宏。2. 通过指针访问。3. 使用C51扩展关键字_at_ 7. 在C51中,中断函数与一般函数有什么不同? 答:中断函数在定义时后面带interrupt m修饰符,m的取值为0~31,对应的中断情况如下:0——外部中断0,1——定时/计数器T0,2——外部中断1,3——定时/计数器T1,4——串行口中断,5——定时/计数器T2,其他值预留。 编写MCS-51中断函数需要注意如下几点。 (1) 中断函数不能进行参数传递,如果中断函数中包含任何参数声明都将导致编译出错。 (2) 中断函数没有返回值。 (3) 在任何情况下都不能直接调用中断函数 (4) 如果在中断函数中调用了其他函数,则被调用函数所使用的寄存器必须与中断函数相同,否则会产生不正确的结果。 (5) C51编译器对中断函数编译时会自动在程序开始和结束处加上相应的内容。 (6) C51编译器从绝对地址8m+3处产生一个中断向量,其中m为中断号,也即interrupt后面的数字。该向量包含一个到中断函数入口地址的绝对跳转。 (7) 中断函数最好写在文件的尾部,并且禁止使用extern存储类型说明。防止其他程序调用。 8. 按给定的存储类型和数据类型,写出下列变量的说明形式。 (1) 在data区定义字符变量val1。 char data val1; (2) 在idata区定义整型变量val2。 int idata val2; (3) 在xdata区定义无符号字符型数组val3[4]。 unsigned char xdata val3[4]; (4) 在xdata区定义一个指向char类型的指针px。 char xdata *px; (5) 定义可寻址位变量flag。 bit flag; (6) 定义特殊功能寄存器变量P3。 sfr P3=0xa0; (7) 定义特殊功能寄存器变量SCON。 sfr SCON=0x98; (8) 定义16位的特殊功能寄存器T0。 sfr16 T0=0x8a; 9. 写出下列关系表达式或逻辑表达式的结果,设a=3,b=4,c=5。 (1) a+b>c&&b= =c 结果:假 (2) a||b+c&&b-c 结果:真 (3) !(a>b)&&!c||1 结果:真 (4) !(a+b)+c-1&&b+c/2 结果:假 10. 写出下列C51程序的执行结果。 (1) #include <stdio.h> extern serial_initial(); main() { int x,y,z; serial_initial(); x=y=8;z=++x; printf("\n %d %d %d",y,z,x); x=y=8;z=x++; printf("\n %d %d %d",y,z,x); x=y=8;z=--x; printf("\n %d %d %d",y,z,x); x=y=8;z=x--; printf("\n %d %d %d",y,z,x); printf("\n"); while(1); } 结果: 8 9 9 8 8 9 8 7 7 8 8 7 (2) #include <stdio.h> extern serial_initial();main() { int x,y,z; serial_initial(); printf("input data x,y?\n"); scanf("%d %d",&x,&y); printf("\n x y x<y x<=y x>y x>=y x!=y x==y"); printf("\n"); printf("\n%3d%3d",x,y); z=x<y; printf("%5d",z); z=x<=y; printf("%5d",z); z=x>y; printf("%5d",z); z=x>=y; printf("%5d",z); z=x!=y; printf("%5d",z); z=x==y; printf("%5d",z); while(1); } 执行结果: input data x,y? 1 2 x y x<y x<=y x>y x>=y x!=y x==y 1 2 1 1 0 0 1 0 (3) #include <stdio.h> extern serial_initial(); main() { int x,y,z; serial_initial(); printf("input data x, y ?\n"); scanf("%d %d",&x,&y); printf("\n x y !x x||y x&&y"); printf("\n%3d%3d",x,y); z=!y; printf("%5d",z); z=x||y; printf("%5d",z); z=x&&y; printf("%5d",z); printf("\n");printf("\n"); printf("That is all\n"); while(1); } 执行结果: input data x, y ? x y !x x||y x&&y 1 2 0 1 1 That is all (4) #include <stdio.h> extern serial_initial(); main() { int a,b; unsigned int x,y; serial_initial(); a=b=0xaa55;x=y=0xaa55; printf("\n a=%4x b=%4x x=%4x y=%4x",a,b,x,y); a=a<<1;b=b>>1; x=x<<1;y=y>>1; printf("\n a=%4x b=%4x x=%4x y=%4x",a,b,x,y); printf("\n"); printf("\n"); printf("That is all.\n"); while(1); } 执行结果: a=aa55 b=aa55 x=aa55 y=aa55 a=54aa b=d52a x=54aa y=552a That is all. 11. break和continue语句的区别是什么? 答:break语句可以跳出switch结构,使程序继续执行switch结构后面的一个语句。break语句还可以从循环体中跳出循环,提前结束循环而接着执行循环结构下面的语句。 continue语句用在循环结构中,用于结束本次循环,跳过循环体中continue下面尚未执行的语句,直接进行下一次是否执行循环的判定。 continue语句和break语句的区别在于:continue语句只是结束本次循环而不是终止整个循环;break语句则是结束循环,不再进行条件判断。 12. 用分支结构编程实现:输入“1”显示“A”,输入“2”显示“B”,输入“3”显示“C”,输入“4”显示“D”,输入“5”结束。 参考程序: #include <reg52.h> #include <stdio.h> void main(void) { unsigned char x; SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1; while(1) { printf("input x:\n"); //输出提示信息 scanf("%c",&x); switch(x) { 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(" QUIT\n");break; default: printf(" RETRY\n");; } if (x=='5') break; } while(1); } 13. 输入3个无符号的字符数据,要求按由大到小的顺序输出。 参考程序: #include <reg52.h> #include <stdio.h> void main(void) { unsigned char x,y,z,m; SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1; printf("input x,y,z:"); //输出提示信息 scanf("%c,%c,%c",&x,&y,&z); printf("\n"); if (x<y) {m=x;x=y;y=m;} if (y<z) {m=y;y=z;z=m;} if (x<y) {m=x;x=y;y=m;} printf("output %c,%c,%c\n", x,y,z); //输出 while(1); } 14. 用3种循环结构编写程序实现输出1到10的平方之和。 参考程序: (1)while循环 #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 void main(void) //主函数 { int i,s=0; //定义整型变量 i=1; SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1; while (i<=10) //累加1到10的平方之和在s中 { s=s+i*i; i++; } printf("1到10的平方之和=%d\n",s); while(1); } (2)do while循环 #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 void main(void) //主函数 { int i,s=0; //定义整型变量 i=1; SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1; do //累加1到10的平方之和在s中 { s=s+i*i; i++; } while (i<=10); printf("1到10的平方之和=%d\n",s); while(1); } (3)for循环 #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 void main(void) //主函数 { int i,s=0; //定义整型变量 SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1; for (i=1;i<=10;i++) s=s+i*i; //累加1到10的平方之和在s中 printf("1到10的平方之和=%d\n",s); while(1); } 15. 对一个由5个元素组成的无符号字符数组按由小到大的顺序进行排序。 参考程序: #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 main() { unsigned char f[5],m,i,j; SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1; printf("输入任意5个字符:"); scanf("%c,%c,%c,%c,%c",&f[0],&f[1],&f[2],&f[3],&f[4]); printf("\n"); for (i=0;i<5;i++) for (j=0;j<5-i;j++) if (f[j]>f[j+1]) {m=f[j];f[j]=f[j+1];f[j+1]=m;} printf("由小到大的顺序为:%c,%c,%c,%c,%c ",f[0],f[1],f[2],f[3],f[4]); printf("\n"); while(1); } 16. 用指针实现,输入3个无符号字符数据,按由大到小的顺序输出。 参考程序: #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 main() { unsigned char x,y,z; unsigned char *p,*p1,*p2,*p3; SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1; printf("input x,y and z:\n"); scanf("%c,%c,%c",&x,&y,&z); printf("\n"); p1=&x;p2=&y; p3=&z; if (*p1<*p2) {p=p1;p1=p2;p2=p;} if (*p2<*p3) {p=p2;p2=p3;p3=p;} if (*p1<*p2) {p=p1;p1=p2;p2=p;} printf("max to min is:%c,%c,%c\n",*p1,*p2,*p3); while(1); } 17. 有3个学生,每个学生都包括学号、姓名和成绩,要求找出成绩最高的学生的姓名和成绩。 参考程序: #include <reg52.h> //包含特殊功能寄存器库 #include <stdio.h> //包含I/O函数库 struct student { unsigned char number[10]; unsigned char name[10]; unsigned int grade; }p1[3]; main() { unsigned char i,j=0; SCON=0x52; //串口初始化 TMOD=0x20; TH1=0XF3; TR1=1; printf("input 3 studend number,name and grade:\n"); for (i=0;i<3;i++) { printf("input number:\n"); scanf("%s",p1[i]. number); printf("input name:\n"); scanf("%s",p1[i].name); printf("input grade:\n"); scanf("%d",&p1[i].grade); } for (i=1;i<3;i++) { if (p1[i].grade>p1[j].grade) j=i; } printf("成绩最高的学生是:%s,成绩是:%d",p1[j].name,p1[j].grade); printf("\n"); } while(1); } 第五章 1.单片机C语言与汇编语言混合编程有哪几种方式?通常采用什么方式? 答:单片机C语言和汇编语言混合编程分为汇编中调用C51函数和C51程序中引用汇编,通常使用的是在C51程序中引用汇编。在C51程序中使用汇编语言有两种情况:一种是汇编程序部分和C51程序部分为不同的模块,或不同的文件,通常由C51程序调用汇编程序模块的变量和函数(也可称为子程序或过程);另一种是嵌入式汇编,即在C51程序中嵌入一段汇编语言程序。 2.简述C51程序调用汇编程序时如何实现参数传递。 答:C51中调用汇编程序进行参数传递时都必须严格遵守C51函数的参数和返回值的相关约定。行参数传递的方式有两种,一种是通过寄存器传递参数,C51中不同类型的实参会存入相应的寄存器,在汇编中只需对相应寄存器进行操作,即可达到传递参数的目的;第二种是通过固定存储区传递。 3.简述嵌入式汇编的实现方法。 答:在C51程序中嵌入汇编程序通常的处理方法如下。 第一步:在C文件中以如下方式嵌入汇编程序。 第二步:在Keil C51软件的Project 窗口右击嵌入汇编程序的C文件,在弹出的快捷菜单中选择Options for ...命令,选中右边的Generate Assembler SRC File和Assemble SRC File复选框,使检查框由灰色变成黑色(有效)状态。 第三步:根据选择的编译模式,把相应的库文件(如 Small 模式时,是 Keil\C51\Lib\C51S.Lib)加入到工程中,该文件必须作为工程的最后文件。 4.简述C51中调用- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 原理 应用 C51 程序设计 第二 课后 答案
咨信网温馨提示:
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【可****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【可****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,个别因单元格分列造成显示页码不一将协商解决,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【可****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【可****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。
关于本文