久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6684|回復: 12
打印 上一主題 下一主題
收起左側

單片機簡易頻率計的設計 含仿真和程序

  [復制鏈接]
跳轉到指定樓層
樓主
簡易頻率計的仿真圖:


頻率計51單片機程序:
  1. #include <reg52.h>
  2. # define uchar unsigned char
  3. # define uint unsigned int
  4. # define ulong unsigned long


  5. sbit LCD_RS=P1^0;                                
  6. sbit LCD_RW=P1^1;                                
  7. sbit LCD_EN=P1^2;                                                                        

  8. sbit Q0=P2^0;                                   //計數器0位
  9. sbit Q1=P2^1;                                   //計數器1位
  10. sbit Q2=P2^2;                                   //計數器2位
  11. sbit Q3=P2^3;                                   //計數器3位
  12. sbit Q4=P2^4;                                   //計數器4位
  13. sbit Q5=P2^5;                                   //計數器5位
  14. sbit Q6=P2^6;                                   //計數器6位
  15. sbit Q7=P2^7;                                   //計數器7位
  16. sbit kaishi=P3^0;                           //頻率計數的邏輯開關
  17. sbit qingling=P3^1;                      //計數器清零信號端
  18. sbit s0=P1^3;                                   //待機功能鍵
  19. sbit s1=P1^4;                                   //測頻率功能鍵
  20. sbit s2=P1^5;                                   //測周期功能鍵
  21. sbit s3=P1^6;                                   //測占空比功能鍵
  22. sbit led1=P3^2;                           //功能指示燈
  23. sbit led2=P3^4;
  24. sbit led3=P3^6;
  25. sbit t1in=P3^3;                           //測占空比信號的輸入引腳
  26. sbit lcden=P3^5;


  27. //uchar code table1[]={"   Welcome    "};
  28. uchar i,table[10],q0,q1,q2,q3,q4,q5,q6,q7,table2[9],
  29. table1[]={"welcome"},dis[5],T0num,T1num,th1,tl1;
  30. uint num,bizhi;
  31. ulong pinglv,time1,time0;
  32. bit zq=0;                                   //頻率周期標志位
  33. void delay(uint time)                        
  34. {
  35.         uint i,j;
  36.         for(i=time;i>0;i--)               
  37.         for(j=110;j>0;j--);
  38. }


  39. void write_com(uchar com)                    
  40. {

  41.         LCD_RS=0;                           
  42.         LCD_RW=0;                                                
  43.         P0=com;                                
  44.         delay(2);                                    
  45.         LCD_EN=1;                  
  46.         delay(2);                                    
  47.         LCD_EN=0;                                
  48. }

  49. void write_date(uchar date)
  50. {

  51.         LCD_RS=1;                           
  52.         LCD_RW=0;                                         
  53.         P0=date;                 
  54.         delay(2);                                    
  55.         LCD_EN=1;                           
  56.         delay(2);                                             
  57.         LCD_EN=0;                                 
  58. }

  59. void LCD_init()                     
  60. {
  61.         write_com(0x38);            
  62.         write_com(0x0c);                    
  63.         write_com(0x01);            
  64. }
  65.         


  66. void key()                                   //按鍵掃描程序
  67. {
  68.         if(s0==0)                                   //檢測到待機功能鍵按下
  69.         {
  70.                 delay(5);
  71.                 if(s0==0)
  72.                 {
  73.                         while(!s0);
  74.                         LCD_init();
  75.                         write_com(0x80);                  //液晶顯示"welcome"
  76.                         for(i=0;i<8;i++)
  77.                         {
  78.                                 write_date(table1[i]);
  79.                         }
  80.                         while(1)
  81.                         {
  82.                                 if((s1==0)|(s2==0)|(s3==0))          //如果有別的鍵按下,退出該功能
  83.                                 break;
  84.                         }
  85.                 }
  86.         }
  87.         if(s1==0)                                         //頻率功能鍵按下
  88.         {
  89.                 delay(5);
  90.                 if(s1==0)
  91.                 {
  92.                         while(!s1);                                         
  93.                         led1=0;                                         //頻率指示燈亮,其余燈滅
  94.                         led2=1;
  95.                         led3=1;
  96.                         zq=0;                                         //處于測量頻率功能
  97.                         LCD_init();
  98.                         qingling=0;
  99.                         TMOD=0x51;                                //定義T0工作計時模式,T1工作于計數模式
  100.                         TH0=(65536-50000)/256;         //給T0裝初值,定時5毫秒中斷
  101.                         TL0=(65536-50000)%256;
  102.                         TH1=0;                                        //給T1裝初值        
  103.                         TL1=0;
  104.                         ET0=1;                                        //開T0中斷
  105.                         ET1=0;                                        //關閉T1中斷
  106.                         TR0=1;                                                //T0開始計時
  107.                         TR1=1;                                           //T1開始計數
  108.                         while(1)
  109.                         {                                                  //檢測到有別的鍵按下,退出該功能
  110.                                 if((s0==0)|(s2==0)|(s3==0))         
  111.                                 break;
  112.                         }
  113.                 }
  114.         }
  115.         if(s2==0)                                 //周期功能鍵按下
  116.         {
  117.                 delay(5);
  118.                 if(s2==0)
  119.                 {
  120.                         while(!s2);
  121.                         led2=0;                                   //周期指示燈亮,其余滅
  122.                         led1=1;
  123.                         led3=1;
  124.                         zq=1;                                  //處于周期測量功能
  125.                         LCD_init();
  126.                         qingling=0;
  127.                         TMOD=0x51;                          //定義T0工作計時模式,T1工作于計數模式
  128.                         TH0=(65536-50000)/256;        //給T0裝初值,定時5毫秒中斷
  129.                         TL0=(65536-50000)%256;
  130.                         TH1=0;                                        //給T1裝初值        
  131.                         TL1=0;
  132.                         ET0=1;                                        //開T0中斷
  133.                         ET1=0;                                        //關T1中斷
  134.                         TR0=1;                                        //T0開始計時        
  135.                         TR1=1;                                        //T1開始計數
  136.                         while(1)
  137.                         {                                        //如果有別的鍵按下,退出該功能
  138.                                 if((s0==0)|(s1==0)|(s3==0))
  139.                                 break;
  140.                         }
  141.                 }
  142.         }
  143.         if(s3==0)                   //占空比功能鍵按下
  144.         {
  145.                 delay(5);
  146.                 if(s3==0);
  147.                 {
  148.                         while(!s3);
  149.                         led3=0;                         //占空比指示燈亮,其余滅
  150.                         led1=1;
  151.                         led2=1;
  152.                         TMOD=0x10;                //T0不工作,T1為定時器模式
  153.                         ET0=0;                        //T0中斷關閉
  154.                         ET1=1;                        //打開T1中斷
  155.                         TH1=0;                        //給T1裝初值
  156.                         TL1=0;
  157.                         LCD_init();                   //液晶清屏
  158.                         while(1)
  159.                         {
  160.                                 while(!t1in);         //確認輸入信號處于低電平

  161.                         //        while(t1in);         //檢測到高電平
  162.                                 TR1=1;                         //開始計時          '


  163.                                 while(!t1in);         //高電平變低電平
  164.                                 tl1=TL1;                 //讀取T1的值
  165.                                 th1=TH1;
  166.                                 T1num=T0num;
  167.                     //while(t1in);         //再次檢測到高電平
  168.                                 TR1=0;                          //停止計時
  169.                                 time0=T0num*65536+TH1*256+TL1;        //一個周期的時間
  170.                                 time1=T1num*65536+th1*256+tl1;        //高電平的時間
  171.                                 bizhi=time1*1000/time0;                        //計算占空比
  172.                                 dis[0]=bizhi/100+0x30;                        //數據處理
  173.                                 dis[1]=bizhi%100/10+0x30;
  174.                                 dis[2]=0x2e;
  175.                                 dis[3]=bizhi%10+0x30;
  176.                                 dis[4]=0x25;
  177.                                 write_com(0x80);
  178.                                 for(i=0;i<5;i++)                           //數據顯示
  179.                                 {
  180.                                         write_date(dis[i]);
  181.                                 }
  182.                                 delay(5);                                         //延時
  183.                                 T1num=0;
  184.                                 th1=0;
  185.                                 tl1=0;
  186.                                 T0num=0;
  187.                                 TH1=0;
  188.                                 TL1=0;
  189.                                 if((s0==0)|(s1==0)|(s2==0))
  190.                                 break;                          //如果檢測到有別的鍵按下,退出該功能
  191.                         }
  192.                 }
  193.         }
  194. }


  195.   void main()
  196. {
  197.         int i ;        
  198.         LCD_RW=0;                        
  199.         LCD_init();                                 
  200.         write_com(0x80);
  201.         for(i=0;i<14;i++)                                
  202.         {
  203.                 write_date(table1[i]);                 
  204.                 delay(2);                                       
  205.         }                                
  206.         //write_com(0x01);        
  207.           EA=1;                                
  208.     while(1)
  209.           {
  210.                   key();                           //按鍵掃描
  211.            }//(0xff!=key)         
  212. }//main



  213. void T0_time()interrupt 1         //定時器T0中斷函數
  214. {
  215.         TH0=(65536-50000)/256;         //裝初值
  216.         TL0=(65536-50000)%256;
  217.     num++;
  218.         if(num==20)                                  //一秒時間到
  219.         {
  220.                 TR1=0;                                         //停止計數
  221.                 kaishi=0;                                //計數停止
  222.                 TR0=0;                                        //停止計時
  223.                 q0=Q0;                                   //讀取計數器的值
  224.                 q1=Q1;
  225.                 q2=Q2;
  226.                 q3=Q3;
  227.                 q4=Q4;
  228.                 q5=Q5;
  229.                 q6=Q6;
  230.                 q7=Q7;
  231.                 pinglv=TH1*65536+TL1*256+q7*128+q6         //計算頻率
  232.                 *64+q5*32+q4*16+q3*8+q2*4+q1*2+q0;
  233.                 if(zq==0)                                   //如果處于頻率測量
  234.                 {                                                   //頻率數據處理
  235.                         table[0]=pinglv/10000000;
  236.                         table[1]=pinglv%10000000/1000000;
  237.                         table[2]=pinglv%1000000/100000;
  238.                         table[3]=pinglv%100000/10000;
  239.                         table[4]=pinglv%10000/1000;
  240.                         table[5]=pinglv%1000/100;
  241.                         table[6]=pinglv%100/10;
  242.                         table[7]=pinglv%10;
  243.                         table[8]='H';
  244.                         table[9]='z';
  245.                         write_com(0x80);
  246.                         for(i=0;i<8;i++)                //顯示頻率
  247.                         {
  248.                                 write_date(table[i]+0x30);
  249.                         }
  250.                         write_date(table[8]);
  251.                         write_date(table[9]);
  252.                 }
  253.                 if(zq==1)                   //處于周期測量
  254.                 {
  255.                         if(pinglv<=1000)  //頻率小于等于1000
  256.                         {                                  //周期數據處理
  257.                                 table2[0]=10000/pinglv/10000+0x30;
  258.                                 table2[1]=10000/pinglv%10000/1000+0x30;
  259.                                 table2[2]=10000/pinglv%1000/100+0x30;
  260.                                 table2[3]=10000/pinglv%100/10+0x30;
  261.                                 table2[4]=0x2e;
  262.                                 table2[5]=10000/pinglv%10+0x30;
  263.                                 table2[6]=100000/pinglv%10+0x30;
  264.                                 table2[7]=0x6d;
  265.                                 table2[8]=0x73;
  266.                         }
  267.                         if(pinglv>1000)          //頻率大于1000
  268.                         {                                  //周期數據處理
  269.                                 table2[0]=0+0x30;
  270.                                 table2[1]=10000000/pinglv/1000+0x30;
  271.                                 table2[2]=10000000/pinglv%1000/100+0x30;
  272.                                 table2[3]=10000000/pinglv%100/10+0x30;
  273.                                 table2[4]=0x2e;
  274.                                 table2[5]=10000000/pinglv%10+0x30;
  275.                                 table2[6]=100000000/pinglv%10+0x30;
  276.                                 table2[7]=0x75;
  277.                                 table2[8]=0x73;
  278.                         }
  279.                         write_com(0x80);        //顯示周期
  280.                         for(i=0;i<9;i++)
  281.                         write_date(table2[i]);
  282.                 }
  283.                 delay(10);
  284.                 TH1=0;                   //給T1裝初值
  285.                 TL1=0;
  286.                 TH0=(65536-50000)/256;          //給T0裝初值
  287.                 TL0=(65536-50000)%256;
  288.                 num=0;
  289.                 qingling=1;                  //計數器清零
  290.                 delay(10);
  291.                 qingling=0;
  292.                 kaishi=1;                //再次開始測量
  293.                 TR0=1;                        //T0開始計時
  294.                 TR1=1;                   //T1開始計數
  295.         }
  296. }

  297. void T1_time()interrupt 3 //定時器T1中斷函數
  298. {
  299.         T0num++;
  300. }
