打印
[PIC®/AVR®/dsPIC®产品]

PIC16系列架构与工作原理

[复制链接]
697|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2025-1-22 10:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1. PIC16系列的基本架构
PIC16 系列单片机采用哈佛架构(Harvard Architecture),这种架构的特点是程序存储器和数据存储器是分开的。这种分离使得指令和数据可以并行处理,从而提高了处理器的执行效率。

1.1 哈佛架构
在哈佛架构中,程序存储器和数据存储器是两个独立的地址空间,每个空间都有自己的读写通道。这种架构允许 CPU 在一个时钟周期内同时读取指令和数据,从而提高了指令的执行速度。

1.1.1 程序存储器
程序存储器(Program Memory)用于存储指令代码。PIC16 系列通常使用闪存(Flash)作为程序存储器,这使得程序可以在需要时进行更新。闪存的大小因不同型号的 PIC16 单片机而异,常见的大小有 2K、4K、8K 等字节。

1.1.2 数据存储器
数据存储器(Data Memory)用于存储变量和数据。PIC16 系列使用的数据存储器通常是 SRAM(静态随机存取存储器)。数据存储器的大小也因不同型号而异,常见的大小有 256 字节、512 字节等。

1.2 CPU架构
PIC16 系列的 CPU 采用 RISC(精简指令集计算机)架构,这使得其指令集简单且高效。RISC 架构的主要特点是:

指令集精简:PIC16 系列的指令集包含约 35 条指令,每条指令的长度固定为 14 位。

单周期指令执行:大多数指令在一个时钟周期内执行完成,这提高了处理器的执行速度。

寄存器堆:CPU 内部包含一组寄存器,用于临时存储数据和中间结果。

1.2.1 寄存器堆
寄存器堆(Register File)是 PIC16 系列 CPU 的核心部分,它包含多个寄存器,每个寄存器用于存储 8 位数据。寄存器堆的大小因不同型号而异,常见的有 32 个寄存器。

工作寄存器(Working Register, WREG):用于存储算术和逻辑运算的中间结果。

文件选择寄存器(File Select Register, FSR):用于间接寻址数据存储器。

状态寄存器(Status Register, STATUS):包含 CPU 的状态信息,如零标志、进位标志等。

1.3 时钟系统
PIC16 系列单片机的时钟系统是其正常工作的基础。时钟源可以是内部振荡器或外部振荡器,不同的时钟源会影响单片机的运行速度和功耗。

1.3.1 内部振荡器
内部振荡器(Internal Oscillator)是 PIC16 系列单片机的默认时钟源。它通常提供较低的频率(如 4 MHz),适用于低功耗应用。

1.3.2 外部振荡器
外部振荡器(External Oscillator)可以提供更高的频率,适用于需要高速处理的应用。常见的外部振荡器包括石英晶体振荡器和陶瓷振荡器。

1.4 存储器映射
PIC16 系列单片机的存储器分为多个区域,每个区域有不同的功能和访问方式。

1.4.1 程序存储器映射
程序存储器(Program Memory)映射为一个线性的地址空间,每个地址存储一条 14 位的指令。程序存储器的地址范围因不同型号而异,常见的范围是 0x0000 到 0x0FFF。

1.4.2 数据存储器映射
数据存储器(Data Memory)分为多个区域,包括通用寄存器区、特殊功能寄存器区和间接寻址区。

通用寄存器区(General Purpose Registers, GPR):用于存储用户数据和变量。

特殊功能寄存器区(Special Function Registers, SFR):用于配置和控制单片机的各种功能,如定时器、中断控制器等。

间接寻址区(Indirect Addressing Area):通过 FSR 寄存器进行访问,用于动态数据存储。

1.5 指令集
PIC16 系列的指令集设计简洁高效,每条指令的长度固定为 14 位。这些指令涵盖了基本的算术、逻辑、控制和 I/O 操作。

1.5.1 基本指令
MOVF:将文件寄存器的内容复制到 WREG 或另一个文件寄存器。

CLRF:清除文件寄存器的内容。

BSF:设置文件寄存器的某一位。

BCF:清除文件寄存器的某一位。


; 将文件寄存器 0x0A 的内容复制到 WREG

MOVF 0x0A, W



; 清除文件寄存器 0x0B

CLRF 0x0B



; 设置文件寄存器 0x0C 的第 3 位

BSF 0x0C, 3



; 清除文件寄存器 0x0D 的第 4 位

BCF 0x0D, 4





1.5.2 控制指令
GOTO:跳转到指定的地址。

CALL:调用子程序。

RETURN:从子程序返回。

RETFIE:从中断服务程序返回。


; 跳转到地址 0x0020

GOTO 0x0020



; 调用地址为 0x0030 的子程序

CALL 0x0030



; 从子程序返回

RETURN



; 从中断服务程序返回

RETFIE





1.5.3 中断和定时器
PIC16 系列单片机支持中断和定时器功能,这些功能在许多应用中非常有用。

中断:当外部事件发生时,单片机会暂停当前的执行,跳转到中断服务程序(Interrupt Service Routine, ISR)。

定时器:用于产生定时信号,可以配置为不同的工作模式,如计数模式、定时模式等。

1.6 I/O端口
PIC16 系列单片机通常配备多个 I/O 端口,这些端口可以配置为输入或输出,用于与外部设备进行通信。

1.6.1 I/O端口配置
I/O 端口的配置通过特殊功能寄存器(SFR)进行。常见的配置寄存器包括 TRIS 寄存器和 PORT 寄存器。

TRIS 寄存器:用于设置端口的方向(输入或输出)。

PORT 寄存器:用于读取或写入端口的值。


; 将 PORTA 配置为输入

TRISA = 0xFF



; 将 PORTB 配置为输出

TRISB = 0x00



; 读取 PORTA 的值并存储到 WREG

MOVF PORTA, W



; 将 WREG 的值写入 PORTB

MOVWF PORTB





1.7 定时器
定时器是 PIC16 系列单片机的重要功能之一,用于生成定时信号或计数外部事件。

1.7.1 定时器0(Timer0)
定时器0 是一个 8 位定时器/计数器,可以配置为内部时钟源或外部时钟源。通过设置 T0CON 寄存器,可以控制定时器0 的工作模式和预分频器。


; 配置定时器0 为内部时钟源,预分频器为 1:256

T0CON = 0x07



; 启动定时器0

BSF T0CON, 5



; 停止定时器0

BCF T0CON, 5



; 读取定时器0 的值

MOVF TMR0, W



; 写入定时器0 的值

MOVWF TMR0






1.7.2 定时器1(Timer1)
定时器1 是一个 16 位定时器/计数器,可以配置为内部时钟源或外部时钟源。通过设置 T1CON 寄存器,可以控制定时器1 的工作模式和预分频器。


; 配置定时器1 为内部时钟源,预分频器为 1:8

T1CON = 0x01



; 启动定时器1

BSF T1CON, 7



; 停止定时器1

BCF T1CON, 7



; 读取定时器1 的低 8 位值

MOVF TMR1L, W



; 读取定时器1 的高 8 位值

MOVF TMR1H, W



; 写入定时器1 的低 8 位值

MOVWF TMR1L



; 写入定时器1 的高 8 位值

MOVWF TMR1H




1.8 中断系统
中断系统使得 PIC16 系列单片机可以响应外部事件或内部事件,从而实现更复杂的功能。

1.8.1 中断源
PIC16 系列单片机支持多种中断源,包括定时器中断、外部中断、I/O 端口中断等。

INTCON 寄存器:用于配置和控制中断使能及标志。

INTF 寄存器:用于设置外部中断的触发方式。


; 使能全局中断

BSF INTCON, 7



; 使能定时器0 中断

BSF INTCON, 5



; 清除定时器0 中断标志

BCF INTCON, 2



; 使能外部中断

BSF INTCON, 6



; 清除外部中断标志

BCF INTCON, 1




1.8.2 中断服务程序
当中断发生时,单片机会自动跳转到中断服务程序(Interrupt Service Routine, ISR)。ISR 通常用于处理中断事件,然后返回到主程序。


ORG 0x0000

    GOTO MAIN



ORG 0x0004

    GOTO ISR



MAIN:

    ; 主程序代码

    GOTO MAIN



ISR:

    ; 中断服务程序代码

    ; 清除中断标志

    BCF INTCON, 2

    ; 返回主程序

    RETFIE




1.9 电源管理
PIC16 系列单片机具有多种电源管理模式,这些模式可以根据应用需求进行选择,以优化功耗和性能。

1.9.1 睡眠模式
睡眠模式(Sleep Mode)是一种低功耗模式,单片机在该模式下停止执行指令,但保留数据存储器中的数据。


; 进入睡眠模式

SLEEP



1.9.2 复位和唤醒
复位(Reset)和唤醒(Wake-up)是电源管理的重要部分。复位会将单片机恢复到初始状态,而唤醒则会从低功耗模式恢复到正常工作模式。


; 使能外部复位

BSF OPTION_REG, 7



; 使能外部唤醒

BSF OPTION_REG, 6



1.10 通信接口
PIC16 系列单片机支持多种通信接口,包括 SPI、I2C 和 UART,用于与外部设备进行数据交换。

1.10.1 UART
UART(Universal Asynchronous Receiver-Transmitter)是一种常用的异步通信接口。通过配置 UART 相关的寄存器,可以实现串行通信。


; 配置 UART

BAUDCON = 0x00

TXSTA = 0x20

RCSTA = 0x90

SPBRG = 25



; 发送数据

TXREG = 0x41



; 接收数据

BTFSS PIR1, 5

GOTO $-2

MOVF RCREG, W



1.10.2 SPI
SPI(Serial Peripheral Interface)是一种同步通信接口,通常用于连接多个设备。通过配置 SPI 相关的寄存器,可以实现数据的发送和接收。


; 配置 SPI

TRISB = 0xF8

SSPCON = 0x20

SSPSTAT = 0x80



; 发送数据

MOVF 0x0A, W

MOVWF SSPBUF



; 接收数据

BTFSS SSPSTAT, BF

GOTO $-2

MOVF SSPBUF, W



1.11 模拟到数字转换器(ADC)
ADC(Analog-to-Digital Converter)用于将模拟信号转换为数字信号。通过配置 ADC 相关的寄存器,可以实现模拟信号的采样和转换。

1.11.1 ADC 寄存器
ADCON0:控制 ADC 的启动、通道选择和结果格式。

ADCON1:配置 ADC 的工作模式和输入通道。

ADRESH 和 ADRESL:分别存储 ADC 转换结果的高 8 位和低 8 位。


; 配置 ADC

ADCON0 = 0x81 ; 选择 AN0 通道,右对齐,Fosc/8 作为转换时钟

ADCON1 = 0x80 ; 选择 Vref+ 为 Vcc,Vref- 为 Vss



1.11.2 ADC 转换过程
启动转换:通过设置 ADCON0 寄存器的 GO/DONE 位来启动 ADC 转换。

等待转换完成:GO/DONE 位在转换开始时被设置为 1,转换完成后自动清零。

读取转换结果:转换结果存储在 ADRESH 和 ADRESL 寄存器中。


; 启动 ADC 转换

BSF ADCON0, 1



; 等待转换完成

BTFSS ADCON0, 2

GOTO $-2



; 读取 ADC 结果

MOVF ADRESH, W

MOVF ADRESL, W




1.12 示例项目:LED闪烁
通过一个简单的 LED 闪烁项目,我们可以综合应用 PIC16 系列的 I/O 端口和定时器功能。

1.12.1 硬件连接
连接一个 LED 到 PORTB 的 RB0 引脚。

连接一个限流电阻(220Ω)到 LED 和 Vcc 之间。

1.12.2 代码实现

; 定义常量

#define LED RB0

#define DELAY 100



; 初始化

ORG 0x0000

GOTO START



START:

    ; 配置 PORTB 为输出

    TRISB = 0x00



    ; 配置定时器0 为内部时钟源,预分频器为 1:256

    T0CON = 0x07



    ; 使能定时器0 中断

    BSF INTCON, 5



    ; 使能全局中断

    BSF INTCON, 7



    ; 启动定时器0

    BSF T0CON, 5



    ; 主循环

MAIN:

    GOTO MAIN



; 中断服务程序

ORG 0x0004

GOTO ISR



ISR:

    ; 清除定时器0 中断标志

    BCF INTCON, 2



    ; 切换 LED 的状态

    BTFSS PORTB, 0

    GOTO LED_ON

    GOTO LED_OFF



LED_ON:

    BSF PORTB, 0

    GOTO DELAY_LOOP



LED_OFF:

    BCF PORTB, 0

    GOTO DELAY_LOOP



DELAY_LOOP:

    ; 延时

    MOVLW DELAY

    MOVWF TMR0

    BTFSS INTCON, 2

    GOTO $-2

    RETFIE



1.13 项目示例:温度监测
通过一个温度监测项目,我们可以进一步应用 PIC16 系列的 ADC 和 UART 功能,实现温度数据的采集和显示。

1.13.1 硬件连接
连接一个温度传感器(如 LM35)到 AN0 引脚。

连接一个 UART 通信模块到 RX 和 TX 引脚。

1.13.2 代码实现

; 定义常量

#define TEMP_SENSOR AN0

#define BAUD_RATE 9600



; 初始化

ORG 0x0000

GOTO START



START:

    ; 配置 ADC

    ADCON0 = 0x81 ; 选择 AN0 通道,右对齐,Fosc/8 作为转换时钟

    ADCON1 = 0x80 ; 选择 Vref+ 为 Vcc,Vref- 为 Vss



    ; 配置 UART

    TRISC = 0x86 ; 将 RC6 和 RC7 配置为 UART 引脚

    BAUDCON = 0x00

    TXSTA = 0x20 ; 使能传输

    RCSTA = 0x90 ; 使能接收和连续接收

    SPBRG = (FOSC / (16 * BAUD_RATE)) - 1 ; 设置波特率



    ; 主循环

MAIN:

    ; 启动 ADC 转换

    BSF ADCON0, 1



    ; 等待转换完成

    BTFSS ADCON0, 2

    GOTO $-2



    ; 读取 ADC 结果

    MOVF ADRESH, W

    MOVWF 0x20 ; 存储高 8 位

    MOVF ADRESL, W

    MOVWF 0x21 ; 存储低 8 位



    ; 将结果转换为温度值

    ; 假设 LM35 的输出为 10 mV/°C

    ; ADC 结果为 0x2021,转换为温度值

    ; 0x2021 * 5 / 1024 = 80.5 mV,即 8.05 °C

    ; 为了简化,我们假设结果为 8 位

    MOVLW 0x05

    MULWF 0x20

    MOVWF 0x22 ; 存储温度值



    ; 将温度值发送到 UART

    MOVF 0x22, W

    MOVWF TXREG



    ; 等待 UART 发送完成

    BTFSS PIR1, 4

    GOTO $-2



    ; 返回主循环

    GOTO MAIN



; 中断服务程序

ORG 0x0004

GOTO ISR



ISR:

    ; 清除定时器0 中断标志

    BCF INTCON, 2



    ; 返回主程序

    RETFIE




1.14 总结
通过以上对 PIC16 系列单片机的架构和工作原理的详细探讨,我们了解了其基本的硬件结构和操作方式。PIC16 系列单片机采用哈佛架构和 RISC 架构,具有高效的指令执行能力和丰富的外设功能,如定时器、中断系统、通信接口和 ADC。这些特性使得 PIC16 系列在各种嵌入式应用中表现出色,能够满足不同应用场景的需求。

在实际应用中,通过合理配置和编程,可以充分利用 PIC16 系列单片机的性能和资源,实现复杂的功能和高效的控制。希望本文的内容能够帮助读者更好地理解和应用 PIC16 系列单片机。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/2401_87715305/article/details/145273584

使用特权

评论回复
沙发
heisexingqisi| | 2025-1-25 12:04 | 只看该作者
现在都不讲什么结构了,上来就用库函数。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2250

主题

16732

帖子

18

粉丝