这个自适应算法哪里有问题啊

2019-07-16 00:58发布

uint selfadaption()
{
        uint num = 0;
        while(1)
        {
                if(count >= base_time)          
                {       
                        EX0 = 0;
                        ET0 = 0;
                        num = a;
                        a   = 0;
                        count = 0;          // 计数器清零
                        if(num > 1000 && num < 10000)        // f=10kHz~100kHz
                        {
                                base_time = 1;          // 10ms
                                EA  = 1;                  // 开总中断
                                EX0 = 1;
                                ET0 = 1;              // 开定时器中断
                                TR0 = 1;
                                IT0 = 1;          // 边沿触发

//                                init_51();       
                        }       
                        if(num > 100 && num <= 1000)        // f=1kHz~10kHz
                                break;  
                        if(num > 0 && num < 100)            // f=0Hz~1kHz
                        {
                                base_time = 100;  // 1s
                                EA  = 1;                  // 开总中断
                                EX0 = 1;
                                ET0 = 1;              // 开定时器中断
                                TR0 = 1;
                                IT0 = 1;          // 边沿触发

//                                init_51();                               
                        }                                                                
                }                 
        }
        return num;
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
1条回答
天云
2019-07-16 02:34
完整程序如下,但不知道哪里出问题了


/********************************************
功能简介:周期信号从单片机的P3.2口输入,        *
                  之后在数码管上显示周期信号的频率。*                          
********************************************/
#include "1602.h"

uchar cnt[6];
uint count;
uint a;          
uint num = 0;
uint base_time = 10;           // 初始定时100ms


/* 频率数值分离,为显示做准备 */
void detach(uint fre)
{
        uint freq;
        freq = fre*1000/base_time;

        cnt[0]  = freq/100000;
        freq   %= 100000;
        cnt[1]  = freq/10000;
        freq   %= 10000;
        cnt[2]  = freq/1000;
        freq   %= 1000;
        cnt[3]  = freq/100;
        freq   %= 100;
        cnt[4]  = freq/10;
        cnt[5]  = freq%10;       
}
          
void display()
{       
        int i;
        write_com(0x80 + 6);
        for(i=0;i<6;i++)
        {
                write_data(cnt[i] + '0');
        }
}

void init_51()
{
        TMOD = 0x01;   // 定时器0工作在方式1
         
        EA  = 1;    // 开总中断
        EX0 = 1;    // 开外部中断0
        IT0 = 1;    // 边沿触发

        ET0 = 1;           // 开定时器中断
        TR0 = 1;           // 启动定时/计数器0

        TH0 = (65536 - 10000) / 256;  // 12M晶振下定时10ms
        TL0 = (65536 - 10000) % 256;               
}

uint selfadaption()
{
        uint num = 0;
        while(1)
        {
                if(count >= base_time)          
                {       
                        EX0 = 0;
                        ET0 = 0;
                        num = a;
                        a   = 0;
                        count = 0;          // 计数器清零
                        if(num > 1000 && num < 10000)        // f=10kHz~100kHz
                        {
                                base_time = 1;          // 10ms
                                EA  = 1;                  // 开总中断
                                EX0 = 1;
                                ET0 = 1;              // 开定时器中断
                                TR0 = 1;
                                IT0 = 1;          // 边沿触发

//                                init_51();       
                        }       
                        if(num > 100 && num <= 1000)        // f=1kHz~10kHz
                                break;  
                        if(num > 0 && num < 100)            // f=0Hz~1kHz
                        {
                                base_time = 100;  // 1s
                                EA  = 1;                  // 开总中断
                                EX0 = 1;
                                ET0 = 1;              // 开定时器中断
                                TR0 = 1;
                                IT0 = 1;          // 边沿触发

//                                init_51();                               
                        }                                                                
                }                 
        }
        return num;
}

void main()
{
        uint f;
        init_51();
        init_1602();
        f = selfadaption();
        detach(f);
        display();
        while(1) ;
//        {          
//                       
//        }
}

void timer() interrupt 1
{
        TH0 = (65536 - 10000) / 256;  // 重装初值
        TL0 = (65536 - 10000) % 256;
        count++;         // 计数器加1
/*        if(count == 20)          // 定时1s到
        {       
                count = 0;          // 计数器清零         
//                EA = 0;                  // 关总中断

                num = a;
//                a = 0;                                                       
                detach(num);
                ET0 = 0;          // 关定时器中断
                EX0 = 0;      // 关外部中断0
        }        */               
}

void exter0() interrupt 0
{
        a++;       
}         

一周热门 更多>