找回密码
 立即注册

QQ登录

只需一步,快速开始

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

简易频率计单片机代码

[复制链接]
跳转到指定楼层
楼主
ID:185877 发表于 2017-4-3 21:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

  1. #include <AT89X51.H>
  2. //********数码管位代码表(P0口)**********//
  3. unsigned char code dispbit[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0x7f};
  4. //********数码管段代码表(P2口,共阴且高位接a,低位接h笔段)**********//   
  5. unsigned char code dispcode[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
  6. //********8位数据缓冲器**********//                                          
  7. unsigned char dispbuf[8];            
  8. unsigned char temp[8];                  
  9. unsigned char dispcount;                 
  10. unsigned char T0count;
  11. unsigned char timecount;
  12. bit flag;                  
  13. unsigned long x;

  14. //*********初始化模块**********//
  15. void initial(void){
  16. TMOD=0x15;                    
  17. TH0=0;
  18. TL0=0;
  19. TH1=(65536-4000)/256;
  20. TL1=(65536-4000)%256;
  21. TR1=0;
  22. TR0=0;
  23. ET0=1;
  24. ET1=1;
  25. EA=1;
  26. }
  27. //******************************************************//

  28. //*********显示模块**********//
  29. void dataDisplay(){
  30. unsigned char i;   
  31. for(i=0;i<8;i++){
  32. temp[i]=0;
  33. }
  34. i=0;
  35. while(x/10)
  36. {
  37.    temp[i]=x%10;
  38.    x=x/10;
  39.    i++;
  40.     }
  41. temp[i]=x;
  42. for(i=0;i<8;i++){
  43.    dispbuf[i]=temp[i];   
  44.     }   
  45. P2=dispcode[dispbuf[dispcount]];
  46. P0=dispbit[dispcount];
  47. dispcount++;
  48. if(dispcount==8)
  49. {
  50.    dispcount=0;
  51. }
  52. }
  53. //******************************************************//

  54. //*********信号频率测量模块**********//
  55. float frequency(float freq)
  56. {
  57. initial();
  58. TR0=1;TR1=1;
  59. if(timecount==250)
  60. {
  61.    TR0=0;
  62.    freq=T0count*65536+TH0*256+TL0;   
  63.    return(freq);
  64. }   
  65. }
  66. //******************************************************//

  67. //*********信号周期测量模块**********//
  68. float cycle(float count){
  69. initial();
  70. if(P3_4==1){
  71.    TR0=1;TR1=1;
  72.    if(P3_4==0){
  73.     TR0=0;   
  74.     count=1000000/(timecount*4000+TH1*256+TL1-61536);
  75.    }
  76. }        
  77. return(count);
  78. }
  79. //******************************************************//

  80. //*********定时中断服务程序1**********//
  81. void t1(void) interrupt 3 using 0{
  82. //initial();
  83. //TR0=1;
  84. //TR1=1;
  85. TH1=(65536-4000)/256;
  86. TL1=(65536-4000)%256;
  87. timecount++;
  88. }
  89. //******************************************************//

  90. //*********定时中断服务程序2**********//
  91. void t0(void) interrupt 1 using 0{
  92. //initial();
  93. //TR0=1;
  94. //TR1=1;
  95. T0count++;
  96. }
  97. //******************************************************//

  98. //*********主函数**********//
  99. void main(void){
  100. while(1){  
  101.    x=frequency(x);
  102.    if(x<100){
  103.     x=cycle(x);
  104.    }
  105.    dataDisplay();
  106. }
  107. }
  108. //******************************************************//
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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