1024手机基地看电影,午夜福利视频导航,国产精品福利在线一区,亚洲欧美日韩另类成人,在线观看午夜日本理论片,成年超爽免费网站,国产精品成人免费,精品动作一级毛片,成人免费观看网站,97精品伊人久久大香蕉

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3113|回復: 2
打印 上一主題 下一主題
收起左側(cè)

51單片機數(shù)字頻率計

[復制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:349419 發(fā)表于 2018-6-19 16:29 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式

  1. #include"reg52.h"
  2. #define ucharunsigned char
  3. #define uintunsigned int
  4. sbit lcdrs=P1^0;                                     //液晶數(shù)據(jù)命令選擇端
  5. sbit lcden=P1^1;                                     //液晶使能端
  6. sbit A0=P2^3;                                        //8選1(A0~A2)接口
  7. sbit A1=P2^4;
  8. sbit A2=P2^5;
  9. void delay();
  10. void write_com();
  11. void write_date();
  12. void init();
  13. void display();
  14. void fenpin();
  15. uchartable[]={"frequence:"};
  16. uint f,K;
  17. uchar num1,count;
  18. ucharbw,sw,w,q,b,s,g;
  19. void delay(uint z)
  20. {
  21.        uint i,j;
  22.        for(i=z;i>0;i--)
  23.               for(j=110;j>0;j--);
  24. }
  25. voidwrite_com(uchar com)
  26. {     
  27.        lcdrs=0;                                           //選擇寫命令模式
  28.        P0=com;                                          //將要寫的命令字送到數(shù)據(jù)總線上
  29.        delay(5);                                          //稍微延時以待數(shù)據(jù)穩(wěn)定
  30.        lcden=1;                                          //使能端給一高脈沖
  31.        delay(5);                                          //稍微延時
  32.        lcden=0;                                          //將使能端置0以完成高脈沖
  33. }
  34. void write_date(uchardate)
  35. {
  36.        lcdrs=1;
  37.        P0=date;
  38.        delay(5);
  39.        lcden=1;
  40.        delay(5);
  41.        lcden=0;
  42. }
  43. void init()
  44. {     
  45.        uchar num;
  46.        lcden=0;
  47.        write_com(0x38);                           //設(shè)置16×2顯示,5×7點陣,8位數(shù)據(jù)接口
  48.        write_com(0x0c);              //設(shè)置開顯示,不顯示光標
  49.        write_com(0x06);                           //寫一個字符后地址指針加1
  50.        write_com(0x01);                           //顯示清0,數(shù)據(jù)指針清0
  51.        write_com(0x80);                           //設(shè)置顯示初始坐標
  52.        for(num=0;num<10;num++)             //顯示frequency
  53.        {
  54.               write_date(table[num]);
  55.               delay(5);
  56.        }
  57.        write_com(0x80+0x40+3);             //寫出頻率f
  58.        write_date('f');
  59.        delay(5);
  60.        write_com(0x80+0x40+4);             //寫出頻率=
  61.        write_date('=');
  62.        delay(5);
  63.        write_com(0x80+0x40+12);        //寫出頻率單位Hz
  64.        write_date('H');
  65.        delay(5);
  66.        write_com(0x80+0x40+13);
  67.        write_date('z');
  68.        delay(5);
  69.        TMOD=0X15;                                 //設(shè)置定時器0和1工作方式1
  70.        TH1=(65536-45872)/256;                     //對TH0 TL0賦值
  71.        TL1=(65536-45872)%256;             //使定時器50ms中斷一次
  72.        TH0=0;
  73.        TL0=0;
  74.        EA=1;                                              //開總中斷
  75.        TR0=1;                                            //啟動定時器0 開始計時
  76.        TR1=1;                                            //啟動計數(shù)器1
  77.        PT0=1;                                            //計數(shù)優(yōu)先
  78.        ET0=1;                                            //開定時器0中斷
  79.        ET1=1;                                            //開定時器1中斷
  80. }                                                            
  81. void display()
  82. {     
  83.        bw=f/1000000;
  84.        sw=f%1000000/1000000;
  85.        w=f%1000000%100000/10000;
  86.        q=f%1000000%100000%10000/1000;
  87.        b=f%1000000%100000%10000%1000/100;
  88.        s=f%1000000%100000%10000%1000%100/10;
  89.        g=f%1000000%100000%10000%1000%100%10;
  90.        write_com(0x80+0x40+5);
  91.        write_date(0x30+bw);
  92.        delay(5);
  93.        write_com(0x80+0x40+6);
  94.        write_date(0x30+sw);
  95.        delay(5);
  96.        write_com(0x80+0x40+7);
  97.        write_date(0x30+w);
  98.        delay(5);
  99.        write_com(0x80+0x40+8);
  100.        write_date(0x30+q);
  101.        delay(5);
  102.        write_com(0x80+0x40+9);
  103.        write_date(0x30+b);
  104.        delay(5);
  105.        write_com(0x80+0x40+10);
  106.        write_date(0x30+s);
  107.       delay(5);
  108.        write_com(0x80+0x40+11);
  109.        write_date(0x30+g);
  110.        delay(5);
  111. }
  112. void fenpin()
  113. {
  114.        if(f>5000000)
  115.        {
  116.               A0=0;
  117.               A1=0;
  118.               A2=0;
  119.               K=10;
  120.               f=K*f;           
  121.        }
  122.        else
  123.        {
  124.               A0=0;
  125.               A1=0;
  126.               A2=1;
  127.               K=1;
  128.               f=K*f;
  129.        }
  130. }
  131. void main()
  132. {     
  133.        init();
  134.        while(1)
  135.        {     
  136.               fenpin();
  137.               display();
  138.        }     
  139. }
  140. void T0_time()interrupt 1                     
  141. {
  142.        count++;      
  143. }
  144. void T1_time()interrupt 3
  145. {
  146.        TH1=(65536-45872)/256;                     //對TH0 TL0賦值
  147.        TL1=(65536-45872)%256;             //重裝計數(shù)初值
  148.        num1++;                                          //每過50ms numt加1
  149.        if(num1==20)                                  //如果到了20次,說明1秒時間到
  150.        {
  151.               num1=0;                            //清0
  152.               f=count*65536+(TH0*256+TL0);
  153.               TH0=0;
  154.               TL0=0;
  155.               count=0;
  156.        }
  157.        TR1=1;
  158. }
  159. 3.2軟件各模塊設(shè)計
  160. 3.2.1顯示模塊:
  161.        void display()
  162. {     
  163.        bw=f/1000000;
  164.        sw=f%1000000/1000000;
  165.        w=f%1000000%100000/10000;
  166.        q=f%1000000%100000%10000/1000;
  167.        b=f%1000000%100000%10000%1000/100;
  168.        s=f%1000000%100000%10000%1000%100/10;
  169.        g=f%1000000%100000%10000%1000%100%10;
  170.        write_com(0x80+0x40+5);
  171.        write_date(0x30+bw);
  172.        delay(5);
  173.        write_com(0x80+0x40+6);
  174.        write_date(0x30+sw);
  175.        delay(5);
  176.        write_com(0x80+0x40+7);
  177.        write_date(0x30+w);
  178.        delay(5);
  179.        write_com(0x80+0x40+8);
  180.        write_date(0x30+q);
  181.        delay(5);
  182.        write_com(0x80+0x40+9);
  183.        write_date(0x30+b);
  184.        delay(5);
  185.        write_com(0x80+0x40+10);
  186.        write_date(0x30+s);
  187.       delay(5);
  188.        write_com(0x80+0x40+11);
  189.        write_date(0x30+g);
  190.        delay(5);
  191. }
  192. 3.2.2定時和計數(shù)模塊:
  193. void T0_time()interrupt 1                     
  194. {
  195.        count++;      
  196. }
  197. void T1_time()interrupt 3
  198. {
  199.        TH1=(65536-45872)/256;                            //對TH0 TL0賦值
  200.        TL1=(65536-45872)%256;                    //重裝計數(shù)初值
  201.        num1++;                                                 //每過50ms numt加1
  202.        if(num1==20)                                    //如果到了20次,說明1秒時間到
  203.        {
  204.               num1=0;                                   //清0
  205.               f=count*65536+(TH0*256+TL0);
  206.               TH0=0;
  207.               TL0=0;
  208.               count=0
  209.        }
  210.        TR1=1;
  211. }
  212. 其中T0計數(shù),T1定時。
  213. 3.2.3延時模塊:
  214.        void delay(uint z)
  215. {
  216.        uint i,j;
  217.        for(i=z;i>0;i--)
  218.               for(j=110;j>0;j--);
  219. }
  220. 3.2.4液晶1602初始化模塊:
  221.        void write_com(uchar com)
  222. {
  223.        lcdrs=0;                                           //選擇寫命令模式
  224.        P0=com;                                          //將要寫的命令字送到數(shù)據(jù)總線上
  225.        delay(5);                                          //稍微延時以待數(shù)據(jù)穩(wěn)定
  226.        lcden=1;                                          //使能端給一高脈沖
  227.        delay(5);                                          //稍微延時
  228.        lcden=0;                                          //將使能端置0以完成高脈沖
  229. }
  230. voidwrite_date(uchar date)
  231. {
  232.        lcdrs=1;
  233.        P0=date;
  234.        delay(5);
  235.        lcden=1;
  236.        delay(5);
  237.        lcden=0;
  238. }
  239. void init()
  240. {     
  241.        uchar num;
  242.        lcden=0;
  243.        write_com(0x38);                    //設(shè)置16×2顯示,5×7點陣,8位數(shù)據(jù)接口
  244.        write_com(0x0c);          //設(shè)置開顯示,不顯示光標
  245.        write_com(0x06);                    //寫一個字符后地址指針加1
  246.        write_com(0x01);                    //顯示清0,數(shù)據(jù)指針清0
  247.        write_com(0x80);                    //設(shè)置顯示初始坐標
  248.        for(num=0;num<10;num++)      //顯示frequency
  249.        {
  250.               write_date(table[num]);
  251.               delay(5);
  252.        }
  253.        write_com(0x80+0x40+3);             //寫出頻率f
  254.        write_date('f');
  255.        delay(5);
  256.        write_com(0x80+0x40+4);             //寫出頻率=
  257.        write_date('=');
  258.        delay(5);
  259.        write_com(0x80+0x40+12);        //寫出頻率單位Hz
  260.        write_date('H');
  261.        delay(5);
  262.        write_com(0x80+0x40+13);
  263.        write_date('z');
  264.        delay(5);
  265. }
  266. 3.2.5分頻模塊:
  267.        void fenpin()
  268. {
  269.        if(f>5000000)
  270.        {     A0=0;
  271.               A1=0;
  272.               A2=0;
  273.               K=10;
  274.               f=K*f;           
  275.        }
  276.        else
  277.        {     A0=0;
  278.               A1=0;
  279.               A2=1;
  280.               K=1;
  281.               f=K*f;
  282.        }
  283. }
  284. 3.2.6主函數(shù)模塊:
  285.        void main()
  286. {     init();
  287.        TMOD=0X15;                                 //設(shè)置定時器0和1工作方式1
  288.        TH1=(65536-45872)/256;                     //對TH0 TL0賦值
  289.        TL1=(65536-45872)%256;             //使定時器50ms中斷一次
  290.        TH0=0;
  291.        TL0=0;
  292.        EA=1;                                              //開總中斷
  293.        TR0=1;                                            //啟動定時器0 開始計時
  294.        TR1=1;                                            //啟動計數(shù)器1
  295.        PT0=1;                                            //計數(shù)優(yōu)先
  296.        ET0=1;                                            //開定時器0中斷
  297.        ET1=1;                                            //開定時器1中斷
  298.        while(1)
  299.        {     fenpin();
  300.               display();
  301.        }     
  302. }
復制代碼


評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

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

使用道具 舉報

沙發(fā)
ID:313328 發(fā)表于 2018-6-19 17:37 | 只看該作者
很好用,漂亮
回復

使用道具 舉報

板凳
ID:350556 發(fā)表于 2019-3-23 10:08 | 只看該作者
思路不錯,可以借鑒一下
回復

使用道具 舉報

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

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表