电路设计,软件开发,专业项目团队承接电子产品开发!


ISPRO下载型编程器
火爆销售中

RS232/TTL转换器
全IC串口窃电

RS232/TTL转换线
全IC串口窃电

ByteBlasterMV Cable
CPLD/FPGA并口下载线

ByteBlaster II Cable ISPRO下载型编程器
支持S51/AVR/PIC
超级51开发板套件
前卫实用超值

PC/MCU/CPLD
三合一学习套件

全新万年历方案
AVR单片机开发板
 

Min51单片机仿真机
迷你型

ARM7开发板
仅售260元!
 

RS-232/RS-485双向接口电平转换器  

51单片机升级STM32
火爆销售中
MPLAB-ICD2
火爆销售中
LED51开发板
玩具又名图文显示棒

面板模块/开发板
经济危机明智决择

       

GSM MODEM GSM猫

SMS短信模块 工业级/全自动
火爆销售中

大功率数传电台

高速数传电台

您当前位置:电子技术资料 -> 外围驱动 -> 片上ADC ->

祝您阅读愉快!

ISPRO下载型编程器

RS232 TO TTL转换器
↑↑本文相关产品介绍↑↑

MSP430f149 AD源程序


类别:技术文章
来源:未知
作者:未知
关键字:MSP430f149
加入日期:2010-8-4

//MSP430f149 AD源程序
//中国电子网 www.EC66.com
#include <MSP430x14x.h>

#define ADCMEM ((int *) 0x0140) //ADC12MEMx定义

void InitSYS(void);
void InitUST0(void); //初始化系统及ADC寄存器
void InitUST1(void);
void InitADC(void);
void SetZero(void);
int GetBusData(void);
void SetBusData(int busvdata);
void SendRomCode(void);
void Averege(void);
void Filter(void);
void Analysis(void);
void Delay(int delaydata);
interrupt[ADC_VECTOR] void ADC12(void);
interrupt[USART1RX_VECTOR] void USART1(void);

unsigned char savedata[1500];
unsigned char saveromdata[7];
unsigned char enddata[3];
unsigned int adtime;
unsigned int recromok;
unsigned int ave;
unsigned int datai;
unsigned int vdata;
unsigned int time;

void main(void) //使用中断方式
{
unsigned int i,busvdata,low,hi,ldata;
InitSYS();
InitUST0();
InitUST1();
InitADC();
P1DIR |= 0x20;
P1DIR |= 0x1c; //p1.4 p1.3 p1.2
P1OUT |= BIT4;
SetZero(); //设置x9015到零
for(i=0;i<30000;i++)
{ _NOP(); } //wait to sample
busvdata=GetBusData(); //
while(1)
{
SetBusData(busvdata);
busvdata=GetBusData();
if(busvdata<150)
{ break; }
}
IE2 |=URXIE1;
while(1)
{
// for(time=0;time<256;time++)
// {
//IE2 |=URXIE1;
//low=time;
recromok=0;
while(recromok!=1);
SendRomCode();
for(i=0;i<6500;i++)
{ _NOP(); } //wait to sample
ADC12CTL0 |= 0x02;
ADC12CTL0 |= 0x01; //start AD
adtime=0;
while(1)
{
if(adtime>1500)
{
ADC12CTL0 &= ~0x02;
Filter();
Averege();
Analysis();
for(i=0;i<3;i++)
{
U1TXBUF = enddata[i];
while((U1TCTL&0x01)==0);
}
/* if(enddata[0]==0x11)
{
for(i=0;i<1500;i++)
{
//ldata = savedata[i];
//low = ldata | 0x00;

U1TXBUF = savedata[i];//low;
while((U1TCTL&0x01)==0);
U1TXBUF = 0x00;;//low;
while((U1TCTL&0x01)==0);

//ldata = ldata>>8;
//hi = ldata | 0x00;
//U1TXBUF = hi;
// while((U1TCTL&0x01)==0);
}
} */
break;
}
//}
}
}
}

void SetZero(void)
{
int i;
P1OUT &= ~BIT4; //cs
P1OUT &= ~BIT3; //u/d
for(i=0;i<64;i++)
{
P1OUT ^= BIT2; //inc
}
P1OUT |= BIT4; //cs
}

