找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 6740|回复: 0
打印 上一主题 下一主题
收起左侧

单片机测NE555N发送方波的频率和周期(即频率计)

[复制链接]
跳转到指定楼层
楼主
ID:233456 发表于 2017-10-18 20:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人从51hei论坛找了很久,没有找到有合适正确的测频率和周期的程序,特此编写一份,以供大家学习,也希望大家有搞懂的程序,不论难易,都发出来一起学习。

所有资料51hei提供下载:
频率计.zip (58.53 KB, 下载次数: 125)

单片机源程序如下:
  1. /***********************************************
  2. **注意:频率测出的单位为Hz,周期单位为us
  3. **初始状态为频率,按下K2进入周期,按下K1进入频率
  4. **********************************************/
  5. #include <STC15F2K60S2.H>
  6. #include <intrins.h>
  7. #include "anjian.h"

  8. sbit a=P2^5;
  9. sbit b=P2^6;
  10. sbit c=P2^7;
  11. sbit beep=P0^6;
  12. sbit K1=P3^0;
  13. sbit K2=P3^1;

  14. unsigned char code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x90,0xbf,0xff};
  15. unsigned int disp[8]={10,10,10,10,10,10,10,10};
  16. unsigned char key_scan();
  17. extern unsigned char key_value;
  18. unsigned int zhuoqi=0;
  19. unsigned int pl1=0;
  20. unsigned char over_flag=0;
  21. unsigned int f,t;


  22. void Timer0init();
  23. void Timer1init();
  24. void Delay300us();
  25. void Delay100ms();
  26. void zhouqidisplay();
  27. void Pldisplay();
  28. void Display();
  29. void zongdisp();
  30.         
  31. void Bee()
  32. {
  33.   a=1;b=0;c=1;
  34.      beep=0;
  35. }

  36. void main()
  37. {
  38.     Bee();
  39.         Delay300us();
  40.         Timer0init();
  41.   Timer1init();
  42.                  EA=1;
  43.            TR0=1;
  44.            TR1=1;
  45.    while(1)
  46.          {        
  47.                  if(over_flag)
  48.                                 {
  49.                                   ET0=1;
  50.                             TR0=1;
  51.                             TR1=1;
  52.                            over_flag=0;
  53.                             f=pl1*10;//每1us,f加10
  54.                             pl1=0;
  55.                                 }
  56.                                 Pldisplay();
  57.                         Display();
  58.                         P2=(P2&0x1f)|0xe0;
  59.       P0=0xff;
  60.                         P2=(P2&0x1f)|0xc0;
  61.       P0=0xff;
  62.                 if(K2==0)
  63.                         Delay100ms();
  64.                 if(K2==0)
  65.                 {               
  66.                         while(1)
  67.                         {
  68.                         t=1000000/f;
  69.                         zhouqidisplay();
  70.                         Display();
  71.                         P2=(P2&0x1f)|0xe0;
  72.       P0=0xff;
  73.                         P2=(P2&0x1f)|0xc0;
  74.       P0=0xff;
  75.                                 if(K1==0)
  76.                                         Delay100ms();
  77.                                 if(K1==0)
  78.                                         break;
  79.                         }
  80.                 }
  81.          }
  82. }

  83. void Timer0init()//计数器(16位自动重装初始值)
  84. {
  85.     AUXR = 0x80;
  86.           TMOD=0x04;
  87.            TL0=0xff;
  88.            TH0=0xff;//1us
  89.            ET0=1;
  90.            TR0=1;
  91. }

  92. void Timer1init()//50ms
  93. {
  94.      AUXR &= 0xBF;                //定时器时钟12T模式
  95.                         TMOD &= 0x0F;                //设置定时器模式
  96.                         TL1 = 0x00;                //设置定时初值
  97.                         TH1 = 0x4C;                //设置定时初值
  98.                         TF1 = 0;                //清除TF1标志
  99.                         TR1 = 0;                //定时器1开始计时
  100.                         ET1 = 1;    //打开定时器1中断
  101. }

  102. void Timer0_init() interrupt 1
  103. {
  104.       pl1++;
  105. }
  106. bit t1=0;
  107. void Timer1_init() interrupt 3
  108. {
  109.      if(t1==0)     
  110.         t1=1;
  111.              else
  112.                          {
  113.                                  t1=0;
  114.               ET0=0;
  115.                     TR0=0;
  116.                     TR1=0;
  117.                                  //每100ms重新关闭开启定时器0更新数据
  118.                    over_flag=1;
  119.      }
  120. }
  121. void Display()
  122. {
  123.     unsigned char i;
  124.    for(i=0;i<8;i++)
  125.           {
  126.                         P2=(P2&0x1f)|0xe0;
  127.       P0=0xff;
  128.       P2&=0x1f;
  129.       _nop_();
  130.       P2=(P2&0x1f)|0xc0;
  131.       P0=0x01<<i;
  132.       P2&=0x1f;
  133.                         _nop_();
  134.                         P2=(P2&0x1f)|0xe0;
  135.       P0=disp[i];
  136.       P2&=0x1f;
  137.                         P0=0Xff;
  138.                         Delay300us();
  139.                 }
  140. }
  141. void Delay300us()
  142. {
  143.      unsigned char i,j;
  144.              _nop_();
  145.        _nop_();        
  146.           i=4;
  147.           j=54;
  148.           do
  149.                 {
  150.                    while(--j);
  151.                 } while(--i);
  152. }
  153. void Delay100ms()                //@11.0592MHz
  154. {
  155.         unsigned char i, j, k;

  156.         _nop_();
  157.         _nop_();
  158.         i = 5;
  159.         j = 52;
  160.         k = 195;
  161.         do
  162.         {
  163.                 do
  164.                 {
  165.                         while (--k);
  166.                 } while (--j);
  167.         } while (--i);
  168. }

  169. ……………………

  170. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码




评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏3 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表