ADC转换电压转化成温度
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
}
P4OUT=seg[b];
P5OUT=Bit[1];
for(uint i=0;i<100;i++);
P4OUT=Code[c];
P5OUT=Bit[2];
for(uint i=0;i<100;i++);
P4OUT=Code[d];
P5OUT=Bit[3];
for(uint i=0;i<100;i++);
c=(int)TBuf/10;
d=(int)TBuf%10;
}
//定时器A初始化
void InitTimerA(void){
TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK增计数清除TAR
CCTL0=CCIE;//CCR0中断允许比较模式
CCR0=20000;//时间间隔20ms
}
//ADC12初始化
void InitADC12(void){
/*
P6SEL |=0x01;
ADC12CTL0&=~ENC;//ENC设置为0从而修改ADC12寄存器
ADC12MCTL0=INCH_0+SREF_0;//参考电压为VREF+和AVss输入温度传感器
ADC12CTL1=CSTARTADD_0+SHP+CONSEQ_2+ADC12SSEL_1+ADC12DIV_0;//起始地址ADCMEM0,采样脉冲由采样定时器产生,单通道多次转换,内部时钟源不分频
Sum+=ADCBuf[i];
TBuf=(Sum*3.3)/(20*4095)*18.64;//计算电压1.5为外部参考电压
SuHale Waihona Puke Baidu=0;
//计算数码管各位要显示的数值
a=(int)TBuf%100/10;
b=(int)TBuf%10;
TBuf=TBuf-(int)TBuf;
TBuf=TBuf*100;
// ADC12CTL0 &=~ENC;
ADC12CTL0|=ENC+ADC12SC;
ADCBuf[Count]=ADC12MEM0;
Count++;
if(Count==20){
GetT();
Count=0;
}
ADC12CTL0 &= ~ENC; // ADC12CTL0|=ENC+ADC12SC;//使能ADC转换
}
void baojing()
{
if(a>=4)
{
P2OUT |=0x01;
P2OUT |=0x02;
}
}
void main()
{
unsigned char i;
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
P4DIR |=0xFF;
P5DIR |=0xFF;
P2DIR |=0xFF;
InitClock(); //时钟初始化函数
//ADC12IE = 0x01; // Enable interrupt
ADC12CTL0 |= ENC; // Conversion enabled
P6SEL |= 0x01; // P6.0 ADC option select
}
//计算电压值
void GetT(void){
for(uchar i=0;i<20;i++)
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不分频
uchar seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //
uchar Bit[4]={0x01,0x02,0x04,0x08};//位选
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};//保存采集到的数据
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
//共阳数码管编码表
uchar Code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选
ADC12CTL0=MSC+ADC12ON+REFON;//采样信号由SHI仅首次触发,打开ADC12模块VREF打开1.5V
// ADC12CTL0 = ENC;
*/
ADC12CTL0 = SHT0_2 + ADC12ON; // Set sampling time, turn on ADC12
ADC12CTL1 = SHP; // Use sampling timer
InitTimerA(); //定时器A初始化
InitADC12(); //ADC12初始化
_EINT();//打开中断
while(1){
for(i=0;i<50;i++)
{
Display();
}
}
}
//定时器A中断
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAINT(void){
}
//ms级延时子程序
void DelayMs(uint ms){
while(ms--){
for(uint i=0;i<800;i++);
}
}
//数码管扫描显示程序
void Display(void){
P4OUT=Code[a];
P5OUT=Bit[0];
for(uint i=0;i<100;i++);
ulong Sum=0;//20个数据的和
double TBuf=0;
uchar Count=0;
int a=0,b=0,c=0,d=0;
//时钟初始化函数
void InitClock(void){
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启LFXT1工作在低频模式ACLK不分频最高的标称频率
P4OUT=seg[b];
P5OUT=Bit[1];
for(uint i=0;i<100;i++);
P4OUT=Code[c];
P5OUT=Bit[2];
for(uint i=0;i<100;i++);
P4OUT=Code[d];
P5OUT=Bit[3];
for(uint i=0;i<100;i++);
c=(int)TBuf/10;
d=(int)TBuf%10;
}
//定时器A初始化
void InitTimerA(void){
TACTL=TASSEL1+ID1+ID0+MC0+TACLR;//选择1/8SMCLK增计数清除TAR
CCTL0=CCIE;//CCR0中断允许比较模式
CCR0=20000;//时间间隔20ms
}
//ADC12初始化
void InitADC12(void){
/*
P6SEL |=0x01;
ADC12CTL0&=~ENC;//ENC设置为0从而修改ADC12寄存器
ADC12MCTL0=INCH_0+SREF_0;//参考电压为VREF+和AVss输入温度传感器
ADC12CTL1=CSTARTADD_0+SHP+CONSEQ_2+ADC12SSEL_1+ADC12DIV_0;//起始地址ADCMEM0,采样脉冲由采样定时器产生,单通道多次转换,内部时钟源不分频
Sum+=ADCBuf[i];
TBuf=(Sum*3.3)/(20*4095)*18.64;//计算电压1.5为外部参考电压
SuHale Waihona Puke Baidu=0;
//计算数码管各位要显示的数值
a=(int)TBuf%100/10;
b=(int)TBuf%10;
TBuf=TBuf-(int)TBuf;
TBuf=TBuf*100;
// ADC12CTL0 &=~ENC;
ADC12CTL0|=ENC+ADC12SC;
ADCBuf[Count]=ADC12MEM0;
Count++;
if(Count==20){
GetT();
Count=0;
}
ADC12CTL0 &= ~ENC; // ADC12CTL0|=ENC+ADC12SC;//使能ADC转换
}
void baojing()
{
if(a>=4)
{
P2OUT |=0x01;
P2OUT |=0x02;
}
}
void main()
{
unsigned char i;
WDTCTL=WDTPW+WDTHOLD;//关闭看门狗
P4DIR |=0xFF;
P5DIR |=0xFF;
P2DIR |=0xFF;
InitClock(); //时钟初始化函数
//ADC12IE = 0x01; // Enable interrupt
ADC12CTL0 |= ENC; // Conversion enabled
P6SEL |= 0x01; // P6.0 ADC option select
}
//计算电压值
void GetT(void){
for(uchar i=0;i<20;i++)
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不分频
uchar seg[10]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //
uchar Bit[4]={0x01,0x02,0x04,0x08};//位选
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};//保存采集到的数据
#include "msp430x14x.h"
#define uint unsigned int
#define uchar unsigned char
#define ulong unsigned long
//共阳数码管编码表
uchar Code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};//段选
ADC12CTL0=MSC+ADC12ON+REFON;//采样信号由SHI仅首次触发,打开ADC12模块VREF打开1.5V
// ADC12CTL0 = ENC;
*/
ADC12CTL0 = SHT0_2 + ADC12ON; // Set sampling time, turn on ADC12
ADC12CTL1 = SHP; // Use sampling timer
InitTimerA(); //定时器A初始化
InitADC12(); //ADC12初始化
_EINT();//打开中断
while(1){
for(i=0;i<50;i++)
{
Display();
}
}
}
//定时器A中断
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerAINT(void){
}
//ms级延时子程序
void DelayMs(uint ms){
while(ms--){
for(uint i=0;i<800;i++);
}
}
//数码管扫描显示程序
void Display(void){
P4OUT=Code[a];
P5OUT=Bit[0];
for(uint i=0;i<100;i++);
ulong Sum=0;//20个数据的和
double TBuf=0;
uchar Count=0;
int a=0,b=0,c=0,d=0;
//时钟初始化函数
void InitClock(void){
BCSCTL1=RSEL2+RSEL1+RSEL0;//XT2开启LFXT1工作在低频模式ACLK不分频最高的标称频率