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

📄 max525.c

📁 MAX525子程序,实现12位高精度串行DA转换
💻 C
字号:
/*********************************dac525注意:CL要接高电平,不然没数据输出*******************************/
#include<absacc.h>						//绝对地址访问函数
#include<math.h>						//各种不同类型的数学函数
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int 
#define  delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
/***********************************************MAX525*************************************************/
#define  CH_A  0x00       //通道A
//#define  CH_B  0x01       //通道B
//#define  CH_C  0x02       //通道C
#define  CH_D  0x03       //通道D 
sbit DIN=P0^5;
sbit CS=P0^4;
sbit SCLK=P0^6;
#define HOLD_A 0x0001	 //将数据存于寄存器中,但是不进行DA转换
#define HOLD_B 0x0005
#define HOLD_C 0x0009
#define HOLD_D 0x000d
#define CHANGE_A 0x0003	 //将数据存于寄存器中,并且进行DA转换
#define CHANGE_B 0x0007
#define CHANGE_C 0x000b
#define CHANGE_D 0x000f
#define ALL_CHANGE 0x0004

/*******************************************************************************************************/
/*MAX525完成两路DAC模拟电压输出,待转换的12位二进制数据分别存放在变量dacdac1,dacdac2中*/
void dac(unsigned int dacdata1,dacdata2)	   //dacdata1为4位的控制字,dacdata2为数据
{
  uchar a=0;
  unsigned int dacdatrfer=0;
  SCLK=0;
  CS=0;					//片选CS端置低电平
for(a=0;a<4;a++)
{
SCLK=0;			
dacdatrfer=dacdata1;
if((dacdatrfer>>(3-a))&0x01) DIN=1;
else DIN=0;
SCLK=1;							//时钟上升沿触发
}
for(a=0;a<12;a++)
{
SCLK=0;
dacdatrfer=dacdata2;
if((dacdatrfer>>(11-a))&0x01) DIN=1;
else DIN=0;
SCLK=1;
}
CS=1;
}	  	
/******************************************************************************************/
 //===========================================MAX1247转换===========================================//
//--------------------------------------------------------------------------------------------------
// 函数名称:MAX525
// 入口参数:channel:通道选择。CH_A为通道A,CH_B为通道B,CH_C为通道C,CH_D为通道D,
//           Data:   送DA转换的12位数据。
// 返回值:  无
// 函数功能:向任一通道的输入寄存器送入要转换的数据。启动一次DA转换,更新所有DAC寄存器的值。 
//--------------------------------------------------------------------------------------------------

/*void MAX525(uchar channel,uint Data)
{
  uchar i;
  switch (channel)
    {
	  case 0:  Data=0x3000+(Data&0x0fff);      //选择通道A
	           break;
	  case 1:  Data=0x7000+(Data&0x0fff);      //选择通道B
	           break;
	  case 2:  Data=0xb000+(Data&0x0fff);      //选择通道C
	           break;
	  case 3:  Data=0xf000+(Data&0x0fff);      //选择通道D
	           break;
	  default: Data=0x3000+(Data&0x0fff);      //默认选择通道A
	           break;
	}

  CS=0;                                     //选中DA
  SCLK=0;
  for(i=0;i<16;i++)                            //送控制命令字
    {
	    SCLK=0;					               

	    if (Data >= 0x8000)
		  DIN=1;
		else
		 DIN=0;
		Data = Data << 1;                      //控制字左移一位		
		
		SCLK=1;				                   //时钟上升沿向DA送入一位数据
	}
  CS=1;                                     //写控制字结束,将DA片选端拉高
}				*/

			 //--------------------------------------------------------------------------------------------------
// 函数名称:MAX525_MUL
// 入口参数:channel:通道选择。CH_A为通道A,CH_B为通道B,CH_C为通道C,CH_D为通道D,
//           Data:   送DA转换的12位数据。
// 返回值:  无
// 函数功能:向任一通道的输入寄存器送入要转换的数据,但各通道的DAC寄存器的值不变。
// 备注:    此函数用于DA多路同时转换。如:要让A、B两通道同时进行转换。用如下程序即可:
//           MAX525_MUL(CH_A,0x07ff);  MAX525(CH_B,0x07ff);
//--------------------------------------------------------------------------------------------------
/*void MAX525_MUL(uchar channel,uint Data)
{
  uchar i;
  switch (channel)
    {
	  case 0:  Data=0x1000+(Data&0x0fff);      //选择通道A
	           break;
	  case 1:  Data=0x5000+(Data&0x0fff);      //选择通道B
	           break;
	  case 2:  Data=0x9000+(Data&0x0fff);      //选择通道C
	           break;
	  case 3:  Data=0xd000+(Data&0x0fff);      //选择通道D
	           break;
	  default: Data=0x1000+(Data&0x0fff);      //默认选择通道A
	           break;
	}

  CS=0;                                     //选中DA
  SCLK=0;
  for(i=0;i<16;i++)                            //送控制命令字
    {
	    SCLK=0;					               

	    if (Data >= 0x8000)
		  DIN=1;
		else
		  DIN=0;
		Data = Data << 1;                      //控制字左移一位		
		
		SCLK=1;				                   //时钟上升沿向DA送入一位数据
	}
  CS=1;                                     //写控制字结束,将DA片选端拉高
}					*/
/*****************************************************************************************/
main()
{ 
  while(1)
  { 
  //MAX525_MUL(CH_A,0x07ff);                     //向通道A送入要转换的数据,但不更新DAC寄存器的值。
 // MAX525(CH_D,0x07ff);                         //向通道B送入要转换的数据,启动DA,更新所有DAC寄存器的值。
 dac(15,1024) ;
  }
}				

⌨️ 快捷键说明

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