1、集美大学信息单片机实验1. 实验2-1EXTRN CODE(Display8, GetBCDKey)BUFFER2 DATA 70H;8字节显示缓冲区BUFFER DATA 30H BLOCK data 50HRESULT DATA 40HF1 BIT 0D1H ;PSW.1 ORG 0000H LJMP START ORG 0100HSTART: MOV SP,#60H CLR F1 ;先清除显示,再接收键输入START1: MOV R0,#BUFFER MOV A,#4 ;按键次数 LCALL GetBCDKey ;得到双字节十进制数(乘数) MOV R0,#BUFFER ACALL BC
2、D2B ;转换成二进制数 MOV BLOCK,R3 MOV BLOCK+1,R4 SETB F1 ;接收到第一个键,才清除显示 MOV R0,#BUFFER MOV A,#4 ;按键次数 LCALL GetBCDKey ;得到双字节十进制数(减数) MOV R0,#BUFFER ACALL BCD2B MOV BLOCK+2,R3 MOV BLOCK+3,R4 MOV R4,BLOCK ;四个BCD入口参数 MOV R5,BLOCK+1 MOV R6,BLOCK+2 MOV R7,BLOCK+3 MOV R0,#RESULT lCALL MLTY MOV R3,RESULT MOV R2,RE
3、SULT+1 MOV R1,RESULT+2 MOV R0,RESULT+3 ACALL B4toD4 ;字节二进制数转十进制数;R0R1R2R3为二进制数,R4R5R6R7为压缩BCD码 MOV A,R7 ANL A,#0FH MOV BUFFER2,A MOV A,R7 ANL A,#0F0H SWAP A MOV BUFFER2+1,A MOV A,R6 ANL A,#0FH MOV BUFFER2+2,A MOV A,R6 ANL A,#0F0H SWAP A MOV BUFFER2+3,A MOV A,R5 ANL A,#0FH MOV BUFFER2+4,A MOV A,R5 AN
4、L A,#0F0H SWAP A MOV BUFFER2+5,AMOV A,R4 ANL A,#0FH MOV BUFFER2+6,A MOV A,R4 ANL A,#0F0H SWAP A MOV BUFFER2+7,A MOV R0,#BUFFER2 LCALL Display8 sjmp $ BCD2B: MOV R1,#BUFFER MOV R2,#2S: MOV A,R1 PUSH ACC ANL A,#0FH MOV R0,A POP ACC JNB ACC.4,NEXT1 ;分别判断4,5,6,7位是否为1,分别加上10,20,40,80 XCH A,R0 ADD A,#10 X
5、CH A,R0NEXT1: JNB ACC.5,NEXT2 XCH A,R0 ADD A,#20 XCH A,R0NEXT2: JNB ACC.6,NEXT3 XCH A,R0 ADD A,#40 XCH A,R0NEXT3: JNB ACC.7,NEXT4 XCH A,R0 ADD A,#80 XCH A,R0NEXT4: MOV A,R0 PUSH ACC INC R1 DJNZ R2,S POP ACC MOV R0,A POP ACC MOV B,#100 ;高2位(千位、百位)乘以100 MUL AB ADD A,R0 MOV R3,A ;转换成的二进制数放在R4R3中 MOV A,
6、B ADDC A,#0 MOV R4,A RET ;字节二进制数转十进制数;R0R1R2R3为二进制数,R4R5R6R7为压缩BCD码;该子程序也可以模仿书上(胡汉才)例4.22,采用除以10、其余数为个位数字,其商继续除以10得十位数字,依次类推B4toD4: CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,A MOV B,#32LOOP: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R1 RLC A MOV R1,A MOV A,R0 RLC A MOV R0,A MOV A,R7
7、;算法举例:例如数据为0010 0100(36),则过程为 ADDC A,R7 ; A R7 DA A ; 0 0 MOV R7,A ; 0 0 MOV A,R6 ; 1 1 ADDC A,R6 ; 2 2 DA A ; 4 4 MOV R6,A ; 9 9 MOV A,R5 ; 18 18 ADDC A,R5 ; 36 36 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ B,LOOP RET MLTY: MOV A,R6 MOV B,R4 MUL AB MOV R0,A MOV R3,B MOV A,R7 MOV B,R4 MUL A
8、B ADD A,R3 MOV R3,A MOV A,B ADDC A,#00H MOV R2,A MOV A,R6 MOV B,R5 MUL AB ADD A,R3 INC R0 MOV R0,A MOV A,R2 ADDC A,B MOV R2,A MOV R1,#00H JNC NXT1 INC R1NXT1: MOV A,R7 MOV B,R5 MUL AB ADD A,R2 INC R0 MOV R0,A MOV A,B ADDC A,R1 INC R0 MOV R0,A RET end2.实验2-2ORG 0000H LJMP MAIN ORG 1000H MAIN: MOV R7,
9、#15 CLR F0 LOOP1:PUSH 07H MOV R0,#30H MOV R1,#31H SJMP LOOP2 LOOP4:DEC R7 SJMP LOOP1 LOOP2:MOV A,R0 SUBB A,R1 JC LOOP3 SETB F0 MOV A,R0 XCH A,R1 XCH A,R0 LOOP3:INC R0 INC R1 DJNZ R7,LOOP2 POP 07H JB F0,LOOP4 END3.实验3-1电子钟EXTRN CODE(GetbcdkEY,Display8) BUFFER1 DATA 40H BUFFER2 DATA 60H ORG 0000H LJMP
10、 MAIN ORG 000BH LJMP ITOP ORG 1000H MAIN: CLR PSW.1 MOV R0,#BUFFER1 MOV A,#06H ; LCALL GetBCDKey MOV 20H,#20 MOV TMOD,#01H MOV TL0,#0b0H MOV TH0,#3cH SETB TR0 SETB ET0 SETB EA SJMP $ ITOP:PUSH PSW PUSH ACC MOV TL0,#0b0H MOV TH0,#3cH DJNZ 20H,LOOP MOV 20H,#20 ;重置中断次数 MOV A,#01H ;秒增加1 ADD A,42H DA A ;
11、秒单元十进制调整 MOV 42H,A CJNE A,#60H,LOOP ;是否到60秒,未到返回 MOV 42H,#00H ;记满30秒,秒单元请零 MOV A,#01H ;分单元增1 ADD A,41H DA A ;分单元十进制调整 MOV 41H,A CJNE A,#60H,LOOP ; MOV 41H,#00H MOV A,#01H ADD A,40H DA A MOV 40H,A CJNE A,#24H,LOOP MOV 40H,#00H LOOP:MOV R0,#40H MOV R6,#03H MOV R1,#50H DECOMP:MOV A,R0 SWAP A ANL A,#0FH
12、 MOV R1,A INC R1 MOV A,R0 ANL A,#0FH MOV R1,A INC R0 INC R1 DJNZ R6,DECOMP MOV R0,#BUFFER2 MOV BUFFER2,55H MOV BUFFER2+1,54H MOV BUFFER2+2,53H MOV BUFFER2+3,52H MOV BUFFER2+4,51H MOV BUFFER2+5,50H MOV BUFFER2+6,#10H MOV BUFFER2+7,#10H LCALL Display8 POP ACC POP PSW RETI END 4.秒表EXTRN CODE(GetbcdkEY,
13、Display8) BUFFER1 DATA 40H BUFFER2 DATA 60H ORG 0000H LJMP MAIN ORG 000BH ; 定时器T0中断LJMP ITOP ORG 1000H MAIN: CLR PSW.1 ;先清显示,再接收键盘输入 MOV R0,#BUFFER1 MOV A,#06H ;按键次数6次 LCALL GetBCDKey ;调键盘程序 MOV 20H,#1 ;循环次数 MOV TMOD,#01H ;计时器T0选择方式一 16位计数器 MOV TL0,#18H MOV TH0,#0FCH SETB TR0 ;开计时器T0 SETB ET0 SETB E
14、A DAN: JB P1.0, $ ;比较P1.0口(暂停口),若为0,则往下执行,若为1,则在本行等待 CLR TR0 ;关计时器,暂停秒表计数 JNB P1.0,$ ;比较P1.0口(暂停口),若为1则往下执行,若为0,则在本行等待 SETB TR0 ;开计时器,继续秒表计数 JB P1.1, DAN ;比较P1.1口(清零口), 若为1,则跳DAN(继续等待),若为0,则往下执行(全部清零) MOV 40H,#00 ;微秒 单元清零 MOV 41H,#00 ;毫秒 单元清零 MOV 42H,#00 ;秒 单元清零 SJMP DAN ITOP:PUSH PSW PUSH ACC MOV T
15、L0,#18H ;计时器T0重新赋初值 MOV TH0,#0FCH DJNZ 20H,LOOP ;减1,比较是否为0, 不为0则跳LOOP MOV 20H,#1 ;重新赋循环次数 MOV A,#01H ;微秒 单元+ 1 ADD A,40H DA A ;十进制调整 MOV 40H,A CJNE A,#99H,LOOP ; 微秒单元中的数字和99H比较,若小于等于99H, 则跳转到LOOP MOV 40H,#00H ; 微秒单元零 MOV A,#01H ;毫秒 单元 +1 ADD A,41H DA A MOV 41H,A CJNE A,#10H,LOOP MOV 41H,#00H ;毫秒单元 清
16、零 MOV A,#01H ;秒单元 + 1 ADD A,42H DA A MOV 42H,A CJNE A,#60H,LOOP ;比较是否过了60秒 ? 过了则清零 MOV 42H,#00H ;秒单位请零LOOP:MOV R0,#40H ; 寄存器赋初值 ,为下面做准备 MOV R6,#03H ;次数3次 MOV R1,#50H ;保存到50H单位中DECOMP:MOV A,R0 SWAP A ;高低字节互换 ANL A,#0FH ; 取高字节 MOV R1,A ;高字节存到R1 INC R1 ;R1 地址 + 1 MOV A,R0 ANL A,#0FH MOV R1,A ;低字节存到 R1
17、INC R0 INC R1 DJNZ R6,DECOMP ;上面从LOOP开始整个的意思就是把40H中的微秒,毫秒,秒的数据放到50H中,然后下面开始在LED上显示 MOV R0,#BUFFER2 MOV BUFFER2,51H MOV BUFFER2+1,50H MOV BUFFER2+2,53H MOV BUFFER2+3,52H MOV BUFFER2+4,55H MOV BUFFER2+5,54H MOV BUFFER2+6,#10H MOV BUFFER2+7,#10H LCALL Display8 POP ACC POP PSW RETI END 6、航标灯ORG 0000H LJ
18、MP MAIN ORG 0003HLJMP IIE0ORG 000BH ; 定时器T0中断LJMP ITOP ORG 1000H MAIN: SETB EX0 ; SETB EA L: JB P3.2,L CLR TR0 SETB p1.0 LJMP LIIE0: push psw push ACC MOV 20H,#40 ;循环次数 MOV TMOD,#01H ; 计时器T0选择方式一 16位计数器 MOV TL0,#0B0H ;50ms MOV TH0,#3CH SETB ET0 SETB TR0 POP ACC POP PSW RETIITOP:PUSH PSW PUSH ACC MOV
19、 TL0,#0B0H MOV TH0,#3CH DJNZ 20H,LOOP ;减1,比较是否为0, 不为0则跳LOOP MOV 20H,#40 ;重新赋循环次数 CPL P1.0 LOOP:POP ACC POP PSW RETI END 7、串行口接收ORG 0000H LJMP MAIN ORG 0023H LJMP SINT ORG 0100H MAIN: MOV SP, #60H MOV TMOD, #20H ;T1方式2MOV TH1, #0E8H MOV TL1, #0E8H MOV SCON, #0D0H ;串行口3 MOV PCON, #80H SETB ES CLR ET1
20、SETB EA SETB TR1 MOV R0, #41H ;存入41H开始单元MOV R7, #0DH ;接收次数13次SJMP $ SINT: CLR RI MOV A, SBUFMOV C, P CPL CJNC L1 JNB RB8, ERR AJMP L2 L1: JB RB8, ERR L2: MOV R0, AINC R0 DJNZ R7, L3 ;比较是否接收13次CLR ES CLR ET1 CLR TR1 AJMP L3 ERR: CLR P1.0 ;点亮LED L3: RETI END8、串行口发送 ORG 0000H LJMP MAIN ORG 0023H LJMP S
21、INT ORG 0100H MAIN: MOV SP, #60H MOV TMOD, #20H ;T1方式2MOV TH1, #0E8H MOV TL1, #0E8H MOV SCON, #0D0H ;串行口3 MOV PCON, #80H SETB ES CLR ET1 SETB EA SETB TR1 MOV DPTR ,#TAB ;要发送的数据存入DPTRMOV R7, #0DH ;发送次数13次SETB TI SJMP $ SINT: CLR TICLR A MOVC A, A+DPTR MOV C, P MOV TB8, C MOV SBUF, A INC DPTR DJNZ R7,
22、 L1 JNB TI,$CLR ES CLR ET1 CLR TR1 L1: RETI TAB:DB J,M,U DB 2,0,0,9,8,2,0,0,2,0END9、并转串ORG 0000H LJMP MAIN ORG 0100H MAIN: clr p1.3 ;SERINIT: CLR P1.2 ;SH NOP SETB P1.2 ;;SH上升沿 CLR P1.3 ;;P1.3(CLK口)清零 MOV R5,#8 ; ;循环次数8次PRO: JB P3.0,NEXT ;;查询 P3.0 口. CLR C SJMP NEXT1NEXT: SETB C NEXT1: RLC A SETB P1
23、.3 ;CLK一次 NOP CLR P1.3 DJNZ R5,PRO CPL A ;;取反A MOV P2,A ;;P1整个排线 LJMP INITDELAY: MOV R7,#200DELAY1: MOV R6,#125DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET END10、串转并ORG 0000H LJMP MAIN ORG 0100H MAIN: CLR P1.3 ;CLK清零 SETB C MOV A,#0FeHINIT: MOV R5,#8 ;循环次数8次PRO: RRC A ;;A中内容带进位右移一位 JC NEXT ;;下面就是比较进位端
24、CLR P1.2 SJMP NEXT1NEXT: setb P1.2 ;;然后开关P1.2 口NEXT1: SETB P1.3 NOP ;;CLK一次 CLR P1.3 DJNZ R5,PRO CALL DELAY ;;延时程序 CALL DELAY LJMP INIT DELAY: MOV R7,#255;200DELAY1: MOV R6,#255;125DELAY2: DJNZ R6,DELAY2 DJNZ R7,DELAY1 RET END11、iic总线 SDA BIT P1.2 SCL BIT P1.3 A24C02_WRITE EQU 0A8H A24C02_READ EQU 0
25、A9H ORG 0000H LJMP MAIN ORG 0100HMAIN: MOV SP,#60H MOV DPTR ,#TAB ;;要发送的内容存入DPTR MOV R0,#30H MOV B,#0FHLOOP: CLR A MOVC A, A+DPTR MOV R0,A INC DPTR INC R0 DJNZ B,LOOP ;;上面到这是把TAB存入30H以后单元 MOV R1,#30H ; ;这部分开始是发送的 MOV R2,#40H MOV R0,#0FH ; ;次数15次WRITE_BYTE: LCALL START ; ;发送起始信号 MOV A,#A24C02_WRITE ;
26、器件写地址,表示写操作 LCALL WRITE_8BITS ; ;写入8位 LCALL ACKNOWLEDGE ; ;等待从机应答 MOV A,R2 ;写入地址 LCALL WRITE_8BITS LCALL ACKNOWLEDGE MOV A,R1 ;写入数据 LCALL WRITE_8BITS LCALL ACKNOWLEDGE LCALL STOP ;;停止信号 LCALL ACKPOLLING INC R2 INC R1 DJNZ R0,WRITE_BYTE ;;是否发送15次? MOV R1,#50H ;;这部分开始是接收的 MOV R2,#40H MOV R0,#0FHREAD_B
27、YTE: LCALL START MOV A,#A24C02_WRITE LCALL WRITE_8BITS LCALL ACKNOWLEDGE MOV A,R2 LCALL WRITE_8BITS LCALL ACKNOWLEDGE currentread: LCALL START MOV A,#A24C02_READ LCALL WRITE_8BITS LCALL ACKNOWLEDGE LCALL READ_8BITS MOV R1,A INC R1 DJNZ R0,currentread LCALL STOP SJMP $ WRITE_8BITS: MOV R7,#8WRITE_8BITS_1: RLC A CLR SCL LCALL DELAY_TIME MOV SDA,C SETB SCL LCALL DELAY_TIME DJNZ R7,WRITE_8BITS_1 CLR SCL RET READ_8BITS: MOV R7,#8READ_8BITS_1: CLR SCL LCALL DELAY_TIME SETB SCL ;SCL为