1.MOV寻址

  • 立即寻址 MOV A, #05H直接赋值05H
  • 直接寻址 MOV A, 20H赋值地址20H的内容
  • 寄存器寻址 MOV A, R0特定寄存器R0的内容
  • 寄存器间接寻址 MOV A, @R0以R0内容为地址
  • 变址寻址 MOVC A, @A+DPTRA的内容+DPTR的地址
  • 相对寻址
  • 位寻址
  • MOV操作内部RAM数据
  • MOVX操作外部RAM数据
  • MOVC操作外部ROM数据

定时器

8051有2个可编程的定时器/计数器,可编程的意思是指通过写指令设置有关的寄存器,如工作方式、定时时间、计数初值、启动方式等
系统脉冲的12分频作为计数脉冲时用作定时器

初始化定时器T1

1
2
3
4
5
MOV TMOD, #10H          ; 确定工作模式
MOV TH1, #高八位初值
MOV TL1, #低八位初值
MOV IE, #88H ; 开启中断
SETB TR1 ; 启动T0

TMOD的设置

GATE C/T M1 M0
0 定时/计数 工作方式 工作方式

IE的设置

1000 T1 INT1 T0 INT0
TCON TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
T1标志 T1启停 T0启停
  • TR为启停控制位

中断

中断通常分为外部中断(INT0,INT1)和内部中断(T0,T1),还有串口中断(TI/RI)

  1. EA功能:设置 EA(Enable All Interrupts,开全局中断位)。
  2. EX1 EX0 ET1 ET0功能:设置指定中断使能位。
  3. IT0 IT1功能:置0在低电平触发,置1在负边沿触发
  4. 中断源的入口地址
