cuisheng
发表于 2023-8-12 22:51:17
第9集视频学习
一、位操作指令:
位传送,位状态控制、位逻辑操作、位条件转移等17条。
(1)、直接使用位地址。
(2)、写成“字节地址.位号”,例如:0B8H.0
(3)、位寄存器的定义名称,例如C、EA等
(4)、对于位寻址寄存器,可以用“字节寄存器名.位号”,例如P1.0、PSW.4
(5)、伪指令事先定义的符号地址,EQU
1、位数据传送指令
MOV C, bit ;(C) <- (bit)
MOV bit, C ;(bit) <- (C)
注:其中一个操作数必须为累加器(进位标志CY)
2、位状态控制指令
位清零指令
CLR bit ;(bit) <- 0
CLR C ;(C) <- 0
位求反指令
CPL bit ;(bit) <- (/bit)
CPL C ;(C) <- (/C)
位置位指令
SETB bit ;(bit) <- 1
SETB C ;(C) <- 1
3、位逻辑操作
位逻辑与
ANL C, bit
ANL C, /bit
位逻辑或
ORL C, bit
ORL C, /bit
4、位条件转移
判断进位标志C
JC rel ;若(CY) == 1, 则(PC) <- (PC) + rel
JNCrel ;若(CY) == 0, 则(PC) <- (PC) + rel
判断直接寻址位
JB bit, rel
JNBbit, rel
JBCbit, rel ;若(bit) == 1, 则(PC) <- (PC) + rel, (bit) <- 0
5、控制转移类指令
程序转移指令
LJMP addr16
AJMP addr11
SJMP rel
JMP @A + DPTR
JZ rel
JNZ rel
CJNZ
DJNZ
子程序调用
LCALL addr16
ACALL addr11
RET ;子程序返回
其他
RETI ;中断返回
NOP ;空操作
cuisheng
发表于 2023-8-13 12:03:53
本帖最后由 cuisheng 于 2023-8-13 12:04 编辑
第10集学习笔记:
汇编语言程序的框架
$NOMOD51
$INCLUDE (STC8H.H)
;...这里可以编写程序中用到的一些符号定义(使用EQU、DATA、BIT等伪指令)
ORG 0000H
START: LJMP MAIN ;跳转到主程序
ORG 0003H
LJMP INT0_ISR ;外部中断0入口(ISR Interrupt Service Rowtine 中断服务程序)
ORG 000BH
LMP T0_ISR ;定时器0中断入口
ORG 0013H
LJMP INT1_ISR ;外部中断1入口
ORG 001BH
LMP T1_ISR ;定时器1中断入口</div>
ORG 0023H
LJMP UART1_ISR ;串口1中断入口</div>
......
ORG 0200H
MAIN: MOV SP, #80H ;设置堆栈指针(可根据情况修改)
...... ;初始化内存区域内容
...... ;设置有关特殊功能寄存器(SFR)的控制字
...... ;根据需要开放相应的中断控制
MAINLOOP:
;主程序循环
LJMP MAINLOOP
INT0_ISR: ;外部中断0服务子程序
...... ;根据需要填入适当的内容
RETI
...... ;编写其他子程序或者定义程序中所用的常数
END
注:没有用到的中断服务程序,使用复位程序,提高可靠性
cuisheng
发表于 2023-8-16 00:00:23
本帖最后由 cuisheng 于 2023-8-16 22:44 编辑
第11集学习记录
一、C51对ANSI C的扩展
C51有以下19个扩展关键字:
_at_、sbit、sfr、bit、sfr16、idata、bdata、xdata、pdata、data、code、alien、small、compact、large、using、reentrant、interrupt、_task_
1、bit型变量
可用于变量类型和函数声明、函数返回值等,存储于内部RAM的20H~2FH单元中。
注意:位不能声明为指针
不能有bit数组
2、可位寻址区声明
使用sbit声明可独立访问可位寻址对象的位。
sbit声明要求基址对象的存储器类型为“bdata”。
位的位置(^操作符号后的数字)的最大值依赖于制定的基类型。
可位寻址对象的声明只能放到main函数的外部作为全局变量使用。
例如:
int bdata bittest _at_ 0x20;
sbit bit0 = bittest^0;
sbit bit15 = bittest^15;
3、特殊功能寄存器(SFR)
sfr:字节寻址
语法:
sfr sfr_name = int_constant;
例如:
sfr P0=0x80;
sfr16:字寻址
sfr16 DPTR = 0x82; // 指定DPTR的地址DPL=0x82,DPH=0x83
sbit:位寻址
sbit bitname = sfr_name^bit_number;
内存区域的指定
1、程序存储器,使用code关键字
例如:
unsigned char code led_buf = {0x3F,......}
2、内部RAM
data: 直接寻址区,内部RAM低128字节,00H~7FH,默认都保存在该区域。
idata: 间接寻址区,间接寻址区,包括整个内部RAM区256字节,00H~0FFH。
bdata: 可位寻址区,20H~2FH。
3、外部数据存储器
xdata: 可指定多达64KB的外部直接寻址区,地址范围0000H~0FFFFH。
例如:
unsigned char xdata arr;
pdata: 能访问1页(256B)的外部RAM(很少用)。
Keil C51指针
以下声明pt为指向外部RAM中unsigned char数据的指针
unsigned char xdata * pt; // pt本身依存储模式存放
unsigned char xdata * data pt; // pt被保存在内部RAM中
unsigned char xdata * xdata pt; // pt被保存在外部RAM中
基于存储器的指针
char data * str; // str指向data区中的char型数据
int xdata * pow; // pow指向外部RAM的int型整数
注:volatile 关键字,告诉编译器不要进行编译优化,一般用于声明特殊功能寄存器。
C51对函数的扩展
1、中断函数声明 interrupt
例如:
void UART1_ISR(void) interrupt 4
{
/* 中断服务程序的代码 */
}
2、指定工作寄存器区(using后跟0~3的数,R7~R0)(不重要)
例如:(相当于PSW.4 = 0,PSW.3 = 1)
unsigned char GetKey(void) using 1
{
}
3、指定存储模式(small、compact、large)(不重要)
例如:small说明函数的内部变量全部使用内部RAM
void disp_data(void) small
{
}
cuisheng
发表于 2023-8-17 22:37:12
第12集学习记录
两个小示例:流水灯、读写EEPROM
cuisheng
发表于 2023-8-18 13:35:14
本帖最后由 cuisheng 于 2023-8-18 22:57 编辑
第13集学习记录
中断的相关概念
中断源、中断响应、中断服务、中断返回。
中断优先级、中断嵌套
开中断(中断允许)、关中断(中断禁止)
保护现场(push和pop相关寄存器)、恢复现场
中断请求标志应该撤除(有些能自动撤除,有些不能自动撤除,需要用相应指令撤除)
STC8H8K64U共有44个中断源:
5个外部中断(INT0~INT4)
5个定时/计数器溢出中断(T0~T4)
4个异步串口中断(UART1~UART4)
1个串行外设接口中断(SPI)
1个I2C总线中断、1个USB中断
1个模数转换中断(ADC)、1个低压检测中断(LVD)、1个比较器中断(CMP)
2个PWM中断(PWMA和PWMB)
8个端口中断(P0~P7)
12个DMA中断
1个RTC中断
1个LCM中断
中断源
除外部中断2、外部中断3、定时器2、定时器3、定时器4固定是最低优先级中断外,其他的中断都具有4个优先级。
(汇编语言 SJMP$相当于 while(1); )
(查询次序号 <--> 中断号)
cuisheng
发表于 2023-8-19 14:34:12
第14集学习记录
中断优先级处理原则:
1、先高后低
2、停低转告
3、高不踩低
4、实现规定
下列情况出现时,CPU不会响应中断请求:
1、EA=0 或发出中断请求的中断所对应的中断允许控制位位0;
2、CPU正在执行一个同级或高一级的中断服务程序;
3、当前执行的机器周期不是指令周期的最后一个机器周期;
4、正在执行的指令是中断返回指令RETI,或者是访问专用寄存器IE或IP的指令时,CPU至少要再执行一条指令才能响应中断请求。
中断服务程序由四个部分组成:
1、保护现场(汇编:PUSH,一般是累加器A和程序状态字寄存器PSW)
2、中断服务
3、恢复现场(汇编:POP)
4、中断返回(RETI:一方面清除中断响应时所置位的优先级有效触发器,一方面由栈顶弹出断点地址送程序计数器PC,从而返回主程序)
中断服务程序注意事项:
1、响应中断后,如果不希望出现中断嵌套,可以在中断开始时,关闭中断EA=0
2、为了保证保护现场和恢复现场能够连续进行,在保护现场和恢复现场之前,应该先关闭中断,结束后,再根据情况开中断
cuisheng
发表于 2023-8-23 22:46:08
第15集学习记录:
T0和T1的工作模式
TMOD:89H
(M1、M0)
模式0:16位自动重装载模式
模式1:16位不可重装载模式
模式2:8位自动重装模式
模式3:不可屏蔽中断的16位自动重装载模式(定时器T1无效)
T2的工作模式
AUXR:8EH
16位自动重装载模式
相关寄存器:
1、M1、M0:工作模式切换
2、C/T:功能选择位(1:计数器功能、0:定时器功能)
3、GATE:门控位。用于选通控制。
GATE=1时,同时INTn为高电平且TRn置位时,启动定时器工作。
定时控制寄存器(TCON)88H,可位寻址
TF1、TF0:溢出中断标志
TR1、TR0:运行控制位(1-启动定时器、0-停止定时器)
辅助寄存器(AUXR)
T0x12、T1x12、T2x12:速度控制位。0-12分频(FOSC/12);1-不分频(FOSC)
TR2:定时器2运行控制位
T2_C/T:控制T2用作定时器或计数器
中断与时钟输出控制寄存器(INTCLKO)
T0CLKO、T1CLKO、T2CLKO:定时器时钟输出控制
0-关闭时钟输出、1-是能时钟输出功能
T4/T3控制寄存器(T4T3M)D1H
还有各个定时器的重装载寄存器、时钟预分频器。
cuisheng
发表于 2023-8-26 17:26:57
第16集学习记录:
定时器的最大定时能力:
在晶振频率位11.0592MHz的情况下,12分频,
对于16位的定时器,最大定时能力约为71毫秒
对于24位定时器(T2~T4),最大定时能力为18秒
定时/计数器初始化部分的步骤大致如下:
1、设置工作方式,将控制字写入方式寄存器。
2、把定时/计数初值装入TLn、THn寄存器。
3、置位TRn以启动定时/计数。
4、置位ETn允许定时/计数器中断(如果需要)。
5、置位EA使CPU开放中断。
cuisheng
发表于 2023-9-9 09:53:16
第17集学习记录:串口原理一
STC8H8K64U:
4个异步串行通信接口(UART)
1个SPI通信口
1个I2C接口
1个USB接口
异步数据传送中,CPU与外设必须约定以下内容:
1、字符格式
字符的编码形式、奇偶校验形式、起始位、停止位。
2、通信速率
波特率
典型表示方法,如:9600,n,8,1
(n: 无校验、e:偶校验、o:奇校验,8:8个数据位,1:1个停止位)
UART:通用异步接收器/发送器
PE:奇偶错
OE:溢出错
FE:帧错
cuisheng
发表于 2023-9-9 21:14:41
第18集学习记录:串口原理二
每个串口由2个数据缓冲器(发送和接收)、1个移位寄存器、1个串行控制寄存器组、1个波特率发生器等。
串口1有四种工作模式,通过SCON中的SM0、SM1位的设置进行选择,其中两种模式波特率可变,另外两种是固定的。
串口2/3/4都只有两种工作模式(异步),通过S2CON/S3CON/S4CON中的S2SM0/S3SM0/S4SM0位的设置进行选择,波特率可变。
串口1四种工作模式:
方式0:同步移位串行模式
方式1:可变波特率8位数据模式(单机通信)
方式2:固定波特率9位数据模式
方式3:可变波特率9位数据模式(多机通信)
波特率 = (T1的溢出率或T2的溢出率) / 4 T1/T2工作在模式0(16位自动重装载模式)
SM2:多机通信控制位