|
谢谢关注!
因程序较长,现只将主程序和初始化程序贴出来,请指教。(注:晶振8M)
void main(void)
{
unsigned int i,xh,Tref,TRoom;
int NmV;
WDTCTL=WDTPW+WDTHOLD;
BCSCTL2 =0x08+DIVS_3;
P1DIR=15; //控制24c02和输出信号到PWM
P1SEL=8;
P5DIR=3; //控制发光二极管
P2DIR=0xff; //选择4051的x3,ABC对应P2.0、P2.1 、P2.2
P3DIR=0x17; //选择4051的通道,ABC对应P3.2、P3.1 、P3.0
P3SEL=0x30;
swt=0;P3OUT=0xF8;P2OUT=0xF8;
InitII2C();
Time1s=90;ADT01=ADT02=ADT1=ADT2=0;pretemp=0;
for(i=0;i<20;i++)AD[i]=956;
InitUART();
InitADC12();
InitTimeA();
_EINT();
ADCM=AD[0];//AD[0];
while(1)
{
ADCM=0;
ADMax=0;
ADMin=4095;
for(i=0;i<20;i++)
{
ADCM=ADCM+AD[i];
if(AD[i]>ADMax) ADMax=AD[i];
if(AD[i]<ADMin) ADMin=AD[i];
}
ADCM=(ADCM-ADMax-ADMin)/18;
if(fabs(ADCM-pretemp)<2) ADCM=pretemp;
pretemp=ADCM;
xh=TRoom/10+5;
NmV=(int)((float)(ADCM-ADCL)/(float)(ADCH-ADCL)*20000);
NmV=NmV+S[xh]+(S[xh+1]-S[xh])/10*(TRoom-(xh-5)*10);
Result=((float)Bisearch(171,NmV))/1600*(PWMH-PWML)+PWML;
};
}
void InitADC12(void)
{
unsigned int i;
/************ADC12 Settings;**********/
P6SEL=0x04; //所有P6口线2为ADC模块使用
P6OUT=0x00;
ADC12CTL0 &=~0x02; //首先复位ADC的转换
// ADC12CTL0=SHT0_8+MSC+ADC12ON; //外部振荡器,置位MSC位,因此转换能自动进行,
ADC12CTL0=SHT0_8+MSC+ADC12ON+REFON+REF2_5V; //内部振荡器,置位MSC位,因此转换能自动进行,
//打开内部参考电压发生器
for (i=0;i<20000;i++){};
ADC12CTL1=0x2F8; //ADC12SC位触发采样和保持
//采样时钟脉冲由采样定时器产生
//时钟源:内部振荡器
//时钟分频:1
//转换模式:单通道多次转换
//选择参考电压和输入管脚
//Reref=2.5V
// ADC12MCTL0=0x0a; //REF=××ss,××cc;Input=A10
//source=Temperature diode
ADC12MCTL0=0x12; //REF=Vref+,××ss;Input=P62
ADC12IE=0x01; //使能通道10转换完成后中断
ADC12CTL0|=0x02; //使能ADC转换
ADC12CTL0 |=0x01; //开始转换
}
void InitTimeA(void)
{
CCR0=5000-1;
CCTL1=OUTMOD_7;
CCR1=1847;
CCTL2=OUTMOD_7;
CCR2=5000-CCR1;
CCTL0=CCIE;
TACTL = TASSEL_2 + MC_1; // SMCLK, contmode
}
void InitUART(void)
{
UCTL0 |= SWRST+CHAR;
UBR00=0x6D;
UBR10=0x00;
UMCTL0=0x11; //调整寄存器
UCTL0 &= ~SWRST; // Ena××e USART
UTCTL0=0x30;
ME1 |=UTXE0+URXE0; //使能USART0 TXD/RXD
IE1 |=URXIE0; //使能USART0 RX中断
} |
|