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

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

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

相关推荐
清风6666661 天前
基于单片机的车辆超载报警系统设计及人数检测设计
单片机·嵌入式硬件·毕业设计·课程设计·期末大作业
QQ_21932764551 天前
基于单片机的自动售货机系统设计
单片机·嵌入式硬件
北京耐用通信1 天前
耐达讯自动化CAN转PROFIBUS网关让软启动器如何让包装线告别“信号迷宫”
人工智能·物联网·网络协议·自动化·信息与通信
Y1rong1 天前
STM32之IIC
stm32·单片机
Nautiluss1 天前
一起调试XVF3800麦克风阵列(九)
linux·人工智能·嵌入式硬件·音频·语音识别·dsp开发
钿驰科技1 天前
TC-BL2840三相有感直流无刷电机驱动板在水泵的应用
单片机·嵌入式硬件
自小吃多1 天前
爬电距离与电气间隙
笔记·嵌入式硬件·硬件工程
集和诚JHCTECH1 天前
BRAV-7722赋能手术机器人:高性能控制方案,守护精准手术的每一刻
人工智能·嵌入式硬件·计算机视觉
国科安芯1 天前
商业卫星多轴步进驱动系统的抗辐照MCU集成方案
运维·网络·单片机·嵌入式硬件·安全·安全威胁分析·risc-v