中断 入口地址 中断标志位
INT0 0003H IE0
T0 000BH TF0
INT1 0013H IE1
T1 001BH TF1
串口中断 0023H TI/RI
  1. 中断优先级由中断优先级寄存器IP (Interrupt Priority) 控制
  2. 中断服务程序的返回指令必须是RETI

  1. 8051 CPU 数据存储器的寻址能力是64KB,范围为0000~FFFFH
  2. 堆栈寄存器SP有8位,特点是用于标注堆栈的栈顶单元的地址,复位后内容为07H执行中断服务程序或调用子程序时,用PUSH和POP指令堆栈保护现场,
  3. INC A 累加器A的值加1
    DEC 累加器A的值减一
    CPL 按位取反
    ANL 按位与(AND)操作
    ORL 按位或(OR)操作
    XRL 按位异或(XOR)操作
    RL
    RR 循环右移
    XCH 数据交换指令
    XCHD 交换累加器(A)和目标地址的低四位,只能使用 @R0 或 @R1 指针。
    SWAP 交换高4位和低4位
    MUL AB 无符号乘法,A存低八位,B存高八位
    DIV AB 执行A/B,商存入A,余数存入B
  4. ADD A, 30H A=A+(30H的值)
    ADDC A, @R0 A=A+(@R0的值)+CY
    SUBB 相减
  5. 数据指针寄存器DPTR占用2个单元,共有16位分别为DPHDPL,都是8位寄存器。用于作为RAM的指针用来存放片内ROM或片外ROM/RAM地址。数据位数多意味着存储空间大。
  6. DA指令为二进制转十进制指令,用于数据显示环节。当计算结果为A~F时,会自动转换至0~9,确保显示正确
  7. 8051单片机有4个并行I/O口,32根I/O线,P0作为数据总线和低8位地址总线,P2口的其他功能为单片机有外部拓展时,作为高8位地址线使用
  8. 8051控制线RST用于复位,分为上电复位开关复位
  9. 数码管动态显示原理:接4个数码管的共阳极公共端,比如第一个数码管显示8,只需要通过P1口输出8的字形码,接第一个数码管公共端的P2.0输出高电平即可实现显示8。
  10. 在MCS-51系统中,决定程序执行顺序的寄存器是PC用来存放下一条将要执行指令的地址,,能自动+1,能存放16位二进制数,可通过转移控制指令修改它的内容
  11. SJMP是短跳转指令,程序的跳转范围在256字节以内.SJMP LOOP 是相对寻址,开始执行标号为LOOP的指令行。
  12. 8051的最小系统的组成是 电源电路、单片机、晶振电路、复位电路
  13. PSW寄存器中
  • P位是奇偶标志,也就是判断累加器A中1的个数的奇偶。
  • F0是用户标志,也就是供程序员使用的位。比如:该位=1,表示电机启动,=0表示电机停止
  1. LED数码管有静态显示动态显示,静态显示只适用于显示位数较少的场合。动态显示适合显示位数较多场合。
  2. 单片机的特点有高性能、低价格,体积小、可靠性高,低电压、低功耗
  3. 8051 控制线ALE作用是锁存低8位地址,8051在访问片外存储器时,P0口输出低8位地址的同时还在ALE线上输出一个高电平脉冲,其下降沿用于把这个片外存储器低8位地址锁存到外部地址锁存器,以便使P0口引脚线传送随后而来的片外存储器读写数据。在不访问片外存储器时,8051CPU自动在ALE/线上输出频率为fosc/6的脉冲序列。
  4. 8051有8个工作寄存器R0 ~ R7,0组:00H~07H; 1组:08H~0FH; 2组:10H~17H; 3组:18H~1FH。
  5. 时钟周期为T时钟周期=1/晶振频率T_{时钟周期}=1/晶振频率,机器周期通常12T时钟周期12T_{时钟周期},大多数指令周期需要 1~2 个机器周期。
  6. DAC0832连接方式有直通方式、单缓冲方式、双缓冲方式
  7. PSEN作用:片外ROM选通控制线
  8. RD和WR的作用:访问外部RAM读写控制线
  9. 8255工作模式有模式0、1、2;模式0为基本输入输出,模式1为选通输入输出,模式2只有A口能设定。
  10. 8051片内RAM容量是128B,可分为寄存器区,位寻址区,通用RAM区
  11. A/D 转换芯片ADC0809 中既可做为查询的状态标志,又可作为中断请求信号使用的是EOC,输出允许信号为OE,ADC0809有8个通道
  12. 单片机复位后,PC的值为0000H,4个I/O口的值为FFH
  13. 输入接口电路是指将外部信号送入单片机系统的通道称为 输入接口电路
    输入接口电路作用:是CPU与外部输入设备进行数据传输的通道,是单片机系统与外部设备交换信息的桥梁
  14. 8051最小系统工作方式为复位方式、程序执行方式、节电方式、EPROM编程和效验方式
  15. 8051的内部结构由8个部件组成:中央处理器(CPU)、片内数据存储器(RAM)、片内程序存储器(ROM/EPROM)、输入输出接口(并行I/O口)、可编程串行口、定时器/计数器、中断系统及特殊功能寄存器。
  16. 计算机中数的表示形式有无符号数和符号数,其中符号数有原码 反码 补码
  17. 单片机时序是指单片机执行指令时应发出的控制信号的时间序列。时钟周期,机器周期,指令周期

编程题

跳转指令

  • DJNZ 表示 “Decrement and Jump if Not Zero”(减 1 并跳转,如果不为 0)。
  • JNZ表示 “Jump if Not Zero”(如果累加器A值不为零,则跳转)。
  • JB 表示"Jump if Bit is set"(如果位为 1 则跳转)
  • JNB表示"Jump if Bit is not set"(如果位为 0 则跳转)。
  • CJNE 全称为 Compare and Jump if Not Equal(比较并跳转,如果不相等)
    CJNE <source>, <direct>, <label>
1
2
3
4
5
6
比较 <source> 和 <direct> 的值:
如果它们 不相等,程序跳转到 <label>。
如果它们 相等,程序继续执行下一条指令。
更新 进位标志位(C):
如果 <source> 小于 <direct>,设置 C = 1。
如果 <source> 大于等于 <direct>,清除 C = 0。

1. 用汇编语言编写:统计内部RAM 30H开始的100个数中0的个数并存放在R5中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    MOV R0, #30H        ;从30H开始
MOV R5, #0 ;用于储存结果
MOV R2, 100 ;作为计数器

LOOP:
MOV A @R0 ;将统计的内容传到A
CJNE A, #0 NEXT ;如果A为0,不跳转,A为1,跳到NEXT
INC R5 ;若为1,结果加1

NEXT:
INC R0 ;加1,指向下一个数
DJNZ R2, LOOP ;先减1判断是否为0,不为零跳转

SJMP$ ;最后无限循环

2. 用汇编语言编写:设X和Y均为16位无符号二进制数,分别存放在内部RAM的40H、41H和50H、51H单元,试编写能完成Z=X+Y操作的程序,并且把结果Z送到内部RAM的40H、41H单元。

1
2
3
4
5
6
7
8
9
10
MOV R0, 40H         ; X的低四位
MOV R1, 50H ;Y的低四位
MOV A, @R0 ;将X低四位存到A
ADD A, @R1 ;A与Y的低四位相加
MOV @R0, A ;存入结果
INC R0 ;变高四位
INC R1
MOV A, @R0
ADDC A, @R1 ;计算高四位加低四位的进位
MOV @R0, A

3. 用汇编语言编写:已知系统时钟频率为12MHz,编写延时2s子程序。

1
2
3
4
5
6
7
8
9
    MOV R4, #20
DEL2:
MOV R5, #200
DEL1:
MOV R6, #250
DJNZ R6, $ ; 循环R6到0
DJNZ R5, DEL1 ;R5递减,回到DEL1
DJNZ R4, DEL2 ;R4递减,回到DEL2
RET ;R4到0时回到主程序

4. 用汇编语言编写:将外部RAM 2000H单元开始的数据块传送到内部RAM 60H开始的位置,直到片外RAM单元出现零为止。

1
2
3
4
5
6
7
8
9
10
    MOV DPTR, #2000H
MOV R0, 60H
LOOP:
MOVX A, @DPTR
MOV R0, @A
INC DPTR
INC R0
JNZ LOOP ; A不为零跳转
SJMP $

5. 用汇编语言编写:统计内部RAM 70H开始的50个单元中负数的个数并存放在R5中。

1
2
3
4
5
6
7
8
9
10
11
12
    MOV R1, #70H        ; 
MOV R5, #0 ; 计数负数的个数
MOV R2, #50 ;计数50个单元
LOOP:
MOV A, @R1
JNB ACC.7 NEXT ;A的最高位为1不跳转
INC R5 ;负数加1
MEXT:
INC R1 ;下一个地址
DJNZ R2, LOOP ; 倒数到0跳出
SJMP $

6. 设单片机的晶振频率为6MHz,利用定时器T0的功能,编写能延时10ms的程序。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    ORG 00H
SJMP MAIN

ORG 000BH
SET F0
RETI
MAIN:
NOP
MOV TMOD #01H
MOV TH0 #ECH
MOV TL0 #78H
SETB ET0
SETB EA
SETB TR0
SJMP $

END

7. 用汇编语言编写:设内部RAM 地址是20H的单元无符号数X,编写程序实现:求函数Y= 9X +21,并把Y送入22H单元,并给出注释。

1
2
3
4
5
6
7
MOV A, 20H          ; X传入A
MOV B, #9 ;系数传入B
MUL AB ;AB相乘,低四位存入A
ADD A, #21 ;A加21
MOV 22H,A ;结果存入
END

8. 在采用8255扩展I/O口时,若把8255 的PC7引脚作为输入,接一个开关,PB7引脚接一个发光二极管。请编写程序实现以下功能:C口开关接高电平信号时,B口所接的发光二极管点亮。

设8255的地址为X, X+1, X+2, X+3

