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

📄 lc振荡频率.c

📁 程序资料共享 希望大家共同进步 共同努力 加油 !
💻 C
字号:
#include<reg52.h>
#include<ABSACC.h>
#include<INTRINS.H>

#define Uint  unsigned int
#define Uchar unsigned char

sbit R = P3^7;
sbit W = P3^6;
sbit IoClk = P1^0;		
sbit Address = P1^1;
sbit DO = P1^2;
sbit CS	= P1^3;
sbit DataDA = P1^4;
sbit ClkDA = P1^5;
sbit LOAD = P1^6;
sbit LDAC = P1^7;

#define Lcd1602WdataPort 0x8101
#define Lcd1602CmdPort  0x8100
#define Lcd1602StatusPort 0x8102
#define Busy 0x80 

void LcdReset( void );
void LcdWriteCommand( Uchar CMD,Uchar AttribC );
void LcdWriteData( Uchar dataW );
void ShowChar(Uchar pos,Uchar c);
void ShowString(Uchar line,char *pr);
void count(void);
void xianshi(float a);
void xianshiVpp(Uint data1);
void WriteDa(Uchar Dat,Uchar CH);
Uint ReadAd(Uchar NextCH);
void Delay400Ms(void);
void Delay5Ms(void);

Uchar tf=0,k=1;
Uchar c[]={'0','1','2','3','4','5','6','7','8','9'};
Uint b[10];
Uchar flag=0;
Uchar da[6]={0x00,0xff,0x00,0xff,0x00,0xff};

main()
{  Uchar i,i1=0;
   Uint advalue,j=5;
   Uchar code str1[]="f=           KHz";  
   Uchar code str2[]="Vpp=         mV ";
   float rate;
   Delay400Ms();
   LcdReset();
   IE=0x84;
   TCON=0x00;
   for( ; ; )
    { XBYTE[0xf8f0]=0;
      if(flag==0&&k)
        { count();
          for(i=0;i<10;i++)
            { rate+=b[i];}
          rate=rate*100;
		  advalue=ReadAd(0);
          ShowString(0,str1);
          ShowString(1,str2);
          xianshi(rate);
		  xianshiVpp(advalue);
        }
      else if(flag!=0)
            { switch(flag)
	            { case 1: {WriteDa(da[i1++],0x00);if(i1==6)i1=0;flag=0;k=1;EA=1;}break;
                  case 2: {WriteDa(da[j--],0x00);if(j<0)j=5;flag=0;k=1;EA=1;}break;
                  default:break;
                }
            }
    }
}

time0() interrupt 1 using 1
{
 TH0=(65536-50000)/256;
 TL0=(65536-50000)%256;
 tf=1;
}

time1() interrupt 3 using 1 { }

void count(void)
{   Uchar i; 
	TMOD=0X59;
	TH0=(65536-10000)/256;TL0=(65536-10000)%256;
	TH1=0X00;TL1=0X00;
	TR0=1;TR1=1;PT0=1;ET0=1;ET1=1;EA=1;
	for(i=0;i<10;i++)
           { while(tf!=1);
             TR0=0;TR1=0;
             b[i]=TH1*256+TL1;             
             TH1=0X00;TL1=0X00;
             TR0=1;TR1=1;
           }
	TR0=0;TR1=0;k=0;
}

void xianshi(float a)
{ Uchar j,n=0x02,n2=3;
  Uint i;
  float n1=100;
  a/=1000;
  if(a<100){n1/=10;n2=2;}
  else if(a>=221)a=a-2;
       else if(a>=106&&a<221)a=a-1;     	
  for(j=0;j<n2;j++)
    { i=(Uint)(a/n1);
      a=a-i*n1;
      n1/=10;
      Delay5Ms();
      ShowChar(n,c[i]);
      n++;
    }
}

