4393|8

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

基于AVRmega16d单片机的简易频率测量仪 [复制链接]

这是学校给的课题 搞很久了还是有错误 谁能帮帮忙修改一下啊



  1. #include
  2. #include
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #define CON 1000
  6. uchar Flag=0;

  7. //uchar Table[20]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  8. //               0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  9. uchar Table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  10.                  0x80,0x90    };
  11. uchar Data[4]={0,0,0,0};
  12. uint CNT1;
  13. uint CNT2;
  14. uint CNT=100;


  15. void DelayMs(uint i)
  16. {
  17.    uint j;
  18.    for(;i!=0;i--)
  19.        {
  20.           for(j=2000;j!=0;j--){;}
  21.        }
  22. }
  23. void Pre_Display()
  24. {
  25.    uchar i;
  26.    for(i=0;i<16;i++)
  27.    {
  28.       PORTB=0x00;
  29.       PORTA=Table[i];
  30.       DelayMs(100);
  31.    }
  32. }

  33. void Display(uchar *p)
  34. {
  35.    uchar i,sel=0x08;
  36.    for(i=0;i<4;i++)
  37.    {
  38.       PORTC=~sel;
  39.       PORTA=Table[p[i]];
  40.       DelayMs(2);
  41.       sel=sel>>1;
  42.    }
  43.    
  44. }
  45. void HZ(uint i,uchar *p)
  46. {
  47.       uint TEM;
  48.       p[0]=CON/i;
  49.       TEM=CON%i;
  50.       TEM=TEM*10;
  51.       
  52.       p[1]=TEM/i;
  53.       TEM=TEM%i;
  54.       TEM=TEM*10;
  55.       
  56.       p[2]=TEM/i;
  57.       TEM=TEM%i;
  58.       TEM=TEM*10;
  59.       
  60.       p[3]=TEM/i;
  61.       
  62. }

  63. void Init_IO()
  64. {
  65.       DDRA=0xFF;
  66.       PORTA=0xFF;
  67.       DDRC=0xFF;
  68.       PORTC=0xFF;
  69.       DDRD=0x00;
  70.       PORTD=0x00;
  71. }

  72. void Init_Timer1()
  73. {
  74.     TIMSK=TIMSK|0x20;
  75.     TCCR1B=0x82;
  76.     TIFR=0x20;
  77.     SREG=SREG&0x7f;
  78. }

  79. void main()
  80. {
  81.    uchar i;
  82.    uint TEMP;
  83.    Init_IO();
  84.    PORTA=0xff;
  85.    PORTC=0xf0;
  86.    DelayMs(300);
  87.    PORTC=0xff;
  88.    Pre_Display();
  89.    
  90.    PORTC=0xff;
  91.    Init_Timer1();
  92.    while(1){
  93.             while(TIFR&0x20)//说明发生了下降沿跳变  
  94.               {
  95.                   //TIFR=TIFR&0xDF;  //标志位清零
  96.                   //TEMP=ICR1L;
  97.                   //CNT2=(ICR1H<<8)+TEMP;
  98.                   TIFR|=0x20;
  99.                   CNT=ICR1L;
  100.                   CNT2=(ICR1H<<8)+ICR1L;
  101.                   CNT=CNT2-CNT1;
  102.                   Flag++;
  103.               }
  104.               if(Flag==2)
  105.                   {
  106.                      Flag=0;
  107.                      HZ(CNT,Data);
  108.                      for(i=0;i<100;i++)
  109.                               Display(Data);
  110.                                           
  111.               CNT=0;CNT1=0;CNT2=0;
  112.                  }
  113.             }
  114.                      
  115.                   
  116.             
  117.    
  118.    
  119. }

复制代码


最新回复

问一下楼主,那个CON是做什么用的,测出频率直接传送就可以了啊    详情 回复 发表于 2012-3-13 18:07
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
void HZ(uint i,uchar *p)
{
      uint TEM;
      p[0]=CON/i;
      TEM=CON%i;
      TEM=TEM*10;
      
      p[1]=TEM/i;
      TEM=TEM%i;
      TEM=TEM*10;
      
      p[2]=TEM/i;
      TEM=TEM%i;
      TEM=TEM*10;
      
      p[3]=TEM/i;
}
这里为什么要这么写?
 
 

回复

