找回密码
 立即注册

QQ登录

只需一步,快速开始

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

自己做的简易频率计 单片机源程序

[复制链接]
跳转到指定楼层
楼主
ID:165310 发表于 2017-2-19 11:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
希望高手指点一下!
完整代码下载:
频率计.zip (50.7 KB, 下载次数: 43)

主程序预览:
  1. #include "reg52.h"
  2. #include "lsh.h"                         
  3. #include "intrins.h"

  4. sbit SER   = P3^4;
  5. sbit RCLK1  = P3^5;
  6. sbit SRCLK = P3^6;

  7. uchar code smgduan[17]=
  8. {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  9. 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值

  10. uchar code smgwei[] =           //--- 数码管显示的位选通段代码表 ---
  11. {
  12. 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F,
  13. };

  14. uchar DispData[8];

  15. //--定义全局变量--//
  16. ulong   Freq;        //用来存放要显示的频率值
  17. ulong        TimeCount;   //用于计算1S钟的

  18. void SerialSend(uchar DAT)                             //--- 串并转换函数(595控制数码管显示) ---
  19. {
  20.     uchar i;
  21.         for(i=0;i<8;i++)
  22.         {
  23.                  DAT <<= 1;
  24.                 SER   = CY;
  25.                 SRCLK = 0;
  26.                 _nop_();  
  27.                 _nop_();
  28.                 SRCLK = 1;
  29.         }
  30. }

  31. /*******************************************************************************
  32. * 函 数 名         : DigDisplay
  33. * 函数功能                   : 数码管动态扫描函数,循环扫描8个数码管显示
  34. *******************************************************************************/
  35. void Scan_Disp()
  36. {
  37.         uchar i;
  38.     for(i=0; i<6; i++)
  39.     {  
  40.        RCLK1 = 0;
  41.        SerialSend(DispData[i]);                  //--- 送显示代码到串口引脚 ---
  42.        SerialSend(smgwei[i]);                             //--- 送选通代码到串口引脚 ---
  43.        RCLK1 = 0;
  44.        _nop_();  
  45.        _nop_();
  46.        RCLK1 = 1;                                             //--- 扫描计数变量加1 ---
  47.        Delay(100);
  48.     }
  49. }
  50. /*******************************************
  51. *函数名                :TIMER_Configuration
  52. *功  能         :配置定时/计数器T0和T1
  53. *输         入         :无
  54. *输  出                :无
  55. *******************************************/

  56. void Timer_Init()
  57. {
  58.         //--定时器T1做计数器,工作方式1(16位定时器),只由TRx打开计数器--//
  59.         //--定时器T0做定时器,工作方式1(16位定时器),只由TRx打开定时器--//       
  60.         TMOD=0x51;
  61.     T2MOD = 0x02;//选择为定时器2模式,工作方式1,仅用TR1打开启动。
  62.     RCAP2H = 0xFD;
  63.     RCAP2L = 0xC8;

  64.         //--设置定时器晶振为12MHZ时定时50ms--//
  65.         TH0=0xD8;
  66.         TL0=0xF0;

  67.     TH2 = 0xFD;
  68.         TL2 = 0xC8;   //1us

  69.         //--打开中断-//
  70.         ET0=1;
  71.         ET1=1;
  72.     ET2=1;//打开定时器1中断允许
  73.         EA=1;

  74.         //--打开定时器*/
  75.         TR0=1;
  76.         TR1=1;
  77.         TR2=1;//打开定时器
  78. }

  79. /*******************************************
  80. *函数名                :Disp_Fre
  81. *功  能         :显示所计算的频率值
  82. *输         入         :无
  83. *输  出                :无
  84. *******************************************/
  85. void Disp_Fre()
  86. {
  87.     if(TR1 == 0)         //当计数器停下的时候,表明计数完毕
  88.                 {
  89.                         Freq = Freq + TL1;         //读取TL的值
  90.                         Freq = Freq + (TH1 * 256); //读取TH的值

  91.                         //--求频率的个十百千万十万位--//
  92.                         DispData[0] = smgduan[Freq%1000000/100000];       
  93.                         DispData[1] = smgduan[Freq%100000/10000];       
  94.                         DispData[2] = smgduan[Freq%10000/1000];       
  95.                         DispData[3] = smgduan[Freq%1000/100];       
  96.                         DispData[4] = smgduan[Freq%100/10];       
  97.                         DispData[5] = smgduan[Freq%10];
  98.                        
  99.                         //--显示完,重新计算下一次频率。--//       
  100.                         Freq = 0;//将计算的频率清零
  101.                         TH1 = 0; //将计数器的值清零
  102.                         TL1 = 0;
  103.                         TR0 = 1; //开启定时器
  104.                         TR1 = 1; //开启计数器       
  105.                 }

  106.                 //--显示求得的数值--//
  107.                 Scan_Disp();
  108. }

  109. /*******************************************
  110. *函数名                :Timer0
  111. *功  能         :定时器0的中断函数
  112. *输         入         :无
  113. *输  出                :无
  114. *******************************************/

  115. void Timer0() interrupt 1
  116. {
  117.     Scan_Disp();
  118.         //--12MHZ设置定时50ms的初值--//
  119.         TH0=0xD8;
  120.         TL0=0xF0;
  121.        
  122.         TimeCount++;
  123.         if(TimeCount==100)//计时到1S
  124.         {
  125.                 TR0=0;
  126.                 TR1=0;
  127.                 TimeCount=0;               
  128.         }               
  129. }
  130. /*******************************************
  131. *函数名                :Timer1
  132. *功  能         :计数器1的中断函数
  133. *输         入         :无
  134. *输  出                :无
  135. *******************************************/

  136. void Timer1() interrupt 3
  137. {       
  138.         //--进入一次中断,表明计数到了65536--//
  139.         Freq=Freq+65536;               
  140. }

  141. void Timer2(void) interrupt 5 //3 为定时器1的中断号  1 定时器0的中断号 0 外部中断1 2 外部中断2  4 串口中断
  142. {
  143.     TF2 = 0;
  144.        
  145. }

  146. /*******************************************************************************
  147. * 函 数 名       : main
  148. * 函数功能                 : 主函数
  149. * 输    入       : 无
  150. * 输    出             : 无
  151. *******************************************************************************/
  152. void main()
  153. {       
  154.         Timer_Init();       
  155.         while(1)
  156.         {
  157.             Disp_Fre();       
  158.         }                               
  159. }
复制代码



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

使用道具 举报

沙发
ID:190034 发表于 2017-4-16 10:22 | 只看该作者
下载的附件里没有“LSH.h”的文件,重发一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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