您的位置 首页 应用

根据选用ATMEGA16单片机的守时计数器,完成LED亮度主动调理

基于采用ATMEGA16单片机的定时计数器,实现LED亮度自动调节-ATMEGA16的定时/计数器

T/C1定时器A/B比较匹配中断和溢出中断实现LED亮度自动调节。

这里没有什么要注意的,只要理解并会控制T/C1的两个比较匹配中断A/B和溢出中断。

ATMEGA16的守时/计数器

T/C1守时器A/B比较匹配中止和溢出中止完成LED亮度主动调理。

这儿没有什么要注意的,只需了解并会操控T/C1的两个比较匹配中止A/B和溢出中止。

然后便是仿真图片~

//——————————————————————————

//经过比较匹配中止和守时器溢出中止(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 intuint;

#define CPL_BIT(x,y)(x^=(1《#define CLR_BIT(x,y)(x&=~(1《#define SET_BIT(x,y)(x|=(1《#define GET_BIT(x,y)(x&(1《ucharflag_a=1,flag_b=0;

//——————————————————————————

//端口守时函数

voidport_init()

{

DDRB=0XFF;

PORTB=0XFF;

}

//——————————————————————————

//T1的初始化函数

voidtimer1_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;

}

//——————————————————————————

//芯片初始化函数

voiddevice_init()

{

__disable_interrupt();//disable all interrupts

port_init();

TImer1_init();

TIMSK=0X1C;//T/C1输出比较A/B匹配中止使能以及溢出中止使能

__enable_interrupt();

}

//——————————————————————————

//main

voidmain()

{

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 voidtimer1_compa()

{

CLR_BIT(PORTB,0);

}

//——————————————————————————

//TIMER1_COMPB

#pragma vector=TIMER1_COMPB_vect

__interrupt voidtimer1_compb()

{

CLR_BIT(PORTB,7);

}

//——————————————————————————

//TIMER1_OVF

#pragma vector=TIMER1_OVF_vect

__interrupt voidtimer1_ovf()

{

SET_BIT(PORTB,0);

SET_BIT(PORTB,7);

}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/yingyong/347152.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部