MCS-51笔记
转载笔记
Debug 相关
查看数据时要加上前缀,如片内RAM的20H单元,写作D:20H
作业一
原作业
//第一题 R0转换成七段数码管显示
ORG 0000H
MOV A,R0
MOV DPTR,#SEVEN_SEG
MOVC A,@A+DPTR
SJMP TRANS
SEVEN_SEG:
DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,4FH
DB 77H,0xFC,39H,5EH,79H
DB 71H
TRANS:
MOV P1,A
RET
//第二题 实现逻辑功能函数
ORG 0000H
U EQU 30H
V EQU 31H
W EQU 32H
X EQU 33H
Y EQU 34H
Z EQU 35H
RES1 EQU 36H
RES2 EQU 37H
RES3 EQU 38H
RES4 EQU 39H
RES5 EQU 3AH
MOV A,V
MOV R0,W
ACALL MYOR
XCH A,RES1
MOV A,Y
ACALL MYNOW
XCH A,RES2
MOV A,U
MOV R0,RES1
ACALL MYAND
XCH A,RES3
MOV A,X
MOV R0,RES2
ACALL MYAND
XCH A,RES4
MOV A,Z
ACALL MYNOT
XCH A,RES5
MOV A,RES3
MOV R0,RES4
ACALL MYOR
MOV R0,RES5
ACALL MYOR
SJMP $
MYAND:
ANL A,R0
RET
MYOR:
ORL A,R0
RET
MYNOT:
XRL A,#11111111B
RET
//第三题 嵌套延时
ORG 0000H
DELAY:
MOV R0,#20H
DELAY1:
MOV R1,#100D
DELAY2:
NOP
NOP
NOP
DJNZ R1,DELAY2
DJNZ R0,DELAY1
SJMP $
//第四题
ORG 0000H
MAX EQU 20H
MIN EQU 21H
SUM EQU 22H
MOV R0 ,#40H
MOV R1 ,#09H
MOV SUM , @R0
MOV MIN , @R0
MOV MAX , @R0
LOOP:
INC R0
MOV A ,@R0
ADD A ,SUM
MOV SUM ,A
MOV A ,@R0
CLR C
CJNE A,MIN,SMALL //新值比目前最小值小
FINDBIG:
CLR C
MOV A ,@R0
CJNE A,MAX,BIG //新值比目前最大值大
BACKTOLOOP:
DJNZ R1,LOOP
MOV A ,SUM
SUBB A ,MAX
SUBB A ,MIN
MOV B,#08H
DIV AB
MOV DPTR,#2100H //将结果存入片外2100H
MOVX @DPTR,A
SJMP $
SMALL:
JC EX
SJMP FINDBIG
EX:
MOV MIN , A
SJMP FINDBIG
BIG:
JC BACKTOLOOP
MOV MAX , A
SJMP BACKTOLOOP
ppt第1题
MOV A,#10// A变为10,psw:P=0,pc+1
MOV R0,#20H// R0,pc+1
MOV 30H,@R0// 30H的值变为20H中的值50H,pc+1
ADD A,30H// A的值加上30H中的值,变为90,psw:Cy=0,AC=1,P=0,pc+1
MOV DPTR,#2000H// DPTR变为2000H,pc+1
MOVX @DPTR,A// 外部存储器单元2000H的值变为90,pc+1
MOV SP,#30H// SP=30H,pc+1
PUSH A// A的值压入栈中 SP=31H,pc+1
PUSH DPL// DPTR低八位压入栈中 ,SP=32H,pc+1
PUSH DPH// DPTR高八位压入栈中 ,SP=33H,pc+1
ppt第2题
是通过不同的控制总线,来把数据存储器和程序存储器严格分开。
读写数据存储器时,RD 和 WR 分别输出控制信号。
读出程序存储器时,PSEN ,输出控制信号。
ppt第3题
1)
MOV A,R7
MOV R4,A
2)
MOV DPTR,#20H
MOVX A,@DPTR
MOV R0,A
3)
MOV DPTR,#2000H
MOV A,00H
MOVC A,@A+DPTR
MOV R2,A
4)
MOV DPTR,#0456H
MOVX A,@DPTR
MOV DPTR,#0078H
MOVX @DPTR,A
ppt第4题
MOV A,@R0// A = 80H,PSW:P=1
MOV @R0,40H// (32H) = 40H
MOV 40H,A// (40H) = 80H
MOV R0,#40H R0=40H
ppt第5题
MOV R0,#30H
MOV DPTR,#0F00H
LOOP:
MOV A,@R0
MOVX @DPTR,A
INC DPTR
INC R0
CJNE R0,#40H,LOOP
SJMP $
ppt第6题
MOV R0,#20H
MOV R1,#30H
LOOP:
MOV A,@R0
MOV B,@R1
MOV @R1,A
MOV @R0,B
INC R0
INC R1
CJNE R0,#2AH,LOOP
SJMP $
ppt第7题
MOV 21H,#5AH// (21H) = 5AH
MOV R0,#21H// R0 = 21H
MOV R1,#2FH// R1 = 2FH
MOV A,@R0// A = 5AH
CPL A// A = A5H
MOV @R1,A// (2FH) = A5H
INC R0// R0 = 22H
RL A// A = 4BH
MOV @R0,A// (22H) = 4BH
SETB ACC.2// A = 4FH
结果:
(21H) = 5AH
(2FH) = A5H
(22H) = 4BH
A = 4FH
ppt第7题(3.12)
SP = 42H
A = 30H
B = 30H
PC = 0x200C
报告
DATA EQU 9CH
START EQU 2010H //填充的起始地址
COUNT EQU 256 //要填充的单元个数
ORG 0000H
AJMP MAIN
MAIN:
MOV A, #DATA //数据送入累加器Acc
MOV DPTR, #START //起始地址送入DPTR寄存器
MOV R0, #COUNT //要填充的单元个数送入R0寄存器
LOOP:
MOVX @DPTR, A //累加器中的数据写入DPTR指向的单元
INC DPTR //DPTR加1,指向下一个单元
DJNZ R0, LOOP //R0减1,表示剩余的单元个数
STOP:
SJMP STOP
END // 程序结束
``asm
NUM EQU 6 // 6个数码管
SEG EQU 4 // 4个发光二极管
DELAY EQU 0 // 延时为0
ORG 0000H
AJMP MAIN //
MAIN:
MOV P1, #0xFE //初始化,重置
MOV P2, #00H
MOV R0, #NUM // 每次重置R0
LOOP: //大循环遍历数码管
MOV R1, #SEG //每次大循环重置小循环R1
MOV A, #0xFE //重置A
SUB_LOOP: //子循环遍历二极管
MOV P2 A
LCALL DELAY_S // 调用延时子程序
RL A
DJNZ R1, SUB_LOOP // 循环判断
MOV A P1 // 用A来更改P1
RL A
MOV P1 A // 选择下一个数码管
DJNZ R0, LOOP //R0自减1,如果不为0,跳转到循环开始,否则继续执行
SJMP MAIN // 跳转
DELAY_S: // 延时子程序
MOV R3,#0
DELAY_LOOP:
MOV R4,#0
DJNZ R4,$
DJNZ R3,DELAY_LOOP
RET // 返回
END // 程序结束
```asm
TAB0 EQU 0020H // 数码管码表地址
ORG 0000H
MOV DPTR,#TAB0
AJMP MAIN // 主程序
MAIN:
MOV P1, #0FEH // 位选第一个数码管
MOV P2, #0FFH //关闭所有段
MOV R0, #6 // 显示6个数码管
MOV A, #0FEH // 11111110
LOOP:
MOV R1, A // 保存位选位置
MOV P1, A
MOV A, P0 //P0开关结果赋值A
ANL A, #07H // A and 0000 0111 , 只保留低三位
CASE1:
CJNE A, #01H, CASE2 // 如果是1键不等于ON,继续判断2键,否则显示
SJMP DISPLAY //
CASE2:
CJNE A, #02H, CASE3 //如果是2键不等于ON,继续判断3键,否则显示
SJMP DISPLAY
CASE3:
CJNE A, #04H, CASE4 ////如果是3键不等于ON,没有按键按下,否则显示
MOV A, #03H
SJMP DISPLAY
CASE4:
MOV A,00H //显示0
SJMP DISPLAY
DISPLAY:
MOVC A,@A+DPTR //查段选码
MOV P2, A //字形码送入P2口,段选
LCALL DELAY //延时程序
MOV A,R1 //恢复上一次位选
RL A
DJNZ R0, LOOP //R0减1循环共6次
SJMP MAIN //完成大循环:六个数码管均完成小循环。跳转MAIN重置
DELAY: //延时程序
MOV R3,#0
DELAY_LOOP:
MOV R4,#0
DJNZ R4,$
DJNZ R3,DELAY_LOOP
RET //返回
TAB0:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
END //程序结束
ORG 0000H
AJMP MAIN // 跳转
MAIN:
MOV P1, #0FEH // 选择第一个数码管
MOV P2, #0FFH // 关闭所有发光二极管
MOV R0, #8 // 8位个数码管循环
MOV A, P0
MOV R1, A //保存P0口开关
MOV A, #0FEH // 11111110
LOOP:
MOV R1, A //保留位选数
MOV P1, A //送位选
MOV A, R1
RLC A // 循环左移A寄存器,并将最高位送入C标志位
JC ZERO // 如果C标志位为1,表示开关置“ON”,跳转显示0
ONE:
MOV P2, #F9H // 开关置“OFF”,显示1
SJMP NEXT
ZERO:
MOV P2, #C0H //显示数字“0”
NEXT:
LCALL DELAY // 调用延时子程序
MOV A, R1
RL A
DJNZ R0, LOOP // 循环8次
SJMP MAIN // 跳转 MAIN
// 延时子程序
DELAY:
MOV R3,#0
DELAY_LOOP:
MOV R4,#0
DJNZ R4,$
DJNZ R3,DELAY_LOOP
RET // 返回
END // 程序结束
ORG 0
AJMP INIT
ORG 0003H
AJMP INTOR
INIT:
MOV IE,#81H //允许 INT0 中断,置 EA=1
SETB IT0 //边沿触发中断
MOV R0,#0 //计数初值为0,高八位
MOV R1,#0 //低八位
LOOP:
MOV A,R0 //将R0赋A
MOV B,#10 //计算个位数
DIV AB
MOV R2,A
MOV A,B
MOV P1,#0FEH //第一个数码管
MOV DPTR,#TAB0 //字形码表送 DPTR
MOVC A,@A+DPTR //查表
MOV P2,A //显示
LCALL DELAY // 调用延时子程序
MOV A,R2 //继续得出十位数和百位数
MOV B,#10H
DIV AB
MOV R2,A
MOV A,B
MOV P1,#0FDH //第二个数码管
MOV DPTR,#TAB0 //字形码表送 DPTR
MOVC A,@A+DPTR //查表
MOV P2,A //显示
LCALL DELAY
MOV A,R2 //百位数送入A
MOV P1,#0FBH //第三个数码管
MOV DPTR,#TAB0 //字形码表送 DPTR
MOVC A,@A+DPTR //查表
MOV P2,A //显示
LCALL DELAY
SJMP LOOP
INTOR:
INC R0 //中断次数加 1
CJNE R0,#0xFF,RET0 //中断是否满 256 次
MOV R0,#0 //归零
RET0:
POP DPH //弹出断点
POP DPL
MOV DPTR,#LOOP
PUSH DPL //修改中断返回点
PUSH DPH
RETI
// 延时子程序
DELAY:
MOV R4,#0
DELAY_LOOP:
MOV R5,#0
DJNZ R5,$
DJNZ R4,DELAY_LOOP
RET // 返回
TAB0:
DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,88H,83H,0C6H,0A1H,86H,8EH,0FFH
END
ORG 0000H
MOV TMOD,#01H //方式1
MOV TH0,#04CH
MOV TL0,#000H
SETB TR0 //启动定时器
MOV P1,#0FEH
MOV A,#0FEH
MOV P2,#80H //数字8
LOOP:
MOV R0 ,#2
T0_LOOP:
MOV TH0,#04CH
MOV TL0,#000H //重新装载初值
JNB TF0,$ //等待中断
CLR TF0 //中断标志
DJNZ R0,T0_LOOP
RL A
MOV P1 A //位选
MOV P2,#80H //段选
SJMP LOOP
END