⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 基于MAX1968的TEC控制程序
💻 C
📖 第 1 页 / 共 2 页
字号:

void ADC12_Init(void)                      //A/D转换初始化函数声明
{
    //=======================ADC12程序=========================================
    P6SEL|=0x07;                           //使能AD通道A2---P6.2
    //ADC12CTL0=ADC12ON+SHT0_8+MSC;        //打开ADC12,SHO_8,设置采样时钟,根据实际情况!!!!!!!!!!!
    ADC12CTL0=ADC12ON+SHT0_15;              //ADC12CTL0的位定义------------------采样时钟=4×tADC12CLK×N    SHO—8---》64
    //ADC12CTL1=SHP+CONSEQ_2;              //使用采样时钟,设置单通道多次转换模式
    ADC12CTL1=SHP+CONSEQ_0;                //+CONSEQ_0;//+CSTARTADD_2;    //使用采样时钟,单通道单次转换
    //ADC12MCTL2=0xf2;                     //1 111 0010 
    //ADC12MCTL2=0x92;                     //10010010 正参考等于内部参考2.5V,负参考等于电源地
    //ADC12MCTL2=INCH_2+SERF_7;            //通道2使用外部参考2.5V作为转换基准
    ADC12MCTL0=SREF_0+INCH_0;              //and ???   察看寄存器内容0x92=10010010!EOS=1,该序列中最后一次转换,SERF=1,VR+=Vref+;VR-=AVss,使用内部参考电压2.5V和GND
    ADC12IE=0xFF;                          //使能ADC12IFG.2中断
                                           //ADC12IE的位定义--------------------
    ADC12CTL0|=ENC;                        //ENC=1,使能ADC转换
    _EINT();
}

