频率计.docx
《频率计.docx》由会员分享,可在线阅读,更多相关《频率计.docx(12页珍藏版)》请在冰豆网上搜索。
![频率计.docx](https://file1.bdocx.com/fileroot1/2022-11/16/a087ddc3-c846-4a3c-9260-c476c2fcb8cd/a087ddc3-c846-4a3c-9260-c476c2fcb8cd1.gif)
频率计
#include
#include
#defineuintunsignedint
#defineucharunsignedchar
ucharf_str[15];
ucharunit[4];
uintrang=1;
uintth0=0;
uinttl0=0;
uintn_f1=0;
uintn_f2=0;
doubletime1=0;
doubleff=0;
uchars05_flag=0;
doubletimer_count1=0;
doubletimer_count2=0;
ucharcs_flag=0;
voidswitch_rang();
voiddelay1(unsignedintk);
voiddelay(uintz);
voidfraction_to_str(floata,uchar*pStr);
voidfloat_to_str(floata,uchar*pStr);
voiddisplay(unsignedcharx,unsignedchary,unsignedchar*str);
voidWrite_Data(uchardat);
voidSet_Cursor(unsignedcharx,unsignedchary);
sbitxz_key=P0^6;
sbitsc_key=P0^7;
sbittd_a=P2^0;
sbittd_b=P2^1;
sbittd_c=P2^2;
sbitbuzz=P2^3;
//lcd显示定义
#defineLCD_DATAP1/*数据口*/
sbitRS=P0^0;/*并行的指令/数据选择信号,H数据,L命令*/
sbitRW=P0^1;/*并行读写选择信号,H读,L写*/
sbitE=P0^2;/*并行使能端,H有效,L无效*/
//sbitPSB=P0^4;/*串并行选择端,H选择并行,L选择串行*/
//sbitRST=P0^3;
//bitbusy=0;/*忙碌标志*/
//*****lcd显示程序****//
voiddisplay(unsignedcharx,unsignedchary,unsignedchar*str)
{
unsignedchari=0;
Set_Cursor(x,y);//设置显示的起始地址
while(str[i]!
='\0')
{
Write_Data(str[i]);//写入需要显示字符的显示码
i++;
}
}
voiddelay1(unsignedintk)
{
unsignedinti;
unsignedcharj;
for(i=0;i{
for(j=0;j<10;j++);
}
}
/*bitCheckBusy()//读BF标志位,检查LCD是否就绪
{
RS=0;
delay
(1);
RW=1;
delay
(1);
E=1;
delay
(1);
if(LCD_DATA&0x80)
return1;
else
return0;
}
voidWait()//等待LCD就绪
{
while(CheckBusy()==1)
busy=0;
//busy=1;
}*/
ucharRead_Data()//读数据
{
delay1
(1);
RS=1;
RW=1;
E=1;
delay(5);
returnLCD_DATA;
}
voidWrite_Data(uchardat)//写一个字节数据
{
delay1
(1);
RS=1;
RW=0;
E=1;
delay
(1);
LCD_DATA=dat;
E=0;
delay
(1);
}
voidWrite_Command(uchardat)//写命令
{
delay1
(1);
RS=0;
RW=0;
E=1;
delay
(1);
LCD_DATA=dat;
E=0;
delay
(1);
}
voidSet_Cursor(unsignedcharx,unsignedchary)
{
unsignedchari;
switch(x)//确定行号
{
case0x00:
i=0x80;break;//第一行
case0x01:
i=0x90;break;//第二行
case0x02:
i=0x88;break;//第三行
case0x03:
i=0x98;break;//第四行
default:
break;
}
i=y+i;//确定列号
Write_Command(i);//写地址
}
voidLCD_Init()/*LCD初始化*/
{delay(45);//延时45ms
//PSB=1;//8位并行口
//复位操作
//RST=1;delay
(1);
//RST=0;delay
(1);
//RST=1;delay
(1);
Write_Command(0x30);//设置为8位并行口,基本指令集
delay(10);
Write_Command(0x30);//再次设置为8位并行口,基本指令集
delay(5);
Write_Command(0x38);//设置液晶工作模式,意思:
16*2行显示,5*7点阵,8位数据
delay(5);
Write_Command(0x08);
delay(5);
Write_Command(0x01);//清显示
delay(5);
Write_Command(0x06);//整屏不移动,光标自动右移
delay(5);
Write_Command(0x0c);//开显示不显示光标
delay(5);
//Write_Command(0x80);
//Write_Data(str1);
//Write_Command(0xc0);
//Write_Data(str2);
}
//****频率计算程序****//
//中断定时器*
voidt0()interrupt1
{
TH0=0xd8;/*设置5m初值*/
TL0=0xf0;
timer_count1++;
if(timer_count1>=100)/*0.5秒标志*/
{
s05_flag=1;
//timer_count1=0;
}
}
//外部中断计数
voidint0()interrupt0
{
n_f1++;
if(n_f1==1)/*第一个下降沿时开始计数*/
{
TH0=0xd8;
TL0=0xf0;
timer_count1=0;
TR0=1;
}
else
{
if(s05_flag==1)/*当5ms标志为一且下降沿时开始读数*/
{
cs_flag=1;/*频率计算标志*/
TR0=0;/*关掉T0*/
n_f2=n_f1-1;
th0=TH0-0xd8;
tl0=TL0-0xf0;
timer_count2=timer_count1;
n_f1=0;/*初值清零*/
s05_flag=0;
timer_count1=0;
}
}
}
//频率测量
voidfre_text()
{
if(cs_flag==1)
{
cs_flag=0;
time1=(timer_count2*500.705+(tl0+th0*255)*0.05)*0.01;
ff=(n_f2)/time1;
//ff=ff-0.270;
switch_rang();
time1=(timer_count2*500.705+(tl0+th0*255)*0.05)*0.01;
ff=(n_f2)/time1;
ff=ff*100000;
if(ff>500000)
{
if((ff>500000)&&(ff<600000))ff=ff-ff*0.00065;
if((ff>600000)&&(ff<700000))ff=ff+ff*0.0025;
if((ff>700000)&&(ff<800000))ff=ff+ff*0.0080;
if((ff>800000)&&(ff<900000))ff=ff+ff*0.011;
if((ff>900000)&&(ff<1000000))ff=ff+ff*0.0130;
}
else
{if(ff<100)ff=ff-ff*0.00112;
else
ff=ff-ff*0.00228;
}
delay(50);
ff=ff/100;
switch(rang)
{case0:
ff=ff;break;
case1:
ff=ff*100;break;
case2:
ff=ff*10000;break;
default:
break;
}
//ff=ff-270;
rang=1;
}
}
//1ms延时子函数//
voiddelay(uintz)
{
uinti,j;
for(i=0;i<=z;i++)
{
for(j=0;j<110;j++);
}
}
//自动换挡程序//
voidswitch_rang()
{
if((ff<=100)||(ff>=1000000)==1)
{
if((ff<=100)&&(ff>=10)==1)
{rang--;
}
if((ff>=10000)&&(ff<=1000000)==1)
{rang++;
}
}
switch(rang)
{
case0:
td_a=0;td_b=0;td_c=0;break;/*1~100HZ*/
case1:
td_a=1;td_b=0;td_c=0;break;/*100~10000HZ*/
case2:
td_a=0;td_b=1;td_c=0;break;/*10000~1000000HZ*/
default:
break;