找回密码
 立即注册
楼主: wpppmlah

【实验箱已收到】wpppmlah的课程打卡23-08

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-8-22 17:48:59 | 显示全部楼层
2023年 08月 21日下午陈桂友老师STC8H8K64U的应用课程打卡


定时/计数器的应用
在自动控制系统或者自动检测系统中,经常要用到定时器或者计数 器,用于定时完成相关的任务,
或者对外部事件进行计数,这可以通过 单片机集成的定时/计数器实现。


1 .定时/计数器的作用
STC8H8K64U单片机内部集成了五个16位的定时/计数器(TO、T1、T2、T3和T4),作用如下:
(1)        方便地用于定时控制;
(2)        用作分频器和用于事件记录;
(3)        可编程时钟输出功能,用于给外部器件提供时钟;
(4)        可以有作串口的波特率发生器。

1.png


2.单片机CPU和定时器相关寄存器
   STC8H8K64U集成了5个16位的通用定时/计数窝T0、T1、T2、T3和T4,分别由两个8位的 特殊功能奇存器THn和TLn组成
(n=0、1、2、3、4).
  单片机中的微处理器、定时器相关特殊功能寄存器之间的关系框图。

2.png



作为定时器使为时,STC8H8K64U的定时/计数器脉冲源可以选择是否12分频,定时器/计数 器T0、T1及T2分别由辅助寄存器
AUXR中的T0x12、T1x12和T2x12三个控制位进行设置,定时器/计数器T3、T4由特殊功能寄存器T4T3M中的T3x12和T4x12
两个控制位进行设置。

3.png


STC8H8K64U的定时器/计数器TO有4种工作模式:
模式 0 (16位自动重装载模式)
模式 1 (16位不可重装载模式)
模式 2 (8位自动重装模式)
模式 3 (不可屏蔽中断的16位自动重装载模式)【与模式0相同,不可肝蔽中断,中断优先级最 高,高于其他所有
          中断的优先级,并且不可关闭,可用作操作系统的系统节拍定时器,或者系统监控定 时器。
定时器/计数器T1除模式3外,其他工作模式与定时器/计数器0相同。T1在模式3时无效, 停止计数。       

4.png

5.png

6.png

7.png

8.png


1)        TF1:定时器1溢出中断标志。当定时器1溢出时,由内部硬件置位,当单片机转向中断服务程序时,由内部硬件清除。
2)        TR1:定时器1运行控制位。
      1:启动定时器1;        0:停止定时器1。
3)        TF0:定时器0溢出中断标志。当定时器0溢出时由内部硬件置位,当单片机进入中断服务程序时,由内部硬件清除。
4)        TR0:定时器0运行控制位。
     1:启动定时器0;        0:停止定时器0。
     TCON的0〜3位与外部中断有关。

9.png


1)        T0x12: T0速度控制位。0: 12分频(FOSC/12) ; 1:不分频(FOSC).
2)        T1X12: T1 速度控制位。0: 12分频(FOSC/12) ; 1:不分频(FOSC) .
   如果UART串口用T1作为波特率发生器,T1X12位决定UART串口是12T还是1T。
3)        TR2:定时器2的运行控制位。0:定时器2停止计数;        1:定时器2开始计数。
4)        T2_C/T:控制T2用作定时器或计数器。0: T2用作定时器;1: T2用作计数器。
5)        T2x12: T2速度控制位。0: T2每12个时钟计数一次;1: T2每1个时钟计数一次。
    T2除了作为一般定时器使用外,主要用于串行口的波特率发生器。如果UART用T2作为波特率发生器, T2x12位决定
    UART申口是12T还是1T。
   UART_M0x6用于控制UART串口的速度。S1ST2为串口1波特率发生器选择位。具体内容请参见第9章。
     EXTRAM用于设置是否允许使用内部8192B的扩展RAM。

10.png


1)        T2CLKO:定时器2时钟输出控制。
    0:关闭T2时钟输出;
    1:使能T2时钟输出功能。当T2计数发生溢出时,P1. 3口的电平自动发生翻转。
2)        T1CLKO:定时器1时钟输出控制。
    0:关闭T1时钟输出;
    1:使能T1时钟输出功能。当T1计数发生溢出时,P3.4口的电平自动发生翻转。
3)        T0CLKO:定时器。时钟输出控制。
    0:关闭T0时钟输出;
    1:使能T0时钟输出功能。当T0计数发生溢出时,P3. 5口的电平自动发生翻转。

11.png


1)        T4R: T4的运行控制位。0: T4停止计数;                1:允许T4计数。
2)        T4_C/T:控制T4用作定时器或计数器。0: T4用作定时器;1: T4用作计数器。
3)        T4x12:定时器4速度控制位。0: 12分频(F0SC/12) ; 1:不分频(F0SC)。
4)        T4CLKO: T4时钟输出控制。0:关闭T4时钟输出;1:使能T4时钟输出功能(由P0.7输出)。
5)        T3R: T3的运行控制位。0: T3停止计数;        1:允许T3计数。
6)        T3_C/T:控制T3用作定时器或计数器。0: T3用作定时器;1: T3用作计数器。
7)        T3x12:定时器3速度控制位。0: 12分频(F0SC/12) ; 1:不分频(F0SC)。
8)        T3CLKO: T3时钟输出控制。0:关闭T3时钟输出;1:使能T3时钟输出功能(由P0.5输出)。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-8-22 18:16:55 | 显示全部楼层
本帖最后由 wpppmlah 于 2023-8-22 19:35 编辑

2023/08/22 何宾教授 汇编程序设计 打卡
ERET (*)
该指令实现扩展的返回
■当返回时,依次从堆栈中弹出3字节PC的字节2、字节1和字节0,并将 堆栈指针减3。程序在恢复的程序计数器指向的地址处继续执行,通常是紧跟EGALL之后的指令
.该指令不影响标志位
RETI (*)
该指夺从中断返回。当返回时,该指令从堆栈中弹出两个或四个 字节,具体取决于C0NFIG1寄存器中的INTR
■如果INTR = "0" , RETIPC的高字节和低字节依次从堆栈中弹出, 并作为FF:区域的16位返回地址。堆栈指针减2。其他寄存器不受影响, PSWfflPSWI都不会自动恢复到中断前的状态
■如果INTR = "V , RETI从堆栈中弹出四个字节:PSW1PC的三个字 节。PC的三个字节是返回地址,它可以是16MB内存空间中的任意位置。 堆栈指针减四。PSW1恢复到中断前状态,但PSW没有恢复到中断前状 态。其他寄存器不受影响
对于INTR的任意值,硬件都会恢复中断逻辑以接受与刚刚处理 的中断具有相同优先级的其他中断。程序在返回地址继续执行, 该地址通常是检测到中断请求点之后的指令。如果在执行RETI 指令时有相同或更低优先级的中断未处理,则在处理未处理中断 之前执行该条指令
■ RETI指令执行的操作和机器指令格式
对于底层的操作,C语言是无法去进行操作.只能以汇编语言进行操作.
AJMPaddr11 (*)
.该指令实现绝对跳转
■具体来说,将程序执行转移到指定地址,该地址是在运行时通过连接pc 的高5(在PC递增两次之后)、11位地址addr11由操作码第7--5 位和指令的第二个字节构成
.目标地址必须与AJMP之后指令的第一个字节位于程序存储器的 同一个2 KB 页面
任何指令在执行的时候,PC都会根据指令长度进行自动递增!

绝对跳转EJMP
■该指令实现扩展跳转
■具体来说,通过将指令的第2字节、第3和第4个字节加载到PC8位高字 节和16位低字节,进行无条件跳转到指定地址
.目标地址可以在整个16MB内存空间中的任意位置
该指令不影响标志位



长跳LJMP
该指令执行长跳转
具体来说,通过将指令的第2和第3个字节分别加载到PC高位和低位字节, 进行无条件跳转到指定地址
目标可以在整个64KB的程序存储器的任意地址
不影响标志位

短跳转SJMP rel
该指令实现短跳转,控制程序无条件地跳转到指定地址
■具体来说,将pc递增两次后,pc加上指令第二个字节中的所有符号和相对偏移来计算跳转目标地址
因此允许目标地范围是从该指令的前128个字节到它之后127个字节之间'
不影响标志位
该指令执行的操作和机器指令格式
间接跳转JMP@A+DPTR (*)
该指令实现间接跳转
■具体来说,将累加器A8位无符号内容与16位数据指针相加,并将结果的和加载到程序计数器PC的低16位中。这是后续指令取指的地址
累加器A的内容和数据指针不受影响
不影响标志位
该指令执行的操作和机器指令格式

JCrel (*)
如果设置进位标志CY,则跳转
■具体来说,如果置位了进位标志CY,则跳转到指定的地址;否则,继续执行下一条指令
在将PC递增两次之后,通过将第二个指令字节中的有符号相对偏移加到 PC来计算跳转的目标地址
该指令不改变标志位

JNC rel (*)
如果未设置CY标志位,则跳转
■具体来说,如果清除进位标志CY,则跳转到指定的地址;否则,继续下 一条指令
在将PC递增两次指向下一条指令之后,通过将第二个指令字节中的有符 号相对偏移加到PC来计算目标地址
该指令不影响标志位


如果设置了指定位,则跳转 JB
具体来说,如果设置了指定位,则跳转到指定的地址;否则,继续执行下一条指令
在将指令递增到下一条指令的第一个字节之后,通过将指令字节 中的有符号相对偏移加到PC来计算跳转的目标地址
该指令不改变标志位和测试位

如果清除指定位,则跳转 JNB
具体来说,如果清除了指定位,则跳转到指定的地址;否则,继 续执行下一条指令
在将指令递增到下一条指令的第一个字节之后,通过将指令字节 中的有符号相对偏移加到PC来计算跳转的目标地址
不改变标志位和测试位











JZ   rel (*)
当累加器A内容为零时,则跳转
■具体来说,如果累加器A的所有位均为零,则跳转到指定的地址;否则, 继续执行下一条指令。PC递增2次,PC加上指令的第二个字节中的所有 瞻相对位移来计算跳转
该指令不修改累加器的内容,且不影响标志位

JNZ  rel(*)
当累加器A的内容不等于零时,则跳转
■具体来说,如果累加器A的某位不等于零,则跳转到指定的地址;否则, 继续执行下一条指令。PC递增2次,PC加上指令的第二个字节中的所有 瞻相对位移来计算跳转地址
该指令不修改累加器的内容,且不影响标志位








JNE rel

若不相等,则跳转
■具体来说,如果清零了标志位Z则跳转到指定的地址;否则,继续执行 下一条指令。在将PC递增两次之后,通过将第二个指令字节中的有符号 相对位移加到PC来计算目标地址


JG rel
如果大于,则跳转
■具体来说,如果同时清除了标志位ZCY,则跳转到指定的地址;否则继续执行下一条指令。在将PC递增两次之后,通过将第二个指令字节中的 有符号相对位移加到PC来计算目标地址




JLE rel
如果小于或等于,则跳转
■具体来说,如果设置了标志位ZCY,则跳转到指定的地址;否则,继续 执行下一条指令。在将PC递增两次之后,通过将第二个指令字节中的有 符号相对位移加到PC来计算目标地址

JSL rel
如果小于,则跳转(带符号)
■具体来说,如果符号位N和进位标志OV不同,则跳转到指定的地址;否则,继续 执行下一条指令。在将PC递增两次之后,通过将第二个指令字节中的有 符号相对位移加到PC来计算目标地址
JSGE rel
如果大于等于,则跳转(带符号)
■具体来说,如果符号位N和符号位OV具有相同的值,则跳转到指定的地址;否 则,继续执行下一条指令。在将PC递增两次之后,通过将第二个指令字 节中的有符号相对位移加到PC来计算目标地址

JSLE rel
如果小于等于,则跳转(带符号)
■具体来说,如果设置了标志位Z或者符号位NOV不同,则跳转到指定的 地址;否则,继续执行下一条指令。在将PC递增两次之后,通过将第二 个指令字节中的有符号相对位移加到PC来计算目标地址

JSG  rel
如果大于,则跳转(有符号)
■具体来说,如果清除了标志位Z且符号位NOV具有相同的值,则跳转 到指定的地址;否则,继续执行下一条指令。在将PC递增两次之后,通 过将第二个指令字节中的有符号相对位移加到PC来计算目标地址




前两个操作数允许四种寻址模式组合
累加器可以与任意直接寻址的字节或立即数数据进行比较,任意 通过间接寻址的RAM空间或工作寄存器都可以与立即数进行比
CNJE指令影响CY标志,N标志和Z标志






--递减跳转指令DJNZ
递减。如果不为零,则跳转
具体来说,如果结果值不为零,则将指定位置减1并跳转到第二 个操作数指定的地址。原始值0x00下溢到OxFF在将PC递增到 下一条指令的第一个字节之后,通过将指令最后一个字节中的带 符号相对位移值加到PC来计算目标地址值
递减的位置可以是寄存器或直接寻址的字节
该指令影响N以及Z标志位




