1324|0

3836

帖子

19

TA的资源

纯净的硅(中级)

楼主
 

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  ~

 
点赞 关注

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表