?? adc12.c
字號:
/*******************************************************
ADC12電壓測量實驗
功能:在數碼管上顯示P6.0輸入的電壓
參考電壓為外部
*******************************************************/
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
//共陽數碼管編碼表
uchar Code[18]={0xC0,0xF9,0xA4,0xB0,//0,1,2,3
0x99,0x92,0x82,0xF8,//4,5,6,7
0x80,0x90,0x88,0x83,//8,9,A,b
0xC6,0xA1,0x86,0x8E,//C,d,E,F
0xBF,0xFF};//-,全滅
uchar Bit[8]={0,0,0,0,0,0,0,0}; //數碼管各位顯示的數字
uchar BitCode=0x80; //數碼管位碼初值
uint ADCBuf[20]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};//保存采集到的數據
ulong Sum=0;//20個數據的和
ulong VBuf=0;//電壓擴大10000000的值
uchar Count=0;
//時鐘初始化函數
void InitClock(void)
{
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2開啟 LFXT1工作在低頻模式 ACLK不分頻 最高的標稱頻率
DCOCTL=DCO2+DCO1+DCO0;//DCO為最高頻率
do{
IFG1&=~OFIFG;//清除振蕩器失效標志
for(uint i=255;i>0;i--);
}while(IFG1&OFIFG);//判斷XT2是否起振
BCSCTL2=SELM1+SELS;//MCLK SMCLK時鐘源為TX2CLK不分頻
}
//端口初始化函數
void InitPort(void)
{
P2SEL=0x00;//P2口所有引腳設置為一般的IO口
P4SEL=0x00;//P4口所有引腳設置為一般的IO口
P2DIR=0xFF;//P2口所有引腳設置為輸出方向
P4DIR=0xFF;//P4口所有引腳設置為輸出方向
P2OUT=0x00;//P2口先輸出低電平
P4OUT=0xFF;//P4口先輸出低電平
P5SEL&=~BIT7;//P5.7設置為一般的IO口
P5DIR|=BIT7;//P5.7設置為輸出方向
P5OUT&=~BIT7;//P5.7輸出低電平來使能74HC573來驅動數碼管
}
//ms級延時子程序
void DelayMs(uint ms)
{
while(ms--){
for(uint i=0;i<800;i++);
}
}
//數碼管掃描顯示程序
void Display(void)
{
for(uchar i=0;i<8;i++)
{
P4OUT=BitCode; //輸出位碼
if(i==0)
{ //輸出段碼,如果第三位顯示小數點
P2OUT=Code[Bit[i]]&0x7F;
}else
{
P2OUT=Code[Bit[i]];
}
BitCode>>=1;//位碼右移一位
if(BitCode==0) BitCode=0x80;
DelayMs(1); //延時1ms
P2OUT=0xFF;
}
}
//ADC12初始化
void InitADC12(void)
{
P6SEL=0x01;//P6.0為模擬輸入
ADC12CTL0&=~ENC;//ENC設置為0從而修改ADC12寄存器
ADC12MCTL0=INCH_0+SREF_2+EOS;//參考電壓為VeREF+和AVss 輸入通道A0
ADC12CTL1=CSTARTADD_0+SHP+CONSEQ_2+ADC12SSEL_0+ADC12DIV_0;//起始地址ADCMEM0,采樣脈沖由采樣定時器產生,單通道多次轉換,內部時鐘源不分頻
ADC12CTL0=MSC+ADC12ON;//采樣信號由SHI僅首次觸發,打開ADC12模塊
}
//計算電壓值
void GetV(void)
{
for(uchar i=0;i<20;i++) Sum+=ADCBuf[i];
VBuf=Sum/20.0*((2.89*1000)/4095.0);//計算電壓并擴大10000000倍 2.5為外部參考電壓 可用R4調節
Sum=0;
//計算數碼管各位要顯示的數值
Bit[0]=VBuf/10000000;
Bit[1]=VBuf%10000000/1000000;
Bit[2]=VBuf%1000000/100000;
Bit[3]=VBuf%100000/10000;
Bit[4]=VBuf%10000/1000;
Bit[5]=VBuf%1000/100;
Bit[6]=VBuf%100/10;
Bit[7]=VBuf%10;
}
//定時器A初始化
void InitTimerA(void)
{
TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//選擇1/8SMCLK 增計數 清除TAR
CCTL0=CCIE;//CCR0中斷允許 比較模式
CCR0=20000;//時間間隔20ms
}
//定時器A中斷
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAINT(void)
{
ADC12CTL0&=~ENC;
ADCBuf[Count]=ADC12MEM0;
Count++;
if(Count==20)
{
GetV();
Count=0;
}
ADC12CTL0|=ENC+ADC12SC;//使能ADC轉換
}
void main()
{
WDTCTL=WDTPW+WDTHOLD;//關閉看門狗
InitClock();
InitPort();
InitTimerA();
InitADC12();
_EINT();//打開中斷
while(1){
Display();
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -