基于ATtiny13的无级调光头灯程序

合集下载

基于单片机控制LED灯亮度调节 邓宇锋(修改)

基于单片机控制LED灯亮度调节 邓宇锋(修改)

基于单片机控制LED灯智能亮度调节系部:机电工程系学生姓名:***专业班级:电气11C3 班学号:*********指导教师:**2014年3月10日声明本人所呈交的基于单片机控制LED灯亮度调节,是我在指导教师的指导和查阅相关著作下独立进行分析研究所取得的成果。

除文中已经注明引用的内容外,本论文不包含其他个人已经发表或撰写过的研究成果。

对本文的研究做出重要贡献的个人和集体,均已在文中作了明确说明并表示谢意。

作者签名:日期:2014年3月10日摘要本文介绍LED灯智能亮度调节驱动电路设计,智能照明控制系统在确保灯具能够正常工作的条件下,给灯具输出一个最佳的照明功率,既可减少由于过压所造成的照明眩光,使灯光所发出的光线更加柔和,照明分布更加均匀,又可大幅度节省电能,智能照明控制系统节电率可达20%-40%。

智能照明控制系统它可在照明及混合电路中使用,适应性强,能在各种恶劣的电网环境和复杂的负载情况下连续稳定地工作,同时还将有效地延长灯具寿命和减少维护成本。

【关键词】:智能控制;LED;智能光补目录引言 (1)一、智能的概述 (2)(一)智能的定义 (2)(二)智能的分类 (2)二、LED发光二极管的认识 (2)(一)LED的构造 (2)(二) LED的发光原理 (3)(三)LED的优势 (3)三、LED亮度控制系统 (3)(一)脉冲宽度调制 (3)(二)调制LED的驱动电流 (3)(三)线性调光法 (3)四、单片机及程序设计 (3)(一)概述 (4)(二)单片机STC89C51芯片简介 (4)(三)程序 (7)此套控制分主程序与子程序,截取主程序代码在附件中。

(7)五、控制系统电路设计 (7)(一)LED驱动电路 (7)(二)光电传感器的选择 (8)(三)电气原理图 (9)六、实物调试 (9)总结 (1)参考文献 (2)谢辞 (3)附件 (4)引言智能一词最早出现在手机上,早在2001年,世界著名手机制造商诺基亚就发布了搭载塞班系统的智能手机。

基于AT Tiny13的智能点火控制器设计

基于AT Tiny13的智能点火控制器设计

基于AT Tiny13的智能点火控制器设计凌锋【摘要】本文介绍以AT Tiny13单片机为核心设计了小型汽油发动机使用的低成本的点火控制器,并进行硬件及软件结合设计,达到精确地控制点火提前角.此系统解决了无触点磁电机电容放电点火系统(CDI)和无触点蓄电池式晶体管点火系统低速断火和高速失火问题,并且具有降低油耗、降低成本优点.%This paper introduces the AT Tiny13 microcontroller as the core design of the ignition controller of low cost small gasoline engine used, and combined with the design of hardware and software, to achieve precise control of ignition advance angle. The system solves the problem of low speed fire and high speed misfire of contactless magnetic capacitor discharge ignition system (CDI) and contactless battery type transistor ignition system, and has the advantages of reducing fuel consumption and reducing cost.【期刊名称】《电子测试》【年(卷),期】2017(000)007【总页数】2页(P27-28)【关键词】点火控制器;点火提前角;ATTiny13【作者】凌锋【作者单位】丽水学院工学院,浙江丽水,323000【正文语种】中文点火器在汽油机中起着十分重要的作用,点火时刻的准确与否直接影响到汽油机的驱动动力和油耗。

基于单片机实现的普通灯泡调光控制器

基于单片机实现的普通灯泡调光控制器

基于单片机实现的普通灯泡调光控制器一、实验要求:用单片机控制一个普通灯泡的亮度,一路开关控制普通灯泡电源的通断,另外两路开关分别控制普通灯泡亮度的增加和减小。

二、调光控制器实验原理:在日常生活中,我们常常需要对灯光的亮度进行调节。

