|
430f149+外设tlv61612位DA转换模块使用
[复制链接]
下面是换了5616这个12位的dc芯片做的,调了2个小时就通了啊有木有,简直不能忍。
上代码
〈还是先解释一下啊喂:p2.0口——DIN P2.1口——SCLK P2.2口——CS/ P2.3口——FS〉
时钟还是自己写比较靠谱
用了按键外部中断来改变写入5616的数字量,按键+-50
[objc] view plain copy
#include
#define uchar unsigned char
#define uint unsigned int
#define DA5616_clk_H P2OUT|=BIT1//P2.1
#define DA5616_clk_L P2OUT&=~BIT1//P2.1
#define DA5616_cs_H P2OUT|=BIT2//P2.2
#define DA5616_cs_L P2OUT&=~BIT2//P2.2
#define DA5616_fs_H P2OUT|=BIT3//P2.3
#define DA5616_fs_L P2OUT&=~BIT3//P2.3
uint data;
void int_clock()
{
uchar i;
BCSCTL1&=~XT2OFF; //外部高速时钟晶振
BCSCTL2|=SELM1 + SELS; //MCLK,SMLCK均用外部高速时钟
do
{
IFG1&=~OFIFG;
for(i=0;i<100;i++)
_NOP();
}while((IFG1&OFIFG));
IFG1 &=~OFIFG;
}
void io_init()
{
P2DIR=BIT3+BIT1+BIT2+BIT0;//P2.0 P2.1 P2.2 P2.3设置输出
}
/**** DA转换 ****/
void DA5616(uint da)
{
uchar i;
DA5616_cs_L;
DA5616_fs_L;
DA5616_clk_L;
for(i=0;i<16;i++)
{
P2OUT |=(da&0x8000)>>15;
DA5616_clk_H;
da<<=1; //da二进制数据左移一位 *2
DA5616_clk_L;
}
P2OUT&=0xfe;
DA5616_fs_H;
DA5616_cs_H;
}
void DA5616_out(float data1)
{
uint temp;
temp = data1*2048/2.5;
DA5616(temp);
}
void main()
{
// Stop watchdog timer to prevent time out reset
//关闭所有的IO口
P1DIR = 0XFF;P1OUT = 0XFF;
P2DIR = 0XFF;P2OUT = 0XFF;
P3DIR = 0XFF;P3OUT = 0XFF;
P4DIR = 0XFF;P4OUT = 0XFF;
P5DIR = 0XFF;P5OUT = 0XFF;
P6DIR = 0XFF;P6OUT = 0XFF;
P1IES = 0x30; // P1.0~P1.3选择下降沿中断
P1IE = 0x30; // 打开中断使能
P1DIR = BIT1; //设置P1.0~P.3为输入状态,P.7为输出
P1OUT = 0;
WDTCTL = WDTPW + WDTHOLD; //关狗
data = 1400;
int_clock();
io_init();
DA5616(data);
_EINT();
while(1)
{
}
}
/*******************************************
函数名称:Port1_ISR
功 能:端口P1的中断服务函数
参 数:无
返回值 :无
********************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
_DINT();
if(P1IFG & BIT4)
{
P1IFG = 0x00; //清中断标志
data -= 20; //DAC的输出减少100个偏置量
int_clock();
io_init();
DA5616(data);
}
else if(P1IFG & BIT5)
{
P1IFG = 0x00; //清中断标志
data += 20; //DAC的输出增加100个偏置量
int_clock();
io_init();
DA5616(data);
}
else
_NOP();
P1IFG = 0x00; //清中断标志
_EINT();
}
ok ~
|
|