?? main.c
字號:
/*************************************************************
程序功能:對P6.0對應的模擬通道進行多次轉換后,將32次平均值
在數(shù)碼管上顯示(數(shù)碼管顯示的只是ADC的轉換結果而不
是真實的模擬電壓)
--------------------------------------------------------------
特別說明:如果不進行32次平均,我們會看到最低位不停的跳變。
--------------------------------------------------------------
測試說明:調節(jié)電位器R7的調整旋鈕,觀察顯示數(shù)字的變化
*************************************************************/
#include <msp430x14x.h>
#include "BoardConfig.h"
uint Results[32]; //存放ADC的轉換結果
uint Average;
//數(shù)碼管7位段碼:0--f
uchar scandata[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar DispBuf[4] = {0,0,0,0};
//記錄顯示位數(shù)的全局變量
uchar cnt = 0;
void main(void)
{
WDTCTL = WDT_ADLY_1_9; // 設置內部看門狗工作在定時器模式,1.9ms中斷一次
IE1 |= WDTIE; // 使能看門狗中斷
BoardConfig(0x88); // 打開數(shù)碼管,關閉流水燈和電平轉換
P6SEL |= 0x01; // Enable A/D channel A0
ADC12CTL0 = ADC12ON + SHT0_15 + MSC; // Turn on ADC12, set sampling time
ADC12CTL1 = SHP + CONSEQ_2; // Use sampling timer, set mode
ADC12IE = 0x01; // Enable ADC12IFG.0
ADC12CTL0 |= ENC; // Enable conversions
ADC12CTL0 |= ADC12SC; // Start conversion
P4DIR = 0xff;
P5DIR = 0xff;
_EINT();
while(1)
{
_BIS_SR(LPM0_bits + GIE); // Enter LPM0, Enable interrupts
DispBuf[0] = Average / 1000; //更新數(shù)碼管顯示
DispBuf[1] = (Average - DispBuf[0]*1000)/100;
DispBuf[2] = (Average - DispBuf[0]*1000 - DispBuf[1]*100)/10;
DispBuf[3] = (Average - DispBuf[0]*1000 - DispBuf[1]*100 - DispBuf[2]*10);
}
}
/*******************************************
函數(shù)名稱:ADC12ISR
功 能:ADC12的中斷服務函數(shù)
參 數(shù):無
返回值 :無
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
{
static uchar index = 0;
Results[index++] = ADC12MEM0; // Move results, IFG is cleared
if(index == 31)
{
uchar i;
Average = 0;
for(i = 0; i < 32; i++)
Average += Results[i];
Average >>= 5; //除以32求平均值
index = 0;
_BIC_SR_IRQ(LPM0_bits); // Clear LPM0
}
}
/*******************************************
函數(shù)名稱:watchdog_timer
功 能:看門狗中斷服務函數(shù),在這里輸出數(shù)碼管的
段選和位選信號
參 數(shù):無
返回值 :無
********************************************/
#pragma vector=WDT_VECTOR
__interrupt void watchdog_timer(void)
{
P5OUT = 0xff;
P4OUT = scandata[DispBuf[cnt]]; //輸出段選信號
P5OUT &= ~(1 << cnt); //輸出位選信號
cnt++; //位計數(shù)變量在0~3之間循環(huán)
if(cnt == 4) cnt = 0;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -