找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5322|回復(fù): 6
打印 上一主題 下一主題
收起左側(cè)

基于STC15F101W單片機(jī)調(diào)光燈/按鍵狀態(tài)機(jī)源程序與PCB原理圖

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:829390 發(fā)表于 2020-10-13 17:24 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
基于STC15F101W調(diào)光燈,按鍵狀態(tài)機(jī),電腦USB供電,STC15F101W單片機(jī)驅(qū)動包含了源代碼和原理圖、PCB

Altium Designer畫的原理圖和PCB圖如下:(51hei附件中可下載工程文件)


單片機(jī)源程序如下:
  1. /**********************************************
  2. 程序名:LED程序
  3. 產(chǎn)品代號:LED調(diào)光臺燈
  4. 硬件平臺:STC15F100W (只有T0和T2兩個定時器        )
  5. 當(dāng)前版本:1.0
  6. 編寫人:@Richard


  7. 說明:
  8.                 ①適用于Led驅(qū)動板
  9.                 ②可通過DIM端控制燈泡亮度與開關(guān)
  10.                 ③有四個指示燈,共陽
  11.        
  12. 命名規(guī)則:輸出后綴_dr、輸入后綴_sr、標(biāo)志位后綴_flag    (dr代表drive驅(qū)動、sr代表sensor感應(yīng)器)

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

  14. #include <STC15Fxxxx.H>                                        //51系列單片機(jī)的各種寄存器地址的定義
  15. //#include <STC12CAxxxx.H>                                        //51系列單片機(jī)的各種寄存器地址的定義
  16. #include "intrins.h"                                //數(shù)學(xué)定義
  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. /*********標(biāo)志位定義*************************/

  39. unsigned int count;                                //定義全局變量用于計時
  40. unsigned int LED_count1;                        //按鈕LED中斷次數(shù)
  41. unsigned int LED_count2;                        //按鈕LED中斷次數(shù)

  42. unsigned char ucKeyLock1=0;                        //按鍵觸發(fā)后自鎖的變量標(biāo)志
  43. unsigned char ucShortTouchFlag1=0;         //短按的觸發(fā)標(biāo)志

  44. unsigned int  uiKeyTimeCnt1=0;                //按鍵去抖動延時計數(shù)器

  45. unsigned int  LongKeyCnt=0;                 //長按觸發(fā)次數(shù)計數(shù)器
  46. unsigned int  ShortKeyCnt=0;                 //短按觸發(fā)次數(shù)計數(shù)器
  47. /*********函數(shù)申明*************************/
  48. void initial_myself();                                //初始化寄存器以及個別外圍要求響應(yīng)速度快的輸出設(shè)備
  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. /*********初始化函數(shù)***********************/
  58. void initial_myself(void)                        //內(nèi)部器件初始化       
  59. {
  60.         EA=1;
  61.        
  62.         P3M1=0x00;                                                //定義P3準(zhǔn)雙向口
  63.         P3M0=0x00;
  64. }
  65. /************T0定時器中斷配置函數(shù)**********/
  66. void Timer0Init(void)                //1毫秒@12.000MHz
  67. {
  68.         //AUXR |= 0x80;                //定時器時鐘1T模式
  69.         AUXR |= 0x84;                //定時器時鐘1T模式,T0/T2配置
  70.         TMOD &= 0xF0;                //設(shè)置定時器模式
  71.         TL0 = 0x20;                //設(shè)置定時初值
  72.         TH0 = 0xD1;                //設(shè)置定時初值
  73.         TF0 = 0;                //清除TF0標(biāo)志
  74.         TR0 = 1;                //定時器0開始計時
  75.        
  76.         ET0 = 1;
  77. }
  78. /************T2定時器中斷配置函數(shù)**********/
  79. void Timer2Init(void)                //1毫秒@12.000MHz
  80. {
  81.         //AUXR |= 0x04;                //定時器時鐘1T模式
  82.         T2L = 0x50;                //設(shè)置定時初值
  83.         T2H = 0xFB;                //設(shè)置定時初值
  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毫秒延時函數(shù)***********************/
  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. /*********毫秒延時函數(shù)***********************/
  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. /*********毫秒延時函數(shù)(定時器)***********************/
  119. void DelayNms(unsigned int t)
  120. {
  121.         T2L = 0x20;                //設(shè)置定時初值
  122.         T2H = 0xD1;                //設(shè)置定時初值
  123.        
  124.     count=t;
  125.      while(count);
  126. }
  127. /***************4個LED開機(jī)提示函數(shù)***********************/
  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提示燈全點(diǎn)亮函數(shù)***********************/
  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提示燈熄滅函數(shù)***********************/
  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提示燈熄滅函數(shù)***********************/
  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提示燈熄滅函數(shù)***********************/
  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提示燈全熄滅函數(shù)***********************/
  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%亮度函數(shù)***********************/
  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%亮度函數(shù)***********************/
  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%亮度函數(shù)***********************/
  196. void DIM_dr10()
  197. {
  198.         DIM_dr=1;
  199.         DelayNms(PWM10_H);
  200.         DIM_dr=0;
  201.         DelayNms(PWM10_L);
  202. }
  203. /***************按鍵掃描函數(shù)函數(shù)***********************/
  204. void key_scan()                                                //按鍵掃描函數(shù) 放在定時中斷里
  205. {
  206.         if(key_sr==1)                                        //IO是高電平,說明按鍵沒有全部被按下,這時要及時清零一些標(biāo)志位
  207.         {
  208.                 ucKeyLock1=0;                                 //按鍵自鎖標(biāo)志清零
  209.                 uiKeyTimeCnt1=0;                        //按鍵去抖動延時計數(shù)器清零,此行非常巧妙,是我實(shí)戰(zhàn)中摸索出來的。   
  210.                 if(ucShortTouchFlag1==1)          //短按觸發(fā)標(biāo)志
  211.                 {
  212.                         ucShortTouchFlag1=0;
  213.                         ShortKeyCnt++;                    //觸發(fā)按鍵短按
  214.                 }
  215.         }
  216.         else if(ucKeyLock1==0)                        //有按鍵按下,且是第一次被按下
  217.         {
  218.                 uiKeyTimeCnt1++;                         //累加定時中斷次數(shù)
  219.                 if(uiKeyTimeCnt1>const_key_time_short1)
  220.                 {
  221.                         ucShortTouchFlag1=1;        //激活按鍵短按的有效標(biāo)志  
  222.                 }
  223.                 if(uiKeyTimeCnt1>const_key_time_long1)
  224.                 {
  225.                         ucShortTouchFlag1=0;        //清除按鍵短按的有效標(biāo)志

  226.                         uiKeyTimeCnt1=0;
  227.                         ucKeyLock1=1;                          //自鎖按鍵置位,避免一直觸發(fā)

  228.                         LongKeyCnt++;                        //觸發(fā)按鍵長按
  229.                        
  230.                 }
  231.         }
  232. }
  233. /***************按鍵服務(wù)函數(shù)***********************/
  234. void key_service()                                         //按鍵服務(wù)的應(yīng)用程序
  235. {
  236.        

  237.         switch(ShortKeyCnt)                                //按鍵服務(wù)狀態(tài)切換
  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)                                //按鍵服務(wù)狀態(tài)切換
  316.         {       
  317.                 case 1:
  318.                 ;
  319.                 break;
  320.                
  321.                 case 2:
  322. ……………………

  323. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
Code.rar (28.42 KB, 下載次數(shù): 138)
STC15F101W調(diào)光臺燈電路.rar (241.74 KB, 下載次數(shù): 106)


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏13 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:364201 發(fā)表于 2023-5-27 10:37 | 只看該作者
實(shí)測過嗎?下載的代碼編譯報錯
回復(fù)

使用道具 舉報

板凳
ID:844255 發(fā)表于 2024-3-9 12:29 | 只看該作者
#include <STC15F2K60S2.H>
//#include <STC15Fxxxx.H>                                       
//#include <STC12CAxxxx.H>

回復(fù)

使用道具 舉報

地板
ID:229641 發(fā)表于 2024-3-10 12:13 來自手機(jī) | 只看該作者
wangkgg 發(fā)表于 2024-3-9 12:29
#include  
//#include                                        
//#include

可以正常使用嗎?
回復(fù)

使用道具 舉報

5#
ID:844255 發(fā)表于 2024-3-13 13:15 | 只看該作者

通過編譯,可以用了,上過機(jī)、
回復(fù)

使用道具 舉報

6#
ID:515309 發(fā)表于 2024-6-14 10:09 | 只看該作者
電路有問題
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表