频率计程序单片机部分.docx
- 文档编号:27142877
- 上传时间:2023-06-27
- 格式:DOCX
- 页数:23
- 大小:18.15KB
频率计程序单片机部分.docx
《频率计程序单片机部分.docx》由会员分享,可在线阅读,更多相关《频率计程序单片机部分.docx(23页珍藏版)》请在冰豆网上搜索。
频率计程序单片机部分
//========================================================================
//工程名称:
MzLH04_DirectNumber
//作者:
xinqiangZhang(小丑)(email:
xinqiang@M)
//联系方式:
QQ644272644
//版权所有:
北京铭正同创科技有限公司
//适应芯片:
MCS51(本例选择AT89S52)
//编程环境:
KeilC51
//实现功能:
MzLH04模块的直接数字显示功能演示
//
//系统要求:
PCwithCPU233MHz,128MBRAM,
//KeiluVision3(orlater)
//组成文件:
//main.c----主程序文件
//LCD_Dis.c
//LCD_Dis.h
//----MzLH04模块的基本驱动程序
//硬件连接:
//LCDCS---P1.0
//LCDSCK---P1.2
//LCDSDA---P1.1
//LCDRST---P1.3
//端口定义请参考LCD_Config.h文件中的定义
//
//CPU运行频率11.0592MHz(每个指令为12周期)
//
//LCD供电请参考具体的模块是3.3V的还是5V模块
//
//当前版本:
V1.00
//日期:
2009-02-10
//
//参考文件:
//维护记录:
//-------------------------------------------------------------------
//Version2009-02-10-V10ModifiedByXinqiangZhang(小丑)
//
//========================================================================
#include"LCD_Dis.h"
#include"stc12c5a.h"
#include
#defineuintunshignedint
#defineucharunsignedchar
unsignedcharkey;
unsignedcharadckey;
unsignedcharflag1=1;////手动自动档切换标志
unsignedcharflag2=1;/////手动档切换量程
unsignedchargetad(void);
unsignedchargetkey(void);
//unsignedshortbcdzs(void);
//unsignedshortbcdxs(void);
unsignedshortidataTemp[7]={0x00,0x00,0x00,0x00,0x00,0x00,0x00};
unsignedshortf1;unsignedshortf2;unsignedshortf3;
unsignedshortf4;unsignedshortf5;unsignedshortf6;
unsignedshortf7;
staticunsignedshortfre;///4字节变量
staticunsignedshortgw;
staticunsignedshortsw;
staticunsignedshortbw;
staticunsignedshortsfw;
staticunsignedshortbfw;
staticunsignedshortqfw;
unsignedshortzkb;
floatjsf;
intnum=0;
unsignedshortcs=1;
unsignedshortcs1;
voiddelay(unsignedintms)//延时函数
{
unsignedchari;
while(ms--)
{
for(i=0;i<250;i++)
{
_nop_();_nop_();_nop_();_nop_();
}
}
}
unsignedchargetad()
{unsignedcharchannel;
unsignedcharAD_finished=0;
ADC_RES=0;
channel&=0x01;//AD通道选择2
ADC_CONTR|=0x40;//转换速度选择sppd1=1
ADC_CONTR&=0xDF;//转换速度选择sppd0=0
_nop_();
ADC_CONTR|=channel;//AD通道选择赋值
_nop_();
ADC_CONTR|=0x80;//开AD转换电源
delay
(1);
ADC_CONTR|=0x08;//启动AD转换
AD_finished=0;
while(AD_finished==0)///转换是否结束判断
{
AD_finished=(ADC_CONTR&0x10);
}
ADC_CONTR&=0xE7;////转换标志位清0,关闭AD转换电源
return(ADC_RES);
}
unsignedchargetkey()
{
unsignedcharjp,temp;
charcolumn[]={0xEF,0xDF,0xBF,0x7F};
charkeycode[]={0xEE,0xED,0xEB,0xE7,0xDE,0xDD,0xDB,0xD7,0xBE,0xBD,0xBB,0xB7,0x7E,0x7D,0x7B,0x77};
//012345678910.......
do
{
for(jp=0;jp<4;jp++)
{
P2=column[jp];
if(P2!
=column[jp])
{
TimeDelay(20);
if(P2!
=column[jp])//按键在此列
temp=P2;
}
}
for(jp=0;jp<16;jp++)
{
if(temp==keycode[jp])
returnjp;//退出getkey()函数
}
}
while
(1);
}
voidmain(void)
{
//串口中断通信设置
SCON=0x50;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
REN=1;
TR1=1;//启动定时器T1
ET1=1;
ES=1;//允许串行口中断
PS=1;//设计串行口中断优先级
EA=1;//单片机中断允许
//unsignedcharucTemp=9;
/*unsignedshortpinli=20;
unsignedshortzhankongbi=12;
*/
LCD_Init();
SetBackLight(0);//设置背光的亮度等级为0SetBackLight(unsignedcharGrade)Grade0~127的等级
ClrScreen();
FontSet(0,1);////////ASCII字符字体设置
FontSet_cn(0,1);///汉字库字符字体设置
FontMode(1,0);
SetBackLight(100);//设置背光打开
/*if(flag1==1)
{
PutString_cn(0,39,"自动量程");
}
elseif(flag1==2)
{
PutString_cn(60,39,"手动量程");
}
*/
while
(1)
{
//delay(150);
PutString_cn(0,0,"电子设计大赛培训任务");
//ShowShort(0,15,cs,1);
PutString_cn(36,13,"频率");//PutString_cn(0,13,"周期");
//PutString(90,15,"Hz");PutString(90,15,"KHz");PutString(90,15,"MHz");
switch(flag2)
{
case1:
ShowShort(66,15,bw,1);
ShowShort(72,15,sw,1);
ShowShort(78,15,gw,1);
PutChar(84,15,'.');
ShowShort(90,15,sfw,1);
ShowShort(96,15,bfw,1);
ShowShort(102,15,qfw,1);
PutString(108,15,"Hz");
break;
case2:
ShowShort(66,15,bw,1);
ShowShort(72,15,sw,1);
ShowShort(78,15,gw,1);
PutChar(84,15,'.');
ShowShort(90,15,sfw,1);
ShowShort(96,15,bfw,1);
ShowShort(102,15,qfw,1);
PutString(108,15,"KHz");
break;
case3:
ShowShort(66,15,bw,1);
ShowShort(72,15,sw,1);
ShowShort(78,15,gw,1);
PutChar(84,15,'.');
ShowShort(90,15,sfw,1);
ShowShort(96,15,bfw,1);
ShowShort(102,15,qfw,1);
PutString(108,15,"MHz");
break;
//default:
break;
}
//ShowShort(0,26,cs1,1);
PutString_cn(36,26,"占空比");ShowShort(78,28,zkb,1);PutChar(100,28,'%');
if(flag1==1)
{
PutString_cn(36,39,"自动量程");
}
elseif(flag1==2)
{
PutString_cn(36,39,"手动量程");
}
PutString_cn(0,52,"史玉龙-王琪-徐国金");
SetBackLight(100);//设置背光打开
//delay(100);////////////加延时防止屏幕抖动
delay(150);
adckey=getad();/////////////////AD键盘
switch(adckey)
{
case0:
//键1
PutChar(10,28,'1');
break;
case135:
//键2//shizhong[1][1]='1';
PutChar(10,28,'2');
break;
case178:
//键3///shizhong[1][2]='2';
//delay(30);
flag1+=1;
if(flag1==3)
{
flag1=1;
}
break;
case199:
//键4//shizhong[1][3]='3';
//delay(30);
if(flag1==2)
{
flag2+=1;
if(flag2==4)
{
flag2=1;
}
}
break;
case211:
//键5
//delay(30);////////////////////////不加延时防止屏幕抖动
PutChar(10,28,'5');
break;
case218:
//键6
//delay(30);
PutChar(10,28,'6');
break;
case224:
//键7
//delay(30);
PutChar(10,28,'7');
break;
case228:
//键8
//delay(30);
PutChar(10,28,'8');
break;
default:
break;
}
/*
key=getkey();/////////////矩阵键盘
switch(key)
{
case0:
//C键
PutChar(2,28,'C');
break;
case1:
//D键
PutChar(2,28,'D');
break;
case2:
//E键
PutChar(2,28,'E');
break;
case3:
//F键
PutChar(2,28,'F');
break;
case4:
//9键
PutChar(2,28,'9');
break;
case5:
//0键
PutChar(2,28,'0');
break;
case6:
//A键
PutChar(2,28,'A');
break;
case7:
//B键
PutChar(2,28,'B');
break;
case8:
//5键
PutChar(2,28,'5');
break;
case9:
//6键
PutChar(2,28,'6');
break;
case10:
//7键
PutChar(2,28,'7');
break;
case11:
//8键
PutChar(2,28,'8');
break;
case12:
//1键
PutChar(2,28,'1');
break;
case13:
//2键
PutChar(2,28,'2');
break;
case14:
//3键
//delay(30);
flag1+=1;
if(flag1==3)
{
flag1=1;
}
break;
case15:
///4键
delay(10);
if(flag1==2)
{
flag2+=1;
if(flag2==4)
{
flag2=1;
}
}
break;
default:
break;
}
*/
}
}
/*
voidbcdzs(floatjsf1)
{
unsigedcharbw,sw,gw;
bw=jsf1
}
voidbcdxs(floatjsf2)
{
unsigedcharsfw,bfw,qfw;
}
*/
//串口中断服务程序
voidUART_SER()interrupt4using3
{
if(RI)
{
RI=0;
switch(num)
{
case0:
{f1=SBUF;num++;}break;
case1:
{f2=SBUF;num++;}break;
case2:
{f3=SBUF;num++;}break;
case3:
{f4=SBUF;num++;}break;
case4:
{f5=SBUF;num++;}break;
case5:
{f6=SBUF;num++;}break;
case6:
{f7=SBUF;num++;}break;
case7:
{
//jsf=(float)128+255;
//cs=65535;
jsf=(float)f1*65536+f2*256+f3;
if(f7==0xF0)
{
jsf=(float)jsf*(f4*65536+f5*256+f6)/80000;
zkb=jsf;
}
elseif(f7==0x0F)
{
jsf=8000000/jsf;
jsf=(float)jsf*(f4*65536+f5*256+f6)/80000;
zkb=jsf;
}
num=0;
jsf=(float)f1*65536+f2*256+f3;
if(f7==0xF0)////测频,2KHZ-8M(分母为1)
{
if(jsf<0x3E8)/////////1KHZ
{
fre=(int)jsf;
gw=fre%10;
sw=fre/10%10;
bw=fre/100;
jsf=jsf*1000;
qfw=(int)jsf%10;
bfw=(int)jsf/10%10;
sfw=(int)jsf/100%10;
flag2=1;////HZ
}
elseif((jsf>=0x3E8)&&(jsf<=0xFFFF))//////2KHZ-65.535KHZ
{
fre=jsf/1000;
gw=fre%10;
sw=fre/10%10;
bw=fre/100;
qfw=(int)jsf%10;
bfw=(int)(jsf/10)%10;
sfw=(int)(jsf/100)%10;
flag2=2;//KHZ
}
elseif((jsf>0xFFFF)&&(jsf<=0xF423F))///65.535KHZ-999.999KHZ
{
fre=jsf/1000;
gw=fre%10;
sw=fre/10%10;
bw=fre/100;
qfw=(int)jsf%10;
bfw=(int)(jsf/10)%10;
sfw=(int)(jsf/100)%10;
flag2=2;////////KHZ
}
elseif(jsf>=0xF4240)////////////////////1MHZ及以上
{
fre=jsf/1000000;
gw=fre%10;
sw=fre/10%10;
bw=fre/100;
jsf=(int)jsf/1000;
qfw=(int)jsf%10;
bfw=(int)jsf/10%10;
sfw=(int)jsf/100%10;
flag2=3;////MHZ
}
}
if(f7==0x0F)///测周,1-2Khz
{
jsf=8000000/jsf;
if(jsf<0x3E8)/////////1KHZ以下
{
fre=(int)jsf;
gw=fre%10;
sw=fre/10%10;
bw=fre/100;
jsf=jsf*1000;
qfw=(int)jsf%10;
bfw=(int)jsf/10%10;
sfw=(int)jsf/100%10;
flag2=1;////HZ
}
elseif((jsf>=0x3E8)&&(jsf<=0xFFFF))//////1KHZ-65.535KHZ
{
fre=jsf/1000;
gw=fre%10;
sw=fre/10%10;
bw=fre/100;
qfw=(int)jsf%10;
bfw=(int)jsf/10%10;
sfw=(int)jsf/100%10;
flag2=2;//KHZ
}
elseif((jsf>0xFFFF)&&(jsf<=0xF423F))///65.535KHZ-999.999KHZ
{
fre=jsf/1000;
gw=fre%10;
sw=fre/10%10;
bw=fre/100;
qfw=(int)jsf%10;
bfw=(int)jsf/10%10;
sfw=(int)jsf/100%10;
flag2=2;////////KHZ
}
elseif(jsf>=0xF4240)////////////////////1MHZ及以上
{
fre=jsf/1000000;
gw=fre%10;
sw=fre/10%10;
bw=fre/100;
jsf=jsf/1000;
qfw=(int)jsf%10;
bfw=(int)jsf/10%10;
sfw=(int)jsf/100%10;
flag2=3;////MHZ
}
}
}
break;
default:
break;
}
/*
Temp[num++]+=SBUF;
cs=Temp[num];///////////
if(num==7)
{
num=0;
jsf=(float)(Temp[0]*32765+Temp[1]*128+Temp[2]);
if((jsf>=2000)&&(jsf<=4000))////测频,频率范围2KHZ-4KHZ
{
jsf=8000/jsf;
fre=jsf;
flag2=2;//KHZ
}
elseif(jsf<2000)///////有可能测周,有可能测频
{
if(Temp[6]==0xF0)////测周,1-2Khz
{
fre=jsf;
flag2=1;////HZ
}
else///测频,4KHZ-8M(分母为1)
{
jsf=8000000/jsf;
if(jsf<=0xFFFF)
{
fre=jsf;
fre/=1000;
flag2=2;//KHZ
}
elseif((jsf>0xFFFF)&&(jsf<=0xF423F))///65.535KHZ-999.999KHZ
{
jsf=jsf/1000;
fre=jsf;
flag2=2;////////KHZ
}
elseif(jsf>=0xF4240)////////////////////1MHZ及以上
{
jsf=jsf/1000000;
fre=jsf;
flag2=3;////MHZ
}
}
jsf=(float)fre*(Temp[3]*32768+Temp[4]*128+Temp[5])/80000;
zkb=jsf
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 频率计 程序 单片机 部分