
/ 利用定时器控制产生占空比可变的 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语言等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)