专注电子技术学习与研究
当前位置:单片机教程网 >> MCU设计实例 >> 浏览文章

PROTUS仿真51单片机测频程序

作者:佚名   来源:本站原创   点击数:  更新时间:2013年01月01日   【字体:

频率计:
LCD1602显示
在不增加外部计数硬件的情况下,本试验软件可测最高频率达到460KHz

工作原理:

1S 钟内对输入脉冲所计数的次数则为频率值。
16位二进制加法计数器的最大计数值为 65535。

设置定时器 0 工作在定时方式1,定时1S。
设置定时器 1 工作在计数方式1,对输入脉冲进行计数,溢出产生中断。
将定时器 1中断定义为优先。在中断处理程序里对中断次数进行计数。1S到后,将中断次数和计数器里的计数值取出进行综合数据处理,处理后的数据送LCD1602显示。

/********************
程序名:频率计
功能:双通道频率测量,未加分频的情况下最高测频值65KHZ
网站:51单片机教程网http://www.51hei.com
作者:周勇
日期:2010年4月10日
*********************/
#include<reg52.h>
sbit led=P1^7;
sbit rs=P3^7;//rs=P2^5;
sbit e=P3^6;//e=P2^7;
sbit shift=P1^7;
#define uchar unsigned char
#define uint unsigned int
uint time,aa;
uint num,ff;
uchar qian,bai,shi,ge;
void delay_ms(uint z)
{
 uint x,y;
 for(x=z;x>0;x--)
  for(y=100;y>0;y--);
}
void writecom(uchar com)//写命令
{
   rs=0;
  // rw=0;
   P2=com;
   delay_ms(5);
   e=1;
   delay_ms(5);
   e=0;
}
void writedate(uchar date)//写数据
{
   rs=1;
   //rw=0;
   P2=date;
   delay_ms(5);
   e=1;
   delay_ms(5);
   e=0;
}
void lcd_init()
{
 
    P2=0xff;
  led=1;
    writecom(1);//清除显示
    delay_ms(20);
 writecom(0x38);//设置液晶为16*2矩阵,5*7点阵,8位数据接口(写命令)
    delay_ms(20);
    writecom(0x0E);//设置液晶开显示,显示光标,光标闪烁(写命令)
    delay_ms(20);
    writecom(0x06);//设置地址自动向右加1(写命令)
    delay_ms(20);
    writecom(0x80);//光标指针位置初始化(写命令)
    delay_ms(20);
 
}
void lcd_1602xy(uchar x,uchar y,uchar date)//X值为行,Y为列,DATE为数据
{
    uchar i,j;
 i=x;j=y;
 if(i==1)
 {
  writecom(0x80+j);
  delay_ms(1);
  writedate(date);
  delay_ms(1);
 }
 if(i==2)
 {
  writecom(0x80+0x40+j);
  delay_ms(1);
  writedate(date);
  delay_ms(1);
 }
}

void main()
{
 lcd_init();
 EA=1;
 PT1=1;
 time=0;
 TMOD=0X51;
 TH0=(65535-20000)/256;
 TL0=(65535-20000)%256;

 TH1=0;
    TL1=0;
 while(1)
 {
      shift=0;
      TH0=(65535-20000)/256;
   TL0=(65535-20000)%256;
      ET0=1;
      TR0=1;
      TH1=0;
      TL1=0;
      TR1=1;
      while(time!=25);
        ET0=0;
        TR0=0;
        TR1=0;
    time=0;
     num=(TH1*256+TL1)*2;
  TH1=0;
  TL1=0;
     qian=num%10000/1000;
  bai=num%1000/100;
     shi=num%100/10;
   ge=num%10;
 
   lcd_1602xy(1,0,qian+0x30);
      lcd_1602xy(1,1,bai+0x30);
      lcd_1602xy(1,2,shi+0x30);
      lcd_1602xy(1,3,ge+0x30);
   lcd_1602xy(1,4,'H');
   lcd_1602xy(1,5,'Z');
    
      shift=1;
      TH0=(65535-20000)/256;
   TL0=(65535-20000)%256;
      ET0=1;
   TR0=1;
      TH1=0;
      TL1=0;
      TR1=1;
    
      while(time!=25);
        ET0=0;
        TR0=0;
        TR1=0;
    time=0;
     num=(TH1*256+TL1)*2;
  TH1=0;
  TL1=0;
     qian=num%10000/1000;
  bai=num%1000/100;
     shi=num%100/10;
   ge=num%10;

      lcd_1602xy(2,0,qian+0x30);
      lcd_1602xy(2,1,bai+0x30);
      lcd_1602xy(2,2,shi+0x30);
      lcd_1602xy(2,3,ge+0x30);
   lcd_1602xy(2,4,'H');
   lcd_1602xy(2,5,'Z');
    
    
    }
 }
void time0() interrupt 1
{
 TH0=(65535-20000)/256;
 TL0=(65535-20000)%256;
 time++;
}

PTOTEUS仿真结果如下:

 

关闭窗口

相关文章