2024-09-07
单片机
00

这段代码是用于PIC16F1719单片机的一个简单例子,主要展示了如何配置和使用内部振荡器,并且通过简单的循环控制一个LED灯的闪烁。以下是对代码的逐步讲解:

  1. 配置位设置
    使用#pragma语句为PIC16F1719单片机的各种功能模块进行初始化配置,例如:

    • 选择内部振荡器(INTOSC)作为系统时钟源。
    • 禁用看门狗定时器(WDTE = OFF)。
    • 使能MCLR引脚作为外部复位引脚(MCLRE = ON)。
    • 使能锁相环(PLL)以将系统频率提高到32MHz(PLLEN = ON)。
  2. 系统振荡器频率定义
    定义了一个宏_XTAL_FREQ,它代表了系统时钟的频率。在这段代码中,系统时钟频率为32MHz。

  3. 主程序初始化

    • 将内部振荡器INTOSC设置为8MHz,并启用4x PLL,使系统时钟达到32MHz。
    • 禁用了所有的中断功能。
    • 将A、B、C端口的所有引脚配置为数字模式(关闭模拟功能)。
  4. 设置端口D1为输出
    使用TRISDbits.TRISD1 = 0将D端口的第一个引脚(D1)配置为输出。

  5. LED闪烁逻辑

    • 在主循环中,通过切换LATDbits.LATD1的状态来控制D1引脚的电平变化,从而实现LED的闪烁。
    • 使用__delay_ms(500)函数实现了500毫秒的延迟,控制LED每隔500毫秒切换一次状态,形成闪烁效果。
  6. 中断设置
    虽然中断功能已经使能,但这段代码目前并未使用任何中断功能。可以在未来扩展中引入中断处理。

总结:这个程序展示了如何使用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); } }
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay

本文作者:Dong

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!