频率计.docx

上传人:b****3 文档编号:2963171 上传时间:2022-11-16 格式:DOCX 页数:12 大小:17.10KB
下载 相关 举报
频率计.docx_第1页
第1页 / 共12页
频率计.docx_第2页
第2页 / 共12页
频率计.docx_第3页
第3页 / 共12页
频率计.docx_第4页
第4页 / 共12页
频率计.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

频率计.docx

《频率计.docx》由会员分享,可在线阅读,更多相关《频率计.docx(12页珍藏版)》请在冰豆网上搜索。

频率计.docx

频率计

#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;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1