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

📄 main.c

📁 此代码位PIC单片机的PID控温程序
💻 C
字号:

/*************************************************
  File name:  main.c     
  Description:  
    1.本程序文件主要功能:实现仪器运行状态的控制,读取当前温度值,和拨码开关校准值,控制LED状态指示灯.
	2.void main (void)   主函数调用 init(),ad_read(),temp_control()函数.
    3.init():单片机配置的初始化
      ad_read():输出当前采样的温度值,act_temp;
                输出当前AD采样的校准值,adjust_value;
                输出断路,短路报警,控温过程中超温报警;
    4. temp_control():控温程序
  Others:        
  Function List:  
    1.void main (void)   主函数
    2.void init(void)    初始化函数
    3.void temp_control() 控温程序
    4.void ad_read()      读取AD采样值,并计算当前温度,判断仪器运行状态.
  History:       
    1. Date:
       Author:
       Modification:
    2. ...
*************************************************/
/**/
#include <pic.h>
#include "main.h"
#include   <stdlib.h>

/**********************
  申明模块中所调用的函数
***********************/

void init(void);
//void temp_control();
void ad_read();

/*************************
申明变量
*************************/

unsigned char channel;            //ad采样通道变量
unsigned char machine_status;     //仪器运行状态变量
int temp_ad_value;       //ad采样的温度变量
unsigned int adjust_ad_value;     //ad采样校准值
int control_temp;                 //控制温度变量
int i_data,p_data;                //pid控制参数
int act_temp;                     //计算温度值                 
int run_control;                  //pid控制量
extern bit keyok;                 //按键检测标志位
extern bit error_flag;            //超温报警标志
extern unsigned char led_time;    //led闪烁时间控制量
extern int adjust_value;          //校准值
extern bit err_time_flag;;
extern unsigned char adjust_num; 
extern unsigned int error_time;
extern unsigned char adjust_scan;
extern bit run_flag;

const  int ad_value_tab[9]={0x0075,0x00DC,0x014C,0x01BF,0x0232,0x02A3,0x0310,0x0375,0x03D4};//温度采样值
                                   //  0,     5,    10,    15,    20,    25,     30,    35,    40
const  int adjust_tab[9]={0x0000,0x0088,0x010D,0x0188,0x01F8,0x025F,0x02BE,0x0316,0x0367}; //拨码开关采样值。
                                  //-2    ,-1.5,  -1.0,   -0.5, 0,     0.5,   1.0,   1.5  ,  2,


/***********************************************************
 Function:         ad_read()
 Description:      读取AD采样值,温度计算,检测传感器,拨码开关短路报警,断路报警;超温报警
                   以及仪器运行状态指示灯显示。
 Calls:                
 Called By:        main();
 Input:           
 Output:           act_temp;adjust_value;
 Return:           
 Others:          
**************************************************************/                   
                   




void ad_read()
{
     unsigned char temp;
     
     temp=0;
     if(temp_ad_value>=ad_value_tab[0] && temp_ad_value<=ad_value_tab[8])       //判断是否在控温范围之内.
     {
         
         while(temp<=8)
         {
              if ((temp_ad_value >= ad_value_tab[temp]) && (temp_ad_value <= ad_value_tab[temp+1]))
              {
                
                   act_temp=(int)(temp*50)+(50*(temp_ad_value-ad_value_tab[temp]))/(ad_value_tab[temp+1]-ad_value_tab[temp]);//计算温度值
                   temp=8;
              }//end if ((temp_ad_value >= ad_value_tab[temp]) && (temp_ad_value <= ad_value_tab[temp+1]))
              temp++; 
         }//end while(temp<=8)
              

         if(machine_status==stop)      //停止状态指示灯状态
         {
              hold_led=false;
              if(led_time<25)
              {
                   cool_led=true;
              }
              else
              {
                   cool_led=false;
              }
         }//end if (machine_status==stop)


         if(machine_status==run)      //运行状态 指示灯状态
         {
              if((act_temp-control_temp)>6)
              {
                   cool_led=true;             //制冷
                   hold_led=false;
              }
              else if((control_temp-act_temp)>6)
              {
                   cool_led=false;           //加热
                   hold_led=false;
              }
              else
              {
                   cool_led=false;
                   hold_led=true;            //恒温
                   err_time_flag=true;
                  // error_flag=true;
              }

              if(error_flag==true && abs(act_temp-control_temp)>30)
              {
                   if(led_time<25)
                   {
                       cool_led=true;
                       hold_led=true;     //超温报警
                   }
                   else
                   {   
                       cool_led=false;
                       hold_led=false;
                   }
              }
              
         }  //end if (machine_status==run)
    }//end if(temp_ad_value>=ad_value_tab[0] && temp_ad_value<=ad_value_tab[8])(ad_value_tab[0]-100)(ad_value_tab[8]+38)

    else if(temp_ad_value<=0 || temp_ad_value>=0x3FF)     //传感器报警指示灯状态 
    {   
        
         if(led_time<25)
         {
              cool_led=true;
              hold_led=true;         //制冷,恒温指示灯同时闪烁i
         }
         else
         {   
              cool_led=false;
              hold_led=false;
         }
        run_flag=false;
        machine_status=stop;
    }//end if(temp_ad_value<(ad_value_tab[0]-40) || temp_ad_value>(ad_value_tab[8]+15))


    for(adjust_num=0;adjust_num<9;adjust_num++)
    {
         if(abs(adjust_ad_value-adjust_tab[adjust_num])<30)
         {
              adjust_scan=adjust_num;
         }
             
    }
         
    switch(adjust_scan)                        //读取拨码开关状态
    {
         case 0:adjust_value=-20;break;
         case 1:adjust_value=-15;break;
         case 2:adjust_value=-10;break;
         case 3:adjust_value=-5; break;
         case 4:adjust_value=0; break;
         case 5:adjust_value=5;break;
         case 6:adjust_value=10;break;
         case 7:adjust_value=15;break;
         case 8:adjust_value=20;break;
         default:;
     }

    if(adjust_ad_value>=(adjust_tab[8]+50))//拨码开关,短路断路报警.
    {
         
         if(led_time<25)
         {
              cool_led=true;
              hold_led=true;
         }
         else
         {   
              cool_led=false;
              hold_led=false;
         }
         run_flag=false;
         machine_status=stop;
    }//end  if(adjust_ad_value>=(adjust_tab[8]+50))
  
   // adjust_value=0;
}


