作为一名使用PIC单片机近三十年的工程师,我最早从PIC16F87X系列起步,后来为了应对小型化、低成本的项目需求,又陆续使用了6脚、8脚、14脚等PIC单片机。
在众多PIC单片机中,PIC16F1824和PIC12F1822是我认为最适合入门的两个型号。
它们不仅易于上手,而且引脚兼容性极佳——PIC16F1824的1-4脚和11-14脚与PIC12F1822完全重合,这意味着在设计初期,你可以灵活替换,无需重新绘制电路板。
下图清晰展示了两款芯片的引脚对应关系


今天就以PIC16F1824为例,通过I/O来点亮4路LED和控制2路继电器
一、I/O输出和输入:单片机控制外设的根本
下面两个图是开发板输出部分的电路:


从上面两个图可以看出:RA0、RA1、RC0、RC1分别控制LED1-LED4这4个指示灯,PWR是电源指示灯;RA0、RA1口都是复用的,既是下载程序的数据和时钟口,也可以做普通I/O口用,又可以通过寄存器设置做串口的TX、RX使用。
RC5、RC4控制两个继电器的吸合与释放。
二、I/O输出控制例程:
PIC单片机输入输出寄存器的控制字设置与其他如MSP430系列单片机不一样,一般其他系列单片机某一I/O口输出置1、输入置0;PIC则相反,输出置0、输入置1,你可以把0想成O(对应OUT),把1想成I(对应IN),这样会不容易设置错。
以下是6个I/O口控制输出示例(16M主频),LED1-LED4、R LAY1、RELAY2依次点亮与吸合,然后熄灭释放,循环控制;具体配置及程序如下:
#include<pic16f1824.h>
__CONFIG(0x083c); //配置字1寄存器
__CONFIG(0x3412); //配置字2寄存器
#define LED1 RA0
#define LED2 RA1
#define LED3 RC0
#define LED4 RC1
#define RELAY1 RC5
#define RELAY2 RC4
unsigned int half_sec,time_2s;
void delay(unsigned int v) //延时函数
{
while(v--){};
}
// 中断服务程序
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 = 0x18;
TRISC = 0x0C;
PORTA = 0x03; //RA0、RA1输出高电平,初始上电LED1、LED2为熄灭状态
PORTC = 0x03; //RC0、RC1输出高电平,初始上电LED1、LED2为熄灭状态,RC5、RC4控制的两个继电器RELAY1、RELAY2为释放状态。
// 外设功能选择
// 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) {
LED1=1;
delay (50000);
delay (50000); // delay函数可以多个
LED2=1;
delay (50000);
delay (50000);
LED3=1;
delay (50000);
delay (50000);
LED4=1;
delay (50000);
delay (50000);
RELAY1=1;
delay (50000);
delay (50000);
RELAY2=1;
delay (50000);
delay (50000);
LED1=0; //LED熄灭
LED2=0;
LED3=0;
LED4=0;
RELAY1=0; //继电器释放
RELAY2=0;
delay (50000);
delay (50000);
//可加入其他任务
}
}
上面的主循环演示程序用的是延时函数,也可以用定时器来实现
三、本系列文章规划
本文是《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单片机感兴趣想学习的朋友可以关注我,免费赠送资料(包括原理图、数据手册、各种例程等)。
有需要这款开发板的朋友也可以关注联系我。
后续干货不断,咱们一起在单片机的世界里,共同进步。
:PIC16F1824PIC12F1822,IO输出控制LED和继电器&spm=1001.2101.3001.5002&articleId=156727691&d=1&t=3&u=f01f9d797fd546edafa9b3e45bf87897)
2385

被折叠的 条评论
为什么被折叠?



