msp430单片机ad采样1khz信号,得到的多个数据如何存入flash,如何用12864显示信号幅度和频率?

作者&投稿:爱新觉罗冒 (若有异议请与网页底部的电邮联系)
如何实现12864显示430f149单片机AD采样的波形~

用msp430g2553+AD电压采集+12864功率显示
提示:msp430g2553+AD10电压采集+12864功率显示做的功率表 显然包括12864驱动和AD采集
//********************************************************************
//ADC12序列通道与D12864液晶模块显示程序
//********************************************************************
#include
#define CPU_F ((double)8000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
/*12864应用指令*/
#define CLEAR_SCREEN 0x01 //清屏指令:清屏且AC值为00H
#define AC_INIT 0x02 //将AC设置为00H。且游标移到原点位置
#define CURSE_ADD 0x06 //设定游标移到方向及图像整体右移,
#define FUN_MODE 0x30 //工作模式:8位基本指令集
#define DISPLAY_ON 0x0c //显示开,显示游标,且游标位置反白
#define DISPLAY_OFF 0x08 //显示关
#define CURSE_DIR 0x14 //游标向右移动:AC=AC+1
#define SET_CG_AC 0x40 //设置AC,范围为:00H~3FH
#define SET_DD_AC 0x80
#define P50 0
#define P51 1
#define P55 5
#define P56 6
#define P57 7
#define RS_CLR P5OUT &= ~(1 << P55) //RS置低
#define RS_SET P5OUT |= (1 << P55) //RS置高
#define RW_CLR P5OUT &= ~(1 << P56) //RW置低
#define RW_SET P5OUT |= (1 << P56) //RW置高
#define EN_CLR P5OUT &= ~(1 << P57) //E置低
#define EN_SET P5OUT |= (1 << P57) //E置高
#define PSB_CLR P5OUT &= ~(1 << P50) //PSB置低,串口方式
#define PSB_SET P5OUT |= (1 << P50) //PSB置高,并口方式
#define RST_CLR P5OUT &= ~(1 << P51) //RST置低
#define RST_SET P5OUT |= (1 << P51) //RST置高
#define DataPort P4OUT //P4口为数据口
uint Results[32]; //存放ADC的结果
uchar shuzi[] = {"0123456789.V"};
uchar ptr[6];
uint Average;
uint Temp;
ulong caltmp[4];
//*************************************************************************
// 系统时钟初始化
//*************************************************************************
void Clock_Init()
{
uchar i;
BCSCTL1&=~XT2OFF; //打开XT振荡器
BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ
do{
IFG1&=~OFIFG; //清除震荡标志
for(i=0;i<100;i++)
_NOP(); //延时等待
}
while((IFG1&OFIFG)!=0); //如果标志为1,则继续循环等待
IFG1&=~OFIFG;
}
//*************************************************************************
// MSP430内部看门狗初始化
//*************************************************************************
void WDT_Init()
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
}
//*************************************************************************
// 初始化IO口子程序
//*************************************************************************
void Port_init()
{
P4SEL = 0x00;
P4DIR = 0xFF;
P5SEL = 0x00;
P5DIR|= BIT0 + BIT1 + BIT5 + BIT6 + BIT7;
PSB_SET; //液晶并口方式
RST_SET; //复位脚RST置高
}
//***********************************************************************
// 显示屏命令写入函数
//***********************************************************************
void LCD_write_com(unsigned char com)
{
RS_CLR;
RW_CLR;
EN_SET;
DataPort = com;
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 显示屏数据写入函数
//***********************************************************************
void LCD_write_data(unsigned char data)
{
RS_SET;
RW_CLR;
EN_SET;
DataPort = data;
delay_ms(5);
EN_CLR;
}
//***********************************************************************
// 显示屏清空显示
//***********************************************************************
void LCD_clear(void)
{
LCD_write_com(0x01);
delay_ms(5);
}
//***********************************************************************
//函数名称:DisplayCgrom(uchar hz)显示CGROM里的汉字
//***********************************************************************
void DisplayCgrom(uchar addr,uchar *hz)
{
LCD_write_com(addr);
delay_ms(5);
while(*hz != '\0')
{
LCD_write_data(*hz);
hz++;
delay_ms(5);
}
}
//****************************************************************
// 显示屏初始化函数
//***********************************************************************
void LCD_init(void)
{
LCD_write_com(FUN_MODE); //显示模式设置
delay_ms(5);
LCD_write_com(FUN_MODE); //显示模式设置
delay_ms(5);
LCD_write_com(DISPLAY_ON); //显示开
delay_ms(5);
LCD_write_com(CLEAR_SCREEN); //清屏
delay_ms(5);
}
//*****************************************************************
//*****************************************************************
/*打开ADC*/
void ADC12(void)
{
P6SEL |=0X0f; //使能ADC通道
ADC12CTL0=ADC12ON+SHT0_15+MSC;//打开ADC,设置采样时间,多次转换
ADC12CTL1=SHP+CONSEQ_3;//使用采样定时器;多通道转换
ADC12MCTL0 |=INCH_0;//通道选择
ADC12MCTL1 |=INCH_1;
ADC12MCTL2 |=INCH_2;
ADC12MCTL3 |=INCH_10+EOS;//以EOS结束此次转换
ADC12IE=0X0F;//使能ADC中断
ADC12CTL0 |=ENC+ADC12SC;//使能转换;开始转换

_EINT();
}
/*ADC中断服务函数,各个通道转换值的存储*/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
caltmp[0]=ADC12MEM0;
caltmp[1]=ADC12MEM1;
caltmp[2]=ADC12MEM2;
caltmp[3]=ADC12MEM3;

}
//************************************************************************
void xian_shi(void)
{
int i,j,k,l;
Temp=(caltmp[0]*3300)/4095;//计算十进制的电压值
ptr[0]=Temp/1000;
ptr[2]=Temp%1000/100;
ptr[3]=Temp%100/10;
ptr[4]=Temp%10;
ptr[5]=11;
ptr[1]=10;
LCD_write_com(0x80);
DisplayCgrom(0x80,"一通道电压");
for(i=0;i<6;i++)
{
delay_ms(10);
LCD_write_data(shuzi[ptr]);
}

Temp=(caltmp[1]*3300)/4095;
ptr[0]=Temp/1000;
ptr[2]=Temp%1000/100;
ptr[3]=Temp%100/10;
ptr[4]=Temp%10;
ptr[5]=11;
ptr[1]=10;
LCD_write_com(0x90);
DisplayCgrom(0x90,"二通道电压");
for(j=0;j<6;j++)
{
delay_ms(10);
LCD_write_data(shuzi[ptr[j]]);
}

Temp=(caltmp[2]*3300)/4095;
ptr[0]=Temp/1000;
ptr[2]=Temp%1000/100;
ptr[3]=Temp%100/10;
ptr[4]=Temp%10;
ptr[5]=11;
ptr[1]=10;
LCD_write_com(0x88);
DisplayCgrom(0x88,"三通道电压");
for(k=0;k<6;k++)
{
delay_ms(10);
LCD_write_data(shuzi[ptr[k]]);
}
Temp=(caltmp[3]*3300)/4095;
ptr[0]=Temp/1000;
ptr[2]=Temp%1000/100;
ptr[3]=Temp%100/10;
ptr[4]=Temp%10;
ptr[5]=11;
ptr[1]=10;
LCD_write_com(0x98);
DisplayCgrom(0x98,"四通道电压");
for(l=0;l<6;l++)
{
delay_ms(10);
LCD_write_data(shuzi[ptr[l]]);
}
}
//***********************************************************************
// 主程序
//***********************************************************************
void main(void)
{
WDT_Init(); //看门狗设置
Clock_Init(); //系统时钟设置
Port_init(); //系统初始化,设置IO口属性
delay_ms(100); //延时100ms
LCD_init(); //液晶参数初始化设置
LCD_clear(); //清屏
delay_ms(100);
while(1)
{

ADC12();
delay_ms(10);
xian_shi();
}

}

那要看你AD采样是怎么设置的了。我之前做了一个ADC采集电压的程序,用滑动变阻器做的,感觉还可以。不过数值没有显示,用LED测试的,效果明显。

= =!
你就不知道来个数组啊。
先申请一个数组,data[]

然后采集一个就存储一个 data[i]=adcmen0;

程序什么的 还是你自己写吧。

在ad中断中读取 adcmen0 并存到数组或者flash中

一个例子
//*****************************************************************************
// MSP-FET430F261x Demo - ADC12, Single Channel Extended Sample, TA1 Trigger
//
// Description: Sample and convert A0 using Timer_A as sample trigger in
// Extended Sample mode. Put "Num_of_Results" ADC12MEM0 values in results[]
// and Light LED (P1.0) when done.
//
// MSP430F2618
// ---------------
// | |
// Vin -->|P6.0/A0 |
// | |
//
// R. B. Elliott / H. Grewal
// Texas Instruments Inc.
// Feb 2005
// Built with IAR Embedded Workbench Version: 3.21A
//*****************************************************************************
#include <msp430x26x.h>

#define Num_of_Results 512
int results[Num_of_Results] = {0};

void ADC_Init(void);

void main(void)
{
WDTCTL = WDTPW | WDTHOLD; //看门狗 失效
ADC_Init(); //初始ADC12
ADC12CTL0 |= ENC; // 开始转换
__bis_SR_register(LPM0_bits + GIE); // 进入LPM0
}

