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

📄 mc145170.c

📁 这是锁相环芯片MC145170程序
💻 C
字号:
/************************************** 
MC145170D的驱动程序 
*************************************/ 

#include <regx52.h> 
#include <intrins.h> 
#include<absacc.h>
//#include "lcd1602.H" 

/************************************** 
MC145170D控制引脚宏定义 
*************************************/ 
sbit  CLK = P0^0; /*MC145170时钟*/ 
sbit DIN = P0^2; /*MC145170输入*/  
sbit _ENB = P0^1 ;/*MC145170片选*/ 
//sbit _ENB = P1^1 ;
#define Uchar unsigned char
#define Uint  unsigned int
#define Ulong  unsigned long
Uint Frequence=5500;
#define BaseFre 400
#define uint unsigned int 
#define uchar unsigned char

 uchar code DisplayBuffer[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,0xFF};  //显示0到9和不显示和显示“-”负号,和显示乱码
 uchar data c[8]={0,10,10,10,10,10,10,10};     //初始值为10是为了让数码管不显示任何数字;c[5],c[4],c[3],c[2],c[1]分别显示的万位,千位,百位,十位,个位
void Delay400Ms(void)
    {
     Uchar i = 5;
     Uint j;
     while(i--)
          {
           j=7269;
           while(j--);
           };
    }
// 短延时
void Delay5Ms(void)
    {
     Uint i = 552;
     while(i--);
    }   
	
void delay_1ms()				  //延时?汇编是1ms
 {	int q;
   	for(q=300;q>0;q--);
  }                 
/************************************** 
名称:delay 											   vf
功能:延时模块 
输入参数:n要延时的周期数 
输出参数:无 
*************************************/ 
/*void delay(uint n) 
{ 
uchar i; 
i=n;
while(i--);
}*/ 
/************************************** 
名称:write_MC145170D
功能:MC145170D驱动模块
输出参数:CLK_mode所用时钟数,value为向Register所送数据值  
说明:mode=C表示要向C Register送数据,CLK=8;
	  mode=N表示要向N Register送数据,CLK=16;
	  mode=R1或R2表示要向R Register送数据,CLK=15或24;

	  C Register每位定义说明
	  C7 C7=HIGH时,PDout输出正脉冲,PDout=PHR;C7=LOW时,PDout输出负脉冲,PDout=PHV;PHR,PHV的输出选择,
	  	C7=HIGH时PDout=PHR-PHV,C7=LOW时PDout=PHV-PHR;
	  C6 鉴相器输出选择	  C6=HIGH时,从PDout输出,否则从PHR,PHV输出。
	  C5 =1时 锁定输出端 LD 有效
	  	C4 C3 C2 REFout Frequency
		0 0 0 dc (Static Low)
		0 0 1 OSCin
		0 1 0 OSCin /2
		0 1 1 OSCin /4
		1 0 0 OSCin /8 (POR Default)
		1 0 1 OSCin /16
		1 1 0 OSCin /8
		1 1 1 OSCin /16
	 C1=1时 FVE启动频率输出
	 C0=1时 fRE启动频率输出
	 N Register取值范围40 to 65535
	 R Register取值范围5 to 32767
*************************************/
void writec(unsigned char d)
{
      uchar i;
	  _ENB=1;
	  _nop_();
	  _ENB=0;//开始下降沿
	  _nop_();
	  for(i=0;i<8;i++)
	  {  CLK=0;
	     d=d<<1;
	     DIN=CY;//将数据放好等待读入
		 _nop_();
		 CLK=1;//将数据读入
		 _nop_();
	  }
	  _ENB=1;
} 
void write_R15(Uint r15)
{
      uchar i,dh,dl;
	  dh=r15/256;
	  dl=r15%256;
	  dh=dh<<1;
	  _ENB=1;
	  _nop_();
	  _ENB=0;//开始下降沿
	  _nop_();
	
	  for(i=0;i<7;i++)
	  {  CLK=0;
	     dh=dh<<1;
	     DIN=CY;//将数据放好等待读入
		 _nop_();
		 CLK=1;//将数据读入
		 _nop_();
	  }

	  for(i=0;i<8;i++)
	  {  CLK=0;
	     dl=dl<<1;
	     DIN=CY;//将数据放好等待读入
		 _nop_();
		 CLK=1;//将数据读入
		 _nop_();
	  }
	  _ENB=1;
}
void write_N(Uint n)
{
      uchar i,dh,dl;
	  dh=n/256;
	  dl=n%256;
	  _ENB=1;
	  _nop_();
	  _ENB=0;//开始下降沿
	  _nop_();
	
	  for(i=0;i<8;i++)
	  {  CLK=0;
	     dh=dh<<1;
	     DIN=CY;//将数据放好等待读入
		 _nop_();
		 CLK=1;//将数据读入
		 _nop_();
	  }

	  for(i=0;i<8;i++)
	  {  CLK=0;
	     dl=dl<<1;
	     DIN=CY;//将数据放好等待读入
		 _nop_();
		 CLK=1;//将数据读入
		 _nop_();
	  }
	  _ENB=1;
}
void write_R24(Uint r24)
{
      uchar i,dh,dl;
	  dh=r24/256;
	  dl=r24%256;
	  _ENB=1;
	  _ENB=0;//开始下降沿

	  for(i=0;i<8;i++)
	  {  CLK=0;
	     DIN=CY;//将数据放好等待读入
		 _nop_();
		 CLK=1;//将数据读入
		 _nop_();
	  }
	  for(i=0;i<8;i++)
	  {  CLK=0;
	     dh=dh<<1;
	     DIN=CY;//将数据放好等待读入
		 _nop_();
		 CLK=1;//将数据读入
		 _nop_();
	  }

	  for(i=0;i<8;i++)
	  {  CLK=0;
	     dl=dl<<1;
	     DIN=CY;//将数据放好等待读入
		 _nop_();
		 CLK=1;//将数据读入
		 _nop_();
	  }
	  _ENB=1;
}
/************************************** 
名称:mc145170复位函数
功能:主函数 
输入参数:无 
输出参数:无 
*************************************/ 
void mc145170reset()
{
    unsigned char i;
	//4个以上脉冲
	ENB=1;
	for(i=0;i<10;i++)
	{  CLK=0;
		_nop_();
	   DIN=0;
	   _nop_();
	   CLK=1;
	   _nop_();
	}

	//
	ENB=0;
	for(i=0;i<8;i++)
	{ 
	   CLK=0;
	   _nop_();
	   if(i==4)
	   		DIN=1;
	   else 
	   		DIN=0;
	   CLK=1;
	   _nop_();
	}

	ENB=1;

}
/************************************** 
名称:changefrequence
功能:改变频率的任务函数 
输入参数:无 
输出参数:无 
*************************************/ 
/*void changefrequence(void)
{ 	
	switch(Menu1)
	{	case 1:	mc145170reset();
				Delay5Ms();
				writec(0x6f);
				Delay5Ms();
				write_R24(BaseFre);
				Delay5Ms();
				write_N(Frequence);
				ePutUint(15,1,Frequence);
				Delay5Ms();	
			   	Menu1=2;
			
			   	break;
		case 2://输入的按键对应的数码从显示屏右端移入
				switch(MyKey)
					{case 0:break;
				 	 case 1:
					 		Frequence=Frequence+1;//递增			
							write_N(Frequence);
							ePutUint(15,1,Frequence);
							MyKey=0;
							break;						
				 	 case 2:
							Frequence=Frequence-5;//递减			
							write_N(Frequence);
							ePutUint(15,1,Frequence);
							MyKey = 0;//清按键缓冲区,表示按键值已经取走
							break;
				 	 case 3:	 	 								 	 	 	
							MyKey = 0;//清按键缓冲区,表示按键值已经取走
							Menu1=1;
							break;
				}
				break;

	}
}	 */
Set_all_Mc145170()
 {
    mc145170reset();
	Delay5Ms();
	writec(0x6f);
	Delay5Ms();
	write_R24(BaseFre);
	Delay5Ms();
	write_N(Frequence);
	Delay5Ms();	
 }

 //////////////////////////////////////////数字各位分离程序/////////////////////////////
