四、ATMEGA16的定时/计数器
四—(02)、T/C1定时器A/B比较匹配中断和溢出中断实现LED亮度自动调节
啊~~~~~
图~~~~~
这里没有什么要注意的,只要理解并会控制T/C1的两个比较匹配中断A/B和溢出中断,That's all ~~
然后就是仿真图片~
哈(有几点我也不是很清楚~~哎~~~不过不重要,它出来了~~哈
//------------------------------------------------------------------------------
//通过比较匹配中断和定时器溢出中断(T1)来控制LED亮度的自动变化
//定时器T1的定时长度设置为32.768ms,定时器T1的比较匹配寄存器设置为10位快速PWM模式
//在定时器T1发生溢出中断之前,首先比较中断触发,点亮LED灯;定时器T1继续运行直到溢出,
//将LED关闭。主程序不断改变着比较匹配值(从接近最小值0到接近最大值1023),因此输出的脉宽
//(既LED的亮度)会自动变化。
//由于定时器T1具有2个比较匹配寄存器(OCR1A、OCR1B),既可实现2个LED灯的自动变化
#include"ioavr.h"
#include"intrinsics.h"
#include"Delay.h"
typedef unsigned char uchar;
typedef unsigned int uint;
#define CPL_BIT(x,y) (x^=(1<
//------------------------------------------------------------------------------
//端口定时函数
void port_init()
{
DDRB=0XFF;
PORTB=0XFF;
}
//------------------------------------------------------------------------------
//T1的初始化函数
void timer1_init()
{
OCR1B=0X00; //stop
TCNT1H=0X00; //定时器初值为0
TCNT1L=0X00;
OCR1AH=0X03; //由于工作在10位快速PWM模式计数上线值TOP为0X3FF(这个我不知道到底需不需要设置,是不是体统自己就设置好了~~~)还有就是它如果溢出呢?大于0X03FF?会怎么样?
OCR1AL=0XFF;
OCR1BH=0X03;
OCR1BL=0XFF;
TCCR1A=0X03; //设置A/B端口为普通端口操作,10位快速PWM模式,T/C1的时钟源为来自预分频器的256分频
TCCR1B=0X0C;
}
//------------------------------------------------------------------------------
//芯片初始化函数
void device_init()
{
__disable_interrupt(); //disable all interrupts
port_init();
timer1_init();
TIMSK=0X1C; //T/C1输出比较A/B匹配中断使能以及溢出中断使能
__enable_interrupt();
}
//------------------------------------------------------------------------------
//main
void main()
{
device_init();
while(1)
{
delay_s(1); //延时,有益处~~~!最大延时我还不知道~~~
//--------------------------------------------------------------------------
//flag_a=1的时候OCR1A+=20,如果OCR1A>1000,清零flag_a
if(GET_BIT(flag_a,0)==1)
OCR1A+=20;
if(OCR1A>1000)
CLR_BIT(flag_a,0);
//--------------------------------------------------------------------------
//flag_a=0的情况
if(GET_BIT(flag_a,0)==0)
OCR1A-=20;
if(OCR1A<20)
SET_BIT(flag_a,0);
//--------------------------------------------------------------------------
//flag_b=1的情况
if(GET_BIT(flag_b,0)==1)
OCR1B+=10;
if(OCR1A>1000)
CLR_BIT(flag_b,0);
//--------------------------------------------------------------------------
//flag_b=1的情况
if(GET_BIT(flag_b,0)==0)
OCR1B-=10;
if(OCR1B<10)
SET_BIT(flag_b,0);
}
}
//------------------------------------------------------------------------------
//TIMER1_COMPA
#pragma vector=TIMER1_COMPA_vect
__interrupt void timer1_compa()
{
CLR_BIT(PORTB,0);
}
//------------------------------------------------------------------------------
//TIMER1_COMPB
#pragma vector=TIMER1_COMPB_vect
__interrupt void timer1_compb()
{
CLR_BIT(PORTB,7);
}
//------------------------------------------------------------------------------
//TIMER1_OVF
#pragma vector=TIMER1_OVF_vect
__interrupt void timer1_ovf()
{
SET_BIT(PORTB,0);
SET_BIT(PORTB,7);
}
上一篇:AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—03
下一篇:AVR单片机(学习ing)—(四)、ATMEGA16的定时/计数器—01
推荐阅读最新更新时间:2024-03-16 15:46