找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 5807|回复: 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 单片机教程网

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