当前位置:首页 » 编程语言 » c语言pwm

c语言pwm

发布时间: 2022-04-27 07:34:09

❶ 51单片机测量PWM波的占空比的c语言程序

用定时器产生程序如下:
unsigned
int
a=0
,b=10;
void
main()
{
tmod=0x01;
th0=(65536-50000)/256;
tl0=(65536-50000)%256;
ea=1;
et0=1;
tr0=1;
}
void
pwm()
interrupt
1
{
th0=(65536-50000)/256;
tl0=(65536-50000)%256
;
a++;
p1^1=0;
if(a=20)
{
a=0;
}
if(a=b)
{
p1^1=1;
}
}
调节a
,b的值即可调节占空比,程序框架就是这样,具体自己改吧

❷ 有没有51控制pwm的c语言程序

1、 利用定时器控制产生占空比可变的 PWM 波
按K1,PWM值增加,则占空比减小,电机减速。
按K2,PWM值减小,则占空比增加,电机加速。
当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

2、例程:
/*********************************************************/

#include<reg51.h>
#include<intrins.h>

sbit K1 =P1^4 ; //PWM值增加键
sbit K2 =P1^5 ; //PWM值减少键
sbit BEEP =P3^7 ; //蜂鸣器
unsigned char PWM=0x7f ; //赋初值

void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{
P1=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延时常数
TL0=0x66 ; //频率调节

TH1=PWM ; //脉宽调节
TL1=0 ;

EA=1;
ET0=1;
ET1=1;

TR0=1 ;

while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(K1==0);

do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(K2==0);
}
}

/*********************************************************/
// 定时器0中断服务程序 (频率)
/*********************************************************/
void timer0() interrupt 1
{
TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //启动输出
}

/*********************************************************/
// 定时器1中断服务程序 (脉宽)
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //结束输出
}

/*********************************************************/
//蜂鸣器子程序
/*********************************************************/

void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //关闭蜂鸣器
delayms(100);
}

/*********************************************************/
// 延时子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--) ;
}

/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)

{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}

/*********************************************************/

❸ C语言让STC单片机产生PWM信号。

#include<reg51.h>
#define uchar unsigned char
uchar pwm=50,cnt=0;
sbit pluse=P1^0;
sbit keyu=P1^4;
sbit keyd=P1^5;
void t0isr() interrupt 1
{
cnt++;
if(cnt>100)cnt=0;
if(cnt<pwm)pluse=1;
else pluse=0;
}
main()
{
TMOD=0x02;
TH0=256-246; //改变该值可以改变频率。
TL0=256-246;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyu==0)
{
while(keyu==0);
if(pwm<100)pwm++;
}
if(keyd==0)
{
while(keyd==0);
if(pwm>0)pwm--;
}
}
}

❹ 利用51单片机定时器产生PWM波的c语言程序,要求如下

#include<reg51.h>
#define uchar unsigned char
uchar pwm=50,cnt;
sbit pluse=P1^0;
sbit keyu=P1^4;
sbit keyd=P1^5;
void t0isr() interrupt 1
{
TH0=(65536-100)/256;
TL0=(65536-100)%256;
cnt++;
if(pwm>0)
{
if(cnt>100)cnt=0;
if(cnt<=pwm)pluse=1;
else pluse=0;
}
else pluse=0;
}
main()
{
TMOD=0x01;
TH0=(65536-100)/256;
TL0=(65536-100)%256;
TR0=1;
ET0=1;
EA=1;
while(1)
{
if(keyu==0)
{
while(keyu==0);
pwm++;
if(pwm>100)pwm=100;
}
if(keyd==0)
{
while(keyd==0);
if(pwm>0)pwm--;
}
}
}

❺ 单片机C语言编程:用PWM控制直流电机转速

#include <AT89X51.H>

