微机原理 单片机笔记

链接

十四个寄存器
寄存器和物理地址的形成
课后习题答案

遇到的一些问题

普中的 51 单片机原理图有误,蜂鸣器实验如果用源代码设置 BEEP 为2.5 时,D6 灯亮但是蜂鸣器不响,设为 1.5 时才响,经过万用表检查,与 P1.5 通。五线四项步进电机的管脚图标错了。

LED点阵显示坤坤跳舞打篮球画面

作为一名合格的 ikun,专业的小黑子,必须学会。
参考

效果
5.17 06/14 PXM:/ i@C.Hv # 单片机 # ikun # 小学生日常 https://v.douyin.com/iRYT52Vs/ 复制此链接,打开Dou音搜索,直接观看视频!

#include <REGX52.H>

void Delay(unsigned int xms);
void _74HC595_WriteByte(unsigned char byte);
void LED(unsigned char Y,DATA);
void LED_Init();

sbit RCK=P3^5; 	//RCLK
sbit SCK=P3^6; 	//SRCL
sbit SER=P3^4; 	//SER
//坤坤矩阵
unsigned char code DH[]=
	{
		0x00,0x0E,0x1B,0x7F,0x7F,0x1B,0x0E,0x00,
		0x00,0x04,0x0C,0x18,0x7F,0x7F,0x1B,0x0E,
		0x00,0x08,0x0C,0x05,0x7F,0x7F,0x1E,0x0C,
		0xC0,0x00,0x41,0x22,0x1A,0x7C,0x7D,0x1A,
		0x00,0x60,0x61,0x12,0x0A,0x7E,0x7F,0x08,
		0x00,0x06,0x0E,0x08,0x0B,0x3E,0x3E,0x0B,
		0x00,0x03,0x0B,0x08,0x0B,0x3E,0x3E,0x0B,
		0x00,0x06,0x0E,0x08,0x09,0x3F,0x3E,0x0B,
		0x00,0x0E,0x13,0x7E,0x7E,0x1F,0x0E,0x00,
		0x08,0x13,0x7E,0x7E,0x12,0x1D,0x0C,0x00,
		0x09,0x12,0x7E,0x7F,0x10,0x13,0x03,0x00,
		0x09,0x12,0x7E,0x7F,0x10,0x1C,0x0C,0x00,
		0x00,0x0C,0x15,0x7E,0x7E,0x17,0x0E,0x00,
		0x00,0x30,0x38,0x0D,0x7E,0x7F,0x1D,0x08,
		0xC0,0xC0,0x30,0x1B,0x7C,0x7F,0x08,0x00,
		0x00,0x00,0x37,0xF8,0xFA,0x34,0x00,0x00,
		0x00,0x00,0x1B,0x7C,0x7C,0x1A,0x01,0x00,
		0x00,0x00,0x09,0x1E,0x7C,0x7F,0x18,0x00,
		0x00,0x00,0x1B,0x7C,0x7C,0x1B,0x00,0x00,
		0x00,0x00,0x09,0x1E,0x7C,0x7F,0x18,0x00,
		0x00,0x00,0x1B,0x7C,0x7C,0x1B,0x00,0x00,
		0x08,0x10,0x16,0x7C,0x7F,0x10,0x08,0x00,
		0x00,0x10,0x13,0x7C,0x7E,0x18,0x00,0x00,
		0x00,0x08,0x13,0x7C,0x7F,0x10,0x10,0x00,
		0x00,0x08,0x12,0xFC,0xFD,0x3A,0x00,0x00,
		0x00,0x08,0x12,0xFC,0xFC,0x22,0x10,0x00,
		0x00,0x00,0x61,0x12,0x7C,0x7F,0x10,0x60,
		0x00,0x00,0x20,0x11,0x12,0x7C,0x7E,0x19,
		0x00,0x00,0x00,0x31,0x0A,0x7C,0x7E,0x0D,
		0x00,0x00,0x20,0x11,0x12,0x7C,0x7E,0x19,
		0x00,0x00,0x00,0x31,0x0A,0x7C,0x7E,0x0D,
		0x00,0x00,0x20,0x11,0x12,0x7C,0x7E,0x19,
		0x00,0x00,0x00,0x31,0x0A,0x7C,0x7E,0x0D,
		0x00,0x00,0x20,0x11,0x12,0x7C,0x7E,0x19,
		0x00,0x00,0x00,0x31,0x0A,0x7C,0x7E,0x0D,
	};

	void main()
{
	unsigned char i,py=0,pl=0;
	LED_Init();
	while(1)
	{
		for(i=0;i<8;i++)
		{
			LED(i,DH[i+py]);
		}
		pl++;
		if(pl>25)
		{
			pl=0;
			py+=8;
			if(py>10000)
			{
				py=0;
			}
		}

	}
}
//延时xms
void Delay(unsigned int xms)
{

		while(xms--)
		{
					unsigned char i, j;

			i = 2;
			j = 199;
			do
			{
				while (--j);
			} while (--i);
	
		}
}
void _74HC595_WriteByte(unsigned char byte)
{
	unsigned char i;
	for(i=0;i<8;i++)
	{
		SER=byte&(0x80>>i);
		SCK=1;
		SCK=0;
	}
		RCK=1;
		RCK=0;
}
//led设置参数
void LED(unsigned char Y,DATA)
{
	_74HC595_WriteByte(DATA);
	P0=~(0X80>>Y);
	Delay(1);
	P0=0XFF;
}
//led初始化
void LED_Init()
{
		SCK=0;
		RCK=0;
}

单片机复习部分

机器周期=1/时钟频率
定时器:1、选择工作方式 TMOD;2、定时器赋初值 TH0、TL0;3、打开定时器 0 中断允许 ET0;4、打开总中断 EA;5、打开定时器 TR0;

以下是微机原理部分

一、基础知识

BCD码(Binary-Coded Decimal‎),用4位二进制数来表示1位十进制数中的0~9这10个数码,是一种二进制的数字编码形式,用二进制编码的十进制代码。

  • 组合型BCD码用高四位和低四位分别对应十进制数的个位和十位,其表示范围是0~99;

  • 非组合型BCD码用一个字节的低四位表示十进制数,高四位则任意取值,表示范围为0~9。

  • 组合型:254=(001001010100)BCD
    非组合型:254=(00000010 00000101 00000100)BCD

  • Q表示八进制数。 八进制,Octal,缩写OCT或O

  • 在计算机系统中,数值一律用补码来表示和存储

  • 在补码运算过程中,符号位参加运算,简化了加减法规则,且能使减法运算转化为加法运算,可以简化机器的运算器电路。

What are the main performance indexes of Microcomputer?
Answer: CPU word length, memory capacity, operation speed, CPU core and IO working voltage, manufacturing process, expansion capacity and software configuration.

在这里插入图片描述

  • 物理地址是访问存储器的实际地址,一个存储单元对应唯一的一个物理地址。逻辑地址是对应逻辑段内的一种地址表示形式,它由段基址和段内偏移地址两部分组成,通常表示为
    段基址:偏移地址。
    物理地址=段基址*10H+偏移地址。

  • 1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。(一个内存单元=1Byte)

  • 数据总线是用来传送数据的,每根数据线传送一个二进制位,8根正好传送一个字节。

  • 地址总线是传送地址的,每根传送一个二进制位,8根地址线传送8个二进制位。这8个二进制位有28种不同的变化,所以可以用来传送28个不同存储单元的地址,也就是说用8根地址线可以寻址256B.

  • 在8086系统中,16个字就是32个字节,写成十六进制数就是20H,起始地址为808A0H:DDF6H的物理地址为:8E7F6H,所以数据区末字单元的物理地址为:8E7F6H+(20H-2)=8E7F6H+(10H-1)*2=8E814H