A251编译器把汇编语言的程序编译成机器语言
C251C语言的程序编译成机器语言
L251把代码放在指定的位置
OH251 转换成为HEX文件

第七章 汇编语言程序设计
主要内容
汇编语言程序结构和段分配
符号和符号名字
■表达式和操作符
■控制语句
■条件汇编
■宏的定义和调用
■设计实例一:LED驱动和控制
■设计实例二:按键中断和LED控制
语言程序结构和段分配
所谓的汇编语言程序就是按照一定的规则组合在一起器语言助记符和汇编助记符命令
这些按一定规则组合在一起的汇编语言助记符机器指令,能通 Keil MDK软件的处理,转换成可以在STC32G系列32位单片 机处理器核上按照设计要求运行的机器代码

编语言程序框架
一个完整的可以运行在STC32G系列单片上的汇编语言程序代码
下面的汇编语言程序将保存在STC32G系列单片机程序存储器中 (即CODE段,具体地址由TABLE符号指定)中的4个常数 0x01230x45670x89abOxcdef搬移到STC32G系列单片机 内的数据存储器中(即EDATA段,具体地址由STORE指定)

data_segl SEGMENT CODE  ;代码段 放代码和常数
RSEG data_segl            ;要使用代码段
TABLE:        DW 0x0123,0x4567,0x89ab, Oxcdef ;符号地址:定义了四个常数 十六位数
data_seg2 SEGMENT EDATA    ;声明了一个段 要使用EDATA数据区 用到了STC32G EDATA
RSEG data_seg2
STORE:        DSW 4            ;分配了一个空间,STORE 符号开始,然后分配了4个字,按需使用.连续8个字节

prog_seg SEGMENT CODE ;真正的代码区域
RSEG prog_seg         ;声明并使用
LJMP main               ;跳转到主函数的地址
ORG 0x0220
main:
     MOV DPTR, #TABLE
      MOV WR0,     #STORE           
      MOV R4,       #0X04          ;循环次数
CON:
      MOV   A,   #0X0
      MOVC  A,   @A+DPTR
      MOV   R2,   A
      INC    DPTR
      MOV   A ,   #0X0
      MOVC  A,   @A+DPTR
      MOV   R3,    A
MOV   @WR0,WR2
INC    DPTR          ;递增1
ADD   WR0,   # 0X2  ;指向第二个数据
MOV   A,    R4
SUBB   A,   #0X1   
MOV   R4,  A
JNZ    CON      ;不等 于0跳转到CON
NOP
END


(segment)是代码块或数据存储器
段是可重定位的或绝对的
可重定位的段具有名字、类型和其他属性
将来自不同模块的相同名字的段看作是同一段的一部分,称为部 分段
L251链接器/定位器将具有相同名字的多个部分段合并位一个段
注:绝对段不能与其他段组合
CODE段,也称为代码段,它是用来保存程序中汇编助记 符描述的机器指令部分以及程序中所用到的常数和表格等
■ CODE磨放在STC32G系列单片机中的程序Flash存储空间
注:CODE霞可以由MOVC指令,并且通过DPTR寄存器进彳亓方问
数据段DATA中的存储器位置可以通过直接和间接存储器 访问来寻址
在兼容MCS-251 ISASTC32G系列单片机实现中SFRDATA 段中的地址大于0x80SFR的位置只能通过直接访问来寻址


BIT段中的存储器位置可用8051中的位指令寻址 ■位于位可寻址存储器位置中的SFR可以用位指令寻址
可位寻址SFR位置为80H88H90H98H0A0H0A8H0B0H 0B8H0C0H0C8H0D0H0D8H0E0H0E8H, 0F0H 0F8H (可位寻址的只能是可以被8整除的地址)

回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-8-24 11:58:49 | 显示全部楼层

随着计算机测控系统和物联网的发展,通信功能显得越来越 重要。
STC8H8K64U单片机集成了:
4个异步串行通信接口(UART)
1个SPI通信口
1个TC接口
1个USB接口
串行通信的相关概念
基本的数据通信方式有两种:
并行通信一一数据的各位同时传送
串行通信一一数据一位一位地顺序传送

串行通信的分类-2
异步通信的数据帧格式:(7个数据位)

串行通信的分类-3
异步通信的数据帧格式(8个数据位):

二.串行通信的分类-4
在异步数据传送中,CPU与外设之间事先必须约定好以下内容:
1)字符格式
双方要设定好字符的编码形式、奇偶校验形式、起始位和停止位的规定。
2)通信速率
  通信速率通常使用波特率来表示。
典型的表示方法:如,9600, n, 8,  (9600表示波特率)

二串行通信的分类-5
(2)同步通信
同步通信效率高,但线路复杂,适合于近距离通信。
同步通信需要注意的是:同步通信的收/发双方必须使用相同的同步字符;
在同步传送中要求用同步时钟来实现发送端和接收端之间的严格同步,
而且对同步时钟脉冲信号的相位一致性要求非常严格。

二.串行通信的分类-6
2、按照数据的传送方向分类
(1)单工方式:只允许数据按一个固定的传送方向传送。
  例如:无线电广播
a)多终端半双工通信方式
b)多终端全双工通信方式
1.串行接口
在串行传送中,数据是一位一位按顺序进行传送的,而计算机内部的 数据是并行传送的。因此当计算机向外发送数据时,必须将并行的数据转换为串行的数据再传送。反之,又必须将串行数据转换为并行数据输入计算机中。上述并--串或串--并的转换既可以用软件实现,也可用硬件实现。但由于用软件实现:现会使CPU的负担增加,降低了其利用率,故目前往往用硬件完成这种转换。通用的异步接收器/发送器(UART, Universal Asynchronous Receiver/Transmitter)就可实现上述"串行-并行转换",是串行接口的核心部件。
1.串行接口
串行接口通过系统总线与CPU相连

2.通用的异步接收器/发送器UART的结构

第二节课
1.STC8H8K64U单片机的串口简介
STC8H8K64U单片机具有 4 个全双工异步串行通信接口。每个串行口由 2 个数据缓冲器、一个移位寄存器、一个串行控制寄存器和一个波特率发生器等组成。每个串行口的数据缓冲器由 2 个互相独立的接收、发送缓冲器构成,可以同时发送和接收数据。
串口1有四种工作模式,可通过对寄存器SCON中SMO、SM1位的设置进 行选择,其中两种工作模式的波特率可变,另外两种是固定的。
串口2/串口3/串口4都只有两种工作模式,可通过对寄存器S2C0N中S2SM0, S3SM0和S4SM0位的设置进行选择,两种工作模式的波特率都是可变的。我意思是另 ,不呈出厂的I
用户可用软件选择不同的工作模式,并设置不同的波特率。主机可通过查询或中断方式对接收/发送进行程序处理,使用十分灵活。
通过设置相关的殊功能寄存器,串口1、串口2、串口3〔串口4的引脚均可以进行切换(请参看第三章)。功能引脚的切换功能不仅可以使得电路板的布线更加合理,而且还可以将一个通信接口分时复用为多个通信接口。

2.STC8H8K64U的串口接口的寄存器
  与串口 1 相关的寄存器有SCON、PCON、AUXR、SBUF、TMOD、TH1、TL1、TCON、IE、IP、SADEN和SADDR。
与串口2相关的寄存器有:S2CON、S2BUF、TH2、TL2、AUXR、IE2、IP2和AUXR1.
与串口3相关的存器有:S3CON、S3BUF.
与串口4相关的存器有:S4CON、S4BUF,其中,寄存器TMOD、TH1,TL1,TH2,TL2,TCON与定时器有关,详细介绍请参见第7章;寄存器IE,IE2,IP,IP2与中断有关,详细介绍请参见第6章。
相关寄存器:



SM0/FE:当PCON寄存器中的SMOD0位为1时,该位为帧错误检测标志位。当UART在接收过程中检测到一个无效停止位时,通过UART接收器将该位置1,必须由软件清零。当PCON寄存器中的SMOD0位为0时,该位和SM1一起指定串口1的通信工作模式
串口1的工作模式:

(2) SM2:多机通信控制位。多机通信主要指单片机通信时工作于方式2和方式3。SM2位主要用 于方式2和方式3,是进行主----从多机通信的控制位。这种多机通信方式一般为“一台主机,多台从机”系统,主机发送的信息可被各从机接收,而从机只能与主机进行通信,从机间互相不能直接通信。
设有一个由主机(单片机或其他具有串行接口的设备)和3个STC8H8K64U单片机组成的从机系统 ,则多机通信系统示意图如下图所示。

实现多机通信的过程:
(1)        主、从机均初始化为模式2或模式3, 置SM2=1,允许中断。
(2)        主机置TB8 = 1,发送要寻址的从机地址。
(3)        所有从机均接收主机发送的地址,并进行地址比较。
(4)        被寻址的从机确认地址后,置本机SM2=0,此时可向主机返回地址,供主机核对。
(5)核对无误后,主机向被寻址的从机发送命令,通知从机接收或发送数据。
(6)通信只能在主机和从机之间进行,两个从机之间的通信需通过主机作中介。
(7)本机通信结束后,主、从机重置SM2 = 1,主机可再对其他从机寻址。
在实际工程应用中,这种多机通信中的接口协议常用RS-485标准。RS-485是一种多发送器的电路标准,它允许双导线上一个发送器驱动最多256个负载设备(不同的芯片数量不同)。
RS-485为半双工,在某一时刻,一个发送另一个接收。在电路设计上,平衡连接电缆两端要有终端电阻。常用的RS-485芯片是MAX 1487 (目前也出现了很多与其兼容的芯片),其包含一个 驱动器和一个接收器,适合于RS-485通信标准的低功率收发器。详细信息及使用方法,请参见 相关手册。
2,串口2控制寄存器S2CON









SADDR:从机地址寄存器
SADEN:从机地址屏蔽位寄存器
自动地址识别功能典型应用在多机通讯领域,其主要原理是从机系统通过硬件比较功能来识别来自于主机串口数据流中的地址信息,通过寄存器 SADDR 和 SADEN 设置的本机的从机地址,硬件自动对从机地址进行过滤,当来自于主机的从机地址信息与本机所设置的从机地址相匹配时,硬件产生串口中断;否则硬件自动丢弃串口数据,而不产生中断。当众多处于空闲模式的从机链接在一起时,只有从机地址相匹配的从机才会从空闲模式唤醒,从而可以大大降低从机 MCU 的功耗,即使从机处于正常工作状态也可避免不停地进入串口中断而降低系统执行效率。
要使用串口的自动地址识别功能,首先需要将参与通讯的 MCU 的串口通讯模式设置为模式 2 或者模式 3(通常都选择波特率可变的模式 3,因为模式 2 的波特率是固定的,不便于调节),并开启从机的SCON 的 SM2 位。对于串口模式 2 或者模式 3 的 9 位数据位中,第 9 位数据(存放在 RB8 中)为地址/数据的标志位,当第 9 位数据为 1 时,表示前面的 8 位数据(存放在 SBUF 中)为地址信息。当 SM2被设置为 1 时,从机 MCU 会自动过滤掉非地址数据(第 9 位为 0 的数据),而对 SBUF 中的地址数据(第9 位为 1 的数据)自动与 SADDR 和 SADEN 所设置的本机地址进行比较,若地址相匹配,则会将 RI 置“1”,并产生中断,否则不予处理本次接收的串口数据。
   从机地址的设置是通过 SADDR 和 SADEN 两个寄存器进行设置的。SADDR 为从机地址寄存器,里
面存放本机的从机地址。SADEN 为从机地址屏蔽位寄存器,用于设置地址信息中的忽略位,设置方法
如下:
例如
SADDR  =  11001010
SADEN  =  10000001
则匹配地址为  1xxxxxx0
即,只要主机送出的地址数据中的 bit0 为 0 且 bit7 为 1 就可以和本机地址相匹配
再例如
SADDR  =  11001010
SADEN  =  00001111
则匹配地址为  xxxx1010
即,只要主机送出的地址数据中的低 4 位为 1010 就可以和本机地址相匹配,而高 4 为被忽略,可以
为任意值。
主机可以使用广播地址(FFH)同时选中所有的从机来进行通讯。

档亍静态变量.
发送了f图片.
T2作为波特率发生器的话,因为隼口1 环&局时通讯.滴问这样会祕有影:
8.数据缓冲器
数据缓冲器用于保存要发送的数据或者从串口接收到的数据。串口 1的数据缓冲器是SBUF (地址是99H),串口2的数据缓冲器是S2BUF (地址是9BH),串口3的数据缓冲器是S3BUF (地址是ADH),串口4的数据缓冲器是S4BUF (地址是85H)。
对于串口1, SBUF是用来存放发送和接收数据的两个独立的缓冲寄存器,CPU执行给 SBUF赋值的语句时, 触发串口 1的发送,串口 1便一位一位地发送数据,发送完成后标志TI=1;在CPU允许接收串行数据时,外部串行数据经RXD送入SBUF,电路便自动启动接收,第9位则装入SCON寄存器的RB8位,直至完成一帧数据后将RI置1,当串口接收缓冲器接收到一帧数据时,可以执行读取SBUF内容的语句读取串口数据,如rxbuffer=SBUF
对于串口2,串口3,串口4,数据缓冲寄存器的功能与使用方法和串口 1的SBUF相似,在此不做详细描述。

