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