找回密码
 立即注册
楼主: cuis***

陈桂友教授《STC8051单片机原理及应用-STC8H8K64U》学习记录 | 已建议送实验箱

[复制链接]
  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 2023-8-8 20:43:59 | 显示全部楼层
    本帖最后由 cuisheng 于 2023-8-8 20:45 编辑

    第7集视频学习:



    1、助记符语言描述

        MOV 是数据的传送
        ADD 是数据的相加运算
        ANL 是数据的逻辑与运算

        #8BH,前面带井号,说明是立即数

    2、操作码

        (1)数据传送类
                MOV、MOVX、MOVC
                必须指明操作对象从哪来,到哪去。(源地址、目的地址)


        (2)数据操作类
                ADD、SUBB、MUL、DIV
                一般靠运算器完成,一般需要两个操作对象


        (3)程序控制类
                AJMP(SJMP、LJMP)
                JZ、JC、JB(JNZ、JNC、JNB)
                ACALL(LCALL)
                RET

                CJNE

                操作对象是程序计数器PC和一个数


        (4)逻辑操作类
                ANL、ORL、XRL


    3、操作数

        可以是数据,也可以是地址

    注意:
        a、数据只能是整数,不能是小数;
        b、数据是十六进制且是以字母开头时,该数据应该加一个前导0;
        c、数据前有前缀#,则表示数据是立即数,如果没有前缀#,则数据为直接地址

    二、指令格式及分类

        [标号: ] 操作码助记符 [第一操作数][, 第二操作数][, 第三操作数] [; 注释]

        标号,也用过子程序的名字。
        操作数,可能有0~3个操作数。

        指令的存储格式:
            指令长度:单字节、双字节、三字节


        指令中的符号约定:
            A:累加器ACC
            B:寄存器B
            C:进位借位标志
            addr8:8位内部RAM地址

            bit:位地址,内部RAM中的可寻址位和SFR中的可寻址位
            #data8:8位立即数

            #data16:16位立即数

            @:间接寻址

            rel:8位带符号偏移量

            Rn:当前工作区(0~3区)的工作寄存器,(n=0,1,...,7)

            Ri:可用作地址寄存器的工作寄存器R0和R1

            (X):X寄存器的内容

            ((X)):由X寄存器寻址的存储器单元内容,即X中存放的值作为地址,相当于指针的功能

            ->:数据传送方向

            /:按位取反

            

    三、寻址方式(7种)

        1、立即寻址
            指令中的源操作数是立即数。

        2、寄存器寻址
            指定寄存器的内容为操作数,对寄存器ACC、B、DPTR和CY寻址时,具体的寄存器已隐含在其操作码中。
            而对选定的8个工作寄存器R7~R0,则用指令操作码的低3位指明所用的寄存器。

        3、直接寻址
            指令中包含了操作数的地址。
            a、特殊功能寄存器SFR;
            b、内部数据RAM中的00H~7FH(128个字节单元);
            c、位寻址空间。

        4、寄存器间接寻址
            指定某一个寄存器的内容作为操作数地址,使用时,前面加“@”表示间接寻址。

        5、变址寻址
            由偏移量寄存器和基址寄存器DPTR或PC相加所得结果作为操作数地址。
            例:MOVEC A, @A + PC

        6、相对寻址
            主要用于相对跳转指令。
            注:该偏移量有正负号,所转移的范围为相对于当前PC值的 -128~+127 之间。

        7、位寻址
            对位地址空间的每一位进行运算和传送。

    备注:
        00H~1FH:工作寄存器区(32个单元,分为4组,每组R0~R7)
        20H~2FH:可位寻址区(00H~FFH,256个位)

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 2023-8-9 19:17:13 | 显示全部楼层
    本帖最后由 cuisheng 于 2023-8-11 22:51 编辑

    第8集视频学习

    一、数据传送类指令
        对程序状态字PSW一般不产生影响
        分为三种:
            数据传送
            数据交换
            栈操作

    1、传送指令:MOV
        主要是内部数据存储器和特殊功能寄存器
        MOV <目的字节>, <源字节>

        MOV    A, #data8            ; (A) <- #data8
        MOV    addr8, #data8      ; (addr8) <- #data8
        MOV    @Ri, #data8         ; ((Ri)) <- #data8

        MOV    Rn, #data8           ; (Rn) <- #data8

        @符号表示间接寻址,Ri中 i=0或 i=1

    汇编语言测试模板:

    1. $NOMOD51
    2. $include (stc8h.h)
    3.     ORG        0000H
    4.     LJMP       MAIN        ;跳转到主程序
    5.     ORG        0100H
    6. MAIN
    7.     MOV        SP, #70H
    8. LOOP:
    9.     LJMP       LOOP
    10.     END
    复制代码

    观察内部RAM的内容,Address:D:0
    查看IO口的内容:Menu: Peripherals -> I/O-Ports -> Port X

    * Rn、内部RAM、SFR与累加器A传送数据。共6条:
    MOV    A, addr8        ;(A) <- (addr8)
    MOV    A, @Ri           ;(A) <- ( (Ri) )
    MOV    A, Rn             ;(A) <- (Rn)
    MOV    addr8, A        ;(addr8) <- (A)
    MOV    @Ri, A          ;( (Ri) ) <- (A)

    MOV    Rn, A            ;(Rn) <- (A)


    手工修改Memory内容,鼠标右键,单击Modify Memory at D:0xXX

    MOV    R1, #82H
    MOV    A, @R1
    内部80H~FFH的RAM单元,只能使用如上方式的间接寻址方式

    * Rn、SFR和内部RAM之间的数据传送,共5条:
    MOV    addr8, addr8        ;(addr8目) <- (addr8源)
    MOV    addr8, @Ri          ;(addr8) <- ( (Ri) )

    MOV    addr8, Rn            ;(addr8) <- (Rn)

    MOV    @Ri, addr8          ;( (Ri) ) <- (addr8)

    MOV    Rn, addr8            ;(Rn) <- (addr8)


    * 目标地址传送
    MOV    DPTR, #data16

    * 外部数据存储器(或扩展并行I/O口)与累加器A传送  MOVX
        只能使用寄存器间接寻址,有两种方式:
        1、用R1或R0进行寄存器间接寻址
            需要使用P2口输出高8位地址,先给P2和Ri赋值,然后执行MOVX
            MOVX    A, @Ri        ;(A) <- ( (P2 Ri) )
            MOVX    @Ri, A        ;( (P2 Ri) ) <- (A)
        2、用16位的数据存储器地址指针DPTR进行寄存器间接寻址
            能遍历64KB的外部存储器的任何单元
            MOVX    A, @DPTR
            MOVX    @DPTR, A

    Keil仿真,查看外部存储单元数据:X:0100H

    * 程序存储器向累加器A传送指令  MOVC
    MOVC    A, @A + PC            ;PC <- (PC) + 1, (A) <- ( (A) + (PC) )
    MOVC    A, @A + DPTR        ;(A) <- ( (A) + (DPTR) )
    (变址寻址,PC或DPTR作为基址寄存器)

    注:保护DPTR的内容:
            PUSH    DPH
            PUSH    DPL        ;保护DPTR
            ......
            POP      DPL
            POP      DPH        ;恢复DPTR

            调用子程序:    LCALL    子程序名

    * 数据交换指令
        1、字节交换指令
             XCH    A, addr8        ;(A) <--> (addr8)
             XCH    A, @Ri          ;(A) <--> ( (Ri) )

             XCH    A, Rn            ;(A) <--> (Rn)


        2、半字节交换指令(低半字节交换)
             XCHD    A, @Ri        ;(A低三位字节) <--> ( (Ri)低三位字节 )

    * 栈操作指令
        概念:断点地址、压栈(保护现场)、出栈(恢复现场)
        PUSH    addr8        ;(SP) <- (SP) + 1, ( (SP) ) <- (addr8)
        POP      addr8        ;(addr8) <- ( (SP) ), (SP) <- (SP) - 1

    数据传送类指令注意事项:
    1、向累加器传送数据时,会影响PSW中的P标志
    2、执行传送指令时,源地址中的内容不变
    3、特殊功能寄存器SFR只能使用直接寻址
    4、80H~FFH单元只能使用@Ri间接寻址方式
    5、累加器A压栈和出栈时,应使用 PUSH ACC 或者 POP ACC。(* 使用A表示寄存器寻址,使用ACC表示直接寻址)

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 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
        JNC  rel        ;若(CY) == 0, 则(PC) <- (PC) + rel

        判断直接寻址位
        JB    bit, rel
        JNB  bit, rel
        JBC  bit, 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         ;空操作
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 2023-8-13 12:03:53 | 显示全部楼层
    本帖最后由 cuisheng 于 2023-8-13 12:04 编辑

    第10集学习笔记:


    汇编语言程序的框架

    1. $NOMOD51
    2. $INCLUDE (STC8H.H)
    3. ;...这里可以编写程序中用到的一些符号定义(使用EQU、DATA、BIT等伪指令)
    4.               ORG     0000H
    5. START:    LJMP    MAIN            ;跳转到主程序
    6.               ORG     0003H
    7.               LJMP    INT0_ISR      ;外部中断0入口(ISR Interrupt Service Rowtine 中断服务程序)
    8.               ORG     000BH
    9.               LMP     T0_ISR          ;定时器0中断入口
    10.               ORG     0013H
    11.               LJMP    INT1_ISR      ;外部中断1入口
    12.               ORG     001BH
    13.               LMP     T1_ISR          ;定时器1中断入口</div>
    14.               ORG     0023H
    15.               LJMP    UART1_ISR    ;串口1中断入口</div>
    16.               ......
    17.               ORG     0200H
    18. MAIN:     MOV     SP, #80H        ;设置堆栈指针(可根据情况修改)
    19.               ...... ;初始化内存区域内容
    20.               ...... ;设置有关特殊功能寄存器(SFR)的控制字
    21.               ...... ;根据需要开放相应的中断控制
    22. MAINLOOP:
    23.               ;主程序循环
    24.               LJMP    MAINLOOP
    25. INT0_ISR:                      ;外部中断0服务子程序
    26.               ......                 ;根据需要填入适当的内容
    27.               RETI
    28.               ......                 ;编写其他子程序或者定义程序中所用的常数
    29.               END
    复制代码


    注:没有用到的中断服务程序,使用复位程序,提高可靠性


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 2023-8-16 00:00:23 | 显示全部楼层
    本帖最后由 cuisheng 于 2023-8-16 22:44 编辑

    第11集学习记录

    一、C51对ANSI C的扩展

        C51有以下19个扩展关键字:
        _at_sbitsfrbit、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[10] = {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[300][2];

        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
        {
        }


    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 2023-8-17 22:37:12 | 显示全部楼层
    第12集学习记录

    两个小示例:流水灯、读写EEPROM
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 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); )
    (查询次序号 <--> 中断号)

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 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、为了保证保护现场和恢复现场能够连续进行,在保护现场和恢复现场之前,应该先关闭中断,结束后,再根据情况开中断
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 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

    还有各个定时器的重装载寄存器、时钟预分频器。
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-25 11:42
  • 签到天数: 31 天

    [LV.5]常住居民I

    4

    主题

    27

    回帖

    298

    积分

    中级会员

    积分
    298
     楼主| 发表于 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开放中断。


    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-20 17:32 , Processed in 0.074779 second(s), 64 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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