如何用51单片机产生pwm 并利用pwm控制led灯的功率?

作者&投稿:晁廖 (若有异议请与网页底部的电邮联系)
如何用51单片机产生pwm 并利用pwm控制led灯的功率?~

#include
sfr CCON = 0xD8;
sfr CMOD = 0xD9;
sfr CL = 0xE9;
sfr CH = 0xF9;
sfr CCAP0L = 0xEA;
sfr CCAP0H = 0xFA;
sfr CCAPM0 = 0xDA;
sfr CCAPM1 = 0xDB;
#define uint unsigned int
#define uchar unsigned char
uchar whith_p=50;
uchar max_p=255;
uchar min_p=1;
uint fre = 0xffff;
sbit CR = 0xDE;
sbit led = P2^0;
void timer0_int (void) interrupt 1 using 1
{
TH0 = fre >> 8;
TL0 = fre & 0xff;
led = ~led;
}
void timer0_init(void)
{
TMOD &= 0xf0;
TMOD |= 0x1;
TH0 = 0xff;
TL0 = 0xff;
TR0 = 1;
ET0 = 1;
}

void pwm_init(void)
{
CMOD = 0x4;
CL = 0x0;
CH = 0x0;
CCAP0H = whith_p;
CCAPM0 = 0x42;
CR = 1;
}

void soft_delay(uint _1ms)
{
unsigned int tmp;
while(_1ms--!=0) {
for(tmp=0;tmp<144;tmp++);
}
}
void pwm_out(void)
{
whith_p=50;
while(whith_p<max_p)
{ CCAP0H =whith_p;
soft_delay(10);
whith_p=whith_p+5;
CCAP0H = whith_p;
soft_delay(10);
}

whith_p=max_p;
while(min_p<whith_p)
{ CCAP0H = whith_p;
soft_delay(10);
whith_p=whith_p-5;
CCAP0H = whith_p;
soft_delay(10);
}

}

void main (void)
{
pwm_init();
timer0_init();
EA = 1;
while(1){
pwm_out();
}
}




STC单片机具有PWM输出功能,最近玩12864LCD万年历时,用的是杜洋的FT4时钟电路,用他提供的H文件控制时,具有调光功能,由于只是玩一玩,没有购买源码,而网上流行的程序都没有此功能,无奈,只能自己弄,好在杜老师及人所及早在网站中备下了资料,简单攒一下,居然成功了,并成功的汇入了万年历的程序中,现在将其改成完整的控制程序公开于此供参考。

/*************************************************
STC单片机单/双键控制LED亮度PWM调光程序 原创WanNengGong 2010/09/20
参考程序: 杜洋工作室PWM功能程序模块
*************************************************/
#include //头文件
#define uchar unsigned char
#define uint unsigned int
uchar vx=5;
//vx=5在用于12864LCD的LED背光调整时上电为半亮度状态,可根据自己的用途及要求任意设定
sbit KEY_H=P2^4;
sbit KEY_L=P2^5;
/*******************************************************************************/
void PWM_init (void){//PWM初始化函数
CMOD=0x02; //设置PCA定时器
CL=0x00;
CH=0x00;
CCAPM1=0x42; //PWM0设置PCA工作方式为PWM方式(0100 0010)
CCAP1L=0x00; //设置PWM0初始值与CCAP0H相同
CCAP1H=0x00; // PWM0初始时为0
CR=1; //启动PCA定时器
}
/******************************************************************************/
void PWM0_set (uchar a){//PWM0占空比设置函数
CCAP1L=a; //设置值直接写入CCAP1L
CCAP1H=a; //设置值直接写入CCAP1H
}
/*****************************************************************************/
void DelayM(unsigned int a){//延时函数 1mS/次(用于1T单片机)
unsigned char n,i,j;
while(--a!=0){
for(n=1;n>0;n--)
for(j=222;j>0;j--)
for(i=12;i>0;i--);
} }
/****************************************************************************/
void main(void)
{
KEY_H = 1;KEY_L = 1;
PWM_init ();
while(1)
{
PWM0_set(vx*24);
//数字24是配合vx调试取得的,此时vx的赋值范围约为1-10对应最暗-最亮

//--------减调整---------//
if (KEY_L == 0 ){
DelayM(20); //延时20毫秒消抖动
if(KEY_L == 0){ //如果20SM后KEY_L还是0状态则确认下调键是按下的
vx--;
if(vx<1){vx=5;}
//如果设定vx=10,将语句改为if(vx<1){vx=10;}则为单按键循环控制,则可去除加调整控制部分
}
while(KEY_L == 0);//等待键松开
}
//--------加调整---------//
if (KEY_H == 0 ){
DelayM(20);
if(KEY_H == 0){
vx++;
if(vx>10){vx=5;}
}
while(KEY_H == 0);
}
}
}




程序自己理解消化了,就可以编出你自己的程序了,你说的,完全可以实现,而且比这俩个例子简单N多。
这是百度里面别人的回答,感觉可以解决您单片机产生PWM的问题了,至于后面如何控制功率,那你就要搞清功率的单位是什么,除了w,还有什么,在时间一定的情况下,如何改变功率,只需要改变其PWM的占空比。如果一个周期里面,它有50%是高电平,那么它是正常输入的50%的功率,如果只有20%呢,10%呢?这不就在改变其功率么?

电流800mA,那要用大功率三极管了。单片机控制时,应采用二个三极复合的形式,即单片机控制一个小功率,再用小功率管推动大功率管。

51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出。对精度要求不高的场合,非常实用。电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相。一、原理图

图一二、固定脉宽PWM输出
用T0定时器完成PWM输出,脉宽固定:65536微妙。T0定时器设置成:16位定时器
PWM:

程序清单:(12MHz)
PwmData0 ;T0定时t1所需的定时初值(字)
PwmData1 ;T0定时t2所需的定时初值(字)
PwmF ;PWM输出标志
;*********************************************************
setb tro ;启动T0
。。。。。。
T0Int:;T0中断服务程序
JB PwmF ,PwmOutH ;PWM输出未完成返回
Mov TH0,High(PwmData0)
Mov TL0,Low(PwmData0)
Setb tr0
Setb PwmF
Clr p1.0 ;PWM输出脚
reti
PwmOutH:
Setb p1.0
Clr tr0
Mov TH0,High(PwmData1)
Mov TL0,Low(PwmData1)
Setb tr0
Clr PwmF
reti
说明:在主程序中计算PwmData0、PwmData1的值。 可变脉宽PWM输出
用T0定时器控制PWM的占空比,T1定时器控制脉宽(最大:65536微妙)。
T0、T1定时器设置成:16位定时器。

程序清单:(12MHz)
PwmData0 ;T0定时t1所需的定时初值(字)
PwmData1 ;T1定时T所需的定时初值(字)
;*********************************************************
setb tro ;启动T0
setb tr1
。。。。。。
T0Int:;T0中断服务程序
Clr tr0
setb p1.0 ;PWM输出脚
reti
T1Int:;T1中断服务程序
Clr p1.0
Clr tr0
Clr tr1
Mov TH0,High(PwmData0)
Mov TL0,Low(PwmData0)
Mov TH1,High(PwmData1)
Mov TL1,Low(PwmData1)
Setb tr1
Setb tr0
reti
说明:在主程序中计算PwmData0、PwmData1的值。

51用定时器输出PWM波 哦
我这有一个用PWM控制LED亮度的程序,你可以看看哈,触类旁通哦~
/*******************************************************************/

// 利用定时器控制产生占空比可变的 PWM 波
// 按K1,PWM值增加,则占空比减小,LED 灯渐暗。
// 按K2,PWM值减小,则占空比增加,LED 灯渐亮。
// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

/*********************************************************/http://www.ourdev.cn/bbs/bbs_content.jsp?bbs_sn=3233547&bbs_page_no=1&search_mode=3&search_text=elan94&bbs_id=9999


用C语言编写,使用51单片机生成0--9不重复数字。请问用什么做随机种子...
\/\/这种算法比较节省空间(至少我是这么觉得)\/\/用一个unsigned int型变量,记录已生成的随机数,代码如下#include <reg51.h>#include<stdlib.h>unsigned int random = 0x00;unsigned char nums[10] = {0};void myrand(){ unsigned char temp,i; for(i=0;i<10,++i) { temp=r...

51单片机是如何产生PWM波的?
主要通过一个定时器和一个IO口来实现PWM的输出。\\x0d\\x0a在一个周期里面,首先让IO口输出高电平,并定时一定的时间\\x0d\\x0a然后再将IO口输出低电平,定时一定的时间。\\x0d\\x0a然后在while里面循环输出即可。\\x0d\\x0a需要改变占空比的话就改变高电平的时间与低电平的时间比。

如何利用单片机产生500HZ的信号
使用单片机的定时器可以产生500Hz的信号 以51单片机为例,程序如下:include<reg51.h> sbit Wave=P1^6;unsigned char k=0;void main(){ Wave=0;EA=1;\/\/开总中断 TMOD=0x01;\/\/设置定时器0为工作方式1 TH0=(65536-10000)\/256;TL0=(65536-10000)%256;ET0=1;\/\/开定时器0中断 TR0=1;\/\/...

如何编写51单片机音乐程序
一、总体原理:乐曲中不同的音符,实质就是不同频率的声音。通过单片机产生不同的频率的脉冲信号,经过放大电路,由蜂鸣器放出,就产生了美妙和谐的乐曲。二、单片机产生不同频率脉冲信号的原理:1)要产生音频脉冲,只要算出某一音频的脉冲(1\/频率),然后将此周期除以2,即为半周 期的时间,利用定时...

