找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机触控调光台灯程序

[复制链接]
跳转到指定楼层
楼主
ID:137190 发表于 2016-9-25 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
资料下载:
触控调光台灯.zip (22.02 KB, 下载次数: 71)
  1. /*********************************************************************************************
  2. 程序名:    触控调光台灯(UART串口调试版)
  3. 编写人:    杜洋 
  4. 编写时间:  7月 25日
  5. 硬件支持:  STC12C2052  12MHz
  6. 接口说明:  P3.7(PWM0)用PWM控制LED,P1.5~P1.7接3路触摸键  
  7. 修改日志:  
  8.   NO.1-20090725_0622 完成触控开关LED灯部分和PWM调光部分程序。
  9.         NO.2-20090725_0638 完成开关灯时的渐变亮度。
  10.         NO.3-20090725_1208 加入UART串口调试程序。                                                               
  11. /*********************************************************************************************
  12. 说明:电路制作时需要将触摸键和VCC线放在一起,然后触摸时将手同时触摸按键引脚和VCC线。

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

  14. #include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列单片机头文件

  15. sbit ON_OFF_Key = P1 ^ 7; //ON/OFF开关键
  16. sbit Add_Key = P1 ^ 6; //加亮度(+)
  17. sbit Doc_Key = P1 ^ 5; //减亮度(-)
  18. //LED与P3.7(PWM0)连接

  19. unsigned char Bright=0x88; //全局变量,亮度值
  20. bit POWER=0; //LED灯开/关状态标志位


  21. /*********************************************************************************************
  22. 函数名:PWM初始化函数
  23. 调  用:PWM_init();
  24. 参  数:无
  25. 返回值:无
  26. 结  果:将PCA初始化为PWM模式,初始占空比为0
  27. 备  注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可
  28. /**********************************************************************************************/
  29. void PWM_init (void){
  30. CMOD=0x02; //设置PCA定时器
  31.         CL=0x00;
  32.         CH=0x00;
  33.         CCAPM0=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
  34.         CCAP0L=0x00; //设置PWM0初始值与CCAP0H相同
  35.         CCAP0H=0x00; // PWM0初始时为0
  36.         CR=1; //启动PCA定时器
  37. }
  38. /**********************************************************************************************/

  39. /*********************************************************************************************
  40. 函数名:PWM0占空比设置函数
  41. 调  用:PWM0_set();
  42. 参  数:0x00~0xFF(亦可用0~255)
  43. 返回值:无
  44. 结  果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平
  45. 备  注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
  46. /**********************************************************************************************/
  47. void PWM0_set (unsigned char a){
  48.         CCAP0L= a; //设置值直接写入CCAP0L
  49.         CCAP0H= a; //设置值直接写入CCAP0H
  50. }
  51. /**********************************************************************************************/

  52. /*********************************************************************************************
  53. 函数名:毫秒级CPU延时函数
  54. 调  用:DELAY_MS (?);
  55. 参  数:1~65535(参数不可为0)
  56. 返回值:无
  57. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  58. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  59. /*********************************************************************************************/
  60. void DELAY_MS (unsigned int a){
  61.         unsigned int i;
  62.         while( --a != 0){
  63.                 for(i = 0; i < 600; i++);
  64.         }
  65. }
  66. /*********************************************************************************************/

  67. /*********************************************************************************************
  68. 函数名:UART串口初始化函数
  69. 调  用:UART_init();
  70. 参  数:无
  71. 返回值:无
  72. 结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
  73. 备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
  74. /**********************************************************************************************/
  75. void UART_init (void){
  76.         EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
  77.         ES = 1; //允许UART串口的中断

  78.         TMOD = 0x20;        //定时器T/C1工作方式2
  79.         SCON = 0x50;        //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
  80.         TH1 = 0xF3;        //定时器初值高8位设置
  81.         TL1 = 0xF3;        //定时器初值低8位设置
  82.         PCON = 0x80;        //波特率倍频(屏蔽本句波特率为2400)
  83.         TR1 = 1;        //定时器启动   
  84. }
  85. /**********************************************************************************************/

  86. /*********************************************************************************************
  87. 函数名:UART串口发送函数
  88. 调  用:UART_T (?);
  89. 参  数:需要UART串口发送的数据(8位/1字节)
  90. 返回值:无
  91. 结  果:将参数中的数据发送给UART串口,确认发送完成后退出
  92. 备  注:
  93. /**********************************************************************************************/
  94. void UART_T (unsigned char UART_data){ //定义串口发送数据变量
  95.         SBUF = UART_data;        //将接收的数据发送回去
  96.         while(TI == 0);                //检查发送中断标志位
  97.         TI = 0;                        //令发送中断标志位为0(软件清零)
  98. }
  99. /**********************************************************************************************/

  100. /*********************************************************************************************
  101. 函数名:主函数
  102. 调  用:无
  103. 参  数:无
  104. 返回值:无
  105. 结  果:程序开始处,无限循环
  106. 备  注:
  107. /**********************************************************************************************/
  108. void main (void){
  109.         PWM_init(); //PWM初始化
  110.         UART_init(); //串口小秘书在此初始化了 ^_^

  111.         P1M0 = 0xff; //将P1接口设置为高阻态输入
  112.         P1M1 = 0x00; //触摸按键启用

  113.         DELAY_MS (200); //延时等待I/O接口电平状态稳定

  114.         while(1){ //循环程序部分
  115.                 unsigned char a; //临时变量

  116.                 UART_T (Bright); //把亮度值发给PC机 @_@|||
  117.                
  118.                 if(ON_OFF_Key == 1){ //开关键按下
  119.                         if(POWER == 0){ //如果当前状态为关,则执行开灯程序
  120.                                 for(a=0;a<=Bright;a++){ //
  121.                                         PWM0_set(a);
  122.                                         DELAY_MS (20); //渐暗的时间间隔               
  123.                                 }
  124.                                 PWM0_set(Bright); //达到存储的LED亮度
  125.                                 POWER = 1; //把状态标志位变成开       
  126.                         }else{ //如果当前状态为开,则执行关灯程序
  127.                                 for(a=Bright;a>0;a--){ //循环渐暗
  128.                                         PWM0_set(a);
  129.                                         DELAY_MS (20); //渐暗的时间间隔       
  130.                                 }
  131.                                 PWM0_set(0); //关LED
  132.                                 POWER = 0; //把状态标志位变成关
  133.                         }
  134.                         while(ON_OFF_Key == 1); //等待按键放开
  135.                 }

  136.                 if(Add_Key == 1 && POWER == 1){ //加亮度键按下,同时在开灯状态下
  137.                         Bright++; //亮度值加1
  138.                         PWM0_set(Bright); //将值写入PWM控制LED亮度
  139.                         if(Bright >= 0xFD){ //如果亮度值大于0xFD,则不再增加
  140.                                 Bright = 0xFD;
  141.                         }
  142.                         DELAY_MS (20); //渐变亮度的时间间隔
  143.                 }

  144.                 if(Doc_Key == 1 && POWER == 1){ //减亮度键按下,同时在开灯状态下
  145.                         Bright--; //亮度值减1
  146.                         PWM0_set(Bright); //将值写入PWM控制LED亮度
  147.                         if(Bright < 0x08){ //如果亮度值小于0x08,则不再减少
  148.                                 Bright = 0x08;
  149.                         }
  150.                         DELAY_MS (20); //渐变亮度的时间间隔
  151.                 }
  152.         }
  153. }
  154. /**********************************************************************************************/
复制代码



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

使用道具 举报

沙发
ID:152402 发表于 2016-12-5 21:26 | 只看该作者
只有代码吗
回复

使用道具 举报

板凳
ID:166809 发表于 2017-2-26 22:51 | 只看该作者
有分享的电路图吗
回复

使用道具 举报

地板
ID:166888 发表于 2017-2-27 13:36 | 只看该作者
厉害了~~谢谢楼主风向
回复

使用道具 举报

5#
ID:249545 发表于 2018-4-16 11:59 | 只看该作者
可是没有电路图哦?
看来还是需要购买杜洋老师写的那本书才能做个台灯玩.
回复

使用道具 举报

6#
ID:418683 发表于 2018-12-25 20:10 | 只看该作者
你好
做实验灯不亮
怎么回事?
回复

使用道具 举报

7#
ID:407135 发表于 2020-4-6 21:53 | 只看该作者
有分享的电路图吗
回复

使用道具 举报

8#
ID:407135 发表于 2020-4-6 21:53 | 只看该作者
有分享的电路图吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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