3. STC8H8K64U单片机的串口工作模式
(1)串口1的工作模式
1)串口1工作模式0
当软件设置SCON的地SM0、SM1为“00”时,串口1工作于模式0,串行通信接口工作在同步移位寄存器模式,RxD为串行通讯的数据口,TxD为同步移位脉冲输出脚,发送、接收的是8位数据,低位在先。该模式下,必须清0多机控制位SM2,使之不影响TB8位和RB8位。
模式0的发送过程,当主机执行将数据写入发送缓冲器SBUF指令时启动发送,串行口即将8位数据从RxD引脚输出(从低位到高位),发送完中断标志TI置1, TxD引脚输出同步移位脉冲信号。串口1工作模式0的发送数据时序图:


模式0的接收过程:首先将接收中断请求标志RI清零并置位允许接收控制位REN时启动模式0接收过 程。启动接收过程后,RxD为串行数据输入端,TxD为同步脉冲输出端。当接收完成一帧数据(8位)后 ,控制信号复位,中断标志RI被置1,呈中断申诘状态。当再次接收时,必须通过软件将RI清0。串口1工作模式0的接收数据时序图如图8-10-2所示。



回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-8-26 10:20:57 | 显示全部楼层
20230825何教授课程打卡汇编
举例说明储存在FLASH中的常数是如何定义和保存的。
1.png
2.png
段控制语句 SEGMENT
SEGMENT
■ SEGMENT语句声明一个通用的段,它带有存储器类和段位置选         k
■该语句的格式为:
段名字SEGMENT类[重定位[对齐]
其中:
段名字:指定要分配给段的符号名字。该符号由后续的RSEG语句引用。 它也可以在表达式中用于表示组合段的基地址或起始地址
类:段的存储器分配。类指定段所在的存储空间,链接器使用它访问属于 该类的所有段
功能
BIT
BIT地址空间的有效地址范围为20H.0~2FH.7.比如,21H.5
CODE
CODE地址空间(0000h-0FFFFh)
CONST
CONST地址空间。它与CODE空间相同,但是只用于常数。该存储器使 用MOVC指令访问
DATA
DATA地址空间00h~7Fh
EBIT
兼容MCS-251 ISA单片机扩展的BIT空间
ECODE
兼容MCS-251 ISA单片机的整个地址空间(用于代码)
ECONST
兼容MCS-251 ISA单片机的扩展CONST间(与EDATA相同)
EDATA
兼容MCS-251 ISA单片机的扩展DATA空间
HCONST
兼容MCS-251 ISA单片机的整个地址空间(用于常数)
兼容MCS-251 ISA单片机的整个地址空间(用于数据)
HDATA
IDATA
IDATA址空间(范围00h-0FFh)
RSEG,告诉编译器,我这个段是可以重定位的。由链接器来分配到代码段。
编写8051指令的汇编代码
复杂
编写80251扩展指令的汇编代码
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps1.jpg
汇编代码中段的分配
EBIT
MCS-251 ISAEBIT段提供了扩展位可寻址存储器空间
该空间由扩展位指令寻址
■ MCS-251 ISA中,所有SFR也可以使用扩展位指令寻址
mybits   SEGMENT EBIT  ;定义EBITmybit
              RSEG mybits        ;引用该段
            ORG 0x90               ;位地址偏移0x90,等效于 0x32.0
ZFLAG: DBIT 1                  ;在0x32.0定义一个位ZFLAG
PSW1     DATA 0D1H         ;80251SFR PSW1 的地址
DAT        DATA 40H             :80251中的可位寻址区域
符号是定义的一个名字,用来表示一个值、文本块、地址 或者寄存器的名字。也可用符号表示常数和表达式
符号最老可以由31个字符组成,包括
A~Z之间的大写字母
a~z之间的小写字母
0~9之间的数字
下划线
■问号"V
符号名字可以以除0~9以外的任何字符开头
符号可以以多种方式定义
在汇编语言程序代码中,可以使用EQUSET控制语句定义符号,
用于表示表达式。例如:'
NUMBER FIVE
EQU
5
TRUE FLAG
SET
1
FALSE FLAG
SET
0
在汇编语言程序代码中,可以将符号定义为标号。比如:
LABEL1:        DJNZ RO, LABEL1
符号也用于引用一个变量的位置。比如:
SERIAL BUFFER DATA 99h
标号定义了程序或数据空间中的“位置“(地址)
适用于符号名字的所智规则也适用于标号
当定义标号时,标号必须是一行中第一个文本字段
它前面可能是制表符或空格
在符号名字后面必须紧跟着冒号字符":”,用于将其标识为标
—行只能定义—个标号
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps2.jpg
■标号可以指程序代码、基本数据或扩展数据存储器中的变量空间, 也可以指程再在程序或代码空间中的常数数据
此外,程序开发人员也可以使用标号将程序执行转移到其他位置
标号后面的指令可以通过使用标号来引用
程序可以跳转到标号或调用标号。在标号后面的代码将被立即执行
在调试程序代码时,标号可以给仿真器和调试器提供消息
■仿真器或调试器可以在调试时提供标号。这将有益于简化调试过程
注:标号只能定义一次,不能重新定义它
A251汇编器定义并保留MCS-251 ISA中寄存器集的名字
在基于MCS-251 ISA的汇编程序代码中,这些预定义的名字用于访问处理器核中的寄存器
寄存器
功能
A
表示8051单片机处理器核中的累加器.它与许多操作一起使用,包括乘 法和除法、将数据移动到外部存储器和从外部存储器移动数据、布尔运算 等
DPTR
寄存器DPTR16位的数据指针,用于访问XDATACODE存储器中的 地址数据
PC
寄存器PC16位的程序计数器。它包含着下一条要执行指令的地址
C
进位标志;指示产生进位的操作状态。操作也使用进位标志来表示借位
寄存器
功能
AB
R0~R7
在乘法(MUL)和除法(DIV)指令中,使用寄存器A和寄存器B
在当前活动寄存器组中的,88位通用8051寄存器。最多可以使用四 个寄存器组
AR0-AR7
表示当前寄存器组中R0~R7的绝对数据地址。这些寄存器的绝对地址根 据当前选择的寄存器组而变化。这些符号仪在给出USING汇编语句时才 可以使用
R8-R15
MCS-251 ISA中提供的额外88位通用寄存器
WR0-WR30
MCS-251 ISA中提供的1616位通用寄存器。寄存器WR0~WR14与寄 存器R0~R15重叠。注意,此处没有可用的WR1
DR0-DR28,
DR56, DR60
MCS-251 ISA中提供的1032位通用寄存器。寄存器DR0-DR28与寄 存器WR0~WR30重叠。注意,此处没有可用的DR1DR2DR3
■表达式和操作数
操作数是与汇编命令或指令一起指定的参数或表达式
汇编器命令需要常数或符号的操作数。比如:
VVV EQU 3
         DS 10h
■汇编器指令比命令支持的操作数种类更多
有些指令不需要操作数,有些指令最多需要3个操作数,多个操 作数用逗号分隔。比如:
MOV R2, #0
所需操作数的个数以及类型取决于指定的指令或命令
指令操作数的类型
操作数类型
功能
立即数
用作数字值的符号或常数
直接位地址
引用位地址的符号或常数
程序地址
引用代码地址的符号或常故
直接数据地址
引用数据地址的符号或常故
间接地址
对一个存储器位置的间接引用,(可选)偏移
特殊汇编器符号
寄存器名字
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps3.jpg
冒号表示法中的数字
        用下面代替       
VAL1 EQU 0:20H
VAL2 EQU OFF: 1000H
VAL1 EQU EDATA 20H
VAL2 EQU ECODE 0FF1000H
ORG OFE:2000H
?modulename?number SEGMENT ECODE AT
0FE2000H RSEG ?modulename?number
ORG 0:400H
?modulename?number SEGMENT EDATA AT 400H
RSEG ?modulename?number
CSEG  AT  0FE:2000H
?modulename?number SEGMENT ECODE AT
0FE2000H RSEG ?modulename?number
BVAR1   BIT  0:20H.1
BVAR1   BIT   0:30H.1
PUSH.BM3
PUSH.W #13
BVAR1 BIT20H.1
BAVR1 EQU EBIT 30H.1
PUSH BYTE #13
PUSH WORD 013
在汇编语言的任何地方都可以使用字符,它可以用来作为立 即数。例如:
LETTR_A  EQU 'A'
TEST:    MOV @R0,#'F'
         SUBB A,#'0'
字符串与汇编器描述DB—起使用,用来定义在A251汇编程序中的消息
字符串用一对单引号''包含。比如:
     KEYMSG:   DB 'Press any key to continue.'
该声明将在KEYMSG向的缓冷区内生成下面的十六进制数,即:50h72h
65h73h73h20h        ......6Eh75h6Sh2Eh
此外,也可以在同一行混合字符串和数字数据.比如:
EOLMSG:   DB   ‘End of line', 00h
在该例子中,后面添加的00h,用于表示字符串"行尾”的结束
-位置计数器
在汇编器中,为每个段保留了一个位置计数器
在这个计数器中,包含了指令或者数据的偏移地址
■位置计数器在每行之后递增该行中代码或数据的字节数
默认,将每段的位置计数器初始化为0
可以用ORG描述修改位置计数器的初值
在表达式中,使用“$"符号,用于得到位置计数器当前的值, 可以使用位置计数器确定一个字符串的长度。比如:
msg:    DB    'This is a message*, 0
msg_len:    EQU   $-msg
此外,可以在指令中使用位置计数器.比如,下面的指令创建一个无限循环
JMP      $        ; 相当于C语言中的while (1)
在汇编语言中,操作符可以是一元操作符(即,只有一个
操作数);或者二元操作符(即,有两个操作数)
*操作符及其操作数的组合就构成一个表达式
--优先级
括号可用于包含多个运算符的表达式中,以指定运算符的
求值顺序
如果表达式中未使用括号,则运算符优先级顺序决定求值顺序
优先级
1最高 ()
NOTHIGHLOWBYTEOBYTE1BYTE2BYTE3WORDO WORD2
一元+―元-
*/、MOD
5              +-
SHL (左移)、SHR (右移)
ANDORXOR
(最低 EQNE<>LT <、LTE<=GT>GTE>=
BYTEx根据x所指定操作数的位置,返回相应的字节
BYTE0返回鼠低的字节(与LOW等效);BYTE1返回紧挨BYTE0的字节
(与HIGH等效)
WORDx根据X指定的操作数的位置,返回相应的字
WORD0返回最低的字16位);WORD2返回最高的两个字节16位)
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps4.jpg
类操作符
在本章前面介绍了类运算符,它们为表达式分配存储器类
这就是将表达式与类关联的方式
BIT
BIT表达式
将类BIT分配给表达式
CODE
CODE表达式
将类CODE分配给表达式
CONST
CONST表达式
将类CONST分配给表达式
DATA
DATA表达式
将类DATA分配给表达式
EBIT
EBIT表达式
将类E8IT分配给表达式
ECODE
ECODE表达式
将类ECODE分配给表达式
cCONST EDATA
CONST表达式 EDATA 表达式
将癸ECONST分配给表达式 将类EDATA分配给表达式
IDATA
IDATA表达式
将类IDATA分配给表达式
HCONST
HCONST表达式
将类HCONST分配给表达式
HDATA
HDATA表达式
将类HDATA分配给表达式
XDATA
XOATA表达式
将类XDATA分配给表达式
类型运算符为表达式指定数据类型
操作符
语法       
功能
BYTE
BYTE表达式
将类BYTE分配给表达式
WORD
WORD表达式
将类WORD分配绘表达式
DWORD
DWORD表达式
将类DWORD分配给表达式
NEAR
NEAR表达式
将类NEAR分配靖表达式
FAR
FAR表达式
将类FAR分配给表达式
表达式
EXTRN CODE (CLAB)
EXTRN DATA (DVAR)
MSK EQU OFOH
VALUE EQU MSK -1
LVAL EQU 12345678H myVar EQU EDATA OO3OH
FOO SEGMENT CODE RSEG FOO
代码空间CODE入口
数据空间DATA的变量
定义符号用于代替0xF0
;另一个常数的符号值
LVAL的值为12345678H ;用16地址访问变量
定义代码段CODE的名字FOO ;引用该段
MOV RO,DVAR+20       从地址DVAR+2加载常敷
MOV R1,#LOW (CLAB+10)  加载地址CLAB+10的低字节
MOV WR4#WORD2 (LVAl)加载LVAL的高字
MOV DR0,#ENTRY              加载地址的低字,ENTRYDRO
MOVH DR0#WORD2 (ENTRY);加载地址的高字,ENTRYDRO
MOV R4,@DR0                    ;将ENTRY的内内容加载到R4
MOV myVarR1        ;:将R1 保存到EDATA变量myVar
A251汇编器提供了大量的控制语句,允许程序开发人员 定义符号值、保留和初始化存储空间,以及控制代码的存储位置
这些语句不能和汇编助记符描述的机器指令混淆
这些语句不能产生可执行代码,除了DBDDDW描述外,它们不影响 代码存储器的内容
这些控制改变的是汇编器的状态、定义的用户符号和添加到目标文件的信
ALIGN
■ ALIGN语句将位置计数器设置为下一个地址模2表达式,这可用于确保下一条语句在2的n次方界上对齐
■例如,对于缓存行中的代码或数据。
■如果需要,汇编器会产生间隙。不同段的间隙字节内容不同。在data, 间隙未定义;在const中,间隙为0;code中,间隙为NOP
ALIGN
. ALIGN语句将位置计数器设置为下一个地址模2幂次方,这可用 于确保下一条语句在或边界上对齐
■例如,对于缓存行中的代码或数据。
■如果需要,汇编器会产生间隙。不同段的间隙字节内容不同。在data, 间隙未定义;在const中,间隙为0;code中,间隙为NOP
EVEN
迫使位置计数器指向下一个偶数地址(如果当前的位置计数器为 奇数)
■该语句能确保下一个语句对齐字边界
如果需要,汇编器产生一个字节的间隙,间隙的定义同ALIGN.例如:
MYDATA: SEGMENT DATA WORD
RSEG   MYDATA
var1:   DSB   1
EVEN
var2:   DSW 1
ORG
■ ORG语句更改当前段的位置计数器,并为后续语句设置新的原点
该表达式必须是一个简单的可重定位表达式,并且没有向前引用
只能使用当前段中的绝对地址或符号值
表达式中可以使用表示位置计数器当前值的美元符号字符('$')
当遇到ORG语句时,汇编器计算表达式的值并修改位置计数器
如果ORG语句出现在绝对段中,则将为位置计数器分配指定的绝对地址 值。位置计数器不能设置为低于段的基地址的地址
如果ORG语句出现在可重定位的段中,则将为位置计数器分配指定表达 式的偏移量。例如,如果可重定位地址为1000h开始,并且ORG表达式 的值为1234则下一条语句的绝对地址为2234h (1000h+1234h)
■ ORG语句更改位置计数器,这可能会创建一个间隙,但不会创建新段
■ORG语句的例子,如下:
ORG 100h
ORG RESTART
ORG EXIT1
ORG ($ + 15) AND  0FFF0h
USING
USING语句指定哪个寄存器组(0~3)用于编码AR0~AR7寄存
.所选的寄存器组被记录在目标文件中,并且存储器区域由链接器 保留
一些8051指令(如PUSHPOP)只允许使用绝对地址
汇编器使用当前寄存器组中寄存器的物理地址代替绝对寄存器 (AR0-AR7)
当指令PUSH R0无效时,PUSH AR0有效
■汇编器必须知道使用哪个寄存器组来计算正确的物理地址这就是
使用USING语句的目的
■USING语句不生成任何代码来切换当前寄存器组。汇编程序必须选择正确的寄存器组
■例如,下面的代码选择寄存器组2
PUSH PSW        ;保存当前的寄存器组
MOV PSW, #(2 SHL 3)设置寄存器组2
POP PSW        ;恢复保存的寄存器组
物理地址按如下计算,即物理地址=(寄存器组X8)+寄存器
■谨慎地使用EQU语句来定义绝对寄存器AR0~AR7的符号
符号值在定义时计算(而不是在使用时)
如果随后使用USING语句更改寄存器组,则定义的符号将具有错误的地
址,生成的代码可能会失效
■使用USING语句的例子如下:
USING 3        选择寄存器组3
PUSH AR2               ;将寄存器组3中的R2入栈(地址1Ah)
USING 1        选择寄存器组1
PUSH AR7        ;将寄存器组1中的R7入栈(地址1Fh)
DB
DB语句使用一个或多个字节值初始化存储器
标号是分配给当前存储器的地址符号
表达式保存在存储器中的字节值。每个表达式可以是符号、字符串或表达
DB语句只能在代码或常数段中指定
如果在不同的段中使用,则会生成错误
DB语句的用法如下:
MSG: DB 'Press A Key To Continue', 0
TAB: DB 2, 3, 5,7,11,13,17,19, ‘
DD句使用一个或多个32位双字值初始化存储器
标号是分配给当前存储器的地址符号
表达式保存在存储器中的双字值.每个表达式可以是符号、字符串或表达式
DD语句只能在代码或常数段中指定
如果在不同的段中使用,则会生成错误
DD语句的用法如下:
TABLE: DD TABLE, TABLE+10, NEXT
DD $
NEXT: DD 0
VALS: DD 12345678h, 98765432h, 1
DW
DW语句使用一个或多个字值2个字节)初始化存储器
标号是分配给当前存储器的地址符号
表达式保存在存储器中的字值,每个表达式可以是符号,字符串或表达式
DD句只能在代码或常数段中指定
如果在不同的段中使用,则会生成错误
DD语句的用法如下:        '
TABLE DW TABLE. TABLE+10, HERE
HERE: DW 0
CTAB: DW CASE0, CASE1, CASE2, CASE3
DW    $
DBIT
■ DBIT句在bitebit段中保留指定个数的位数
标号是分配给当前存储器地址的符号.
表达式是要保留的位致
■该语句在当前存储器空间中保留空间,并按保留的位数递增位置 计数器
■该语句的用法如下:
A FLAG: DBIT 1
B FLAG: DBIT 1
DS
■ DS语句在当前的存储器空间中保留指定个数的字节
标号是分配给当前存储器地址的符号
表达式是要保留的字节个数
该语句在当前存储器空间中保留空间,并按保留的字节数递增位
置悔器
■该语句的用法如下:
GAP: DS (($ + 15) AND 0FFF0h) - $ ; 16字节对齐
DS 10
TIME: DS 8
DSB
DSB语句与DS语句的功能完全相同
■该语句的用法如下:
COUNT: DSB 10 TIME: DSB 8
DSD
DSD语句在当前的存储器空间中保留指定个数的32位双字
■标号是分配给当前存储器地址的符号
表达式是要保留的双字个数
■该语句在当前存储器空间中保留空间,并按保留的双字个数递增 位置计数器
■该语句的用法如下:
COUNT: DSB 40
TIME: DSB 8
DSW
■ DSW语句在当前的存储器空间中保留指定个数的16位字
标号是分配给当前存储器地址的混
表达式是要保留字的个数
该语句在当前存储器空间中保留空间,并按保留字的个数递增位 置谶器
PROC ENDP
指令PROCENDP用于定义一个标号,用于称为过程的机器指令序列
对于兼容MCS-251 ISASTC32G系列单片机来说,过程具有NEAR FAR类型这取决于调用它的类型-LCALLACALL (用于NEAR; ECALL (用于FAR
■与C函数不同,汇编器的过程不为标号提供本地作用域。A251中的标识 符必须是唯一的,因为可见性是模块范围的
■该语句的格式如下:
name PROC [type]
  ......
RET
name   ENDP
其中
name: 指定过程的名字
PROC 定这是一个过程函数
type: 指定过程是NEAR/FAR.当未指定类型时,默认为NEAR
RET:程序通常以RET令结束 .件指令RET将自动转换为合适的机器返回指令 .RET用于从类型为NEAR的过程返回;ERET于从类型为FAR的过段返回
ENP:PROC语句定义的ENDP程必须以ENDP结束,前面加上过程的名字
LABEL
■该语句为段中的位置定义符号名字,定义的标号继承了父段的属性,不能在段外定义它
■格式为:
符号[:]LABEL [类型]
(可选)标号定义可以包含指定汇编器所要访问类型的类型
如果未指定类型,则根据段NEAR用于Code段,BYTE用于Data段,
BIT用于Bit段)设置标号类型
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps5.jpg
EXTRN/EXTERN
■该语句(可能出现在汇编源文件中的任何位置)指定当前源文件 使用但在其他目标模块中定义的符号
定义符号的模块必须使用PUBLIC语句导出符号
EXTRN/EXTERN语句指定符号、其存储器类和数据类型
■其格式为:
EXTRN类:(符号1,符号2…,符号N
EXTRN/EXTERN类:类型(符号1,符号2,符号N
file:///C:\Users\ADMINI~1\AppData\Local\Temp\ksohtml11332\wps6.jpg
NAME
■ NAME语句指定要嵌入此汇编器模格的目标文件中的名字
■指定的模块名字最多可以包含40个字符;且必须遵守符号名字规则
如果源模块中不存在NAME语句,则将文件名嵌入到目标模块中
■语句格式为:
NAME模块名
注:模块名字未用作目标文件名字
PUBLIC
PUBLIC语句指定可以在其他目标模块中使用列出的符号
■指定的符号在生成的对象模块中标记为公共符号,并由链接器用于解析来自其他目标模块的外部引用
指定为PUBLIC的符号必须在源文件中定义
■下面的符号可以声明为PUBLIC,包括:
类似BYTEWORDBIT等变量;
NEARFAR存储器中定义的标号;
使用EQU定义的常数;
BSEG
. BSEG语句选择BIT空间内的绝对段,如果包含可选地址,则汇编器从该地址开始绝对段
■有两种表示位地址的方法:
■指定字节基地址和位偏移鬟有效地址范围为20.0H~2F.7H
■ 21H.5
■指定位号。在位表示法中,有效地址范围为0~127,其映射到 20H.0-2FH.7
・地址21 H.5可以表示为位编号13
.如果省略了可选地址,则汇编器从地址20H开始绝对段(如果没 有定义先前的绝对BIT段)
如果先前定灯绝对BIT段,则汇编器从该段的末尾开始继续
ISEG
■ ISEG语句选择IDATA空间内的绝对段
.如果包含可选地址,则汇编器从该地址开始
绝对段有效地址范围为00h~0FFh
■如果省略了可选地址,则汇编器从地址。开始绝对段(如果之前 没有定义绝对IDATA段)。如果先前定义了绝对IDATA段,则 汇编器从该段的末尾开始继续
注:起始地址必须是绝对表达式
RSEG
■ RSEG语句选择一个可重定位的段,该段之前使用SEGMENT 句进行了声明
■该语句的用法,如下:
MYPROG SEGMENT CODE        ;定义一个段
RSEG MYPROG ;选择段
SEGMENT
■ SEGMENT语句声明一个通用的段,它带有存储器类和段位置选
■该语句的格式为:
段名字SEGMENT类[重定位[对齐]
其中:
段名字:指定要分配给段的符号名字。该符号由后续的RSEG语句引用。
它也可以在表达式中用于表示组合段的基地址或起始地址
类:段的存储器分配。类指定段所在的存储空间,链接器使用它访问属于 该类的所有段
XSEG
. XSEG语句选择XDATA空间内的绝对段
■如果包含可选地址,则汇编器从该地址开始绝对段
有效地址范围为0000h~0FFFFh
■如果省略了可选地址,则汇编器从地址0开始绝对段(如果之前 没有定义绝对XDATA段)。如果先前定义了绝对XDATA段,则 汇编器从该段的末尾开始继续
注:起始地址必须是绝对表达式
BIT
■ BIT语句为指定的符号分配地址(范围20h~2F或者MCS-251
ISA兼容的单片机位可寻址区域)
■符号不能重定义
. BIT语句为下面可位寻址条项创建一个位名字,包括:
范围为20H.0~2F.7的绝对地址。比如,23H.2
在可位寻址空间的SFR位。比如,P3.3PSW.7.因为SFR符号是绝对的 因此该语句创建一个绝对位
基于位可寻址数据段中包含的字节的位。如果位可寻址数据段是可重定位 的,则会产生可重定位的位
DATA
DATA语句给指定的符号分配地址(范围00h~0FFh
■不能重新定义符号
DATA语句的用法
SERBUF DATA SBUF P0RT1 DATA 90h RESULT DATA 44h
■ EBIT语句的用法
EXTRN DATA : BYTE (EXTBYTE)
DATA SEG SEGMENT DA"
RSEG DATA SEG                    可重定位.可位寻址段
BITS:        DS 1                    ;一个字节可位寻址的变・
ALARM EBIT, BITS.0               BITS中的位0
D1 OPEN EBIT ALARM + 1    :BITS中的位1
D2 OPEN EBIT ALARM+2     :BITS中的位2
X FLAG EBIT EXTBYTE.5      ;在EXTBYTE中的位5
EQU
■EQU语句使用表达式的值创建一个名字为所命名符号的新符号
使用EQU创建的符号不能重新定义
■表达式可以是寄存器名字,也可以是不带正向引用的简单可重定 位表达式
■用EQU定义的符号可以在操作数、地址或表达式中的任何地方使 用。定义为寄存器的符号可以在任何允许寄存器的地方使用
如果用EQU定义的符号为PUBLIC,则表达式的计算结果必须为 常数。导出的符号包括名字和值,但可能不包括修复方法。
A251汇编器后指定的表达式替换定义的符号名字的每个出现
■ EQU语句的用法
VAL EQU 45+3        ;简单定义
PUBLIC VAL      定义PUBLIC
REG1 EQU        R1        寄存器符号定义
VAR EQU      PUTCHAR ;可重定位的符号定义
IDATA
■ IDATA语句为指定的符号分配一个地址(范围00h~0FFh)
■符号不能重新定义
■该语句的用法
BUF IDATA 60h
BUF LEN EQU 20h
BUF END IDATA BUF + BUF LEN - 1
sbit
sbit语句定义特殊功能寄存器的位
■语法格式如下:
sbit符号=位地址?
sbit语句允许程序开发人员以与C251编译器一致的方式定义
SFR位数据
使用该语句,程序开发人员可以为C251编译器和A251汇编器使用通用 SFR寄存器定义文件
■该语句的用法,如下所示:
sbit P0_0=P0^0;
sbit P0_1=0x90^1;
SET
■ SET语句使用表达式的值创建一个命名符号的新符号
可以重新定义使用SET创建的符号
表达式可以是寄存器的名字,也可以是不带正向引用的简单可重定位表达
.SET定义的符号可以在操作数、地址或表达式中的任何位置使用
定义为寄存器的符号可以在任何允许寄存器的地方使用
注:1)不能将用SET定义的符号设置为PUBLIC
2)不要将SET语句与SET汇编器命令混淆
■ A251汇编器用指定的表达式替换定义的符号名字的每个出现
该语句的用法
VAL        SET        45        ;简单定义
REG1        SET        R1        ;公共定义
VAL        SET        VAL+1        ;重新定义
VAR        SET        PUTCHAR        ;可重定位的符号定义
VAL        SET        VAL+1        ;重新定义
■ sfr语句定义了特殊功能寄存器
.语法格式如下:
sii■符号=地址;
其中,符号是要定义的SFR符号的名字;地址是SFR的地址
使用该语句,程序开发人员可以为C251编译器和A251汇编器使 用通用SFR寄存器定义文件
■该语句的用法
sfr P0=0x80;
sfr P1=0x90:
sfr16
■ sfr16语句为汇编程序定义了 16SFR
注:A251汇编器忽略从sfr16开始的符号定义
该实现是为了兼容C251编译器
该语句的用法
sfr16  T2=0xCC;        /* AX51 忽略 */
XDATA
■ XDATA语句为指定的符号分配地址(范围0000h~0FFFFh
■这个符号不能重新定义
■该语法的用法
XD START XDATA 00000h
XD END XDATA 0FFFFh
ERROR
■ _ERROR_使用指定的文本来产生错误的信息
■该语句的用法       
IF VARLEN > 10
_ERROR_ "Variable Length is Too Long"
ENDIF
END
■ END语句为汇编器标记输入文件的结束
该语句是必须的,必须是源文件中的最后一条语句
如果缺少END语句,将生成错误
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-8-28 15:30:12 | 显示全部楼层
20230828 陈桂友教授 STC8H8K64U 串口实战


1.png







2.png


1.串口 1波特率的设定
(1)        模式。的波特率
当UART_M0x6=0时,波特率为SYSclk/12;当UART_M0x6=1 时,波特率为SYSclk/2。
(2)        模式2的波特率
串行口1作于模式2时,波特率有两种波特率可选,取决于电源控制寄存器PCON中SMOD位的 值,当SMOD=0时,为SYSclk /64;当SMOD=1 时,为SYSclk /32。
(3)        模式1和3的波特率
串行口 1工作于模式1和3时,波特率是可变的,可以通过编程改变定时器1的溢出率或者定时 器2的溢出率来确定波特率。
编程时应注意,当定时器作为波特率发生器使用时,应禁止定时器产生中断(ET1=0或ET2=0 )O典型用法是将定时器设置工作在自动重装入时间常数的定时方式。设置完成后,启动定时器( TR1=1 或TR2=1) 。



假设SYSclk为系统时钟频率。串口 1用T1作为波特率发生器,且T1工作于模式0 (16位自动重 装模式)时的公式如下:
3.png

其中,12T模式时,Tlxl2=0; IT模式时,Tlxl2=lo
RL_TH1是TH1的自动重装载寄存器,RL.TL1是TL1的自动重装载寄存器。注意:此时波特率与 SMOD无关。
T2只有一种工作方式,即16位自动重装方式,因此使用T2作为波特率发生器时的公式如下:
4.png
其中,RL.TH2是TH2的自动重装寄存器;RL_TL2是TL2的自动重装寄存器。
在实际应用中,一般选用模式1或模式3。此时,波特率的设置关键在于T1和T2的溢出率的计 算。


2.串口2~4的波特率设定
对于串口2、串口3和串口4,具体使用T2、T3或T4中的哪一个定时器作为波特率发生器前面已有详细 叙述。在此,以T2作为波特率发生器为例,波特率计算方法如下公式所示:
波特率=SYSclk/12n/( 65536 - [RL_TH2, RL_TL2])/4
串口3和串口4波特率的设定方式与串口2类似,介绍从略。
常用的串口波特率与系统时钟以及定时器工作与16位自动装载模式时的重装时间常数之间的关系见表 8-7读者在设计系统时,可以直接从表中查得所需设置的时间常数。
表8-7常用波特率与系统时钟及重装时间常数之间的关系

5.png

可以使用STCISP软件中的波特率计算器工具进行计算。
二  UART 接口的应用举例
  在编程应用中,虽然可以采用查询方式进行通信,但是,为了进行实时任务处理,一般采用 中断方式进行串行通信程序设计。




(1)串口 1的编程要点
    ①        设置串行口的工作模式
设置SCON寄存器的SMO和SM1的内容。若需要串行口具有接收功能,则置REN=1。
    ②        设置正确的波特率
(a)        使用T1作为波特率发生器时,需要设置T1的工作模式和时间常数(设定TMOD和TH1、
TL1寄存器的内容);启动T1 (置TR1=1)。
(b)        使用T2作为波特率发生器时,需要设置T2寄存器和相应的位,包括:T2自动重装寄 存器TH2和TL2, T2_C/T位,T2xl2位,SMOD位。启动T2 (置TR2=1)。
    ③        设置串行口的中断优先级(设置PS寄存器的内容,也可以不设置,取默认值),设置相应 的中断控制位(ES EA).
    ④        如要串口 1发送,将数据送入SBUF。
    ⑤        编制串行中断服务程序,在中断服务程序中要有清除中断标志指令(将TI和RI清0) .


(2)串口2的编程要点
    ①        设置串口2的工作模式
    设置S2C0N寄存器中的S2SM0位。如需要串行口2具有接收功能,则置S2REN=1。
    ②        设置串口2的波特率
     串口2只能使用T2作为波特率发生器,设置内容包括:TH2和TL2, T2_C/位,T2x12位。 启动T2 (置TR2=1) .
    ③        设置串口2的中断优先级(设置PS2,也可以不设置,取默认值),设置打开相应的中断控 制位(ES2和EA) .
    ④        如要串口2发送,将数据送入S2BUF.
    ⑤        编制串行中断服务程序,在中断服务程序中要设置清除中断标志指令(分别是接收完成标 志S2RI和发送完成标志S2TI)。


串口3和串口4的编程要点与串口2类似!

6.png 7.png


8.png


【例8-2】多机通信编程举例
现用简单实例说明多机串行通信中从机的基本工作过程。而实际应用中还需要 考虑通信的规范协议。有些协议很复杂,在此不加以考虑。假设系统晶振频率为 11. 0592MHz
主机:先向从机发送一帧地址信息,然后再向从机发送10个数据信息。
从机:接收主机发来的地址帧信息,并与本机的地址号相比较,若不符合,仍 保持SM2=1不变;若相等,则使SM2清零,准备接收后续的数据信息,直至接收完 10个数据信息。
解:主机和从机的程序流程如图8-19所示。

9.png









回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-8-29 16:14:58 | 显示全部楼层
2023/08/29 何宾教授 课程打卡

汇编语言的结尾课程
条件汇编
251汇编器支持使用多个条件汇编命令的条件程序汇编
■条件汇编可用在单个源文件中实现不同的程序版本或不同的存储 器模型
■使用条件汇编,程序开发人员可以轻松维护一个满足多个应用的源模块
■有两组不同的条件控制
■前缀为美元符号字符("$")的条件控制是控制命令。它们只能测试使用$SET 和$RESET命令定义的符号。
■前面没有美元符号的条件控制是可以测试更广泛定义符号的条件语句。但是, 它们不能刑试用$SE1^$RESET命令定义的符号。
用于条件汇编的汇编器命令
$IF              如果条件为真,则汇编块

$ELSE        如果前面的$IF的条件为假,则汇编块
$ELSEIF        如果条件为真且前面的$IF或$ELSEIF为假,则汇编块
$ENDIF        结束$IF块
$SET               设置符号(它可以由$IF或SELSEIF测试)为真或一个指定的值
$RESET        设置符号(它可以由$IF或SELSEIF测试)为假
IF               如果条件为真,则汇编模块
ELSE               如果前面IF的条件为假,则汇编块
ELSEIF        如果条件为真且前面的IF或ELSEIF为假,则汇编块
ENDIF        结束IF块
1.png 2.png




3.png 在使用条件汇编时,需要注意以下几点:
■有条件汇编的文本块必须用$IF、$ELSEIF、$ELSE和$ENDIF或 IF、ELSEF、ELSE和ENDIF括起来
■命令行上可以使用$SET和$RESET命令来定义条件命令中使用的 瞧
■最多可以嵌套十个$IF或IF块。如果块未被转换,则作为该块一 部分的嵌套条件块也将被跳过

  宏处理器使得开发者能够在汇编程序中定义和使用宏(macro)
■定义宏时,提供要与宏名字关联的文本(通常是汇编代码)。然后,要在汇编程序中包含宏文本,
则需要提供宏的名字。汇编器 使用宏定义中指定的文本替换宏名字


当程序开发人员编写汇编程序时,宏提供了几个优点:
■频繁使用宏,可以减少程序员引起的错误
■宏允许程序开发人员定义在整个程序中重复使用的指令序列。后续使用宏 每次都会真实的提供相同的结果
■宏减少了重复编程序列中引入错误的可能性。当然,在宏定义中引入错误 会导致在错误在使用宏的任何地方通过程序传播
■宏中使用的符号范围仅限于该宏
■程序开发人员不必担心使用以前使用的符号名字
■宏非常适合创建简单的代码表
■手工制作表格既枯燥又容易出错

宏的定义和调用

■通常,可以将宏认为是子程序调用,但子程序中的代码包含在宏 调用点的一行中,
■但是,宏不应用于替换子程序
■每次调用子程序只需要调用子程序所需的代码。对于宏的每次调 用都包括与汇编程序中的宏内联的汇编代码
■如果频繁使用较大的宏,则会导致程序代码的长度快速增加
■在静态环境中,子程序是更好的选择,因此可以显著减少程序代 码的长度。但在时间关键的动态程序中,
  宏可以加快算法或其他 经常调用的语句的执行速度,而不需要过程调用的开销的代价


在决定宏或子程序时,需要遵循以下规则:
■当某些程序频繁执行或必须将存储器的使用保持在最低限度时,子程序是最好的
■当需要最高处理器速度且消耗的存储器大小不太重要时,宏是最佳的
■宏减少了输入简短、重复的汇编代码块所需的输入量


A251宏汇编程序提供三种不同的宏语言:
■标准汇编程序宏与许多其他宏汇编程序相似。它们允许程序开发 人员定义看起来像标准汇编程序指令的宏
■宏处理语言(Macro Processing Language, MPL)宏与 Intel ASM-251汇编程序兼容。它们允许程序开发人员重新翻译 最初为该宏汇编器编写的现有源文件
■ C预处理器宏与C预处理器兼容。它们允许程序开发人员在C和汇 编程序源代码中使用相同的include文件

标准宏的语法 :

Tnacro-name MACRO <[>parameter-list<]> <[>LOCAL local-labels<]>
macro-body
ENDM
其中:
■        macro-name为宏的名字
■        parameter-list是可以传递给宏的形参的可选列表
■        local-label是宏内本地标号的可选列表
■        macro-body是展开以替换宏名称和参数列表的文本。它可能包含对其他 宏的调用。如果是,这些宏也会展开。定义宏时,在调用宏之前,宏体中 包含的宏调用不会展开


4.png


设计实例
    IO驱动和中断的处理。
5.png


  在STC32G系列单片机中,为P0口、P1 口、P2口、P3 口、P4口、P5口、P6口和P7口提供了两个端口模式寄
存器PxMO和PxM1 (x为对应的端口号),用于为一组 端口内不同的引脚设置不同的驱动方式,
包括准双向、 推挽输出、高阻输入和开漏输出


  在该设计中,使用了用于控制STC32G12K128单片机P4 口和P6 口的端口模式寄存器以及数据寄存器

6.png

可以使用STCISP中的IO口设置工具来直观的对IO口模式进行配置计算,并得到相应的IO寄存器配置代码。超级方便!

STC32是32位MCU,但是为什么IO要设计成8位的呢?
因为要与传统单片机进行兼容

7.png

P4端口的模式设置与P6类同。
8.png


设计实例一:LED驱动和控制
本节将建立新的设计工程,主要步骤包括:
■打开Keil nVision5集成开发环境(以下简称Keil)
■在Keil主界面主菜单下,选择Project-> New uVision Project...
■弹出Create New Project对话框界面。在该对话框界面中,按 如下设置参数:
■将路径定位到\stc32_example\example_7 9
■在文件名右侧的文本框中输入top,该工程的名字为top.uvproj
■单击OK按钮

9.png


10.png

11.png


12.png


13.png



























































































回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-8-30 16:53:27 | 显示全部楼层
2023/08/30 陈教授课程打卡 单片机原理、接口技术应用

一 STC8H8K64U单片机SPI接口结构
1. SPT接口简介
STC8H8K64U集成了串行外设接口 (Serial Peripheral Interface,简 称SPI). SPI接口既可以和其他微处理器通信,也可以与具有SPI兼容接口 的器件,如存储器、A/D转换器、D/A转换器、LED或LCD驱动器等进行同步 通信(例如,液晶模块12864)。
SPI接口有两种操作模式:主模式和从模式。在主模式中支持高达 3Mbit/s的速率;从模式时速度无法太快,速度在fosc/8以内较好。此外, SPI接口还具有传输完成标志和写冲突标志保护功能。
1.png



二STC8H8K64U单片机SPI接口的数据通信



1. SPI接口的信号
SPI接口由MISO、MOS1、SCLK和弱4根信号线构成。
MOST (Master Out Slave In,主出从入):主器件的输出和从器件的输入 ,用于主器件到从器件的串行数据传输。多个从机共享一根MOST信号线。在时钟 边界的前半周期,主机将数据放在MOSI信号线上,从机在该边界处获取该数据。
MISO (Master In Slave Out,主入从出):从器件的输出和主器件的输入 。用于实现从器件到主器件的数据传输。一个主机可连接多个从机,主机的MISO 信号线会连接到多个从机上,或者说,多个从机共享一根MTSO信号线。当主机与 一个从机通信时,其他从机应将其MISO引脚驱动置为高阻状态。



  SCLK (SPI Clock,串行时钟信号):串行时钟信号是主器件的输出和从器 件的输入,用于同步主器件和从器件之间在MOSI和MISO线上的串行数据传输。 当主器件启动一次数据传输时,自动产生8个SCLK时钟周期信号给从机。在 SCLK的每个跳变处(上升沿或下降沿)移出一位数据。
  SCLK、MOSI和MISO通常用于将两个或更多个SPI器件连接在一起。如果 SP1接口被禁止,即特殊功能寄存器SPCTL中的SPEN=0 (复位值),这些引脚都 可作为I/O 口使用。
  SS (Slave Select,从机选择信号,低电平有效):这是一个输入信号。主器件用它来选 择处于从模式的SPI模块。



关于SS信号
主模式和从模式下,部的使用方法不同。
在主模式下,SPI接曰只能有一个主机,不存在主机选择问题。在该模式 下SS不是必须的。主模式下通常将主机的胡引脚通过10k。的电阻上拉高电 平。每一个从机的胡接主机的I/O口,由主机控制电平高低,以便主机选择 从机。

  在从模式下,不论发送还是接收,耳信号必须有效。因此在一次数据传 输开始之前必须将SS拉为低电平。SPI主机可以使用I/O口选择一个SPI器件 作为当前的从机。

2. SPT接口的数据通信方式
STC8H8K64U单片机的SPI接口的数据通信方式有3种:单主机-单从机方式、双器件方式(器件可互 为主机和从机)和单主机-多从机方式。
(1)单主机-单从机方式
两个设备相连,其中一个设备固定作为主机,另外一个固定作为从机。
主机设置:SSIG设置为1, MSTR设置为1,固定为主机模式。主机可以使用任意端口连接从机的还 引脚,拉低从机的胡脚即可使能从机。
从机设置:SSIG设置为0, SS引脚作为从机的片选信号。
单主机单从机方式的连接如下图所示。

2.png


(2)双器件方式
  在双器件方式中,两个设备相连,主机和从机不固定。有两种设置方法,分别是:
设置方法1:两个设备初始化时都设置为SSIG设置为0, MSTR设置为1,且将SS脚设置为双向口模 式输出高电平。此时两个设备都是不忽略SS的主机模式。当其中一个设备需要启动传输时,可将自己的 SS脚设置为输出模式并输出低电平,拉低对方的SS脚,这样另一个设备就被强行设置为从机模式了。
设置方法2:两个设备初始化时都将自己设置成忽略SS的从机模式,即将SSIG设置为1, MSTR设置 为0。当其中一个设备需要启动传输时,先检测SS脚的电平,如果时候高电平,就将自己设置成忽略SS 的主模式,即可进行数据传输了。
双器件方式也称为互为主从方式,其连接方式如下图所示。


3.png


(3)单主机-多从机方式
在这种方式中,多个设备相连,其中一个设备固定作为主机,其他设备固定作为从机。
主机的设置:SSTG设置为1, MSTR设置为1,固定为主机模式。主机可以使用任意端口分别连接 各个从机的SS脚,拉低其中一个从机的SS脚即可使能相应的从机设备。
从机的设置:SS1G设置为0, SS管脚作为从机的片选信号。
单主机-多从机方式的连接如下图所示。

4.png


3. SPI接口的数据通信过程
  在SPI通信中,数据传输总是由主机启动的。如果SPI使能(SPEN=1)并选择 作为主机时,主机X'jSPI数据寄存器SPDAT的写操作将招动SPI时钟发生器和数据 的传输。在数据写入SPDAT之后的半个到一个SPI位时间后,数据将出现在MOSI 引脚。写入主机SPDAT寄存器的数据从MOSI脚移出发送到从机的MOSI脚。同时' 从机SPDAT寄存器的数据从MISO脚移出发送到主机的MISO脚。
  传输完一个字节后,SPI时钟发生器停止,传输完成标志(SPIF)置位,如 果SPI中断使能则会产生一个SPI中断。主机和从机CPU的两个移位寄存器可以看 作是一个16位循环移位寄存器。当数据从主机移位传送到从机的同时,数据也以相 反的方向移入。这意味着在一个移位周期中,主机和从机的数据相互交换。


4.        SPI中断
如果允许SPI中断,发生SPI中断时,CPU就会跳转到中断服务程序的入门地址 004BH处执行中断服务程序。注意,在中断服务程序中,必须把SPI中断请求标志清零。
5.        写冲突
SPI在发送时为单缓冲,在接收时为双缓冲。这样在前一次发送尚未完成之前,不能 将新的数据写入移位寄存器。当发送过程中对数据寄存器进行写操作时,WCOL位将置位 以指示数据冲突。在这种情况下,当前发送的数据继续发送,而新写入的数据将丢失。
接收数据时,接收到的数据传送到一个并行读数据缓冲区,这样将释放移位寄存器以 进行下一个数据的接收。但必须在下个字符完全移入之前从数据寄存器中读出接收到的数 据,否则,前-个接收数据将丢失。
WCOL可通过软件向其写入“1”清零。


6.数据格式
SP1接口的时钟信号线SCLK有Idle利Active两种状态:Idle状态是指在不进行数据传 输的时候(或数据传输完成后)SCLK所处的状态;Active是与Idle相对的一种状态。
时钟相位位(CPHA)允许用户设置采样和改变数据的时钟边沿。时钟极性位CPOL允 许用户设置时钟极性。
如果CPOL=O, Idle状态=低电平,Active状态=高电平。
如果CPOL=1, Idle状态=高电平,Active状态=低电平。
主机总是在SCLK=Idle状态时,将下一位要发送的数据置于数据线MOSI上。
从Idle状态到Active状态的转变,称为SCLK前沿。
从Active状态到Tdle状态的转变,称为SCLK后沿。
对SCLK前沿和后沿构成个SCLK时'钟周期,个SCLK时'钟周期传输-位数据。
不同的CPHA,主机和从机对应的数据格式如图1〜图4所示。

5.png

6.png


7.png

8.png


1、        STC8H8K64U单片机SPI接口的寄存器
9.png

10.png


1)        位7: SSIG,SS引脚忽略控制位。
0:由SS脚用于确定器件为主机还是从机。
1:忽略SS脚功能,由MSTR位确定器件为主机还是从机,尽脚可作为IO口使用。
2)        位6: SPEN, SPI使能位。0: SPI被禁止,所有SPI引脚都作为I/0口使用;1: SPI使能。
3)        位5: DORD, SPI数据位发送/接收的顺序控制位。
0:数据字的最高位(MSB)最先传送;1:数据字的最低位(LSB)最先传送。
4)        位4: MSTR, SPI主/从模式选择位。
11.png


5)        位3: CPOL, SPI时钟极性选择位。
0: SPT空闲时SCK^oTtei平),SCK的前时钟沿为上升沿而后沿为下降沿;
1: SPI空闲时SCK=1 (高电平),SCK的前时钟沿为下降沿而后沿为上升沿。
6)        位2: CP11A, SP1时钟相位选择控制位。
0:数据SS管脚为低电平骤动第一位数据并在SCLK的后时钟沿改变数据,询时钟 沿采样数据(必须SSIG=O):
1:数据在SCLK的前时钟沿胆动,后时钟沿采样。
7)        位1: SPR1,与SPRO联合构成SP1时钟速率选择控制位。
8)        位0: SPRO,与SPR1联合构成SPI时钟速率选择控制位。SPI时钟选择见表。

12.png

13.png



2、        STC8H8K64U单片机SPI接口的应用举例

SPI接口的使用包括SPI接口的初始化和SPI中断服务程序的编写。
SPI接口的初始化包括以下几个方面:
①        设置与SPI接口有关的I/O口线工作模式。
②        通过SPI控制寄存器SPCTL设置:SS引脚的控制、SPI使能、数据传送的位顺序、设 置为主机或从机、SPI时钟极性、SPI时钟相位、SPN寸钟选择。具体内容请参见SPI控制 寄存器SPCTL介绍。
③        清零寄存器SPSTAT中的标志位SPIF和WCOL (向这两个标志位写1即可清零)。
④        开放SPI中断(IE2中的ESPT=1, IE2寄存器不能位寻址)。
⑤        开放总中断(IE中的EA=1).
SPI中断服务程序根据实际需耍进行编写。唯一需要注意的是,在中断服务程序中需 要将标志位SPIF和WCOL清零。因为SPI中断标志不会自动清除。


14.png


接口方式和时序
为了便于和多种微处理器、单片机连接,模块提供了8位并行、2线串行、3线串 行三种接门方式。
(1)        并行接口方式
当模块标PSB引脚接高电平时,模块即进入并行接口模式(<1MBPS),单片机与液晶模块通 过RS、RW、E、DB0-DB7来完成指令/数据的传送。
(2)        串行接口方式
当模块的PSB引脚接低电平时,模块即进入串行接口模式。串行模式使用串行数 据线STD和串行时钟线SCLK来传送数据,即构成2线串行模式。
串行接口方式的时序图如图8-36所示。液晶使用的指令集请参阅相关手册。

15.png

16.png



(end)









































































































































回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-9-1 16:37:48 | 显示全部楼层
2023/09/01何教授 之C语言程序设计
主要内容
■存储器区域
■数据类型
■类型限定符
■存储类别
■绝对位置变量
■指针
■函数
■属性
■预处理器
■内嵌汇编程序
■定制文件
■存储器区域


STC32G系列单片机兼容MCS-251 ISA,因此支持用于 程序和数据的多个物理分离的存储区域或存储器空间 ■每个存储区域都有一定的优点和缺点
■这些存储空间可能是读取但不写入、读取或写入、比其他存储空间更快地 读取或写入
■ STC32G系列单片机上可用的各种存储空间与大多数大型计算机、小型寄存器和微型计算机架构有很大的不同
■在这些架构中,程度、数据和常数都加裁到计算机内的同一物理存储空间



