本实验是通过51系列单片机控制独立按键、LED以及蜂鸣器,实现一些组合型 实验原理图如下:Po I 2 10 6 0 6 p p p Prii易 68」< 15・3 4合盒 n n n -B- i. t p p p p pTp R8 90 9 Sr 64-333 3PG.4 jSP0.5 j4P0.6 j*1QP3 心 kxdea j L 1 ]p; I TXD;\LE ?0 E2p5 itntcp铳f 29 13P3 Jis-TiP:.- 2S 14m,P2 2"P2.5 26 16pjJ?UR P2.1 :5 广k_; - rd P2 3 24 18KIAL2 P2.2 23 19X1 Al I PL1 22 ZOCrND P2 n 21\X'C-- 1'n二汇编程序1如下:独立按键控制LED和蜂鸣器功能:独立按键控制LED和蜂鸣器----实现功能按1键,L1发光二极管闪烁四次,然后,从 L8向L1循环闪亮两次; 按2键,L2发光二极管闪烁四次,然后,蜂鸣器唱歌曲-----兰花草SPK EQU P3.7ORG 0000H ; 伪指令,指定程序从0000H开始存放LJMP START ; 跳转指令,程序跳转至 MAIN处执行ORG 0100H ; 伪指令,指定程序从0030H开始存放START: MOV SP, #60H ;给堆栈指针赋初值MOV P1,#0FFH ; 初始化端口MOV P3,#0FFHMAIN: JNB P3.2,KEY1 ;JNB P3.3,KEY2 ;LJMP MAINKEY1: LCALL DEL10MS ;JNB P3.2,MAINMOV R4,#4C1: CLR P1.0LCALL DEL1SSETB P1.0LCALL DEL1SDJNZ R4,C1MOV R3,#02LIGHT: MOV R4,#08 ; 设置循环次数MOV A,#0FEH ; 给 A 赋初值LOOP1: RR A ; 将 A 的值右移一位MOV P1,A ; 将A的值赋给P1 口LCALL DEL1S ; 调用 1S 延时子程序DJNZ R4,LOOP1 ; 判断R4是否为0,不为0跳转,为0顺序执行DJNZ R3,LIGHTMOV P1,#0FFHLJMP MAINKEY2: LCALL DEL10MS ;JNB P3.3,MAINMOV R4,#4C2: CLR P1.1LCALL DEL1SSETB P1.1LCALL DEL1SDJNZ R4,C2MOV R3,#00H ; 给 R3赋值NEXT:MOV A,R3MOV DPTR,#TABLE; 查表MOVC A,@A+DPTRJZ STARTMOV R7,AINC R3MOV A,R3MOVC A,@A+DPTRMOV R2,AACALL SONGINC R3SJMP NEXTLJMP MAIN ;=== 歌曲播放子程序 ===SONG:MOV A,R2 ; 取出节拍RL AJNZ KEEPMOV A,#01HKEEP:MOV R2,AREPEAT:ACALL EIGHTHDJNZ R2,REPEATRET;=== 产生 1/8 拍延时子程序 ===EIGHTH:MOV A,R7 ; 查表取出廷时参数 , 保存到 R4MOV DPTR,#DELAY_TMOVC A,@A+DPTRMOV R4,AMOV A,R7 ; 查表取出 1/8 拍周期数 , 保存到 R5MOV DPTR,#S_PARAMOVC A,@A+DPTR MOV R5,ANEXTCYC:ACALL SOUNDDJNZ R5,NEXTCYCRET;=== 发声子程序 ===SOUND:SETB SPKACALL SDELAYCLR SPKACALL SDELAYRET;=== 延时子程序 === SDELAY:MOV A,R4 ; 廷时值在 R4 内MOV R0,AXL2:MOV R1,#03HDL1:NOPDJNZ R1,DL1DJNZ R0,XL2RETDEL1S: MOV R5,#089H ;1S 延时子程序,11.0592MHz误差为 0DL1S0: MOV R6,#0A4HDL1S1: MOV R7,#013HDJNZ R7,$DJNZ R6,DL1S1DJNZ R5,DL1S0RETDEL10MS: MOV R5,#065HDL10MS0: MOV R6,#030HDJNZ R6,$DJNZ R5,DL10MS0 RET;=== 1/8 拍周期表 ===S_PARA:DS 1DHDB 15H,16H,00DB 19H,00H,1CH,00H,1FH,21H,00H,25HDB 00H,29H,2CH,00H,31H,34H,37H,00HDB 3EH,41H,00H,49H,00H,52H,57H,00HDB 62H;=== 延时参数表 ===DELAY_T:DS 1DHDB 7EH,77H,00HDB 6AH,00H,5EH,00H,54H,4FH,00H,46HDB 00H,3FH,3BH,00H,35H,32H,2FH,00HDB 2AH,27H,00H,23H,00H,1FH,1DH,0C0HDB 1AH;=== 歌曲表 ===TABLE:DW 2202H,2902H,2902H,2902H,2906H,2702H ;我从山中来DW 2502H,2702H,2502H,2402H,2208H ;带着兰花草DW 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H;在小园中DW 2902H,2C02H,2D02H,2A02H,2908H 祈祷花开早DW 2902H,2E02H,2E02H,2C02H,2906H,2702H 一; 日看三回DW 2502H,2702H,2502H,2402H,2206H,1D02H ;看得花时过DW 1D02H,2502H,2502H,2402H,2206H,2902H ;兰花却依然DW 2702H,2502H,2402H,2002H,2208H ;苞也无一个DW 0000H;END汇编程序 2 如下:; 独立按键控制 LED;功能:独立按键控制LED,实现功能;按1键,L1发光二极管闪烁四次;按2键,L2发光二极管闪烁四次;;按3键,L3发光二极管闪烁四次;按4键,L8-L1二极管循环闪烁 ;2 次【此为查询方式】ORG 0000H ; 伪指令,指定程序从 0000H 开始存放LJMP START ; 跳转指令,程序跳转至 MAIN处执行ORG 0100H ; 伪指令,指定程序从0030H开始存放START: MOV SP, #60H ; 给堆栈指针赋初值MOV P1,#0FFH ; 初始化端口MOV P3,#0FFHMAIN: JNB P3.2,KEY1 ;JNB P3.3,KEY2 ;JNB P3.4,KEY3 ;JNB P3.5,KEY4 ;LJMP MAINKEY1: LCALL DEL10MS ;JNB P3.2,MAINMOV R4,#4C1: CLR P1.0LCALL DEL1SSETB P1.0LCALL DEL1SDJNZ R4,C1LJMP MAINKEY2: LCALL DEL10MS ;JNB P3.3,MAINMOV R4,#4C2: CLR P1.1LCALL DEL1SSETB P1.1LCALL DEL1SDJNZ R4,C2LJMP MAINKEY3: LCALL DEL10MS ;JNB P3.4,MAINMOV R4,#4C3: CLR P1.2LCALL DEL1S SETB P1.2LCALL DEL1SDJNZ R4,C3LJMP MAINKEY4: LCALL DEL10MSJNB P3.5,MAINMOV R3,#02LIGHT: MOV R4,#08 ;设置循环次数MOV A,#0FEH ;给 A 赋初值LOOP1: RR A ;将 A 的值右移一位MOV P1,A ;将A的值赋给P1 口LCALL DEL1S ;调用 1S 延时子程序DJNZ R4,LOOP1 ;判断R4是否为0,不为0跳转,为0顺序执行DJNZ R3,LIGHTMOV P1,#0FFHLJMP MAINDEL1S: MOV R5,#089H;1S 延时子程序,11.0592MHz误差为0DL1S0: MOV R6,#0A4HDL1S1: MOV R7,#013HDJNZ R7,$DJNZ R6,DL1S1DJNZ R5,DL1S0RETDEL10MS: MOV R5,#065HDL10MS0: MOV R6,#030HDJNZ R6,$DJNZ R5,DL10MS0RETEND。