/*************************************************
 Function:         void init(void)  
 Description: 
 Calls:                
 Called By:    main()    
 Input:           
 Output:       单片机基本配置    
 Return:           
 Others:          
                   
                   
                           
*************************************************/

void init(void)                   //初始化函数
{   
   //初始化PORTC
   // IRP=1;
    OSCCON=0x67;
    CMCON0=0x07;
    PORTC = 0x00;
                                  //RC0,RC1,RC5输出;其他做为输入端口。三态控制寄存器。
    TRISC=0x1C;
 
    ADCON0 = 0xC0;                //结果右对齐,参考电压选择VREF.
    ADCON1 = 0x10;                //fosc/8
    ANSEL = 0xC0;                 //AN7,AN6为模拟输入口;其他为I/O口。11000000;
    ADIF = 0;
    ADIE = 1;                     //使能AD转换中断
    ADON = 1;     				  //A/D转换模块正在工作
    //T1初始化

    T1CON = 0x05;                 //T1CON控制寄存器   启动T1 ,选择内部时钟源FOSC/4,不于外部时钟输入同步。
    TMR1L = 0xF0;
    TMR1H = 0xD8;
    PIE1 = 0x41;                  //外设中断使能寄存器1,使能time1溢出中断   ,使能AD转换中断 ,T2匹配中断
    TMR1IF=0;
    TMR1IE = 1;
    TMR1ON = 1;                   //启动T1
    INTCON = 0xE0;
     
    //T2初始化
    T2CON=0x00;                   //TMR2控制寄存器
    CCP1CON=0x0C; //Single output; P1B modulated; P1B, P1C, P1D assigned as port pinsPWM mode; P1A, P1C active-high; P1B, P1D active-high
    TMR2IF=0;
    CCPR1L=0x00;       
    PR2=0x3F;                     //设置pwm周期
    TMR2ON = 1;
   
    //TIME0 初始化
    T0CS = 0;                      ///选择内部指令时钟周期
    T0IF=0;
    T0IE=1;                      
    TMR0 = 0x00;
    GIE=1;                        //使能所有非屏蔽中断 
}





/********************************************
 Function:         void main(void) 
 Description: 
            主程序,控制仪器运行.
 Calls:        init(),ad_read(),temp_control();     
 Called By:     
 Input:           
 Output:       仪器运行状态  
 Return:           
 Others:          
               
*********************************************/
void main(void)
{
	init();                  //调用初始化函数
    keyok=false;
    channel=6;               //附ad采样通道
    run_flag=false;
    machine_status=stop;     //仪器进入停止状态.

    while (1)
    {    
        if(machine_status==stop)
        {
             
             error_flag=false;     
             err_time_flag=false;
             error_time=0;
             ad_read();             //调用ad_read()
             
             
             if(keyok==true)
             {
                 keyok=false;
                 run_flag=true;
                 machine_status=run;
             }
        }//end if(machine_status==stop)


        else if(machine_status==run)
        {
             ad_read();
             control_temp=40+adjust_value; //控温点
            // temp_control();               //调用控温函数
           
             if(keyok==true)               //有键按下,进入停止状态
             {
                 keyok=false;
                 run_flag=false;
                 machine_status=stop;
             }
        }//end if(machine_status==run)
    }
}


⌨️ 快捷键说明

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