① 求详细解释这个51单片机PWM波原理
这个程序每一条语句你肯定能看懂,给你加注释没有必要,给你讲讲PWM的原理,你再对照程序看就明白了
你要用51产生PWM去控制LED,首先你要确定PWM的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n'
那么你就可以编写程序,根据你定的时间基准
t
去给定时器赋值初始化,然后开启定时器,定义一个标志位flag,根据flag的状态决定输出高平还是低电平,假设定义flag=1的时候输出高电平,用一个变量去记录定时器中断的次数,每次中断就让记录中断次数的变量+1,在中断程序里面判断这个变量的值是否到了
n
,如果到了说明高电平的时间够了,那么就改变flag为0,输出低电平,同时记录中断变量的值清零,每次中断的时候依旧+1,根据flag=0的情况跳去判断记录变量的值是否到了
n'
如果到了,说明PWM的低电平时间够了,那么就改flag=1,输出改高电平,同时记录次数变量清零,重新开始,如此循环便可得到你想要的PWM波形。
② 怎么用51单片机设定pwm的输出频率麻烦具体说明
这个实现起来丰俭由人,可以有三种办法:
1,软件定时,一段时间输出高,一段时间输出低,加起来就是PWM周期;
2,用硬件定时器代替软件定时,会准确,原理还是一样的;
3,带有PCC、TIM等高级专用计数器的,设置好寄存器之后,自动出来想要的频率和占空比,又准确又省心,频率还可以很高;
具体到单片机型号,可以找厂商的应用笔记,源代码的有。
③ 51单片机pwm问题
你这个只是输出一个方波而已,占空比50%,就是用的定时器中断,你上面的说的50ms定时,每中断一次就取反一次P12,这样就实现了简单的PWM,真正的PWM占空比是可调的,如果中断函数改成这样,就可以看到PWM占空比的变化了
void int1() interrupt 1
{
static unsigned short temp=0x4c01;
TR1=0; //停止计数
TL1=temp%256;
TH1=temp/256;
TR1=1; //开始计数
temp++;
P12=k;
k=~k;
}
④ 51单片机输出pwm
15-PWM调光
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义
void Delay(unsigned int t)
{
while(--t);
}
void main ( )
{
unsigned int CYCLE=600,PWM_LOW=0;//定义周期并赋值
while (1) //主循环
{
P2=0X00;
Delay(60000); //特意加延时,可以看到熄灭的过程
for(PWM_LOW=1;PWM_LOW<CYCLE;PWM_LOW++)
{
P2=0XFF; //点亮LED
Delay(PWM_LOW);//延时长度,600次循环中从1加至599
P2=0X00; //熄灭LED
Delay(CYCLE-PWM_LOW);//延时长度,600次循环中从599减至1
}
P2=0XFF;
for(PWM_LOW=CYCLE-1;PWM_LOW>0;PWM_LOW--)
{ //与逐渐变亮相反的过程
P2=0XFF;
Delay(PWM_LOW);
P2=0X00;
Delay(CYCLE-PWM_LOW);
}
}
}
自己修改 可以改变占空比
⑤ 51单片机PWM
#include <stc51.h>
int X ; // PWM的周期 单位:us微秒
int ty; //占空比变量
void main()
{
X=2000; //周期100uS 即PWM的频率=10KHZ
ty=50; //占空比 50%
TMOD=0X11;
EA=1;
ET0=1;
ET1=1;
TH0=(65535-ty)/256; //定时器0 改变占空比
TL0=(65535-ty)%256;
TH1=(65535-X)/256 ; //定时器1 改变频率
TL1=(65535-X)%256;
TR0=1;
TR1=1;
while(1) ;
}
void timer0_isr() interrupt 1 //定时器0;改变占空比
{
TR0=0;
P1=0X00;
++ty;
if(ty>=X-1) ty=1;
}
void timer1_isr() interrupt 3 //定时器1 ;改变PWM频率 即周期
{
P1=0XFF;
TH1=(65535-X)/256; //改变周期
TL1=(65535-X)%256;
TH0=(65535-ty)/256; //改变占空比
TL0=(65535-ty)%256;
TR0=1;
//TR1=1;
}
⑥ 关于用51单片机产生pwm
#include<reg52.h>
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<STC12C5A60S2.H> //头文件
#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多。
⑦ 如何利用51单片机输出PWM波
用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。
用一个定时器时(如定时器T0),首先你要确定PWM的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n'。
因为这里我们是产生周期为1ms(1000HZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:1、当time>=100时,time清零(此语句保证频率为1000HZ),2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出高电平,当time<n时,让单片相应的I/O口输出低电平,此时占空比就为%n。
⑧ 51单片机实现pwm对电机调速
可以用一个定时器实现,也可以用两个定时器实现
一个定时器实现办法,如定时器定时50US中断一次,中断100次是5ms,即PWM的周期
每次中断,变量a加1,并且a与另一变量b比较,如果a<b,让某一管脚输出高电平,如果a>=b,则让其输出低电平,a等于100时清0,这样占空比是b/100,改变b的值,就可以改变占空比 缺点定时器定时时间不能太短,例如10us中断程序根本执行不完,若占空比调节精度要求较高,如要求百分之一,则a需大于100,这样PWM波的周期就比较大,频率比较低
两个定时器,如一个定时器0定时100us,另外一个定时器1定时小于100us,如b us
定时器0中断时输出高电平,并打开定时器1,定时器1负责置低电平
这样,就可以产生周期100us,占空比是b/100的方波
频率可以比用一个定时器高一些
⑨ 51单片机是如何产生PWM波的
主要通过一个定时器和一个IO口来实现PWM的输出。
在一个周期里面,首先让IO口输出高电平,并定时一定的时间
然后再将IO口输出低电平,定时一定的时间。
然后在while里面循环输出即可。
需要改变占空比的话就改变高电平的时间与低电平的时间比。
⑩ 带pwm的51单片机有哪些
1、建议采用stc的pwm单片机,可以直接上他的官方网站查询,网络宏晶就可以了。
2、如果你需要的pwm信号要求不是很高的话,可以直接采用普通51单片机的定时器模拟pwm信号,可供选择的有调宽和调频,建议使用调宽,具体思路如下:定时器产生一个中断时间基准,定义这个时间基准100次为频率,高低电平的宽度就是你自己定义的了好比一个20一个80那么占空比就是1:4。这些参数都是你设定的,定下你的定时器中断时间基准就可以了。
3、一般51系列带的pwm都很普通,所以个人认为模拟的也够用了,不过stc的几款片子的pwm还可以,支持16位高速模式。
4、常在线,不明白的hi我