PIC单片机入门实战(一):PIC16F1824/PIC12F1822,从振荡器与Timer1开始

作为一名使用PIC单片机近三十年的工程师,我最早从PIC16F87X系列起步,后来为了应对小型化、低成本的项目需求,又陆续使用了6脚、8脚、14脚等PIC单片机。

在众多PIC单片机中,PIC16F1824PIC12F1822 是我认为最适合入门的两个型号。

它们不仅易于上手,而且引脚兼容性极佳------PIC16F1824的1-4脚和11-14脚与PIC12F1822完全重合,这意味着在设计初期,你可以灵活替换,无需重新绘制电路板。

下图清晰展示了两款芯片的引脚对应关系

今天就以PIC16F1824为例,先从振荡器和定时器Timer1开始简单讲解

一、时钟系统: PIC " 心跳 " 配置

时钟是单片机运行的基础,PIC16F1824的振荡器模块支持8种模式,适应不同场景需求:

  1. ECL------ 外部时钟低功耗模式

(0 MHz 至 0.5 MHz)

  1. ECM------ 外部时钟中等功耗模式

(0.5 MHz 至 4 MHz)

  1. ECH------ 外部时钟高功耗模式

(4 MHz 至 32 MHz)

  1. LP------32 kHz 低功耗晶振模式

  2. XT------ 中等增益晶振或陶瓷谐振器模式

(最高 4 MHz)

  1. HS------ 高增益晶振或陶瓷谐振器模式

(4 MHz 至 20 MHz)

  1. RC------ 外部阻容 (RC)

  2. INTOSC------ 内部振荡器 (31 kHz 至 32 MHz)

配置方法:通过 FOSC<2:0>(配置字1)选择时钟源。我个人最常用的是 HS****模式 (外接晶振)和 INTOSC****模式 (内部振荡器),后者无需外接元件,特别适合对成本敏感的小型项目。

下面以内部振荡器16MHz为例给出配置字和振荡器控制寄存器的赋值

#include<pic16f1824.h>

__CONFIG(0x083c); //选内部振荡器,配置位是2-0位,100是内部振荡器(最高32M),010是外部高速振荡器(最高20M)

void main()

{

OSCCON=0x78; //内部时钟16MHZ

//其他初始化

}

二、 Timer1 16 位定时器应用

Timer1是PIC中常用的16位定时器/计数器,可用于定时、计数或捕获功能。以下是一个完整的中断式定时示例,实现每0.5秒计数一次(16M主频),具体配置及程序如下:

#include<pic16f1824.h>

__CONFIG(0x083c);

unsigned int half_sec,time_2s;

复制代码
// 中断服务程序
复制代码
void interrupt isr(void) {
复制代码
    if (TMR1IF) {               // 判断是否为Timer1中断
复制代码
        TMR1L = 0xBF;           // 重载定时初值(低位)
复制代码
        TMR1H = 0xF9;           // 重载定时初值(高位)
复制代码
        half_sec++;
复制代码
复制代码
        if (half_sec > 1249) {  // 累计0.5秒
复制代码
            time_2s++;          // 计数器+1
复制代码
            half_sec = 0;
复制代码
        }
复制代码
        TMR1IF = 0;             // 清除中断标志
复制代码
    }
复制代码
}
复制代码
复制代码
void main() {
复制代码
    // 初始化I/O
复制代码
    TRISA = 0x1A;
复制代码
    TRISC = 0x0C;
复制代码
    PORTA = 0x00;
复制代码
    PORTC = 0x03;
复制代码
复制代码
    // 外设功能选择
复制代码
    APFCON0 = 0x84;  // 设置RA0为TX,RA1为RX
复制代码
复制代码
    // 模拟输入关闭(除指定引脚)
复制代码
    ANSELA = 0x10;
复制代码
    ANSELC = 0x00;
复制代码
    
复制代码
PIE1 = 0x01;     
复制代码
 INTCON = 0x40;   // 使能外围中断
复制代码
    OSCCON = 0x78;   // 内部时钟16MHz
复制代码
复制代码
    //以下为Timer1配置
复制代码
    T1CON = 0x60;    // 预分频器设为1:4,Timer1关闭
复制代码
    TMR1IF = 0;
复制代码
    TMR1L = 0xBF;    // 定时初值
复制代码
    TMR1H = 0xF9;
复制代码
    TMR1IE = 1;      // 使能Timer1中断
复制代码
    T1CON |= 0x01;   // 启动Timer1
复制代码
复制代码
    GIE = 1;         // 全局中断使能
复制代码
复制代码
    while(1) {
复制代码
        // 主循环,可加入其他任务
复制代码
    }
复制代码
}
三、本系列文章规划

本文是《PIC单片机入门实战》系列的第一篇,后续将逐步展开以下内容,带你从零构建一个完整的嵌入式控制系统:

|----|-----------------------|--------------------|
| 序号 | 主题 | 内容概要 |
| 1 | 振荡器与 Timer1 | 时钟配置与定时中断 |
| 2 | I/O 输出控制 | 驱动2路继电器与4路LED |
| 3 | I/O 按键输入 | 3路按键扫描与电平变化中断 |
| 4 | UART 通信 | RS232/RS485数据交互 |
| 5 | A/D 转换应用 | 1路电位器电压读取 |
| 6 | 温度传感器采集 | 1路DS18B20输入 |
| 7 | EEPROM 存储 | 数据存储与读取 |
| 8 | MODBUS-RTU 集成 | 功能码01/03/05/06数据读写 |

PIC 单片机入门实战》这 8 片文章内容来源于我自己画的电路原理图及程序,有对 PIC 单片机感兴趣想学习的朋友可以关注我,免费赠送资料(包括原理图、数据手册、各种例程等)。

有需要这款开发板的朋友也可以关注联系我。

后续干货不断,咱们一起在单片机的世界里,共同进步。

相关推荐
代码游侠2 小时前
ARM开发——阶段问题综述(二)
运维·arm开发·笔记·单片机·嵌入式硬件·学习
DLGXY2 小时前
STM32——旋转编码器计次(七)
stm32·单片机·嵌入式硬件
羽获飞2 小时前
从零开始学嵌入式之STM32——3.使用寄存器点亮一盏LED灯
单片机·嵌入式硬件
浩子智控3 小时前
商业航天计算机抗辐射设计
单片机·嵌入式硬件
独处东汉7 小时前
freertos开发空气检测仪之输入子系统结构体设计
数据结构·人工智能·stm32·单片机·嵌入式硬件·算法
czy87874757 小时前
机智云 MCU OTA可以对MCU程序进行无线远程升级。
单片机·嵌入式硬件
A9better9 小时前
嵌入式开发学习日志52——二值与计数信号量
单片机·嵌入式硬件·学习
日更嵌入式的打工仔10 小时前
(实用向)中断服务程序(ISR)的优化方向
笔记·单片机
想放学的刺客11 小时前
单片机嵌入式试题(第25)嵌入式系统可靠性设计与外设驱动异常处理
stm32·单片机·嵌入式硬件·mcu·物联网
wotaifuzao11 小时前
STM32+FreeRTOS 长期可维护架构设计(事件驱动篇)-- 告别“屎山”代码
c语言·stm32·嵌入式硬件·freertos·状态机·事件驱动·嵌入式架构