本帖最后由 ml0943 于 2012-12-26 10:22 编辑
stc89c52_脉冲计数_中断
函数是将脉冲方波信号接到INT1(在这个中断函数中实现方波计数,有一个方波LED0亮),T0定时100MS处理一次方波数目,然后通过串口发送
现在问题是:LED0灯闪亮,说明接收到了脉冲信号计数,但是LED1不亮,说明没有实现中断数据处理,不知道哪里有问题,程序编译通过了,没有错误
#include<reg52.h>
typedef unsigned char BYTE;
typedef unsigned long LWORD;
//sbit portbit=P1^0; //在P1.0引脚生成50HZ的方波,接到INT1引脚上
sbit LED0=P0^0;
sbit LED1=P0^1;
bit flag;
LWORD pulsecount;
BYTE timecount;
BYTE sp[10];
float speed;
float x;
void SendByte(unsigned char *sent);//串口发送函数声明
void delay(LWORD sms);
//void pulse(void); //产生方波信号在引脚p1.0
void Init(void);
void main (void)
{
Init();
//pulse();
while(1)
{
if(flag==1)
{
flag=0;
x=4194.304*(pulsecount+1); //算出频率为x
speed= 3.38*x; // speed=x*3.14*215/200
sp[1]= 0x0B; //报文类别
sp[2]= ((int)(speed)&0x00f0)>>4; //整数的低位
sp[3]= (int)(speed)&0x000f; //整数的高位
sp[4]= (unsigned short)((speed-(int)speed)*10); //小数的十分??
sp[5]= 0x00; //补充信息
sp[6]=0x01;
SendByte(&sp[0]);
LED1=0;
pulsecount=0;
timecount=0;
LED1=1;
}
else
{
sp[1]=0x0B; //报文类别
sp[2]=00;
sp[3]=0;
sp[4]=0;
sp[5]=0; //补充信息
sp[6]=0x01;
SendByte(&sp[0]);
}
}
}
void Init(void) //初始化函数
{
IE=0x96; //开中断,EA=1,ES=1,ET0=1,EX1=1
// IP=0x12; //中断优先级ET0>ES>EX0>EX1>ET1>ET2
IT1=1; //INT1是下降沿触发方式
SCON=0x50; // SCON: 模式 1, 8-bit UART
TMOD=0x21; // TMOD: timer1,8bit_reload,作为比特率发生器;timer 0, mode 1, 16-bit
TH1=0xFD; // TH1: 重装值FD,12MHZ,波特率9600
TH0=0xC3; //timer0是50ms
TL0=0x50;
TR0=1;
LED0=1;
LED1=1;
pulsecount=1;
timecount=1;
flag=0;
}
void T0_ISR(void) interrupt 1
{
timecount++;
if(timecount==2) //定时100ms处理一次数据
{
timecount=0;
flag=1;
}
}
void INT1_ISR(void) interrupt 2
{
LED0=0;
pulsecount++; //脉冲计数
delay(10);
LED0=1;
}
void SendByte(BYTE *sent) //发送函数
{
LWORD i;
BYTE SE[10];
for(i=0;i<10;i++)
{
SE=*(sent++);
}
for(i=0;i<10;i++)
{
SBUF=SE;
while(!TI); //等待8 bit的数据全部存储到SBUF中,然后TI=1
TI=0;
}
}
void delay(LWORD sms)
{
LWORD x,y;
for(x=sms;x>0;x--)
for(y=110;y>0;y--);
}
|