int GetBusData(void)
{
unsigned char vdata1,vdata2;//,vdata;
adtime=0;
ADC12CTL0 |= 0x02;
ADC12CTL0 |= 0x01; //start AD
while(1)
{
if(adtime>20)
{
ADC12CTL0 &= ~0x02;
break;
}
}
//计算
vdata1=(savedata[0]+savedata[1]+savedata[2]+savedata[3]+savedata[4]
+savedata[5]+savedata[6]+savedata[7]+savedata[8]+savedata[9])/10;
vdata2=(savedata[10]+savedata[11]+savedata[12]+savedata[13]+savedata[14]
+savedata[15]+savedata[16]+savedata[17]+savedata[18]+savedata[19])/10;
vdata=(vdata1+vdata2)/2;
return(vdata);
}
void SetBusData(int busvdata)
{
int i;
unsigned int temp;
unsigned int movetime;
if(busvdata>150)
{
temp=busvdata-150;
movetime=(temp*20*3)/256/3;
P1OUT &= ~BIT4; //cs
P1OUT |= BIT3; //u/d
for(i=0;i<movetime+1;i++)
{
P1OUT ^= BIT2; //inc
}
P1OUT |= BIT4; //cs
}
}

void SendRomCode(void)
{
U0TXBUF = saveromdata[6];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[5];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[4];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[3];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[2];
while((U0TCTL&0x01)==0);
U0TXBUF = saveromdata[1];
while((U0TCTL&0x01)==0);
}

void Filter(void)
{
unsigned int i,j,m,a[3],ldata;
for(i=0;i<1500;i++)
{
a[0]=savedata[i];
a[1]=savedata[i+1];
a[2]=savedata[i+2];
for(j=0;j<2;j++)
{
for(m=1;m<3;m++)
{
if(a[m]>a[j])
{
ldata=a[j];
a[j]=a[m];
a[m]=ldata;
}

}
}
savedata[i]=a[1];
}
}

void Averege(void)//取5-20共15个得到总线电压值
{
unsigned int i,he;
he=0;
for(i=20;i<30;i++)
{
he=he+savedata[i];
}
ave=he/10;
}

