目录
AT89C52 L293D motor_DC(直流电机)
最大值:-192 +192
通过延时改变占空比,或者通过定时器实现:
#include <reg52.h>
#define uint unsigned int
sbit IN0=P2^0;
sbit IN1=P2^1;
sbit E=P2^2;
void delay(uint n)
{
uint i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
//总192 占空比50% 96 96
//占空比25% 高电平delay25 75;最大达到48
void motor()
{
IN0=0;//1 0正转 0 1 反转
// IN1=1;
// delay(50);
// IN1=0;
// delay(50);
E=1;
}
void inittimer()
{
TMOD=0X01;//选中定时器16位模式
TH0=(65536-10000)/256;//10ms
TL0=(65536-10000)%256;
ET0=1;//打开定时器中断
EA=1;//开启总中断
TR0=1;//开启定时器0
IN1=0;//赋一个初值
}
void main()
{
inittimer();
while(1)
{
motor();
}
}
//每隔10ms进一次中断
void timer_isr() interrupt 1
{
TH0=(65536-10000)/256;//10ms
TL0=(65536-10000)%256;
IN1=~IN1;//方波
}
#include <reg52.h>
#define uint unsigned int
sbit IN0=P2^0;
sbit IN1=P2^1;
sbit E=P2^2;
//占空比为20%的波形
uint value[]={2000,8000};
uint count=0;
void delay(uint n)
{
uint i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
//总192 占空比50% 96 96
//占空比25% 高电平delay25 75;最大达到48
void motor()
{
IN0=0;//1 0正转 0 1 反转
// IN1=1;
// delay(50);
// IN1=0;
// delay(50);
E=1;
}
//假设占空比是1/5 周期10ms
//高电平2000 低电平8000
void inittimer()
{
TMOD=0X01;//选中定时器16位模式
TH0=(65536-8000)/256;//10ms
TL0=(65536-8000)%256;
ET0=1;//打开定时器中断
EA=1;//开启总中断
TR0=1;//开启定时器0
IN1=0;//赋一个初值
}
void main()
{
inittimer();
while(1)
{
motor();
}
}
//每隔10ms进一次中断
void timer_isr() interrupt 1
{
TH0=(65536-value[count])/256;//10ms
TL0=(65536-value[count])%256;
IN1=~IN1;//方波
count++;
if(count==2)//保证占空比是20%
{
count=0;
}
}
误差:
原因:
解决:
手动把2000 8000算出来,减少计算量。65536-2000 = F830 65536-8000 = E0C0
确实减小误差了。
总结源代码:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit IN0=P2^0;
sbit IN1=P2^1;
sbit E=P2^2;
//占空比为20%的波形
uchar valueh[]={0xf8,0xe0};
uchar valuel[]={0x30,0xc0};
uint count=0;
void delay(uint n)
{
uint i=0,j=0;
for(i=0;i<n;i++)
{
for(j=0;j<120;j++);
}
}
//总192 占空比50% 96 96
//占空比25% 高电平delay25 75;最大达到48
void motor()
{
IN0=0;//1 0正转 0 1 反转
// IN1=1;
// delay(50);
// IN1=0;
// delay(50);
E=1;
}
//假设占空比是1/5 周期10ms
//高电平2000 低电平8000
void inittimer()
{
TMOD=0X01;//选中定时器16位模式
TH0=(65536-8000)/256;//10ms
TL0=(65536-8000)%256;
ET0=1;//打开定时器中断
EA=1;//开启总中断
TR0=1;//开启定时器0
IN1=0;//赋一个初值
}
void main()
{
inittimer();
while(1)
{
motor();
}
}
//每隔10ms进一次中断
void timer_isr() interrupt 1
{
TH0=valueh[count];//(65536-value[count])/256;//10ms
TL0=valuel[count];//(65536-value[count])%256;
IN1=~IN1;//方波
count++;
if(count==2)//保证占空比是20%
{
count=0;
}
}