
51的输出是没法直接驱动电机的,电机需要有驱动电路。只能用PWM控制驱动电路,进而控制电机转向和转速。比如用P1^1和P1^2输出两路PWM信号,正向转动时P1^1输出PWM信号,P1^2输出低电平。反向转动时则相反设置。而转速则是改变PWM的占空比,即脉冲宽度与所占周期的比例,占空比为0则制动,占空比为1则全速转动。先理清大致的流程,再进行细节考虑。对于程序,根据自己的电路,自己编吧!网上很多这些程序的。
#include<reg51h>
//设CPU是时钟12MHz的8051系列
void SetupTimer0()
{
TMOD &= 0XF0; //仅保留T1信息
TMOD |= 0X02; //设置T0: 定时功能,方式2,自动重载8位定时器/计数器
TH0 = 256-50; //每个周期为1us, 定时每50us中断一次, 两次为100us,
TL0 = 256-50; //自动重装,TL0, TH0均置256-50
TR0 = 1; //开启定时器
ET0 = 1; //定时器0中断打开
}
void Timer0_ISR() interrupt 1 //中断服务程序
{
static data unsigned char p0;
p0^=1; P0=p0; //p1完成翻转后输出到P1,两次翻转完成一个周期输出
}
void main()
{
SetupTimer0();
EA = 1; //全局中断打开
while(1); //死循环,中断程序完成波形输出
}
周期20毫秒,占空比5%~10%,所以高电平为1ms~2ms,以1%变化为调节量(200us)计算来设计程序。
#include<reg51h>
#define uchar unsigned char
sbit pwm=P1^0;
uchar u_p=5,num=0;
void t0isr() interrupt 1
{
num++;
if(num<=u_p)pwm=1;
if(num>u_p)pwm=0;
num%=100;
}
void uart() interrupt 4
{
if(RI)
{
RI=0;
u_p=SBUF;
}
}
main()
{
TMOD=0x22;
TH0=56;
TL0=56;
TH1=0xfd;
TL1=0xfd;
TR0=1;
TR1=1;
ET0=1;
ES=1;
EA=1;
pwm=1;
while(1);
}
定时160us。
输出一次高电平,四次低电平。
即可。
程序如下:
ORG 0000H
MOV TMOD, #20H
MOV TH1, #(256 - 160)
MOV TL1, TH1
SETB TR1
LP1:SETB P20
MOV R2, #5
LP2:JNB TF1, $
CLR P20
CLR TF1
DJNZ R2, LP2
SJMP LP1
END
介绍一个51系列单片机采用脉冲宽度调制(PWM)方式控制LED灯亮度的一个程序,大家都知道,51单片机本身是没有pwm接口的,这个程序是通过软件模拟pwm在一定的频率的方波中,调整高电平和低电平的占空比,即可实现LED灯亮度控制。程序中使用定时器0产生25ms周期脉冲,使用占空比控制变量scale控制占空比,在低电平期间使LED灯亮,在高电平期间使LED灯灭,改变scale就改变了高电平与低电平的时间,因此也就控制了LED灯的亮度。/
#include "AT89X51H" //模拟PWM输出控制灯的10个亮度级
unsigned int scale; //占空比控制变量
void main(void) // 主程序
{ unsigned int n; //延时循环变量
TMOD=0x02; //定时器0,工作模式2(0000,0010),8位定时模式
TH0=0x06; //写入预置初值6到定时器0,使250微秒溢出一次(12MHz)
TL0=0x06; //写入预置值
TR0=1; //启动定时器
ET0=1; //允许定时器0中断
EA=1; //允许总中断
while(1) //无限循环,实际应用中,这里是做主要工作
{ for(n=0;n<50000;n++); //每过一段时间,就自动加一个档次的亮度
scale++; //占空比控制变量scale加1
if(scale==10) scale=0; //如果scale=10,使scale为0
} }
timer0() interrupt 1 //定时器0中断服务程序
{ static unsigned int tt ; //tt用来保存当前时间在一秒中的比例位置
tt++; //每250微秒增加1
if(tt==10) //25毫秒的时钟周期
{ tt=0; //使tt=0,开始新的PWM周期
P2_0=0; //使LED灯亮
}
if(scale==tt) //按照当前占空比切换输出为高电平
P2_0=1; //使LED灯灭
}
/程序中从tt=0开始到scale为低电平,从scale开始到tt=10为高电平,由于scale是变量,所以改变scale就可以改变占空比。/
HPulse EQU 100 ;脉冲高电平计数值,修改这两个值可以改变占空比
LPulse EQU 200 ;脉冲低电平计数值
ORG 0000H
LJMP MAIN
ORG 000BH
LJMP T0ISR
ORG 001BH
LJMP T1ISR
ORG 0030H
MAIN:
MOV TMOD,#11H
MOV TH0,#HIGH (65536-HPulse)
MOV TL0,#LOW (65536-HPulse)
MOV TH1,#HIGH (65536-LPulse)
MOV TL1,#LOW (65536-LPulse)
SETB TR0
SETB TR1
SETB EA
SETB ET0
SETB ET1
SJMP $
T0ISR:
CLR TR0
MOV TH0,#HIGH (65536-HPulse)
MOV TL0,#LOW (65536-HPulse)
SETB TR0
SETB P10
RETI
T1ISR:
CLR TR1
MOV TH1,#HIGH (65536-LPulse)
MOV TL1,#LOW (65536-LPulse)
SETB TR1
CLR P10
RETI
END
以上就是关于怎样用AT80C51单片机编写汇编程序输出pwm 通过不同的占空比控制直流电机的转速和转向全部的内容,包括:怎样用AT80C51单片机编写汇编程序输出pwm 通过不同的占空比控制直流电机的转速和转向、51单片机C语言编程实现10k占空比可变矩形波、51单片机输出可调节占空比的方波,周期20ms,占空比5%-10%,串口调节,求大神给个c程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)