本调光控制器通过单片机控制双向可控硅的导通来实现白炽灯(纯阻负载)亮度的调整。

双向可控硅的特点是导通后即使触发信号去掉,它仍将保持导通;当负载电流为零(交流电压过零点)时,它会自动关断。

所以需要在交流电的每个半波期间都要送出触发信号,触发信号的送出时间就决定了灯泡的亮度。

调光的实现方式就是在过零点后一段时间才触发双向可控硅开关导通,这段时间越长,可控硅导通的时间越短,灯的亮度就越低;反之,灯就越亮。

三.硬件部分及实验原理图:控制部分:选择可多次写入的可编程器件——ATMEL的AT89C51单片机。

驱动部分:要驱动的是交流,可以用继电器或光耦+可控硅来驱动。

可控硅在电路中能够实现交流电的无触点控制,以小电流控制大电流,并且不象继电器那样控制时有火花产生,而且动作快、寿命长、可靠性高。

所以这里选用的是可控硅控制。

负载部分:本电路以单片机控制白炽灯的亮度变化。

(一)硬件设计1、I/O 通道的设计:(1)同步信号采集电路:由于系统采用的是延时给脉冲的工作方式,必须准确计算延时的时间,延时必须每次在工频信号的过零点开始算起,因此需准确采集工频信号的零点。

图中整流后的波形中的水平虚线表示光耦P521输入二极管的门限电压。

如图:P521引脚图整流输出过零点波形图脉冲对应工频信号的过零点。

此脉冲信号作为系统的中断输入(P3.2口),控制延时计算的开始。

(2)可控硅触发电路:系统采用双向可控晶闸管控制电路通断,给脉冲后管子导通,过零后自动关断。

L1_D是单片机输出的触发信号,该信号通过光控可控硅MOC3022去驱动可控硅BT136。

MOC3022是DIP-6封装的光控可控硅。

其1、2脚分别为二极管的正负极,4、6脚为输出回路的两端,3、5脚不用连接。

无极调光灯课件

无极调光灯课件
“0.01μ”:0.01μF, “4n7” :4.7nF=4700PF
无极调光灯
2)不标单位的直标法 当容量在1PF~105PF之间时,单位为PF
如:“2”:2PF “27”:27PF 当容量在105PF~1μF之间时,单位为μF
如:“0.047”:0.047μF
注:有时可以认为大于1的数,容量单位为PF;小于1 的数,容量单位为μF。
一种是应用自感作用的自 感线圈,
另一种是应用互感作用的变压器。
无极调光灯
(五)、二极管
(一)、二极管的符号
无极调光灯
(二)、二极管的种类
无极调光灯
(六)、三极管
(一)、三极管的符号
无极调光灯
(二)、三极管的种类
无极调光灯
三、晶闸管
可控硅是可控硅整流元件的简称,是一种具有三个PN 结的四层结构的大功率半导体器 件,一般由两晶闸管反向连接而成。它的功能不仅是整流,还可以用作无触点开关的 快速接通或切断;实现将直流电变成交流电的逆变;将一种频率的交流电变成另一种 频率的交流电等等
无极调光灯
(3)电解电容容量较大 电解电容容量较大,形似圆柱状,在外 壳封装上有极性标志,且容量的标识 方法是直接标在塑料外壳的表面上。 如:“1μF50V”:容量为1μF,耐压 值为50V
无极调光灯
(四)、电感器 电感器通常称电感线圈,是采用漆包线或纱布线一
圈接一圈地绕在绝缘管、磁芯(磁棒)或铁芯上的一 种元件,它是利用电磁感应原理制成的。在交流电路 中,线圈有阻碍交流电流通过的作用,而对稳定的直 流电流却不起作用,所以线圈在电路中起阻流、降压、 负载用。 常见的电感器有两大类:
无极调光灯
4、测量电感器
用万用表欧姆档测量其直流电阻,如果阻 值较小说明正常,如果阻值很大甚至指针不 摆动,说明线圈断线。

电灯无级PWM亮度调节

电灯无级PWM亮度调节

课程设计课程名称单片机原理及接口技术题目名称电灯无级PWM亮度调节学院信息工程学院专业班级应用电子技术2班学号姓名任课教师2015年01月16日广东工业大学课程设计任务书题目名称电灯无级PWM亮度调节学生学院信息工程学院专业班级信息工程(应用电子方向)12(2)班姓名学号一、课程设计的内容本次课程设计的内容从下面两个方面任选一个:一是在学院的单片机实验平台上进行,开发一个基于单片机与PWM技术的灯光调节系统,主要开发内容为按键定义、输入与防抖动技术、PWM调节技术以及显示技术等的程序设计。

二是利用51系列单片机及必要的外围芯片、输入输出等接口电路设计开发一个简易的单片机系统,在此基础上,自行设计一个单片机应用程序来实现一些实用的功能。

通过这些内容的设计、开发、安装、调试等一系列工作,熟练掌握单片机系统的开发流程与工作机理,加深对所学课程知识的理解与把握,为将来相关的研究开发工作打下坚实的基础。

二、课程设计的要求与数据1 全面掌握硬件结构与电路原理;2 自行设计开发、编辑、调试应用程序;3 必须有完善的功能介绍与调试过程说明;4 提供完整的软件流程框图。

5 提供完整的程序清单。

三、课程设计应完成的工作1 硬件理解与安装调试;2 软件设计与开发、调试;3 软硬件联合调试与实验;4 按照学校要求撰写并上交完整的课程设计报告5 完成课程设计答辩。

四、课程设计进程安排序号设计各阶段内容地点起止日期1 查找资料,熟悉硬件电路或实验平台的资源图书馆或实验1号馆4042015年1月5日-7日2 整体方案设计,输入输出通道定义(方案一)或硬件安装、调试与检查(方案二)宿舍或实验1号馆4041月8日-9日3 软件设计与流程图编写宿舍或实验1号馆404 1月10日4 程序编写宿舍实验1号馆4041月11日-12日5 软件调试,与硬件联合调试宿舍或实验1号馆404 1月13日6 撰写课程设计报告宿舍或实验1号馆4041月14日7 交课程设计报告实验1号馆404 1月15日-16日五、应收集的资料及主要参考文献[1] 吴宁. 80X86/Pentium 微型计算机原理及应用[M]. 北京:电子工业出版社,2004:1-249.[2] 蔡美琴. MCS-51系列单片机系统及其应用[M].北京:高等教育出版社,2003:1-169.[3]段晨东. 单片机原理与接口技术[M]. 北京: 清华大学出版社, 2013:1-333[4] 吴黎明等. 单片机实验指导书[M]. 广州:广东工业大学教材科,2014发出任务书日期: 2015 年 1 月 5 日指导教师签名:计划完成日期: 2015 年 1 月 16日基层教学单位责任人签章:目录目录 (1)第一章系统总体设计 (2)第一节概述 (2)第二节功能设计 (2)第三节功能实现 (2)第二章软件系统设计 (4)第一节工作原理 (4)第二节程序清单 (4)第三节程序流程图 (5)第四节程序源代码 (6)第三章调试结果 (10)第一节单元及系统测试 (10)第四章课程设计体会 (10)基于单片机与PWM技术的可调灯光系统第一章系统总体设计一概述PWM(Pulse Width Modulation),即脉冲宽度调制,简称脉宽调制,是一种对模拟信号电平进行数字编码的方法。

用电源开关实现LED灯泡无级调光

用电源开关实现LED灯泡无级调光

用电源开关实现LED灯泡无级调光
随着全球开始淘汰低效率的白炽灯,一个很大的白炽灯替代市场就随之出现,特别是在欧美家庭市场,因为很多的白炽灯都在利用TRIAC调光器进行调光。

尽管CFL节能灯由于与白炽灯的价差低而抢先吃到了这一蛋糕,但普遍相信具备调光能力的LED灯泡才是最终的替代产品。

由于欧美家庭很多都安装了TRIAC调光器,因此要顺利替代现有的白炽灯,LED灯泡必须支持TRIAC调光,这也是为什幺最近支持TRIAC调光的LED照明驱动方案很红火的一个主要原因。

 不过,凹凸科技(O2Micro)FAE总监和产品开发总监郭清泉指出:“我们应该看到的三个问题是:第一,TRIAC调光器有一个最大缺点,即功耗大,特别是在轻载时,只有约10%的效率,而PWM调光则要好很多,亮度降到50%时,还有约80%的效率。

第二,任何支持TRIAC调光的LED照明驱动方案都做不到支持市面上所有的TRIAC调光器。

第三,最大的LED照明灯具应用市场(即全球办公室照明市场)目前普遍采用荧光灯,其基础设施中没有TRIAC调光器,而这一市场将领先家庭LED照明市场启动。


 为了克服以上三个问题,O2Micro发明了独特的三段LED灯泡/灯管调光技术,采用了正在专利申请之中的模拟调光技术,它无需TRIAC调光器,只需利用墙上的电源开关就可以实现三段调光(100%,50%,20%),无需RF遥控电路,因此不仅调光成本可做得更低,而且还可以去掉遥控器。

 这种三段调光技术的效率甚至比PWM调光方法还好。

郭清泉表示:“OZ8022A和OZ9992都支持100%、60%和20%三段仿真调光功能,在。

基于51单片机的调光台灯的实验总结

基于51单片机的调光台灯的实验总结

基于51单片机的调光台灯的实验总结
基于51单片机的调光台灯的实验总结如下:
这个实验的主要目的是使用51单片机控制台灯的亮度,使其可以根据需要进行调光。

实验所需材料主要包括51单片机、可调电阻、MOS管、台灯等。

实验步骤如下:
1. 确保电路连接无误:将51单片机和其他电子元件按照电路图正确地连接在一起。

2. 编写程序:使用汇编语言或其他高级语言编写51单片机的控制程序,实现对台灯亮度的调节。

可以根据需要设置不同的亮度级别。

3. 烧录程序:将编写好的程序通过烧录器烧录到51单片机的存储器中。

4. 调试程序:将单片机与电路连接后,通过上电进行调试,检查台灯亮度是否可以通过单片机的控制进行调节。

5. 实验验证:使用可调电阻调节单片机控制的台灯的亮度,观察台灯的明暗程度是否随之变化。

6. 总结实验结果:根据实际观察和实验数据,总结实验结果,分析实验中可能出现的问题,并提出改进方案。

在实验中,需要注意安全问题,确保电路连接正确并符合相关安全标准。

同时,遵循实验的操作规范,做好实验记录和数据记录,以备后续分析和总结。

基于DS1302和Attiny13的LED定时调光器设计

基于DS1302和Attiny13的LED定时调光器设计

基于DS1302和Attiny13的LED定时调光器设计林方盛;江磊;刘木清【摘要】在LED路灯控制系统中常需要定时控制,而其中定时器的设计至关重要.通过对比,本文采用DS1302这款高性能、低功耗的RTC时钟芯片.本设计中介绍了整套定时器系统的结构,给出了Attiny13和DS1302接口电路以及软件程序,同时对DS1302烧写实时时间的模块进行软硬件部分的设计.整套系统通过LED路灯的定时开关和分时PWM调光达到节能的目的.【期刊名称】《照明工程学报》【年(卷),期】2013(024)004【总页数】5页(P85-88,103)【关键词】DS1302;Attiny13;定时器;PWM调光;LED【作者】林方盛;江磊;刘木清【作者单位】复旦大学电光源研究所,上海200433;复旦大学电光源研究所,上海200433;复旦大学电光源研究所,上海200433【正文语种】中文【中图分类】TM9231 引言随着经济的发展,节能减排和低碳经济已成为当今全球关注的热点。

而在照明领域,LED作为第四代照明光源,以其高效节能长寿命等诸多优点脱颖而出。

近几年在道路照明领域中LED的应用越来越多。

在路灯应用上,大部分城市在零点之后道路几乎空无一人,此时在低交通流量的道路上保持高亮度显然没有必要[1]。

因此对路灯亮度进行调节尤为重要,对节能减排也十分关键。

目前在LED路灯控制中,主要还是采用定时控制。

