找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4583|回复: 7
收起左侧

调光LED灯STC15F104单片机源码

  [复制链接]
ID:59830 发表于 2018-8-22 00:09 | 显示全部楼层 |阅读模式
调光LED灯软件STC15F104 ,用的是STC宏晶8脚单片机 ,将一个旧的LED灯加了调光功能. 和大家学习探讨.

电路原理图如下:
0.png

单片机源程序如下:
  1. /*--------------------------------------------------------
  2. * Name File: KEY,C
  3. * Versions number: 1.0
  4. * Date     : 2016.01.01
  5. * Remarks  : STC15F104E MCU
  6. - 文件名   :KEY.C
  7. - 版本     :1.0
  8. - 日期     :2016.01.01
  9. - 备注     :STC15F104E MCU
  10. --------------------------------------------------------*/
  11. #include"config.h"     //
  12. unsigned char T1RH,T1RL;  //
  13. unsigned char code         KeyCodeMap[6]={ //按键值数组0-2是S1-S3短按
  14. 0x01,0x02,0x03,0x10,0x20,0x30         //按键值数组3-5是S1-S3长按
  15. };
  16. unsigned char KeySta[3]={//
  17. 1,1,1
  18. };
  19. unsigned int idata KeyDownTime[3]={0,0,0};  //按键按下持续时间
  20. void configtime1(unsigned int ms); //定时器1配置
  21. bit led1flag =1;   //LED1状态标志位
  22. bit led2flag =1;   //LED2状态标志位
  23. bit led3flag =1;   //LED3状态标志位
  24. //bit led4flag =0;
  25. bit KeyLFlag = 0; //长按标志位
  26. void KeyScan();     //按键的扫描
  27. void KeyDriver();   //按键驱动
  28. void LEDOUT();          //
  29. void KeyAction(unsigned char KeyCode);   //按键执行
  30. //--------------------------------
  31. void KeyAction(unsigned char KeyCode)
  32. {
  33.           if(KeyCode==0x01)led1flag = ~led1flag;
  34.     if(KeyCode==0x02)led2flag = ~led2flag;
  35.     if(KeyCode==0x03)led3flag = ~led3flag;
  36.         if(KeyCode==0x10)led1flag = ~led1flag;
  37.     if(KeyCode==0x20)led2flag = ~led2flag;
  38.     if(KeyCode==0x30)led3flag = ~led3flag;
  39. }
  40. void LEDOUT()
  41. {
  42.      LED_R=led3flag; //
  43.      LED_G=led1flag; //
  44.      LED_B=led2flag; //
  45. }
  46. //----------------------------
  47. void KeyDriver()
  48. {
  49.    unsigned char i;    //
  50.    static unsigned char idata backup[3]={1,1,1};  //
  51.    static unsigned int idata TimeThr[3]={600,600,600};  //
  52.    for(i=0;i<3;i++)         //循环检测3个按键
  53.    {
  54.    //---------------------------------
  55.       if(KeyDownTime[i] > 0)   //检测执行快速输入
  56.           {                            
  57.              if(KeyDownTime[i] >= TimeThr[i])
  58.                  {
  59.                     if(KeyLFlag != 1)
  60.                         {
  61.                        KeyAction(KeyCodeMap[i+3]);  //
  62. //                    TimeThr[i+3] += 200;  //
  63.                KeyLFlag = 1;
  64.             }
  65.                  }
  66.           }
  67.       if(backup[i] != KeySta[i])
  68.           {
  69.              if(backup[i] != 1)
  70.                  {
  71.                     if(KeyLFlag)
  72.                         {
  73.                            KeyLFlag = 0;
  74.                         }
  75.                         else
  76.                         {
  77.                       KeyAction(KeyCodeMap[i]);  //
  78.                         }
  79.                  }
  80.              backup[i] = KeySta[i];  //  
  81.           }
  82.    }
  83. }
  84. //---------定时器1的配置------------
  85. void configtime1(unsigned int ms)
  86. {
  87.    unsigned long tmp;
  88.    tmp = 11059200/12;  //
  89.    tmp =(tmp*ms)/1000;  //
  90.    tmp = 65536 - tmp;   //
  91.    tmp = tmp + 18;      //
  92.    T1RH = (unsigned char)(tmp>>8);  //
  93.    T1RL = (unsigned char)tmp;  //
  94.    TMOD &= 0x0f; //
  95.    TMOD |= 0x10; //
  96.    TH1 = T1RH;  //
  97.    TL1 = T1RL;   //
  98.    ET1 = 1;     //
  99.    TR1 = 1;     //
  100.    EA = 1;   //
  101. }
  102. //---------按键的扫描函数----------
  103. void KeyScan()
  104. {
  105.    bit RLED=0;  //
  106.    bit GLED=0;  //
  107.    bit BLED=0;  //
  108.    unsigned char i;  //
  109.    static unsigned char KeyBuf[]={
  110.    0xff,0xff,0xff
  111.    };
  112.    RLED=LED_R; //
  113.    GLED=LED_G; //
  114.    BLED=LED_B; //
  115.    S1 = 1; //
  116.    S2 = 1; //
  117.    S3 = 1; //
  118.    _nop_(); //
  119.    _nop_(); //
  120.    _nop_(); //     
  121.    KeyBuf[0] = (KeyBuf[0]<<1)|S1;  //
  122.    KeyBuf[1] = (KeyBuf[1]<<1)|S2;  //
  123.    KeyBuf[2] = (KeyBuf[2]<<1)|S3;  //
  124.    for(i=0;i<3;i++)
  125.    {
  126.       if(KeyBuf[i]== 0x00)
  127.           {
  128.              KeySta[i] = 0;                  //按键为零
  129.                  KeyDownTime[i] += 1;  //按键持续按下
  130.           }
  131.           else if(KeyBuf[i]== 0xff)
  132.           {
  133.              KeySta[i] = 1;                 //按键弹起状态
  134.                  KeyDownTime[i]=0;  // 按键清零
  135.           }
  136.    }
  137.    _nop_(); //
  138.    _nop_(); //
  139.    LED_R=RLED; //
  140.    LED_G=GLED; //
  141.    LED_B=BLED; //
  142. //   _nop_(); //
  143. ……………………

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

所有资料51hei提供下载:
调光LED灯软件STC15F104.zip (78.79 KB, 下载次数: 85)
回复

使用道具 举报

ID:359281 发表于 2018-8-22 12:01 | 显示全部楼层
调光LED灯软件STC15F104 ,用的是STC宏晶8脚单片机 ,将一个旧的LED灯加了调光功能. 和大家学习探讨.  电路原理图如下:     单片机源程序如下 --------------------------------------------------------  Name File KEY,C  Versions number 1.0  Date      2016.01.01  Remarks   STC15F104E MCU - 文件名   :KEY.C  - 版本     :1.0 - 日期     :2016.01.01 - 备注     :STC15F104E MCU -------------------------------------------------------- #includeconfig.h      unsigned char T1RH,T1RL;   unsigned char code         KeyCodeMap[6]={ 按键值数组0-2是S1-S3短按 0x01,0x02,0x03,0x10,0x20,0x30         按键值数组3-5是S1-S3长按 }; unsigned char KeySta[3]={ 1,1,1 }; unsigned int idata KeyDownTime[3]={0,0,0};  按键按下持续时间 void configtime1(unsigned int ms); 定时器1配置 bit led1flag =1;   LED1状态标志位 bit led2flag =1;   LED2状态标志位 bit led3flag =1;   LED3状态标志位 bit led4flag =0; bit KeyLFlag = 0; 长按标志位 void KeyScan();     按键的扫描 void KeyDriver();   按键驱动 void LEDOUT();           void KeyAction(unsigned char KeyCode);   按键执行 -------------------------------- void KeyAction(unsigned char KeyCode) {           if(KeyCode==0x01)led1flag = ~led1flag;     if(KeyCode==0x02)led2flag = ~led2flag;     if(KeyCode==0x03)led3flag = ~led3flag;         if(KeyCode==0x10)led1flag = ~led1flag;     if(KeyCode==0x20)led2flag = ~led2flag;     if(KeyCode==0x30)led3flag = ~led3flag; } void LEDOUT() {      LED_R=led3flag;       LED_G=led1flag;       LED_B=led2flag;  } ---------------------------- void KeyDriver() {    unsigned char i;        static unsigned char idata backup[3]={1,1,1};      static unsigned int idata TimeThr[3]={600,600,600};      for(i=0;i3;i++)         循环检测3个按键    {    ---------------------------------       if(KeyDownTime[i]  0)   检测执行快速输入           {                                          if(KeyDownTime[i] = TimeThr[i])                  {                     if(KeyLFlag != 1)                         {                        KeyAction(KeyCodeMap[i+3]);                       TimeThr[i+3] += 200;                  KeyLFlag = 1;             }                  }           }       if(backup[i] != KeySta[i])           {              if(backup[i] != 1)                  {                     if(KeyLFlag)                         {                            KeyLFlag = 0;                         }                         else                         {                       KeyAction(KeyCodeMap[i]);                           }                  }              backup[i] = KeySta[i];               }    } } ---------定时器1的配置------------ void configtime1(unsigned int ms) {    unsigned long tmp;    tmp = 1105920012;      tmp =(tmpms)1000;      tmp = 65536 - tmp;       tmp = tmp + 18;          T1RH = (unsigned char)(tmp8);      T1RL = (unsigned char)tmp;      TMOD &= 0x0f;     TMOD = 0x10;     TH1 = T1RH;      TL1 = T1RL;       ET1 = 1;         TR1 = 1;         EA = 1;    } ---------按键的扫描函数---------- void KeyScan() {    bit RLED=0;      bit GLED=0;      bit BLED=0;      unsigned char i;      static unsigned char KeyBuf[]={    0xff,0xff,0xff    };     RLED=LED_R;     GLED=LED_G;     BLED=LED_B;      S1 = 1;     S2 = 1;     S3 = 1;      _nop_();     _nop_();     _nop_();          KeyBuf[0] = (KeyBuf[0]1)S1;      KeyBuf[1] = (KeyBuf[1]1)S2;      KeyBuf[2] = (KeyBuf[2]1)S3;      for(i=0;i3;i++)    {       if(KeyBuf[i]== 0x00)           {              KeySta[i] = 0;                  按键为零                  KeyDownTime[i] += 1;  按键持续按下           }           else if(KeyBuf[i]== 0xff)           {              KeySta[i] = 1;                 按键弹起状态                  KeyDownTime[i]=0;   按键清零           }    }    _nop_();     _nop_();      LED_R=RLED;     LED_G=GLED;     LED_B=BLED;     _nop_();  ……………………  …………限于本文篇幅 余下代码请从51黑下载附件………… 复制代码  所有资料51hei提供下载   调光LED灯软件STC15F104.zip (78.79 KB, 下载次数 2)
回复

使用道具 举报

ID:359281 发表于 2018-8-22 12:04 | 显示全部楼层
你好,有汇编的程序吗?
回复

使用道具 举报

ID:35873 发表于 2018-8-23 03:25 | 显示全部楼层
不错  有空也搞个玩玩
回复

使用道具 举报

ID:59830 发表于 2018-12-23 00:24 | 显示全部楼层
没有汇编
回复

使用道具 举报

ID:63317 发表于 2019-8-5 09:11 | 显示全部楼层
谢谢复习资料
回复

使用道具 举报

ID:591640 发表于 2019-8-5 11:51 来自手机 | 显示全部楼层
谢谢楼主分享
回复

使用道具 举报

ID:140183 发表于 2020-1-31 21:02 | 显示全部楼层
很好。太谢谢啦!
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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