基于MSP430F169的AD、DA控制程序

发布者:MysticGarden最新更新时间:2016-08-22 来源: eefocus关键字:MSP430F169  DA控制程序 手机看文章 扫描二维码
随时随地手机看文章
/*----------------程序说明------

//功能:
1、通过串口RS232发送数据到上位机,同时接收上位机的指令
2、发送AD转换的值到上位机,
3、上位机发送DA转换的数字量
---------------------------------*/
#include 
//变量定义 反馈字符串 
//Br009300380037001200000011ED
//unsigned char TX[28]={0x42,0x72,0x34,0x30,0x39,0x33,0x32,0x30,0x33,0x38,0x32,0x34,0x33,0x37,0x31,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x45,0x44};
unsigned char TX[42]={0x42,0x72,0x30,0x30,0x39,0x33,0x30,0x30,0x33,0x38,0x30,0x30,0x33,0x37,0x30,0x30,0x31,0x32,0x30,0x30,0x30,0x30,0x30,0x30,0x31,0x31,0x45,0x44,0x42,0x52,0x30,0x30,0x39,0x33,0x30,0x30,0x33,0x38,0x31,0x31,0x45,0x44};
unsigned char RX[14]={0x42,0x52,0x30,0x30,0x39,0x30,0x30,0x30,0x33,0x38,0x31,0x31,0x45,0x44};
//---设定字符串 -Br0093003811ED
#define   Num_of_Results   16
int results0[Num_of_Results],results1[Num_of_Results],results2[Num_of_Results],results3[Num_of_Results],results4[Num_of_Results];    //保存ADC转换结果的数组
int AD_HV,AD_mA,AD_FIL,AD_TEM,AD_PRE;
unsigned int average0,average1,average2,average3,average4;   //0~65535
char index0,index1,U0,U1,U2,U3,I0,I1,I2,I3,HV_ON,F_S,F_NEW;
//char index;
char j,k,rxdata0;//0~255

