📄 timer2.c
字号:
/******************************************/
//文件名:Timer2.c
//功能: T/C2和INT0的应用
//作者: young
//时间: 2006.10.9
//目标MCU:ATmega8
//晶振: 8MHZ
/******************************************/
#include <iom8v.h>
#include <macros.h>
#include "Delay.h"
#define U8 unsigned char
#define U16 unsigned int
U8 KeyDown;
//初始化端口
void init_port(void)
{
DDRB = 0x08;
PORTB = 0xFF;
PORTC = 0x0F;
DDRC = 0xFF;
PORTD = 0x04;
DDRD |= 0xFF;
}
//初始化外部中断
void init_int(void)
{
MCUCR |= 0x02; //INT0下降沿触发
GICR |= 0x40; //打开INT0中断
GIFR |= 0x40; //清除INT0中断标志位
}
//初始化T/C2
void init_timer2(void)
{
TCCR2 = 0x00; //T/C2工作于定时方式,先停止T/C0
TCNT2 = 0x00; //计数初始值0
OCR2 = 0x00; //设置比较参考值
TIMSK&= 0x3F; //关闭TOV2中断
}
//初始化所以硬件
void init_devices(void)
{
CLI(); //关闭全局中断
init_port();
init_int();
init_timer2();
SEI(); //打开全局中断
}
//INT0中断函数
#pragma interrupt_handler int0_fun:iv_INT0
void int0_fun(void)
{
KeyDown++;
}
//主函数
void main(void)
{
init_devices();
while(1)
{
switch(KeyDown)
{
case 1:
//打开T/C2,选择相位可调PWM模式
//COM2[1:0]=3正向比较输出,系统时钟64分频
TCCR2|=(1<<WGM20)|(1<<COM21)|(1<<COM20)|(1<<CS22);
KeyDown++;
break;
case 2: //恒定第电平
OCR2 = 0x00;
break;
case 3: //恒定高电平
OCR2 = 0xFF;
break;
case 4: //高低电平占空比200:56
OCR2 = 56;
break;
case 5: //高低电平占空比56:200
OCR2 = 200;
break;
case 6:
TCCR2=0x00; //关闭T/C0
KeyDown=0;
break;
default:
KeyDown=0;
break;
}
PORTC=KeyDown;
delay_ms(10);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -