1813|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

msp430f149+外设tlv61612位DA转换模块 [复制链接]

下面是换了5616这个12位的dc芯片做的,调了2个小时就通了啊有木有,简直不能忍。



上代码

〈还是先解释一下啊喂:p2.0口——DIN  P2.1口——SCLK  P2.2口——CS/  P2.3口——FS〉

时钟还是自己写比较靠谱

用了按键外部中断来改变写入5616的数字量,按键+-50



#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  ~


 
点赞 关注

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表