历史上的今天
返回首页

历史上的今天

今天是:2025年02月03日(星期一)

2020年02月03日 | 基于采用ATMEGA16单片机的定时计数器,实现LED亮度自动调节

2020-02-03 来源:elecfans

ATMEGA16的定时/计数器


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


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


然后就是仿真图片~

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

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

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

//------------------------------------------------------------------------------

//通过比较匹配中断和定时器溢出中断(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);

}

推荐阅读

史海拾趣

芯佰微(Corebai)公司的发展小趣事

芯佰微始终将品质管理作为公司的核心工作之一。公司建立了严格的质量管理体系,从原材料采购到产品生产、测试、包装等各个环节都进行严格的质量控制。同时,芯佰微也非常注重客户服务,始终将客户的需求放在首位,及时解决客户在使用过程中遇到的问题。这些措施使得芯佰微赢得了客户的广泛信任和好评。

D3 Semiconductor公司的发展小趣事

在全球化的大背景下,D3 Semiconductor积极拓展国际市场。除了与贸泽电子的合作外,公司还与多家国际知名的电子企业建立了合作关系,将产品推向全球各地。同时,D3 Semiconductor还加强了在国际市场的营销和品牌建设,提高了公司的知名度和美誉度。这一系列的努力使D3 Semiconductor在国际市场上取得了显著的成绩,也为公司的未来发展奠定了坚实的基础。

Amphion Semiconductor Ltd公司的发展小趣事

在不断发展壮大的过程中,D3 Semiconductor逐渐将业务拓展至电机控制领域。公司开发的功率MOSFET产品,在电机控制应用和电源中表现出色,提供了更高的效率、集成和性能。这一领域的拓展不仅丰富了D3 Semiconductor的产品线,也进一步巩固了公司在电子行业中的地位。

DRI Relays Inc公司的发展小趣事

DRI Relays Inc公司成立于XX年代,当时电子继电器市场正处于快速发展阶段。公司创始人XXX凭借对市场趋势的敏锐洞察,决定投身于这一领域。然而,创业之初,公司面临资金短缺、技术瓶颈和市场竞争激烈等多重挑战。为了突破困境,XXX带领团队日夜兼程地研发新产品,不断改进技术,同时积极寻找投资者。在一次行业展会上,公司的新产品因其独特的设计和高性能吸引了众多客户的关注,为公司赢得了宝贵的订单和资金支持。

Anytek Technology Corporation Ltd公司的发展小趣事

Anytek Technology Corporation Ltd自创立之初,便敏锐地捕捉到了车载电子产品的市场潜力。2003年,公司果断进军车载及行车记录仪领域,凭借前瞻性的市场洞察力和技术积累,迅速在行业内崭露头角。当时,随着汽车保有量的不断增加,行车记录仪作为保障行车安全、记录行车过程的重要设备,市场需求日益旺盛。Anytek凭借高品质的产品和专业的服务,赢得了广大消费者的信任和好评。

振华(CEC)公司的发展小趣事

振华深知企业文化和员工激励对于企业发展的重要性。因此,公司注重企业文化的建设和传承,形成了具有振华特色的企业文化体系。同时,公司还采取多种措施激励员工积极投入工作,提高员工的工作积极性和创造力。通过员工培训和晋升机制等制度的完善和实施,振华不仅吸引了大量优秀人才加入企业,还为企业的发展提供了坚实的人才保障。

问答坊 | AI 解惑

PROTEL视频教程PCB部分

绝对值得一下,因为现在免费的视频教程不多而且不容易下…

查看全部问答>

wdm驱动的INF的AddService节中的StartType没有用,怎么办?

我本想开机的时候,执行一下PCI驱动中的DriverEntry(), 试着改变了inf中的StartType的值,0,1,2都试验了,但是好像都没有执行DriverEntry! 应该怎么解决? 但是NT驱动程序,在注册表里面改Start的值,开机的时候会进DriverEntry!…

查看全部问答>

问个VCE3.0下消息响应的问题

提示的错误是:error LNK2001: unresolved external symbol \"protected: long __cdecl GPSResd1::OnGpsDeviceStateNotify(unsigned int,long)\" (?OnGpsDeviceStateNotify@GPSResd1@@IAAJIJ@Z) 程序是这么写的:         Po ...…

查看全部问答>

急救:WM5注册表问题,在线等!!

我用EVC4写的程序 可以修改WM5的注册表 就是Today下面的 用我写的程序修改后 用EVC自带的注册表编辑器查看显示修改是正确地 但是 只要一重启 就还原了 不知道这个问题怎么解决 谢谢了 ps 最好不要用破解注册表这种办法…

查看全部问答>

LED产品质量分析和判断的杠杆

replyreload += \',\' + 706994;Timson,如果您要查看本帖隐藏内容请回复…

查看全部问答>

关于中断的疑问

   在STM32中,   假设我有一个定时中断,进入中断后清除标志位开始执行中断服务程序,如果在中断服务程序未执行完之前定时时间到,系统再次置位了中断标志位,系统是跳到该中断的入口地址(中断自己嵌套自己) ...…

查看全部问答>

是否有人做过”银行排队叫号系统“

本帖最后由 paulhyde 于 2014-9-15 03:53 编辑 如题,论坛里有木有人做过这个啊,最近在跟同学弄这个,希望做过的朋友们能分享下你们存的资料什么的,谢了~  …

查看全部问答>

2013专科题分享

本帖最后由 paulhyde 于 2014-9-15 03:01 编辑 赛题分享    …

查看全部问答>

【晒样片】+TI申请样片就是这么简单。。。。简单几步,样片到手。。。。

本帖最后由 huixianfxt 于 2014-7-28 16:58 编辑 1.首先你要注册一个ID呢,那么就登陆官网开始吧。。。按箭头方向操作就是了呢! 接着就转到了这里了呢!如果是新用户就注册一下呢,不是新用户直接输入邮箱,密码便可以了呢! 其实注册还是 ...…

查看全部问答>