登录
|
立即注册
|
使用QQ帐号登录
论坛
>
51单片机
发帖
|
单片机触控调光台灯程序
看8094
|
回7
|
收藏
楼主
ID:137190
只看他
2016-9-25 15:38
资料下载:
触控调光台灯.zip
(22.02 KB)
(下载次数: 71, 2016-9-25 15:37 上传)
下载积分: 黑币 -5
代码:
/*********************************************************************************************
程序名: 触控调光台灯(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 <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++);
}
}
/*********************************************************************************************/
/*********************************************************************************************
函数名: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); //渐变亮度的时间间隔
}
}
}
/**********************************************************************************************/
沙发
ID:152402
只看他
2016-12-5 21:26
只有代码吗
板凳
ID:166809
只看他
2017-2-26 22:51
有分享的电路图吗
地板
ID:166888
只看他
2017-2-27 13:36
厉害了~~谢谢楼主风向
5
#
ID:249545
只看他
2018-4-16 11:59
可是没有电路图哦?
看来还是需要购买杜洋老师写的那本书才能做个台灯玩.
6
#
ID:418683
只看他
2018-12-25 20:10
你好
做实验灯不亮
怎么回事?
7
#
ID:407135
只看他
2020-4-6 21:53
有分享的电路图吗
8
#
ID:407135
只看他
2020-4-6 21:53
有分享的电路图吗
51黑电子论坛
Powered by
Discuz!
X3.1
首页
|
标准版
|
触屏版
|
电脑版