基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx

上传人:b****4 文档编号:7224192 上传时间:2023-05-08 格式:DOCX 页数:16 大小:83.76KB
下载 相关 举报
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第1页
第1页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第2页
第2页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第3页
第3页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第4页
第4页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第5页
第5页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第6页
第6页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第7页
第7页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第8页
第8页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第9页
第9页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第10页
第10页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第11页
第11页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第12页
第12页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第13页
第13页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第14页
第14页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第15页
第15页 / 共16页
基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx_第16页
第16页 / 共16页
亲,该文档总共16页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx

《基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx(16页珍藏版)》请在冰点文库上搜索。

基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx

***********************************************************************/

#include<

tiny13.h>

//#include<

delay.h>

#defineucharunsignedchar

#defineuintunsignedint

#defineKEYPINB.1//tiny13第6脚,INT0外部中断

#defineLEDDRVPORTB.0//tiny13第5脚

#defineLEDDRV2PORTB.2//tiny13第7脚(指示灯)

#defineMAX_STATE5u//最多档位数

#defineLONG_KEY15//长按键的时间

#defineADDRESS0x01//保存档位的地址

/**********变量定义**********************************************/

//ucharpwm[]={0x20,0x40,0x60,0x80,0xA0,0xC0,0xE0,0xFF};

ucharpwm[]={0x20,0x40,0x80,0xC0,0xFF};

//亮度值

ucharpwmVal=0;

//亮度档位

ucharstatus=0;

//0为LEDOFF,1为LEDON

ucharmode=0;

//0为使用模式,1为设置模式

uintkeytime=0;

//按键时间

/**********************************************************************

软件延时函数(RC9.6MHz)

*输入:

延时毫秒数

***********************************************************************/

voiddelayMs(uintn)

{

uinti;

uintj;

for(i=0;

i<

n;

i++)

for(j=0;

j<

137;

j++)//RC9.6MHz时候延时1MS

#asm("

nop"

}

*名称:

init_devices()

*功能:

端口、定时器、PWM初始化

*输出:

voidinit_devices(void)

//CrystalOscillatordivisionfactor:

8

#pragmaoptsize-

CLKPR=0x80;

CLKPR=0x03;

#ifdef_OPTIMIZE_SIZE_

#pragmaoptsize+

#endif

//I/O口的初始化

DDRB=0x01;

//PB.0输出(P5),PB.1输入(P6),PB.2输出(P7),PB.3输入(P2)

PORTB=0x00;

//PB.2输出

//PWM初始化

//TCCR0ABIT76543210

//COM0A1COM0A0COM0B1COM0B0--WGM01WGM00

//TCCR0A=0x83;

//开启PWM,比较匹配发生时OC0A清零

//TCCR0A=0x03;

//关闭PWM

TCCR0A|=(1<

<

COM0A1)|(0<

COM0A0)|(1<

WGM01)|(1<

WGM00);

TCCR0B|=(0<

WGM02)|(0<

CS02)|(1<

CS01)|(0<

CS00);

//8分频(4.6875KHz)

//TCCR0B=0x01;

//无预分频

OCR0A=0x00;

TCNT0=0x00;

//T/C0计数寄存器初值

TCCR0A=0x03;

//外部中断初始化设置

//MCUCR=0x02;

//INT0为下降沿时产生中断请求

//MCUCR|=(1<

ISC01)|(0<

ISC00);

//INT0为下降沿时产生中断请求

//GIMSK=0x40;

//允许INT0产生中断

GIMSK|=(1<

INT0);

//允许INT0产生中断

//TIMSK0=(0<

OCIE0B)|(0<

OCIE0A)|(0<

TOIE0);

//#asm("

sei"

//睡眠模式初始化

MCUCR|=(1<

SM1)|(0<

SM0);

//掉电模式

SE);

//睡眠使能

//GIMSK|=(1<

//#asm("

sleep"

)//睡眠

/***********************************************************************

*描述:

开启看门狗

*参数:

************************************************************************/

voidWDT_on(void)

//看门狗设置

cli"

)//关闭全局中断

#asm("

WDR"

)//看门狗复位指令WDR用来复位看门狗定时器

WDTCR=0x18;

//启动时序WDTCR|=(1<

WDCE)|(1<

WDE);

//WDTCR=0x28;

//看门狗定时4sWDTCR=(1<

WDP3)|(1<

WDTCR=(1<

//看门狗定时4s

//WDTCR=0x00;

//关闭WDT

)//开启全局中断

关闭看门狗

voidWDT_off(void)

MCUSR&

=~(1<

WDRF);

//清除MCUSR寄存器中WDRF

/*在WDCE与WDE中写逻辑1,保持旧预分频器设置防止无意暂停*/

WDTCR|=(1<

WDTCR=0x00;

进入睡眠

************************************************************************/

voidsleep(void)

WDT_off();

//关闭WDT(关闭看门狗)

//MCUCR|=(1<

//睡眠使能

#asm("

)//睡眠

)//关闭全局中断

WDT_on();

//启动看门狗

eeprom写一个字节数据

address--地址data--数据

voideeprom_write(ucharaddress,uchardata)

//等待上一次写操作结束

while(EECR&

(1<

EEPE));

//设置编程模式

EECR=(0<

EEPM1)|(0>

>

EEPM0);

//设置地址和数据寄存器

EEAR=address;

EEDR=data;

//置位EEMPE

EECR|=(1<

EEMPE);

//置位EEWE,启动写操作

EEPE);

}

eeprom读一个字节数据

address--地址

uchareeprom_read(ucharaddress)

//设置地址寄存器

EEAR=address;

//设置EERE以启动读操作

EERE);

//自数据寄存器返回数据

return(EEDR);

LEDON开灯

***********************************************************************/

voidled_on(void)

uchari;

TCCR0A=0x83;

//开启PWM

pwm[pwmVal];

{

OCR0A=i;

//更改占空比

delayMs(4);

//全亮时候PWMOff

if(pwm[pwmVal]==0xff)

LEDDRV=1;

}

LEDOFF关灯

voidled_off(void)

if(TCCR0A==0x03)

//开启PWM

for(i=pwm[pwmVal];

i>

0;

i--)

delayMs(5);

//关闭PWM

LEDDRV=0;

sleep();

//关灯进入睡眠

LEDFlicker闪烁

voidled_flicker(void)

delayMs(200);

OCR0A=pwm[pwmVal];

外部中断服务程序

interrupt[EXT_INT0]voidint0_isr(void)

//函数体

Main()

voidmain(void)

{

init_devices();

//调用初始化函数

//读取eeprom中的亮度档位数据

delayMs(10);

//延时10ms

pwmVal=eeprom_read(ADDRESS);

//读取eeprom里的数据

if(pwmVal>

=MAX_STATE)//eeprom无数据的话设为最高档位

pwmVal=MAX_STATE-1;

//进入睡眠

while

(1)

)//喂狗

if((PINB&

0x02))//判断是否按下键,KEY接到VCC

//防抖延时

for(keytime=0;

((PINB&

0x02))&

&

keytime<

LONG_KEY;

keytime++)

keytime++;

delayMs(100);

//100ms

//按键处理

if(keytime>

LONG_KEY&

status==1)//长按逻辑处理

if(mode==0)//进入设置模式

if(TCCR0A==0x03)//PWMOff的话PWM设为ON

mode=1;

//LEDDRV2=1;

led_flicker();

else//退出设置模式

mode=0;

//LEDDRV2=0;

eeprom_write(ADDRESS,pwmVal);

//写eeprom里的数据

//退出设置模式后全亮的话PWMOff,LED灯亮

elseif(keytime>

0&

keytime<

LONG_KEY)//短按逻辑处理

if(mode==0&

status==0)//LEDNO

status=1;

led_on();

//开灯

elseif(mode==0&

status==1)//LEDOFF

status=0;

led_off();

//关灯

elseif(mode==1&

status==1)//设置模式下的短按

{

pwmVal++;

=MAX_STATE)//循环

pwmVal=0;

//LEDDRV2=~LEDDRV2;

//delayMs(50);

}//endwhile

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2