pic单片机定时器t2实现:如果1灯灭,2灯亮,3灯灭,按按键后3灯开始1s闪一次,如果5s内按键再次按下,3灯常亮,否则停止闪烁,3灯熄灭
时间: 2023-12-26 11:53:51 浏览: 135
最新单片机仿真 用定时器T1中断控制两个LED以不同周期闪烁
5星 · 资源好评率100%
以下是使用PIC单片机定时器T2实现题目要求的代码:
```C
#include <pic.h>
// 配置寄存器
__CONFIG(0x3F32);
// 定义引脚
#define LED1 RA0
#define LED2 RA1
#define LED3 RA2
#define KEY RB0
// 定义变量
unsigned int count = 0; // 定时器计数器
bit key_flag = 0; // 按键标志位
bit flash_flag = 0; // 闪烁标志位
bit flash_state = 0; // 闪烁状态
// 定时器T2中断服务函数
void interrupt T2_ISR(void)
{
if (TMR2IF) // 判断T2中断标志位是否置位
{
TMR2IF = 0; // 清除T2中断标志位
TMR2 = 131; // 重新赋初值
count++; // 定时器计数器加1
if (count >= 500) // 1s中断一次
{
count = 0; // 计数器清零
flash_state = !flash_state; // 闪烁状态取反
}
}
}
void main()
{
// 初始化
TRISA = 0b000; // 将RA0、RA1、RA2设为输出
TRISB = 0b001; // 将RB0设为输入
PORTA = 0b000; // 初始状态所有LED灯熄灭
PORTB = 0b001; // 配置RB0为上拉输入
// 配置定时器T2
T2CON = 0b00000110; // TMR2ON=1,T2CKPS=4
PR2 = 125; // PR2=125,Fosc=4MHz,分频系数为16,T=2us,T2=0.5ms
TMR2 = 131; // 初值为131,T2=0.5ms
TMR2IE = 1; // 允许T2中断
PEIE = 1; // 允许外部中断
GIE = 1; // 允许全局中断
while (1)
{
if (KEY == 0) // 检测按键是否按下
{
__delay_ms(20); // 延时去抖
if (KEY == 0) // 确认按键按下
{
key_flag = 1; // 标志位置位
}
}
if (key_flag && !flash_flag) // 按键按下且不在闪烁状态
{
LED1 = 0;
LED2 = 1;
LED3 = 0; // 2灯亮,其余灯熄灭
__delay_ms(20); // 延时去抖
if (KEY == 0) // 检测按键是否仍然按下
{
__delay_ms(5000); // 等待5s
if (KEY == 0) // 检测是否再次按下按键
{
LED1 = 0;
LED2 = 0;
LED3 = 1; // 3灯常亮
flash_flag = 0; // 停止闪烁
}
else
{
LED1 = 0;
LED2 = 0;
LED3 = 0; // 所有灯熄灭
flash_flag = 0; // 停止闪烁
}
}
else
{
flash_flag = 1; // 进入闪烁状态
}
key_flag = 0; // 标志位清零
}
if (flash_flag) // 闪烁状态
{
LED1 = 0;
LED2 = 0;
LED3 = flash_state; // 3灯闪烁
}
}
}
```
阅读全文