//---------软件延时子程序-------
void DELAY(int time)
{   
    int x,y;
    for(x=0;x<500;x++)
     {
      for(y=0;y     
     }
}

/********************主函数********************/
void main(void)
{
  //----------初始化---------
    WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗
  //----各口初始化--------
    P4DIR|=0XC3;//P4为一般的IO口执行简单输入输出功能
                 //P4.0-1为输出控制口高压开启、快慢速
                 //P4.2-5为指示信号输入
                 //P4.6-7为系统运行指示信号输出
    P4OUT&=~BIT0;
    P4OUT&=~BIT1;
  //------串口初始化-----
     UCTL0 = 0x11;                            // 8-bit character,SWRST =1
    P3DIR|=0x20;                              //p3.4-输出,p3.5-输入
                           
    UTCTL0 |= SSEL0;                          // UCLK = ACLK
    
    UBR00 = 0x03;                             // 32k/9600 - 6.83
    UBR10 = 0x00;                             //
    UMCTL0 = 0x4A;                            // Modulation
   
    //  UBR00 = 0x1B;                             // 32k/ 1200 - 13.65
    //  UBR10 = 0x00;                             //
    //  UMCTL0 = 0x03;                            // Modulation
      
    P3SEL |= 0x30;                            // P3.4,5 = USART0 TXD/RXD
    UCTL0 &= ~SWRST;                          // Initialize USART state machine
    ME1 |= URXE0 + UTXE0;                     // Enable USART0 T/RXD 
    IE1 |= URXIE0+UTXIE0;                     // Enable USART0 RX TX interrupt
   
    
    //--------AD初始化-----   
    P6DIR|=0XC0;     //P6.0-5为输入口(AD模拟量输入端口),P6.6-7为DAC输出口
    P6SEL |= 0xFF;                            // 使能P6口为ADC的模拟量输入,通道0,1或者DAC输出口
    ADC12CTL0 = ADC12ON+SHT0_15+MSC;          // 打开ADC,使用采样定时器0
                                               //采样时间为4*T*256
                                               //多次采样/转换 
    //ADC12CTL0 =REFON+REF2_5V;                  
    //ADC12CTL0 |=0X40;                          //启用内部参考电压2.5V
    ADC12CTL1 = SHP+CONSEQ_1;                 // 采样信号源自采样定时器
                                              //2-单通道多次转换
                                              //3-序列通道多次转化
                                              //1-序列通道单次转换
    //ADC12MCTL0=SREF_1;
   // ADC12MCTL1=SREF_1;  
    ADC12MCTL0=INCH_0;             //HVFB0
    ADC12MCTL1=INCH_1;             //mAFB
    ADC12MCTL2=INCH_2;             //FIL0
    ADC12MCTL3=INCH_3;             //TEM0
    ADC12MCTL4=INCH_4+EOS;         //PRE0
    ADC12IE = 0x10;                           // A4使能ADC中断()
    ADC12CTL0 |= ENC;                         // 使能转换
    ADC12CTL0 |= ADC12SC;                     // 开始转换  
    F_NEW=0XAA;
    
    //-----DA 初始化------
    DAC12_0CTL=DAC12AMP_5+DAC12ENC+DAC12IR; 
    //DAC12_0DAT=0X03FF;
    DAC12_0DAT=0X00FF;
    DAC12_1CTL=DAC12AMP_5+DAC12ENC+DAC12IR;
    //DAC12_1DAT=0X0FFF;
    DAC12_1DAT=0X00FF;
     _EINT();                              //允许全局中断
  //   LPM1;  
    while(1)
    {
     //循环检测输入的故障标识位,以及输出串口是否正常工作标识(S1S2是否闪烁) 
      
     if((P4IN&0X04)==0x04)   //P4的D2位为1说明高压已开启
      {TX[22]=0X01 ;}
     else
      {TX[22]=0X00 ;} 
     if((P4IN&0X08)==0x08)   //P4的D3位为1说明灯丝已开启
      {TX[23]=0X01 ;}    
     else
     {TX[23]=0X00 ;}
     if((P4IN&0X10)==0x10)   //P4的D4位为1说明电源发生故障1
     {TX[24]=0X01 ;}    
     else
     {TX[24]=0X00 ;}   
    if((P4IN&0X20)==0x20)   //P4的D5位为1说明电源发生故障2
     {TX[25]=0X01 ;}    
     else
     {TX[25]=0X00 ;}
  //点亮指示灯、
     P4OUT |= BIT6;
     P4OUT |= BIT7;
     
 //更新电源设定
     
            DAC12_0DAT=(U0-0X30)*1000+(U1-0X30)*100+(U2-0X30)*10+(U3-0X30);
            DAC12_1DAT=(I0-0X30)*1000+(I1-0X30)*100+(I2-0X30)*10+(I3-0X30);
             if(HV_ON==0X31)   //1-开启高压
              {P4OUT|=BIT0;}
             else
              {P4OUT&=~BIT0;}    //关闭高压
             if(F_S==0X31)    //快速
              {P4OUT|=BIT1;}  
              else
              {P4OUT&=~BIT1;}    
 //更新上传数据
       //ADC12CTL0 &=~ ENC;  
             if(F_NEW==0X55)
             {
                 ADC12CTL0 &=~ ENC;  
                 if(index0 == Num_of_Results-1)
                    {
                       char i;
                       average0 = 0;
                       average1 = 0;
                       average2 = 0;
                       average3 = 0;
                       average4 = 0;
                      for(i = 0; i < Num_of_Results; i++)
                        {
                         average0 += results0[i];
                         average1 += results1[i];
                         average2 += results2[i];
                         average3 += results3[i];
                         average4 += results4[i];
                         }
             
                
                         AD_HV=average0 >>= 4;                            //除以16
                         AD_mA=average1 >>= 4;                            //除以16
                         AD_FIL=average2 >>= 4; 
                         AD_TEM=average3 >>= 4; 
                         AD_PRE=average4 >>= 4;
                         
                         TX[2] = AD_HV / 1000; 
                         TX[3] = (AD_HV - TX[2]*1000)/100;
                         TX[4] = (AD_HV - TX[2]*1000 - TX[3]*100)/10;
                         TX[5] = (AD_HV -TX[2]*1000 - TX[3]*100 - TX[4]*10);  
                         TX[6] = AD_mA / 1000; 
                         TX[7] = (AD_mA - TX[6]*1000)/100;
                         TX[8] = (AD_mA - TX[6]*1000 - TX[7]*100)/10;
                         TX[9] = (AD_mA - TX[6]*1000 - TX[7]*100 - TX[8]*10); 
       
                         TX[10] = AD_FIL/ 1000; 
                         TX[11] = (AD_FIL - TX[10]*1000)/100;
                         TX[12] = (AD_FIL - TX[10]*1000 - TX[11]*100)/10;
                         TX[13] = (AD_FIL - TX[10]*1000 - TX[11]*100 - TX[12]*10); 
        
                         TX[14] = AD_TEM / 1000; 
                         TX[15] = ( AD_TEM - TX[14]*1000)/100;
                         TX[16] = ( AD_TEM - TX[14]*1000 - TX[15]*100)/10;
                         TX[17] = ( AD_TEM - TX[14]*1000 - TX[15]*100 - TX[16]*10); 

                         TX[18] =  AD_PRE / 1000; 
                         TX[19] = (AD_PRE - TX[18]*1000)/100;
                         TX[20] = (AD_PRE - TX[18]*1000 - TX[19]*100)/10;
                         TX[21] = (AD_PRE - TX[18]*1000 - TX[19]*100 - TX[20]*10);    
                         
                         
                         
                         
                    }
             index0 =(index0 +1)%Num_of_Results;
               F_NEW=0XAA;
              ADC12CTL0 |= ENC;
              ADC12CTL0 |= ADC12SC;                     // 开始转换 
              
             } 
               
       
      // ADC12CTL0 |= ENC;      
             
    //DELAY(15);
     
     
     
       
    }
    
    
    
    
}

#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
  //ADC12IE = 0x00;
    //DELAY(2);
  if(F_NEW==0XAA)
  {
    results0[index0] = ADC12MEM0;               // Move results
    results1[index0] = ADC12MEM1;               // Move results
    results2[index0] = ADC12MEM2;
    results3[index0] = ADC12MEM3;
    results4[index0] = ADC12MEM4;
                F_NEW=0X55;
  
  }
  _NOP();
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
        rxdata0= RXBUF0;
  
        
        
  //赋值前检验是否为合法首字母,合法再赋值
        RX[k]=rxdata0;
        if(RX[0]==0x42)
      {
     //   TX[8+k]=rxdata0;
          //输出接收到的值
          TX[28+k]=rxdata0;
          k++;
        if(k==14)
        {
         k=0;
         //验证接收是否有效

          if(RX[0]==0x42&&RX[1]==0x52&&RX[12]==0x45&&RX[13]==0x44)//检验数据是否正确
          //if(RX[0]==0x42&&RX[1]==0x72)
          {
           //P4OUT|=BIT0;    
            U0=RX[2];
            U1=RX[3];
            U2=RX[4];
            U3=RX[5];
            I0=RX[6];
            I1=RX[7];
            I2=RX[8];
            I3=RX[9];
            HV_ON=RX[10];
            F_S=RX[11];
      
          }
        
        }
      }
              
        
 //熄灭指示灯
  P4OUT &= ~BIT6;      
     
}
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{
       if(j>1&&j<=25)
        {TXBUF0 = TX[j]+0x30;}
         else
         {TXBUF0 = TX[j];} 
      // TXBUF0 = TX[j];
           j++; 
         // if(j==28)
           if(j==42)
            {j=0;}
   //熄灭指示灯
   P4OUT &= ~BIT7;        
          
}

