电机PWM调速,程序里面有一段程序不懂,程序在下面,求懂得大神讲解一下beep();有什么作用。

电机PWM调速,程序里面有一段程序不懂,程序在下面,求懂得大神讲解一下beep();有什么作用。,第1张

先解释下此函数的功能

void beep(void)

{

uchar t;

for(t=0;t<100;t++)//循环,共输出50个脉冲

{

delaynms(1);//延时,即两个脉冲的间隔时间

FMQ=!FMQ; //产生脉冲,此句貌似有错误,应该写成 FMQ = ~FMQ;

}

FMQ=1; //关闭脉冲,即循环后,不管结果如何,必须让此端口置 1

delaynms(300);//延时,此句有没有都可以

}

程序的开头 sbit FMQ = P3^6; 可知,这是一个输出端口,至于连接的什么不得而知

但从函数本身看,这只是一个简单的利用延时函数来输出脉冲的函数,其精度不高

程序开头有四句

sbit PWM11 = P1^0;

sbit PWM12 = P1^1;

sbit PWM13 = P1^2;

sbit PWM14 = P1^3;

并且在中断函数中进行控制,初步可以断定,这是一个利用L298N 控制的两相步进电机

但此程序的可读性太差,除了当时编程的时候可以理解其内容,等过段时间就会忘记流程啦

此程序有待改进!

#include<reg51h>

#define Tpwm 0xfc18//PWM周期对应的计数值1ms,基于12MHz晶振

unsigned int duty[]={0,/0/

0xff9c/100us/,0xff38/200us/,0xfed4/300us/,\

0xfe70/400us/,0xfe0c/500us/,0xfda8/600us/,\

0xfd44/700us/,0xfce0/800us/,0xfc7c/900us/,\

0xfc18/1000us/};//PWM高电平时间

unsigned char i=0;

sbit P32 = P3^2;

sbit P33 = P3^3;

sbit PWMOUT = P2^0;

sbit PWMIN1 = P2^1;

sbit PWMIN2 = P2^2;

bit flag = 1;//PWM输出电平状态,1为输出高电平时间,0为输出低电平时间

void delay10ms(int n);

void  main(void)

{

PWMOUT = 0;//初始化L293D ,停止电机

PWMIN1 = 0;

PWMIN2 = 1;

EA = 1;  //开总中断

IT0 = 1;  //中断方式为跳变

IT1 = 1;

EX0 = 1;  //打开外部中断0

EX1 = 1;  //打开外部中断1

ET0 = 1;  //开定时器0中断允许

TMOD = 0x01; //设置定时方式

while(1)  //等待中断

{

/在此可以实现其它任务/

}

}

//10ms延时函数

void delay10ms(int n)

{

int i=0,j;

while(n--)

{

for(i=0;i<10;i++)

{

for(j = 0; j < 125; j++);

}

}

}

void keySpeeddownISR() interrupt 0 //按键中断服务程序

{

EA = 0;   //关中断

delay10ms(2);  //延时消抖

if (!P32)    //确认按键按下,滤除键盘抖动干扰

{//减少PWM高电平时间

if(i>0)

i--;

if((TR0=1) && (i == 0))

{

TR0 = 0;

PWMOUT = 0;

}

}

EA = 1;

}

void keySpeedupISR() interrupt 2 //按键中断服务程序

{

EA = 0;   //关中断

delay10ms(2);  //延时消抖

if (!P33)    //确认按键按下,滤除键盘抖动干扰

{//增加PWM高电平时间

if(i<=10)

i++;

if((TR0 == 0) && (i > 0))

{//启动PWM,电机顺时针旋转

PWMIN1 = 0;

PWMIN2 = 1;

PWMOUT = 1;

TH0 = duty[i]>>8;

TL0 = duty[i]&0xff;

TR0 = 1;

flag = 1;

}

}

EA = 1;

}

void T0ISR() interrupt 1 //定时器0中断服务程序

{

EA = 0;   //关中断

if(flag)

{//高电平时间结束,输出低电平补齐PWM周期

PWMOUT = 0;

TH0 = (65535-(duty[i]-Tpwm))>>8;

TL0 = (65535-(duty[i]-Tpwm))&0xff;

flag = 0;

}else

{//周期结束

PWMOUT = 1;

TH0 = duty[i]>>8;

TL0 = duty[i]&0xff;

flag = 1;

}

EA = 1;

}

仅供参考。学单片机还需自己多多思考和练习

以上就是关于电机PWM调速,程序里面有一段程序不懂,程序在下面,求懂得大神讲解一下beep();有什么作用。全部的内容,包括:电机PWM调速,程序里面有一段程序不懂,程序在下面,求懂得大神讲解一下beep();有什么作用。、基于Proteus的直流电机调速c程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存