结贴了~stc89c52_脉冲计数_中断

2019-03-24 18:53发布

方波脉冲计数,用INT1计数,T0定时器每1s处理一次方波数目,计算出频率,并通过串口将数目发送出去。
问题:LED1闪亮,并且串口调试助手接收到(06 0B 00 00 01 00 09),说明响应了T0中断,但是LED0没有亮,根据接收到的数据(06 0B 00 00 01 00 09),说明没有响应外部中断1,没有对方波计数。
#include<reg52.h>
typedef unsigned char BYTE;
typedef unsigned long LWORD;

sbit LED0=P0^0;
sbit LED1=P0^1;
bit flag;

LWORD pulsecount;
LWORD pulse_num;
BYTE timecount;
BYTE sp[10];
float speed;
float x;

void SendByte(unsigned char *sent);//串口发送函数声明
void delay(LWORD sms);
void another_delay(LWORD sms);
void Init(void);


void main (void)
{
        Init();
               while(1);
       
}

void Init(void)                                //初始化函数
{                              
        IE=0x86;                        //开中断,EA=1,,ET0=1,EX1=1
        //IP=0x0A;                      //中断优先级ET0>ET1>EX0>EX1>ES>ET2
        IT1=1;                        //INT1是
        PCON=0x00;      //SMOD=0;
        SCON=0x52;                      // SCON: 模式 1, 8-bit UART.  TI=1
    TMOD=0x21;               // TMOD: timer1,8bit_reload,作为比特率发生器;timer 0, mode 1, 16-bit
    TH1=0xFD;               // TH1:  重装值FD,11.0592MHZ,波特率9600  
    TR1=1;                                //TIMER1 RUN

        //TH0=0xC3;                 //timer0是50ms
    //TL0=0x50;  
        TH0=(65536-50000)/256;    //timer0是50ms
    TL0=(65536-50000)%256;
    TR0=1;            //开启定时器0            
       
        LED0=1;
        LED1=1;
        pulsecount=1;
        timecount=1;
        flag=0;
}

void T0_ISR(void) interrupt 1
{
        //TH0=0xC3;                                                 //timer0重装50ms
        //TL0=0x50;
          TH0=(65536-50000)/256;    //timer0是50ms
          TL0=(65536-50000)%256;
        timecount++;
        if(timecount==20)           //定时1s处理一次数据
        {
                timecount=0;
                flag=1;
                pulse_num=pulsecount;
                pulsecount=0;

                if(flag==1)
                {
                        flag=0;
                        x=0.1319468892*(pulse_num+1);         //算出频率为x
                        speed= x;            //  speed=(pulsenum+1)/200*840*3.1415926/100  m/s
                    sp[0]=0x06;         //包头
                        sp[1]= 0x0B;           //报文类别
                        sp[2]= ((unsigned int)(speed)&0x00f0)>>4;        //整数的低位
                        sp[3]= (unsigned int)(speed)&0x000f;    //整数的高位
                    sp[4]= (unsigned short)((speed-(int)speed)*10);         //小数的十分位
                        sp[5]= 0x00;         //补充信息
                        sp[6]=0x09;                        //包尾

                        SendByte(&sp[0]);
                        LED1=0;
                        pulsecount=0;
                        timecount=0;
                        another_delay(10);
                        LED1=~LED1;
                }
                else
                {
                        sp[0]=0x06;                                //包头
                        sp[1]=0x0B;           //报文类别
                        sp[2]=00;
                        sp[3]=0;   
                        sp[4]=0;       
                        sp[5]=0;         //补充信息
                        sp[6]=0x09;                //包尾
                        SendByte(&sp[0]);                       
                }
        }
}

void INT1_ISR(void) interrupt 2
{

                LED0=0;
                pulsecount++;                           //脉冲计数
                LED0=1;
}

void SendByte(BYTE *sent)   //发送函数
{
        LWORD i;
        BYTE SE[7];
        for(i=0;i<7;i++)
        {
                SE=*(sent++);
        }
        for(i=0;i<7;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--);
}
void another_delay(LWORD sms)
{
        LWORD x,y;
        for(x=sms;x>0;x--)
                for(y=110;y>0;y--);
}

[ 本帖最后由 ml0943 于 2012-12-29 13:57 编辑 ] 此帖出自小平头技术问答
0条回答

一周热门 更多>