1
2
3
4
5
6
7
8
9
10
MOV DPTR #X+3       ;控制口地址
MOV A, #89H ;初始化
MOVX @DPTR, A ;写入初始化

MOV DPTR, #X+2 ;转到C口
MOVX A, @DPTR ;读C口到A

MOV DPTR #X+1 ;转到B口
MOVX @DPTR, A ;写入B口

9. P2口接8个LED灯,试用汇编编写实现单个LED灯左移程序,延时程序略

1
2
3
4
5
6
    MOV A, #FEH         ; 01111111
LOOP:
MOV P2, A ;
ACALL DELAY ; 暂时跳转到DELAY
RL A ;循环左移
SJMP LOOP

10. 设8051单片机的时钟频率为12MHz,试编写利用定时器T0在P2.0引脚输出周期为1s方波的程序。

TC=216-T定时/T计数=65536-50ms/1us=15536=3CB0H
开T0: #82H 11110010H
开T1: #88H 11111000H

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
    ORG 000H
AJMP START

ORG 000BH
AJMP INTT0

ORG 0100H
START:
MOV R2, #10
MOV TMOD, #01H
MOV TH0, #3CH
MOV TL0, #B0H
MOV IE, #82H
SETB TR0
SJMP $

INTT0:
DJNZ R2, NEXT
CPL P2.0
MOV R2, #10
NEXT:
MOV TH0, #3CH
MOV TL0, #B0H
RETI
END


方案设计题

1. 计一种基于89C51单片机的显示工具,以显示范围从000到999的数字。根据本课程所学内容设计一个可行方案,尽量包括方案分析、硬件设计、软件设计等方面,以满足该需求。

设计一种基于89C51单片机的显示工具,以显示范围从000到999的数字,需要构建一个包含单片机、数码管显示模块以及必要的外围电路的系统。

以下是详细的设计步骤和要点:

一硬件设计

单片机:AT89C51

数码管:三位共阳或共阴数码管

驱动电路:如果数码管为共阳,则单片机输出低电平点亮相应段;如果为共阴,则输出高电平点亮。

电阻和电容:用于限流和去耦

显示原理:

使用三个独立的数码管分别显示百位、十位和个位。

单片机通过控制每个数码管的段选和位选信号来显示不同的数字。

数码管连接:

段选:单片机的某个端口(如P0口)连接数码管的段选端,通过输出不同的编码来显示不同的数字。

位选:使用单片机的另外几个端口(如P2.0, P2.1, P2.2)分别控制三个数码管的位选信号,每次只点亮一个数码管以进行显示。

电路设计:

限流电阻:在段选和位选线上串联限流电阻,以防止电流过大损坏数码管或单片机。

三、 软件设计

初始化:

设置单片机的IO口为输出模式。

初始化定时器(如果需要动态扫描显示)。

数码管编码

定义一个包含0-9数字对应的段选编码的数组。

显示逻辑

通过读取一个计数器或外部输入的值,将其分解为百位、十位和个位。

依次点亮每个数码管,并通过段选线输出对应的数字编码。

使用延时函数确保每个数码管有足够的显示时间。

2. 某部门需要设计一种基于89C51单片机的6位阿拉伯数字密码输入工具。根据本课程所学内容设计一个可行方案,尽量包括方案分析、硬件设计、软件设计等方面,以满足该需求。

设计一种基于89C51单片机的6位阿拉伯数字密码输入工具,主要涉及到硬件电路设计和软件编程两个方面。

一、硬件设计

单片机选择:89C51单片机作为核心控制器。

输入设备:

键盘:可以采用矩阵键盘或独立按键键盘。考虑到6位数字输入,建议使用6个独立按键,每个按键代表一个数字(0-9,可能需要两个按键组合来表示10,或者通过逻辑判断来区分输入)。如果需要更紧凑的设计,可以使用4x4矩阵键盘,通过软件编码来区分不同的数字输入。

显示设备(可选):

