找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机触控调光程序C语言

[复制链接]
跳转到指定楼层
楼主
ID:263316 发表于 2017-12-18 21:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*********************************************************************************************
程序名:    触控调光台灯
编写人:    孙文
编写时间:  2017年 12月 25日
硬件支持:  STC12C2052  12MHz
接口说明:  P3.7(PWM0)用PWM控制LED,P1.5~P1.7接3路触摸键  
修改日志:  
  NO.1-20090725_0622 完成触控开关LED灯部分和PWM调光部分程序。
NO.2-20090725_0638 完成开关灯时的渐变亮度。        
/*********************************************************************************************
说明:电路制作时需要将触摸键和VCC线放在一起,然后触摸时将手同时触摸按键引脚和VCC线。
/*********************************************************************************************/
#include <STC12C2052AD.H> //STC12Cx052或STC12Cx052AD系列单片机头文件
sbit ON_OFF_Key = P1 ^ 7; //ON/OFF开关键
sbit Add_Key = P1 ^ 6; //加亮度(+)
sbit Doc_Key = P1 ^ 5; //减亮度(-)
//LED与P3.7(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++);
}
}
/*********************************************************************************************/
/*********************************************************************************************
函数名:主函数
调  用:无
参  数:无
返回值:无
结  果:程序开始处,无限循环
备  注:
/**********************************************************************************************/
void main (void){
PWM_init(); //PWM初始化
P1M0 = 0xff; //将P1接口设置为高阻态输入
P1M1 = 0x00; //触摸按键启用
DELAY_MS (200); //延时等待I/O接口电平状态稳定
while(1){ //循环程序部分
  unsigned char a; //临时变量
  
  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; //把状态标志位变成开
   }else{ //如果当前状态为开,则执行关灯程序
    for(a=Bright;a>0;a--){ //循环渐暗
     PWM0_set(a);
     DELAY_MS (20); //渐暗的时间间隔
    }
    PWM0_set(0); //关LED
    POWER = 0; //把状态标志位变成关
   }
   while(ON_OFF_Key == 1); //等待按键放开
  }
  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 (20); //渐变亮度的时间间隔
  }
}
}
/**********************************************************************************************/

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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