通过T0计数器对减速直流电机轴的转动圈数进行累计(直流电机带有编码器),转到一定圈数后让电机停止,但不知道为什么,程序运行后,电机一直转,不会停,不知道为什么?求大侠们帮忙指点指点:
单片机源程序如下:
#include "reg52.h"
typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;
sbit MOTOR1_A=P0^0; //直流电机的正极
sbit MOTOR1_B=P0^1; //直流电机的负极
u16 s1=10; //设定电机旋转圈数
u16 count=0; //电机圈数
/*******************************************************************************
* 函 数 名 : delay_ms
* 函数功能 : ms延时函数,ms=1时,大约延时1ms
* 输 入 : ten_us
* 输 出 : 无
*******************************************************************************/
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
/*******************************************************************************
* 函 数 名 : time0_init
* 函数功能 : 定时器0中断配置函数,通过设置TH和TL即可确定计数值
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void counter0_init(void)
{
TMOD|=0X05; //选择为计数器0模式,工作方式1
TH0=0xFC; //电机编码器867个脉冲,减速器轴转一圈,初值设置为FC9D
TL0=0x9D;
TF0=0;
TR0=1; //打开计数器
ET0=1; //打开计数器0中断允许
EA=1; //打开总中断
}
/*******************************************************************************
* 函 数 名 : contor0
* 函数功能 : 定时器0中断函数,通过设置TH和TL即可确定计数值,并对减速器轴圈数进行累加
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void conter0() interrupt 1 //定时器0中断函数
{
TH0=0xfC; //给计数器赋初值
TL0=0x9D;
count++; //对电机转动圈数进行累加
}
/*******************************************************************************
* 函 数 名 : main
* 函数功能 : 主函数
* 输 入 : 无
* 输 出 : 无
*******************************************************************************/
void main()
{
u16 k; //缓冲变量
k=count;
counter0_init(); //计数器0中断配置
MOTOR1_A=1; //直流电机开始正转
MOTOR1_B=0;
do
{
;
}
while(k<s1); //检测编码器计数是否达到设定值s1
TR0=0; //计数器停止计数
MOTOR1_A=1; //电机停止
MOTOR1_B=1;
delay_ms(5000);
}
|