pic16c57c中文资料


PIC16C57C 单片机中文资料
引言
在微控制器和嵌入式系统领域,Microchip Technology 公司生产的PIC(Peripheral Interface Controller)系列单片机凭借其卓越的性能、低功耗和高性价比,赢得了广泛的市场认可。PIC16C57C 作为该系列中的一款经典产品,虽然属于较早期的OTP(一次性可编程) 类型单片机,但其简洁的架构、丰富的指令集和稳定的工作表现,使其在特定应用场景中至今仍有其独特的价值。本资料旨在全面、详细地介绍 PIC16C57C 的各项技术参数、内部结构、工作原理、指令系统、外设功能以及典型应用,为工程师和学习者提供一份深入的中文参考指南。
第一章 PIC16C57C 概述
1.1 芯片特性与基本参数
PIC16C57C 是一款高性能、低功耗的CMOS 8位单片机。它采用了RISC(精简指令集计算机) 架构,拥有高度优化的指令集,绝大多数指令都可以在一个时钟周期内完成,这使得其执行效率非常高。芯片内部集成了程序存储器(OTP ROM)、数据存储器(RAM)、CPU、定时器、I/O端口等核心模块。
主要特性包括:
架构:8位 RISC 架构
指令集:33条单字长、单周期指令
程序存储器:2K x 14位 OTP ROM
数据存储器:72字节 RAM
工作电压:2.0V 至 6.0V
时钟频率:DC 至 20MHz
I/O引脚:20个双向I/O引脚
定时器:一个8位定时器/计数器(TMR0)
封装:提供 PDIP, SOIC, SSOP 等多种封装形式,以适应不同设计需求。
复位类型:上电复位(POR)、看门狗定时器复位(WDT)、外部复位。
1.2 RISC架构与执行效率
PIC16C57C 的精简指令集计算机(RISC) 架构是其核心优势之一。与传统的复杂指令集计算机(CISC)相比,RISC架构的指令条数较少,每条指令的格式和功能都非常简洁。这种设计使得指令译码电路得以简化,从而大大缩短了指令执行时间。PIC16C57C 的33条指令中,除了跳转指令外,所有指令都可以在一个指令周期内完成。一个指令周期相当于四个振荡器时钟周期。例如,当使用20MHz晶振时,其指令周期为4/20MHz=0.2mus。这意味着PIC16C57C 在高时钟频率下可以实现非常快的指令执行速度,非常适合对实时性有要求的控制应用。
第二章 内部结构与工作原理
2.1 CPU核心
PIC16C57C 的CPU核心由算术逻辑单元(ALU)、工作寄存器(W寄存器)、程序计数器(PC)、栈(Stack)、状态寄存器(STATUS) 和指令译码器等部分组成。
算术逻辑单元(ALU):负责执行所有的算术运算(如加、减)和逻辑运算(如与、或、非、异或)。ALU的操作对象通常是W寄存器和文件寄存器中的数据。
W寄存器:这是一个8位的工作寄存器,是CPU进行数据操作时的重要临时存储器。它类似于其它单片机中的累加器。几乎所有的数据操作都需要通过W寄存器作为中介。
程序计数器(PC):这是一个13位的寄存器,用来保存下一条要执行指令的地址。当一条指令执行完毕后,PC会自动递增,指向下一条指令。当发生跳转、子程序调用或中断时,PC的值会被修改为新的地址。
栈(Stack):PIC16C57C 的栈是一个两级硬件栈,用于保存PC的值。当调用子程序(CALL指令)时,当前PC的值会被压入栈中;当子程序返回(RETLW指令)时,栈顶的值会被弹出并送入PC,从而实现程序流程的返回。
状态寄存器(STATUS):这是一个8位寄存器,用于保存CPU的运算状态和RAM的存储区选择位。它包含了零标志位(Z)、DC标志位(DC)、进位/借位标志位(C) 等,这些标志位对于条件跳转指令至关重要。
2.2 存储器结构
PIC16C57C 采用哈佛(Harvard) 架构,将程序存储器和数据存储器分开,各自有独立的地址总线和数据总线。这种设计使得CPU可以同时进行指令的读取和数据的存取,从而提高了并行处理能力。
程序存储器(Program Memory):
0000H:复位向量地址,芯片上电复位后从此处开始执行程序。
0004H:中断向量地址,当发生中断时,程序会跳转到此处执行中断服务程序。
容量:2K x 14位 的一次性可编程(OTP)ROM。
地址范围:0000H 至 07FFH。
特点:只能写入一次,无法擦除和重复编程。这使得它非常适合于大批量生产且程序固定的产品。
特殊地址:
数据存储器(Data Memory):
Bank 0(00H - 1FH):包含特殊功能寄存器(SFR) 和通用寄存器(GPR)。SFR用于控制芯片的各种外设功能,如I/O端口、定时器等。GPR是用户可自由使用的寄存器,用于存储程序中的变量和数据。
Bank 1(20H - 4FH):全部为通用寄存器(GPR)。
容量:72字节 的RAM,分为两个寄存器组(Bank)。
地址范围:00H 至 4FH。
寄存器组(Bank):
Bank选择:通过STATUS寄存器中的RP0位来选择当前操作的寄存器组。
第三章 I/O端口与外设
3.1 I/O端口
PIC16C57C 提供了20个双向I/O引脚,分为PORTA、PORTB、PORTC三个端口。每个端口都有一个对应的数据寄存器(PORTx) 和一个方向控制寄存器(TRISx)。
PORTx 寄存器:用于读写端口引脚的电平状态。
TRISx 寄存器:用于配置端口引脚的方向。
当TRISx寄存器中的某一位为'1'时,对应的引脚被配置为输入模式。
当TRISx寄存器中的某一位为'0'时,对应的引脚被配置为输出模式。
端口功能:
PORTA:8位端口,引脚RA0-RA7。
PORTB:8位端口,引脚RB0-RB7。
PORTC:4位端口,引脚RC0-RC3。
3.2 定时器模块(TMR0)
PIC16C57C 内置一个8位定时器/计数器模块,称为TMR0。它可以工作在定时器模式或计数器模式下,并支持预分频器(Prescaler) 功能。
定时器模式:
TMR0 寄存器以内部指令周期时钟作为计数脉冲源,每四个振荡器时钟周期,TMR0寄存器自动加一。
通过预分频器,可以将时钟源分频,从而实现更长的定时周期。
当TMR0从FFH溢出到00H时,会置位T0IF中断标志位,并可以选择性地产生中断。
计数器模式:
TMR0 寄存器以外部引脚(RA4/T0CKI) 的时钟脉冲作为计数源。
当外部脉冲的上升沿或下降沿到来时,TMR0寄存器加一。
同样支持预分频器功能。
控制寄存器(OPTION_REG) 用于配置TMR0的工作模式、预分频器比值、时钟源和边沿选择等。
第四章 指令系统与编程
4.1 PIC16C57C 指令集
PIC16C57C 拥有33条单字长、单周期的指令,可以分为以下几大类:
字节操作指令(Byte-oriented File Register Operations):
MOVF:将文件寄存器的内容移动到W寄存器或其本身。
MOVWF:将W寄存器的内容移动到文件寄存器。
ADDWF:将W寄存器和文件寄存器的内容相加,结果存入文件寄存器或W寄存器。
SUBWF:从文件寄存器的内容中减去W寄存器的内容。
INCF:将文件寄存器的内容加一。
DECF:将文件寄存器的内容减一。
ANDWF、IORWF、XORWF:按位进行逻辑与、或、异或运算。
位操作指令(Bit-oriented File Register Operations):
BSF:设置(置'1')文件寄存器中某一位。
BCF:清除(置'0')文件寄存器中某一位。
BTFSC:测试文件寄存器中某一位,如果为'0'则跳过下一条指令。
BTFSS:测试文件寄存器中某一位,如果为'1'则跳过下一条指令。
字操作指令(Literal and Control Operations):
MOVLW:将一个立即数加载到W寄存器。
ADDLW:将W寄存器内容和一个立即数相加。
SUBLW:从一个立即数中减去W寄存器内容。
CALL:调用子程序。
GOTO:无条件跳转。
RETLW:从子程序返回,并返回一个立即数到W寄存器。
NOP:空操作。
程序控制指令:
RETFIE:从中断返回。
SLEEP:进入低功耗休眠模式。
4.2 汇编语言编程
PIC16C57C 的编程通常使用MPASM汇编器,编写汇编语言程序。编写汇编程序需要对芯片的内部结构、寄存器功能和指令集有深入的理解。
编程基本步骤:
定义寄存器:使用EQU伪指令为SFR和GPR定义有意义的名称,提高代码可读性。
设置配置位:在程序开始处使用**__CONFIG**伪指令,配置芯片的熔丝位,例如选择振荡器类型、是否使能看门狗定时器等。
初始化:在主程序开始前,需要对I/O端口方向(TRIS)、定时器等进行初始化配置。
编写主程序:主程序通常是一个无限循环,用于处理芯片的核心逻辑。
编写子程序:将重复使用的功能模块封装为子程序,通过CALL指令调用。
编写中断服务程序:如果使用中断,需要编写中断服务程序,并在程序开始处设置中断向量。
编译与烧录:使用MPLAB IDE等集成开发环境,将汇编源程序编译为HEX文件,然后使用PICkit或其它烧录器将HEX文件烧录到PIC16C57C的OTP ROM中。
第五章 低功耗模式与复位
5.1 低功耗模式(SLEEP)
PIC16C57C 提供了SLEEP(休眠) 模式,以实现超低功耗。当执行SLEEP指令后,芯片会停止CPU的时钟,但看门狗定时器(WDT) 和振荡器可以继续工作。
进入SLEEP模式:通过执行SLEEP指令。
退出SLEEP模式:
外部引脚复位:将MCLR引脚拉低。
看门狗定时器复位:如果WDT被使能,当WDT溢出时会唤醒并复位芯片。
中断:如果中断被使能,外部中断或TMR0溢出中断会唤醒芯片。
5.2 复位类型
PIC16C57C 支持多种复位方式,以确保芯片在不同情况下都能正常启动。
上电复位(POR):当电源电压从低电平上升到芯片工作电压时,自动产生的复位。
外部引脚复位:通过将MCLR引脚拉低来强制复位。
看门狗定时器复位(WDT):当WDT溢出时,会自动产生复位。
代码保护复位:如果代码保护被使能,试图读取保护代码时会产生复位。
看门狗定时器(WDT) 是一个独立的内部RC振荡器驱动的定时器。它的作用是防止程序“跑飞”或陷入死循环。当WDT溢出时,会产生复位。为了防止复位,需要在程序中定期执行CLRWDT指令来喂狗。
第六章 应用案例与发展展望
6.1 典型应用领域
尽管PIC16C57C是早期的产品,但由于其低成本、小封装和高可靠性,仍然在一些对性能要求不高、注重成本和稳定性的领域有其独特的应用。
家电控制:如电风扇、电磁炉、洗衣机等产品的简易控制面板。
玩具和游戏机:简单的电子玩具、儿童学习机等。
LED显示驱动:简单的LED数码管显示、小屏幕点阵显示控制。
工业控制:简单的传感器数据采集、状态监测、继电器控制等。
汽车电子:如汽车仪表盘的指示灯控制、简单的门窗控制。
6.2 与现代PIC单片机的比较
相较于现代的PIC16F、PIC18F甚至32位PIC32系列单片机,PIC16C57C存在以下局限性:
一次性可编程:OTP ROM无法重复烧写,调试和开发成本较高。
资源有限:存储器(2K ROM, 72B RAM)和外设(单个定时器)资源较少,无法应对复杂应用。
无硬件调试:OTP芯片不支持在线调试功能,只能通过仿真器进行仿真,增加了开发难度。
低速:最高20MHz的时钟频率远低于现代单片机。
缺乏高级外设:没有A/D转换器、PWM模块、SPI/I2C/UART等通信接口。
尽管如此,PIC16C57C作为一款经典的RISC单片机,它的简洁架构和高效指令集为我们理解微控制器的工作原理提供了很好的范例。对于入门学习者来说,掌握PIC16C57C的编程,能够打下扎实的汇编语言和单片机基础。
第七章 编程实例与代码解析
本章将通过一个简单的LED闪烁程序,详细解析PIC16C57C的汇编语言编程过程。
7.1 程序需求
在PIC16C57C单片机上,通过控制PORTB的某个引脚,实现一个LED灯以大约1秒的频率闪烁。
7.2 代码编写与解析
Code snippet
; PIC16C57C LED闪烁程序
; 文件名: LED_Blink.asm
; -------------------------------------------------------------
; 包含头文件,定义寄存器地址
#include <p16c57c.inc>
; 芯片配置位设置
__CONFIG _CP_OFF & _WDT_OFF & _XT_OSC
; 定义一些有意义的变量名
TEMP_REG EQU 0x20
DELAY_CNT1 EQU 0x21
DELAY_CNT2 EQU 0x22
; -------------------------------------------------------------
; 程序入口点与复位向量
ORG 0x0000 ; 设置程序起始地址为0000H
START
; 初始化I/O端口
BSF STATUS, RP0 ; 选择Bank 1,访问TRISB
MOVLW B'00000000' ; W寄存器赋值
MOVWF TRISB ; 将W寄存器内容写入TRISB,配置PORTB为输出
BCF STATUS, RP0 ; 选择回Bank 0
MAIN_LOOP
; 点亮LED (RB0引脚)
BSF PORTB, 0 ; 将PORTB的第0位(RB0)置1
; 调用延时子程序
CALL DELAY_MS
; 熄灭LED (RB0引脚)
BCF PORTB, 0 ; 将PORTB的第0位(RB0)清0
; 调用延时子程序
CALL DELAY_MS
GOTO MAIN_LOOP ; 无条件跳转回主循环
; -------------------------------------------------------------
; 延时子程序 (简单的双重循环延时)
DELAY_MS
MOVLW D'250' ; 立即数250加载到W寄存器
MOVWF DELAY_CNT1 ; 将W寄存器内容存入DELAY_CNT1
DELAY_OUTER
MOVLW D'250' ; 立即数250加载到W寄存器
MOVWF DELAY_CNT2 ; 将W寄存器内容存入DELAY_CNT2
DELAY_INNER
DECFSZ DELAY_CNT2, 1 ; DELAY_CNT2减1,如果结果为0则跳过下一条指令
GOTO DELAY_INNER ; 如果不为0,继续内循环
DECFSZ DELAY_CNT1, 1 ; DELAY_CNT1减1,如果结果为0则跳过下一条指令
GOTO DELAY_OUTER ; 如果不为0,继续外循环
RETLW 0x00 ; 从子程序返回,并返回一个立即数0到W寄存器
END
代码解析:
#include <p16c57c.inc>
:这是一个预处理指令,用于包含PIC16C57C的头文件,其中定义了所有SFR和配置位的符号名称,使代码更易读。__CONFIG
:配置熔丝位。_CP_OFF
关闭代码保护,_WDT_OFF
关闭看门狗定时器,_XT_OSC
选择XT振荡器模式。EQU
:定义变量。我们为RAM中的三个地址定义了有意义的名称TEMP_REG、DELAY_CNT1和DELAY_CNT2,用于延时子程序。ORG 0x0000
:设置程序入口点。芯片复位后,程序将从地址0000H开始执行。BSF STATUS, RP0
:这是一条位设置指令。STATUS是状态寄存器,RP0是其中的第7位。将其置1,将Bank切换到Bank 1,以便访问TRISB寄存器。MOVLW B'00000000'
:MOVLW是字操作指令,将二进制数B'00000000'
(即0)加载到W寄存器。MOVWF TRISB
:将W寄存器的值写入TRISB寄存器。这行代码将PORTB的所有引脚都配置为输出模式。BCF STATUS, RP0
:将RP0位清零,切换回Bank 0,以访问PORTB寄存器。BSF PORTB, 0
:设置PORTB的第0位。这会使得RB0引脚输出高电平,点亮LED。BCF PORTB, 0
:清除PORTB的第0位。这会使得RB0引脚输出低电平,熄灭LED。CALL DELAY_MS
:调用DELAY_MS子程序。PC的值会被压入栈中。GOTO MAIN_LOOP
:无条件跳转到MAIN_LOOP标签处,形成一个无限循环。**
DELAY_MS
**子程序:这是一个简单的双重循环延时。MOVLW
和MOVWF
用于初始化循环计数器。DECFSZ
指令将寄存器减1,如果结果为0,则跳过下一条GOTO
指令。当内层和外层循环都结束时,RETLW
指令从子程序返回,并将栈中的PC值弹出,恢复到CALL
指令的下一行继续执行。
第八章 结论与总结
PIC16C57C作为一款经典的8位RISC单片机,在特定的嵌入式应用中,特别是在对成本、功耗和尺寸有严格限制的领域,仍然具有不可替代的优势。它的一次性可编程(OTP) 特性使其非常适合于大批量、一次性烧录的低成本产品。尽管其硬件资源相对有限,且缺乏现代单片机丰富的外设和调试功能,但其精简的指令集和哈佛架构为我们理解微控制器的工作原理提供了很好的范例。
本资料从概述、内部结构、I/O外设、指令系统、编程方法到典型应用和实例,对PIC16C57C进行了详尽的阐述。通过深入学习其工作原理和汇编语言编程,不仅可以掌握这款芯片的应用,更能为后续学习更复杂、更强大的PIC系列或其他Cortex-M系列单片机打下坚实的基础。在工程实践中,工程师们可以根据具体的项目需求,权衡成本、性能和开发难度,选择最合适的微控制器解决方案。而对于PIC16C57C而言,其简洁、高效的特点使其在那些“小而美”的应用中,依然能焕发出独特的光彩。
附录:
PIC16C57C 引脚图(此处应为详细的引脚功能描述,例如:)
VSS: 地
VDD: 电源
MCLR/VPP: 主清除/编程电压
OSC1/CLKIN: 振荡器输入/外部时钟输入
OSC2/CLKOUT: 振荡器输出/时钟输出
RA0-RA7: PORTA引脚
RB0-RB7: PORTB引脚
RC0-RC3: PORTC引脚
寄存器列表(此处应为详细的特殊功能寄存器列表及功能描述,例如:)
W:工作寄存器
STATUS:状态寄存器
TRISA:PORTA方向寄存器
TRISB:PORTB方向寄存器
TRISC:PORTC方向寄存器
PORTA:PORTA数据寄存器
PORTB:PORTB数据寄存器
PORTC:PORTC数据寄存器
TMR0:定时器0寄存器
OPTION_REG:选项寄存器
PCL:程序计数器低八位
PCLATH:程序计数器高五位锁存器
指令集汇总(此处应为详细的33条指令列表,包含指令格式、功能描述、受影响的状态标志位等)
ADDWF f, d:将 W 和 f 相加,结果存入 d。
ANDWF f, d:W 和 f 逻辑与,结果存入 d。
BCF f, b:清零 f 寄存器第 b 位。
BSF f, b:置位 f 寄存器第 b 位。
GOTO k:无条件跳转到地址 k。
MOVLW k:将立即数 k 存入 W。
SLEEP:进入休眠模式。
RETLW k:从子程序返回,W 寄存器加载立即数 k。
CLRWDT:清零看门狗定时器。
本资料旨在提供一个全面的技术参考,但具体的应用和编程细节还需要结合官方数据手册进行更深入的学习和实践。
责任编辑:David
【免责声明】
1、本文内容、数据、图表等来源于网络引用或其他公开资料,版权归属原作者、原发表出处。若版权所有方对本文的引用持有异议,请联系拍明芯城(marketing@iczoom.com),本方将及时处理。
2、本文的引用仅供读者交流学习使用,不涉及商业目的。
3、本文内容仅代表作者观点,拍明芯城不对内容的准确性、可靠性或完整性提供明示或暗示的保证。读者阅读本文后做出的决定或行为,是基于自主意愿和独立判断做出的,请读者明确相关结果。
4、如需转载本方拥有版权的文章,请联系拍明芯城(marketing@iczoom.com)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。