#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sfr P1ASF = 0X9D; //P1口选择功能寄存器
sfr ADC_CONTR= 0XBC; //ADC控制寄存器
sfr ADC_RES = 0XBD; //ADC转换结果寄存器高sfr ADC_RESL = 0XBE; //ADC转换结果寄存器低sbit rs=P1^0;
sbit en=P1^1;
float result,max,v=5.00,result1,result2;
unsigned long q=0,fre;
uchar r[10],sta,p=0,i;
/*延时函数*/
void delay(uint z)
{
uint x,y;
for (x=0;x<z;x++)
for (y=0;y<140;y++);
}
void write_data(uchar shuju)
{
//rw=0;
rs=1;
P0=shuju;
delay(5);
en=1;
delay(5);
en=0;
}
void write_fre(unsigned long pin) //写入频率函数{
uchar ge ,shi,bai,qian,wan,shiwan;
ge=pin%10/1;
shi=pin%100/10;
bai=pin%1000/100;
qian=pin%10000/1000;
wan=pin%100000/10000;
shiwan=pin%1000000/100000;
write_data(shiwan+48);
delay(5);
write_data(wan+48);
delay(5);
write_data(qian+48);
delay(5);
write_data(bai+48);
delay(5);
write_data(shi+48);
delay(5);
write_data(ge+48);
delay(5);
}
void write_com(uchar com) //写命令函数{
rs=0;
P0=com;
delay(5);
en=1;
delay(5);
en=0;
}
void init_lcd()//初始化液晶
{
write_com(0x38);//显示设置模式// delay(5);
write_com(0x06);//数据指针加1
delay(5);
//write_com(0x01);//清屏函数
//delay(5);
write_com(0x0e);//显示光标
// delay(5);
write_com(0x80);
// delay(5);
}
void write_rank(float temp)
{
uint ranb;
uchar j;
temp*=10000;
ranb=(uint)temp;
r[0]='U';
r[1]='p';
r[2]=':';
r[3]=ranb/10000%10+48;
r[4]='.';
r[5]=ranb/1000%10+48;
r[6]=ranb/100%10+48;
r[7]=ranb/10%10+48;
r[8]=ranb%10+48;
r[9]='V';
write_com(0x80+0x40);
for(j=0;j<9;j++)
{
write_data(r[j]);
delay(5);
}
}
void init_timer0()
{
ET0=1; //打开定时器0中断
TMOD=0x01;; //设置为模式1
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //50MS
TF0=0;
}
void init_int0()
{
EA=1;//打开总中断
IT0=1; //设置外部中断0为边沿触发方式}
void timer0() interrupt 1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256; //50MS
++p;
}
void int0() interrupt 0
{
++q; //脉冲次数
}
/*AD设置函数*/
void ADC_init() //AD转换初始化
{
ADC_CONTR|=0X80; //打开ADC转换电源delay(5);
ADC_CONTR=0xef;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
void main()
{
init_lcd();
init_timer0();
while(1)
{
uint n=5000;
sta=0;
max=0;
while(n--)
{ //write_com(0x01);
ADC_init();
while(!(sta=ADC_CONTR&0x10));
//ADC_CONTR&=0x7f;
result1=ADC_RES;result2=ADC_RESL;
result=(result1*4+result2)*v/1024;//保存A/D 转换结果
ADC_RES=0;ADC_RESL=0;
if(max<result)//测幅值部分
max=result;
}
write_rank(max);
delay(5);
init_int0();
EX0=1; //打开外部中断
TR0=1;//打开定时器中断
while(p<40); //每一秒计算一次
EA=0; //关闭外部中断
fre=q-1; //计算频率
q=0;
p=0;
write_com(0x80);
write_data('f');
delay(5);
write_data('r');
delay(5);
write_data('e');
delay(5);
write_data(':');
write_fre(fre);
}
}。