#define uchar unsigned char
/*****************************************************************************
* TH0和TL0是计数器0的高8位和低8位计数器,计算办法:TL0=(65536-C)%256; *
* TH0=(65536-C)/256,其中C为所要计数的次数即多长时间产生一次中断;TMOD是计数器*
* 工作模式选择,0X01表示选用模式1,它有16位计数器,最大计数脉冲为65536,最长时 *
* 间为1ms*65536=65.536ms *
******************************************************************************/
#define V_TH0 0XFF
#define V_TL0 0XF6
#define V_TMOD 0X01

void init_sys(void); /*系统初始化函数*/
void Delay5Ms(void);

unsigned char ZKB1,ZKB2;

void main (void)
{
init_sys();
ZKB1=40; /*占空比初始值设定*/
ZKB2=70; /*占空比初始值设定*/
while(1)
{
if (!P1_1) //如果按了+键,增加占空比
{
Delay5Ms();
if (!P1_1)
{
ZKB1++;
ZKB2=100-ZKB1;
}
}

if (!P1_2) //如果按了-键,减少占空比
{
Delay5Ms();
if (!P1_2)
{
ZKB1--;
ZKB2=100-ZKB1;
}
}
/*对占空比值限定范围*/
if (ZKB1>99) ZKB1=1;
if (ZKB1<1) ZKB1=99;
}
}

/******************************************************
*函数功能:对系统进行初始化,包括定时器初始化和变量初始化*/
void init_sys(void) /*系统初始化函数*/
{
/*定时器初始化*/
TMOD=V_TMOD;
TH0=V_TH0;
TL0=V_TL0;
TR0=1;
ET0=1;
EA=1;
}

//延时
void Delay5Ms(void)
{
unsigned int TempCyc = 1000;
while(TempCyc--);
}