这种方式,按照定时器设定固定的时间对LED路灯实现定时自动开关和分时PWM调光控制,既节省了人力成本,又达到节能减排的目的。

目前的市场上的定时器方案良莠不齐,大部分随着使用时间的增长,同步性变差。

而好的经纬度定时器则价格昂贵,不太适合在路灯上大规模使用。

本文设计了一款基于DS1302和Attiny13的LED定时器来改进这些问题。

本文主要介绍了定时器的软硬件设计以及和上位机通讯的时间烧写模块的软硬件设计。

2 整体系统组成整个定时器系统结构如图1所示,主要包括上位机 (PC),与PC通过串口连接的实时时钟烧写模块,与烧写模块通过SPI口连接的定时器以及带PWM调光驱动的LED路灯。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

基于ATtiny13的无级调光手电筒程序市面上的头灯一般有强光、弱光、爆闪三个挡位,一个按钮来控制开/关和换挡,顺序是:开(强光)-〉弱光->闪烁->关,每次开/关灯需要按三次,非常不方便。

两年前改造的五挡调光头灯一直用的很好,操作简便又人性化。

近来比较空闲,突发DIY一个有无级调光功能的头灯想法。

于是在网上搜索合适DIY的头灯,搜索原则是散热性能好、能变焦、尽量是装两节18650电池的灯。

本人喜欢变焦灯,因为照射范围可调又均匀。

第一次购买的灯完全失败,散热极差,为了节省成本居然灯头的重要部件用的是硬塑料,直接丢掉。

第二次买的还好,惊喜的是他的控制芯片用的是CX2812,它的引脚与ATTiny13单片机类似,替换控制芯片,稍微改动电路板的布线就可以利用原配的控制板,避免了从头开始做控制板,省去了最繁琐的印刷电路板的制作了。

通过ATtiny13a单片机的编程实现了一下功能:1、按一次开灯,再按一次就关灯,解决了按三次关灯的不方便的问题。

2、开关灯保留了逐步亮和逐步暗的功能,此功能非常人性化,本人很喜欢。

具体实现如下:开灯的时候PWM信号的占空比从0开始逐步加到设定的亮度,关灯时候占空比逐步减到0。

3、无级调光:在灯亮状态下按住按钮,LED灯亮度增加或减少,亮度达到100%或10%时闪烁三次来提醒亮度已经达到了全亮或最暗,松开按钮就停止调光,一直按住就循环调光。

程序中利用了ATtiny13a的PWM、外部中断(PCINT0)、睡眠、看门狗和EEPROM的读写功能,基本上每一行都加了注释,对于初次接触ATtiny13的人来说应该有帮助。

图片1:头灯图片2:头灯控制板(此控制板网上也有卖的)图片3:程序调试电路图图片4:用面包板搭建程序调试电路图片5:基于ATTiny13A的控制板电路图图片6:修改后的ATTiny13A控制板图片7:18650电池下的待机电流为0.26uA。

程序编辑和编译工具用了CodeVisionAVR 2.04.4a,烧写工具用了progisp1.72。

