⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 msp430f149datacollection.txt

📁 MSP430F149的数据采集程序
💻 TXT
字号:
#include <msp430x14x.h>

#define RS_H        P5OUT |=BIT3        //Data Register is selected
#define RS_L        P5OUT &=~BIT3        //Instruction Register is selected
#define READ        P5OUT |= BIT2        //读LCD
#define WRITE      P5OUT &= ~BIT2      //写LCD
#define EN_H        P5OUT |= BIT1        //Enable  Read/Write Operation 
#define EN_L        P5OUT &=~BIT1        //Disable Read/Write Operation

unsigned char a[]="AD&DA change!"; 
int AD_result;
void Init_CLK(void);  //时钟初始化函数
void Init_ADC(void);  //AD转换函数
void Init_TimerA(void); 
void DATransfer(unsigned DA_data);//DA转换子函数
void Init_Port()
{
    P3SEL=0x00;    //LCD所需端口设置
    P3DIR=0xFF;
    P3OUT&=~BIT5;  //74HC245的DIR为低电平,输入方向由B端到A端
  
    P5SEL=0x00;    //P5输出
    P5DIR=0xFF;
    P5OUT=0x00;
  
    P4SEL=0x00;    //P4输出
    P4DIR=0xFF;
    P4OUT=0x00;
    
    P6SEL=0xF0;    //P6.4-p6.5作为AD输入通道,P6.0-P6.3作为一般的IO口
    P6DIR=0xFF;    
    P6OUT=0x00;
}

void Delay(unsigned int i)  //延时子程序
{                
  while(i--);              //延时时间为i*5+6个时钟周期
}

void Write_Command(unsigned char command )        
{
  P4OUT=command;
  RS_L;  //选择程序寄存器
  WRITE;  //允许写操作
  EN_H;  //液晶使能
  Delay(50);//延时
  EN_L;  //液晶读写操作禁止
  Delay(50);
} 

void Write_Data(unsigned char data )        
{  
  P4OUT=data;
  RS_H;  //选择数据寄存器
  WRITE;  //允许写操作
  EN_H;  //液晶使能
  Delay(50); //延时
  EN_L ;  //液晶读写操作禁止
  Delay(50);
}

void Clear_Second_Line()    //用于删除2*16字符液的晶第二行的函数
{
  int i=16;
  Write_Command(0xC0);    //设置DDRAM的初始地址
  while(i--)
  {
  P4OUT=0x20;
  RS_H;  //选择数据寄存器
  WRITE;  //允许写操作
  EN_H;  //液晶使能
  Delay(50); //延时
  EN_L ;  //液晶读写操作禁止
  Delay(50);
  }
}

void Init_LCD(void)
{
  
  Write_Command( 0x38  );//8位总线接口,双行显示,5*7点阵型
  Delay(100);
  Write_Command(0x0F);//开显示,开光标,光标闪烁
  Delay(100);
  Write_Command(0x01);//清屏,将空格字符ASCII码20H写入到所有的DDRAM单元
  Delay(2500);
  Write_Command(0x06);//设置进入方式,DDRAM自增,整个显示右移
  Delay(100);
  Write_Command(0x80);//设置DDRAM的初始地址
  
}

void Init_ADC(void)
{
    //P6SEL = BIT7;              //设置P6.7为模拟输入A7                
    ADC12CTL0 &= ~(ENC);        //设置ENC为0,从而可以修改ADC12寄存器的值        
    ADC12CTL0 += ADC12ON+MSH;  //开A/D转换,允许多次采样
    ADC12MCTL7 = EOS+INCH_7;//ADC12MCTL7的输入通道为A7,参考电压分别为AVSS和AVCC        
    ADC12CTL1 = 0X00;          //转换的起始地址为:ADCMEM7
    ADC12CTL1 = CSTARTADD0+CSTARTADD1+CSTARTADD2;
    ADC12CTL1 += SHP;              //采样脉冲来自采样定时器
    ADC12CTL1 += CONSEQ_2;      //单通道多次转换
    ADC12CTL1 += ADC12SSEL0;    //ADC12内核时钟源为ACLK

    ADC12IE = 0x00;            //关闭各个通道的转换中断                  
    
    ADC12CTL0 |= ENC;              //使能ADC转换            
    return;
}