51单片机如何产生8路PWM波
当然这只是简单的用51本身资源产生而已,还可以用专门的外围电路来实现,我给你一个四路频率产生程序,思想如上,已验证过 \/***四路频率产生器***\/ include<reg52.h> define uchar unsigned char define uint unsigned int \/***常量定义***\/ sbit pwm1=P1^0; \/\/第一路频率 1s内产生500...

51单片机怎么产生外部脉冲??
当然可以啊,51的定时器\/计数器功能,定时器用的多了你可能都忘记了51单片机有计数的功能,设置TMOD中的c\/t位为1,这时的定时器计数器就处于计数模式了,可以对P3.4或P3.5引脚的下跳沿计数,你把这两个引脚接个按键就可以了,按一次加1,注意按键的消抖问题,最好使用硬件消抖吧 这样设置定时器...

用51单片机怎么产生占空比可调的pwm波 我在网上搜的有不少但频率不高...
如果你要的话我可以晚上给你写一个。你调节是通过按键增加减少还是通过旋钮改变,如果是旋钮改变的我有现成的,只要改下平率即可。如果是按键的,给我一个晚上的时间。

51单片机是如何产生PWM波的?
主要通过一个定时器和一个IO口来实现PWM的输出。在一个周期里面,首先让IO口输出高电平,并定时一定的时间 然后再将IO口输出低电平,定时一定的时间。然后在while里面循环输出即可。需要改变占空比的话就改变高电平的时间与低电平的时间比。

求高手赐教:51单片机怎么产生随机数?
启动定时器,需要随机数时从定时器里读一个值出来当作随机数。或者调用random()函数,不过得到的是伪随机数。

请问各位大神,用51系列单片机怎样才能构成单稳态延时触发电路呢?_百度...
开放定时器中断,用定时器\/计数器对25S作精确延时,达到25S后输出翻转。基本思路就是这样,具体的程序要根据单片机的规格型号和时钟频率才能确定。STC80C51单片机外部中断只能低用电平或下降沿触发,你要求用信号的高电平触发,所以,只能对输入信号采取查询的方式,结合片内定时器进行输出翻转计时。

海盐县15580619545: 如何利用51单片机输出PWM波30 -
善亨杰奇: 用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比.大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值...

海盐县15580619545: 51单片机怎样做PWM -
善亨杰奇: 你用定时器开中断吧,如果只是简单的用IO口的话,得到的频率很不准确的!思路:根据单片机的晶振大小计算定时器的初值,在中断程序里给对要输出脉冲的引脚取反操作就是了,例如:P1^0=~P1^0; 还有脉冲频率不能太高哦,要保证定时器的计时时间大于中断程序执行时间~~ 程序大体结构: void Init_timer() //定时器初始化 { } void main() //主程序 { } void t0() interrupt 1//t0的中断程序{ }

海盐县15580619545: 51单片机怎么产生12路PWM波??? -
善亨杰奇: 最简单的是启动定时器,中断中控制12个IO输出

海盐县15580619545: 如何用51单片机来产生pwm波来驱动5v的小电机
善亨杰奇: 51没有硬件的PWM,得全靠软件模拟. 调速程序可以用定时器做,首先设置两个定时用的全局变量,一个代表高电平时间一个代表低电平时间. 先给定时器初值(既那两个全局变量中的一个),溢出后触发中断,在中断里设置另另一个初值并且取反PWM的输出端口,两个初值轮流给定时器,就可以任意调整占空比,占空比取决于两个初值. PWM输出后,驱动三极管,后面接上电机就是了. 按键调速也不难,看你具体的按键处理程序了,通过获得的键值控制上面说的两个全局变量就可以了. 测速可以用计数器做,得到计数值处理一下即可. 如果是自动调速,那需要做点简单的算法程序. 反正51有那么多I/O口,再来一个转速显示什么的也可以.

海盐县15580619545: 51单片机如何产生8路PWM波 -
善亨杰奇: 我来说一下我的方案,这个我验证过,方法如下: 其实用一个定时器就够了,外部中断接按键,一个用来频率加,一个用来频率减,即做调节频率用,8路频率从P0口输出,定时器产生中断,比如1us,那么我到1us时对P0.0取反,同时中断里在...

海盐县15580619545: 怎样用AT80C51单片机编写汇编程序输出pwm通过不同的占空比?
善亨杰奇: 51的输出是没法直接驱动电机的,电机需要有驱动电路.只能用PWM控制驱动电路,进而控制电机转向和转速.比如用P1^1和P1^2输出两路PWM信号,正向转动时P1^1输出PWM信号,P1^2输出低电平.反向转动时则相反设置.而转速则是改变PWM的占空比,即脉冲宽度与所占周期的比例,占空比为0则制动,占空比为1则全速转动.先理清大致的流程,再进行细节考虑.对于程序,根据自己的电路,自己编吧!网上很多这些程序的.

海盐县15580619545: 如何用单片机产生PWM -
善亨杰奇: /*--------------- 文件名称: PWM.C 功能 :单片机脉冲方式产生PWM信号 ----------------*/ #include <reg52.h> // 引用标准库的头文件 #include <absacc.h> #include <stdio.h> #define uchar unsigned char #define uint unsigned int #define COUNT0 ...

海盐县15580619545: 如何用51单片机产生pwm 并利用pwm控制led灯的功率? -
善亨杰奇: 51系列单片机无PWM输出功能,可以采用定时器配合软件的方法输出.对精度要求不高的场合,非常实用.电路图见图一,采用了高速光隔(6N137)输出,并将PWM的信号倒相. 一、原理图 图一 二、固定脉宽PWM输出 用T0定时器完成...

海盐县15580619545: 51单片机如何用这个实现pwm信号 -
善亨杰奇: 你的问题 按键三只 用中断功能 实现 加速 减速 停止 方法是用pwm来实现得到按钮的中断信息 改变 PWM 占空比就是改变定时器就可以实现的

海盐县15580619545: 51单片机实现pwm对电机调速 -
善亨杰奇: 可以用一个定时器实现,也可以用两个定时器实现 一个定时器实现办法,如定时器定时50US中断一次,中断100次是5ms,即PWM的周期 每次中断,变量a加1,并且a与另一变量b比较,如果a<b,让某一管脚输出高电平,如果a>=b,则让其输...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网