怎样用AT80C51单片机编写汇编程序输出pwm 通过不同的占空比控制直流电机的转速和转向

怎样用AT80C51单片机编写汇编程序输出pwm 通过不同的占空比控制直流电机的转速和转向,第1张

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程序。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9514813.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存