|
通過(guò)T0計(jì)數(shù)器對(duì)減速直流電機(jī)軸的轉(zhuǎn)動(dòng)圈數(shù)進(jìn)行累計(jì)(直流電機(jī)帶有編碼器),轉(zhuǎn)到一定圈數(shù)后讓電機(jī)停止,但不知道為什么,程序運(yùn)行后,電機(jī)一直轉(zhuǎn),不會(huì)停,不知道為什么?求大俠們幫忙指點(diǎn)指點(diǎn):
單片機(jī)源程序如下:
#include "reg52.h"
typedef unsigned int u16; //對(duì)系統(tǒng)默認(rèn)數(shù)據(jù)類型進(jìn)行重定義
typedef unsigned char u8;
sbit MOTOR1_A=P0^0; //直流電機(jī)的正極
sbit MOTOR1_B=P0^1; //直流電機(jī)的負(fù)極
u16 s1=10; //設(shè)定電機(jī)旋轉(zhuǎn)圈數(shù)
u16 count=0; //電機(jī)圈數(shù)
/*******************************************************************************
* 函 數(shù) 名 : delay_ms
* 函數(shù)功能 : ms延時(shí)函數(shù),ms=1時(shí),大約延時(shí)1ms
* 輸 入 : ten_us
* 輸 出 : 無(wú)
*******************************************************************************/
void delay_ms(u16 ms)
{
u16 i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
/*******************************************************************************
* 函 數(shù) 名 : time0_init
* 函數(shù)功能 : 定時(shí)器0中斷配置函數(shù),通過(guò)設(shè)置TH和TL即可確定計(jì)數(shù)值
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void counter0_init(void)
{
TMOD|=0X05; //選擇為計(jì)數(shù)器0模式,工作方式1
TH0=0xFC; //電機(jī)編碼器867個(gè)脈沖,減速器軸轉(zhuǎn)一圈,初值設(shè)置為FC9D
TL0=0x9D;
TF0=0;
TR0=1; //打開(kāi)計(jì)數(shù)器
ET0=1; //打開(kāi)計(jì)數(shù)器0中斷允許
EA=1; //打開(kāi)總中斷
}
/*******************************************************************************
* 函 數(shù) 名 : contor0
* 函數(shù)功能 : 定時(shí)器0中斷函數(shù),通過(guò)設(shè)置TH和TL即可確定計(jì)數(shù)值,并對(duì)減速器軸圈數(shù)進(jìn)行累加
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void conter0() interrupt 1 //定時(shí)器0中斷函數(shù)
{
TH0=0xfC; //給計(jì)數(shù)器賦初值
TL0=0x9D;
count++; //對(duì)電機(jī)轉(zhuǎn)動(dòng)圈數(shù)進(jìn)行累加
}
/*******************************************************************************
* 函 數(shù) 名 : main
* 函數(shù)功能 : 主函數(shù)
* 輸 入 : 無(wú)
* 輸 出 : 無(wú)
*******************************************************************************/
void main()
{
u16 k; //緩沖變量
k=count;
counter0_init(); //計(jì)數(shù)器0中斷配置
MOTOR1_A=1; //直流電機(jī)開(kāi)始正轉(zhuǎn)
MOTOR1_B=0;
do
{
;
}
while(k<s1); //檢測(cè)編碼器計(jì)數(shù)是否達(dá)到設(shè)定值s1
TR0=0; //計(jì)數(shù)器停止計(jì)數(shù)
MOTOR1_A=1; //電機(jī)停止
MOTOR1_B=1;
delay_ms(5000);
}
|
|