標(biāo)題:
msp430g2553單片機(jī)ADC轉(zhuǎn)換程序
[打印本頁(yè)]
作者:
chengjingtao1
時(shí)間:
2021-11-28 13:59
標(biāo)題:
msp430g2553單片機(jī)ADC轉(zhuǎn)換程序
#include<msp430g2553.h>
#define uint unsigned int
#define uchar unsigned char
#define BIT(x) (1<<(x))
#define Range_3V 0 //量程為0~3V
#define Range_15V 1 //量程為0~15V
/*********************************************************
函數(shù)聲明
*********************************************************/
void System_Init(void);
void ADC_Init(void);
void LCD_Init();
void LCD_Send(uchar type,uchar transdata);
void Delay_nms(uint n);
void LCD_Pos(uchar x,uchar y);
void LCD_Display_String(const uchar *pt,uchar num);
void LCD_Display(long int Data);
void LCD_Display_Digit(long int num);
uchar LCD_Table[]={'0','1','2','3','4','5','6','7','8','9','.','V'};
long int Voltage; //全局變量Voltage
uint Voltage_Range;
/*********************************************************
函數(shù)功能:系統(tǒng)初始化
入口參數(shù):無(wú)
出口參數(shù):無(wú)
函數(shù)說(shuō)明:無(wú)
*********************************************************/
void System_Init(void)
{
WDTCTL = WDT_ADLY_1000; //看門狗工作在定時(shí)器模式,1s中斷一次
IE1 |= WDTIE; //使能看門狗中斷
P1DIR |= BIT0 + BIT1; //相應(yīng)的位端口設(shè)置為輸出
P1SEL |= BIT4; //P1.4為A4通道
Voltage_Range = Range_15V; //Range_3V即量程為3V,Range_15V即量程為15V
ADC_Init(); //ADC初始化;
LCD_Init(); //液晶初始化
}
/*********************************************************
函數(shù)功能:ADC初始化
入口參數(shù):無(wú)
出口參數(shù):無(wú)
函數(shù)說(shuō)明:無(wú)
*********************************************************/
void ADC_Init (void)
{
ADC10CTL0 &= ~ENC; //復(fù)位轉(zhuǎn)換允許位
ADC10CTL0 |= ADC10ON + ADC10SHT_0 + SREF_0 + ADC10IE ;
//設(shè)置轉(zhuǎn)換控制寄存器ADC10CTL0,ADC10ON=0x010,使ADC10內(nèi)核工作
//ADC10SHT_0=0*0x800u,確定采樣周期為4xADC10CLKs
//SREF_0=0*0x2000u,選擇參考電壓為VR+=AVCC,VR-=AVSS
//ADC10IE=0x00使對(duì)應(yīng)通道轉(zhuǎn)換后產(chǎn)生中斷
ADC10CTL1 |= INCH_4 + CONSEQ_0;
//設(shè)置AD轉(zhuǎn)換控制寄存器ADC10CTL1,INCH_0=0*0x1000u,選擇通道A4
//CONSEQ_1=1*2u,設(shè)置工作模式為單通道、單次轉(zhuǎn)換模式
ADC10CTL0 |= ENC + ADC10SC;
//設(shè)置轉(zhuǎn)換控制寄存器ADC12CTL0,ENC=0x002使轉(zhuǎn)換允許位為1
//ADC12SC=0x001使采樣/轉(zhuǎn)換控制位為1
_EINT(); //總中斷使能
}
/***************************ADC中斷函數(shù)****************************/
#pragma vector = ADC10_VECTOR
__interrupt void ADC10_Interrupt(void)
{
uint data;
data = ADC10MEM; //將AD采樣值存入data
if(Voltage_Range == Range_3V) //V(實(shí)際)=(VR+ - VR-)*data/1023 + VR-
Voltage = (uint)(35.4*data/10.23); //Voltage是實(shí)際電壓值的1000倍
else
Voltage = (uint)(35.4*data/10.23*5.38);
}
/***************************WDT中斷函數(shù)****************************/
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer(void)
{
LCD_Display(Voltage); //顯示電壓值
}
/*********************************************************
函數(shù)名稱:LCD初始化函數(shù)
入口參數(shù):無(wú)
出口參數(shù):無(wú)
函數(shù)說(shuō)明:無(wú)
*********************************************************/
void LCD_Init()
{
Delay_nms(5);
LCD_Send(0,0x01); //清屏指令
Delay_nms(5); //延時(shí)等待液晶完成復(fù)位
LCD_Send(0,0x30); //功能設(shè)定:基本指令集操作
Delay_nms(5);
LCD_Send(0,0x02); //地址歸0
Delay_nms(5);
LCD_Send(0,0x0c); //開顯示,且關(guān)閉光標(biāo)及其反白顯示
Delay_nms(5);
}
/*********************************************************
函數(shù)功能:寫指令或數(shù)據(jù)
入口參數(shù):type,transdata
出口參數(shù):無(wú)
函數(shù)說(shuō)明:無(wú)
*********************************************************/
void LCD_Send(uchar type,uchar transdata)
{
uchar firstbyte = 0xf8;
uchar temp,i,j;
if(type)
firstbyte |= 0x02;
P1OUT &= ~BIT1;
for(j=3;j>0;j--)
{
switch(j)
{
case 3:temp=firstbyte;break;
case 2:temp=transdata&0xf0;break;
case 1:temp=(transdata<<4)&0xf0;break;
}
for(i=8;i>0;i--)
{
if(temp&0x80)
P1OUT |= BIT0;
else
P1OUT &= ~BIT0;
P1OUT |= BIT1;
temp <<= 1;
P1OUT &= ~BIT1;
}
Delay_nms(1);
}
P1OUT &= ~BIT0;
}
/**********************定位函數(shù)************************/
void LCD_Pos(uchar x,uchar y)
{
int pos;
switch(x)
{
case 1:pos=0x80;break;
case 2:pos=0x90;break;
case 3:pos=0x88;break;
case 4:pos=0x98;break;
default:pos=0x80;
}
pos += y;
LCD_Send(0,pos);
}
/*********************************************************
函數(shù)功能:字符串顯示函數(shù)
入口參數(shù):*pt ,num
出口參數(shù):無(wú)
函數(shù)說(shuō)明:無(wú)
*********************************************************/
void LCD_Display_String(const uchar *pt,uchar num)
{
uchar i;
for(i = 0;i < (num*2);i++)
LCD_Send(1,*(pt++));
}
/*********************************************************
函數(shù)功能:數(shù)字顯示函數(shù)
入口參數(shù):num
出口參數(shù):無(wú)
函數(shù)說(shuō)明:無(wú)
*********************************************************/
void LCD_Display_Digit(long int num)
{
uint SHOW[7],i=0;
SHOW[0]=(num/10000)%10; //十位
SHOW[1]=(num/1000)%10; //個(gè)位
SHOW[2]=10; //.
SHOW[3]=(num/100)%10; //十分位
SHOW[4]=num/10%10; //百分位
SHOW[5]=num%10; //千分位
SHOW[6]=11; //V
switch(Voltage_Range)
{
case Range_3V: for(i=1;i<7;i++)
LCD_Send(1,LCD_Table[SHOW[i]]); break;
case Range_15V: for(i=0;i<7;i++)
{
if(i==5)++i;
LCD_Send(1,LCD_Table[SHOW[i]]);
} break;
default: break;
}
}
/***********************延時(shí)函數(shù)*************************/
void Delay_nms(uint n)
{
uchar i;
while(n--)
for(i=0;i<115;i++);
}
/*************************************************************
函數(shù)名稱:顯示函數(shù)
入口參數(shù):Data
出口參數(shù):無(wú)
函數(shù)說(shuō)明:每行最多8個(gè)字,2個(gè)字母或數(shù)字相當(dāng)于1個(gè)字的長(zhǎng)度,注意
漢字沒(méi)法跨格顯示。
*************************************************************/
void LCD_Display(long int Data)
{
//LCD_Pos(1,0); //第一行
//LCD_Display_String("",0);
LCD_Pos(2,0); //第二行
LCD_Display_String(" 數(shù)字式電壓表",7);
LCD_Pos(3,0); //第三行
LCD_Display_String("當(dāng)前電壓:",5);
LCD_Display_Digit(Data);
//LCD_Pos(4,0); //第四行
//LCD_Display_String(12.13);
}
/*********************************************************
函數(shù)名稱:主函數(shù)
入口參數(shù):無(wú)
出口參數(shù):無(wú)
函數(shù)說(shuō)明:請(qǐng)看完最上面程序說(shuō)明再運(yùn)行程序
*********************************************************/
void main()
{
System_Init();
while(1)
{
ADC10CTL0 |= ENC + ADC10SC; //開啟ADC轉(zhuǎn)換
}
}
復(fù)制代碼
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1