void Init_TimerA(void)
{
    
    TACTL = TASSEL0 + TACLR;    // 选择ACLK:32K,清除TAR
    
    TACTL +=ID1;                // 1/8 SMCLK                  
    TACTL +=ID0;      
    CCTL0 = CCIE;              // CCR0 中断允许
    
    CCR0 = 2000;                // 时间间隔为 0.5S
    
    TACTL |= MC0;              // 增记数模式            
    return;
}
void Init_CLK(void)
{
    unsigned int i;
    BCSCTL1 = 0X00;            //将寄存器的内容清零
                        //XT2震荡器开启
                        //LFTX1工作在低频模式
                        //ACLK的分频因子为1
                            
    do 
    {
    IFG1 &= ~OFIFG;                      // 清除OSCFault标志
    for (i = 0x20; i > 0; i--);                
    }
    while ((IFG1 & OFIFG) == OFIFG);          // 如果OSCFault =1  
                            
    BCSCTL2 = 0X00;            //将寄存器的内容清零
    BCSCTL2 += SELM1;            //MCLK的时钟源为TX2CLK,分频因子为1
    BCSCTL2 += SELS;            //SMCLK的时钟源为TX2CLK,分频因子为1
}

#pragma vector=TIMERA0_VECTOR    //定时器A0的中断函数
__interrupt  void TimerA_ISR(void)
{                  
    float AD_data;
    char a;
    char b;
    int m;
    int n;
    // 读出转换结果
    P5OUT^=BIT6;
    while((ADC12IFG & BIT7)==0)  ; //判断有没有转换结束
    _NOP();
    ADC12CTL0 &= ~ENC;            // 关闭转换
    P5OUT^=BIT5;    
    AD_result = ADC12MEM7;        //读到AD转换的12位二进制数
    DATransfer(AD_result);
    if((ADC12IFG & BIT7)==0)      
    {P5OUT^=BIT4;}
    AD_data=AD_result*3.3/4095;  //将读到的12位二进制数转化为对应的电压
    m=(int)AD_data;
    n=(int)(AD_data*10-m*10);
    a=48+m;                      //将符点型的电压值转化为字符数,便于液晶显示 
    b=48+n;
    Clear_Second_Line();          //删除16*2字符液晶的第二行数据
    Write_Command(0x06); // 设置液晶进入方式,DDRAM自增,整个显示右移
    Delay(100);          
    Write_Command(0xC0); //设置液晶DDRAM的初始地址  
    Write_Data(a); 
    Delay(100);
    Write_Command(0x06);//设置进入方式,DDRAM自增,整个显示右移
    Write_Data('.');  
    Delay(100);
    Write_Command(0x06);//设置进入方式,DDRAM自增,整个显示右移
    Delay(100);
    Write_Data(b);    
    ADC12CTL0 |= ENC;          // 允许AD转换
    ADC12CTL0|=ADC12SC;        //开始新的转换            
}

void DATransfer(unsigned DA_data)    //DAC转换子程序
{
  int i;
  unsigned int da_data;
  P6OUT&=~BIT0;                //CS为低电平
  for(i=0;i<16;i++)
  {
    P6OUT&=~BIT2;              //SCLK为低电平
    P6OUT&=~BIT1;
    da_data=0x3000+(DA_data&0x0fff);  //送入待转换的数字量,并选中A通道输出
    da_data=((da_data>>(15-i))&0x0001)<<1;
    P6OUT|=da_data ;          //输出一位二进制数    
    Delay(10);
    P6OUT|=BIT2;                //SCLK为高电平
    Delay(10);      
  }
  P6OUT&=~BIT2;                //SCLK为低电平                              
  P6OUT|=BIT0;                //CS为高电平,开始转换数据
  Delay(10);
}


void main(void)
{ 
  WDTCTL = WDTPW + WDTHOLD;    // 关闭看门狗
  _DINT();                    // 关闭中断      
  Delay(50000);
  Init_Port();
  Init_LCD();
  Init_CLK();                // 初始化
  Init_ADC();
  Init_TimerA();
  _EINT();                    // 打开中断

  for(unsigned int i=0;a!='\0';i++)
    {
        Write_Data(a);    
    }
  P5OUT|=BIT7;
  ADC12CTL0 |=ADC12SC; 
  
  while(1)
    {  }
} 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -