




已阅读5页,还剩5页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于ATtiny13的手电筒(头灯)控制电路和程序 本人有一个用一节18650电池、带变焦的头灯,该头灯有强光、弱光和闪烁三个档,用Q5 LED,一个按钮来控制开/关和换档,顺序是:开(强光)-弱光-闪烁-关。但功能和档位不太满意,于是用ATtiny13单片机制作一个控制电路替换原有的控制器。通过ATtiny13a单片机的编程实现了一下功能:1、按一次开灯,再按一次就关灯,解决了按三次关灯的问题。2、开灯后长按1.5秒以上并进入设定亮度模式,闪烁三次来提示。3、亮度设定共有5个档位,20%、40%、60%、80%、100% 每按一次加一个档,到头再按循环。4、在设定模式下长按1.5秒以上便推出设定模式,闪烁三次来提示。5、退出设定模式时候亮度值保存在EEPROM,这样就拿掉电池也不怕丢设定值,下次开灯直接就是上次设定值了。6、开灯时亮度逐渐变亮到设定值,关灯时亮度逐渐变暗 ,最终灭掉,此功能为独创,是为了减少对眼睛的刺激。设定值为100%亮度的时候,约1秒内亮度从0%开始逐渐达到100%的亮度,关灯相反、约1秒内亮度从100%开始逐渐减到0%。手电筒控制电路如下:以下是程序,利用了ATtiny13a的PWM、外部中断、睡眠、看门狗和EEPROM的读写功能,基本上每一行都加了注释,对于初次接触ATtiny13的人来说应该有帮助的。流程图:程序源代码:/* 名称 :LED控制程序* 描述 :调光设置功能* MCU :ATTiny13A* 晶振 :RC 9.6MHz* 编译环境 :CodeVisionAVR 2.04.4a* 版本 :3.0 KEY用外部中断方式、增加睡眠功能、修改看门狗,8分频(4.6875KHz)*/#include /#include #define uchar unsigned char#define uint unsigned int#define KEY PINB.1 /tiny13第6脚,INT0 外部中断#define LEDDRV PORTB.0 /tiny13第5脚#define LEDDRV2 PORTB.2 /tiny13第7脚(指示灯)#define MAX_STATE 5u /最多档位数#define LONG_KEY 15 /长按键的时间#define ADDRESS 0x01 /保存档位的地址/* 变量定义 */uchar pwm=0x20,0x40,0x60,0x80,0xA0,0xC0,0xE0,0xFF;uchar pwm=0x20,0x40,0x80,0xC0,0xFF; /亮度值uchar pwmVal = 0; /亮度档位uchar status = 0; /0为LED OFF,1为LED ONuchar mode = 0; /0为使用模式,1为设置模式uint keytime = 0; /按键时间/* * 描述 :软件延时函数(RC 9.6MHz)* 输入 :延时毫秒数*/ void delayMs(uint n) uint i; uint j; for (i=0; in; i+) for (j=0; j137 ; j+) /RC 9.6MHz时候延时1MS #asm(nop)/* 名称 : init_devices()* 功能 : 端口、定时器、PWM初始化* 输入 :无* 输出 :无*/void init_devices(void) / Crystal Oscillator division factor: 8 #pragma optsize- CLKPR=0x80; CLKPR=0x03; #ifdef _OPTIMIZE_SIZE_ #pragma optsize+ #endif / I/O口的初始化 DDRB = 0x01; / PB.0输出(P5),PB.1输入(P6),PB.2输出(P7), PB.3输入(P2) PORTB = 0x00; / PB.2输出 / PWM 初始化 / TCCR0A BIT 7 6 5 4 3 2 1 0 / COM0A1 COM0A0 COM0B1 COM0B0 - - WGM01 WGM00 /TCCR0A=0x83; / 开启PWM, 比较匹配发生时OC0A 清零 /TCCR0A = 0x03; / 关闭PWM TCCR0A |= (1COM0A1)|(0COM0A0)|(1WGM01)|(1WGM00); /TCCR0A=0x83; TCCR0B |= (0WGM02)|(0CS02)|(1CS01)|(0CS00); /8分频(4.6875KHz) /TCCR0B=0x01; / 无预分频 OCR0A = 0x00; TCNT0 = 0x00;/ T/C0计数寄存器初值 TCCR0A = 0x03; / 关闭PWM / 外部中断初始化设置 /MCUCR = 0x02; / INT0 为下降沿时产生中断请求 /MCUCR |= (1ISC01)|(0ISC00); / INT0 为下降沿时产生中断请求 /GIMSK = 0x40; / 允许 INT0 产生中断 GIMSK |= (1INT0); / 允许 INT0 产生中断 /TIMSK0=(0OCIE0B)|(0OCIE0A)|(0TOIE0); /#asm(sei) / 睡眠模式初始化 MCUCR|=(1SM1)|(0SM0); / 掉电模式 MCUCR|=(1SE); / 睡眠使能 /GIMSK |=(1INT0); /#asm(sei) /#asm (sleep) / 睡眠 /* * 描述:开启看门狗* 参数:无*/void WDT_on(void) / 看门狗设置 /#asm(cli) / 关闭全局中断 #asm(WDR) / 看门狗复位指令WDR用来复位看门狗定时器 WDTCR=0x18; / 启动时序 WDTCR |= (1WDCE) | (1WDE); /WDTCR=0x28; / 看门狗定时4s WDTCR = (1WDP3) | (1WDE); WDTCR = (1WDP3) | (1WDE); / 看门狗定时4s/WDTCR = 0x00;/ 关闭WDT /#asm(sei) / 开启全局中断 /* * 描述:关闭看门狗* 参数:无*/void WDT_off(void) / 看门狗设置 /#asm(cli) / 关闭全局中断 #asm(WDR) / 看门狗复位指令WDR用来复位看门狗定时器 MCUSR &= (1WDRF); / 清除MCUSR 寄存器中WDRF /* 在WDCE 与WDE 中写逻辑1,保持旧预分频器设置防止无意暂停 */ WDTCR |= (1WDCE) | (1WDE);WDTCR = 0x00;/ 关闭WDT /#asm(sei) / 开启全局中断/* * 描述:进入睡眠* 参数:无*/ void sleep(void) WDT_off();/ 关闭WDT(关闭看门狗) / 睡眠模式初始化 /MCUCR|=(1SM1)|(0SM0); / 掉电模式 /MCUCR|=(1SE); / 睡眠使能 /GIMSK |=(1INT0); #asm(sei) / 开启全局中断 #asm(nop) #asm (sleep) / 睡眠 #asm(nop) #asm(cli) / 关闭全局中断 WDT_on(); / 启动看门狗 /* * 描述:eeprom写一个字节数据* 参数:address-地址 data-数据*/ void eeprom_write(uchar address,uchar data) /等待上一次写操作结束 while(EECR&(1EEPE); /设置编程模式 EECR=(0EEPM0); /设置地址和数据寄存器 EEAR = address; EEDR = data; /置位EEMPE EECR |= (1EEMPE); /置位EEWE,启动写操作 EECR |= (1EEPE); /* * 描述:eeprom读一个字节数据* 参数:address-地址*/ uchar eeprom_read(uchar address) /等待上一次写操作结束 while(EECR&(1EEPE); /设置地址寄存器 EEAR=address; /设置EERE以启动读操作 EECR |= (1EERE); /自数据寄存器返回数据 return(EEDR); /* * 描述:LED ON 开灯* 参数:无 */ void led_on(void) uchar i; TCCR0A = 0x83; /开启PWM for (i=0; i0; i-) OCR0A = i; /更改占空比 delayMs(5); TCCR0A = 0x03; /关闭PWM LEDDRV = 0; sleep(); / 关灯进入睡眠 /* * 描述:LED Flicker 闪烁* 参数:无*/ void led_flicker(void) OCR0A = 0x00; delayMs(200); OCR0A = pwmpwmVal; delayMs(200); OCR0A = 0x00; delayMs(200); OCR0A = pwmpwmVal; delayMs(200); OCR0A = 0x00; delayMs(200); OCR0A = pwmpwmVal; /* 名称 : 外部中断服务程序* 功能 : * 输入 :无* 输出 :无*/interrupt EXT_INT0 void int0_isr(void) /函数体 /* 名称 : Main()* 功能 : * 输入 :无* 输出 :无*/void main(void) init_devices(); /调用初始化函数 / 读取eeprom中的亮度档位数据 delayMs(10); /延时10ms pwmVal = eeprom_read(ADDRESS); /读取eeprom里的数据 delayMs(10); if (pwmVal = MAX_STATE) /eeprom无数据的话设为最高档位 pwmVal = MAX_STATE - 1; sleep(); / 进入睡眠 while(1) #asm(WDR) /喂狗 if (PINB&0x02) /判断是否按下键,KEY接到VCC delayMs(10); /防抖延时 for (keytime=0; (PINB&0x02) & keytime LONG_KEY & status = 1) /长按逻辑处理 if (mode = 0) /进入设置模式 if (TCCR0A = 0x03) /PWM Off 的话 PWM 设为 ON TCCR0A = 0x83; mode = 1; /LEDDRV2 = 1; led_flicker(); else /退出设置模式 mode = 0; /LEDDRV2 = 0; eeprom_write(ADDRESS, pwmVal); /写eeprom里的数据 delayM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 网络规划设计师考试信息更新与科技融合的探索试题及答案
- 西医临床新知识获取方式试题及答案
- 康复三基试题及答案
- 人教版五年级语文下册期中测试及答案
- 2025-2030定子组件行业需求调研分析及未来投资动向预测研究报告
- 2025-2030基金行业市场发展现状及竞争格局与投资价值研究报告
- 100%股权转让合同样本
- 2025-2030圆形堆取料机行业市场现状供需分析及投资评估规划分析研究报告
- 浙教版三年级下学期语文期末综合复习校外培训题
- 2025-2030国内紫外光治疗仪行业市场发展前景及竞争策略与投资风险研究报告
- 车间注塑工艺表
- SH30182019石油化工安全仪表系统设计规范-8精选文档
- 中医诊断学第七章八纲辨证课件
- 3 春夜喜雨课件(共16张PPT)
- DB32∕T 3921-2020 居住建筑浮筑楼板保温隔声工程技术规程
- [推选]高墩翻模施工技术PPT课件
- 现代住宅风水全解(含文字及图解)(课堂PPT)
- Q∕GDW 12131-2021 干扰源用户接入电网电能质量评估技术规范
- 图解副热带高压
- 美标管壁厚等级表
- 话剧基础知识ppt课件
评论
0/150
提交评论