LED灯:简单应用中,可以用LED灯来显示输入状态或密码验证结果。

二、软件设计

初始化:

初始化单片机,包括IO口配置、LCD显示屏(如果使用)的初始化等。

键盘扫描:

编写键盘扫描程序,不断检测按键是否被按下。

如果检测到按键按下,则根据按键的编码确定输入的数字。

密码输入逻辑:

定义一个变量或数组来存储输入的密码。

每当一个数字被输入时,更新密码变量或数组,并显示当前输入的密码(如果使用了显示屏)。

如果输入超过6位数字,则忽略额外的输入或提示用户重新输入。

密码验证(可选):

在密码输入完成后,可以设计密码验证逻辑。

将输入的密码与预设的密码进行比较。

如果密码正确,则执行相应的操作(如解锁设备、点亮LED等)。

如果密码错误,则给出错误提示,并允许用户重新输入。

主循环:

不断重复键盘扫描和密码输入/验证的逻辑,直到满足特定的退出条件(如正确输入密码、达到最大尝试次数等)。

3. 设计一个基于AT89C51单片机的定时工具定时范围10~50秒。请根据本课程所学内容设计一个可行方案,尽量包括方案分析、硬件设计、软件设计等方面,以满足该需求。

在设计一个基于AT89C51单片机的定时工具时,需要考虑到定时器/计数器的配置、按键输入控制、以及显示输出等多个方面。

以下是一个设计方案,其定时范围设定为10秒到50秒。

一、设计分析

定时范围:10秒至50秒,步长为1秒。

按键控制:至少需要一个按键来启动和停止定时器,并可能需要调整定时时长。

显示输出:通过数码管或LCD显示屏显示当前时间或剩余时间。

二、硬件设计

单片机:AT89C51

显示模块:4位数码管(如果采用LCD显示,则可以使用LCD1602)

按键模块:至少一个按键(可以使用矩阵键盘以支持更多功能,如设置时间等)

复位电路:用于单片机复位

三、软件设计

定时器初始化:

配置定时器0或定时器1(通常选择定时器0,因为它在AT89C51中更常用)。

设置定时器的工作模式(通常为模式1,16位定时器/计数器模式)。

根据晶振频率计算定时器初始值,以实现大约1秒的定时中断。

按键扫描与处理:

设计按键扫描程序,用于检测按键是否被按下。

根据按键的不同功能(如启动、停止、设置时间等),执行相应的处理逻辑。

时间显示:

设计显示程序,用于在数码管或LCD上显示当前时间或剩余时间。

更新显示内容需要在定时器中断服务程序中进行。

主程序流程:

初始化单片机、定时器、显示模块等。

进入主循环,等待按键事件。

当检测到按键事件时,根据按键功能执行相应操作。

在定时器中断服务程序中更新显示内容,并处理定时逻辑。

4. 某工厂需要设计一个使用89C51单片机进行开关量的边沿信号检测。请根据本课程所学内容设计一个可行方案,尽量包括方案分析、硬件设计、软件设计等方面,以满足该需求。

  1. 硬件设计

所需材料:89C51单片机、开关(按钮或限位开关)、电阻(限流用)、电源(适配89C51)、跳线若干、面包板或PCB板

连接方式:

将开关的一端连接到89C51的某个外部中断引脚(如INT0或INT1),另一端连接到地。

开关的另一端通过一个限流电阻连接到单片机的VCC。

  1. 软件设计

初始化:

设置外部中断为边沿触发模式(上升沿或下降沿,根据需求选择)。

初始化定时器(如果需要进一步的时间控制或测量)。

初始化串口(如果需要调试信息输出)。

外部中断服务程序(ISR):

编写中断服务程序以响应外部中断。

在中断服务程序中,首先判断是哪种边沿触发了中断(如果配置为边沿触发,则通常需要软件判断)。

记录边沿事件(例如,通过翻转一个标志位或增加计数器)。

如果需要,可以发送中断事件的信息到串口或其他输出设备。