您的位置 首页 新能源

MSP430F149守时数据收集程序

#includemsp430x14x.h>#defineRS_HP5OUT

#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)
{ }
}

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/qiche/xinnengyuan/273032.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部