本人最近在学习msp430的DAC12与ADC12模块,现在想先用DAC12的P6.6口输出数字模拟电压,再用ADC12的P6.0口采样并用1602液晶显示,但调试过程中一直出现问题,要么只能DAC12输出模拟电压,要么ADC12采样正常工作,不能达到效果,下面是程序代码,想请教各位怎么解决,如何才能达到效果。
#include <msp430x16x.h>
#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;
}
}
此帖出自
小平头技术问答
ADC初始化与DAC初始化有矛盾,只需改一下初始化语句就行
一周热门 更多>