void MakeDate(int show_answer)
{   char i; 
	for(i=0;i<7;i++)	 
	       {c[i] = show_answer%10;
	        show_answer = show_answer/10;
	       }
		   if(c[6]==0)
		     {c[6]=10;
		      if(c[5]==0)
		        {c[5]=10;
		         if(c[4]==0)
		           {c[4]=10;
			        if(c[3]==0)
		              {c[3]=10;
			           if(c[2]==0)
		                 {c[2]=10;
			             if(c[1]==0)
		                   {c[1]=10;}
			             }
			          }
			        }
		         }
		      }	  
}

display_fre()					//显示频率
{
  char j = 0;
  MakeDate(Frequence) ;		  //分离数字
  for(j=0;j<8;j++)
  {
   XBYTE[0x8100]=~(0x80>>j);         //选择数码管显示位数    
    XBYTE[0x8200]=DisplayBuffer[c[j]];	   //显示数字
	delay_1ms();
   }

 }

 keybord()
 {
   XBYTE[0x8200] = 0;
   if(P1_0 == 0)
    {
      Delay5Ms();
	  Delay5Ms();
	  Delay5Ms();
	  Delay5Ms();
	  Frequence = Frequence + 50;
	  write_N(Frequence);
     }
   
   else if(P1_1 == 0)
     {
	   Delay5Ms();
	   Delay5Ms();
	   Delay5Ms();
	  Delay5Ms();
	   Frequence = Frequence - 50;
	   write_N(Frequence);
     }
  }
 
/************************************** 
名称:main 
功能:主函数 
输入参数:无 
输出参数:无 
*************************************/ 
main()
{ 	
		//EA = 0;
        Set_all_Mc145170();  //一个函数把mc145170所有寄存器设置好  	

	while(1)
	{
	    display_fre();  
		keybord()  ;
	}

}



/*05级单片机板程序
main()
{ 
			EA = 0;
          Set_all_Mc145170();  //一个函数把mc145170所有寄存器设置好  	

	while(1)
	{
	      	 P3_7 = 1;
		 if(P3_2 == 0)
		  {
		     	 P3_7 = 0;
		     Delay400Ms() ;
			  Delay400Ms() ;
			 Frequence = Frequence + 100;
		
		  }
	
		   if(P3_3 == 0)
		  {
		     P3_7 = 0;
			 Delay400Ms() ;
			  Delay400Ms() ;
			 Frequence = Frequence - 100;
		
		  }
		 if(P3_4 == 0)
		  {
			      P3_7 = 0;
			     Delay400Ms() ;
				 
				 mc145170reset();
				Delay5Ms();
				writec(0x6f);
				Delay5Ms();
				write_R24(BaseFre);
				Delay5Ms();
				write_N(Frequence);
	//				ePutUint(15,1,Frequence);
				Delay5Ms();
		  }	
	}

}	*/

⌨️ 快捷键说明

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