[51单片机] 基于51单片机之触控调光台灯实验测试

[复制链接]
1077|0
 楼主| 侣行天下 发表于 2015-8-28 08:40 | 显示全部楼层 |阅读模式
  1. ******************************  Copyright(C) CaKe  ************************************
  2. ========================================================================================
  3. ==============**版权信息   : CaKen工作室                                  ==============
  4. ==============**文件名     : main.c                                       ==============
  5. ==============**作者       : CaKen                                        ==============
  6. ==============**版本号     : V1.0                                         ==============
  7. ==============**时间       : 2014.08.28                                   ==============
  8. ==============**功能描述   : 触控调光台灯实验测试                         ==============
  9. ========================================================================================
  10. ==============**新浪微博   :CaKen            ==============
  11. ****************************************************************************************

  12. #include"STC12C5A60S2.H"      //STC12Cx052或STC12Cx052AD系列单片机头文件

  13. sbit ON_OFF_Key =  P2 ^ 0;   //ON/OFF开关键
  14. sbit Add_Key    =  P2 ^ 3;   //加亮度(+)
  15. sbit Doc_Key    =  P2 ^ 7;   //减亮度(-)
  16. //LED与P1.3(PWM0)连接

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


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

  37. ****************************************************************************************
  38. 函数名:PWM0占空比设置函数
  39. 调  用:PWM0_Set();
  40. 参  数:0x00~0xFF(亦可用0~255)
  41. 返回值:无
  42. 结  果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平
  43. 备  注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
  44. ****************************************************************************************/

  45. void PWM0_Set (unsigned char a)
  46. {
  47. CCAP0L= a; //设置值直接写入CCAP0L
  48.   CCAP0H= a; //设置值直接写入CCAP0H
  49. }

  50. ***************************************************************************************
  51. 函数名:毫秒级CPU延时函数
  52. 调  用:DELAY_MS (?);
  53. 参  数:1~65535(参数不可为0)
  54. 返回值:无
  55. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  56. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  57. ****************************************************************************************/

  58. void DELAY_MS (unsigned int a)
  59. {
  60. unsigned int i;
  61. while( --a != 0)
  62. {
  63.   for(i = 0; i < 600; i++);
  64. }
  65. }

  66. ***************************************************************************************
  67. 函数名:UART串口初始化函数
  68. 调  用:UART_Init();
  69. 参  数:无
  70. 返回值:无
  71. 结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
  72. 备  注:振荡晶体为12MHz,PC串口端设置 [ 9600,8,无,1,无 ]
  73. ***************************************************************************************/

  74. void UART_Init (void)
  75. {
  76. EA = 1;         //允许总中断(如不使用中断,可用//屏蔽)
  77. ES = 1;         //允许UART串口的中断
  78. TMOD = 0x20; //定时器T/C1工作方式2
  79. SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
  80. TH1  = 0xFD; //定时器初值高8位设置 9600
  81. TL1  = 0xFD; //定时器初值低8位设置
  82. PCON = 0x80; //波特率倍频
  83. TR1  = 1;     //定时器启动   
  84. }

  85. ****************************************************************************************
  86. 函数名:UART串口发送函数
  87. 调  用:UART_Send (?);
  88. 参  数:需要UART串口发送的数据(8位/1字节)
  89. 返回值:无
  90. 结  果:将参数中的数据发送给UART串口,确认发送完成后退出
  91. 备  注:
  92. ****************************************************************************************/

  93. void UART_Send (unsigned char UART_data)
  94. {                        //定义串口发送数据变量
  95. SBUF = UART_data;  //将接收的数据发送回去
  96. while(TI == 0);   //检查发送中断标志位
  97. TI = 0;        //令发送中断标志位为0(软件清零)
  98. }

  99. ****************************************************************************************
  100. 函数名:主函数
  101. 调  用:无
  102. 参  数:无
  103. 返回值:无
  104. 结  果:程序开始处,无限循环
  105. 备  注:调光台灯,触摸延时灯
  106. ****************************************************************************************/

  107. void main (void)
  108. {
  109. PWM_Init();                         //PWM初始化
  110. UART_Init();                        //串口初始化
  111. P2M0 = 0x00;                        //将P2接口设置为高阻态输入
  112. P2M1 = 0xFF;                        //触摸按键启用
  113. PWM0_Set(0);
  114. UART_Send (Bright);                 //把亮度值发给PC机   
  115. DELAY_MS(200);                      //延时等待I/O接口电平状态稳定
  116. while(1)
  117. {
  118.   unsigned char a;
  119.      UART_Send (Bright);             //把亮度值发给PC机   
  120.   if(ON_OFF_Key == 1)             //开关键按下
  121.   {
  122.    if(POWER == 0)             //如果当前状态为关,则执行开灯程序
  123.    {
  124.     for(a=0;a<=Bright;a++)
  125.     {
  126.      PWM0_Set(a);
  127.      DELAY_MS (20);      //渐暗的时间间隔  
  128.     }
  129.     PWM0_Set(Bright);        //达到存储的LED亮度
  130.     POWER = 1;               //把状态标志位变成开

  131. //    DELAY_MS (10000);   //10秒之后,灯自动关闭
  132. //    PWM0_Set(0);
  133.    }
  134.    else          //如果当前状态为开,则执行关灯程序
  135.    {
  136.     for(a=Bright;a>0;a--)    //循环渐暗
  137.     {
  138.      PWM0_Set(a);
  139.      DELAY_MS (20);      //渐暗的时间间隔
  140.     }
  141.     PWM0_Set(0);            //关LED
  142.     POWER = 0;              //把状态标志位变成关
  143.    }
  144.    while(ON_OFF_Key == 0);     //等待按键放开
  145.   }

  146.   if(Add_Key == 1 && POWER == 1) //加亮度键按下,同时在开灯状态下
  147.   {
  148.    Bright++;                   //亮度值加1
  149.    PWM0_Set(Bright);           //将值写入PWM控制LED亮度
  150.    if(Bright >= 0xFD)         //如果亮度值大于0xFD,则不再增加
  151.    {
  152.     Bright = 0xFD;
  153.    }
  154.    DELAY_MS (20);              //渐变亮度的时间间隔
  155.   }

  156.   if(Doc_Key == 1 && POWER == 1) //减亮度键按下,同时在开灯状态下
  157.   {
  158.    Bright--;                   //亮度值减1
  159.    PWM0_Set(Bright);           //将值写入PWM控制LED亮度
  160.    if(Bright < 0x08)           //如果亮度值小于0x08,则不再减少
  161.    {
  162.     Bright = 0x08;
  163.    }
  164.    DELAY_MS (100);              //渐变亮度的时间间隔
  165.   }
  166. }
  167. }


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

本版积分规则

30

主题

265

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部