復制代碼



綜合設計111.rar

500.89 KB, 下載次數: 128, 下載積分: 黑幣 -5

簡易頻率計

評分

參與人數 2黑幣 +62 收起 理由
YJGG + 12 共享資料的黑幣獎勵!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂1 踩
回復

使用道具 舉報

沙發
ID:127384 發表于 2016-6-20 13:33 | 只看該作者
哈哈,好親切呀!
回復

使用道具 舉報

板凳
ID:122553 發表于 2016-6-21 18:38 | 只看該作者
不好用啊 ,樓主,不明白,求告知!!!!
回復

使用道具 舉報

地板
ID:128098 發表于 2016-6-25 18:46 | 只看該作者
看不大懂,但是覺得樓主很厲害
回復

使用道具 舉報

5#
ID:128560 發表于 2016-7-2 15:38 | 只看該作者
學習收藏了,謝謝!
回復

使用道具 舉報

6#
ID:129530 發表于 2016-7-13 15:10 | 只看該作者
看看
回復

使用道具 舉報

7#
ID:191719 發表于 2017-4-20 17:31 | 只看該作者
這個資源好
回復

使用道具 舉報

8#
ID:325983 發表于 2018-5-15 13:01 | 只看該作者
為什么仿真出來頻率變不了
回復

使用道具 舉報

9#
ID:442697 發表于 2018-12-9 16:05 | 只看該作者
很不錯啊
回復

使用道具 舉報

10#
ID:324142 發表于 2018-12-10 11:23 | 只看該作者
很實用的51頻率計
回復

使用道具 舉報

11#
ID:445285 發表于 2018-12-12 23:10 | 只看該作者
收藏了慢慢看
回復

使用道具 舉報

12#
ID:505439 發表于 2019-4-25 20:39 | 只看該作者
收藏  收藏
回復

使用道具 舉報

13#
ID:9474 發表于 2019-4-25 21:23 | 只看該作者
寫的非常的詳細,值得研究
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 99国产精品久久久久老师 | www.中文字幕 | 丁香综合 | 日韩一区欧美一区 | 国产成人精品av | 在线不卡 | 天天色天天色 | 成人在线观看免费 | 台湾佬成人网 | 国产91丝袜在线18 | 久久se精品一区精品二区 | 婷婷在线网站 | 久久国产亚洲 | 黄色在线观看网站 | 免费在线一区二区三区 | 久久爆操 | 国产一区二区三区网站 | 色网站在线 | 亚洲一区二区三区高清 | 日韩一二三| 国产精品美女久久久久久不卡 | 国外成人免费视频 | 亚洲视频一区在线播放 | 超碰人人91 | 91久久 | 久久久久久一区 | 亚洲一区二区国产 | 国产精品视频一区二区三区不卡 | 正在播放一区二区 | 羞羞的视频免费在线观看 | 久久精品国产久精国产 | 亚洲国产一区二区在线 | 国产精品片| 久久精品免费观看 | 欧美精品一区在线 | 久久国产传媒 | 人人鲁人人莫人人爱精品 | 国产中文视频 | 精品国产一区二区三区性色av | 日本一区二区视频 | 99一级毛片 |