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 单片机感兴趣想学习的朋友可以关注我,免费赠送资料(包括原理图、数据手册、各种例程等)。

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

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

相关推荐
来自晴朗的明天14 分钟前
14、光耦隔离电路(EL3H7)
单片机·嵌入式硬件·硬件工程
G***技15 分钟前
杰和IB3-272:以低功耗高性能打造新一代工业智能交互核心
单片机·嵌入式硬件·物联网
czhaii1 小时前
STC AI8052U单片机特点
单片机
MAR-Sky2 小时前
keil5中数据的不同定义和单片机(以stc8为例)里的对应关系(idata,xdata,data,code)
单片机·嵌入式硬件
北京耐用通信2 小时前
破解AGV多协议互联难题:耐达讯自动化Profinet转Devicenet网关如何实现高效协同
人工智能·科技·物联网·网络协议·自动化·信息与通信
项目題供诗3 小时前
51单片机入门(八)
单片机·嵌入式硬件·51单片机
国产化创客4 小时前
ESP32平台web服务器开发框架选型与分析
物联网·智能家居·智能硬件
羽获飞4 小时前
从零开始学嵌入式之STM32——9.STM32的时钟系统
stm32·单片机·嵌入式硬件
飞睿科技5 小时前
乐鑫智能开关方案解析:基于ESP32-C系列的低功耗、高集成设计
嵌入式硬件·物联网·esp32·智能家居·乐鑫科技
ESBK20255 小时前
第四届移动互联网、云计算与信息安全国际会议(MICCIS 2026)二轮征稿启动,诚邀全球学者共赴学术盛宴
大数据·网络·物联网·网络安全·云计算·密码学·信息与通信