⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 Ƶ

📁 频率计c语言程序(原创)
💻
字号:
 #include"AT898252.H"
 #include"intrins.h"
#include "absacc.h"

sbit LCM_RS=P2^0;
sbit LCM_RW=P2^1;
sbit LCM_EN=P2^2;

#define BUSY  0x80              //常量定义
#define DATAPORT P1             //P1口为输出端
#define uchar unsigned char
#define uint   unsigned int

void lcd_wait(void);
uchar code str0[]={"the frequency is"};   //字符串
uchar code str1[]={"HZ"};
 uchar temp1,time,d,lorh,p,t;/*p为T0中断标志,lorh为选择测量方法*/
 unsigned long f, f1,f2; unsigned int temp2;
 delay(uint m) /*延时*/
{uchar i,j;
  for(i=0;i<m;i++)
  for(j=0;j<120;j++);
  } 
/**********写指令到ICM子函数************/

void WriteCommandLCM(uchar WCLCM,uchar BusyC)
{
    if(BusyC)lcd_wait();
	DATAPORT=WCLCM;
    LCM_RS=0;                   // 选中指令寄存器
    LCM_RW=0;               	// 写模式	
    LCM_EN=1;    
	_nop_();   
	_nop_();
	_nop_(); 
    LCM_EN=0;
   
}

/**********写数据到LCM子函数************/

void WriteDataLCM(uchar WDLCM)
{ 
    lcd_wait( );            //检测忙信号    
	DATAPORT=WDLCM;
    LCM_RS=1;               // 选中数据寄存器
    LCM_RW=0;           	// 写模式
    LCM_EN=1;
    _nop_();
	_nop_();
	_nop_();
    LCM_EN=0;
}

/***********lcm内部等待函数*************/

void lcd_wait(void)
{
    DATAPORT=0xff;	     //读LCD前若单片机输出低电平,而读出LCD为高电平,则冲突,Proteus仿真会有显示逻辑黄色
	LCM_EN=1;
    LCM_RS=0;   			
    LCM_RW=1;   			
    _nop_();
    _nop_();
	_nop_();
    while(DATAPORT&BUSY)
	{  LCM_EN=0;
	   _nop_();
	   _nop_();
	   LCM_EN=1;
	   _nop_();
	   _nop_();
	   }
   	LCM_EN=0;
	
}

/**********LCM初始化子函数***********/
void initLCM( )
{   
	DATAPORT=0;	
	delay(15);
	WriteCommandLCM(0x38,0);    //三次显示模式设置,不检测忙信号
    delay(5); 
    WriteCommandLCM(0x38,0);
    delay(5); 
    WriteCommandLCM(0x38,0);
    delay(5); 

    WriteCommandLCM(0x38,1);    //8bit数据传送,2行显示,5*7字型,检测忙信号
    WriteCommandLCM(0x08,1);    //关闭显示,检测忙信号
   
    WriteCommandLCM(0x06,1);    //显示光标右移设置,检测忙信号
    WriteCommandLCM(0x0c,1);    //显示屏打开,光标不显示,不闪烁,检测忙信号
}

/****显示指定坐标的一个字符子函数****/

void DisplayOneChar(uchar X,uchar Y,uchar DData)
{
    Y&=1;
    X&=15;
    if(Y)X|=0x40;               //若y为1(显示第二行),地址码+0X40
    X|=0x80;                    //指令码为地址码+0X80
    WriteCommandLCM(X,1);
    WriteDataLCM(DData);
}

/*******显示指定坐标的一串字符子函数*****/
 
void DisplayListChar(uchar X,uchar Y,uchar code *DData)
{
    uchar ListLength=0;
    Y&=0x01;
    X&=0x0f;
   
     while(DData[ListLength]!='\0')
      {  DisplayOneChar(X,Y,DData[ListLength]);
     
        ListLength++;
        X++;}
    }
  /********显示函数*************/  
  Display_imp(unsigned long f)
 { 
  uchar c=0;
  c=(uint)(f%10);
  DisplayOneChar(11,1,c+0x30);
  f=f/10;
  c=(uint)(f%10);
  DisplayOneChar(10,1,c+0x30);
  f=f/10;
  c=(uint)(f%10);
  DisplayOneChar(9,1,c+0x30);
  f=f/10;
  c=(uint)(f%10);
  DisplayOneChar(8,1,0x2e);
  DisplayOneChar(7,1,c+0x30);
  f=f/10;
  c=(uint)(f%10);
  DisplayOneChar(6,1,c+0x30);
  f=f/10;
  c=(uint)(f%10);
  DisplayOneChar(5,1,c+0x30);
  f=f/10;
  c=(uint)(f%10);
  DisplayOneChar(4,1,c+0x30);
   f=f/10;
  c=(uint)(f%10);
  DisplayOneChar(3,1,c+0x30);
    f=f/10;
  c=(uint)(f%10);
  DisplayOneChar(2,1,c+0x30);
    f=f/10;
  c=(uint)(f%10);
  DisplayOneChar(1,1,c+0x30);
}
 cl1() 
 {
  f1=1000000000/(65536.0*time+256.0*TH2+TL2);
  Display_imp(f1);delay(300);
 }
 cl2()
 {
  f2=(65536*temp2+256*TH1+TL1)*1000;
  Display_imp(f2); 
 }
frelow() /*低频测周期*/
{
 T2CON=0;T2MOD=0;
 TH2=0;
 TL2=0;
 RCAP2H=0;
 RCAP2L=0;
 TMOD=0x60;
 TH1=0xFF;
 TL1=0xFF;
 EA=1;
 ET1=1;
 ET2=1;  
 TR1=1;
 d=2;
 t=0;
}
frehigh() /*高频测频率*/
{time=0;
 T2CON=0;T2MOD=0;
 TH2=0x3C;TL2=0xB0;  //定时50ms
 RCAP2H=0x3C; 
 RCAP2L=0xB0;
 TMOD=0x50;
 TH1=0;
 TL1=0;
 EA=1;
 ET1=1;
 ET2=1;
 TR2=1;
 TR1=1;
 t=1;
 }
choose() /*选择计数方式*/
{
 TMOD=0x51;
 TH0=0xD8;
 TL0=0xF0; /*定时10ms*/
 TH1=0;
 TL1=0;
 EA=1;
 ET0=1;
}
main() /*主函数*/  
{ 
  while(1)
 {
   time=0;
   temp2=0;
   initLCM( );
   DisplayListChar(0,0,str0);
   DisplayListChar(14,1,str1);
   choose();
   TR1=1;
   TR0=1;
   p=1;
   while(p);
   if(TL1>0x0A||TH1>0)  //判断使用哪种测量方法
   lorh=1;     //高频使用直接测频
   else
   lorh=0;    //低频使用间接测周
   if(lorh==0)
   {
	  frelow();
     while(d>0);
	  TR1=0;
     cl1();
	 }
   else
   {
	 frehigh();
	 while(time<20); //T2中断20次,即1s
    TR2=0;
	 TR1=0;
	 cl2();
	 }
  }
}
void time0(void) interrupt 1 //T0中断
{TR1=0;TR0=0;p=0;}
void time1(void) interrupt 3  //T1中断
{if(t==0){d--;TR2=d;}else temp2++;}
void time2(void) interrupt 5   //T2中断
{TF2=0;time++;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -