MCS-51笔记

转载笔记

MCS-51第二章

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

posted @ 2023-05-19 11:42  IEQEFCR  阅读(8)  评论(0编辑  收藏  举报