程序(CODE)存储器为只读。在STC32G系列单片机中 程序存储器位于单片机的内部
■该单片机支持高达64KB的程序存储器。然而,可以使用代码库 来扩展程序空间
■ 一些单片机提供了更大的代码空间
■程序代码,包含所有函数和库例程,保存在程序存储器中
■常数变量也可以保存在程序存储器中
STC32G系列仅执行保存在程序存储器中的程序
■通过使用存储器类型标识符code, C语言程序可以访问程序存



■声明code对象的用法如下:
   unsigned char code code constant;
注:存储器类型code是为了与C51编译器兼容而实现的。应该使用const near 或const far代替代码。这通常会生成更好的代码,应该在新的STC32G系列单 片机中使用,而不是存储器类型code


内部数据存储器位于STC32G系列单片机的内部,并且是读/写的
■ data和idata存储区域位于STC32G系列单片机内,并且可以写入和读取
■ data存储器是片上存储器的前128字节。idata存储器是片上存储器的前 256个字节。还有一个从20h开始的16字节区域,可用短8051兼容指令 进句立寻址
■声明idata变量的方法如下:
   unsigned char idata variable;
■对内部数据存储器的访问非常快,因为它可以使用8位地址访问


内部数据存储器可以分为三种不同的数据类型,包括
■        data   
■        bdata    (bit data ,20h-2fh,20-7fh
■        ebdata



存储器说明符data是指内部数据存储器的前128个字节
■此处保存的变量使用直接寻址进行访问
■声明data变量,如下所示:
    unsigned char data fast variable ;



存储器说明符bdata指定的内部数据区(20h~2Fh) 的16字节可位寻址的存储器
■该存储器类型说明符允许程序开发人员声明也可以在位级别的数据类型
■声明bdata变量,如下所示:
   unsigned char bdata bdata_var;



存储器说明符ebdata是指内部数据区(20h~7Fh)中的扩展251 isa的位可寻址存储器
■该存储器类型说明符允许程序开发人员声明也可以在位级别访问 的数据类型
■然而,与bdata存储区域相比,对ebdata存储器的位访问需要更长的操 作码编码
■声明edata变量,如下所示:
    unsigned int ebdata eb_var;


【例8-1】存储器说明符ebdata的用法
struct s {                //定义结构体s
unsigned int b0:3;        //整型变量b0,分配3个二进制位
unsigned int b1:2;        //整型变量b1,分配2个二进制位
unsigned int b2:1;        //整型变量b2,分配1个二进制位
unsigned int b3:1;        //整型变量b3,分配1个二进制位
unsigned int b4:1;        //整型变量b4,分配1个二进制位
unsigned int b5:1;        //整型变量b5,分配1个二进制位
unsigned int b6:1;        //整型变量b6,分配1个二进制位
unsigned int b7:4;        //整型变量b7,分配4个二进制位

};


struct s ebdata v;        //声明结构体变量v,且保存在ebdata区域
void main (void) {        // 声明主程序main
v.b0=4;        //结构变量v的元素b0赋值为4
v.b1 =3;        //结构变量v的元素b1赋值为3
v.b7=15;        〃结构变量v的元素b7赋值为15
if (v.b1) {        〃如果结构变量v的元素b1的值不为0
v.b0 = 7;        //结构变量v的元素b0赋值为7
  }
}






■由于外部数据存储器是通过数据指针寄存器(必须加裁地址)间 接访问的,因此它比访问内部数据存储器慢
    ■ STC32G系列单片机提供了片上XRAM空间,该空间使用与传统外部数据 空间相同的指令进行访问。该XRAM空间通常通过配置SFR寄存器启用, 并于外部存储器空间重叠
    ■可能有多达64KB的外部数据存储器。然而,该地址空间不一定必须用作存储器。硬件设计可能会将外设映射到存储器空间中。如果是这种情况, 开发的程序将访问外部数据存储器来编程和          控制外设。这种技术称为存储器映射的I/O (sfr for base address 80H-FFH  ,Extern io address for  PWM,USB....)
■声明xdata变量的方法如下:




近存储器(near memory )区域的地址范围为 00:0000~00:FFFF,这是STC32G系列单片机存储器的 前 64KB
■部分寄存器位于STC32G系列单片机的内部,并且可以使用16位寻址进行快速的访问
■近存储器区域在汇编语言级别由存储器类EDATA或ECONST表示,使用 直接寻址访问保存在近存储器中的变量
■声明near对象的方法如下:
  unsigned char near near_variable;

远存储器(far memory)区域表示STC32G系列单片机 的完整地址范围


■远存储器区域在汇编语言级别中使用存储器类HDATA或 HCONST表示
■使用间接寻址来访问存储器类型far定义的变量
■地址计算仅为16位,因此将远对象的数据大小限制为64KB
   ■然而,远变量可以驻留在存储器中的任何位置,这允许总大小多达16MB






■与far相反,huge使用32位运算进行地址计算,因此允许无限 的对象大小
■程序开发人员可以有一个数MB大小的单个数组或结构
■在大存储器(huge memory)中,声明的变量的大小可以达到 16MB-1





SFR存储器(寄存器集合)
STC32G系列单片机为SFR提供128字节的存储器
■ SFR是位、字节或字大小的寄存器,用于控制定时器、计数器、 串行I/O和外设
注:可以使用MOV指令直接访问SFR存储器,不能使用间接寻址模式


C251编译器提供的几种数据类型


double 在KEIL中有一个特殊的处理,才是真正定义成为了 double类型



本节只介绍标准C语言所支持数据类型中的基本类型,包 括
■        void
■        char
■        int
■        enum
■        float
■        double



数据类型void定义了没有返回值的函数,没有参数列表的 函数以及指向未定义类型对象的指针
■其用法如下:
void function-name (argument-list);
return-type function-name(void);
void *name;
■其中
■        function-name为函数的名字
■        argument-list为传给函数的参数
■        return-type为函数的返回类型
■        name为指向void对象的指针



数据类型char定义了 1个字节的二进制整数
■其格式为:
<[>(signed | unsigned}<]> char name <[>=value<]>;
■其中 ”
■        name为变量的名字
■        value为分配给变量的值
■signed或unsigned显式声明数据类型是有符号或无符号



数据类型int定义了 1个二进制整数
■其格式为:
<[>(signed | unsigned)<]> <[>{long | short}<]> int name <[>= value<]>;
■其中
■        name为变量的名字
■        value为分配给变量的值
■        signed或unsigned显式声明数据类型是有符号的还是无符号的
■        long或short声明整数是32位或16位的整数



关键字enum (枚举)定义了一组int类型的常数
■其格式如下:
      enum [tag] {name, [= value},
■其中
■        tag为enum集的名字
■        name为枚举常数的名字
■        value为分配给常数的值。如果缺少值,则假定它是集合+1中的前一个常 量的值。列表中第一个常数的默认值为0












■检查浮点运算状态的C语言代码
#include <intrins.h>        // 包含头文件intrins.h
#include <stdio.h>        // 包含头文件stdio.h
#include <reg251s.h>        //包含头文件reg251s.h
void main (void)        // 主函数main
( float f2=1.0, f3=0.0;        // 声明浮点数f2和f3
float f1;        //声明浮点数f1
SCON= 0x52;        //初始化串口寄存器SCON
TMOD = 0x20;        //初始化串口寄存器TMOD
TCON = 0x69;        //初始化串口寄存器TCON
TH1 = 0xF3;        //初始化串口寄存器TH1
f1=f2/f3;            //浮点数f2和f3相除,除数f3 为0  







勾选这个选项后,DOUBLE才是真正的DOUBLE变量 .否则就会等效为float型的变量 .















































回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-9-1 17:12:17 | 显示全部楼层
----


位可寻址对象是可以作为字或者位寻址的对象
■只有占据STC32G系列单片机内部存储器的位可寻址区域的数据 对象属于这一类别
■ C251编译器将用bdata或ebdata存储器类型声明的变量放到位 可寻址区域
■存储器类型bdata是指8051兼容位空间;ebdata指定扩展的STC32G系 列单片机的位空间
■ bdata和ebdata存储器类型都像数据存储器类型一样处理,除了变量驻 留在片上数据存储器的位可寻址部分中
注:对于bdata,该存储器区域的总大小不能超过16字节;对于ebdata,则不 能超过96字节

截图202309011639326627.jpg

截图202309011643515009.jpg


■上面的例子表示声明,而不是对ibase/ebase和bary/eary变量 的位的赋值
■例子中的符号“^”后面的表达式指定使用该声明访问的位的位置。该表 达式必须是常数值
■范围取决于声明中包含的基变量的类型。范围是:
■        0~7用于char和unsigned char;
■        0~15用于int、unsigned int、 short和unsigned short;
■        0~31 用于long和unsigned long;
注:C251编译器假设使用sbit声明访问的对象以小端字节顺序保存。这是sfr16 类型的情况。然而,像int和long这样的标准C类型以大端保存



■此外,可以为sbit类型提供外部变量声明,以访问其他模块中的 这些类型。例如:
extern bit mybitO;        // ibase的位0
extern bit mybitl 5;        // ibase的位 15
extern bit Ary07;         、// bary[O]的位7
extern bit Ary37;        // bary[3]的位7
extern bit ebdata eBitl 5;        // 外部基于ebdata的位
extern bit ebdata ebAry37;        // 外部基于ebdata的位



■涉及sbit类型的声明要求使用存储器类型bdata或ebdata声明基对象
注:基于ebdata的外部位的声明需要存储器类型ebdata。如果没有显式存储器, 则假定默认空间bdata
■唯一例外的是特殊功能位的“变种”。如果要声明基于SFR的位, 则必须省略存储器空间
■下面的例子说明了基于上述声明更改ibase和bary位的方法
Ary37 = 0;
bary[3] =' a';
mybit[5] = 1;       



除了用bdata声明的变量位于内部数据存储器的可位寻址 部分之外,bdata存储器类型的处理方式于数据存储器类 似
注:该存储器区域的总大小不能超过16字节


截图202309011651163619.jpg

截图202309011651532326.jpg


截图202309011656039144.jpg

截图202309011658365958.jpg



下面的限制适用于位变量和位声明:
■不能将位声明成指针。例如:
    bit *ptr;        //非法的
■位类型的数组无效。例如:
bit ware[5];        // 非法的
■禁止中断的函数(#pragma disable)和使用显式寄存器声明 的函数(using n)不能返回类型为bit的值
C251编译器为尝试返回位类型的此类函数生成错误消息



STC32G系列单片机位访问SFR提供了独特的存储区域
■在程序中,SFR用于控制定时器、计数器、串行I/O、端口I/O 和外设
■ SFR位于地址80H-FFH之间,可以作为位、字节和字访问



sfr类型定义了一个SFR
■其格式如下:
sfr name=address;
■其中
■        name为SFR的名字
■        address为SFR的地址
■ SFR的声明方式与其他C变量相同 sfr而不是char或i nt.唯一的区别是指定的类型是



■例如:
sfr P0 = 0x80;        // 端口。的地址为80h
sfr P1 = 0x90;        //端口 1 的地址为90h
sfr P2 = 0xA0;        // 端口2的地址为0A0h
sfr P3 = 0xB0;        // 端口3的地址为0B0h
■        P0、P1、P2和P3是SFR名字声明
■        sf凄量的名字与其他C变量声明一样定义
■        sfr声明中可以使用任何符号名字
■等号("=")后面的地址规范必须是数字常数。不允许使用带有运算符的
表达式。此常数表达式必须位于SFR地址范围(0x80~0xFF)内。
注:不能在函数中声明sfr变量,它必须在函数体之外声明



sfr16类型定义了一个16位SFR
■其格式如下:
sfr16 name=address;
其中:
■        name为16位SFR的名字
■        address为16位SFR的地址
■ STC32G系列单片机中具有16位的SFR,这些SFR是使用SFR存储器中连续的地址创建的,以指定16位的值
■其余规则同sfr的声明

截图202309011704323272.jpg




































回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:510
  • 最近打卡:2025-05-06 08:17:28

15

主题

154

回帖

424

积分

中级会员

积分
424
发表于 2023-9-4 16:19:02 | 显示全部楼层
2023/09/04 课程打卡 陈桂友教授的MCU外设之IIC及仿真

截图202309041419332526.jpg



1、I2C总线简介
I2C (Inter-Integrated Circuit)总线是由PHILIPS公司开发的串行总线 ,用于连接微控制器及其外围设备。
I2C总线产生于二十世纪80年代,最初为音频和视频设备开发,如今主 要在服务器管理中使用,其中包括单个组件状态的通信。
例如,管理员可对各个组件进行查询,以管理系统的配置或掌握组件的 功能状态,如电源和系统风扇。可随时监控内存、硬盘、网络、系统温度 等多个参数,增加了系统的安全性,方便了管理。


2、I2C总线的特点
(1)        I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上 ,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降 低了互联成本。
(2)        总线的长度可高达25ft(lft=30.48cm),并且能够以10Kbps的最大传输速率支持40个组件。
(3)        I2C总线的另一个优点是,它支持多个主器件(Multimastering),主 器件也称为主机,其中任何能够进行发送和接收的设备都可以成为主机。一个主 机能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主机。
(4)        I2C总线有3种模式:标准模式(100Kbits/s),快速模式(400Kbits/s) 和高速模式(3.4Mbits/s),寻址方式有7位和10位方式。


3、I2C的术语
I2C的一些术语列于表8-12中。

截图202309041425555106.jpg

二 I2C总线的工作原理


(1)        I2C是一种串行总线的外设接口,采用同步方式串行接收或发送信息, 两个设备在同一个时钟下工作。
(2)        I2C总线只用两根线:
串行数据SDA (Serial Data)、串行时钟SCL (Serial Clock)。
由于I2C只有一根数据线,因此其发送信息和接收信息不能同时进行。信息 的发送和接收只能分时进行。
(3)        I2C总线上的所有器件的SDA线并接在一起,所有器件的SCL线并接在 一起,且SDA线和SCL线必须通过上拉电阻连接到正电源。当总线空闲时,两条 线都是高电平。


(4) I2C总线的数据传输协议比SPI总线复杂,因为I2C总线器件没有片选控 制线,所以I2C总线数据传输的开始必须由主器件产生通信的开始条件(START 条件);通信结束时,由主器件产生通信的停止条件(STOP条件)。
当SCL为高时,使用SDA的变化标识开始条件和停止条件。
如果SDA由1变到0,则产生START条件;
如果SDA由0变到1,则产生STOP条件。
START条件和STOP条件时序如图所示。

截图202309041435269365.jpg

截图202309041438095117.jpg


(5) I2C总线上的每个器件都有唯一的地址。在信息的传输过程中,I2C总 线上并接的每个器件既是主器件(或发送器),又是从器件(或接收器),这取 决于它所要完成的功能。主器件发出的信息分为地址码和数据两部分,地址码用 来选址,即接通将要通信的从器件;数据是主器件要传输给从器件的具体信息。

一条总线上最多挂载128个器件。

具体来讲,一旦有一个主机产生了一个START条件,总线便不再空闲。主机 接着发出包含7位从机地址和1位读写标志( 截图202309041501097099.jpg )共8个数据位。
从机要接收数据, 截图202309041500589994.jpg 必须为0;如果=1,表示它将准备发送数据。对 于某些I2C设备,如存储器,有必要先向从机写一个内部地址,然后再读或写数 据字节。在这种情况下,START条件可以重新产生。


主机产生了8个SCL脉冲后,把SDA输出置高电平,并产生第9个时钟脉冲。 如果被寻址的从机作出响应,从机将把SDA线拉成低电平,这表示一个确认位( ACK) o如果被寻址的从机保持SDA线为高电平,主机就为认为从机没有确认( NACK)本次数据传输。一旦被寻址的从机产生了NACK信号而不是正常的ACK 信号,多字节数据传输过程就会被中止。

截图202309041449029372.jpg



如果主机发出带有R//W位为1的从机地址,当从机使用ACK响应时,从机就 变为一个主机发送者。然后,从机向主机提供数据,但每次在第9个时钟脉冲时 ,释放SDA线并采样由主机提供的确认位。
典型情况下,如果主机希望收到更多的数据,就会产生ACK信号;如果是最 后一个字节,则产生NACK信号以通知从机。

截图202309041453342456.jpg


三 I2C总线的操作

I2C规程运用主/从双向通信。器件发送数据到总线上,则定义为 发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作 于接收和发送状态。
总线必须由主器件(通常为微控制器)控制,主器件产生串行时 钟(SCL)控制总线的传输方向,并产生起始和停止条件。


(1)控制字节
在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为器件地址, 最后一位为读写位,当为1时为读操作,为0时为写操作。如图所示。

截图202309041456394376.jpg 截图202309041458107145.jpg


(2)写操作
写操作分为字节写和页面写两种操作,对于页面写根据芯片的一次装载的字节 不同有所不同。
1)字节写指令
•首先发送开始位来通知芯片开始进行指令传输     START
•然后传送设嚣好的器件地址字节,R/W位应置 0   CTRL BYTE
•接着是分开传送十六位地址的高低字节,再传送要写入的数据   DATA
•最后发送停止位表示本次指令结束    STOP BIT
  每次只能向芯片中的-个地址写入一个字节的数据。


截图202309041505303025.jpg


2)页面写模式
-需要发送第一个字节的地址
-然后一次性发送多个字节的写入数据后
-再发送停止位。
-写入过程中其余的地址增量自己由芯片内部完成。

截图202309041509358033.jpg



注意
无论那种写入方式,指令发送完成后,芯片内部开始写入,这时SDA会被 芯片拉高,直到写入完成后SDA才会重新变的有效,在编写用户程序时可以 在写入的时候不停发送伪指令并查询是否有ACK返回,如果有ACK返回则可 以进行下一步操作。


(3)读操作
读操作有三种基本操作:读当前地址、读任意地址和连续读取。
1)读当前地址
•这种读取模式是读取当前芯片内部的地址指针指向的数据。
•每次读写操作后,芯片会把最后一次操作过的地址作为当前的地址。
注意:在CPU接收完芯片传送的数据后不必发送低电平的ACK给芯片,直接 拉高SDA等待一个时钟后发送停止位。

截图202309041512157826.jpg



2)读任意地址
“读当前地址”是读的基本指令。读任意地址时只是在这个基本指令之前加 一个“伪操作”,这个伪操作传送一个写指令,但这个写指令在地址传送完成后就 要结束,这时芯片内部的地址指针指到这个地址上,再用读当前地址指令就可以读 出该地址的数据。