void ADC_Init(void)
{
P1DIR = 0xff; // set port to outputs 用来观察 无用
P1OUT = 0; // reset port outputs 无用
P6SEL |= 0x01; // select A0 input 设置采集的口
ADC12CTL0 = ADC12ON+REF2_5V+REFON; // Setup ADC12 各种设置
ADC12CTL1 = CONSEQ_2+SHS_1; // Timer triggers sampling 各种设置
ADC12MCTL0 = INCH_0 + SREF_1;
ADC12IE = 0x0001; // Enable ADC12IFG.0 中断使能

TACCR0 = 1500; // Delay to allow Ref to settle
TACCTL0 |= CCIE; // Compare-mode interrupt.
TACTL = TASSEL_1 | MC_1; // TACLK = ACLK, Up mode.
__bis_SR_register(LPM3_bits + GIE); // Wait for delay, Enable interrupts
TACCTL0 &= ~CCIE; // Disable timer

P2SEL |= BIT3; // Set for Timer A1
P2DIR |= 0x08;
TACCR0 = 7; // Init TACCR0 w/ sample prd=CCR0+1 设置ta 定时触发
TACCR1 = 4; // Trig for ADC12 sample & convert
TACCTL1 = OUTMOD_3; // Set/reset
TACTL = TACLR | MC_1 | TASSEL_1; // ACLK, clear TAR, up mode
}

// Timer_A0 Interrupt Service Routine
#pragma vector=TIMERA0_VECTOR
__interrupt void ta0_isr(void)
{
TACTL = 0;
__bic_SR_register_on_exit(LPM3_bits);
}

// ADC12 Interrupt Service Routine
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
static unsigned int index = 0; //一个不断进入中断 但是值保持的变量 重要

results[index++] = ADC12MEM0; // Move results 将的得道 的结果存到数组

if (index == 512)
{
ADC12CTL0 &= ~ENC; // Stop conversion 关ad
ADC12CTL0 = 0;
ADC12IE = 0;
index = 0;
P1OUT |= 0x01;
}
}


简述51单片机SFR中PSW,SP,DPTR的用途
1. PSW(程序状态字)用于存储单片机执行过程中的状态信息,它包含了条件码标志位、中断使能标志位以及其他控制标志位。这些信息通常在转移指令,如跳转、条件分支等操作中起到决定作用。2. SP(堆栈指针)指向当前堆栈的顶部位置。在单片机执行中断服务程序或子程序调用时,SP被用来保存下一条要执行的指令...

