找回密码
 立即注册

QQ登录

只需一步,快速开始

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

基于51单片机的正弦波频率测量源程序

[复制链接]
跳转到指定楼层
楼主
ID:344163 发表于 2018-6-3 19:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint  unsigned int

  4. uchar code table[11] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

  5. long uint pulse=0;//计数输入的方波的个数;

  6. long uint freq=0;//频率

  7. uchar temp=0; //临时变量

  8. uchar f;

  9. void delay_1ms(uint i) //延时函数,约1ms
  10. {
  11.         uint x,j;
  12.         for(j=0;j<i;j++)
  13.         for(x=0;x<=148;x++);      
  14. }

  15. void Time0_Init()//定时器和计数器的初始化函数
  16. {
  17.         EA=1; //打开全局中断
  18.         TMOD = 0x15;//设定定时器1和计数器0的工作方式为方式1
  19.                
  20.         TH0  = 0xff;//计数器0的初值
  21.         TL0  = 0xff;//计数器0的初值
  22.         ET0=1; //允许计数器0中断
  23.         TR0=1; //打开计数器0,开始计数

  24.         TH1  = 0x3c;//定时器1的初值
  25.         TL1  = 0xb0;//定时器1的初值
  26.         ET1=1;        //允许定时器1中断
  27.         TR1 = 1;//打开定时器1,开始计数               
  28. }

  29. void main()
  30. {
  31.         Time0_Init(); //初始化定时器和计数器
  32.       
  33.         while(1)
  34.         {
  35.                        
  36.                 P2=0xf7;  //以下为数码管显示函数
  37.                 P0=0x00;
  38.                 P0=table[freq/1000%10];
  39.                 delay_1ms(2);

  40.                 P2=0xfb;
  41.                 P0=0x00;
  42.                 P0=table[freq/100%10];
  43.                 delay_1ms(2);

  44.                 P2=0xfd;
  45.                 P0=0x00;
  46.                 P0=table[freq/10%10];
  47.                 delay_1ms(2);

  48.                 P2=0xfe;
  49.                 P0=0x00;
  50.                 P0=table[freq%10];
  51.                 delay_1ms(1);      
  52.         }
  53. }

  54. void ISQ_timer0(void) interrupt 1 //用来计数脉冲数,每一个方波脉冲,计数器进入中断,脉冲数加一
  55. {
  56.         TR0 = 0;
  57.         pulse++;
  58.         TH0  = 0xff;
  59.         TL0  = 0xff;
  60.         TR0 = 1;
  61. }
  62. /****************************************************************
  63.         用来设定时间,定时器的周期为50ms,当经过20次后,
  64.         也即1s后,关断定时器和计数器,将一秒内计数的脉冲数赋给频率pulse,
  65.         一秒内采集的脉冲数即为输入方波的频率
  66. ****************************************************************/
  67. void ISQ_time1() interrupt 3  
  68. {
  69.         TH1  = 0x3c;
  70.         TL1  = 0xb0;
  71.         temp++;
  72.         if(temp==20)
  73.         {
  74.                 TR0 = 0;
  75.                 TR1 = 0;
  76.                 temp=0;
  77.                 freq=202642400/pulse*100/pulse;
  78.                 pulse=0;//将脉冲数清零,重新计数
  79.                 TR0 = 1;//打开计数器0,进入下一个循环
  80.                 TR1 = 1;//打开定时器1,进入下一个循环                       
  81.         }      
  82. }

复制代码





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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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