股市赌场论:怎么用标准51的T0实现减计数?

来源:百度文库 编辑:杭州交通信息网 时间:2024/04/28 07:16:18
我想用计数器计数电机的编码器脉冲,但是选用的单片机类似Mcs-51,只能加1计数。外部电路已经实现了送给单片机脉冲信号和方向信号,方向是高低电平。可以利用外部中断0和1。只要能实现,正转(方向电平为高)时,计数增加,反转时计数减少。下面有一个,网上的例子可供参考。但不是很懂。谢谢了!

5 利用单片机内部计数器实现可逆计数
对以上两种计数方法进行分析可知,用纯软件计数虽然电路简单,但是计数速度慢,难以满足实时性要求,而且容易出错,用外接加减计数芯片的方法,虽然速度快,但硬件电路复杂,由上图可以看出要做一个12位计数器需要5个外围芯片,成本也较高。那么我们能否用单片机内部的计数器来实现加减计数呢。我们知道,8051片内有两个16位的定时器:定时器0和定时器1,8052还有一个定时器2,这三个定时器都可以作为计数器来用。但8051内部的计数器是加1计数器,所以不能直接应用,必须经过适当的软件编程,来实现其“减”计数功能。硬件电路如下:
我们可以把经过D触发器之后的脉冲,即方向控制脉冲(DIR)接到单片机的外部中断INT0端,同时经过反向器后再接到另一个外部中断INT1,并且把计数脉冲A接到单片机的片内计数器T0端即可,相对外部计数芯片来说,使用这种方法电路相对要简单的多。系统工作时,先要把两个中断设置成下降沿触发,并打开相应的中断。当方向判别脉冲(DIR)由低—高跳变时,INT1中断,执行相应的中断程序,进行加计数;而当方向判别脉冲由高—低跳变时,INT0中断,执行相应的中断程序,进行“减”计数(实际是重新复值,进行加计数)。下面是软件编程思路:

我们在C语言环境下来实现计数功能:
#include
int data k=1;
void service_int0() interrupt 0 using 0
{ k-- ;/*标志位减1*/
TR0=0 ;/*停止计数*/
TH0= -TH0 ;
TL0= -TL0 ;/*把计数器重新复值,此时相当于减计数*/
TR0=1 ;/*开始计数*/
}
void service_int1() interrupt 2 using 1
{ k++ ;/*标志位加1*/
TR0=0 ;/*停止计数*/
TH0= -TH0 ;
TL0= -TL0 ;/*把计数器重新复值,此时相当于加计数*/
TR0=1 ;/*开始计数*/
}
void timer0(void) interrup 1 using2
{ if(k=0)
/*反向计数满*/
else if(k=1)
/*计数为0*/
else
/*正向计数满*/
}
void main(void)
{TCON=0X05 ;/*设置下降沿中断*/
TMOD=0X05 ;/*T0为16位计数方式*/
IE=0X87 ;/*开中断*/
TH0=0 ;
TL0=0 ;/*预置初值*/
}
此方法采用中断的形式进行计数,硬件电路比较简单,程序也不复杂,执行速度较快。