msp430g2553多路数据采集器.doc_第1页
msp430g2553多路数据采集器.doc_第2页
msp430g2553多路数据采集器.doc_第3页
msp430g2553多路数据采集器.doc_第4页
msp430g2553多路数据采集器.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

基于MSP430G2553的多路数据采集班级:科技1201班姓名:石思恩学号:05122015日期:2014/12/101 实验题目:基于msp430G2553的多路数据采集。2 实验目的:8通道精密模拟量数据采集器采集8路模拟量输入信号。任一时刻,多路模拟开关选择其中一路输入信号,该信号通过信号调理电路调理后,送入AD转换器转换成数字量,该数字量在lcd12864显示。3 实验内容:1. 实验原理:在本数据采集系统的设计中为了提高系统智能化、可靠性和实用性,采用单片MCU和上位机传输的方法,即MCU运行在数据采集系统的远端,完成数据的采集、处理、发送和显示,上位机则完成数据的接收、校验及显示,同时上位机可对远端MCU进行控制,使其采集方式可选。MCU选用TI公司的低功耗MSP430G2553,该单片机比80C51功能要强大许多,他内部不仅有8路12位AD,而且还带LCD的驱动,节省了不少外围电路。本系统采用信号发生器产生正弦波,然后由LM358芯片实现对电压的放大,之间还需对信号进行调理以符合系统要求。2. 实验步骤:1.实验系统框图:2.放大电路:3.源程序:#include #define uchar unsigned char#define uint unsigned int#define cs_1 P2OUT|=BIT5#define cs_0 P2OUT&=BIT5#define sid_1 P2OUT|=BIT3#define sid_0 P2OUT&=BIT3#define en_1 P2OUT|=BIT4#define en_0 P2OUT&=BIT4uchar num18, a5,m5,n5;double result4,AD_result4;int position=0;int status=0;int flag=0;int jiaquan=0;float sample;void delayr(void);void delays(void);void adc10_begin();void adc10_ceshi();void temar_ceshi();void adc10_ceshi1();void adc10_ceshi2();const uchar line1=电压为 V;const uchar line2=电压为 V;const uchar line3=电压为 V;const uchar line4=电压为 V;void IO_Init(void) P2SEL=0x00;/ 2553将其初始化为晶振输入端,所以要关掉第二功能选择 P2DIR|=0xff;/将其置为输出方向 P2OUT=0x00;/输出0void delay(uint x) uint i,j; for(i=0;ix;i+) for(j=0;j100;j+);void write_cmd(uchar command_data) uchar i; uchar i_data; i_data=0xf8; cs_1; en_0; for(i=0;i8;i+) if(i_data & 0x80) sid_1; else sid_0; en_0; en_1; i_data=1; i_data=command_data; i_data&=0xf0; for(i=0;i8;i+) if(i_data & 0x80) sid_1; else sid_0; en_0; en_1; i_data=1; i_data=command_data; i_data=4; for(i=0;i8;i+) if(i_data & 0x80) sid_1; else sid_0; en_0; en_1; i_data=1; cs_0; delay(10);void write_data(uchar command_data) uchar i; uchar i_data; i_data=0xfa; cs_1; en_0; for(i=0;i8;i+) if(i_data & 0x80) sid_1; else sid_0; en_0; en_1; i_data=1; i_data=command_data; i_data&=0xf0; for(i=0;i8;i+) if(i_data & 0x80) sid_1; else sid_0; en_0; en_1; i_data=1; i_data=command_data; i_data=4; for(i=0;i8;i+) if(i_data & 0x80) sid_1; else sid_0; en_0; en_1; i_data=1; cs_0; delay(10);void LCD_Init (void) delay(10); write_cmd(0x30); delay(10); write_cmd(0x0c); delay(10); write_cmd(0x01); delay(5);void LCD_pos(unsigned char X,unsigned char Y) unsigned char pos; if(X=0) X = 0x80; else if(X=1) X = 0x90; else if(X=2) X = 0x88; else if(X=3) X = 0x98; pos = X + Y; write_cmd(pos);void Display_Init (void) unsigned char i; LCD_pos(0,0); i=0; while(line1i!= 0) write_data(line1i); i+; LCD_pos(1,0); i=0; while(line2i!= 0) write_data(line2i); i+; LCD_pos(2,0); i=0; while(line3i!= 0) write_data(line3i); i+; LCD_pos(3,0); i=0; while(line4i!= 0) write_data(line4i); i+; void ADC10_init() WDTCTL = WDTPW + WDTHOLD; / Stop WDT P2SEL=0x00; P2DIR |= 0xff; / Set P1.0 to output direction P1DIR |= 0x38; P1SEL|=BIT0+BIT1+BIT2; ADC10AE0|=BIT0+BIT1+BIT2+BIT5; / 使P1.0允许AD模拟输入信号 ADC10CTL0=ADC10ON+MSC+SREF_0;/+REFON 开AD内核,选择电源为参考电压 ADC10CTL1=ADC10SSEL_0+CONSEQ_0; /+INCH_1+INCH_2 选择ADC12SC为触发源,选择系统时钟为AD内核时钟,采用单通道多次采用 void adc10_begin(void) ADC10CTL1|=INCH_0; ADC10CTL0|=ADC10SC+ENC; / 开始转换 开转换允许 while(ADC10CTL1&ADC10BUSY!=0);/判断是否转换完毕 result0= ADC10MEM; AD_result0=(result0/1024)*3.485; ADC10CTL0&=(ADC10SC+ENC); /关转换允许才能选择通道 ADC10CTL1&=INCH_0; /通道清0 ADC10CTL1|=INCH_1; ADC10CTL0|=ADC10SC+ENC; while(ADC10CTL1&ADC10BUSY!=0); result1= ADC10MEM; AD_result1=(result1/1024)*3.485; ADC10CTL0&=(ADC10SC+ENC); ADC10CTL1&=INCH_1; ADC10CTL1|=INCH_2; ADC10CTL0|=ADC10SC+ENC; while(ADC10CTL1&ADC10BUSY!=0); result2= ADC10MEM; AD_result2=(result2/1024)*3.485; ADC10CTL0&=(ADC10SC+ENC); ADC10CTL1&=INCH_2; ADC10CTL1|=INCH_5; ADC10CTL0|=ADC10SC+ENC; / 开始转换 开转换允许 while(ADC10CTL1&ADC10BUSY!=0);/判断是否转换完毕 result3= ADC10MEM; AD_result3=(result3/1024)*3.485; ADC10CTL0&=(ADC10SC+ENC); /关转换允许才能选择通道 ADC10CTL1&=INCH_5; /通道清0void adc10_ceshi(void) uchar p,q,e; ADC10_init(); adc10_begin(); a0=(int)AD_result0; a1=a0%10; a2=(int)(AD_result0-a0)*10); a3=(int)(AD_result0*100)%10; a4=(int)(AD_result0*1000)%10; LCD_pos(0,5); for(p=0;p4;p+) write_data(ap); delay(2000); m0=(int)AD_result1; m1=m0%10; m2=(int)(AD_result1-m0)*10); m3=(int)(AD_result1*100)%10; m4=(int)(AD_result1*1000)%10; LCD_pos(1,5); for(e=0;e4;e+) write_data(mp); delay(2000); n0=(int)AD_result2; n1=n0%10; n2=(int)(AD_result2-n0)*10); n3=(int)(AD_result2*100)%10; n4=(int)(AD_result2*1000)%10; LCD_pos(2,5); for(q=0;q4;q+) write_data(np); delay(2000);void main() WDTCTL = WDTPW+WDTHOLD;/关闭看门狗 IO_Init(); LCD_Init(); Display_Init();/对LCD进行初始化,设置一个开机初始化显示 _EINT(); while(1) temar_ceshi(); delay(1000); ADC10CTL0&=(ADC10SC+ENC); /关转换允许才能选择通道 ADC10CTL1&=INCH_0; /通道清0 adc10_ceshi(); delay(1000); ADC10CTL0&=(ADC10SC+ENC); /关转换允许才能选择通道 ADC10CTL1&=INCH_1; /通道清0 temar_ceshi1(); delay(1000); ADC10CTL0&=(ADC10SC+ENC); /关转换允许才能选择通道 ADC10CTL1&=INCH_2; /通道清0 adc10_ceshi1(); delay(1000); ADC10CTL0&=(ADC10SC+ENC); /关转换允许才能选择通道 ADC10CTL1&=INCH_3; /通道清0 void delayr(void) unsigned long data_delay; for(data_delay=0;data_delay100000;data_delay+) void delays(void) unsigned long data_delay; for(data_delay=0;data_delay167935;data_delay+) #pragma vector=TIMER0_A1_VECTOR_interrupt void TIMER0_A1(void) TACTL &= TAIFG; jiaquan+; 4、 试验运行结果:5、 实验中遇到的问题及解决方法:1. 测试时不能实现多路采集,只能采一组。解决方案:采用不同的通道测量,最终实现可用不同的管脚测量。2. 测试时,只测一组却出现多组显示,且出现乱码。解决法案:在

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论