?? main.c
字號(hào):
/****************************************************
程序功能:用ADC采樣DAC輸出的模擬電壓數(shù)據(jù),
將兩個(gè)模擬電壓值在1602液晶上顯示
----------------------------------------------------
測(cè)試說(shuō)明:按動(dòng)S3鍵可以減小DAC的輸出電壓;
按動(dòng)S4鍵可以增加DAC的輸出電壓。
觀察液晶顯示變化。
******************************************************/
#include <msp430x14x.h>
#include "BoardConfig.h"
#include "IIC.h"
#include "cry1602.h"
uint ADC_tmp[16]; //存放ADC數(shù)值的緩沖區(qū)
uchar cnt = 0; //計(jì)數(shù)變量
uint ADC_Val = 0; //一次ADC轉(zhuǎn)換的平均值
uchar DAC_Val; //DAC輸出數(shù)據(jù)
uchar shuzi[] = {"0123456789."};
uchar tishi1[] = {"DAC volt: "};
uchar tishi2[] = {"ADC volt: "};
void Init_ADC(void);
uchar Write_DAC(uchar wdata);
void Trans_val(uint Hex_Val,uchar n);
/****************主函數(shù)****************/
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //停止看門狗
BoardConfig(0xb8);
P1DIR |= 0x03 + BIT7; //設(shè)置DAC的控制IO為輸出狀態(tài)
P1OUT = 0x03;
P1IE |= BIT2 + BIT3; //允許P1.2和P1.3中斷
LcdReset();
DispNChar(0,0,10,tishi1); //顯示提示文字
Disp1Char(15,0,0x56); //0x56是字符V的ASCII碼值
DispNChar(0,1,10,tishi2);
Disp1Char(15,1,0x56);
DAC_Val = 0;
Write_DAC(DAC_Val);
Trans_val(DAC_Val,8);
Init_ADC();
_EINT();
while(1)
{
ADC12CTL0 |= ADC12SC; //開(kāi)始一次轉(zhuǎn)換
LPM0;
Trans_val(ADC_Val,12); //在液晶上提示
}
}
/*******************************************
函數(shù)名稱:ADC12_ISR
功 能:ADC的中斷服務(wù)函數(shù)
參 數(shù):無(wú)
返回值 :無(wú)
********************************************/
#pragma vector=ADC_VECTOR
__interrupt void ADC12_ISR(void)
{
ADC_tmp[cnt++] = ADC12MEM0;
if(cnt == 16)
{
unsigned long ADC_sum = 0;
uchar i;
for(i = 0;i < 16;i++) //求16次采樣的均值
ADC_sum += ADC_tmp[i];
ADC_Val = ADC_sum >> 4;
cnt = 0;
LPM0_EXIT;
}
else
{
ADC12CTL0 |= ADC12SC; //開(kāi)始一次轉(zhuǎn)換
}
}
/*******************************************
函數(shù)名稱:Port1_ISR
功 能:端口P1的中斷服務(wù)函數(shù)
參 數(shù):無(wú)
返回值 :無(wú)
********************************************/
#pragma vector=PORT1_VECTOR
__interrupt void Port1_ISR(void)
{
_DINT();
if(P1IFG & BIT2)
{
P1IFG = 0x00; //清中斷標(biāo)志
DAC_Val -= 10; //DAC的輸出減少10個(gè)偏置量
Write_DAC(DAC_Val); //寫入DAC
Trans_val(DAC_Val,8); //在液晶上提示
}
else if(P1IFG & BIT3)
{
P1IFG = 0x00; //清中斷標(biāo)志
DAC_Val += 10; //DAC的輸出增加10個(gè)偏置量
Write_DAC(DAC_Val); //寫入DAC
Trans_val(DAC_Val,8); //在液晶上提示
}
else
_NOP();
P1IFG = 0x00; //清中斷標(biāo)志
_EINT();
}
/*******************************************
函數(shù)名稱:Init_ADC
功 能:初始化ADC寄存器
參 數(shù):無(wú)
返回值 :無(wú)
********************************************/
void Init_ADC(void)
{
P6SEL |= BIT1; //P6.1選做ADC輸入端口
ADC12CTL0 = SHT0_2 + ADC12ON; //設(shè)置采樣時(shí)間,打開(kāi)ADC
ADC12CTL1 = SHP; //使用采樣定時(shí)器,選擇SMCLK
ADC12IE = BIT0; //使能采樣中斷
ADC12MCTL0 = INCH_1; //選擇采樣通道1
ADC12CTL0 |= ENC; //打開(kāi)轉(zhuǎn)換使能
}
/*******************************************
函數(shù)名稱:Write_DAC
功 能:向DAC中寫入輸出電壓數(shù)據(jù)
參 數(shù):無(wú)
返回值 :寫入結(jié)果:1--成功,0--失敗
********************************************/
uchar Write_DAC(uchar wdata)
{
start();
write1byte(0x98); //DAC的設(shè)備地址
if(check()) write1byte(wdata >> 4); //寫控制模式和電壓數(shù)據(jù)的高四位
else return 0;
if(check()) write1byte(wdata << 4); //寫電壓數(shù)據(jù)的低四位
else return 0;
if(check()) stop();
else return 0;
return 1;
}
/*******************************************
函數(shù)名稱:Trans_val
功 能:將16進(jìn)制數(shù)據(jù)變換成三位10進(jìn)制數(shù)據(jù),
并在液晶上顯示
參 數(shù):Hex_Val--16進(jìn)制數(shù)據(jù)
n--變換時(shí)的分母等于2的n次方
返回值 :寫入結(jié)果:1--成功,0--失敗
********************************************/
void Trans_val(uint Hex_Val,uchar n)
{
unsigned long caltmp;
uint Curr_Volt;
uchar t1,i;
uchar ptr[4];
caltmp = Hex_Val;
caltmp = (caltmp << 5) + Hex_Val; //caltmp = Hex_Val * 33
caltmp = (caltmp << 3) + (caltmp << 1); //caltmp = caltmp * 10
Curr_Volt = caltmp >> n; //Curr_Volt = caltmp / 2^n
ptr[0] = Curr_Volt / 100; //Hex->Dec變換
t1 = Curr_Volt - (ptr[0] * 100);
ptr[2] = t1 / 10;
ptr[3] = t1 - (ptr[2] * 10);
if(n == 8) //如果是DAC的數(shù)據(jù)
t1 = 0;
else //如果是ADC的數(shù)據(jù)
t1 = 1;
ptr[1] = 10; //shuzi表中第10位對(duì)應(yīng)符號(hào)"."
_DINT();
//在液晶上顯示變換后的結(jié)果
for(i = 0;i < 4;i++)
Disp1Char((10 + i),t1,shuzi[ptr[i]]);
_EINT();
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -