頻率計:
LCD1602顯示
在不增加外部計數硬件的情況下,本試驗軟件可測最高頻率達到460KHz
工作原理:
1S 鐘內對輸入脈沖所計數的次數則為頻率值。
16位二進制加法計數器的最大計數值為 65535。
設置定時器 0 工作在定時方式1,定時1S。
設置定時器 1 工作在計數方式1,對輸入脈沖進行計數,溢出產生中斷。
將定時器 1中斷定義為優先。在中斷處理程序里對中斷次數進行計數。1S到后,將中斷次數和計數器里的計數值取出進行綜合數據處理,處理后的數據送LCD1602顯示。
/********************
程序名:頻率計
功能:雙通道頻率測量,未加分頻的情況下最高測頻值65KHZ
網站:51單片機教程網http://www.zg4o1577.cn
作者:周勇
日期: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++;
}