void xianshiVpp(Uint data1)
{ Uint array;
  Uchar g8w,d8w,j,n4=5,m=0x16;
  float v,n3=10000;
  g8w=data1&0xff00;
  g8w>>=8;
  d8w=data1&0x00ff;
  v=((g8w*256+d8w)*0.0024)*10000;
  if(v<10000){n3/=10000;n4=4;}
  for(j=0;j<n4;j++)
    { array=(Uint)(v/n3);
      v=v-array*n3;
      n3/=10;
      Delay5Ms();
      ShowChar(m,c[array]);
      m++;
    }
}

void LcdReset( void ) {
        LcdWriteCommand( 0x38, 0);			// 显示模式设置(不检测忙信号)
		Delay5Ms();
	LcdWriteCommand( 0x38, 0);			// 共三次
		Delay5Ms();
	LcdWriteCommand( 0x38, 0);
		Delay5Ms();

	LcdWriteCommand( 0x38, 1);			// 显示模式设置(以后均检测忙信号 参数--"1")
    LcdWriteCommand( 0x08, 1);			// 显示关闭
   	LcdWriteCommand( 0x01, 1);			// 显示清屏
	LcdWriteCommand( 0x06, 1);			// 显示光标移动设置
	LcdWriteCommand( 0x0c, 1);			// 显示开及光标设置
}

void LcdWriteCommand( Uchar CMD,Uchar AttribC ) {
     Uchar i;    
    W = 1;R = 1;
	if (AttribC) 
	{
		P0=0xff;
		while( (i=XBYTE[Lcd1602StatusPort]) & Busy );		// 检测忙信号?
	}
	XBYTE[Lcd1602CmdPort] = CMD;
}

void LcdWriteData( Uchar dataW ) {
        Uchar i;
        W = 1;R = 1;
	while( (i=XBYTE[Lcd1602StatusPort]) & Busy );					// 检测忙信号

       	XBYTE[Lcd1602WdataPort] = dataW;
}

void ShowChar(Uchar pos,Uchar c)
{ Uchar p;
  if(pos>=0x10)
    p=pos+0xb0;
  else 
    p=pos+0x80;
  LcdWriteCommand(p,1);
  LcdWriteData(c);
}

Int1_process()  interrupt 2 using 0
{   Uchar w=0;
	w=~(XBYTE[0xf8f0]|0xf0);
	if(w==0x08)flag=1;
	else if(w==0x04)flag=2;
	     else flag=0;
    Delay5Ms();
    XBYTE[0xf8f0]=0;
    k=1;
    EA = 0; 
}

Uint ReadAd(Uchar NextCH)
{
	Uchar i;
	Uint AdVal = 0;
	IoClk = 0;
	CS = 0;
	for(i=0;i<10;i++)
	{
		if(i<4)
		{
			NextCH<<=1;
			Address=CY;
		}
		_nop_();
		IoClk = 1;
		AdVal<<=1;
		if(DO)
			AdVal++;
		_nop_();
		IoClk = 0;
	}
	CS = 1;
	return(AdVal);
}

void WriteDa(Uchar Dat,Uchar CH)
{
	Uchar i;
	LDAC = 0;
	ClkDA = 0;
	i=Dat;
	for(i=0;i<11;i++)
	{
		ClkDA = 1;
		if(i<3)
		{
			CH<<=1;
			DataDA = CY;
		}
		
		else
		{   Dat <<=1;
			DataDA = CY;
		}
	    _nop_();
	    ClkDA = 0;
    }
	_nop_();
	LOAD = 0;
	_nop_();
	LOAD = 1;
	_nop_();
	ClkDA = 1;
	_nop_();
	ClkDA = 0;
	Delay5Ms();
}


void ShowString(Uchar line,char *ptr)
{ Uchar l,i;
  l=line<<4;
  for(i=0;i<16;i++)
    ShowChar(l++,*(ptr+i));
} 

void Delay400Ms(void)
{
	Uchar i = 5;
	Uint j;
	while(i--)
	{
		//j=7269; //400Ms
        j=1817;   //100Ms
		while(j--);
	}
}

void Delay5Ms(void)
{
	Uint i = 5552;
	while(i--);
}

⌨️ 快捷键说明

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