3个回答
展开全部
//任务:定时器输出PWM实验
//PWM:脉冲宽度调制,见参考文档
//占空比:duty ratio,见参考文档
//将P1.0与直流电机的ZDJ_A端接好 ,SW8拨动开关与直流电机的ZDJ_B端接好
//两端之间的电压高低关系决定正反转;差值越大,转速越高
//改变电机转速需要调整输出的占空比,通过设定高低电平各自的时长来实现
//外部中断0和外部中断1各接一个按键,用于实时调整占空比。
//若想使转动更平稳,可提高脉冲输出频率。频率越低脉动越大
//接一盏LED,指示用
#include <at89x51.h>
sbit ZDJ_A=P1^0; //使用P1.0引脚输出PWM信号,接直流电机的电源A端
sbit LED=P3^5;
unsigned char duty=16;//【duty ratio】:占空比,高电平所占比例。本行赋值31(%)
unsigned int time=10,highTime,lowTime;//time的单位:毫秒
//highTime,lowTime单位:微秒
//*******************************************
void initialize()
{
TMOD=0x01;//什么意思?
EA=1; //什么意思?
ET0=1; //什么意思?
EX0=1; //什么意思?
EX1=1; //什么意思?
//IE=?? 等效为上面四句?
IT0=1; //什么意思?
IT1=1; //什么意思?
PX1=1; //什么意思?
TH0=0xD8;
TL0=0xF0; //定时初始值,定时有多长?
}
//*******************************************
void pwm_output() interrupt 1 using 1 //什么意思?
{ ZDJ_A=~ZDJ_A;
LED=~LED;//平均电压指示,亮度跟随变化
if(ZDJ_A==1)
{
highTime=time*duty*10;
TH0=(65536-highTime)/256 ;
TL0=(65536-highTime)%256 ; //重载高电平定时初始值
}
else
{
lowTime=time*(100-duty)*10;
TH0=(65536-lowTime)/256 ;
TL0=(65536-lowTime)%256 ; //重载低电平定时初始值
}
}
//*******************************************
void SpeedUp() interrupt 0 using 2 //什么意思?
{
if(duty<95)
duty=duty+5;
P1_1=~P1_1;
}
//*******************************************
void SpeedDown() interrupt 2 using 3 //什么意思?
{
if(duty>5)
duty=duty-5;
P1_1=~P1_1;
}
//*******************************************
void main()
{
initialize();//初始化
TR0=1; //什么意思?
while(1)
{
//main program write here,you decide.
}
}
//思考:用SW8切换电机转动方向的时候,为什么速度会变?
//改进一:程序应如何修改以保证换向后维持原来的速度?
//改进二:请在速度调整到最低或最高时给出信号指示。
//PWM:脉冲宽度调制,见参考文档
//占空比:duty ratio,见参考文档
//将P1.0与直流电机的ZDJ_A端接好 ,SW8拨动开关与直流电机的ZDJ_B端接好
//两端之间的电压高低关系决定正反转;差值越大,转速越高
//改变电机转速需要调整输出的占空比,通过设定高低电平各自的时长来实现
//外部中断0和外部中断1各接一个按键,用于实时调整占空比。
//若想使转动更平稳,可提高脉冲输出频率。频率越低脉动越大
//接一盏LED,指示用
#include <at89x51.h>
sbit ZDJ_A=P1^0; //使用P1.0引脚输出PWM信号,接直流电机的电源A端
sbit LED=P3^5;
unsigned char duty=16;//【duty ratio】:占空比,高电平所占比例。本行赋值31(%)
unsigned int time=10,highTime,lowTime;//time的单位:毫秒
//highTime,lowTime单位:微秒
//*******************************************
void initialize()
{
TMOD=0x01;//什么意思?
EA=1; //什么意思?
ET0=1; //什么意思?
EX0=1; //什么意思?
EX1=1; //什么意思?
//IE=?? 等效为上面四句?
IT0=1; //什么意思?
IT1=1; //什么意思?
PX1=1; //什么意思?
TH0=0xD8;
TL0=0xF0; //定时初始值,定时有多长?
}
//*******************************************
void pwm_output() interrupt 1 using 1 //什么意思?
{ ZDJ_A=~ZDJ_A;
LED=~LED;//平均电压指示,亮度跟随变化
if(ZDJ_A==1)
{
highTime=time*duty*10;
TH0=(65536-highTime)/256 ;
TL0=(65536-highTime)%256 ; //重载高电平定时初始值
}
else
{
lowTime=time*(100-duty)*10;
TH0=(65536-lowTime)/256 ;
TL0=(65536-lowTime)%256 ; //重载低电平定时初始值
}
}
//*******************************************
void SpeedUp() interrupt 0 using 2 //什么意思?
{
if(duty<95)
duty=duty+5;
P1_1=~P1_1;
}
//*******************************************
void SpeedDown() interrupt 2 using 3 //什么意思?
{
if(duty>5)
duty=duty-5;
P1_1=~P1_1;
}
//*******************************************
void main()
{
initialize();//初始化
TR0=1; //什么意思?
while(1)
{
//main program write here,you decide.
}
}
//思考:用SW8切换电机转动方向的时候,为什么速度会变?
//改进一:程序应如何修改以保证换向后维持原来的速度?
//改进二:请在速度调整到最低或最高时给出信号指示。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询