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

单片机C语言PWM的典型程序谢谢,第1张

/ 利用定时器控制产生占空比可变的 PWM 波

// 按K1,PWM值增加,则占空比减小,电机减速。

// 按K2,PWM值减小,则占空比增加,电机加速。

// 当PWM值增加到最大值或减小到最小值时,蜂鸣器将报警。

//

#include<reg51h>

#include<intrinsh>

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++) ;

}

}

//

/s52,12M晶振,P30输出PWM,P10按键控制输出/

#include<reg52h>

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;

}

1、PWM波是控制直流电机的

通俗的说,5V直流电机在5V的情况下肯定速度最快,在0V的情况下肯定不转了

这样电源0~5V就对应了不同的速度

问题是怎么才能实现0~5V的变化呢?

于是就用PWM波控制mos管来给直流电机供电。PWM就是一个矩形波,通过控制高电平和低电平的时间来控制MOS管导通的时间。MOS管在高电平的时候导通,就相当于5V电源直接加到电机上;MOS管在低电平的时候截止,就相当于0V电源加到电机上。

PWM又叫脉宽调制,就是控制高电平占一个周期的比例。而这个PWM波就是控制5V电源加到电机上的时间,从而控制了电机。

2、例程:

#include <reg52h>

sbit KEY1 = P3^4;

sbit PWM = P1^5;

unsigned char CYCLE; //定义周期 该数字X基准定时时间 如果是10 则周期是10 x 01ms

unsigned char PWM_ON ;//定义高电平时间

void delay(unsigned int cnt)

{

while(--cnt);

}

main()

{

unsigned char PWM_Num;//定义档位

TMOD |=0x01;//定时器设置 1ms in 12M crystal

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;//定时1mS

IE= 0x82; //打开中断

TR0=1;

CYCLE = 10;// 时间可以调整 这个是10步调整 周期10ms 8位PWM就是256步

while(1)

{

if(!KEY1)

{

delay(10000);

if(!KEY1)

{

PWM_Num++;

if(PWM_Num==4)PWM_Num=0;

switch(PWM_Num){

case 0:P0=0x06;PWM_ON=0;break;//高电平时长

case 1:P0=0x5B;PWM_ON=4;break;

case 2:P0=0x4F;PWM_ON=6;break;

case 3:P0=0x66;PWM_ON=8;break;

default:break;

}

}

}

}

}

//

/ 定时中断 /

//

void tim(void) interrupt 1 using 1

{

static unsigned char count; //

TH0=(65536-1000)/256;

TL0=(65536-1000)%256;//定时1mS

if (count==PWM_ON)

{

PWM = 1; //灯灭

}

count++;

if(count == CYCLE)

{

count=0;

if(PWM_ON!=0) //如果左右时间是0 保持原来状态

PWM = 0;//灯亮

}

include <stdioh>

#define N 3

void zz(int x[N][N])

{ int i,j,t;

for(i=0;i<N;i++)

for(j=0;j<i;j++)

{ t=x[i][j]; x[i][j]=x[j][i]; x[j][i]=t; }

}

void main()

{ int str[N][N]={1,2,3,4,5,6,7,8,9}, i,j;

zz(str);

for(i=0;i<N;i++)

{ for(j=0;j<N;j++) printf(“%3d”,str[i][j]) ;

printf("\n") ;

}

}

你那个地方不明白?能具体说说吗?我看程序已经有不少注释了啊?

下面的比较多,复杂些,先简单的说下吧:

一、加速减速,就是增加或减少脉冲宽度,改变电机速度!脉冲的宽度由

1、CLK=0的状态持续,由T1的定时决定;

2、CLK=1的状态持续,由(T0-T1)的时间决定;

二、定时器中断TH0=0x00 ;   TL0=0x00 ;

1、T0定时器工作1方式,T0定时器启动后,从TH0、TL0赋值的计数值开始增加,增加到0XFFFF后,T0中断!

2、T0溢出后(中断),T0计数器不会自动停止,所以需要重新给T0定时器赋值!赋值后,进入下一个计数周期!

3、例子中,T0定时器从0x0000开始计数,也就是增加0xFFFF后进行中断!定时时间为 (0xFFFF / ( 晶振周期/12 ))) 秒,若晶振为12M,则定时为,65536ms!

分析程序,从main开始分析,先将起始开始的时序图画出:

如下图!

从时序图可以看出,CLK为PWM输出,

1、CLK=0的状态持续,由T1的定时决定;

2、CLK=1的状态持续,由T0-T1的时间决定;

而   main   函数中的  while(1)   部分,进行的就是PWM调整程序。

1、  if (K3==0)   //高电平逆时钟转,低电平顺时钟转

{

ZF=0;

}

else

{

ZF=1;

}

根据程序推测,程序若为电机控制,K3开关为0时,ZF=0,顺时针转,K3开关为1时,ZF=1,逆时针转。

2、

if(K1==0)   //按下加速键

{

delay(1);

PWML++;   //调宽值低四位加1

if(PWML==0x00)

{

PWMH++;

}   //调宽值高四位加1

if (PWMH==0xFF) //最大值时

{

PWMH=0xFE;

}

}

K1按键,加速按键,增加T1定时器计数起始时间,也就是减少T1计数时间,减少CLK=0的时间。

3、

if(K2==0) //按下减速键

{

delay(1);

PWML-- ;   //调宽值低四位减1

if (PWML==0x00)

{

PWMH--;

}    //调宽值高四位减1

if (PWMH==0x00)

{

PWMH=0x01;

}   //最小值时

}

K2按键,减速按键,降低T1定时器计数起始时间,也就是增加T1计数时间,增加CLK=0的时间。

4、不论加速、减速,T0的时间都不变,CLK=0和CLK=1总持续时间不变{ (Tclk0+Tclk1)=T0 }。

程序不难,图不好画啊!

以上就是关于单片机C语言PWM的典型程序谢谢全部的内容,包括:单片机C语言PWM的典型程序谢谢、请帮写一段C语言的pwm固定输出程序、求52单片机pwm控制电机转速程序C语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9843841.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-02
下一篇2023-05-02

发表评论

登录后才能评论

评论列表(0条)

    保存