2804|1

2

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

单片机触控调光台灯程序 [复制链接]

  • /*********************************************************************************************
  • 程序名:    触控调光台灯(UART串口调试版)
  • 编写人:    杜洋
  • 编写时间:  7月 25日
  • 硬件支持:  STC12C2052  12MHz
  • 接口说明:  P3.7(PWM0)用PWM控制LED,P1.5~P1.7接3路触摸键
  • 修改日志:
  •   NO.1-20090725_0622 完成触控开关LED灯部分和PWM调光部分程序。
  •         NO.2-20090725_0638 完成开关灯时的渐变亮度。
  •         NO.3-20090725_1208 加入UART串口调试程序。
  • /*********************************************************************************************
  • 说明:电路制作时需要将触摸键和VCC线放在一起,然后触摸时将手同时触摸按键引脚和VCC线。
  • /*********************************************************************************************/
  • #include //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++);
  •         }
  • }
  • /*********************************************************************************************/
  • /*********************************************************************************************
  • 函数名:UART串口初始化函数
  • 调  用:UART_init();
  • 参  数:无
  • 返回值:无
  • 结  果:启动UART串口接收中断,允许串口接收,启动T/C1产生波特率(占用)
  • 备  注:振荡晶体为12MHz,PC串口端设置 [ 4800,8,无,1,无 ]
  • /**********************************************************************************************/
  • void UART_init (void){
  •         EA = 1; //允许总中断(如不使用中断,可用//屏蔽)
  •         ES = 1; //允许UART串口的中断
  •         TMOD = 0x20;        //定时器T/C1工作方式2
  •         SCON = 0x50;        //串口工作方式1,允许串口接收(SCON = 0x40 时禁止串口接收)
  •         TH1 = 0xF3;        //定时器初值高8位设置
  •         TL1 = 0xF3;        //定时器初值低8位设置
  •         PCON = 0x80;        //波特率倍频(屏蔽本句波特率为2400)
  •         TR1 = 1;        //定时器启动
  • }
  • /**********************************************************************************************/
  • /*********************************************************************************************
  • 函数名:UART串口发送函数
  • 调  用:UART_T (?);
  • 参  数:需要UART串口发送的数据(8位/1字节)
  • 返回值:无
  • 结  果:将参数中的数据发送给UART串口,确认发送完成后退出
  • 备  注:
  • /**********************************************************************************************/
  • void UART_T (unsigned char UART_data){ //定义串口发送数据变量
  •         SBUF = UART_data;        //将接收的数据发送回去
  •         while(TI == 0);                //检查发送中断标志位
  •         TI = 0;                        //令发送中断标志位为0(软件清零)
  • }
  • /**********************************************************************************************/
  • /*********************************************************************************************
  • 函数名:主函数
  • 调  用:无
  • 参  数:无
  • 返回值:无
  • 结  果:程序开始处,无限循环
  • 备  注:
  • /**********************************************************************************************/
  • void main (void){
  •         PWM_init(); //PWM初始化
  •         UART_init(); //串口小秘书在此初始化了 ^_^
  •         P1M0 = 0xff; //将P1接口设置为高阻态输入
  •         P1M1 = 0x00; //触摸按键启用
  •         DELAY_MS (200); //延时等待I/O接口电平状态稳定
  •         while(1){ //循环程序部分
  •                 unsigned char a; //临时变量
  •                 UART_T (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; //把状态标志位变成开
  •                         }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); //渐变亮度的时间间隔
  •                 }
  •         }
  • }
  • /**********************************************************************************************/

此帖出自51单片机论坛
点赞(1) 关注(1)
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
好。。。。。。
此帖出自51单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表