单片机知识!!!
10、假定,SP=60H,A=30H,B=70H,执行下列指令:PUSHA PUSHB 后,SP的内容为 62 ,61H单的内容为 30H ,62H单元的内容为 70H 。1、单片机与普通计算机的不同之处在于其将( CPU)、( 存储器 )、I\/O口(串口、并口等) 、ROM(程序存储器)集成于一块芯片上。2...

假设单片机的sp的值为43,执行一条lcall指令后,sp等于,求过程
SP先加1,后存数据到SP指向的地址。所以,执行LCALL 指令后,SP先加1,再把LCALL指令后面的指令的地址保存到堆栈中...

假设单片机的sp的值为43,执行一条lcall指令后,sp等于,求过程
SP还是43,LCALL执行时会改变SP,但执行后,SP会返回原值。除非在子程序中PUSH和POP不一致。

单片机上电复位后,pc的内容和sp的内容
一样的。在单片机中,上电复位后pc的内容和sp的内容是一样的。单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM。

当“SP被赋值后”单片机复位后其值应为多少?
SP值为07H。复位期间不产生ALET和~PSEN信号。复位后PC值为0000H。P0---P3口值为FFH。一、单片机简介:单片机(Microcontrollers)是一种集成电路芯片。单片机是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU、随机存储器RAM。单片机只读存储器ROM、多种I\/O口和中断系统、定时器\/计数器等功能...

单片机RAM中,sp的作用是什么
SP 指的是堆栈指针 详细解释如下:堆栈是一种数据结构,和他相类似的有队列。如果对数据结构有这样的要求:先将数据放到该区内,先放的后出后放的先出。这种结构这是堆栈。也就是说堆栈的数据操作口只有一端。它常用到回朔等算法当中,说到数据结构,当然就要提到算法。而队列的操作正好与之相反。先...

单片机指令
单片机指令功能一览表助记符 代码 说明MOV A,Rn E8~EF 寄存器AMOV A,direct E5 dircet 直接字节送AMOV A,@Ri ER~E7 间接RAM送AMOV A,#data 74...MOVX @Ri,A F2~F3 A送外部数据(8位地址)MOVX @DPTR,A F0 A送外部数据(16位地址)PUSH dircet C0 dircet 直接字节进栈,SP加1 POP dircet D0 ...

单片机中的pc和sp有什么关系?
单片机中的pc和sp没有什么任何关系,别往一块扯。PC是控制程序执行的,是16计数器。SP是堆栈指针,指向堆栈操作的单元地址,是8位计数器。

单片机中的SP设置问题
如果是51单片机的话上电后SP默认的是07h,寄存器组默认的是第一组就是00h-07h这8个单元,写程序的时候将自定义变量区设定在堆栈深度以外就可以了。一般是将4个寄存器组单元地址预留出来。

即墨市19319104931: msp430单片机的AD采样速率怎样控制?最高能达到200K吗?我做的最高只有128K啊 -
呈仲迪立: 一般AD芯片资料第一页都会写上采样率的,如果它没写能到200KPS,你肯定做不到啊.不过一般精度不高或者AD通道不多的,200K一般都能满足的吧. 有些芯片是需要通过对寄存器写值控制采样率的,如果这些工作都做好了.就是程序精简的问题了,有些转换是连续的,有些是需要你启动的.如果是用户启动转换的,那你在中途浪费了时间也是回是速率降低的

即墨市19319104931: 求助一个MSP430单片机的AD采样程序 -
呈仲迪立: 这个好办,你去www.ti.com上面下载它的代码库就可以了 只要稍微改动一下程序就可以了 你要知道采样的信号的频率是多少 这样才能比较合理的设置AD采样频率 //设置AD采样 ADC12CTL0 &= ~ENC; P6SEL |= 0x80; // Enable A/D channel A0 ...