程序源码:/********************************************************************** * 名称:LED控制程序* 描述:无级调光功能,单击开/关,长按无级调光* MCU :ATTiny13A* 晶振:RC 9.6MHz* 编译环境:CodeVisionAVR 2.04.4a* 版本:4.0 KEY用外部中断方式、增加睡眠功能、看门狗,8分频(4.6875KHz)* 外部中断服务程序=>PCINT0, 无级调光***********************************************************************/ #include <tiny13a.h>#include <delay.h>#define uchar unsigned char#define uint unsigned int#define KEY PINB.2 //tiny13第7脚,PCINT0中断#define LEDDRV PORTB.0 //tiny13第5脚#define KEY_DOWN 0 //按下按键#define LED_ON 0 //LED 亮#define LED_OFF 1 //LED 灭#define PWM_ON 0xc3 //PWM 启动#define PWM_OFF 0x03 //PWM 关闭#define MIN_VAL 0x1a //最小亮度#define MAX_VAL 0xff //最大亮度#define LONG_KEY 3 //长按键的时间#define ADDRESS 0x01 //保存挡位的地址uchar pwmVal = 0; //亮度值uint keytime = 0; //按键时间bit status = 0; //0为LED ON,1为LED OFFbit fangxiang = 0; //亮度增减方向/********************************************************************** * 描述:eeprom写一个字节数据* 参数:address--地址data--数据***********************************************************************/ void eeprom_write(uchar address,uchar data){//等待上一次写操作结束while(EECR&(1<<EEPE));//设置编程模式EECR=(0<<EEPM1)|(0>>EEPM0);//设置地址和数据寄存器EEAR = address;EEDR = data;//置位EEMPEEECR |= (1<<EEMPE);//置位EEWE,启动写操作EECR |= (1<<EEPE);}/*********************************************************************** * 描述:eeprom读一个字节数据* 参数:address--地址************************************************************************/ uchar eeprom_read(uchar address){//等待上一次写操作结束while(EECR&(1<<EEPE));//设置地址寄存器EEAR=address;//设置EERE以启动读操作EECR |= (1<<EERE);//自数据寄存器返回数据return(EEDR);}/*********************************************************************** * 描述:开启看门狗* 参数:无************************************************************************/ void WDT_on(void){// 看门狗设置//#asm("cli") // 关闭全局中断#asm("WDR") // 看门狗复位指令WDR用来复位看门狗定时器WDTCR=0x18; // 启动时序WDTCR |= (1<<WDCE) | (1<<WDE);//WDTCR=0x28; // 看门狗定时4s WDTCR = (1<<WDP3) | (1<<WDE);WDTCR = (1<<WDP3) | (1<<WDE); // 看门狗定时4s//#asm("sei") // 开启全局中断}/*********************************************************************** * 描述:关闭看门狗* 参数:无************************************************************************/ void WDT_off(void){// 看门狗设置//#asm("cli") // 关闭全局中断#asm("WDR") // 看门狗复位指令WDR用来复位看门狗定时器MCUSR &= ~(1<<WDRF); // 清除MCUSR 寄存器中WDRF// 在WDCE 与WDE 中写逻辑1,保持旧预分频器设置防止无意暂停WDTCR |= (1<<WDCE) | (1<<WDE);WDTCR = 0x00; // 关闭WDT//#asm("sei") // 开启全局中断}/*********************************************************************** * 描述:LED Flicker 闪烁* 参数:无************************************************************************/ void led_flicker(uchar data){uchar i;for(i=0; i<data; i++){OCR0A = 0x00;delay_ms(20);OCR0A = pwmVal;delay_ms(20);}}/*********************************************************************** * 描述:LED ON 开灯* 参数:无***********************************************************************/ void led_on(void){uchar i;TCCR0A = PWM_ON; //开启PWMfor (i=0; i<pwmVal; i++){OCR0A = i; //更改占空比delay_us(500);}//全亮时候PWM Offif (pwmVal >= MAX_VAL){TCCR0A = PWM_OFF;LEDDRV = LED_ON;}WDT_on(); //启动看门狗}/*********************************************************************** * 描述:LED OFF 关灯* 参数:无************************************************************************/ void led_off(void){uchar i;TCCR0A = PWM_ON; //开启PWMfor (i=pwmVal; i>0; i--){OCR0A = i; //更改占空比delay_us(500);}TCCR0A = PWM_OFF; //关闭PWMLEDDRV = LED_OFF;}/*********************************************************************** * 描述:LED 亮度增加* 参数:无***********************************************************************/ void led_zeng(void){TCCR0A = PWM_ON; //开启PWMfor (; pwmVal<MAX_VAL && KEY==KEY_DOWN; pwmVal++){OCR0A = pwmVal; //更改占空比delay_ms(2);}if(pwmVal>=MAX_VAL)led_flicker(3);}/*********************************************************************** * 描述:LED 亮度减少* 参数:无************************************************************************/ void led_jian(void){TCCR0A = PWM_ON; //开启PWMfor (; pwmVal>MIN_VAL && KEY==KEY_DOWN; pwmVal--){OCR0A = pwmVal; //更改占空比delay_ms(2);}if(pwmVal <= MIN_VAL)led_flicker(3);}/********************************************************************** * 描述:定时器中断服务函数* 输入:无***********************************************************************/ /*interrupt[TIM0_OVF] void timer0_ovf_isr(void){}*//********************************************************************** * 名称: 外部中断INT0服务程序* 功能:* 输入:无* 输出:无***********************************************************************//*interrupt [EXT_INT0] void int0_isr(void){}*//*********************************************************************** 名称: 中断PC_INT0服务程序* 功能:* 输入:无* 输出:无***********************************************************************/ interrupt [PC_INT0] void pc_int0_isr(void){if (KEY==KEY_DOWN) //判断是否按下键,KEY接地{delay_ms(5); //防抖延时for (keytime=0; (KEY==KEY_DOWN) && keytime<LONG_KEY; keytime++){keytime++;delay_ms(50); // 50ms}//长按逻辑处理while (keytime > LONG_KEY && KEY==KEY_DOWN && status == 1) //长按逻辑处理{//#asm("WDR") //喂狗if (pwmVal >= MAX_VAL)fangxiang = 1;if (pwmVal <= MIN_VAL)fangxiang = 0;if (fangxiang == 0)led_zeng();elseled_jian();fangxiang = ~fangxiang;delay_us(10);eeprom_write(ADDRESS, pwmVal); //写eeprom里的数据delay_us(100);//全亮时候PWM Offif (pwmVal >= MAX_VAL){TCCR0A = PWM_OFF;LEDDRV = LED_ON;}}//短按逻辑处理if (keytime > 0 && keytime <= LONG_KEY) //短按逻辑处理{if (status == 0) // LED NOled_on(); //开灯else if (status == 1) // LED OFFled_off(); //关灯status = ~status;}}}/*********************************************************************** 名称: Main()* 功能: 主函数* 输入:无* 输出:无***********************************************************************/void main(void){// Crystal Oscillator division factor: 8#pragma optsize-CLKPR=0x80;CLKPR=0x03;#ifdef _OPTIMIZE_SIZE_#pragma optsize+#endif// I/O端口的初始化DDRB = 0x01; // PB.1输入,PB.0输出PORTB = 0x05; // PB.1上拉电阻,PB.0高电平//PWM 初始化(TCCR0A=0xC3; 占空比相反时TCCR0A = 0x83 0<<COM0A0)//TCCR0A |= (1<<COM0A1)|(0<<COM0A0)|(1<<WGM01)|(1<<WGM00);TCCR0A = PWM_ON; //开启PWMTCCR0B |= (0<<WGM02)|(0<<CS02)|(1<<CS01)|(0<<CS00); //8分频(4.6875KHz)OCR0A = 0x00;TCNT0 = 0x00; // T/C0计数寄存器初值TCCR0A = PWM_OFF; // 关闭PWM// 外部中断初始化设置//MCUCR |= (1<<ISC01) | (0<<ISC00); // INT0 为下降沿时产生中断请求//GIMSK |= (1<<INT0); // 允许INT0 产生中断GIMSK |= (1<<PCIE); // 允许PCINT0 产生中断PCMSK |= (1<<PCINT2); //引脚变化使能- PB.2(第7引脚)// 读取eeprom中的亮度档位数据pwmVal = eeprom_read(ADDRESS); //读取eeprom里的数据delay_us(100); //延时10usif (pwmVal<MIN_VAL || pwmVal >=MAX_VAL) //eeprom无数据的话设为最高档位pwmVal = MAX_VAL;if (pwmVal >= MAX_VAL)fangxiang = 1; //亮度减elsefangxiang = 0; //亮度增// 睡眠模式初始化MCUCR|=(1<<SM1)|(0<<SM0); // 掉电模式MCUCR|=(1<<SE); // 休眠使能#asm("sei") // 打开全局中断#asm ("sleep") //睡眠#asm("NOP");while(1){#asm("WDR") //喂狗if (status == 0) //关机的话睡眠{TCCR0A = PWM_OFF; //关闭PWMWDT_off(); // 关闭WDT(关闭看门狗)#asm ("sleep")#asm("NOP");}delay_ms(10);}//while}。

相关文档
最新文档