链接
遇到的一些问题
普中的 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而定
程序
- 通过键盘输入一个小写字母,找出对应的前导字母和后续字母,再按顺序显示这三个字母。
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
- 从键盘输入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
- 编写一个程序,要求比较数组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
- 编写一个程序,要求通过键盘接收一个个位数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
- 将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
-
用15行*16列的表格形式显示ASCII码为10H-FFH的所有字符。
CODE SEGMENT
ASSUME CS:CODE
BEGIN: MOV AH,02HMOV 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