即墨市19319104931: 用msp430f2618单片机实现单次ad采样的程序 -
呈仲迪立: 我看的书上的例子 如果是序列通道单次转换#include unsigned int results[4]; void main() { WDTCL = WDTPW + WDTHOLD; P6SEL =0x0f; ADC12CTL0 =MSC+ SHT_2 + ADCON; ADC12CTL1 = SHP + CONSEQ_1; ADC12MCLT0 = INCH_0; ...

即墨市19319104931: 用单片机做AD转换并存储数据,可以做到采样频率>=1MHz吗? -
呈仲迪立: 1MHz的采样频率是大了些,一般常用的AD转换芯片如ADC0804、ADC0808、ADC0809等,它们的采样频率一般都在500~600kHz,已经可以满足我们一般的需求了.如果你做的设备对转换速率要求不是很高的话,建议就用这几种转换器就可以了;如果要求转换速度很快的话,那么还是找找看其他采样频率高一些的转换器吧,不过这样成本就会增加.

即墨市19319104931: 追问:如何MSP430单片机实现DAC输出正弦波频率1HZ的步进啊??
呈仲迪立: 1 多大幅度的正弦波? 2 DAC的位数,频率是多少. 3 正弦波的采样点是多少? 假设正弦波采样点为1000sps. 方法思路是这样的,根据正弦波的频率,需要的采样,算出在1秒内正弦波都需要输出那些点.算出这些点对应的电压值.把这些电压值通过DAC输出,你就可以得到正弦波了.

即墨市19319104931: 430单片机能产生1MHz - 1.5MHz吗 -
呈仲迪立: ad采样频率跟晶振没有直接的关系,adc的时钟是从单片机内部时钟来的,外部时钟选取4MHz,8MHz都可以,有的单片机甚至支持20MHz等高频的晶振,在单片机内部设置倍频,分频等就可以获得需要的外设时钟频率.感觉你有些基本该概念没有弄清楚,建议采用一本基础全面带有实验的教程进行学习,或是找一套视频教程跟着做下来,这样会进步非常快.忘采纳!

即墨市19319104931: MSP430怎么使用AD1 -
呈仲迪立: 你的参考电压时怎么选的?1.5V/2.5?你用多路采集看一下.ADC12CTL1=SHP|CONSEQ_3; 还要在ADC12中断里设置,把6 port 的AD通道都打开,看一下是不是6.0 坏了.(430的6个模拟通道共用一个adc,不知道你为什么AD0坏了,这些channels的选择用的是多路复用器实现的,原则上是不可能坏)

即墨市19319104931: msp430f5529定时器捕获测量pwm波频率和占空比 -
呈仲迪立: //程序说明:使用内部内部时钟fosc/12产生周期为256us,占空比为25%的方波 #include #define uchar unsigned char #define uint unsigned int sbit d1=P1^0; sbit d2=P1^1; void PWM_init() { CMOD=0x00;//PCA计数脉冲选择内部时钟fosc/02(0x02:...

即墨市19319104931: 如何用MSP430单片机的AD功能测量信号的有效值 -
呈仲迪立: 一个周波内,定时采样,每隔采样值取平方 除以 一个周波的个数,然后再开根号.

即墨市19319104931: 为什么像有些单片机如MSP430有集成的A/D转换模块还要用外围的A/D芯片构建采集模块呢?
呈仲迪立: MSP430或其它单片机内建的ADC参数达不到要求,就需要外置的ADC芯片了.比如说,TI的MSP430有些型号所带的Sigma-Delta 16位ADC,仅有200SPS的采样率,就是每秒能采样200次,如果是做音频应用,例如44.1kHz采样率,它根本就无法支持了,所以需要外置.又比如有些MSP430带的是SAR结构的ADC12,但是应用上需要24位,所以也要外置.总结一下,影响选型的参数有:ADC结构(SD,SAR,SLOPE等),采样率,采样位数,甚至线性度.当这些特性不符合需要的时候,就只能外置了.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网