本人刚学单片机不久,想用霍尔传感器41F(开关型)测下电机速度为以后做准备。我的硬件部分已没问题,现在说说程序的问题。我将信号输出接到单片机P3^5即T1口,用T0作定时器,T1作计数器,在一定时间内计数霍尔元件产生的脉冲,从而得到速度。下面是我的程序:
#include<reg51.h>#define uchar unsigned char
#define uint unsigned int
#define led P1
sbit dula=P2^6; //U1寄存器
sbit wela=P2^7; //U2寄存器
uint z=0;
uint code table[ ]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint data chushi=600;
//====================================================
void init(void) //定义名为init的初始化子函数
{ //init子函数开始,分别赋值
TMOD=0X51; //GATE C/T M1 M0 GATE C/T M1 M0 计数器T1 定时器T // 0 1 0 1 0 0 0 1
TH1=0; //计数器T1初始值
TL1=0;
TH0=(65536-50000)/256; //定时器t0 定时50ms
TL0=(65536-50000)%256;
EA=1; // IE=0X00; //EA - ET1 ES ET1 EX1 ET0 EX0
ET0=1; // 1 0 0 0 0 0 1 0
TR1=1;
TR0=1;
}
//=============================================
void delay(uint k) //延时程序
{
uint i,j;
for(i=0;i<k;i++)
for(j=0;j<110;j++);
}
//================================================
void display(uint numdis)
{
uint m,n,s,k;
m=numdis/1000;
n=numdis%1000/100;
s=numdis%100/10;
k=numdis%10;
dula=1;
P0=table[m];
dula=0;
P0=0xff;
wela=1;
P0=0xfe;
wela=0;
delay(2);
dula=1;
P0=table[n];
dula=0;
P0=0xff;
wela=1;
P0=0xfd;
wela=0;
delay(2);
dula=1;
P0=table
;
dula=0;
P0=0xff;
wela=1;
P0=0xfb;
wela=0;
delay(2);
dula=1;
P0=table[k];
dula=0;
P0=0xff;
wela=1;
P0=0xf7;
wela=0;
delay(2);
} //数码管显示函数
//=========================================
void main(void) //主程序开始
{ led=0xff;
init();
while(1)
{
z=(TH1<<8)+TL1;
display(z);
}
//无限循环语句,等待中断
}
//===================================================
void time(void) interrupt 1 using 0
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
chushi--;
if(chushi<=0)
{
led=~led; // LED以周期1分钟闪烁,作为指示灯
TH1=0;
TL1=0; //清零计数器
chushi=600; //50ms*600=30s
}
}
通过实验,我观察到每次计数到4000左右便清零,我想问下这4000多是不是一分钟计数?还有是不是马达每转一周就产生一个脉冲?另外,我想通过按键来查询上一次最后计数是四千几,或者通过延时来读出准确数值。哪位大神能帮忙解决下,小弟不胜感激!
此帖出自
小平头技术问答
这由你的硬件决定,假如你只用一个霍尔元件且马达旋转轴上只装一块单极性磁铁,那么马达每转一周就产生一个脉冲。
一周热门 更多>