//==============================Timer_A中断服务程序======================
//Timer_A 中断服务程序,输出周期为2ms的方波,并由端口P1.2送出。
//函数功能:启动ADC12的每次转换
//调试状态:
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A(void)
{
  P1OUT^=0x04;                             //取反输出,用于产生方波信号,方波信号的频率为???如何计算
  //_nop();                                //延时使得输出电压稳定
  _NOP();
  if(P1OUT&0x04==4)                      //当输出为1时,定时采样
  {
  ADC12CTL0|=ADC12SC;                    //一个周期,使能一次采样
  }
  else
  {
   ;
  }
      switch(P1OUT&0x04)
    {
      case 4:ADC12CTL0|=ADC12SC;break;   //如果输出为1,则启动AD转换
      case 0:_NOP();
    }
}*/
/*==============================ADC12中断服务程序===============================
//函数功能:实现输入电压的显示和输出电压的显示,PID运算
//调试状态:
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR(void)
{
  //static unsigned int index=0;
  //results[index]=ADC12MEM0;                    //保存结果,清楚IFG
  //index=(index+1)%Num_of_Results;
  //AD_feedback=ADC12MEM2;                       //转换结束,把结果存入AD_result
  
      //=============================局部变量定义===============================
      unsigned int ADT,ADT_Z,ADT_S,ADT_B,ADT_Q;  //定义电压的各位变量
      unsigned long ADT1,MAX5812_VOUT1;
      unsigned char MAX5812_vout_high;           //MAX5812电压输出的高字节
      unsigned char MAX5812_vout_low;            //                 低  
      
      //=============================转换结果转换===============================
      LcdClear();                                //每次都得清一次屏
      ADT=ADC12MEM0;                             //12位AD转换值
      ADT1=((unsigned long)ADT*3300)/4095;       //电压转化计算,采用参考电压3.3V和地,AVss和DVSS
      ADT_Z=ADT1/1000;                           //取整数位
      ADT_S=(ADT1/100)%10;                       //取十分位
      ADT_B=(ADT1%100)/10;                       //取百分位
      ADT_Q=ADT1%10;                             //取千分位
      
      //=============================采集电压显示===============================
      LCD1602_buffer1[0]=' ';             //
      LCD1602_buffer1[1]='A';             //A
      LCD1602_buffer1[2]='D';             //D
      LCD1602_buffer1[3]='i';             //i
      LCD1602_buffer1[4]='n';             //n
      LCD1602_buffer1[5]=':';             //:
      LCD1602_buffer1[6]='0'+ADT_Z;       //计算千位
      LCD1602_buffer1[7]='.';             //计算个位
      LCD1602_buffer1[8]='0'+ADT_S;       //计算百位
      LCD1602_buffer1[9]='0'+ADT_B;       //计算十位
      LCD1602_buffer1[10]='0'+ADT_Q;      //计算个位
      LCD1602_buffer1[11]='V';            //V
      LCD1602_buffer1[12]=' ';            //
      LCD1602_buffer1[13]=' ';            //
      LCD1602_buffer1[14]=' ';            //
      LCD1602_buffer1[15]=' ';            //
      //DispNChar(0,0,16,LCD1602_buffer1);  //在第一行显示ADC12采集得到的电压值
    
    
    //=============================PID运算======================================
    clr_lastout(2048);                               //设定头一次输出的值,设定值1.5V
    AD_feedback=ADT;                                 //AD采集到的电压作为反馈值
    MAX5812_vout = ypid(given,AD_feedback);          //PI计算
    
    //============================ DAC输出======================================
    
    MAX5812_vout_high = (MAX5812_vout&0xff00)>>8;             //取高8位
    MAX5812_vout_low = (MAX5812_vout&0x00ff);                 //取低8位
    DAC_MAX5812(0xc0,MAX5812_vout_high,MAX5812_vout_low);     //DAC更新输出
    
    //============================LCD1602显示电压输出结果(十进制数)===========
    
    MAX5812_VOUT1=((unsigned long)MAX5812_vout*3300)/4095;    //计算输出电压
    LCD1602_buffer2[0]=' ';
    LCD1602_buffer2[1]='V';
    LCD1602_buffer2[2]='o';
    LCD1602_buffer2[3]='u';
    LCD1602_buffer2[4]='t';
    LCD1602_buffer2[5]=':';                                    //显示Vout:
    LCD1602_buffer2[6]='0'+(MAX5812_VOUT1/1000);               //计算千位
    LCD1602_buffer2[7]='.';
    LCD1602_buffer2[8]='0'+((MAX5812_VOUT1/100)%10);           //计算百位
    LCD1602_buffer2[9]='0'+((MAX5812_VOUT1%100)/10);           //计算十位
    LCD1602_buffer2[10]='0'+(MAX5812_VOUT1%10);                //计算个位
    LCD1602_buffer2[11]='V';                                   //“V”
    LCD1602_buffer2[12]=' ';                                   //
    
    //============================TEC状态判断===================================
    //如果》1.5V,则制冷;反之,《1.5V则加热
    if(MAX5812_VOUT1>1861)                     //1.5V=(1861/4096)×3.3         
    {
      LCD1602_buffer2[13]='H';                  //显示加热
      LCD1602_buffer2[14]='.';
      LCD1602_buffer2[15]=' ';
    }
    else
    {
      LCD1602_buffer2[13]='C';                  //显示制冷
      LCD1602_buffer2[14]='.';
      LCD1602_buffer2[15]='.'; 
    }
    //============================采集和输出电压显示============================
    DispNChar(0,0,15,LCD1602_buffer1);          //在第一行显示ADC12采集得到的电压值
    DispNChar(0,1,15,LCD1602_buffer2);          //在第二行显示输出电压数值
    _NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();_NOP();
    
    
}
*/

//=================================键盘中断服务程序=======================
//PORT_1 interrupt service routine
//interrupt[PORT1_VECTOR] void Port_1(void)    //如果有按键按下,设按键按下标志
#pragma vector=PORT1_VECTOR
__interrupt void PORT1_1(void)

{
    key_flag|=0x01;                         //有键按下,按键标志位置1,else==0
    //P1IFG=0x00;                             //清除中断标志
    //P1DIR=0x00;                             //设置P1口为输入口
    switch(P1IFG&0x38)                       //00111000,判断键盘是否产生中断
    {
      case 8:xi_setup();break;                   //P1.3按下 30H
      case 16:xd_setup();break;                  //P1.4按下 28H
      case 32:xp_setup();                        //P1.5按下 18H
    }
    P1IFG=0x00;                             //清除中断标志
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -