4252|5

65

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

帮忙看看我写的频率计为什么没反应? [复制链接]

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar shu=0,count=0;
uchar qian,bai,shi,ge;
long  f;
uchar code dutable[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};

void display(uchar qian,uchar bai,uchar shi,uchar ge);
void int0() interrupt 0
{
 TR1=1;
 shu++;
  if(shu==16)//计15
   shu=0;
  TR1=0;
  EX0=0;
}
void t0() interrupt 3
{
 count++;
}
void init()
{
 TMOD=0x10;
 TH1=0;
 TL1=0;
 IE=1;
 ET1=1;
 EX0=1;
 IT1=1;
}
void delay(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=110;y>0;y--);
}

void main()

 init();
 while(1)
 {    
 
   
  f=(count*65536+TH1*256+TL1)/15;
  f=1000000/f;
   qian=f/1000; 
   bai=f%1000/100;
   shi=f%100/10;
   ge=f%10;
 
  display(qian,bai,shi,ge);
  count=0;
  TH1=0;
  TL1=0;
  TR1=1;
  EX0=1;
 }
}
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
 

 P2=0x01;
 P0=dutable[qian];
 delay(5);
 
 P2=0x02;
 P0=dutable[bai];
 delay(5);

 P2=0x04;
 P0=dutable[shi];
 delay(5);

 P2=0x08;
 P0=dutable[ge];
 delay(5); 
}

写的是低频率计,加信号时没反应.如果要两位小数的,如何改??

此帖出自51单片机论坛

最新回复

写好了! 不知道对呢,对呢,对呢,还是对呢! 要是不对! 再说吧! 好吧! #include #define uchar unsigned char #define uint unsigned int uchar qian,bai,shi,ge; long f; bit flag; uint count; sbit fin=P1^3; sbit fout=P1^7;        //用导线将P1_7脚(发生频率引脚)的频率输出连接P1_3脚(测量频率管脚) uchar code dutable[]={0xc0,0xf9,0xa4,0xb0,0x99, 0x92,0x82,0xf8,0x80,0x90}; void delay(uint z) {         uint x,y;         for(x=z;x>0;x--)                 for(y=110;y>0;y--); } void display(uchar qian,uchar bai,uchar shi,uchar ge) {         P2=0X01;         P0=dutable[qian];         delay(5);         P2=0X02;         P0=dutable[bai];         delay(5);         P2=0X04;         P0=dutable[shi];         delay(5);         P2=0X08;         P0=dutable[ge];         delay(5);                 } void main() {         uint temp;         EA=1;         IT0=1;         TMOD=0X11;         TH1=(65535-500)/256;         TL1=(65535-500)%256;         ET0=1;         ET1=1;         TR1=1;         while(1)         {                 bit fin_before=0;                 bit fin_now=0;                 uchar flag=0; //                uint count; //                TH0=0; //                TL0=0;                 while(1)                 {                         fin_now=fin;                         if(fin_before&&!fin_now)                         {                                 flag++;                                 EX0=1;                         }                         if(flag==2)                         {                                 EX0=0;                                 f=1000000/count;                                 return;                         }                         fin_before=fin_now;                 }                 qian=f/1000;                 bai=f%1000/100;                 shi=f%100/10;                 ge%10;                 display(qian,bai,shi,ge);                } } void timer0() interrupt 0 {         count++; } void timer1() interrupt 3 {         TH1=(65535-1000)/256;         TL1=(65535-1000)%256;        }  详情 回复 发表于 2011-10-10 12:38
点赞 关注
 

回复
举报

7815

帖子

57

TA的资源

裸片初长成(中级)

沙发
 
//兄弟,你得重新给计数初值赋值吧?
void int0() interrupt 0
{
TR1=1;
shu++;
  if(shu==16)//计15
   shu=0;
  TR1=0;
  EX0=0;
}

//这里,至少写成t1吧,我一般习惯写成TimerX
//但关系不大,只是0 和 1 总要分清楚吧,差点混淆了,幸好有个interrupt 3
void t0() interrupt 3
{
count++;
}


//额滴神!!
//兄弟,你拼命刷掉TH1 TL1,它能溢出才怪!
while(1)
{   

   
  f=(count*65536+TH1*256+TL1)/15;
  f=1000000/f;
   qian=f/1000;
   bai=f%1000/100;
   shi=f%100/10;
   ge=f%10;

  display(qian,bai,shi,ge);
  count=0;
  TH1=0;
  TL1=0;
  TR1=1;
  EX0=1;
}



“写的是低频率计,加信号时没反应.如果要两位小数的,如何改??”
你先把 反应 弄出来再说......
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

板凳
 

回复 沙发 辛昕 的帖子

我作了点修改,
void int0() interrupt 0
{
TR1=1;
shu++;
if(shu==16)//计15
shu=0;
TR1=0;
EX0=0;
}

void int0() interrupt 0
{
TH0=0;重装
TL0=0;
TR1=1;
shu++;
if(shu==16)//计15
shu=0;
TR1=0;
EX0=0;
}
while(1)
{


f=(count*65536+TH1*256+TL1)/15;
f=1000000/f;
qian=f/1000;
bai=f%1000/100;
shi=f%100/10;
ge=f%10;

display(qian,bai,shi,ge);
count=0;
TH1=0;/去掉
TL1=0;/去掉
TR1=1;
EX0=1;
}
自己试了之后,没加信号数码管就乱显.
此帖出自51单片机论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(高级)

4
 

单片机频率计

说实话,没怎么看明白你的程序,首先当我看到你的main的时候,似乎EA=1你都不写!!我感觉有点蛋疼!那我看着你的程序写写吧,不知道行不行!对了,顺便说一下,我用的是T0和T1! 我没有仿真,不知道对不对,你可以试试,然后告诉我!至于那个小数点的,回头再说吧

 我又重新看了一下下,似乎有点不对。。。。你再试试这个

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar shu=0,count=0;
//sfr16 DPTR=0X82;//这个是用来存放定时器0中TH0,TL0中的值
uchar qian,bai,shi,ge;
long  f;
uchar code dutable[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void delay(uint z)
{
  uint x,y;
  for(x=z;x>0;x--)
   for(y=110;y>0;y--);
}

void init()
{
 IE=0X8A;
 TMOD=0X15;
 TH1=(65535-50000)/256;
 TL1=(65535-50000)%256;
 TR1=1;
 TH0=0;
 TL0=0;
 TR0=1; 
}
void display(uchar qian,uchar bai, uchar shi,uchar ge)
{
 P2=0X01;
 P0=dutable[qian];
 delay(5);
 
 P2=0X02;
 P0=dutable[bai];
 delay(5);
 
 P2=0X04;
 P0=dutable[shi];
 delay(5);
 
 P2=0X08;
 P0=dutable[ge];
 delay(5); 
}
void main()
{
 while(1)
 {
  init(); 
  if(shu==20)
  {
   shu=0;
   TR1=0;
//   delay(10); //这里是延时,矫正一下下误差,这种计数器准确率并不高!
   TR0=0;
//   DPL=TL0;
//   DPH=TH0;
//   f=DPTR;
   f=TH0*256+TL0;
   qian=f/1000;
   bai=f%1000/100;
   shi=f%100/10;
   ge=f%10;
  }
  display(qian,bai,shi,ge);
 }
}
void timer0() interrupt 1
{
 count++;
}
void timer1() interrupt 3
{
 TH1=(65535-50000)/256;
 TL1=(65535-50000)%256;
 shu++;  
}

[ 本帖最后由 _Justin 于 2011-10-9 10:53 编辑 ]
此帖出自51单片机论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(高级)

5
 

呵呵,对不住了,晚了


你先试试,我什么也没做,纯写得。。。。。
要是不对,再告诉我,好吧
#include
#define uchar unsigned char
#define uint unsigned int
uchar qian,bai,shi,ge;
long f;
bit flag;
sbit fin=P1^3;
sbit fout=P1^7;        //用导线将P1_7脚(发生频率引脚)的频率输出连接P1_3脚(测量频率管脚)
uchar code dutable[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
        P2=0X01;
        P0=dutable[qian];
        delay(5);

        P2=0X02;
        P0=dutable[bai];
        delay(5);

        P2=0X04;
        P0=dutable[shi];
        delay(5);

        P2=0X08;
        P0=dutable[ge];
        delay(5);                
}
void main()
{
        uint temp;
        EA=1;
        TMOD=0X11;
//        TH0=(65535-50000)/256;
//        TL0=(65535-50000)%256;
        TH1=(65535-500)/256;
        TL1=(65535-500)%256;
        ET0=1;
        ET1=1;
        TR1=1;
        while(1)
        {
                bit fin_before=0;
                bit fin_now=0;
                uchar flag=0;
                uint count;
                TH0=0;
                TL0=0;
                while(1)
                {
                        fin_now=fin;
                        if(fin_before&&!fin_now)
                        {
                                flag++;
                                TR0=1;
                        }
                        if(flag==2)
                        {
                                TR0=0;
                                count=TH0*256+TL0;
                                f=1000000/count;
                                return;
                        }
                        fin_before=fin_now;
                }
                qian=f/1000;
                bai=f%1000/100;
                shi=f%100/10;
                ge%10;
                display(qian,bai,shi,ge);       
        }
}
void timer0() interrupt 1
{
        flag=1;
}
void timer1() interrupt 3
{
        TH1=(65535-1000)/256;
        TL1=(65535-1000)%256;       
}
此帖出自51单片机论坛
 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(高级)

6
 

写好了!
不知道对呢,对呢,对呢,还是对呢!
要是不对!
再说吧!
好吧!

#include
#define uchar unsigned char
#define uint unsigned int
uchar qian,bai,shi,ge;
long f;
bit flag;
uint count;
sbit fin=P1^3;
sbit fout=P1^7;        //用导线将P1_7脚(发生频率引脚)的频率输出连接P1_3脚(测量频率管脚)
uchar code dutable[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};
void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
void display(uchar qian,uchar bai,uchar shi,uchar ge)
{
        P2=0X01;
        P0=dutable[qian];
        delay(5);

        P2=0X02;
        P0=dutable[bai];
        delay(5);

        P2=0X04;
        P0=dutable[shi];
        delay(5);

        P2=0X08;
        P0=dutable[ge];
        delay(5);                
}
void main()
{
        uint temp;
        EA=1;
        IT0=1;
        TMOD=0X11;
        TH1=(65535-500)/256;
        TL1=(65535-500)%256;
        ET0=1;
        ET1=1;
        TR1=1;
        while(1)
        {
                bit fin_before=0;
                bit fin_now=0;
                uchar flag=0;
//                uint count;
//                TH0=0;
//                TL0=0;
                while(1)
                {
                        fin_now=fin;
                        if(fin_before&&!fin_now)
                        {
                                flag++;
                                EX0=1;
                        }
                        if(flag==2)
                        {
                                EX0=0;
                                f=1000000/count;
                                return;
                        }
                        fin_before=fin_now;
                }
                qian=f/1000;
                bai=f%1000/100;
                shi=f%100/10;
                ge%10;
                display(qian,bai,shi,ge);       
        }
}
void timer0() interrupt 0
{
        count++;
}
void timer1() interrupt 3
{
        TH1=(65535-1000)/256;
        TL1=(65535-1000)%256;       
}
此帖出自51单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表