
先解释下此函数的功能
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程序、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)