• 306.00 KB
  • 2022-04-22 11:18:37 发布

《单片微型计算机与接口技术》思考题与习题解答01.doc

  • 45页
  • 当前文档由用户上传发布,收益归属用户
  1. 1、本文档共5页,可阅读全部内容。
  2. 2、本文档内容版权归属内容提供方,所产生的收益全部归内容提供方所有。如果您对本文有版权争议,可选择认领,认领后既往收益都归您。
  3. 3、本文档由用户上传,本站不保证质量和数量令人满意,可能有诸多瑕疵,付费之前,请仔细先通过免费阅读内容等途径辨别内容交易风险。如存在严重挂羊头卖狗肉之情形,可联系本站下载客服投诉处理。
  4. 文档侵权举报电话:19940600175。
'《单片微型计算机与接口技术》思考题与习题解答第0章基础知识0.1将下列十进制数转换为十六进制数:64,98,80,100,125,255。0.140H,62H,50H,64H,7DH,FFH0.2将下列十六进制无符号数转换为十进制数:32CH,68H,I)5H,100H,B78H,3ADH。O.2812,104,213,256,2936,9410.3写出下列十进制数的原码和补码,用8位或16位数填人表1中(要求用十六进制数表示)。表1十进制数原码补码十进制数原码补码28250-28-347l00928-130-9280.3十进制数原码补码十进制数原码补码281CH1CH250FAHFAH-289CHE4H-347815BHFEA5H10064H64H92803AOH03AOH-1308082HFF7EH-92883AOHFC60H0.4用十进制数写出下列补码表示的机器数的真值:1BH,97H,80H,F8H,397DH,7AEBH,9350H,CF42H。O.4机器数的真值分别为:27,233,-128,-8,14717,31467,-27824,-124780.5用补码运算完成下列算式,并指出溢出OV和进位CY:(1)33H+5AH(2)-29H-5DH(3)65H-3EH(4)4CH-68HO.5(1)33H+5AH=8DH,OV=1,CY=O(2)-29H-5DH=7AH,OV=0,CY=1(3)65H-3EH=27H,OV=0,CY=1(4)4CH-68H=E4H,0V=O,CY=O0.6将表2中的十进制数按要求转换,用十六进制数填入。表2十进制数压缩BCD数非压缩BCD数ASCII码382554837641000102545 O.6十进制数压缩BCD数非压缩BCD数ASCII码3838H0308H3338H255255H020505H323535H483483H040803H343833H764764H070604H373634H10001000H01000000H31303030H10251025H01000205H31303235H0.7写出下列ASCII码表示的十六进制数(如313035H为105H):374341H,32303030H,3841353DH。0.7ASCIl码表示的十六进制数分别为:105H,7CAH,200¨。H,8A50H第1章MCS-51单片机1.1什么是嵌入式系统?其控制核心有哪几种类型?1.1见绪论1.2单片微型计算机与微处理器在结构上和使用中有什么差异?单片机和DSP在使用上有什么差别?1.2单片微型计算机是包含CPU、存储器和I/O接口的大规模集成芯片,即它本身包含了除外部设备以外构成微机系统的各个部分,只需接外设即可构成独立的微机应用系统。微机处理器仅为CPU,CPU是构不成独立的微机系统的。DSP是数据处理的专用芯片,单片机主要用做控制,也具有简单的数据处理能力。1.351系列单片机内部有哪些功能部件?1.3见1.1.1节1.451系列单片机有哪些品种?结构有什么不同?各适用于什么场合?1.4见绪论1.551系列单片机的存储器可划为几个空间?各自的地址范围和容量是多少?在使用上有什么不同?1.5见表1-51.6在单片机内部RAM中,哪些字节有位地址,哪些没有位地址?特殊功能寄存器SFR中哪些可以位寻址?有什么好处?1.6见表1-1和表1-21.7已知PSW=10H,通用寄存器R0~R7的地址分别是多少?1.7当PSw=10H,表明选中的为第二组通用寄器RO~R7的地址为10H~17H1.8程序存储器和数据存储器可以有相同的地址,而单片机在对这两个存储区的数据进行操作时,不会发生错误,为什么?1.8序存储器和数据存储器尽管地址相同,但在数据操作时,所使用的指令不同,选通信号也不同,因此不会发生错误。1.9填空:堆栈设在存储区,程序存放在存储区,I/0接口设置在存储区,中断服务程序存放在存储区。45 1.9内部数据程序外部数据程序1.10若单片机使用频率为6MHz的晶振,那么状态周期、机器周期和指令周期分别是多少?1.10振荡周期=0.1667us,机器周期=2us,指令周期=2~8us1.11复位时,A=,PSW=,SP=,P0~P3=1.11A=0,PSW=0,SP=07,P0~P3=FFH第2章指令系统2.1MCS-51单片机有哪几种寻址方式,适用于什么地址空间?用表格表示。2.1见2.1节2.2MCS-51单片机的PSW程序状态字中无ZERO(零)标志位,怎样判断某内部数据存储单元的内容是否为O?2.2因为累加器A自带零标志,因此,若判断某内部RAM单元的内容是否为零,必须将其内容送到A,通过JZ指令即可进行判断。2.3设A=0,执行下列两条指令后,A的内容是否相同,说明道理。(1)MOVCA,@A+DPTR(2)MOVXA,@DPTR2.3当A=O时,两条指令的地址虽然相同,但操作码不同,MOVC是寻址程序存储器,MOVX是寻址外部数据存储器,送入A的是两个不同存储空间的内容。2.4指出下列各指令中操作数的寻址方式指令目的操作数寻址方式源操作数寻址方式ADDA,40HPUSHACCMOVB,20HANLP1,#35HMOV@R1,PSWMOVCA,@A+DPTRMOVX@DPTR,A2.4目的操作数源操作数寄存器直接SP间接寻址直接直接直接直接立即寄存器问址直接寄存器变址寄存器间址寄存器2.5执行下列程序段MOVA,#56HADDA,#74HADDA,ACC后,CY=,OV=,A=。2.5CY=1,OV=0,A=94H2.6在错误的指令后面括号中打×。MOV@R1,#80H()MOVR7,@R1()√×45 MOV20H,@R0()MOVR1,#0100H()√×CPLR4()SETBR7,0()××MOV20H,21H()ORLA,R5()√√ANLR1,#OFH()XRLP1,#31H()×√MOVXA,2000H()MOV20H,@DPTR()××MOVA,DPTR()MOVR1,R7()××PUSHDPTR()POP30H()×√MOVCA,@R1()MOVCA,@DPTR()××MOVX@DPTR,#50H()RLCB()××ADDCA,C()MOVC@R1,A()××2.6√×√×××√√×√×××××√××××××2.7设内部RAM中(59H)=50H,执行下列程序段:MOVA,59HMOVR0,AMOVA,#0MOV@R0,AMOVA,#25HMOV51H,AMOV52H,#70H问A=,(50H)=,(51H)=,(52H)=。2.7A=25H,(50H)=O,(51H)=25H,(52H)=70H2.8设SP=60H,内部RAM的(30H)=24H,(31H)=10H,在下列程序段注释的括号中填执行结果。PUSH30H;SP=(),(SP)=()PUSH3lH;SP=(),(SP)=()POPDPL;SP=(),DPL=()POPDPH;SP=(),DPH=()MOVA,#00HMOVX@DPTR,A最后执行结果是()。2.8SP=(61H),(SP)=(24H)SP=(62H),(SP)=(10H)SP=(61H),DPL=(10H)SP=(60H),DPH=(24H)执行结果将0送外部数据存储器的2410单元。45 2.9对下列程序中各条指令作出注释,并分析程序运行的最后结果。MUV20H,#0A4HMOVA,#017)6HMOVR0,#20HMOVR2,#57HANLA,R20RLA,@R0SWAPACPLAORL20H,ASJMP$2.9程序运行后内部RAM(20H)=B4H,A=90H2.10将下列程序译为机器码。机器码源程序LA:MOVA,#01HLB:MOVP1,ARLACJNEA,#10,LBSJMPLA2.10机器码源程序7401LA:M()VA,#01HF590LB:M()VP1,A23RLAB40AFACJNEA,#10,LB80F6SJMPLA2.11将累加器A的低4位数据送P。口的高4位,P。口的低4位保持不变。2.11ANLA,#0FHSWAPAANLP1.#OFHORLP1,ASJMP$2.12编程将R0(R2)的内容和R1(R3)的内容相交换。2.12MOVA,ROXCHA,R1MOVR0,ASJMP$2.12MOVA,R2XCHA,R3MOVR2,ASJMP$2.13试用3种方法将A累加器中的无符号数乘4,积存放于B和A寄存器中。2.13(1)利用乘法指令MOVB,#04H45 MULABSJMP$(2)利用位移指令RLARLAMOV20H。AANLA,#03HMOVB,AMOVA,20HANLA,#OFCHSJMP$(3)用加法指令完成ADDA,ACCMOVRO,A:RO=2AMOVA,#0ADDCA。#0MOVB,A;B存2A的进位MOVA,ROADDA,ACCMOVR1,A;R1=4AMOVA,BADDCA,B;进位x2MOVB,A;存积高位MOVA,R1;存积低位SJMP$2.14编程将内部RAM40H单元的中间4位变反,其余位不变放回原单元。2.14方法1:XRL40H,#3CHSJMP$方法2:MOVA,40HCPLAANLA,#3CHANL40H,#OC3HORL40H,ASJMP$2.15有两个BCD码数存放在(20H)和(21H)单元,完成(21H)+(20H)=>(23H)(22H)。(24H)+(25H)=>(23H)(22H)2.15MOVA,20HADDA,21HDAAMOV22H,A;存和低字节MOVA,#OADDCA,#0MOV23H,A;存进位SJMP$45 2.15MOVA,24HADDA,25HDAAMOV22H,A;存和低字节MOVA,#OADDCA,#0MOV23H,A;存进位SJMP$2.16如果R0的内容为0,将R1置为0,如R0内容非0,置R1为FFH,试进行编程。2.16MOVA.R0JZZEMOVR1.#OFFHSJMP$ZE:MOVR1,#OSJMP$2.17完成(51H)×(50H)=>(53H)(52H)的编程(式中均为内部RAM)。2.17MOVA,50HMOVB,51HMULABMOV53H。BMOV52H,ASJMP$2.18将P1.1和P1.0同时取反10次。(将P1.2和P1.0同时取反10次)2.18MOVR7,#0AHWOP:XRLP1,#03HDJNZR7,WOPSJMP$2.18MOVR7。#0AHWOP:XRLP1,#05HDJNZR7,WOPSJMP$2.19将内部RAM单元3字节数(22H)(21H)(20H)×2送(23H)(22H)(21H)(20H)单元。2.19单片机的移位指令只对A,且只有循环移位指令,为了使本单元的最高位移进下一单元的最低位,必须用大循环移位指令移位4次。ORGOCLRCMOVA,20HRLCAMOV20H,AMOVA,21HRLCAMOV21H,AMOVA,22H45 RLCAMOV22H.AMOVA,#ORLCAMOV23H,ASLMP$第3章程序设计3.1编写程序,把片外数据存储器0000H~0050H中的内容传送到片内数据存储器20H~70H中。3.1因为是多个单元操作,为方便修改地址,使用问址操作。片外地址用DPTR指示.只能用M()Vx指令取数到A,片内地址用RO或R1指示,只能用MOV指令操作,因此,循环操作外部数据存储器一A一内部数据存储器。ORGOOOOHMOVDPTR,#0000HMOVR0,#20HLOOP:MOVXA,@DPTRMOV@R0,AINCDPTRINCR0CJNER0,#71H,LOOPSJMP$3.2编写程序,实现双字节加法运算,要求RIR0+R7R6=>(52H)(51H)(50H)(内部RAM)。3.2要注意两高字节相加应加低字节相加时产生的进位,同时要考虑最高位的进位。ORG0MOVA,ROADDA,R6MOV50H,AMOVA,R7ADDCA,R1MOV51H,AMOVA,#0ADDCA,#OMOV52H,ASJMP$3.3设X在累加器A中(0≤X≤20),求X2并将平方数高位存放在R7中,低位存放在R6中。试用查表法编出子程序。3.3A中放X(小于14H)的数,平方表的一个数据占2个字节,可用BCD码或二进制数存放(如A中放的是BCD码,则要先化成二进制数再查表)。ORG0MOVDPTR,#TABADDA,ACC;A*2PUSHACCMOVCA,@A+DPTR45 MOVR7,APOPACCINCAMOVCA,@A+DPTRMOVR6,ASJMP$TAB:DB00,00,00,01,OO,04,OO,09,OO,16H,…DB…04H,003.4设内部RAM的20H和21H单元中有两个带符号数,将其中的大数存放在22H单元中,编出程序。3.4先用异或指令判两数是否同号,在同号中判大小,异号中正数为大。ORG0MOVA,20HXRLA.21HANLA,#80HJZCMPJB20H.7,BGAG:MOV22H,20HSJMP$BG:MOV22H,21HSJMP$CMP:MOVA,20HCJNEA,21H,GRGR:JNCAGMOV22H,21HSJMP$3.5若单片机的晶振频率为6MHz,求下列延时子程序的延时时间。DELAY:MOVR1,#0F8HLOOP:MOVR3,#0FBHDJNZR3,$DJNZR1,LOOPRET3.5fosc=6MHz,MC=2us机器周期数DELAY:MOVR1,#OF8H1LOOP:MOVR3,#0FBH1DJNZR3,$2DJNZR1,LOOP2RET2(1+2+(1+2×251+2)×248)×2us=250.48ms3.6编程将内部数据存储器20H~24H单元压缩的BCD码转换成ASCII码存放在25H开始的单元内。3.6将待转换的数分离出高半字节并移到低4位加30H;再将待转换的数分离出低半字节并加30H,安排好源地址和转换后数的地址指针,置好循环次数。ORG0000H45 MOVR7,#05HMOVRO,#20HMOVR1,#25HNET:MOVA,@ROANLA,#OFOHSWAPADDA,#30HMOV@R1,AINCR1MOVA,@ROANLA,#OFHADDA,#30HMOV@R1,AINCR0INCR1DJNZR7,NESJMP$END3.7从内部存储器30H单元开始,有16个数据,试编一个程序,把其中的正数、负数分别送40H和50H开始的存储单元,并分别将正数、负数和零的个数送R4,R5,R6。3.7片内RAM间址寄存器只有Ro和R1,而正数、负数和零共需3个寄存器指示地址,这时可用堆栈指针指示第3个地址,POP和PUSH指令可自动修改地址。RO指正数存放地址,Rl指负数存放地址,SP指源数据存放的末地址,POP指令取源数据,每取一个数地址减1。ORG0000HMOVR7,#10HMOVA,#0MOVR4,AMOVR5,AMOVR6,AMOVR0,#40HMOVR1,#50HMOVSP,#2FHNEXT:POPACCJZZER0JBACC.7,NEINCR4MOV@RO,AINCR0AJMPDJNE:INCR5MOV@R1,AINCR1AJMPDJZER0:INCR6DJ:DJNZR7,NEXT45 SJMP$END3.8内部存储单元40H中有一个ASCII字符,试编一个程序给该数的最高位加上奇校验。3.8可直接用P标志判断(JBP,ret)ORG0000HMOVA。40HJBP,EN;奇数个1转移0RLA,#80H;偶数个1最高位加“1”EN:SJMP$3.9编写一段程序,将存放在自DATA单元开始的一个四字节数(高位在高地址)取补后送回原单元。3.9取补不同于求补码,求补码应区别正、负数分别处理,而取补不分正、负,因正、负数均有相对于模的补数。可用取反加l求补,也可用模(00H)减该数的方法求补。ORG0000HMOVR7,#03HMOVR0,#DATAMOVA,@ROCPLAADDA,#01MOV@RO,AAB:INCROMOVA,@ROCPLAADDCA,#ODJNZR7,ABSJMP$3.10以BUFl为起始地址的外存储区中,存放有16个单字节无符号二进制数,试编一个程序,求其平均值并送BUF2单元,余数存在BUF2—1单元。3.1016个单字节累加应用ADD指令而不能用ADDC指令,和的低位存A,当和超过一个字节时,和的高字节存于B,并要加低位相加时产生的进位,16个单字节加完后,采用右移4次进行除16求平均值的运算,商在BUF2单元,余数在BuF2-1单元。0RG0000HMoVR7,#0FHMOVR0,#BUFlMOVB,#0MOVA,@R0MOVR2,ANEXT:MOVA,R2INCR0ADDA,@R0MOVR2,AMOVA,BADDCA,#0MOVB,A45 DJNZR7,NEXT;以上完成求和MOVR6,#04HMOVBUF2,AMOVBUF2-1,#ONEX:CLRCMOVA,BRRCAMOVB,AMOVA,BUF2RRCAMOVBUF2,AMOVA,BUF2-1RRCAMOVBUF2-l,ADJNZR6,NEXSJMP$;以上完成除16运算3.11将内部RAM的20H单元中的十六进制数变换成ASCII存入22H,21H单元,高位存入22H单元,要求用子程序编写转换部分。3.11将20H单元的内容分解为高4位和低4位,根据是否大于9分别进行加37H和30H处理。0RG0000HMOVA,20HANLA,#0F0HSWAPAACALLASCIIMOV22H,AMOVA.20HANLA,#0FHACALLASCIIMOV21H,ASJMP$ENDASCII:CJNEA,#0AH,NENE:JCA30ADDA,#37HRETA30:ADDA,30HRET3.12编写一段程序,以实现图中硬件的逻辑运算功能。45 3.12要注意,位的逻辑运算其中一个操作数必须在C。ORG0000HMOVC,20HANLC,2FHCPLCORLC,/2FHCPLCANLC,53HMOVP1.0,CSJMP$END3.13用位操作指令实现下面的逻辑方程(×表示逻辑乘,+表示逻辑加):P1.2=(ACC.3×P1.4×-ACC.5)+(-B.4×-P1.5)3.13ORG0000HMOVC,ACC.3ANLC。P1.4ANLC,/ACC.5MOV20H,CMOVC,B.4CPLCANLC,/P1.5ORLC,20HMOVP1.2,CSJMP$END3.14试编写一个三字节无符号数乘一字节的乘法程序。3.14设一字节乘数存放在R1,三字节的被乘数存放在data开始的内部RAM单元,且低字节存放在低位地址单元,R0作为被乘数和积的地址指针,用MUL指令完成一字节乘一字节,每一次部分积的低位加上一次部分积的高位,其和的进位加在本次部分积的高位上,并暂存,三字节乘一字节共需这样3次乘、加、存操作.以R7作循环3次的计数寄存器。ORG0000HMOVR7,#03HMOVR0,#dataMOVR2,#0NEXT:MOVA,@R045 MOVB,R1MULABADDA,R2MOV@RO,AMOVA,#OADDC;A,BMOVR2,AINCR0DJNZR7,NEXTMOV@R0,BSJMP$END第4章单片机的C语言4.1改正下面程序的错误。4.11:#include本程序有如下错误:2:main()3:{a=c;①变量a,c必须先定义再引用4:inta=7,c;②第5句调用函数后必须加分号.5:delay()③main()函数没有反大括号6:voiddelay();④被调函数delay()在main()后面,必须在前面先声明7:{8:chari;⑤第6句函数说明语句后的分号应去掉9:for(i=O;i<:255;i++);10:}4.2试说明为什么xdata型的指针长度要用2个字节?4.2因为xdata是外部数据存储器,最大可有64KB的存储单元,xdata指针是表示外部数据存储单元的地址,要表示64KB个单元地址,所以必须用2个字节,共16位表示。4.3定义变量a、b、c;a为内部RAM的可位寻址区的字符变量;b为外部数据存储区浮点型变量;c为指向int型xdata区的指针。4.3bdatachara;xdatafloatb:xdataint~c;4.4编程将8XX51的内部数据存储器20H单元和35H单元的数据相乘,结果存到外部数据存储器中(位置不固定)。4.4main(){chardata*pl,*p2;xdatainta;p1=0x20;p2=0x35;a=*p1*(*p2);}4.5将如下汇编程序译成C程序(等效即可)。ORG0000HMOVP1,#04H45 MOVR6,#0AHMOVR0,#30HCLRP1.OSETBP1.3ACALLTLCSJMP$TLC:MOVA,#0CLRP1.3MOVR5,#08LOOP:MOVC,P1.2RLCASETBP1.0CLRP1.ODJNZR5,LOOPMOV@RO,AINCR0DJNZR6,TLC2543RETEND4.5#include(reg51.h)#defineucharunsignedcharsbitP1_0=P1^0;sbitPl_l=P1^1;sbitP1_2=P1^2;sbitP1_3=P1^3;sbitmsb=ACC^7;sbitlsb=ACC^0;uchartlc(void);main(){uchar*P;P1=0x04;P=0x30;P1_0=0;Pl_3=1;for(i=O;i<10;i++){*P=tlc();P++:}}uchartlc(void){uchari,y;ACC=0;Pl_3=0;for(i=0:i<8:i++){P1_1=msb;/*发出ACC的低位*/45 y=ACC<<1;/*ACC右移1位*/lsb=P1_2;/*接收一位放在ACC的高位*/P1_0=1;P1_0=O;}returny;}4.68051的片内数据存储器25H单元中放有一个0~10的整数,编程求其平方根(精确到5位有效数字),将平方根放到30H单元为首址的内存。4.6方法l:使用查表法floatcodetab[11]={0,1,1.4142,1.7321,2,2.2361,2.4495,2.6458,2.8284,3,3.1623}:main(){chardata*P1;floatdata*P2;P1=0x25;P2=0x30;*P2=tab[*P1];}方法2:使用库函数#lncludemain(){float*P2;char*P1;P1=0x25;*P2=sqrt(*P1);}4.7完成逻辑表达式P1.2=P1.4×ACC.0+ACC.7(“×”表示逻辑与,“+”表示逻辑或)。4.7#includesbitP12=P1^2:main(){P12=~(P1^4&ACC^0)|ACC^7;}4.8将外部RAM的10H~15H单元的内容传送到内部RAM的10H~15H单元。4.8#lncludemain(){charpdata*m;chardata*n;P2=0;for(m=0x10;m<=0x15;m++){n=m;*n=*m;}}4.9内部RAM的20H、21H和22H、23H单元分别存放着两个无符号的16位数,将其中的大数置于24H和25H单元。45 4.9#defineuintunsignedintmain(){uintdata*m,*n,*P;for(;;){m=0x20;n=0x22;P=0x24;if(*m<*n)*P=*n;else*P=*m:}}4.10将内部RAM21H单元存放的BCD码数转换为二进制存入30H为首址的单元,BCD码的长度存放在20H单元中。4.10main(){intdataa=O,*P3:chari,*P1,*P2;Pl=0x20:P2=0x21:P3=0x30;for(i=O;i<*P1;i++){a=a*10+*P2;P2++;}*P3=a;}4.11将内部RAM30H单元存放的2字节二进制数转换为十进制数存于21H为首的单元中,长度存放于20H单元中。4.11main(){unsignedinta,k,*P3;chari,*P1,*P2:P1=0x20:P2=0x25:P3=0x30;a=*P3;k=10000;while(a/k==0)k=k/10;for(i=0;a!=0;i++){*P2=a/k;a=a%k;P2++;k=k/10:*P1=i:}第5章并行口45 5.18XX51的4个I/()端口的作用是什么?8XX51对外的三总线是如何分配的?5.28XX51的4个I/0端口在结构上有何异同?使用时应注意什么?5.3为什么说8XX51能全部作为I/O口使用的仅有P1端口?5.1~5.3参阅5.1节5.4在例5-2中有如下语句:MOVP1,#0FFH;高4位的LED全灭,低4位输入线送“1”ABC:MOVA,P1;读P1口引脚开关状态,并送入A为什么执行了ABC语句后A的值低4位为开关状态,而不是前一句的FFH,那么它的高4位值是什么呢?5.4由内部结构图可知,MOVP1,#0FFH将使锁存器Q=1,同时Q=0,VT截止,当执行MOVA,P1时,读引脚信号有效,低4位的开关电平通过门2进入内部总线到A,而读锁存器信号无效,门1关闭,Q的信号进不了内部总线,高4位没有引脚新的电平变化,由于VT截止,二极管也截止,进入门2的是VT的漏极电压Vcc,因此,高4位通过门2读入的均是高电平即1111B。5.5利用8XX51的P1口,监测某一按键开关,使每按键一次,输出一个正脉冲(脉宽随意),画出电路并编出程序。5.5用P1.7监测按键开关,P1.0引脚输出正脉冲,正脉冲的产生只需要将P1.0置零、置1、延时、再置零即可。P1.0接一示波器可观察波形。如果再接一发光二极管,可观察到发光二极管的闪烁。电路设计图如习题5.5图。汇编语言程序ORG0000HABC:CLRP1.0SETBP1.7JBP1.7,$;等键按下JNBP1.7,$;待键弹起SETBP1.0MOVR2,#0DAY:NOPNOPDJNZR2,DAYSJMPABCC语言编程sfrP1=0x90:sbitp1_O=P1^O;sbitp1_7=P1^7;main(){unsignedchari;while(1){P1=0x80:do{}while(p1_7==1);/*等键按下*/do{}while(p1_7==O);/*等键弹起*/p1_0=1;for(i=O;i<255;i++);}}45 5.6利用8XX51的P1口控制8个发光二极管LED。相邻的4个LED为一组,使两组每隔0.5s交替发亮一次,周而复始,画出电路并编写程序(设延时0.5s子程序为D05,已存在)。5.6电路见习题5.6图,初始值送0FH到P1,再和0FFH异或从P1口输出,或使用SWAPA指令。然后从P1口输出,循环运行,注意输出后要延时。汇编语言程序ORG0000HMOVA,#OFHABC:MOVP1,AACALLD05SWAPASJMPABCD05:MoVR6,250DY:MOVR7,250DAY:NOPNOPDJNZR7,DAYDJNZR6,DYRETENDC语言编程sfrP1=0x90;main(){inti;P1=0xf0;45 while(1){P1=~P1;fOr(i=0;i<5000;i++);}5.7用89C51/89S51并行口设计显示…个数码的电路,使数码管循环显示“O”~“F”。5.7如使用共阴极数码管,阴极接地,阳极a~g分别接P0~P3的某个口的7位,将0~F的段码列成表,表的内容顺次从该口输出。如数码管接P3口。汇编语言程序0RG0000HMOVDPTR,#TABAGAIN:MOVR0,#0NEXT:MOVA,ROMOVCA,@A+DPTRMOVP3,AMOVR7,#0DAY:NOPNOPDJNZR7,DAYINCR0CJNER0,#10H,NEXTSJMPAGAIN;段码表(略)TAB:DB3FH,06H…ENDC语言程序#include(reg51.h)#defintuintunsignedint#defineucharunsignedcharmain(){umtj;uchari;ucharcodetab[16]={0x3f,0x06……);,/*段码表(略)*/while(1){for(i=O;i<=15;i++){P3=tab[i]};for(j=O;j<10000;j++);/*延时*/}}5.8设计一个能显示4位数码的电路,并用C语言和汇编语言编程使“8”能跑马显示8遍。5.8电路设计见习题5.8图,分别用汇编语言和C语言的编程如下:汇编语言程序45 0RG0000HMOVA,#08HM()VDPTR,#TABMOVCA,@A+DPTRMOVP1,AMOVR2,#08HAGAIN:M()VA,#01NEXT:M()VP3,AACALLDAYRLACJNEA,#10H,NEXTDJNZR2,AGAINTAB:DB3FH,06H…ENDC语言程序#include#defincuintunslgnedint#deflneucharunsignedcharmain(){ucharcodetabl[]={0x3f,0s06…}uchari,m;uintj;for(m=O;m<8;i++){P3=0x01:for(i=0;i<4;i++){P1=tabl[8]P3<<=1:for(j=0;j<=25000;j++);}}}45 5.9利用89C51/89S51并行口设计8×8的矩阵键盘并用箭头标明信号的方向。5.9P1口的8根线接行线,输出行扫描信号,P3口的8根线接列线,输入回馈信号。见习题5.9图。第6章中断6.18XXSl有几个中断源?各中断标志是如何产生的,又如何清除?6.28XX51中断源的中断请求被响应时,各中断入口地址是多少?在什么物理存储空间?6.3MCS-51系列单片机的中断系统有几个优先级?如何设定?6.4简述8XX51中断处理的过程,画出流程图。6.1~6.4参见6.1节~6.2节6.5用8XX51的P1口接8个LED发光二极管,由INT0接一消抖开关,开始P1.0的LED亮,以后每中断一次,下一个LED亮,顺序下移,且每次只一个LED亮,周而复始。画出电路图,并编制程序。6.5电路设计见习题6.5图汇编语言程序ORG0000HAJMPMAlN0RG0003HRLA;中断服务MOVP1.ARETIMAIN:MOVA,#0FEHMOVP1,A;第一灯亮SETBEASETBEX0SETBIT0SJMP$C语言程序#includeint0()interrpt0{45 P1=P1<<1|0x01;}main(){P1=0xfe;EA=1;EX0=1;IT0=1;do{}whik(1);}汇编语言中只有一个中断源,不存在占用别的中断源向量地址问题,程序顺序排下,应注意程序的执行过程。C语言无循环移位指令,移位后,后面补零,因此和01相或。6.6在题6.5电路的基础上,要求8个LED同时亮或同时灭,每中断一次,变反一次,编出程序。6.6略6.7要求同题6.6,要求亮、灭变换5次(一亮,一灭为一次),编出程序。6.7汇编语言程序ORGO000HAJMPMAINORG0003H;中断服务XRLP1,#OFFHDJNZR0,NECLREANE:RETIORG0030HMAIN:SETBEASETBEXOSETBITOMOVP1,#OFFHMOVR0,#OAHSJMP$;等待中断C语言程序#includechari:ic()itrrupt0{i++:if(i<=10)P1=~P1:45 eIseEA=O:}main(){EA=1;EX0=1;IT0=1;P1=0xff:for(;;);/*等待中断*/}因一亮一灭为一次,所以共10次。6.8利用8XX51的并行口接2个数码管,显示INT1中断次数(次数不超过FFH)。6.8两个数码管阳极经驱动器接P1口,阴极分别接P3.0、P3.1。#includevoidintr(void)voiddelay(void);unsignedchara,b,i=0;unsignedcharcodetab[16]={0x3f,0x06,0x5b,Ox4f,0x66,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x73}:sbitp3_O=P3^0;sbitp3_1=P3^1;main(){a=tab[O];b=tab[0];p3_0=O;p3_1=0;EA=1;EX0=1;IT0=1;for(;;){p3_O=1;p3_1=0;P1=b:delay();p3_0=O;p3_1=1;P1=a:delay();}}voidintr()interrupt0{unsignedcharj,k;EX0=O;i++;j=i&0x0f;k=i&0xf0;k>>=4;a=tab[k];45 b=tab[j];EX0=1;}voiddelay(void){intx;for(x=0;x<1000;x++);}第7章定时计数器7.18XX51单片机内部设有几个定时/计数器?它们是南哪些专用寄存器组成的?7.28XX51单片机的定时/计数器有哪几种工作方式?各有什么特点?7.3定时/计数器用做定时时,其定时时间与哪些因素有关?用做计数时,对外界计数频率有何限制?7.1~7.3参7.1节7.4设单片机的fosc=6MHz,定时器处于不同工作方式时,最大定时范围分别是多少?7.4方式0:16.38ms,方式1:131ms,方式2:512us7.5利用8XX51的T0计数,每计10个脉冲,P1.0变反一次,用查询和中断两种方式编程。7.5使用方式2,计数初值c=100H—OAH=F6H查询方式:0RG0000HMOVTMOD,#06HMOVTHO,#0F6HMOVTL0,#0F6HSETBTR0ABC:JNBTF0,$CLRTF0CPLP1.0SJMPABC中断方式:ORG0000HAJMPMAINORGOOOOBHCPLP1.0RETIMAIN:MOVTMOD,#06HMOVTH0,#OF6HSETBEASETBET0SETBTR0SJMP$;等待中断C语言程序查询方式:#includesbitp10=P1^O;main(){45 TMOD=Ox06;THO=-10;TLO=-10;TRO=1:{while(1)dO{}while(TF0==0)TF0=0;p10=~p10;}}中断方式:#includesbitp1_O=P1^O;tov()interrrupt1{p1_O=~p1_O;}maln(){EA=1;ET0=1;TMOD=0x06;TH0=0xf6;TL0=0xf6;TR0=1;while(1);}/*等待中断*/7.6在P1.0引脚接一驱动放大电路驱动扬声器,利用T1产生lOOOHz的音频信号从扬声器输出。7.61000Hz的周期为1ms,即要求每500usP1.0变反一次,使用T1方式1,MC=12/fosc=1us,C=216-500us/1us=FE0CH,除TMOD=10H,TH0=FEH,Tl0=0CH外,程序与7.5题相同,注意每次要重置TH0和TL0。7.7已知8XX51单片机系统时钟频率为6MHz,利用定时器T0使P1.2每隔350us,输出一个50us脉宽的正脉冲。7.7fosc=6MHz,MC=2us,方式2的最大定时为512us,合乎题目的要求。50us时,计数初值为C1=256-25=E7H,350us时,计数初值为C2=256-175=51H汇编语言程序ORG0000HMOVTMOD,#02HNEXT:MOVTH0,#51HMOVTL0,#51HCLRP1.2SETBTR0AB1:JBCTF0,EXTSJMPAB1EXT:SETBP1.2MOVTH0,#0E7HMOVTL0,#0E7HAB2:JBCTF0,NEXTSJMPAB2C语言程序#includevoidtimet(unsignedchart);sbitp1_2=P1^2main(){for(;;)p1_2=O;timer(7);p1_2=1;timer(1);}45 voidtimer(unslgnedchart){unsignedchari;for(i=0;isbitp11=P1^l;sbitp10=P1^0;main(){chari;TMOD=0x02;TH0=06;TL0=06:TR0=1;while(1){for(i=0;i<4:i++){do{}while(!TF0);P11=~P11:}P10=~P10:}}7.9设系统时钟频率为6MHz,试用定时器T0。作为外部计数器,编程实现每计到1000个脉冲后,使T1定时2ms,然后T0又开始计数,这样反复循环。7.9C语言程序T0计数1000个脉冲,采用方式1;T1定时2ms,fosc=6MHz,C=-2ms/2us=-100045 includecounter(){TH0=-1000/256;TLO=-1000%256;TR0=1;TR1=0;while(TF0!=1);TF0=0;}timer(){TH1=-1000/256;TL1=-1000%256;TR1=1;TR0=0;while(TF1!=0);TF1=0;}main()TMOD=0x15;for(;;){counter():timer():7.10利用8XX51单片机定时器T0测量某正单脉冲宽度,已知此脉冲宽度小于10ms,主机频率为12MHz。编程测量脉宽,并把结果转换为BCD码,顺序存放在以片内50H单元为首地址的内存单元中(50H单元存个位)。7.10C语言程序#lncluesbitp3_2=P3^2;main(){unsingcdchar*P,i;inta;P=0x50;TMOD=0x09;TL0=0;TH0=0;while(P3_2==1);/*等待INT0变低*/TR0=1;while(P3_2==0);/*等待-INT0变高*/while(P3_2==1);/*等待-INT0变低*/TR0=0;i=TH0;a=i*256+TL0;for(;a!=O;){/*转换为非压缩IR7D码*/*P=a%10;a=a/10;P++;}}第8章串行口45 8.1什么是串行异步通信?它有哪些特点?MCS-51单片机的串行通信有哪几种帧格式?8.1见8.1节8.2某异步通信接口按方式3传送,已知其每分钟传送3600个字符,计算其传送波特率。8.2方式3为每帧11位数据格式.即3600*11/60=660(波特)8.3为什么定时器T1用做串行口波特率发生器时,常采用工作方式2?若已知系统时钟频率、通信选用的波特率,如何计算其初值?8.3T1的方式2模式不需要重装时间常数(计数初值),不影响cPU执行通信程序。设波特率为fboud计数初值为X,依据公式fbaud=(2smod/32)*(fosc/12(256-X))求得X=256-((2smod/32)*(fosc/fbaud))。8.4已知定时器T1设置为方式2,用做波特率发生器,系统时钟频率为6MHz,求可能产生的最高和最低的波特率是多少?8.4最低波特率为,T1定时最大值时,此时计数初值为256,并且SMOD=0,得fbaud=(1/32)*(fosc/(12(256-0))=61最高波特率为T1定时最小值且SOMD=1时,得fbaud=(2/32)*fosc/(12(256-1))=312508.5设甲、乙两机采用方式1通信,波特率为4800,甲机发送O,1,2,…,1FH,乙机接收存放在内部RAM以20H为首址的单元,试用查询方式编写甲、乙两机的程序(两机的fosc=6MHz)。8.5取SMOD=1计算TH1=TL1=B2;;***********************发送查询方式******ORG0000HMOVTMOD,#20HMOVTHl,#OB2HMOVTL1,#0B2HSETBTR1MOVSCON,#40HMOVA,#ONEXT:MOVSBUF,ATES:JBCT1,ADD1SJMPTESADD1:INCACJNEA,#20H,NEXTSJMP$END;************************发送中断方式*********************************ORG0000HAJMPMAIN;转主程序ORG0023H;中断服务CLRTIINCAMOVSBUF,ACJNEA,#20H,RE45 CLRESRE:RETIMAIN:MOVTMOD,#20H;主程序MOVTH1,#0B2HMOVTL1,#082HSETBTR1MOVSCON,#40HSETBEASETBESMOVA,#OMOVSBUF,ASJMP$;等待中断;*******************************接收查询方式***************************ORG0000HMOVTMOD,#20HMOVTH1,#0B2HMOVTL1,#0B2HSETBTR1MOVSCON,#50HMOVRO。#20HTEC:JBCR1,RECSJMPTESREC:MOV@R0,SBUFINCR0CJNER0,#40H,TECSJMP$END;******************************接收中断斤方式****************************ORGO000HAJMPMAIN;转主程序ORG0023H;中断服务CLRRIMOV@RO,SBUFINCR0CJNFR0,#40,RECLRESRE:RETIMAlN:MOVTMOD,#20H;主程序MOVTH1,#0B2HMOVTL1,#0B2HSETBTR1MOVSCON,50HSETBEASETBESSJMP$;等待中断END45 8.6一个8XX511单片机的双机通信系统波特率为9600,fosc=12MHz,用中断方式编写程序,将甲机片外RAM3400H~34AOH的数据块通过串行口传送到乙机的片外RAM4400H~44AOH单元中去。8.6/********************************发送程序***************************/#include#defineucharunsignedcharVOIdint4(void)ucharxdata*P;{P=Ox3400TMOD=0x20;TL1=0xfd;TH1=0xfd;SCON=0x40:TR1=1;EA=1;ES=1;SBUF=*P:whaile(1);/*等待中断*/}voidint4(void)interrupt4{TI=O:P++:SBUF=*P;if(P==0x34a0)EA=0;}/***********************接收程序***************************/#include#defineucherUnsigeriedcharvoidint4(void)charxdata*P:voidmian(){P=0x4400:TMOD=0x20;TL1=Oxfd:TH1=0xfd;SCON=0x50;TR1=1;EA=1;ES=1;for(;;);/*等待中断*/}voidint4(viod)interrupt4{RI=0;*P=SBUF;P++;if(P==0x44a1)EA=O;}8.7数据传送要求同题8.6,要求每帧传送一个奇校验位,编出查询方式的通信程序。8.45 7利用串行通信方式2(波特率固定),采用奇校验方式,将校验位放在TB8中.乙机检验校验位,如正确,则存于片外4400H开始的RAM中,如错误,通知对方重发,R6存放数据块长度。汇编语言程序如下:发送方ORG0000HMOVDPTR,#3400HMOVR6,#0A1HMOVSCON,#90HMOVSBUF,R6L2:JBCTI,L3AJMPL2L3:MOVA,@DPTRJBP,L4SETBTB8L4:MOVSBUF,AL5:JBCTI,L6AJMPL5L6:JBCRI,L7AJMPL6L7:MOVA,SBUFCJNEA,#0FFH,L8AJMPL3L8:INCDPLDJNZR6,L4SJMP$接收方ORG0000HMOVDPTR,#4400HMOVSCON,#90HL1:JBCRI,L2AJMPL1L2:MOVA,SBUFMOVR6,AL3:JBCRI,L4AJMPL3L4:MOVA,SBUFJBP,L5JNBRB8,L8sIMP$L5:JBJB8,L8L6:MOVX@DPTR,AINCDPLINCDPHDJNZR6,L3SJMP$L8:MOVA,#0FFHMOVSBUF,AL9:JBCTI,L345 AJMPL9SJMP$END8.8利用89C51串行口设计4位静态数码管显示器,画出电路并编写程序,要求4位显示器上每隔1s交替地显示"0123"和“4567”。8.8电路图见图8-12/*****************************查询方式****************************/#include#defineucharunsignedcharsbitP3_3=P3^3;charcodetab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,Oxf8,0xf8,0x80,0xg0};voidtimer(uchar);main(){uchai,a=3;SCON=0;for(;;){P3_3=1;for(i=0;i<4;i++){SBUF=tab[a];a--;while(!TI);TI=O;if(a==255)a=7;P3_3=0;timet(100);}}voidtimer(uchret){uehari;for(i=O;i#defineueharunsignedcharsbitP3_3=P3^3;uchara=3;charcodetab[]={0xc0;0xf9;0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};voidtimet(uchart);voidint4(void);main(){uchari,j;SCON=0;EA=1;ES=1;for(;;){P3_3=1;for(i=O,i<4,i++){SBUF=tab[a];j=a;while(j==a);}P3_3=0;timer(100);if(a==255)a=7;}voidint4(void)interrupt4{TI=0;a--;}voidtimer(uchart){uchari;for(i=0;i#defineCOM8255XBYTE[0x7fff]#defineA8255xBYTE[0x7fff]main(){unsignedintj;COM8255=0x80;A8255=0xf3:while(1){COM8255=0x0;for(j=O;j<=10000;j++);COM8255=0x01:for(j=0;j<=10000;j++);}}45 9.10在8XX51单片机上扩展一片8255,使用A口和C口设计4位数码管动态显示电路,显示"good"字符(G为小写)。9.108255A口、B口、C口、控制口地址分别为7CFFH、7DFFH、7EFFH、7FFFH,A口方式O输出,C口输出,控制字80H。设计见习题9.10图。ORG0000HMOVDPTR,#7FFFH;指向控制口MOVA,#80H;A口、B口均采用基本输出方式MOVX@DPTR,A;写控制字MOVDPTR,#7CFFHMOVA,#0MOVX@DPTR,A;清显示AGAIN:MOVR0,#0;R0存字形表偏移量MOVR1,#01;R1置数码表位选代码NEXT:MOVDPTR,#7EFFH;指向C口MOVA,R1MOVX@DPTR,A;从C口输出位选码MOVA,R0MOVDPTR,#TAB;置字形表头地址45 MOVCA,@A+DPTR;查字形码表MOVDPTR,#7CFFH;指向A口MOVX@DPTR,A;从A口输出字形码ACALLDAY;延时INCR0;指向下一位字形MOVA,R1RLA;指向下一位MOVR1,ACJNERl,#10H,NEXT;4个数码管显示完SJMPAGAINDAY:MOVR6,#50;延时子程序DL2:MOVR7,#7DHDL1:NOPNOPDJNZR7,DLlDJNZR6,DL2RETTAB1:DB6FH,3FH,3FH,5EH;“good”(good)的字形码9.1l在8XX51单片机上扩展一片EPROM27128、一片RAM6264和一片8255,采用线选方式,写出各自的地址范围。9.11提示:EPROM2712816KB×8,地址线为14根,6264为8KB×8位,地址线为13根,电路参阅图9-22。9.12列出图9-26中的I/O口、RAM、计数器、控制口地址。9.12根据电路连线图,见习题9.12图。I/O口:A口:FDF8H,B口:FDF9H,C口:FDFAH命令/状态口:FDFBH定时器TIMEL:FDFCHTIMEH:FDFDH存储器RAM:FC00H~FCFFH45 第10章单片机接口技术补充题1设4位ADC;当数字量为1000B时,Vo=5v时满档10V的。求被测电压Vi=8.2V的逐次逼近波形图。补充题1(答案)10V7.5V5V2.5V0VVi=8.2VVo8.125V8.75VD3D2D1D0时间电压10.1设计8XX51和DAC0832接口,要求地址为F7FFH,满量程电压为5V,采用单缓冲工作方式。画出电路图,编程使输出如下要求的模拟电压:(1)幅度为3V,周期不限的三角波电压。(2)幅度为4V,周期2ms的方波。(3)周期为5ms的阶梯波,阶梯的电压幅度分别为0V,1V,2V,3V,4V,5V,每一阶梯为1ms。10.1电路参照图10-3,不同的是将P2.7改为P2.3先计算各模拟量对应的数字量。3V对应的数字量为5V/3V一255/X,X=153=99H同样可算得1V,2V,4V对应的数字量分别为33H,66H,CCH①三角波MOVDPTR,#OF7FFHNEXTl:MOVA,#ONEXT:MOVX@DPTR,ANOPNOPINCACJNEA,#9AH,NEXTNEXTA:DECAMOVX@DPTR,ANOPNOPCJNEA,#0,NEXTASJMPNEXT1END45 #inclde#include#defineda0832XBYTE[0xf7ff]main(){unsignedchari,j;while{for(i=O;i<=153:i++){da0832=i:for(j=0;j<=100;j++);}for(i=153;i>=0:i--){da0832=i;for(j=O;j<=100;j++);}}}②方波4V对应的数字量为CCHMOVDPTR,#0F7FFHMOVA,#0NEXT:MOVX@DPTR,AACALLD2MSXRLA,#0CCHSJMPNEXT#include#include#defineda0832XBYTE[0xf7ff]main(){unsingdea=O,j;while(1){da0832=a;for(j=0;j<=255;j++);a=a^Oxcc:-}}③阶梯波MOVDPTR,#OF7FFHNEC:MOVA,#ONEXT:MOVX@DPTR,AACALLD1MSADDA,#33HCJNEA,#OFFH,NEXTANEXTA:MOVX@DPTR,AACALLD5MSSJMPNECmain(){unsiguedchari;unsiguedintj;while(1){45 for(i=0;i<=255:i+=51){da0832=i;for(j=O;j<=100;j++;);}}}10.2题目要求同题10.1,采用双缓冲方式。lO.2电路参考图10-4,增加一个地址.使用两条输出指令才能输出一个数据,其他同上。10.3设计89S51和DAC0832的接口,采用单缓冲方式,将内部RAM20H~2FH单元的数据转换成模拟电压,每隔1ms输出一个数据。10.3电路参照图10-3,地址为7FFFH。ORG0000HMOVDPTR,#7FFFHMOVR0,#20HMOVA,@R0NEXT:MOVX@DPTR,AACALLD11MSINCR0CJNER0,#30H,NEXTSJMP$END#include#include#defineda0809XBYTE[Ox7fff]main(){unsignedchar*p,i,j;p=0x20;for(i=0;i<=16;i++){da0832=*p;p++;for(i=0,j<=255;j++);}}10.4内部RAM的30H~3FH中存放着8个12位的二进制数,其中高4位放在高地址单元,低8位放在低地址单元,利用DACl210转换成模拟电压输出,要求用P2.0,P2.1,P2.2进行线选,编出程序,画出硬件电路。10.4电路参阅图10-6,不同的是将P2.5~P2.7改为P2.0~P2.2各地址分别为FEFFH、FDFFH、FBFFH。程序参照10.1节,注意修改RAM地址,循环执行该程序。10.5设计89S51和ADC0809的接口,采集2通道10个数据,存入内部RAM的50H~59H单元,画出电路图,编出:(1)延时方式;(2)查询方式;(3)中断方式的程序。1O.5电路参阅图10-9,不同的是:①延时方式:EOC悬空;②查询方式:EOC经非门接单片机P1.0(见习题10.6图);③中断方式同原图。下面仅编查询程序。IN2的地址为7FFAH,由于EOC经非门接单片机P1.0端口线,查询到P1.0为零,即转换结束。ORG0000HMOVR7,#OAHMOVR0,#50H45 MOVDPTR,#7FFAHNEXT:MOVX@DPTR,A;启动转换JBP1.0,$;查询等待MOVXA.@DPTR;渎人数据MOV@R0,AINCR0DJNZNEXTSJMP$#includc#include#defineucharunslgndechar#defineIN2xBYTE[ox7ffa]/*IN2地址*/sbitadbusy=P1^0);/*EOC*/voidmain(void){ucharidataad[10];uchari;for(i=O;i<=10;i++);/*采集10个数*/{IN2=0;/*启动转换*/while(adbusy==1);/*D3C等于O循环*/ad[i]=IN2/*存转换结果*/}}10.6设计89C51和ADC0809的接口,使用中断方式顺序采集8路模拟量。存入地址为20H~27H的内部RAM中。10.6ADC0809采集8路模拟信号,顺序采集一次,将采集结果存放于数组ad中。ADC0809模拟通道0~7的地址为7FF8H~7FFFH,以P1.0查询ADC0809的转换结束端EOC,电路如习题10-6图所示的查询方式。程序如下:#lnclude#include#defineucharunsignedchar#defineIN0XBYTE[0x7ff8]/*IN0地址*/sbitadbusy=P1^0;/*EOC*/voidad0809(ucharidata*x)/*A/D*/{ucharii;ucharxdata*ad_adr;ad_adr=&IN0;for(i=0;i<8;i++)/*处理8个通道*/{*ad_adr=0;/*启动转换*/while(adbusy==1);/*查EOC*/x[i]=*ad_adr;/*存转换结果*/ad_adr++;/*指向下一通道*/}}voidmain(void){ucharidataad[10];ad0809(ad);/*采样AD0809通道的值*/}45 10.7设计8XX51和8279的接口,使外接8个数码管和2×8矩阵键盘。(1)画出硬件电路;(2)最左边数码管显示“—”;(3)每一次按键,键值“O”~“F”从左到右顺次显示在数码管上。10.7参见4.6节例。第11章串行接口技术11.1在AT89S52上扩展两片AT24C04。11.1见习题11.1图习题11.1图11.2完成将O~9写入AT24C04的O~9单元。11.2参阅11.L5节11.3完成将AT24C04的O~9单元内容读出并分别存入内部RAM的20H~29H单元。11.3参阅11.1.5节11.4试用一片TLC5615设计一个51波形发生器,使能产生方波、锯齿波。11.4参阅第13章实验指导的实验711.5使用一片TLC549设计一个基于51单片机测量的低频有效值的电压表。11.5参阅第13章实验指导的实验8第12章嵌入式系统的设计与调试12.1单片机的抗干扰措施有哪些?45 12.1参阅12.3节12.2设计一个电子数字钟,并接一个小喇叭,使(1)具有交替显示年、月、日、时、分、秒的功能;(2)具备校正功能;*(3)具备设定闹钟和定时闹钟响功能;*(4)具备整点报时功能;*(5)具备生日提醒功能。其中,*为选做的扩展功能。12.2提示:利用定时/计数器定时l00ms,中断10次达1s,满60s,分加1s清O;满60分,小时加1分清0,同时分、秒均有十位数和个位数,按十进制进位,并送显示,显示可采用6个数码管(或8个数码管),校对可用按键中断方式或按键的查询进行加1校对,用并行口接驱动器(非门或三极管)驱动扬声器进行闹钟,如果采用89C51/S51做,由于片内已有程序存储器,4个口用户均可使用。12.3用单片机的定时器设计一个音乐盒,使能用按键选择演奏两支小乐曲,已知乐谱和频率的关系如下:C调音符5671234567频率(Hz)39244049452458866069878488098812.3提示:使用定时器产生不同频率的信号构成节拍,可以两个定时器联合使用。12.4设计一个模拟量采集系统,将所采集的模拟量显示在4个LED显示器或4个LCD显示器上。12.4提示:硬件由单片机、A/D转换、LED显示器或LCD显示器及必要的驱动、译码等电路构成。12.5题目题12.4,要求利用串行通信,使采集的数据或波形显示在PC的电脑屏幕上。12.5略第13章单片机实验(略)45'