单片机教程网

电脑版
提示:原网页已由神马搜索转码, 内容由www.51hei.com提供.
查看:4046|回复: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, 下载次数: 124)
STC15F101W调光台灯电路.rar(241.74 KB, 下载次数: 92)


评分

黑币 +50
收起理由
+ 50
共享资料的黑币奖励!

查看全部评分

沙发
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 单片机教程网