查看:4046|回复:5
基于STC15F101W调光灯,按键状态机,电脑USB供电,STC15F101W单片机驱动包含了源代码和原理图、PCB
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
复制代码
所有资料51hei提供下载:
Code.rar(28.42 KB, 下载次数: 124)
STC15F101W调光台灯电路.rar(241.74 KB, 下载次数: 92)
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
单片机源程序如下:
-
/**********************************************
- 程序名:LED程序
- 产品代号:LED调光台灯
- 硬件平台:STC15F100W (只有T0和T2两个定时器 )
- 当前版本:1.0
- 编写人:@Richard
-
说明:
- ①适用于Led驱动板
- ②可通过DIM端控制灯泡亮度与开关
- ③有四个指示灯,共阳
-
- 命名规则:输出后缀_dr、输入后缀_sr、标志位后缀_flag (dr代表drive驱动、sr代表sensor感应器)
-
**********************************************/
- #include< STC15Fxxxx.H> //51系列单片机的各种寄存器地址的定义
- //#include< STC12CAxxxx.H> //51系列单片机的各种寄存器地址的定义
- #include "intrins.h" //数学定义
- #define uchar unsigned char
- #define uint unsigned int
-
/*********晶振定时定义*************************/
- //#define Fosc 22118400L //定义主时钟
- #define Fosc 12000000L //定义主时钟
- //#define Fosc 11059200L //定义主时钟
- //#define Fosc 5529600L //定义主时钟
- //#define Fosc 24000000L //定义主时钟
- //#define T1MS (65536-Fosc/1000) //T1模式 ,12.00MHZ
- #define T1MS (65536-Fosc/12/1000) //T12模式 ,12.00MHZ
- //sfr AUXR = 0x80;
-
/*********按键时间定义*************************/
- #define const_key_time_short1 20 //短按的按键去抖动延时的时间
- #define const_key_time_long1 400 //长按的按键去抖动延时的时间
-
/*********PWM定义*************************/
- #define PWM70_H 7 //定义PWM高位周期,亮度70%
- #define PWM70_L 3 //定义PWM低位周期
- #define PWM40_H 2 //定义PWM高位周期,亮度40%
- #define PWM40_L 3 //定义PWM低位周期
- #define PWM10_H 2 //定义PWM高位周期,亮度10%
- #define PWM10_L 18 //定义PWM低位周期
-
/*********标志位定义*************************/
- unsigned int count; //定义全局变量用于计时
- unsigned int LED_count1; //按钮LED中断次数
- unsigned int LED_count2; //按钮LED中断次数
- unsigned char ucKeyLock1=0; //按键触发后自锁的变量标志
- unsigned char ucShortTouchFlag1=0; //短按的触发标志
- unsigned int uiKeyTimeCnt1=0; //按键去抖动延时计数器
- unsigned int LongKeyCnt=0; //长按触发次数计数器
- unsigned int ShortKeyCnt=0; //短按触发次数计数器
-
/*********函数申明*************************/
- void initial_myself(); //初始化寄存器以及个别外围要求响应速度快的输出设备
- void initial_peripheral(); //初始化不要求上电立即处理的外围芯片和模块
-
/*********端口定义*************************/
- sbit DIM_dr=P3^5; //定义P3.5为灯泡DIM使能信号
- sbit led1_dr=P3^0; //定义P3.0为LED1控制信号
- sbit led2_dr=P3^1; //定义P3.1为LED2控制信号
- sbit led3_dr=P3^2; //定义P3.2为LED3控制信号
- sbit led4_dr=P3^3; //定义P3.3为LED1控制信号
- sbit key_sr=P3^4; //定义P3.4为key输入信号
- /*********初始化函数***********************/
- void initial_myself(void) //内部器件初始化
- {
- EA=1;
-
- P3M1=0x00; //定义P3准双向口
- P3M0=0x00;
- }
- /************T0定时器中断配置函数**********/
- void Timer0Init(void) //1毫秒@12.000MHz
- {
- //AUXR |= 0x80; //定时器时钟1T模式
- AUXR |= 0x84; //定时器时钟1T模式,T0/T2配置
- TMOD& = 0xF0; //设置定时器模式
- TL0 = 0x20; //设置定时初值
- TH0 = 0xD1; //设置定时初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
-
- ET0 = 1;
- }
- /************T2定时器中断配置函数**********/
- void Timer2Init(void) //1毫秒@12.000MHz
- {
- //AUXR |= 0x04; //定时器时钟1T模式
- T2L = 0x50; //设置定时初值
- T2H = 0xFB; //设置定时初值
- AUXR |= 0x10; //定时器2开始计时
-
- IE2 |= 0x04;
- }
-
/*********初始化外围*************************/
- void initial_peripheral(void) //外围器件初始化
- {
- DIM_dr=0; //DIM端口初始化、0为灭,1为亮
-
- led1_dr=1;
- led2_dr=1;
- led3_dr=1;
- led4_dr=1;
- }
- /*********1毫秒延时函数***********************/
- void Delay1ms() //@12.000MHz
- {
- unsigned char i, j;
- i = 12;
- j = 169;
- do
- {
- while (--j);
- } while (--i);
- }
- /*********毫秒延时函数***********************/
- void delay_ms(unsigned char ms)
- {
- unsigned int i;
- do{
- i = Fosc / 13000;
- while(--i) ; //14T per loop
- }while(--ms);
- }
- /*********毫秒延时函数(定时器)***********************/
- void DelayNms(unsigned int t)
- {
- T2L = 0x20; //设置定时初值
- T2H = 0xD1; //设置定时初值
-
- count=t;
- while(count);
- }
- /***************4个LED开机提示函数***********************/
- void led_turn()
- {
- led1_dr=0;
- DelayNms(500);
- led2_dr=0;
- DelayNms(500);
- led3_dr=0;
- DelayNms(500);
- led4_dr=0;
- DelayNms(500);
- }
- /***************4个LED提示灯全点亮函数***********************/
- void led_4on()
- {
- led1_dr=0;
- led2_dr=0;
- led3_dr=0;
- led4_dr=0;
- }
- /***************第4个LED提示灯熄灭函数***********************/
- void led_off4()
- {
- led1_dr=0;
- led2_dr=0;
- led3_dr=0;
- led4_dr=1;
- }
- /***************第34个LED提示灯熄灭函数***********************/
- void led_off34()
- {
- led1_dr=0;
- led2_dr=0;
- led3_dr=1;
- led4_dr=1;
- }
- /***************第234个LED提示灯熄灭函数***********************/
- void led_off234()
- {
- led1_dr=0;
- led2_dr=1;
- led3_dr=1;
- led4_dr=1;
- }
- /***************4个LED提示灯全熄灭函数***********************/
- void led_4off()
- {
- led1_dr=1;
- led2_dr=1;
- led3_dr=1;
- led4_dr=1;
- }
- /***************DIM灯光70%亮度函数***********************/
- void DIM_dr70()
- {
- DIM_dr=1;
- DelayNms(PWM70_H);
- DIM_dr=0;
- DelayNms(PWM70_L);
- }
- /***************DIM灯光40%亮度函数***********************/
- void DIM_dr40()
- {
- DIM_dr=1;
- DelayNms(PWM40_H);
- DIM_dr=0;
- DelayNms(PWM40_L);
- }
- /***************DIM灯光10%亮度函数***********************/
- void DIM_dr10()
- {
- DIM_dr=1;
- DelayNms(PWM10_H);
- DIM_dr=0;
- DelayNms(PWM10_L);
- }
- /***************按键扫描函数函数***********************/
- void key_scan() //按键扫描函数 放在定时中断里
- {
- if(key_sr==1) //IO是高电平,说明按键没有全部被按下,这时要及时清零一些标志位
- {
- ucKeyLock1=0; //按键自锁标志清零
- uiKeyTimeCnt1=0; //按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。
- if(ucShortTouchFlag1==1) //短按触发标志
- {
- ucShortTouchFlag1=0;
- ShortKeyCnt++; //触发按键短按
- }
- }
- else if(ucKeyLock1==0) //有按键按下,且是第一次被按下
- {
- uiKeyTimeCnt1++; //累加定时中断次数
-
if(uiKeyTimeCnt1>const_key_time_short1)
- {
- ucShortTouchFlag1=1; //激活按键短按的有效标志
- }
-
if(uiKeyTimeCnt1>const_key_time_long1)
- {
- ucShortTouchFlag1=0; //清除按键短按的有效标志
- uiKeyTimeCnt1=0;
- ucKeyLock1=1; //自锁按键置位,避免一直触发
- LongKeyCnt++; //触发按键长按
-
- }
- }
- }
- /***************按键服务函数***********************/
- void key_service() //按键服务的应用程序
- {
-
- switch(ShortKeyCnt) //按键服务状态切换
- {
- case 1: //按键短按一次
-
- if(LongKeyCnt==1) //有长按键一次
- {
- led_4off(); //有长按键一次
- DIM_dr=0;
- }
-
if((LongKeyCnt==2)||(LongKeyCnt==0))
- {
- led_turn();
- DIM_dr=0;
- }
- break;
-
- case 2: //按键短按
-
- if(LongKeyCnt==1)
- {
- led_4off();
- DIM_dr=1;
- }
-
if((LongKeyCnt==2)||(LongKeyCnt==0))
- {
- led_4on();
- DIM_dr=1;
- }
- break;
-
- case 3: //按键长按
-
- if(LongKeyCnt==1)
- {
- led_4off();
- DIM_dr70();
- }
-
if((LongKeyCnt==2)||(LongKeyCnt==0))
- {
- led_off4();
- DIM_dr70();
- }
- break;
-
- case 4: //按键短按
-
- if(LongKeyCnt==1)
- {
- led_4off();
- DIM_dr40();
- }
-
if((LongKeyCnt==2)||(LongKeyCnt==0))
- {
- led_off34();
- DIM_dr40();
- }
- break;
-
- case 5: //按键短按
- if(LongKeyCnt==1)
- {
- led_4off();
- DIM_dr10();
- }
-
if((LongKeyCnt==2)||(LongKeyCnt==0))
- {
- led_off234();
- DIM_dr10();
- }
- break;
-
- case 6: //按键短按
-
- led_4off();
- DIM_dr=0;
- ShortKeyCnt=0; //按第5次返回
- break;
- }
- switch(LongKeyCnt) //按键服务状态切换
- {
- case 1:
- ;
- break;
-
- case 2:
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
所有资料51hei提供下载:
Code.rar(28.42 KB, 下载次数: 124)
STC15F101W调光台灯电路.rar(241.74 KB, 下载次数: 92)