找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机定时器计数器实现的数字频率计Proteus仿真程序设计

[复制链接]
跳转到指定楼层
楼主
基于STC89C52的数字频率计仿真设计,通过片上资源,定时器计数器实现对外部方波的频率计数,平台protues7.1,内含仿真文件源码和protues电路文件,原创分享
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. #include<reg52.h>
  2. #define uchar unsigned char
  3. #define uint        unsigned int

  4. sbit RS = P2^0;
  5. sbit RW = P2^1;
  6. sbit EN = P2^2;
  7. sbit led = P3^6;

  8. uint jici=0,fre=0;
  9. uchar display_num[6];

  10. void delayms(uint z)
  11. {
  12. uint x,y;
  13. for(x=z;x>0;x--)
  14.         for(y=110;y>0;y--);
  15. }

  16. void delay_20us()
  17. {
  18.         uchar a ;
  19.         for(a=0;a<500;a++);
  20. }

  21. int delay(unsigned char xms)
  22. {
  23.     unsigned char i,j;
  24.     for(i=xms;i>0;i--)
  25.         for(j=110;j>0;j--);
  26.     return 0;
  27. }

  28. int write_com(unsigned char com)
  29. {
  30.     RS = 0;
  31.     RW = 0;
  32.     P0 = com;
  33.     delay(5);
  34.     EN = 1;
  35.     delay(5);
  36.     EN = 0;
  37.     return 0;        
  38. }

  39. int write_date(unsigned char date)
  40. {
  41.     RS = 1;
  42.     RW = 0;
  43.     P0 = date;
  44.     delay(5);
  45.     EN = 1;
  46.     delay(5);
  47.     EN = 0;
  48.     return 0;        
  49. }

  50. void LCD1602_Write_String(uchar x,uchar y,uchar *s)
  51. {     
  52.         if (y == 0)
  53.         {     
  54.                 write_com(0x80 + x);   
  55.         }
  56.         else
  57.         {      
  58.                 write_com(0xC0 + x);      
  59.         }        
  60.         while (*s != '\0')
  61.         {     
  62.                 write_date(*s++);
  63.                 delay(150);               
  64.         }
  65. }

  66. int init()//1602初始化
  67. {
  68.     EN = 0;
  69.     write_com(0X38);
  70.     write_com(0X0C);
  71.     write_com(0X06);
  72.     write_com(0X01);
  73.     return 0;
  74. }

  75. int main(void)
  76. {   
  77.         init();          
  78.   TMOD=0x51;//定时器1计数模式 定时器0定时模式 工作方式1
  79.         TH0=(65536-46080)/256;//装定时50ms初值
  80.         TL0=(65536-46080)%256;
  81.         TR0=1; //定时器0模式开启
  82.         ET0=1;// 定时器0中断
  83.         EA=1;//全局中断开启
  84.         TH1=0;
  85.         TL1=0;
  86.         TR1=0;
  87.         LCD1602_Write_String(0,0,"frequence:");
  88.         while(1)
  89.         {
  90.                 display_num[0] = fre / 100 + '0';//分位提取
  91.                 display_num[1] = fre % 100 /10+ '0';
  92.                 display_num[2] = fre % 10+ '0';
  93.                 display_num[3] = 'H';
  94.                 display_num[4] = 'z';
  95.                 display_num[5] = '\0';
  96.                 if(pinlv > 1000)
  97.                         LCD1602_Write_String(0,1,"flow!");//大于1000则超出提示
  98.                 else
  99.                         LCD1602_Write_String(0,1,display_num);//显示频率
  100.         }
  101. }

  102. void timer0() interrupt 1//定时器0溢出中断
  103. {
  104.         jici++;
  105.         TH0=(65536-46080)/256;;
  106.         TL0=(65536-46080)%256;;
  107.         if(jici == 20) //20次为1s
  108.         {
  109.                 TR0=TR1=0;
  110.                 fre=TL1+TH1*256; //提取计数数值  计算为频率
  111.                 TL1=TH1=0;
  112.                 led=~led;
  113.                 jici=0;
  114.                 TR0=TR1=1;
  115.         }
  116. }
复制代码

所有资料51hei提供下载:
51单片机数字频率计仿真设计.rar (425.16 KB, 下载次数: 103)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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