单片机 89C52 频率计数器入口设置

来源:百度知道 编辑:UC知道 时间:2024/06/03 16:51:07
void main(void)
{
unsigned char i;

TMOD=0x15;
TH0=0;
TL0=0;
TH1=(65536-4000)/256;
TL1=(65536-4000)%256;
TR1=1;
TR0=1;
ET0=1;
ET1=1;
EA=1;

while(1)
{
if(flag==1)
{
flag=0;
x=T0count*65536+TH0*256+TL0;
for(i=0;i<8;i++)
{
temp[i]=0;
}
i=0;
while(x/10)
{
temp[i]=x%10;
x=x/10;
i++;
}
temp[i]=x;
for(i=0;i<6;i++)
{
DisBuffer[i]=temp[i];
}
timecount=0;
T0count=0;
TH0=0;
TL0=0;
TR0=1;
}
}
}

void t0(void) interrupt 1 using 0
{
T0count++;
}

void t1(v

你这是对外部脉冲的一个计数事件,看你的要求INTX和定时/计数中断都可以,但是有一点要说明一下,你如果用定时计数的话要考虑你的传感器的频率,不能超过要机器周期的1/24,因为这时外部脉冲负跳变时计数器才会加1,单片机要两个周期才能完成这个工作,第一个周期采样一次,第二周期采样一次,两次如果是一高一低才会计数,所以对你的频率会有要求,这时的设置是这样的

在主程序里:
TMOD=0x05; //选择计数,边沿触发。
TH0=(65536-xxxx)/256;//装初值
TL0=(65536-xxxx)%256;//装初值
TR0=1;//启动T0
EA=1;//开总中断
ET0=1;T0允许中断
这时你要注意,如果计数完毕,你要读一下T0,困为最后一次计数可能还没有溢出,溢出的次数乘以每次的计数+最后读出的T0,或者你可以计数1则溢出,这样的话溢出多少次就是外部的脉冲数。

如要用INT0和话也要进行设置
外部中断也是默认边沿触发方式,负跳变则中断。设置如下
EA=1;
EX0=1;
那么这时计数的任务就交给中断服务了,设置一个变量加1即可。

中断服务的入口的设置是这样的
如果你用T0
void zhongduan_IT0 interrupt 1
如果用外部中断
void zhongduan_INT0 interrupt 2

输入输出不需要设置,直接给端口命令。是输入还是输出,单片机会自己识别!比如你的霍尔传感器,把传感器信号放大后经驱动送给单片机的P3.1口,你就可以直接这样写(端口定义:sbit P3^1 P3_1;):
if(P3_1==1)
{
a++;
}
a是定义的一个计数变量。

你是想通过外部中断0来实现霍尔传感器的频率计数吧?
89C52应该是不需要对P3.2进行端口配置的,它默认就是外部中断0的接口;52单片机的外部中断有两种触发方式可选:电平触发和边沿触发