找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机数字频率计

[复制链接]
跳转到指定楼层
楼主

  1. #include"reg52.h"
  2. #define ucharunsigned char
  3. #define uintunsigned int
  4. sbit lcdrs=P1^0;                                     //液晶数据命令选择端
  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;                                          //将要写的命令字送到数据总线上
  29.        delay(5);                                          //稍微延时以待数据稳定
  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);                           //设置16×2显示,5×7点阵,8位数据接口
  48.        write_com(0x0c);              //设置开显示,不显示光标
  49.        write_com(0x06);                           //写一个字符后地址指针加1
  50.        write_com(0x01);                           //显示清0,数据指针清0
  51.        write_com(0x80);                           //设置显示初始坐标
  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;                                 //设置定时器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;                                            //启动计数器1
  77.        PT0=1;                                            //计数优先
  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;             //重装计数初值
  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软件各模块设计
  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定时和计数模块:
  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;                    //重装计数初值
  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计数,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;                                          //将要写的命令字送到数据总线上
  225.        delay(5);                                          //稍微延时以待数据稳定
  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);                    //设置16×2显示,5×7点阵,8位数据接口
  244.        write_com(0x0c);          //设置开显示,不显示光标
  245.        write_com(0x06);                    //写一个字符后地址指针加1
  246.        write_com(0x01);                    //显示清0,数据指针清0
  247.        write_com(0x80);                    //设置显示初始坐标
  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主函数模块:
  285.        void main()
  286. {     init();
  287.        TMOD=0X15;                                 //设置定时器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;                                            //启动计数器1
  295.        PT0=1;                                            //计数优先
  296.        ET0=1;                                            //开定时器0中断
  297.        ET1=1;                                            //开定时器1中断
  298.        while(1)
  299.        {     fenpin();
  300.               display();
  301.        }     
  302. }
复制代码


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

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

使用道具 举报

沙发
ID:313328 发表于 2018-6-19 17:37 | 只看该作者
很好用,漂亮
回复

使用道具 举报

板凳
ID:350556 发表于 2019-3-23 10:08 | 只看该作者
思路不错,可以借鉴一下
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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