这段代码是用于PIC16F1719单片机的一个简单例子,主要展示了如何配置和使用内部振荡器,并且通过简单的循环控制一个LED灯的闪烁。以下是对代码的逐步讲解:
配置位设置:
使用#pragma
语句为PIC16F1719单片机的各种功能模块进行初始化配置,例如:
INTOSC
)作为系统时钟源。WDTE = OFF
)。MCLRE = ON
)。PLLEN = ON
)。系统振荡器频率定义:
定义了一个宏_XTAL_FREQ
,它代表了系统时钟的频率。在这段代码中,系统时钟频率为32MHz。
主程序初始化:
INTOSC
设置为8MHz,并启用4x PLL,使系统时钟达到32MHz。设置端口D1为输出:
使用TRISDbits.TRISD1 = 0
将D端口的第一个引脚(D1)配置为输出。
LED闪烁逻辑:
LATDbits.LATD1
的状态来控制D1引脚的电平变化,从而实现LED的闪烁。__delay_ms(500)
函数实现了500毫秒的延迟,控制LED每隔500毫秒切换一次状态,形成闪烁效果。中断设置:
虽然中断功能已经使能,但这段代码目前并未使用任何中断功能。可以在未来扩展中引入中断处理。
总结:这个程序展示了如何使用PIC16F1719单片机的内部振荡器来设置时钟频率,并使用简单的循环控制D1引脚上的LED灯进行定时闪烁。
c/* PIC16F1719 配置位设置 */
#pragma config FOSC = INTOSC /* 振荡器选择位 (INTOSC 振荡器: CLKIN 引脚上的 I/O 功能) */
#pragma config WDTE = OFF /* 看门狗定时器使能 (WDT 禁用) */
#pragma config PWRTE = OFF /* 上电定时器使能 (PWRT 禁用) */
#pragma config MCLRE = ON /* MCLR 引脚功能选择 (MCLR/VPP 引脚功能为 MCLR) */
#pragma config CP = OFF /* 闪存程序存储器代码保护 (程序存储器代码保护禁用) */
#pragma config BOREN = OFF /* 低电压复位使能 (低电压复位禁用) */
#pragma config CLKOUTEN = OFF /* 时钟输出使能 (CLKOUT 功能禁用。CLKOUT 引脚上的 I/O 或振荡器功能) */
#pragma config IESO = ON /* 内外部切换模式 (内外部切换模式使能) */
#pragma config FCMEN = ON /* 故障安全时钟监控器使能 (故障安全时钟监控器使能) */
#pragma config WRT = OFF /* 闪存自写保护 (写保护关闭) */
#pragma config PPS1WAY = OFF /* 外设引脚选择单向控制 (PPSLOCK 位可以通过软件反复设置和清除) */
#pragma config ZCDDIS = ON /* 零交叉检测禁用 (ZCD 禁用。ZCD 可以通过设置 ZCDCON 的 ZCDSEN 位来启用) */
#pragma config PLLEN = ON /* 锁相环使能 (4x PLL 使能) */
#pragma config STVREN = ON /* 栈溢出/下溢复位使能 (栈溢出或下溢将导致复位) */
#pragma config BORV = LO /* 低电压复位电压选择 (低电压复位电压 (Vbor),选择低触发点。) */
#pragma config LPBOR = OFF /* 低功率低电压复位 (低功率低电压复位禁用) */
#pragma config LVP = ON /* 低电压编程使能 (低电压编程使能) */
/* 定义系统振荡器频率 */
#define _XTAL_FREQ (32000000ul)
#include <xc.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main(void) {
unsigned char index = 0;
/* 程序初始化设置 */
OSCCON = 0xF0; /* 设置 INTOSC 为 8MHz,并使用 4xPLL,使系统振荡器达到 32MHz */
INTCON = 0; /* 禁用所有中断源 */
PIE1 = 0;
PIE2 = 0;
PIE3 = 0;
// Allow PLL startup time ~2 ms
__delay_ms(10);
ANSELA = 0x00; // 将所有A端口引脚设置为数字模式
ANSELB = 0x00; // 将所有B端口引脚设置为数字模式
ANSELC = 0x00; // 将所有C端口引脚设置为数字模式
// Set PIN D1 as output
TRISDbits.TRISD1 = 0;
PEIE = 1; /* 使能外设中断 */
RCIE = 1;
GIE = 1; /* 使能全局中断 */
while (1) {
// Toggle PIND1
LATDbits.LATD1 = !LATDbits.LATD1;
// Delay 500 milliseconds
__delay_ms(500);
}
}
本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!