📄 max525.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 + -