|
RE: pwm如何调速步进电动机
本帖最后由 不倒翁.WZT 于 2017-6-29 14:36 编辑
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit K1=P1^0; //按键1,PWM脉冲宽度值增加
sbit K2=P1^1; //按键2,PWM脉冲宽度值减少
sbit LED=P1^3; //LED显示
sbit PWM_OUT=P1^4; //PWM输出,SCR控制
uchar PWM,num; //PWM设定脉冲宽度值,num计算中断次数;
void delay(uint ms) //1ms延时
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void keyscan() //按键扫描函数
{
if(K1==0) //按键1是否按下
{
delay(50); //去抖延时
if(K1==0) //按键1是否继续按下
{
if(PWM<32) //PWM设定脉冲宽度值是否小于32
{
PWM++; //PWM设定脉冲宽度值加1
delay(100);
}
}
}
if(K2==0) //按键2是否按下
{
delay(50); //去抖延时
if(K2==0) //按键2是否继续按下
{
if(PWM>1) //PWM设定脉冲宽度值是否大于1
{
PWM--; //PWM设定脉冲宽度值减1
delay(100);
}
}
}
}
void init_t0() //定时器T0初始化
{
TMOD=0x01; //方式1,16位定时器
TH0=(65536-500)/256; //0,5ms定时
TL0=(65536-500)%256; //0,5ms定时
EA=1; //开总中断
ET0=1; //开定时器T0
TR0=1; //启动定时器T0
}
void t0() interrupt 1 //T0中断服务函数
{
TR0=0; //停止T0定时器
TH0=(65536-500)/256; //0,5ms定时
TL0=(65536-500)%256; //0,5ms定时
num++; //num计算中断次数+1
if(num>32) //中断次数大于32
{
num=0; //中断次数=0
}
if(num<=PWM) //中断次数<=PWM脉冲宽度
{
LED=0x01; //输出高电平,小灯灭
PWM_OUT=0x00; //输出低电平,关闭SCR
}
else
{
LED=0x00; //输出低电平,小灯亮
PWM_OUT=0x01; //输出高电平,启动SCR
}
TR0=1; //启动T0定时器,等待下一次中断
}
void main()
{
init_t0(); //T0初始化
num=0; //num计算中断次数=0
PWM=16; //PWM脉冲宽度=16
while(1)
{
keyscan(); //调用按键扫描函数
}
}
|
评分
-
查看全部评分
|