pic单片机实现按键按下后松开,灯开始闪烁1s一次用定时器实现延时
时间: 2024-06-11 22:10:20 浏览: 187
单片机定时器实现灯的闪烁功能
以下是使用PIC单片机实现按键按下后松开,灯开始闪烁1秒一次的代码:
```c
#include <xc.h>
// 配置寄存器
#pragma config FOSC = INTOSCIO // 内部振荡器
#pragma config WDTE = OFF // 禁用看门狗定时器
#pragma config PWRTE = OFF // 禁用上电复位定时器
#pragma config MCLRE = OFF // MCLR引脚作为输入
#pragma config CP = OFF // 禁用代码保护
#pragma config CPD = OFF // 禁用数据保护
#pragma config BOREN = OFF // 禁用低压复位
#pragma config IESO = OFF // 禁用内部/外部切换
#pragma config FCMEN = OFF // 禁用失效时钟监测
// 定义延时函数
void delay(unsigned int milliseconds) {
unsigned int i;
for (i = 0; i < milliseconds; i++) {
__delay_ms(1); // 延时1毫秒
}
}
void main() {
// 配置GPIO
TRISAbits.TRISA0 = 1; // RA0作为输入
TRISAbits.TRISA1 = 0; // RA1作为输出
// 配置定时器
T1CONbits.TMR1CS = 0; // 内部时钟源
T1CONbits.T1CKPS = 0b11; // 1:8预分频
T1CONbits.nT1SYNC = 1; // 不同步外部时钟
TMR1 = 0; // 初始化定时器
PIE1bits.TMR1IE = 1; // 允许定时器1中断
INTCONbits.PEIE = 1; // 允许外部中断
INTCONbits.GIE = 1; // 允许全局中断
// 主循环
while (1) {
if (PORTAbits.RA0 == 0) { // 检测按键是否按下
delay(50); // 延时50毫秒
if (PORTAbits.RA0 == 0) { // 再次检测按键是否按下
T1CONbits.TMR1ON = 1; // 启动定时器1
while (PORTAbits.RA0 == 0); // 等待按键松开
T1CONbits.TMR1ON = 0; // 停止定时器1
PORTAbits.RA1 = 0; // 关闭灯
}
}
}
}
// 定时器1中断服务程序
void interrupt isr() {
if (PIR1bits.TMR1IF) { // 检测定时器1中断标志位
PIR1bits.TMR1IF = 0; // 清除定时器1中断标志位
PORTAbits.RA1 = !PORTAbits.RA1; // 翻转灯的状态
TMR1 = 15536; // 重新加载定时器1
}
}
```
说明:
1. 首先配置了PIC单片机的各种寄存器和GPIO口。
2. 然后定义了延时函数,用于实现延时功能。
3. 在主循环中,首先检测按键是否按下,如果按下则延时50毫秒,再次检测按键是否按下,如果仍然按下则启动定时器1,并等待按键松开。如果按键松开,则停止定时器1并关闭灯。
4. 定时器1中断服务程序中,首先检测定时器1中断标志位,如果标志位为1则翻转灯的状态,重新加载定时器1,然后清除定时器1中断标志位。
5. 定时器1的时间间隔为1秒,因为定时器1的时钟源频率为Fosc/4,而PIC单片机默认使用4MHz的内部振荡器,所以定时器1的时钟频率为1MHz,预分频为8,所以定时器1的每个计数周期为8us,当定时器1的计数器达到15536时,即1秒钟已经过去,定时器1中断标志位被置为1,进入中断服务程序。
阅读全文