
51单片机pwm调光电路参考源程序:
int potpin=0//定义模拟接口0
int ledpin=11//定义数字接口11(PWM 输出)
int val=0// 暂存来自传感器的变量数值
void setup()
{
pinMode(ledpin,OUTPUT)//定义数字接口11 为输出
Serial.begin(9600)//设置波特率为9600
//注意:模拟接口自动设置为输入
}
void loop()
{
val=analogRead(potpin)// 读取传感器的模拟值并赋值给val
Serial.println(val)//显示val 变量
analogWrite(ledpin,val/4)// 打开LED 并设置亮度(PWM 输__________出最大值255)
delay(10)//延时0.01 秒
}
原理图:
PWM简介:
Pulse Width Modulation 就是通常所说的PWM,译为脉冲宽度调制,简称脉宽调制。脉冲宽度调制(PWM)是一种对模拟信号电平进行数字编码的方法,由于计算机不能输出模拟电压,只能输出0 或5V 的的数字电压值,我们就通过使用高分辨率计数器,利用方波的占空比被调制的方法来对一个具体模拟信号的电平进行编码。
CYCLE=10;在初始化中,在程序中不会改变;pwm周期PWM_ON只在主循环来改变;延时程序很长delay(1000)中断函数执行很多次,第一次count=0时,就把led灭了,当PWM_ON=2时,有了亮度,此亮度保持到,PWM_ON=2,加亮,直到PWM_ON=10,最亮,开始执行变暗程序。
共两个:/*********************************************************************************************
程序名:触控调光台灯
编写人:杜洋
编写时间: 2009年 7月 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 = 0i <600i++)
}
}
/*********************************************************************************************/
/*********************************************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:程序开始处,无限循环
备 注:
/**********************************************************************************************/
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=0a<=Brighta++){ //
PWM0_set(a)
DELAY_MS (20)//渐暗的时间间隔
}
PWM0_set(Bright)//达到存储的LED亮度
POWER = 1//把状态标志位变成开
}else{ //如果当前状态为开,则执行关灯程序
for(a=Brighta>0a--){ //循环渐暗
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)//渐变亮度的时间间隔
}
}
}
/**********************************************************************************************/
/*************************************************************
* 杜洋工作室 DoYoung Studio
* 与电子爱好者同行 www.DoYoung.net
/*************************************************************/
/*********************************************************************************************
程序名:PWM模块调试程序(仅实验用)
编写人:杜洋
编写时间: 2009年7月22日
硬件支持: STC12C2052 12MHz
接口说明: LED灌电流接P3.7接口(PWM0)
修改日志:
NO.1-
/*********************************************************************************************
说明:
/*********************************************************************************************/
#include<STC12C2052AD.H>//头文件
/*********************************************************************************************
函数名: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
//CCAPM1=0x42//PWM1设置PCA工作方式为PWM方式(使用时删除//)
//CCAP1L=0x00//设置PWM1初始值与CCAP0H相同
//CCAP1H=0x00// PWM1初始时为0
//CCAPM2=0x42//PWM2设置PCA工作方式为PWM方式
//CCAP2L=0x00//设置PWM2初始值与CCAP0H相同
//CCAP2H=0x00// PWM2初始时为0
//CCAPM3=0x42//PWM3设置PCA工作方式为PWM方式
//CCAP3L=0x00//设置PWM3初始值与CCAP0H相同
//CCAP3H=0x00// PWM3初始时为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
}
/**********************************************************************************************/
/*********************************************************************************************
函数名:主函数
调 用:无
参 数:无
返回值:无
结 果:程序开始处,无限循环
备 注:
/**********************************************************************************************/
void main (void){
PWM_init()//PWM初始化
PWM0_set(0x10)//设置PWM占空比
while(1){
//无限循环程序
}
}
/**********************************************************************************************/
/*************************************************************
* 杜洋工作室 DoYoung Studio
* 与电子爱好者同行 www.DoYoung.net
/*************************************************************/
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)