99

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
说出具体的错误,到底是程序编译不过还是?结果不对?
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 c_rabbit 的回复:
void HZ(uint i,uchar *p)
{
? ? ? uint TEM;
? ? ? p[0]=CON/i;
? ? ? TEM=CON%i;
? ? ? TEM=TEM*10;
? ? ?
? ? ? p[1]=TEM/i;
? ? ? TEM=TEM%i;
? ? ? TEM=TEM*10;
? ? ?
? ? ? p[2]=TEM/i;
? ? ? TEM=TEM%i;
? ? ? TEM=TEM*10;
? ? ?
? ? ? p[3]=TEM/i;
}
这里为什么要这么写?



因为  将周期转换成频率后在显示出来  i/CON还要取倒数
 
 
 

回复

60

帖子

0

TA的资源

一粒金砂(初级)

5
 
测量的频率范围是多大的?
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

6
 
错误是什么?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
1.
你写的程序没有注释,这是一个非常不好的习惯,不然别人很难理解你的意思,不信你自己过了一段时间后再来看,同样会对代码非常陌生。

2.
没将自己的问题说清楚,起码应该说清楚是什么问题?现象是什么?在什么情况下会发生?
现在你就贴了一段代码,然后说我有问题,神仙也回答不了你这样的问题.
我没用过你说的MCU,就猜测一下你的代码含义。

void HZ(uint i,uchar *p)//如果i等于0是什么后果?
{
      uint TEM;
      p[0]=CON/i;
      TEM=CON%i;
      TEM=TEM*10;
      
      p[1]=TEM/i;
      TEM=TEM%i;
      TEM=TEM*10;
      
      p[2]=TEM/i;
      TEM=TEM%i;
      TEM=TEM*10;
      
      p[3]=TEM/i;
      
}


void Init_Timer1()//具体是什么工作模式?内部计时?外部捕获?外部比较?
{
    TIMSK=TIMSK|0x20;
    TCCR1B=0x82;
    TIFR=0x20;
    SREG=SREG&0x7f;
}

void main()
{
   uchar i;
   uint TEMP;
   Init_IO();//初始化IO
   PORTA=0xff;//PORTA输出11111111
   PORTC=0xf0;//PORTC输出11110000,应该是低四位为0表示所对应的数码管工作
   DelayMs(300);//延时约300毫秒,这个时间是循环延时实现,可能不准
   PORTC=0xff;//PORTC输出11111111
   Pre_Display();//四个数码管同时依次显示一段开机信息
   
   PORTC=0xff;//PORTC输出11111111
   Init_Timer1();//初始化TIMER1,好像你打开了中断,但你没有用中断来测试,是循环查询方式,中断服务函数都没有挂到TIMER1上去,编译平台挂中断有特定的方式,可以参考其样例代码,如果MCU有中断总使能global enable的控制位应一并设好
   while(1){
            while(TIFR&0x20)//说明发生了下降沿跳变  
              {
                  //TIFR=TIFR&0xDF;  //标志位清零
                  //TEMP=ICR1L;
                  //CNT2=(ICR1H<<8)+TEMP;
                  TIFR|=0x20;
                  CNT=ICR1L;
                  CNT2=(ICR1H<<8)+ICR1L;
                  CNT=CNT2-CNT1;//你本意是想第二次跳变时TIMER里面的计时器值减去第一次时的值吗?如果是这样现在你的表达式永远都是近似ICR1H中的内容CNT=CNT2-CNT1=((ICR1H<<8)+ICR1)-LICR1L
                  Flag++;
              }
              if(Flag==2)//你是想计算两个低跳变脉冲之间的时间间隔?
                  {
                     Flag=0;
                     HZ(CNT,Data);
                     for(i=0;i<100;i++)
                              Display(Data);
                                          
              CNT=0;CNT1=0;CNT2=0;
                 }
            }
//建议改为(下面的代码并不可靠,只是供你做参考)
//if(Flag@1)//取一次TIMER值
//{
//  CNT1==(ICR1H<<8)+ICR1L;//这样取到的值并不可靠,比如当前ICR1H_ICR1L为0x00_0xFF,就在读取ICR1H之后TIMER加一,变成了0x01_0x00,但程序读到的值是0x00_0x00,出错
//}
//else//取下一次TIMER值              
//{
//  CNT2==(ICR1H<<8)+ICR1L;
//  CNT=CNT2-CNT1;//两次相减得到时间差,这么没考虑溢出等问题
//}
//HZ(CNT,Data);
//Display(Data);                 
            
   
   
}

问题还需要你自己解决,思维一定要周全。
 
 
 

回复

91

帖子

0

TA的资源

一粒金砂(初级)

8
 

  1. #include
  2. #include
  3. #define uchar unsigned char
  4. #define uint unsigned int

  5. #define CON 1000
  6. uchar Flag=0;

  7. //uchar Table[20]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,
  8. //               0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71};
  9. uchar Table[20]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
  10.                  0x80,0x90    };
  11. uchar Data[4]={0,0,0,0};
  12. uint CNT1;
  13. uint CNT2;
  14. uint CNT=100;


  15. void DelayMs(uint i)
  16. {
  17.    uint j;
  18.    for(;i!=0;i--)
  19.        {
  20.           for(j=2000;j!=0;j--){;}
  21.        }
  22. }
  23. void Pre_Display()
  24. {
  25.    uchar i;
  26.    for(i=0;i<16;i++)
  27.    {
  28.       PORTB=0x00;
  29.       PORTA=Table[i];
  30.       DelayMs(100);
  31.    }
  32. }

  33. void Display(uchar *p)
  34. {
  35.    uchar i,sel=0x08;
  36.    for(i=0;i<4;i++)
  37.    {
  38.       PORTC=~sel;
  39.       PORTA=Table[p[i]];
  40.       DelayMs(2);
  41.       sel=sel>>1;
  42.    }
  43.    
  44. }
  45. void HZ(uint i,uchar *p)
  46. {
  47.       uint TEM;
  48.       p[0]=CON/i;
  49.       TEM=CON%i;
  50.       TEM=TEM*10;
  51.       
  52.       p[1]=TEM/i;
  53.       TEM=TEM%i;
  54.       TEM=TEM*10;
  55.       
  56.       p[2]=TEM/i;
  57.       TEM=TEM%i;
  58.       TEM=TEM*10;
  59.       
  60.       p[3]=TEM/i;
  61.       
  62. }

  63. void Init_IO()
  64. {
  65.       DDRA=0xFF;
  66.       PORTA=0xFF;
  67.       DDRC=0xFF;
  68.       PORTC=0xFF;
  69.       DDRD=0x00;
  70.       PORTD=0x00;
  71. }

  72. void Init_Timer1()
  73. {
  74.     TIMSK=TIMSK|0x20;
  75.     TCCR1B=0x82;
  76.     TIFR=0x20;
  77.     SREG=SREG&0x7f;
  78. }

  79. void main()
  80. {
  81.    uchar i;
  82.    //uint TEMP;
  83.    Init_IO();
  84.    PORTA=0xff;
  85.    PORTC=0xf0;
  86.    DelayMs(300);
  87.    PORTC=0xff;
  88.    Pre_Display();
  89.    
  90.    PORTC=0xff;
  91.    Init_Timer1();
  92.    while(1){
  93.             while(TIFR&0x20)//说明发生了下降沿跳变  
  94.               {
  95.                   //TIFR=TIFR&0xDF;  //标志位清零
  96.                   //TEMP=ICR1L;
  97.                   //CNT2=(ICR1H<<8)+TEMP;
  98.                   
  99.                   TIFR|=0x20;
  100.                   CNT=ICR1L;
  101.                   CNT2=(ICR1H<<8)+CNT;
  102.                   CNT=CNT2-CNT1;
  103.                   Flag++;
  104.               }
  105.               if(Flag==2)
  106.                   {
  107.                      Flag=0;
  108.                      HZ(CNT,Data);
  109.                      for(i=0;i<100;i++)
  110.                               Display(Data);
  111.                                           
  112.               CNT=0;CNT1=0;CNT2=0;
  113.                  }
  114.             }
  115.                      
  116.                   
  117.             
  118.    
  119.    
  120. }





复制代码


感谢 楼上的 指教 啊  你的理解是对的 以后是应该加注释

频率应该是一个固定不变的数 但是我这里怎总是不停的变化啊 仿真软件

上溢出怎么解决啊  溢出为0了
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(中级)

9
 

频率计设计

问一下楼主,那个CON是做什么用的,测出频率直接传送就可以了啊

 

 
 
 

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

查找数据手册?

EEWorld Datasheet 技术支持

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

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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