void Analysis(void)
{
int delaytostart,start,error,n,aveadd,time32;
enddata[0]=0;
enddata[1]=0;
enddata[2]=0;
aveadd=ave+30; //问题:如果拉电流太小就达不到 200
datai=0;
while(1)
{
//==========================================
datai=datai+50;
delaytostart=0;
start=0;
error=0;
while(1)
{
time32=0;
if(savedata[datai]>aveadd)
{ time32++; }
if(savedata[datai+1]>aveadd)
{ time32++; }
if(savedata[datai+2]>aveadd)
{ time32++; }
if(savedata[datai+3]>aveadd)
{ time32++; }
if(savedata[datai+4]>aveadd)
{ time32++; }
if(time32>=4)
{ start=1; break; }
else if(delaytostart<700)
{ delaytostart++; datai++; }
else
{ error=1; break; }
}
if(error==1)
{ enddata[0]=0x11;enddata[1]=0x11;enddata[2]=0x22;break; }
if(start==1)
{
datai=datai+7;
for(n=1;n<9;n++)
{
switch(n)
{
case 1: datai=datai+16;break;
case 2: datai=datai+16;break;
case 3: datai=datai+17;break;
case 4: datai=datai+16;break;
case 5: datai=datai+16;break;
case 6: datai=datai+17;break;
case 7: datai=datai+16;break;
case 8: datai=datai+16;break;
}
time32=0;
if(savedata[datai]>aveadd)
{ time32++; }
if(savedata[datai+1]>aveadd)
{ time32++; }
if(savedata[datai+2]>aveadd)
{ time32++; }
if(time32>=2)
{
switch(n)
{
case 1: enddata[0] &= ~0x01;break;
case 2: enddata[0] &= ~0x02;break;
case 3: enddata[0] &= ~0x04;break;
case 4: enddata[0] &= ~0x08;break;
case 5: enddata[0] &= ~0x10;break;
case 6: enddata[0] &= ~0x20;break;
case 7: enddata[0] &= ~0x40;break;
case 8: enddata[0] &= ~0x80;break;
}
}
else
{
switch(n)
{
case 1: enddata[0] |= 0x01;break;
case 2: enddata[0] |= 0x02;break;
case 3: enddata[0] |= 0x04;break;
case 4: enddata[0] |= 0x08;break;
case 5: enddata[0] |= 0x10;break;
case 6: enddata[0] |= 0x20;break;
case 7: enddata[0] |= 0x40;break;
case 8: enddata[0] |= 0x80;break;
}
}
//datai=datai+6;
}
}
//=====================================================
datai=datai+50;
delaytostart=0;
start=0;
error=0;
while(1)
{
time32=0;
if(savedata[datai]>aveadd)
{ time32++; }
if(savedata[datai+1]>aveadd)
{ time32++; }
if(savedata[datai+2]>aveadd)
{ time32++; }
if(savedata[datai+3]>aveadd)
{ time32++; }
if(savedata[datai+4]>aveadd)
{ time32++; }
if(time32>=4)
{ start=1;break; }
else if(delaytostart<400)
{ delaytostart++; datai++; }
else
{ error=1;break; }
}
if(error==1)
{
enddata[1]=0x11;enddata[2]=0x22;break;
}
if(start==1)
{
datai=datai+7;
for(n=1;n<9;n++)
{
switch(n)
{
case 1: datai=datai+16;break;
case 2: datai=datai+16;break;
case 3: datai=datai+17;break;
case 4: datai=datai+16;break;
case 5: datai=datai+16;break;
case 6: datai=datai+17;break;
case 7: datai=datai+16;break;
case 8: datai=datai+16;break;
}
time32=0;
if(savedata[datai]>aveadd)
{ time32++; }
if(savedata[datai+1]>aveadd)
{ time32++; }
if(savedata[datai+2]>aveadd)
{ time32++; }
if(time32>=2)
{
switch(n)
{
case 1: enddata[1] &= ~0x01;break;
case 2: enddata[1] &= ~0x02;break;
case 3: enddata[1] &= ~0x04;break;
case 4: enddata[1] &= ~0x08;break;
case 5: enddata[1] &= ~0x10;break;
case 6: enddata[1] &= ~0x20;break;
case 7: enddata[1] &= ~0x40;break;
case 8: enddata[1] &= ~0x80;break;
}
}
else
{
switch(n)
{
case 1: enddata[1] |= 0x01;break;
case 2: enddata[1] |= 0x02;break;
case 3: enddata[1] |= 0x04;break;
case 4: enddata[1] |= 0x08;break;
case 5: enddata[1] |= 0x10;break;
case 6: enddata[1] |= 0x20;break;
case 7: enddata[1] |= 0x40;break;
case 8: enddata[1] |= 0x80;break;
}
}
//datai=datai+6;
}
}
//====================================================
datai=datai+50;
delaytostart=0;
start=0;
error=0;
while(1)
{
time32=0;
if(savedata[datai]>aveadd)
{ time32++; }
if(savedata[datai+1]>aveadd)
{ time32++; }
if(savedata[datai+2]>aveadd)
{ time32++; }
if(savedata[datai+3]>aveadd)
{ time32++; }
if(savedata[datai+4]>aveadd)
{ time32++; }
if(time32>=4)
{ start=1;break; }
else if(delaytostart<400)
{ delaytostart++; datai++; }
else
{ error=1;break; }
}
if(error==1)
{ enddata[2]=0x22;break; }
if(start==1)
{
datai=datai+7;
for(n=1;n<9;n++)
{
switch(n)
{
case 1: datai=datai+16;break;
case 2: datai=datai+16;break;
case 3: datai=datai+17;break;
case 4: datai=datai+16;break;
case 5: datai=datai+16;break;
case 6: datai=datai+17;break;
case 7: datai=datai+16;break;
case 8: datai=datai+16;break;
}
time32=0;
if(savedata[datai]>aveadd)
{ time32++; }
if(savedata[datai+1]>aveadd)
{ time32++; }
if(savedata[datai+2]>aveadd)
{ time32++; }
if(time32>=2)
{
switch(n)
{
case 1: enddata[2] &= ~0x01;break;
case 2: enddata[2] &= ~0x02;break;
case 3: enddata[2] &= ~0x04;break;
case 4: enddata[2] &= ~0x08;break;
case 5: enddata[2] &= ~0x10;break;
case 6: enddata[2] &= ~0x20;break;
case 7: enddata[2] &= ~0x40;break;
case 8: enddata[2] &= ~0x80;break;
}
}
else
{
switch(n)
{
case 1: enddata[2] |= 0x01;break;
case 2: enddata[2] |= 0x02;break;
case 3: enddata[2] |= 0x04;break;
case 4: enddata[2] |= 0x08;break;
case 5: enddata[2] |= 0x10;break;
case 6: enddata[2] |= 0x20;break;
case 7: enddata[2] |= 0x40;break;
case 8: enddata[2] |= 0x80;break;
}
}
//datai=datai+6;
}
}
//================================================================
break;
}//while(1)
}

void Delay(int delaydata)
{
unsigned long i;
for (i = delaydata; i > 0; i--);
}

void InitUST0(void)
{
U0CTL |= SWRST; // USART模块被允许
U0CTL &= ~SYNC;
U0CTL |= CHAR; // 8位字符
U0CTL |= SPB;

U0TCTL |= SSEL0+SSEL1; // ACLK
U0BR1 =0x0d; //0x0A; // 6MHz/2400baut
U0BR0 =0x05; //0x3D;
U0MCTL = 0x24; //06

ME1 |=UTXE0+URXE0; // 使能 USAR01 TXD/RXD
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
P3DIR |= 0x10; // P3.4 为输出
U0CTL &= ~SWRST;
//IE1 |=URXIE0;
}

void InitUST1(void)
{
U1CTL |= SWRST; // USART模块被允许
U1CTL &= ~SYNC;
U1CTL |= CHAR; // 8位字符
U1CTL |= SPB;

U1TCTL |= SSEL0+SSEL1; // SMCLK
U1BR1 =0x0d; //0x0A;// 6MHz/2400baut 8MHZ/2400baut//0d
U1BR0 =0x05; //0x3D; //05
U1MCTL =0x24; //12 //24

ME2 |=UTXE1+URXE1; // 使能 USAR01 TXD/RXD
P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
P3DIR |= 0x40; // P3.6 为输出
U1CTL &= ~SWRST;
}

interrupt[USART1RX_VECTOR] void USART1(void) //ADC中断处理程序
{
int romhe;
saveromdata[6]=saveromdata[5];
saveromdata[5]=saveromdata[4];
saveromdata[4]=saveromdata[3];
saveromdata[3]=saveromdata[2];
saveromdata[2]=saveromdata[1];
saveromdata[1]=saveromdata[0];
saveromdata[0]=U1RXBUF;
romhe=saveromdata[6]+saveromdata[5]+saveromdata[4]
+saveromdata[3]+saveromdata[2]+saveromdata[1];
romhe = romhe&0x00ff;
if(saveromdata[0]==romhe)
{
recromok=1;
//IE2 &=~URXIE1;
}
}


void InitADC(void)
{
P6SEL = 0xFF; // 所有P6口线均为ADC模块使用
ADC12CTL0 &=~ 0x02; // 在进行设置时首先复位ADC的转换使能
ADC12CTL0 = SHT0_7+MSC+ADC12ON; // 内部振荡器,置位MSC位,因此转换能自动进行
//6=24us 17.375pot 8=46us 9.065pot
//ADC12CTL1 = 0x0204; //0000 0010 0000 0100
// ADC12SC 位触发采样和保持
// 采样脉冲由采样定时器产生
// 时钟源:内部振荡器
// 时钟分频: 1
// 转换模式: 单通道、重复转换
// 选则参考电压和输入管脚
ADC12CTL1 = 0x021c; //0000 00 1 0 000 11 10 0 SMCLK
ADC12MCTL0 |= SREF_0; //Vr+=AVcc,;Vr-=AVss
ADC12MCTL0 |= INCH_3; //select anonalog input

ADC12IE = 0x01; // 使能通道10 转换完成后中断
ADC12CTL0 |= 0x02; // 使能ADC转换
}

interrupt[ADC_VECTOR] void ADC12(void) //ADC中断处理程序
{

ADCMEM[0]=ADCMEM[0]>>3;
savedata[adtime]=ADCMEM[0];
adtime++;
//P1OUT ^=BIT5;
}

void InitSYS(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD;
//WDTCTL = WDT_ADLY_250; // WDT 250ms, ACLK, interval timer
//IE1 |= WDTIE;
BCSCTL1 &= ~XT2OFF; // XT2晶振 0--open
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}while ((IFG1 & OFIFG)); // OSCFault flag still set?
BCSCTL2 |= SELM_2; // MCLK=XT2
BCSCTL2 |= SELS; // SMCLK=XT2
//FCTL2 = FWKEY + FSSEL0 + FN0; // MCLK/2 for Flash Timing Generator
_EINT();
}

/* //n=5
datai=datai+14;
for(n=1;n<9;n++)
{
switch(n)
{
case 1: datai=datai+30;break;
case 2: datai=datai+30;break;
case 3: datai=datai+31;break;
case 4: datai=datai+30;break;
case 5: datai=datai+30;break;
case 6: datai=datai+31;break;
case 7: datai=datai+30;break;
case 8: datai=datai+30;break;
}
*/


您可能还会关注的相关技术资料:
暂无

中国电子网
www.EC66.com
QQ:34740080 EMAIL:iloveaoe@163.com
最佳浏览:1024*768
Copyright (C) 2001-2010 EC66.COM All Rights Reserved
Aoe/帝国 制作维护
粤ICP备18061901号