proteus吧 关注:19,292贴子:98,682
  • 1回复贴,共1

请问一下大家我的频率计为什么不显示250以下的频率

只看楼主收藏回复

请问一下大家我的频率计为什么不显示250以下的频率,250-490都显示257,500显示514,再到上面才差不多正常,比如888hz就会显示774
代码在评论区


IP属地:山西1楼2024-12-19 16:35回复

    #include <REGX51.H> //头文件
    sfr16 DPTR=0X82; //定义寄存器DPTR
    unsigned char cnt_t0,cnt_t1,qian,bai,shi,ge,bb,wan,shiwan;
    unsigned long freq; //定义频率
    unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴极数码管断码表
    void delay_1ms(unsigned int z)
    {
    unsigned char i,j;
    for(i=0;i<z;i++)
    for(j=0;j<110;j++);
    }
    void init() //初始化函数
    {
    freq=0; //频率赋初值
    cnt_t1=0;
    cnt_t0=0;
    IE=0x8a; //开中断
    TMOD=0x15; //T0为定时器方式1,T1为计数器方式1
    TH1=0x3c; //T1定时
    TL1=0xb0;
    TR1=1; //开启定时器1
    TH1=0; //T0清零
    TL0=0;
    TR0=1; //开启定时器T0
    }
    void display(unsigned long freq_num) //驱动数码管显示函数
    {
    shiwan=freq_num%1000000/100000; //显示十万位
    wan=freq_num%100000/10000; //显示万位
    qian=freq_num%10000/1000; //显示千位
    bai=freq_num%1000/100; //显示百位
    shi=freq_num%100/10; //显示十位
    ge=freq_num%10; //显示个位
    P0=0xdf;
    P2=table[shiwan]; //显示十万位
    delay_1ms(5);
    P0=0xef;
    P2=table[wan]; //显示万位
    delay_1ms(3);
    P0=0xf7;
    P2=table[qian]; //显示千位
    delay_1ms(3);
    P0=0xfb;
    P2=table[bai]; //显示百位
    delay_1ms(3);
    P0=0xfd;
    P2=table[shi]; //显示十位
    delay_1ms(3);
    P0=0xfe;
    P2=table[ge]; //显示个位
    delay_1ms(3);
    }
    void main() //主函数
    {
    P0=0xff; //初始化P0口
    init(); //计数器初始化
    while(1)
    {
    if(cnt_t1==19) //定时1s
    {
    cnt_t1=0; //定时完成后清零
    TR1=0; //关闭T1定时器
    delay_1ms(150); //延时矫正误差
    TR0=0; //关闭T0
    DPL=TH0; //利用DPRT读入其值
    DPH=TH0;
    freq=cnt_t0*65535;
    freq=freq+DPTR; //计数值放入变量
    }
    display(freq); //调用显示函数
    }
    }
    void t1_func() interrupt 3 //中断函数
    {
    TH1=0x3c;
    TL1=0xb0;
    cnt_t1++;
    }
    void t0_func() interrupt 1 //中断函数
    {
    cnt_t0++;
    }


    IP属地:山西2楼2024-12-19 16:35
    回复