截图202309041512502038.jpg



3)连续读取
连续读取操作时只要在上面二种读取方式中芯片传送完读取数据后,CPU回 应给芯片一个低电平的ACK应答,那么芯片地址指针自动加一并传送数据,直到 CPU不回应(NACK)并停止操作。

截图202309041514036940.jpg

第二节:
1 STC8H8K64U  I2C接口的简介
截图202309041520395002.jpg

I2C接口简介
STC8H8K64U单片机内部集成了一个I2C串行总线控制器。使用SCL (时钟 线)和SDA (数据线)两线进行同步通信。通过相关特殊功能寄存器的设置,可 将SCL和SDA切换到不同的I/O口上,以方便用户将一组I2C总线当作多组进行分 时复用。
STC8H8K64U单片机的I2C总线提供了两种操作模式:主机模式(SCL为输 出口,发送同步时钟信号)和从机模式(SCL为输入口,接收同步时钟信号)。


与标准I2C协议相比较,STC8H8K64U单片机的I2C总线忽略了如下两种机 制:
■发送起始信号(START)后不进行仲裁。
■时钟信号(SCL)停留在低电平时不进行超时检测。
PC串行总线控制器工作在从机模式时,SDA管脚的下降沿信号可以唤醒进 入掉电模式的MCU。(注意:山于VC传输速度比较快,MCU唤醒后第一包数据 一般是不正确的)