/*中断函数*/
void timer0(void) interrupt 1 using 2
{
static uchar click='0'; /*中断次数计数器变量*/
TH0=V_TH0; /*恢复定时器初始值*/
TL0=V_TL0;
++click;
if (click>=100) click='0';

if (click<=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比的调整*/
P1_3=0;
else
P1_3=1;

if (click<=ZKB2)
P1_4=0;
else
P1_4=1;

}只是调占空比的,希望对你有帮助,调试好的

❻ 请帮写一段C语言的pwm固定输出程序

/*s52,12M晶振,P30输出PWM,P10按键控制输出*/
#include<reg52.h>

sbit control=P1^0;
sbit pwm=P3^0;
void delay()
{
unsigned char i,j;
for(i=0;i<10;i++)
for(j=0;j<112;j++);
}

main()
{
unsigned char flag=1;
TMOD=0x02; //定时器0方式2自动载入;
TH0=0xe3; //28us定时,即28us翻转一次;周期为56us,频率约为18K
TL0=0xe3;
EA=1;
ET0=1;
TR0=1;

while(1)
{
if(control==0)
{
delay();
if(control==0)
{
flag=~flag;

switch(flag)
{
case 0:TR0=0;EA=0;pwm=0;
break;
case 1:EA=1;TR0=1;
}
}
}while(control==0);
}

}
void timer0()interrupt 1
{
pwm=~pwm;
}

❼ 用C语言在设置单片机脉宽的时候应该怎样设置成多个挡位的PWM

你是想用来调速的吧?

十个档位分别对应电机的10个速度?

其实没有那么麻烦,你用定时器做一个固定的定时时间。

在中断里面,设置PWM占空比,也就是高低电平的比例。

voidTimer0_ISR(void)interrupt1
{
staticucharCount=0;
TH0=xx;
TL0=xx;//这个你自己定
Count++;
switch(Status)
{
case0:
if(Count<Duty0)IO=1;
elseif(Cont>100)Count=0;
elseIO=0;
break;
//其余的9档都一样。
}
}

//Duty0是0档的占空比,依次类推
//这样,你只需改变Status的值,就可以改变PWM的占空比了。

❽ 用c语言怎么控制pwm值的改变

你用定时器pca输出就行了,改变占空比就是给通道赋值,20ms才50HZ应该很容易实现。
逻辑上用个switch语句就好。

❾ 单片机C语言PWM的典型程序谢谢

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

/*********************************************************/

#include<reg51.h>
#include<intrins.h>

sbit K1 =P1^4 ; //PWM值增加键
sbit K2 =P1^5 ; //PWM值减少键
sbit BEEP =P3^7 ; //蜂鸣器
unsigned char PWM=0x7f ; //赋初值

void Beep();
void delayms(unsigned char ms);
void delay(unsigned char t);

/*********************************************************/
void main()
{
P1=0xff;
TMOD=0x21 ;
TH0=0xfc ; //1ms延时常数
TL0=0x66 ; //频率调节

TH1=PWM ; //脉宽调节
TL1=0 ;

EA=1;
ET0=1;
ET1=1;

TR0=1 ;

while(1)
{
do{
if(PWM!=0xff)
{PWM++ ;delayms(10);}
else Beep() ;
}
while(K1==0);

do{
if(PWM!=0x02)
{PWM-- ;delayms(10);}
else Beep() ;
}
while(K2==0);
}
}

/*********************************************************/
// 定时器0中断服务程序 (频率)
/*********************************************************/
void timer0() interrupt 1
{
TR1=0 ;
TH0=0xfc ;
TL0=0x66 ;
TH1=PWM ;
TR1=1 ;
P0=0x00 ; //启动输出
}

/*********************************************************/
// 定时器1中断服务程序 (脉宽)
/*********************************************************/
void timer1() interrupt 3
{
TR1=0 ;
P0=0xff ; //结束输出
}

/*********************************************************/
//蜂鸣器子程序
/*********************************************************/

void Beep()
{
unsigned char i ;
for (i=0 ;i<100 ;i++)
{
delay(100) ;
BEEP=!BEEP ; //Beep取反
}
BEEP=1 ; //关闭蜂鸣器
delayms(100);
}

/*********************************************************/
// 延时子程序
/*********************************************************/
void delay(unsigned char t)
{
while(t--) ;
}

/*********************************************************/
// 延时子程序
/*********************************************************/
void delayms(unsigned char ms)

{
unsigned char i ;
while(ms--)
{
for(i = 0 ; i < 120 ; i++) ;
}
}

/*********************************************************/

❿ 用C语言实现:采用中断方式,P1.0输出脉冲宽度调制(PWM)信号,即脉冲频率为2kHz,占空比为

/*用keil3与proteus7.4联调,自己下载后开启联调设置,在proteus中画个最小单片机系统,再用单片机连接keil的编译文件.HEX即可。假设时钟频率12MHz,执行一条语句所用时间1us,2kHz为500us,即定时器频率定时500us,如果用T0,则初值为TH0=0x1f,TL0=0x40;占空比7:10,脉冲宽度350us,用T1,初值TH1=0x15,TL1=0xe0。*/
#include<reg51.h>
sbit OUTW=P1^0;
void init()
{
EA=1;
TMOD=0x11;
ET0=1;
ET1=1;
TR0=1;
TR1=0;

OUTFW=0;
}

void main()
{
init();
while(1);
}

void timer0 interrupt 1
{
TH0=0x1f;
TL0=0x40;

TH1=0x15;
TL1=0xe0;

OUTW=1;

TR1=1;
}

void timer1 interrupt 3
{
OUTW=0;
TR1=0;
}
//注意:调频就是在IO变量在不同的时间置1,调宽就是在不同的时间置0

热点内容
美嘉算法口诀 发布:2025-05-16 06:03:15 浏览:952
c程序编译连接 发布:2025-05-16 06:02:36 浏览:964
脚本魔兽 发布:2025-05-16 06:01:52 浏览:330
文件夹python 发布:2025-05-16 06:01:43 浏览:627
电脑我的世界服务器游戏币 发布:2025-05-16 05:27:25 浏览:487
索尼手机为什么不能用安卓10 发布:2025-05-16 05:18:46 浏览:784
蔚来es6选择哪些配置实用 发布:2025-05-16 05:18:05 浏览:130
小米如何扫码wifi密码 发布:2025-05-16 05:13:38 浏览:807
楼层密码是什么意思 发布:2025-05-16 05:13:37 浏览:13
创建文件夹失败 发布:2025-05-16 05:12:59 浏览:396