微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 嵌入式设计 > PROTUS仿真51单片机测频程序

PROTUS仿真51单片机测频程序

时间:11-30 来源:互联网 点击:
频率计:

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

工作原理:

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

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

/********************
程序名:频率计
功能:双通道频率测量,未加分频的情况下最高测频值65KHZ
网站:51单片机教程网http://www.51hei.com
作者:周勇
日期:2010年4月10日
*********************/
#include
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仿真结果如下:

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top