完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本人最近在学习msp430的DAC12与ADC12模块,现在想先用DAC12的P6.6口输出数字模拟电压,再用ADC12的P6.0口采样并用1602液晶显示,但调试过程中一直出现问题,要么只能DAC12输出模拟电压,要么ADC12采样正常工作,不能达到效果,下面是程序代码,想请教各位怎么解决,如何才能达到效果。
#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 #define RS_CLR P5OUT &= ~BIT5 //RS置低 #define RS_SET P5OUT |= BIT5 //RS置高 #define RW_CLR P5OUT &= ~BIT6 //RW置低 #define RW_SET P5OUT |= BIT6 //RW置高 #define EN_CLR P5OUT &= ~BIT7 //E置低 #define EN_SET P5OUT |= BIT7 //E置高 #define DataDIR P4DIR //数据口方向 #define DataPort P4OUT //P4口为数据口 int shuju[32]; int A1=0,A2=0,A3=0; ulong dy; uint shuzi=2048; void DAC_init(); void ADC_init(); //************************************************************************* // 初始化IO口子程序 //************************************************************************* void Port_init() { P6SEL |= 0x01; P1IE=0x3f; P1IES=0x3f; P1IFG=0x00; P4SEL = 0x00; P4DIR = 0xFF; //数据口输出模式 P5SEL = 0x00; P5DIR|= BIT5 + BIT6 + BIT7; //控制口设置为输出模式 } //*********************************************************************** // 显示屏命令写入函数 //*********************************************************************** 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); } //*********************************************************************** // 显示屏字符串写入函数 //*********************************************************************** void LCD_write_str(unsigned char x,unsigned char y,unsigned char *s) { if (y == 0) { LCD_write_com(0x80 + x); //第一行显示 } else { LCD_write_com(0xC0 + x); //第二行显示 } while (*s) { LCD_write_data( *s); s ++; } } //*********************************************************************** // 显示屏单字符写入函数 //*********************************************************************** void LCD_write_char(unsigned char x,unsigned char y,unsigned char data) { if (y == 0) { LCD_write_com(0x80 + x); //第一行显示 } else { LCD_write_com(0xC0 + x); //第二行显示 } LCD_write_data( data); } void ADC_init(void) { ADC12CTL0 &= ~ENC; ADC12CTL0=ADC12ON+SHT0_2+MSC; ADC12CTL1=SHP+CONSEQ_2; ADC12IE=0x01; ADC12CTL0 |= ENC; } void DAC_init(void) { ADC12CTL0=REF2_5V+REFON; DAC12_0CTL=DAC12IR+DAC12AMP_5+DAC12ENC+DAC12LSEL_1; DAC12_0CTL |= DAC12CALON; while(DAC12_0CTL & DAC12CALON==DAC12CALON); } //*********************************************************************** // 显示屏初始化函数 //*********************************************************************** void LCD_init(void) { LCD_write_com(0x38); //显示模式设置 delay_ms(5); LCD_write_com(0x08); //显示关闭 delay_ms(5); LCD_write_com(0x01); //显示清屏 delay_ms(5); LCD_write_com(0x06); //显示光标移动设置 delay_ms(5); LCD_write_com(0x0C); //显示开及光标设置 delay_ms(5); } //*********************************************************************** // 液晶显示界面初始化 //*********************************************************************** void LCD_Desk(void) { LCD_clear(); LCD_write_str(0,0,"The Voltage is :"); delay_ms(250); } void LCD_DisplayTemp(uchar temp1,uchar temp2,uchar temp3) { LCD_write_char(0x0b,1,0x30+A1); LCD_write_char(0x0c,1,'.'); LCD_write_char(0x0d,1,0x30+A2); LCD_write_char(0x0e,1,0X30+A3); LCD_write_char(0x0f,1,'V'); } void Clock_Init() { uchar i; BCSCTL1&=~XT2OFF; //打开XT2振荡器 BCSCTL2|=SELM1+SELS; //MCLK为8MHZ,SMCLK为8MHZ do{ IFG1&=~OFIFG; //清楚振荡器错误标志 for(i=0;i<100;i++) _NOP(); } while((IFG1&OFIFG)!=0); //如果标志位1,则继续循环等待 IFG1&=~OFIFG; } void main(void) { uchar j; WDTCTL = WDTPW + WDTHOLD; //看门狗设置 Clock_Init(); //系统时钟设置 Port_init(); //系统初始化,设置IO口属性 delay_ms(100); //延时100ms ADC_init(); DAC_init(); LCD_init(); //液晶参数初始化设置 LCD_clear(); //清屏 LCD_Desk(); _EINT(); while(1) { DAC12_0CTL |= DAC12ENC; DAC12_0DAT=shuzi; ADC12CTL0 |= ADC12SC; for(j=0;j<30;j++) { LCD_DisplayTemp(A1,A2,A3); } } } #pragma vector=ADC_VECTOR __interrupt void ADC12ISR(void) { static unsigned int cishu=0; shuju[cishu++]=ADC12MEM0; if(cishu==31) { ADC12CTL0 &= ~ENC; unsigned int i; dy=0; for(i=0;i<32;i++) dy=dy+shuju[i]; dy=dy/32; cishu=0; dy=(dy*3300)/4095+100; A1=dy/1000; A2=(dy%1000)/100; A3=(dy%100)/10; ADC12CTL0 |= ENC; } } |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
3046个成员聚集在这个小组
加入小组2951 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3645 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2354 浏览 1 评论
4822 浏览 1 评论
2582 浏览 1 评论
1348浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3645浏览 2评论
2951浏览 1评论
1539浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-12 18:24 , Processed in 1.409895 second(s), Total 52, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号