找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4007|回复: 5
打印 上一主题 下一主题
收起左侧

基于STC15F101W单片机调光灯/按键状态机源程序与PCB原理图

  [复制链接]
跳转到指定楼层
楼主
ID:829390 发表于 2020-10-13 17:24 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
基于STC15F101W调光灯,按键状态机,电脑USB供电,STC15F101W单片机驱动包含了源代码和原理图、PCB

Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)


单片机源程序如下:
  1. /**********************************************
  2. 程序名:LED程序
  3. 产品代号:LED调光台灯
  4. 硬件平台:STC15F100W (只有T0和T2两个定时器        )
  5. 当前版本:1.0
  6. 编写人:@Richard


  7. 说明:
  8.                 ①适用于Led驱动板
  9.                 ②可通过DIM端控制灯泡亮度与开关
  10.                 ③有四个指示灯,共阳
  11.        
  12. 命名规则:输出后缀_dr、输入后缀_sr、标志位后缀_flag    (dr代表drive驱动、sr代表sensor感应器)

  13. **********************************************/

  14. #include <STC15Fxxxx.H>                                        //51系列单片机的各种寄存器地址的定义
  15. //#include <STC12CAxxxx.H>                                        //51系列单片机的各种寄存器地址的定义
  16. #include "intrins.h"                                //数学定义
  17. #define uchar unsigned char         
  18. #define uint unsigned int           

  19. /*********晶振定时定义*************************/
  20. //#define Fosc        22118400L        //定义主时钟
  21. #define Fosc        12000000L        //定义主时钟
  22. //#define Fosc        11059200L        //定义主时钟
  23. //#define Fosc        5529600L        //定义主时钟
  24. //#define Fosc        24000000L        //定义主时钟

  25. //#define        T1MS        (65536-Fosc/1000)                //T1模式 ,12.00MHZ
  26. #define        T1MS        (65536-Fosc/12/1000)                //T12模式 ,12.00MHZ

  27. //sfr AUXR = 0x80;
  28. /*********按键时间定义*************************/
  29. #define const_key_time_short1  20        //短按的按键去抖动延时的时间
  30. #define const_key_time_long1   400        //长按的按键去抖动延时的时间
  31. /*********PWM定义*************************/
  32. #define        PWM70_H 7                                        //定义PWM高位周期,亮度70%
  33. #define        PWM70_L 3                                        //定义PWM低位周期

  34. #define        PWM40_H 2                                        //定义PWM高位周期,亮度40%
  35. #define        PWM40_L 3                                        //定义PWM低位周期

  36. #define        PWM10_H 2                                        //定义PWM高位周期,亮度10%
  37. #define        PWM10_L 18                                        //定义PWM低位周期
  38. /*********标志位定义*************************/

  39. unsigned int count;                                //定义全局变量用于计时
  40. unsigned int LED_count1;                        //按钮LED中断次数
  41. unsigned int LED_count2;                        //按钮LED中断次数

  42. unsigned char ucKeyLock1=0;                        //按键触发后自锁的变量标志
  43. unsigned char ucShortTouchFlag1=0;         //短按的触发标志

  44. unsigned int  uiKeyTimeCnt1=0;                //按键去抖动延时计数器

  45. unsigned int  LongKeyCnt=0;                 //长按触发次数计数器
  46. unsigned int  ShortKeyCnt=0;                 //短按触发次数计数器
  47. /*********函数申明*************************/
  48. void initial_myself();                                //初始化寄存器以及个别外围要求响应速度快的输出设备
  49. void initial_peripheral();                        //初始化不要求上电立即处理的外围芯片和模块

  50. /*********端口定义*************************/
  51. sbit DIM_dr=P3^5;                                        //定义P3.5为灯泡DIM使能信号

  52. sbit led1_dr=P3^0;                                        //定义P3.0为LED1控制信号
  53. sbit led2_dr=P3^1;                                        //定义P3.1为LED2控制信号
  54. sbit led3_dr=P3^2;                                        //定义P3.2为LED3控制信号
  55. sbit led4_dr=P3^3;                                        //定义P3.3为LED1控制信号

  56. sbit key_sr=P3^4;                                        //定义P3.4为key输入信号

  57. /*********初始化函数***********************/
  58. void initial_myself(void)                        //内部器件初始化       
  59. {
  60.         EA=1;
  61.        
  62.         P3M1=0x00;                                                //定义P3准双向口
  63.         P3M0=0x00;
  64. }
  65. /************T0定时器中断配置函数**********/
  66. void Timer0Init(void)                //1毫秒@12.000MHz
  67. {
  68.         //AUXR |= 0x80;                //定时器时钟1T模式
  69.         AUXR |= 0x84;                //定时器时钟1T模式,T0/T2配置
  70.         TMOD &= 0xF0;                //设置定时器模式
  71.         TL0 = 0x20;                //设置定时初值
  72.         TH0 = 0xD1;                //设置定时初值
  73.         TF0 = 0;                //清除TF0标志
  74.         TR0 = 1;                //定时器0开始计时
  75.        
  76.         ET0 = 1;
  77. }
  78. /************T2定时器中断配置函数**********/
  79. void Timer2Init(void)                //1毫秒@12.000MHz
  80. {
  81.         //AUXR |= 0x04;                //定时器时钟1T模式
  82.         T2L = 0x50;                //设置定时初值
  83.         T2H = 0xFB;                //设置定时初值
  84.         AUXR |= 0x10;                //定时器2开始计时
  85.        
  86.         IE2 |= 0x04;
  87. }
  88. /*********初始化外围*************************/
  89. void initial_peripheral(void)                 //外围器件初始化
  90. {
  91.         DIM_dr=0;                                                //DIM端口初始化、0为灭,1为亮
  92.        
  93.         led1_dr=1;
  94.         led2_dr=1;
  95.         led3_dr=1;
  96.         led4_dr=1;
  97. }
  98. /*********1毫秒延时函数***********************/
  99. void Delay1ms()                //@12.000MHz
  100. {
  101.         unsigned char i, j;

  102.         i = 12;
  103.         j = 169;
  104.         do
  105.         {
  106.                 while (--j);
  107.         } while (--i);
  108. }
  109. /*********毫秒延时函数***********************/
  110. void  delay_ms(unsigned char ms)
  111. {
  112.      unsigned int i;
  113.          do{
  114.               i = Fosc / 13000;
  115.                   while(--i)        ;   //14T per loop
  116.      }while(--ms);
  117. }
  118. /*********毫秒延时函数(定时器)***********************/
  119. void DelayNms(unsigned int t)
  120. {
  121.         T2L = 0x20;                //设置定时初值
  122.         T2H = 0xD1;                //设置定时初值
  123.        
  124.     count=t;
  125.      while(count);
  126. }
  127. /***************4个LED开机提示函数***********************/
  128. void led_turn()
  129. {
  130.         led1_dr=0;
  131.         DelayNms(500);
  132.         led2_dr=0;
  133.         DelayNms(500);
  134.         led3_dr=0;
  135.         DelayNms(500);
  136.         led4_dr=0;       
  137.         DelayNms(500);       
  138. }
  139. /***************4个LED提示灯全点亮函数***********************/
  140. void led_4on()
  141. {
  142.         led1_dr=0;
  143.         led2_dr=0;
  144.         led3_dr=0;
  145.         led4_dr=0;       
  146. }
  147. /***************第4个LED提示灯熄灭函数***********************/
  148. void led_off4()
  149. {
  150.         led1_dr=0;
  151.         led2_dr=0;
  152.         led3_dr=0;
  153.         led4_dr=1;       
  154. }
  155. /***************第34个LED提示灯熄灭函数***********************/
  156. void led_off34()
  157. {
  158.         led1_dr=0;
  159.         led2_dr=0;
  160.         led3_dr=1;
  161.         led4_dr=1;       
  162. }
  163. /***************第234个LED提示灯熄灭函数***********************/
  164. void led_off234()
  165. {
  166.         led1_dr=0;
  167.         led2_dr=1;
  168.         led3_dr=1;
  169.         led4_dr=1;       
  170. }
  171. /***************4个LED提示灯全熄灭函数***********************/
  172. void led_4off()
  173. {
  174.         led1_dr=1;
  175.         led2_dr=1;
  176.         led3_dr=1;
  177.         led4_dr=1;       
  178. }
  179. /***************DIM灯光70%亮度函数***********************/
  180. void DIM_dr70()
  181. {
  182.         DIM_dr=1;
  183.         DelayNms(PWM70_H);
  184.         DIM_dr=0;
  185.         DelayNms(PWM70_L);
  186. }
  187. /***************DIM灯光40%亮度函数***********************/
  188. void DIM_dr40()
  189. {
  190.         DIM_dr=1;
  191.         DelayNms(PWM40_H);
  192.         DIM_dr=0;
  193.         DelayNms(PWM40_L);
  194. }
  195. /***************DIM灯光10%亮度函数***********************/
  196. void DIM_dr10()
  197. {
  198.         DIM_dr=1;
  199.         DelayNms(PWM10_H);
  200.         DIM_dr=0;
  201.         DelayNms(PWM10_L);
  202. }
  203. /***************按键扫描函数函数***********************/
  204. void key_scan()                                                //按键扫描函数 放在定时中断里
  205. {
  206.         if(key_sr==1)                                        //IO是高电平,说明按键没有全部被按下,这时要及时清零一些标志位
  207.         {
  208.                 ucKeyLock1=0;                                 //按键自锁标志清零
  209.                 uiKeyTimeCnt1=0;                        //按键去抖动延时计数器清零,此行非常巧妙,是我实战中摸索出来的。   
  210.                 if(ucShortTouchFlag1==1)          //短按触发标志
  211.                 {
  212.                         ucShortTouchFlag1=0;
  213.                         ShortKeyCnt++;                    //触发按键短按
  214.                 }
  215.         }
  216.         else if(ucKeyLock1==0)                        //有按键按下,且是第一次被按下
  217.         {
  218.                 uiKeyTimeCnt1++;                         //累加定时中断次数
  219.                 if(uiKeyTimeCnt1>const_key_time_short1)
  220.                 {
  221.                         ucShortTouchFlag1=1;        //激活按键短按的有效标志  
  222.                 }
  223.                 if(uiKeyTimeCnt1>const_key_time_long1)
  224.                 {
  225.                         ucShortTouchFlag1=0;        //清除按键短按的有效标志

  226.                         uiKeyTimeCnt1=0;
  227.                         ucKeyLock1=1;                          //自锁按键置位,避免一直触发

  228.                         LongKeyCnt++;                        //触发按键长按
  229.                        
  230.                 }
  231.         }
  232. }
  233. /***************按键服务函数***********************/
  234. void key_service()                                         //按键服务的应用程序
  235. {
  236.        

  237.         switch(ShortKeyCnt)                                //按键服务状态切换
  238.         {
  239.                 case 1:                                                //按键短按一次
  240.                
  241.                 if(LongKeyCnt==1)                                //有长按键一次
  242.                 {
  243.                         led_4off();                                        //有长按键一次
  244.                         DIM_dr=0;
  245.                 }
  246.                 if((LongKeyCnt==2)||(LongKeyCnt==0))
  247.                 {
  248.                         led_turn();
  249.                         DIM_dr=0;
  250.                 }
  251.         break;
  252.                
  253.                 case 2:                //按键短按
  254.                
  255.                 if(LongKeyCnt==1)
  256.                 {
  257.                         led_4off();
  258.                         DIM_dr=1;
  259.                 }
  260.                 if((LongKeyCnt==2)||(LongKeyCnt==0))
  261.                 {
  262.                         led_4on();       
  263.                         DIM_dr=1;
  264.                 }               
  265.         break;      
  266.                   
  267.                 case 3:                                                //按键长按
  268.                
  269.                 if(LongKeyCnt==1)
  270.                 {
  271.                         led_4off();
  272.                         DIM_dr70();
  273.                 }
  274.                 if((LongKeyCnt==2)||(LongKeyCnt==0))
  275.                 {
  276.                         led_off4();
  277.                         DIM_dr70();

  278.                 }                       
  279.         break;  
  280.                
  281.                 case 4:                                                //按键短按       
  282.                
  283.                 if(LongKeyCnt==1)
  284.                 {
  285.                         led_4off();
  286.                         DIM_dr40();
  287.                 }
  288.                 if((LongKeyCnt==2)||(LongKeyCnt==0))
  289.                 {
  290.                         led_off34();
  291.                         DIM_dr40();
  292.                 }               
  293.         break;
  294.                
  295.                 case 5:                                                //按键短按
  296.                 if(LongKeyCnt==1)
  297.                 {
  298.                         led_4off();
  299.                         DIM_dr10();
  300.                 }
  301.                 if((LongKeyCnt==2)||(LongKeyCnt==0))
  302.                 {
  303.                         led_off234();
  304.                         DIM_dr10();
  305.                 }                       
  306.         break;
  307.                
  308.                 case 6:                                                //按键短按
  309.                
  310.                 led_4off();       
  311.                 DIM_dr=0;
  312.                 ShortKeyCnt=0;                                //按第5次返回
  313.         break;
  314.         }

  315.         switch(LongKeyCnt)                                //按键服务状态切换
  316.         {       
  317.                 case 1:
  318.                 ;
  319.                 break;
  320.                
  321.                 case 2:
  322. ……………………

  323. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
Code.rar (28.42 KB, 下载次数: 123)
STC15F101W调光台灯电路.rar (241.74 KB, 下载次数: 92)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏12 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:364201 发表于 2023-5-27 10:37 | 只看该作者
实测过吗?下载的代码编译报错
回复

使用道具 举报

板凳
ID:844255 发表于 2024-3-9 12:29 | 只看该作者
#include <STC15F2K60S2.H>
//#include <STC15Fxxxx.H>                                       
//#include <STC12CAxxxx.H>

回复

使用道具 举报

地板
ID:229641 发表于 2024-3-10 12:13 来自手机 | 只看该作者
wangkgg 发表于 2024-3-9 12:29
#include  
//#include                                        
//#include

可以正常使用吗?
回复

使用道具 举报

5#
ID:844255 发表于 2024-3-13 13:15 | 只看该作者

通过编译,可以用了,上过机、
回复

使用道具 举报

6#
ID:1112856 发表于 2024-3-13 13:27 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表