麻烦专家帮我看看这到底是什么原因,我找了好多资料都没发现有什么问题。再此先表示感谢了!
/*单独显示温度可以实现,单独显示电压也可以实现,但是将温度与电压同时进行测量,则温度或者电压数值不发生变化。经过仿真器单步控制进行运行发现,能够多次进入temper()程序中,即能够多次进行温度测试,但是就是不能够改变内存中的温度值,不能使显示出来的温度变化*/
//
#include <msp430x12x2.h>
#define uchar unsigned char
#define CPU_F ((double)8000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1.0))
uchar led7[11]={0x3f,0x06,0x5b,0x4f, //0,1,2,3,
0x66,0x6d,0x7d,0x07, //4,5,6,7,
0x7f,0x6f,0x40}; //8,9,-
uchar abcd[8]={0x3d,0x5c,0x5c,0x5e,0,0,0,0};
unsigned long real;
uchar flag;
void display(uchar a) //a为0或者1,代表第一行和第二行
{
uchar data;
data=a*4-4;
P1OUT=abcd[data]; P3OUT=0x0f-data; delay_us(100);
P1OUT=abcd[data+1]; P3OUT=0x0e-data; delay_us(100);
P1OUT=abcd[data+2]; P3OUT=0x0d-data; delay_us(100);
P1OUT=abcd[data+3]; P3OUT=0x0c-data; delay_us(100);
P1OUT=0; //关闭段码输出。使按键程序运行时对P3口操作不产生不想要的位显示。
}
//***显示温度程序
void temper(void)
{
uchar tem;
ADC10CTL1=INCH_10+ADC10DIV_4+ADC10SSEL_2+CONSEQ_2; //模拟输入A10、ADC10CLK/8、CONSEQ_2单通道多次转换、INCH_10选择内部通道A10
ADC10CTL0=SREF_1+ADC10SHT_3+ADC10SR+MSC+REFON+ADC10ON+ADC10IE;//启动采样与转换
ADC10CTL0|=ENC+ADC10SC;
tem=real*423/1024-278;
abcd[0]=led7[tem/10];
abcd[1]=led7[tem%10];
abcd[2]=0x63;
abcd[3]=0x39;
}
//***得到电压
void volt(void)
{
uchar tem;
ADC10CTL1=CONSEQ_2; //模拟输入A10、ADC10CLK/8、CONSEQ_2单通道多次转换、INCH_10选择内部通道A10
ADC10CTL0 = SREF_0+ADC10SHT_2 + MSC + ADC10ON + ADC10IE;////启动采样与转换
ADC10CTL0|=ENC+ADC10SC;
ADC10AE = 0x01; // P2.0 ADC option select
ADC10DTC1 = 0x40; // 64 conversions
tem=real*33/1023;
abcd[4]=0x3e;
abcd[5]=0x48;
abcd[6]=led7[tem/10]+0x80;
abcd[7]=led7[tem%10];
}
//***初始化定时器
void int_timera()
{
TACTL = TASSEL0 + TACLR ; // SMCLK, clear TAR
TACTL |= MC0 + TAIE; //增加模式,使能中断
TACCR0=9999; //中断周期为10ms
}
//*************************************************************************
// 主函数
//*************************************************************************
void main()
{
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer to prevent time out reset
P1DIR=0xff;
P3DIR=0xff;
int_timera();
BCSCTL1=0xe7; //MOV.B #0E7h,&BCSCTL1 ;E7H C7h
BCSCTL2=0x8a; //MOV.B #08Ah,&BCSCTL2 ;88H 8CH 8Ah 8Eh
_EINT();
flag=200;
while(flag)
{
display(1);
}
flag=50;
while(1)
{
while(flag==0)
{
temper();
volt();
flag=50;
}
display(1);
display(2);
}
}
//******ADC中断服务程序**********
#pragma vector=ADC10_VECTOR
__interrupt void ADC10ISR (void)
{
real=ADC10MEM;
//ADC10CTL0&=~ADC10IFG;//清除中断标志位
}
#pragma vector = TIMERA1_VECTOR
__interrupt void timera(void)
{
switch(TAIV)
{
case 2:break;
case 4:break;
case 10:flag–;break;
}
}
Lina Lian:
Res Liu ,你好!
请问你‘但是将温度与电压同时进行测量,则温度或者电压数值不发生变化。’是什么意思?我看了你的程序,发现你只在测量通道10,即只在测量温度啊?