PIC单片机入门实战(二):PIC16F1824/PIC12F1822,I/O输出控制LED和继电器

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

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

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

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

今天就以PIC16F1824为例,通过I/O来点亮4LED和控制2路继电器

一、I/O输出和输入:单片机控制外设的根本

下面两个图是开发板输出部分的电路:

从上面两个图可以看出:RA0RA1RC0RC1分别控制LED1-LED44个指示灯,PWR是电源指示灯;RA0RA1口都是复用的,既是下载程序的数据和时钟口,也可以做普通I/O口用,又可以通过寄存器设置做串口的TXRX使用。

RC5RC4控制两个继电器的吸合与释放。

二、I/O输出控制例程:

PIC单片机输入输出寄存器的控制字设置与其他如MSP430系列单片机不一样,一般其他系列单片机某一I/O口输出置1、输入置0PIC则相反,输出置0、输入置1,你可以把0想成O(对应OUT),把1想成I(对应IN),这样会不容易设置错。

以下是6I/O口控制输出示例(16M主频),LED1-LED4R LAY1RELAY2依次点亮与吸合,然后熄灭释放,循环控制;具体配置及程序如下:

#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; //RA0RA1输出高电平,初始上电LED1LED2为熄灭状态
    PORTC = 0x03; //RC0RC1输出高电平,初始上电LED1LED2为熄灭状态,RC5RC4控制的两个继电器RELAY1RELAY2为释放状态。

    // 外设功能选择
  //  APFCON0 = 0x84;  // 设置RA0TXRA1RX

    // 模拟输入关闭(除指定引脚)
    ANSELA = 0x10;
    ANSELC = 0x00;
    
PIE1 = 0x01;     
 INTCON = 0x40;   // 使能外围中断
    OSCCON = 0x78;   // 内部时钟16MHz

    //以下为Timer1配置
    T1CON = 0x60;    // 预分频器设为1:4Timer1关闭
    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路继电器与4LED

3

I/O按键输入

3路按键扫描与电平变化中断

4

UART通信

RS232/RS485数据交互

5

A/D转换应用

1路电位器电压读取

6

温度传感器采集

1DS18B20输入

7

EEPROM存储

数据存储与读取

8

MODBUS-RTU集成

功能码01/03/05/06数据读写

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值