****************************** 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); //渐变亮度的时间间隔 } } }
收藏0 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
30
265
0
扫码关注 21ic 官方微信
扫码关注嵌入式微处理器
扫码关注电源系统设计
扫码关注21ic项目外包
扫码浏览21ic手机版
本站介绍 | 申请友情链接 | 欢迎投稿 | 隐私声明 | 广告业务 | 网站地图 | 联系我们 | 诚聘英才
京公网安备 11010802024343号