2 STC8H8K64U  I2C寄存器
截图202309041535298453.jpg
截图202309041537194571.jpg


1)        ENI2C: I2C功能使能控制位
    0:禁止I2C功能
    1:允许I2C功能
2)        MSSL: I2C工作模式选择位
    0:从机模式
    1:主机模式

截图202309041538567953.jpg


3)MSSPEED[5:0]: I2C总线速度(等待时钟数)控制,
I2C总线速度=SYS FOSC / 2 / (MSSPEED *2 + 4)

截图202309041545011040.jpg


只有当I2C模块工作在主机模式时,MSSPEED参数设置的等待参数才有效。此等待参数主 要用于主机模式的以下儿个信号:
TSSTA:起始信号的建立时间(Setup Time of START)
THSTA:起始信号的保持时间(HoldTime of START)
TSSK):停止信号的建立时间(Setup Time of STOP)
THSTO:停止信号的保持时间(Hold Time of STOP)
THCKL:时钟信号的低电平保持时间(Hold Time of SCL Low)
THCKH:时钟信号的高电平保持时间(Hold Time of SCL High)
I2C总线沸度=FOSC / 2 / (MSSPEED *2 + 4)
例:当24MIIz的工作频率下需要400K的I2C总线速度时,MSSPEED=(24M / 400K / 2 - 4) / 2=13

截图202309041549534789.jpg


1)        EMSI:主机模式中断使能控制位
0:关闭主机模式的中断
1:允许主机模式的中断
2)        MSCMD[3:0J:主机命令
0000:待机,无动作。
0001:起始命令。发送START信号。如果当前I2C控制器处于空闲状态,即MSBUSY ( I2CMSST.7)为0时,写此命令会使控制器进入忙状态,硬件自动将MSBUSY状态位置1, 并开始发送START信号;若当前12C控制器处于忙状态,写此命令可触发发送START信号 o发送START信号的波形如下图所示:

截图202309041550362666.jpg


(2) I2C主机控制寄存器(I2CMSCR)
0010:发送数据命令。
写此命令后,I2C总线控制器会在SCL管脚上产生8个时钟,并将I2CTXD寄存器里面数据按位送到SDA管脚上(先发送高位数据)。发送数据的波形如下 图

截图202309041551134506.jpg


0100:接收数据命令。
写此命令后,I2C总线控制器会在SCL管脚上产生8个时钟,并将从SDA端口上读取的 数据依次左移到I2CRXD寄存器(先接收高位数据)。接收数据的波形如下图所示:

截图202309041553143832.jpg


命令。
写此命令后,I2C总线控制器会在SCL管脚上产生1个时钟,并将MSACKO ( I2CMSST.0)中的数据发送到SDA端门。发送ACK的波形如下图所示:



截图202309041553394535.jpg

截图202309041554033556.jpg


0111:保留。
1000:保留。
1001:起始命令+发送数据命令+接收ACK命令。
此命令为命令0001、命令0010、命令0011三个命令的组合,下此命令后控制器会依次执 行这三个命令。



1010:发送数据命令+接收ACK命令。
此命令为命令0010、命令0011两个命令的组合,下此命令后控制器会依次执行这两个 命令。
1011:接收数据命令+发送ACK(0)命令。
此命令为命令0100、命令0101两个命令的组合,下此命令后控制器会依次执行这两个 命令。注意:此命令所返回的应答信号固定为ACK (0),不受MSACKO位的影响。
1100:接收数据命令+发送NAK(1)命令。
此命令为命令0100、命令0101两个命令的组合,下此命令后控制器会依次执行这两个 命令。注意:此命令所返回的应答信号固定为NAK (1),不受MSACKO位的影响。

截图202309041555364892.jpg

WDTA:主机模式时I2C数据自动发送允许位


    0:禁止自动发送
   1:使能自动发送
若自动发送功能被使能,当MCU执行完成对I2CTXD数据寄存器的写操作后,I2C控 制器会自动触发“1010”命令,即自动发送数据并接收ACK信号。

截图202309041556422520.jpg


MSBUSY:主机模式时I2C控制器状态位(只读位)
0:控制器处于空闲状态        1:控制器处于忙碌状态
当I2C控制器处于主机模式时,在空闲状态下,发送完成START信号后,控制器便进入到 忙碌状态,忙碌状态会一直维持到成功发送完成STOP信号,之后状态会再次恢复到空闲状态。 MSIF:主机模式的中断请求位(中断标志位)。
当处于主机模式的I2C控制器执行完成寄存器I2CMSCR中MSCMD命令后产生中断信号, 硬件自动将此位1,向CPU发请求中断,响应中断后MSIF位必须用软件清零。
MSACKI:主机模式时,发送“0011”命令到I2CMSCR的MSCMD位后所接收到的ACK数据。
(只读位)
MSACKO:主机模式时,准备将要发送出去的ACK信号。当发送“0101”命令到I2CMSCR的MSCMD位后,控制器会自动读取此位的数据当作ACK发送到SDA。

截图202309041558373440.jpg


ESTAI:从机模式时接收到START信号中断允许位
0:禁止从机模式时接收到START信号时发生中断
1 :使能从机模式时接收到START信号时发生中断


ERXI:从机模式时接收到1字节数据后中断允许位
0:禁止从机模式时接收到数据后发生中断
1:使能从机模式时接收到1字节数据后发生中断
ETXT:从机模式时发送完成1字节数据后中断允许位
0;禁止从机模式时发送完成数据后发生中断
1:使能从机模式时发送完成1字节数据后发生中断 ESTO1:从机模式时接收到STOP信号中断允许位
0:禁止从机模式时接收到STOP信号时发生中断
1:使能从机模式时接收到STOP信号时发生中断

截图202309041559391280.jpg


RXIF:从机模式时接收到1字节的数据后的中断请求位。
从机模式的I2C控制器接收到1字节的数据后,在第8个时钟的下降沿时硬件会自动将此位置 1,并向CPU发请求中断,响应中断后RXIF位必须用软件清零。RXIF被置1的时间点如下图所 示:

截图202309041600047886.jpg

截图202309041600231916.jpg

截图202309041600546975.jpg


截图202309041601148557.jpg

截图202309041601284432.jpg

截图202309041602466631.jpg

截图202309041603152548.jpg


I2CTXD是I2C发送数据寄存器,存放将要发送的I2C数据
I2CRXD是I2C接收数据寄存器,存放接收完成的I2C数据


I2C接口的使用包括I2C接口的初始化和I2C中断服务程序的编写。
主机模式的I2C接口的初始化包括以下几个方面:
①        设置与I2C接口有关的I/O 口线工作模式。
②        选择I2C引脚,使能I2C主机模式并设置速度(I2CCFG)。
③        清0相关标志位(I2CMSST)。
④        如果需要,开放I2C中断(I2CMSCR中的EMSI=1) 。
⑤        开放总中断(IE中的EA=1)。
I2C中断服务程序根据实际需要进行编写。唯一需要注意的是,在中断服务程序中需 要将标志位MSIF清零。


3 STC8H8K64U  I2C应用
STC的代码。见STC8H8K64U-DEMO-CODE-V9.6

























































截图202309041501215191.jpg
截图202309041555479414.jpg
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-6 19:04 , Processed in 0.832363 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表