1、*/#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,0x6
2、0,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
3、时候延时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
4、; / 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); TCCR0B |= (0WGM02)|(0CS02)|(1CS01)|(0CS00); /8分频(4.6875KHz) /TCCR0B=0x01; / 无预分频 OCR0A = 0x00
5、; TCNT0 = 0x00; / T/C0计数寄存器初值 TCCR0A = 0x03; / 外部中断初始化设置 /MCUCR = 0x02; / INT0 为下降沿时产生中断请求 /MCUCR |= (1ISC01)|(0ISC00); / INT0 为下降沿时产生中断请求 /GIMSK = 0x40; / 允许 INT0 产生中断 GIMSK |= (1INT0); / 允许 INT0 产生中断 /TIMSK0=(0OCIE0B)|(0OCIE0A)|(0TOIE0); /#asm(sei / 睡眠模式初始化 MCUCR|=(1SM1)|(0SM0); / 掉电模式SE); / 睡眠使能
6、/GIMSK |=(1 /#asm (sleep) / 睡眠 /* * 描述:开启看门狗* 参数:*/void WDT_on(void) / 看门狗设置cli) / 关闭全局中断 #asm(WDR) / 看门狗复位指令WDR用来复位看门狗定时器 WDTCR=0x18; / 启动时序 WDTCR |= (1WDCE) | (1WDE); /WDTCR=0x28; / 看门狗定时4s WDTCR = (1WDP3) | (1 WDTCR = (1 / 看门狗定时4s /WDTCR = 0x00; / 关闭WDT) / 开启全局中断关闭看门狗void WDT_off(void) MCUSR &= (
7、1WDRF); / 清除MCUSR 寄存器中WDRF /* 在WDCE 与WDE 中写逻辑1,保持旧预分频器设置防止无意暂停 */ WDTCR |= (1 WDTCR = 0x00;进入睡眠*/ void sleep(void) WDT_off(); / 关闭WDT(关闭看门狗) /MCUCR|=(1 / 睡眠使能 #asm () / 睡眠) / 关闭全局中断 WDT_on(); / 启动看门狗 eeprom写一个字节数据address-地址 data-数据void eeprom_write(uchar address,uchar data) /等待上一次写操作结束 while(EECR&(1
8、EEPE); /设置编程模式 EECR=(0EEPM0); /设置地址和数据寄存器 EEAR = address; EEDR = data; /置位EEMPE EECR |= (10; i-) delayMs(5); /关闭PWM LEDDRV = 0; sleep(); / 关灯进入睡眠 LED Flicker 闪烁void led_flicker(void) delayMs(200); OCR0A = pwmpwmVal; 外部中断服务程序interrupt EXT_INT0 void int0_isr(void) /函数体 Main()void main(void) init_devic
9、es(); /调用初始化函数 / 读取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 & status = 1) /长按逻辑处理 if (m
10、ode = 0) /进入设置模式 if (TCCR0A = 0x03) /PWM Off 的话 PWM 设为 ON mode = 1; /LEDDRV2 = 1; led_flicker(); else /退出设置模式 mode = 0; /LEDDRV2 = 0; eeprom_write(ADDRESS, pwmVal); /写eeprom里的数据 /退出设置模式后全亮的话 PWM Off,LED灯亮 else if (keytime 0 & keytime LONG_KEY) /短按逻辑处理 if (mode = 0 & status = 0) / LED NO status = 1; led_on(); /开灯 else if (mode = 0 & status = 1) / LED OFF status = 0; led_off(); /关灯 else if (mode = 1 & status = 1) /设置模式下的短按 pwmVal+;= MAX_STATE) /循环 pwmVal = 0; / LEDDRV2 = LEDDRV2; / delayMs(50); / end while
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2