关键字:MSP430F169  DA控制程序 引用地址:基于MSP430F169的AD、DA控制程序

上一篇:MSP430的高质量代码编写
下一篇:一种基于低功耗单片机SN8P2711A的移动电源设计

推荐阅读最新更新时间:2024-03-16 15:06

DDS芯片AD9832的原理及应用
    摘要: AD9832是AD公司生产的直接数字频率合成器。它体积小、重量轻、操作方便,同时具有极高的频率辩率。文章介绍了直接数字频率合成器(DDS)AD9832的原理,分析了AAD9832的内部结构、引脚功能以及在高频测试仪中的应用。     关键词: 直接数字频率合成器 DDS AD9832 高频测试仪 直接数字频率合成是一种新的频率合成技术和信号产生方法。直接数字频率合成器(DDS)具有超高速的频率转换时间,极高的频率分辨率和较低的相位噪声,在频率改变与调频时,DDS器件能够保持相位的连续,因此很容易实现频率、相位和幅度调制。此外,该器件还具有可编程控制的突出优点。因此,直接数字频率合成器得到了越来
[半导体设计/制造]
嵌入Linux的ARM9处理器LPC3250与16位AD采样芯片
本文针对数据采集与处理系统的应用需求,设计了嵌入Linux的ARM9处理器LPC3250与16位AD采样芯片MAX1303的硬件接口和驱动程序。首先,描述了LPC3250和MAX1303的性能、特点以及硬件接口电路设计方案。然后,在硬件平台的基础上,详细地阐述了嵌入式Linux下MAXl303驱动程序的组成模块和具体实现方法,并给出了部分源代码以及对设备驱动的测试方法。测试结果表明,系统工作正常、稳定,采样结果正确,具有实际工程应用价值。 在数据采集系统中,通常是通过传感器将自然世界的物理量转化成电量,电量是模拟量,必须经过模/数转换才能被系统的处理器读取。现在的很多微处理器都有片内AD,但这些AD多数是8位、10位或者1
[单片机]
嵌入Linux的ARM9处理器LPC3250与16位<font color='red'>AD</font>采样芯片
采用单片机AT89C2051和AD7416芯片实现多路温湿度循环检测系统的设计
1、引言 AD7416器件结构 AD7416采用节省空间的SO-8和小型SOIC封装。 2 、系统软硬件设计 2.1 硬件设计 用单片机AT89C2051来实现对AD7416的信号采集和输出控制,硬件设计简单可靠,系统温度节点可扩展性强。为确保系统不受电源波动的干扰,采用电源电压监视器TL7705A作系统复位控制器。如果AD7416要装在离电源较远处,AD7416必须用一个0.1μF的陶瓷电容接在+VS和地之间去耦。 如所有的I2C兼容器件一样,AD7416有一个7位串行地址。这个地址的高4位设定为1001,而低3位可由用户通过将A2~A0脚连接到无论是+VS或GND来设置。通过它们不同的设定地址,可将多达8个AD741
[单片机]
采用单片机AT89C2051和<font color='red'>AD</font>7416芯片实现多路温湿度循环检测系统的设计
ADI推出双路时钟转换器AD9559
Analog Devices, Inc.最近推出一款完全可编程的抖动衰减双路时钟转换器IC(集成电路)AD9559,以满足高速光纤传输网络(OTN) 应用和高密度线路卡的时序要求。AD9559 四输入多服务线路自适应时钟转换器可同时支持不同的标准频率,适合各种有线通信应用,包括同步以太网、SONET/SDH、1/10/100G以太网、光纤通道,以及其他需要低抖动、高灵活性及快速上市的应用。AD9559转换器IC可将任何标准输入频率同步转换为高达1.25 GHz 的任何标准输出频率,12 kHz至20 MHz集成带宽范围内的总抖动小于 400 fs RMS(均方根)。AD9559用单芯片IC取代了两个同步时序器件,有助于设计人员减小
[网络通信]
MSP430F169(三) ---- 使用UART实现PC与单片机的数据收发并在1602 液晶显示
本代码需要注意的细节 每次字符串的发送时间至少间隔三秒,发送的字符的数量最好在32个以内,防止数据接收不全。 本代码波特率的设置为1200.如果波特率设置过高,会出现数据接收不全的问题。我试过9600的波特率,会出现问题。读者可以自行修改代码,实现更高的传输速率。 有关的细节会在代码中说明 代码实现 主函数 #include msp430f169.h #include Config.h #include LCD.h #include Init.h #include UART.h //#include stdlib.h 本来想用全局指针来存储接收的数据 // 结果发现自己用不来....
[单片机]
TQ2440 AD中断方式采集数据
经过不懈的努力 发现自己的错误在于不知道ADC的中断有两个子中断 2440的ADC中断包括INT_ADC_S和INT_TC 需要先处理一下子中断INT_ADC_C 再处理INT_ADC 另外要感谢21icbbs上的网友hbicecream的帮助 我才想起来Uart_Printf函数也是需要中断的 所以最好不要在中断服务程序中使用Uart_Printf 最终整理的程序如下: 使用的板子为TQ2440 #define EnableIrq(bit) rINTMSK &= ~(bit) #define DisableIrq(bit) rINTMSK |= (bit) #define Ena
[单片机]
STC12C5410AD学习板---AD按键测试程序
/************ STC12C5410AD学习板 ******************/ /*功能描述:AD按键练习 */ /*作者:郑 文 ClimberWin */ /*编写时间:2008.8.15 */ /*功能:采集按键电压;分配键值,并把键值传给PC机 */ /*外部晶振22.1184 MHZ */ /*把波特率设置为51的12倍,现在波特率 115200 */ /*注意:需要测得实际电源电压作为参考电压 */ /*L7805稳压在4.88-4.98V之间,根据实际测量确定电压 */ /
[单片机]
STC12C5410<font color='red'>AD</font>学习板---<font color='red'>AD</font>按键测试程序
低电压轨-轨运算放大器AD8517/AD8517
    摘要: AD8517/AD8527是美国AD公司出品的轨-轨运算放大器。它体积小,功耗低,并具有宽带轨-轨输出,故可广泛应用于便携通讯、有源滤波器及ASIC输入驱动等领域。文中介绍了AD8517/AD8527的引脚功能、工作原理和几种实际应用电路。     关键词: 轨-轨输出 宽带 低功耗 AD8517 AD8527 1 概述 AD8517/AD8527是美国AD公司的出口的轨-轨运算放大器。AD8517采用单通道SOT-23-5封装;而AD8527则为双通道8脚MSOP封装。由于AD8517/AD8527体积小巧,因此可以应用在传感器附近,以减少外部干扰的引入。 AD8517/AD8527
[半导体设计/制造]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved