基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx
《基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx》由会员分享,可在线阅读,更多相关《基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx(16页珍藏版)》请在冰点文库上搜索。
![基于ATtiny13的手电筒头灯控制电路和程序资料Word文件下载.docx](https://file1.bingdoc.com/fileroot1/2023-5/8/757bc91b-368e-45cc-ae04-1d0cc52d7e21/757bc91b-368e-45cc-ae04-1d0cc52d7e211.gif)
***********************************************************************/
#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