物理地址的形成
8086CPU的工作过程:
1 从CS:IP指向的内存单元读取指令进入指令缓冲器
2 IP=IP+指令长度
3 执行指令

IP=IP+所读指令的字节数。

一、没有操作数的指令,指令长度为1个字节

二、操作数只涉及寄存器的的指令,指令长度为2个字节

如:mov bx,ax

三、操作数涉及内存地址的指令,指令长度为3个字节

如:mov ax,ds:[bx+si+idata]

四、操作数涉及立即数的指令,指令长度为:寄存器类型+1

8位寄存器,寄存器类型=1,如:mov al,8;指令长度为2个字节

16位寄存器,寄存器类型=2,如:mov ax,8;指令长度为3个字节

五、跳转指令,分为2种情况:

1、段内跳转(指令长度为2个字节或3个字节)

jmp指令本身占1个字节

段内短转移,8位位移量占一个字节,加上jmp指令一个字节,整条指令占2个字节

如:jmp short opr

段内近转移,16位位移量占两个字节,加上jmp指令一个字节,整条指令占3个字节

如:jmp near ptr opr

2、段间跳转,指令长度为5个字节

如:jmp dword ptr table[bx][di]

或 jmp far ptr opr

或 jmp dword ptr opr

注意:形如“jmp
1234:5678”的汇编指令,是在Debug中使用的汇编指令,汇编编译器并不认识,如果在源程序中使用,那么在编译时便会报错。

二、寄存器

在这里插入图片描述

1、通用寄存器(8)

(1)数据寄存器 AX:累加器 (accumulator)

  • 所有I/O指令都通过AX与接口传送信息,中间运算结果也多放AX中;

BX:基址寄存器(base)

  • 在间接寻址中用于存放基地址;

CX:计数寄存器 (count)

  • 用于在循环或串操作指令中存放计数值;

DX:数据寄存器 (data)

  • 在间接寻址的I/O指令中存放I/O端口地址;在32位乘除法运算时,存放高16位数。

(2)地址指针寄存器

SP:堆栈指针寄存器 (Stack Pointer)其内容为栈顶的偏移地址;
BP:基址指针寄存器 (Base Pointer),常用于在访问内存时存放内存单元的偏移地址。

共同点: 1)默认指向堆栈区 2)多数情况用于存放地址

(3) 变址寄存器
SI:源变址寄存器
DI:目标变址寄存器 变址寄存器在指令中常用于存放数据在内存中的地址。

2、控制寄存器(2)

标志寄存器
OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1.
SF sign Flag 符号标志 记录运算结果的符号,结果负时为1.
ZF zero flag 零标志 运算结果等于0时为1,否则为0.
CF carry flag 进位标志 最高有效位产生进位时为1,否则为0.
AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0.
PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0.
DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大.
IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断.
TF trap flag 陷阱标志 用于调试单步操作.

3、段寄存器(4)

用于存放相应逻辑段的段基地址 8088有4个16位段寄存器

CS(代码段) (Code Segment) 指明代码段的起始地址
SS(堆栈段) (Data Segment) 指明堆栈段的起始地址
DS(数据段)(Stack Segment) 指明数据段的起始地址
ES(附加段) (Extra Segment)指明附加段的起始地址

  • 存放相应段的段基址的高16位。每个段寄存器用来确定一个逻辑段的起始地址,每种逻辑段均有各自的用途。
    - 它们要和BX、BP、SI、DI、IP配合形成存储单元的物理地址。

试卷复习

  • 填空(20分)
    物理地址存多个数,下一单元是?
    2.CPU分结构,好处
    3.CPU的性能指标
    4.关于接口与CPU的连接,与外设的连接
    5.关于8259A的怎么管理中断,怎么初始化
    8259A的初始化编程,需要CPU向它输出一个2—4字节的初始化命令字,输出初始化命令字的流程如图所示,其中ICW1和ICW2是必须的,而ICW3和ICW4需根据具体的情况来加以选择。
    6.关于一个伪指令的操作
    7.给你一段程序,让你计算程序结果,这个程序里面涉及的指令,有DW,MOV,OFFSET,查表指令
    8.8253怎么计数的
    9.还是关于8259A的
    10.是一个程序题,填3个空,实现一个功能,这个程序里面涉及3个指令,移位指令(左移SHL),MOV指令,ADD指令

  • 选择(20分)
    1.关于4个选项是否正确
    2.关于8253初始化
    3.给两个指令,问下面这个选项当中哪一个有语法错误
    4.关于输入输出指令
    5.关于输入输出方式
    6.CPU与其他的芯片交换信息时一些基本知识
    7.CPU与其他的芯片或者外设连接时一些通讯信息(查询方式 中断方式)
    8.关于输入输出方式
    9.关于高速缓存(cache)
    10.关于CPU和8259A进行交换

  • 第四大题(第三章的内容,跟指令有关)
    12分 表里有6条指令,执行之后的结果
    8分 编一段小程序,只要第三章的内容(CPU执行的,指令性语句,不需要代码段)

  • 第五大题30分
    包括:CPU跟芯片进行相连的时候,地址的(存储器扩展)范围,接口芯片的地址有哪些
    综合性大题:(有几问)(30分)
    涉及到发光二极管的相关知识(这个发光二极管的知识在数电里面学过)
    涉及到 共阴极?共阳极?
    在这里插入图片描述

指令

MOV
功能: 把源操作数送给目的操作数
语法: MOV 目的操作数,源操作数
格式: MOV r1,r2
MOV r,m
MOV m,r
MOV r,data

XCHG
功能: 交换两个操作数的数据
语法: XCHG
格式: XCHG r1,r2
XCHG m,r
XCHG r,m

PUSH,POP
功能: 把操作数压入或取出堆栈
语法: PUSH 操作数 POP 操作数
格式: PUSH r PUSH M PUSH data
POP r POP m PUSHF,POPF,PUSHA,POPA
功能: 堆栈指令群
格式: PUSHF POPF PUSHA POPA

LEA,LDS,LES
功能: 取地址至寄存器
语法: LEA r,m
LDS r,m
LES r,m

XLAT(XLATB)
功能: 查表指令
语法: XLAT XLATm

算数运算指令

ADD,ADC
功能: 加法指令
语法: ADD OP1,OP2
ADC OP1,OP2
格式: ADD r1,r2
ADD r,m
ADD m,r
ADD r,data
影响标志:C,P,A,Z,S,O

SUB,SBB
功能:减法指令
语法: SUB OP1,OP2
SBB OP1,OP2
格式: SUB r1,r2
SUB r,m
SUB m,r
SUB r,data
SUB m,data
影响标志:C,P,A,Z,S,O

INC,DEC
功能: 把OP的值加一或减一
语法: INC OP DECOP
格式: INC r/m DEC r/m
影响标志:P,A,Z,S,O

NEG
功能: 将OP的符号反相(取二进制补码)
语法: NEG OP
格式: NEG r/m
影响标志:C,P,A,Z,S,O

MUL,IMUL
功能: 乘法指令
语法: MUL OPIMUL OP
格式: MUL r/m
IMUL r/m
影响标志:C,P,A,Z,S,O(仅IMUL会影响S标志)

DIV,IDIV
功能:除法指令
语法: DIV OPIDIV OP
格式: DIV r/mIDIV r/m

CBW,CWD
功能: 有符号数扩展指令
语法: CBW CWD

AAA,AAS,AAM,AAD
功能: 非压BCD码运算调整指令
语法: AAA AASAAM AAD
影响标志:A,C(AAA,AAS) S,Z,P(AAM,AAD)

DAA,DAS
功能: 压缩BCD码调整指令
语法: DAA DAS
影响标志:C,P,A,Z,S

位运算指令集

AND,OR,XOR,NOT,TEST
功能: 执行BIT与BIT之间的逻辑运算
语法: AND r/m,r/m/data
OR r/m,r/m/data
异或XOR r/m,r/m/data
TEST r/m,r/m/data
NOT r/m
影响标志:C,O,P,Z,S(其中C与O两个标志会被设为0) NOT指令不影响任何标志位

SHR,SHL,SAR,SAL
功能: 移位指令
语法: SHRr/m,data/CL SHL r/m,data/CL SAR r/m,data/CL SAL r/m,data/CL
影响标志:C,P,Z,S,O

ROR,ROL,RCR,RCL
功能: 循环移位指令
语法: RORr/m,data/CL ROL r/m,data/CL RCR r/m,data/CL RCL r/m,data/CL
影响标志:C,P,Z,S,O

程序流程控制指令集

CLC,STC,CMC
功能: 设定进位标志
语法: CLC STCCMC
标志位: C

CLD,STD
功能: 设定方向标志
语法: CLD STD
标志位: D

CLI,STI
功能: 设定中断标志
语法: CLI STI
标志位: I

CMP
功能: 比较OP1与OP2的值
语法: CMPr/m,r/m/data
标志位: C,P,A,Z,O

JMP
功能: 跳往指定地址执行
语法: JMP 地址

JXX
功能: 当特定条件成立则跳往指定地址执行
语法: JXX 地址
注:
A:ABOVE,当C=0,Z=0时成立
B:BELOW,当C=1时成立
C:CARRY,当弁时成立 CXZ: CX寄存器的值为0(ZERO)时成立
E:EQUAL,当Z=1时成立
G:GREATER(大于),当Z=0且S=0时成立
L:LESS(小于),当S不为零时成立
N:NOT(相反条件),需和其它符号配合使用
O:OVERFLOW,O=1时成立
P:PARITY,P=1时成立
PE: PARITY EVEN,P=1时成立
PO: PARITY ODD,P=0时成立
S:SIGN,S=1时成立
Z:ZERO,Z=1时成立
LOOP

循环指令集

语法: LOOP 地址
LOOPE(Z)
地址 LOOPNE(Z) 地址
标志位: 无

CALL,RET
功能: 子程序调用,返回指令
语法: CALL 地址 RET RET n
标志位:无

INT,IRET
功能: 中断调用及返回指令
语法: INT n IRET
标志位: 在执行INT时,CPU会自动将标志寄存器的值入栈,在执行IRET时则会将堆栈中的标志值弹回寄存器

字符串操作指令集

MOVSB,MOVSW,MOVSD
功能: 字符串传送指令
语法: MOVSBMOVSW MOVSD
标志位: 无
CMPSB,CMPSW,CMPSD
功能: 字符串比较指令
语法: CMPSBCMPSW CMPSD
标志位: C,P,Z,S,O

SCASB,SCASW
功能: 字符串搜索指令
语法: SCASBSCASW
标志位: C,P,Z,S,O

LODSB,LODSW,STOSB,STOSW
功能: 字符串载入或存贮指令
语法: LODSBLODSW STOSB STOSW
标志位: 无

REP,REPE,REPNE
功能: 重复前缀指令集
语法: REP 指令S REPE 指令S REPNE 指令S
标志位: 依指令S而定

程序

  1. 通过键盘输入一个小写字母,找出对应的前导字母和后续字母,再按顺序显示这三个字母。

CODE SEGMENT

ASSUME CS:CODE

BEGIN:

    MOV		AH,07H	
	INT		21H
	MOV		DL,AL
	MOV		AH,02H
	SUB		DL,01H
	INT 	21H
	ADD		DL,01H
	INT		21H
	ADD		DL,01H
	INT		21H
	
	MOV		AH, 4CH
	INT		21H

CODE ENDS
END BEGIN

  1. 从键盘输入10个字符,然后以与键入相反的顺序将10个字符输出到显示屏幕上。(定义数据段保存录入字符)

DATA SEGMENT
ARRAY DB 10 DUP(?), 0DH, 0AH, ‘$’
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

BEGIN: MOV AX, DATA

	MOV		DS, AX
	MOV		AH, 07H
	MOV		CX, 0AH

OPR:

	INT		21H	
	MOV		BX,CX;	
	SUB		BX,01H	
	MOV		[BX],AL
	
	LOOP	OPR
	
	MOV		AH, 09H
	LEA		DX, ARRAY
	INT		21H


	MOV		AH, 4CH
	INT		21H

CODE ENDS
END BEGIN

  1. 编写一个程序,要求比较数组ARRAY中的三个16位补码,并根据比较结果在终端上显示如下信息:
    1)如果三个数都不相等,显示0;
    2)如果三个输油两个相等,显示1;
    3)如果三个数都相当,显示2。

DATA SEGMENT
ARRAY DW 1224H, 1214H, 1234H
DATA ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA

BEGIN:

	MOV		AX, DATA
	MOV		DS, AX

	LEA		BX, ARRAY
	MOV		AX, [BX]
	MOV		DX, 0002H[BX]
	CMP		AX, DX
	MOV		DX, 0004H[BX]
	JNE		STEP1

	CMP		AX, DX
	JNE		TAG1

	MOV		DL, '2'
	MOV		AH, 02H
	INT		21H
	JMP		OVER

STEP1: MOV AX, 0002H[BX]

	CMP		AX, DX
	JE		TAG1	

	MOV 	DL, '0'
	MOV		AH,02H
	INT		21H
	JMP		OVER

TAG1: MOV DL, ‘1’

	MOV		AH, 02H
	INT		21H 

OVER:

	MOV		AH, 4CH
	INT		21H

CODE ENDS
END BEGIN

  1. 编写一个程序,要求通过键盘接收一个个位数N,然后显示N个字母‘$’。

CODE SEGMENT
ASSUME CS:CODE
BEGIN: MOV AH, 07H

	INT		21H
	MOV		CL, AL
	SUB		CL, 30H
	MOV		CH, 00H

OUT1: MOV DL, ‘$’

	MOV		AH, 02H
	INT		21H
	LOOP	OUT1

	MOV		AH, 4CH
	INT		21H

CODE ENDS
END BEGIN

  1. 将BX寄存器中的数用16位二进制数形式显示出来。

CODE SEGMENT
ASSUME CS:CODE
BEGIN: MOV AH, 01H

    INT        21H
    MOV        BH, AL
    INT        21H
    MOV        BL, AL
    MOV        AH, 02H
    MOV        DL, 0DH
    INT        21H
    MOV        DL, 0AH
    INT        21H
    MOV        CX, 16
    MOV        DH, 80H

LOOP16:

    TEST    BH, DH
    JZ        ZERO
    MOV        DL, '1'
    INT        21H
    SHL        BX,1
    LOOP    LOOP16
    JMP        OVER

ZERO: MOV DL, ‘0’

    INT        21H
    SHL        BX,1
    LOOP    LOOP16

OVER:

    MOV        AH,4CH
    INT        21H

CODE ENDS
END BEGIN

  1. 用15行*16列的表格形式显示ASCII码为10H-FFH的所有字符。
    CODE SEGMENT
    ASSUME CS:CODE
    BEGIN: MOV AH,02H

     MOV		CX,16
     MOV		DL,10H
     MOV		BH,15
    

LOOP1: INT 21H

	MOV		BL,DL
	MOV		DL,20H
	INT		21H
	ADD		BL,1
	MOV		DL,BL
	
	LOOP	LOOP1
	MOV		CX,16
	MOV		DL,0DH
	INT		21H
	MOV		DL,0AH
	INT		21H
	MOV		DL,BL

	DEC		BH
	JNZ		LOOP1

	MOV		AL,0
	MOV		AH,4CH
	INT		21H

CODE ENDS
END BEGIN

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Sink Arsenic

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值