专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

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

作者:CaKen   来源:CaKen工作室   点击数:  更新时间:2014年09月02日   【字体:

 ******************************  Copyright(C) CaKe  ************************************

========================================================================================
==============**版权信息   : CaKen工作室                                  ==============
==============**文件名     : main.c                                       ==============
==============**作者       : CaKen                                        ==============
==============**版本号     : V1.0                                         ==============
==============**时间       : 2014.08.28                                   ==============
==============**功能描述   : 触控调光台灯实验测试                         ==============
========================================================================================
==============**新浪微博   :CaKen            ==============
****************************************************************************************
 
#include"STC12C5A60S2.H"      //STC12Cx052或STC12Cx052AD系列单片机头文件
 
sbit ON_OFF_Key =  P2 ^ 0;   //ON/OFF开关键
sbit Add_Key    =  P2 ^ 3;   //加亮度(+)
sbit Doc_Key    =  P2 ^ 7;   //减亮度(-)
//LED与P1.3(PWM0)连接
 
unsigned char Bright = 0x88;  //全局变量,亮度值
bit POWER            = 0;     //LED灯开/关状态标志位
 
 
***************************************************************************************
函数名:PWM初始化函数
调  用:PWM_Init();
参  数:无
返回值:无
结  果:将PCA初始化为PWM模式,初始占空比为0
备  注:需要更多路PWM输出直接插入CCAPnH和CCAPnL即可
***************************************************************************************/
void PWM_Init (void)
{
    CMOD   = 0x02;  //设置PCA定时器
  CL     = 0x00;
  CH     = 0x00;
 CCAPM0 = 0x42;  //PWM0设置PCA工作方式为PWM方式(0100 0010)
  CCAP0L = 0x00;  //设置PWM0初始值与CCAP0H相同
  CCAP0H = 0x00;  //PWM0初始时为0
  CR     = 1;     //启动PCA定时器
}
 
****************************************************************************************
函数名:PWM0占空比设置函数
调  用:PWM0_Set();
参  数:0x00~0xFF(亦可用0~255)
返回值:无
结  果:设置PWM模式占空比,为0时全部高电平,为1时全部低电平
备  注:如果需要PWM1的设置函数,只要把CCAP0L和CCAP0H中的0改为1即可
****************************************************************************************/
 
void PWM0_Set (unsigned char a)
{
 CCAP0L= a; //设置值直接写入CCAP0L
  CCAP0H= a; //设置值直接写入CCAP0H
}
 
***************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
****************************************************************************************/
 
void DELAY_MS (unsigned int a)
{
 unsigned int i;
 while( --a != 0)
 {
  for(i = 0; i < 600; i++);
 }
}
 
***************************************************************************************
函数名:UART串口初始化函数
调  用:UART_Init();
参  数:无
返回值:无
结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
备  注:振荡晶体为12MHz,PC串口端设置 [ 9600,8,无,1,无 ]
***************************************************************************************/
 
void UART_Init (void)
{
 EA = 1;         //允许总中断(如不使用中断,可用//屏蔽)
 ES = 1;         //允许UART串口的中断
 TMOD = 0x20; //定时器T/C1工作方式2
 SCON = 0x50; //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
 TH1  = 0xFD; //定时器初值高8位设置 9600
 TL1  = 0xFD; //定时器初值低8位设置
 PCON = 0x80; //波特率倍频
 TR1  = 1;     //定时器启动   
}
 
****************************************************************************************
函数名:UART串口发送函数
调  用:UART_Send (?);
参  数:需要UART串口发送的数据(8位/1字节)
返回值:无
结  果:将参数中的数据发送给UART串口,确认发送完成后退出
备  注:
****************************************************************************************/
 
void UART_Send (unsigned char UART_data)
{                        //定义串口发送数据变量
 SBUF = UART_data;  //将接收的数据发送回去
 while(TI == 0);   //检查发送中断标志位
 TI = 0;        //令发送中断标志位为0(软件清零)
}
 
****************************************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:调光台灯,触摸延时灯
****************************************************************************************/
 
void main (void)
{
 PWM_Init();                         //PWM初始化
 UART_Init();                        //串口初始化
 P2M0 = 0x00;                        //将P2接口设置为高阻态输入
 P2M1 = 0xFF;                        //触摸按键启用
 PWM0_Set(0);
 UART_Send (Bright);                 //把亮度值发给PC机   
 DELAY_MS(200);                      //延时等待I/O接口电平状态稳定
 while(1)
 {
  unsigned char a;
     UART_Send (Bright);             //把亮度值发给PC机   
  if(ON_OFF_Key == 1)             //开关键按下
  {
   if(POWER == 0)             //如果当前状态为关,则执行开灯程序
   {
    for(a=0;a<=Bright;a++)
    {
     PWM0_Set(a);
     DELAY_MS (20);      //渐暗的时间间隔  
    }
    PWM0_Set(Bright);        //达到存储的LED亮度
    POWER = 1;               //把状态标志位变成开
 
//    DELAY_MS (10000);   //10秒之后,灯自动关闭
//    PWM0_Set(0); 
   }
   else          //如果当前状态为开,则执行关灯程序
   {
    for(a=Bright;a>0;a--)    //循环渐暗
    {
     PWM0_Set(a);
     DELAY_MS (20);      //渐暗的时间间隔 
    }
    PWM0_Set(0);            //关LED
    POWER = 0;              //把状态标志位变成关
   }
   while(ON_OFF_Key == 0);     //等待按键放开
  }
 
  if(Add_Key == 1 && POWER == 1) //加亮度键按下,同时在开灯状态下
  {
   Bright++;                   //亮度值加1
   PWM0_Set(Bright);           //将值写入PWM控制LED亮度
   if(Bright >= 0xFD)         //如果亮度值大于0xFD,则不再增加
   {
    Bright = 0xFD;
   }
   DELAY_MS (20);              //渐变亮度的时间间隔
  }
 
  if(Doc_Key == 1 && POWER == 1) //减亮度键按下,同时在开灯状态下
  {
   Bright--;                   //亮度值减1
   PWM0_Set(Bright);           //将值写入PWM控制LED亮度
   if(Bright < 0x08)           //如果亮度值小于0x08,则不再减少
   {
    Bright = 0x08;
   }
   DELAY_MS (100);              //渐变亮度的时间间隔
  }
 }
}
 
 
关闭窗口