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

📄 zhymokuai.c

📁 此为本人今期一个项目的部分C51源程序
💻 C
字号:


#include <REG52.H>
#include <port.h>                        //mcu端口的使用定义
#include <temperature_control.h>
#include <led_display.h>
#include <key.h>
#include <pressure.h>
#include <serial_communication.h>
#include <ctype.h>
#include <stc89le516ad_adc.h>
#include <wtv.h>

#define Bodrate 0xFFDC // FFDC相对于11.0592M晶振下9600波特率
 unsigned char  code ASCII_TAB[17]=
                      {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,//0-9,的ASCII
                       0x2E,0x0a,0x20,0x0d,        //小数点,换行符,空格,回车符,
                       0x2b,0x2d,0x09};            //正号,负号,制表符

 unsigned char idata  Buffer[20];  //串口通信缓冲区
 unsigned char Dis_Buffer[8];      //显示缓冲区声明  


//在pressure.c中定义的数据结构 
 struct Pressure{
    unsigned int  Pressure;         //扩大100倍的水压值
    unsigned char Pressure_Mode;        //设定的水压级别
    unsigned int  Pressure_control_time_count;    //压强调整超过一定的次数后
                                                  //仍不行,则报警
    unsigned char xx;                  //当前角度
    unsigned char yy;                  //目标角度
 };
 extern struct Pressure  My_Pressure;
 
 
//在Temperature.c中定义的数据结构  
 typedef struct Temperature {
              float    SetPoint;           //  设定目标 Desired Value
              float    tt;                 //  测量值     
              unsigned int j;              //扩大100倍整型
              float    LastError;          //  基本偏差 e[t]
              float    PrevError;          //  上次偏差 e[t-1]
              unsigned char  Temperature_Control_Value; //温度控制量
                      	        
 };
 extern struct Temperature  My_Temperature;


//全局控制变量 
  bit Flag_Read_Pressure=1;                //读压强标量
  bit Flag_Read_Temperature=1;             //读温度标量
  bit Flag_UpData_Buffer=1;                //显示缓冲区
  bit Flag_Key_Scan;                       //按键检测标志
  unsigned char  User_Set_Temp_Dis_Count=0;//延时显示用户设定温度计数变量,此变量还在Key.c中引用
 

 
 
 
  
  
/*----------------------------------------------------------------------------------------------
                                     温度分级
------------------------------------------------------------------------------------------------*/           
 unsigned char Temperature_Gread(unsigned int temp)
  { 
    if(temp==355) 
        return(1);
    else if(temp==360)   
        return(2);
    else if(temp==365)   
        return(3);
    else if(temp==370)   
        return(4);
    else if(temp==375)   
        return(5);
    else if(temp==380)   
        return(6);
    else 
        return(0);
    
    
  }
/*---------------------------------------------------------------------------------------
                                T1中断数码管显示程序(2ms)
-----------------------------------------------------------------------------------------*/
void T1_ISR_Display(void) interrupt 3 
{
  TL1=0xcc;
  TH1=0XF8;                //2ms定时初值
  Led_Display(Dis_Buffer); //显示缓冲区起始地址

}
 
/*--------------------------------------------------------------------------------------
                          T0中断加热控制及电动阀门控制(基本周期为10ms)
-----------------------------------------------------------------------------------------*/
void Sample_Temperature_T0(void) interrupt 1  
{
  static  unsigned char Copy_of_Temperature_Control_Value=0;

  static  unsigned char heat_count=0;               //加热控制计数  

  static unsigned char Cycle_200ms_Count=0;         //基本加热周期计数  

  static unsigned char  xiaodou_count=0;            //键盘消抖计数

  static  unsigned char Pressure_Control_Cycle=0;   //压强控制周期计数  

  static unsigned char Motor_Run_Count;             //电机动作一次的时间控制计数 
  
  TL0=0X00;
  TH0=0Xdc; //10ms定时重装
 
  
  User_Set_Temp_Dis_Count++;        //延时显示用户设定温度计数变量
  heat_count++;
  Cycle_200ms_Count++;              //基本加热周期计数值加1
  xiaodou_count++;                  //键盘消抖计数
  Pressure_Control_Cycle++;
  Motor_Run_Count++;
  
/*电动阀门控制程序*/ 
  
//  if(Motor_Run_Count==4){
//      Motor_Run_Count=0;
//      Pressure_Control();
//  }
  
/*加热控制 */ 
  if(heat_count<=Copy_of_Temperature_Control_Value)    //判断是否继续加热
     Heat_Control_Pin=0;
  else{
    Heat_Control_Pin=1;
  }

/*每个加热周期结束前10ms读一次新的温度 */
  if(Cycle_200ms_Count==19)                    
    {
        Flag_Read_Temperature=1;              //置位读温度标志变量
    }
 
  
/*一个周期结束200ms,新周期开始,更新参数  */
  if(Cycle_200ms_Count==20)
     {
       Cycle_200ms_Count=0;
       heat_count=0;
       Copy_of_Temperature_Control_Value=My_Temperature.Temperature_Control_Value;//更新Copy_of_PID_Control_Value
       
     }
  
/*每1秒电动机控制一次 */
  if(Pressure_Control_Cycle==66){
      Pressure_Control_Cycle=0;
      Flag_Read_Pressure=1;     //水压力控制标志变量 具体执行在主程序中
       
  }

/*按键扫描及处理时间间隔不得小于200ms  */
  if(xiaodou_count>=20) {                      
      xiaodou_count=0;
      Flag_Key_Scan=1;
  }
/*温度调整按键延时显示控制  2s */ 
  if(User_Set_Temp_Dis_Count==100){
      User_Set_Temp_Dis_Count=0;
      Flag_UpData_Buffer=1;                   
  } 
   
}
/*---------------------------------------------------------------------------------------
                                显示缓冲区的更新
-----------------------------------------------------------------------------------------*/
void UpData_Dis_Buffer(void)
{
  if(Flag_UpData_Buffer==1){  
      Dis_Buffer[0]=Temperature_Gread((unsigned int)(My_Temperature.SetPoint*10));   //LED温度辅助级别显示
      Dis_Buffer[1]=My_Pressure.Pressure_Mode;          //LED指示灯水压级别
      
      Dis_Buffer[2]=My_Temperature.j/100; 
      Dis_Buffer[3]=My_Temperature.j/10%10; 
      Dis_Buffer[4]=My_Temperature.j%10;                   //更新温度数据
      
      Dis_Buffer[5]=(My_Pressure.Pressure/100);
      Dis_Buffer[6]=(My_Pressure.Pressure/10%10);
      Dis_Buffer[7]=(My_Pressure.Pressure%10);      //更新压强数据
  }  

}
/*----------------------------------------------------------------------------------------
                                串口通信发送缓冲区更新
------------------------------------------------------------------------------------------*/
void UpData_Buffer(void)
{

/*温度数据*/
  Buffer[0] = ASCII_TAB[My_Temperature.j/100];         //取温度十位
  Buffer[1] = ASCII_TAB[My_Temperature.j/10%10];       //取温度个位
  Buffer[2] = ASCII_TAB[10];   //小数点
  Buffer[3] = ASCII_TAB[My_Temperature.j%10];          //取温度小数点1位
  
  Buffer[4] = ASCII_TAB[16];//插入制表符

/*PID_Control_Value数据  */
  Buffer[5] = ASCII_TAB[My_Temperature.Temperature_Control_Value/10];
  Buffer[6] = ASCII_TAB[My_Temperature.Temperature_Control_Value%10];
  
  Buffer[7] = ASCII_TAB[16];//插入制表符

/*//Error数据  
  temp=(int)(Error*10);
  if(temp>0)
      Buffer[8] = ASCII_TAB[14]; //插入正号  
  else{
      Buffer[8] = ASCII_TAB[15]; //插入负号
      temp=-temp;
  }
  Buffer[9] =ASCII_TAB[temp/100];
  Buffer[10]=ASCII_TAB[temp/10%10];
  Buffer[11]=ASCII_TAB[10]; //插入小数点
  Buffer[12]=ASCII_TAB[temp%10];
  
  Buffer[13] = ASCII_TAB[16];//插入制表符


//dError数据
  temp=(int)(dError*100);
  if(temp>0)
      Buffer[14] = ASCII_TAB[14]; //插入正号  
  else{
      Buffer[14] = ASCII_TAB[15]; //插入负号
      temp=-temp;
  }
  
  Buffer[15] = ASCII_TAB[temp/100];
  Buffer[16] = ASCII_TAB[10]; //插入小数点
  Buffer[17] = ASCII_TAB[temp/10%10];
  Buffer[18] = ASCII_TAB[temp%10];
    

//返回压强
  temp=8*My_Pressure.Jun_Pressure-5;
  Buffer[14] = ASCII_TAB[14]; //插入正号
  Buffer[15] = ASCII_TAB[temp/100];
  Buffer[16] = ASCII_TAB[temp/10%10];
  Buffer[17] = ASCII_TAB[10]; //插入小数点
  Buffer[18] = ASCII_TAB[temp%10];*/
  
  
  Buffer[19] = toascii('\0');         //字串数组结束标志
 
}
/*--------------------------------------------------------------------------------------
                                    系统初始化
-----------------------------------------------------------------------------------------*/
void Sys_Init()
{
/*T0方式1,控温;   T1方式1,用于数码管显示  */
  TMOD=0X11;              
  TL0=0X00;
  TH0=0Xdc;//10ms定时重装 
//  ET0=1; TR0=1;
  
  TL1=0xcc;
  TH1=0XF8;                //2ms扫一位数码管
//  ET1=1; TR1=1;


/*串口方式二,查询方式, 波特率由T2定时器提供 */
  SCON=0X50; 
/*T2用做波特率发生器 9600bps */
  T2CON = 0x35;                                 // 0b0011 0101 16位串行波特率
  TH2 = (unsigned char )(Bodrate>>8) ;
  TL2 = (unsigned char )(Bodrate & 0xff);
  RCAP2H  = (unsigned char )(Bodrate>>8) ;
  RCAP2L  = (unsigned char )(Bodrate & 0xff);
//  TR2 = 1;                                      // 启动时钟
                             
  magnet_valve3=1;
  AD_Port_config();//AD端口配置
  
  
   
}


/*--------------------------------------------------------------------------------------
                                    主程序
-----------------------------------------------------------------------------------------*/
 void main(void)
 {
  EA=0;
  Sys_Init();   
  EA=1; 
  
  while(1){
          Led_Display(Dis_Buffer); 
      //if(Flag_Read_Temperature == 1){         //若应该进行读温度操作
      //    Flag_Read_Temperature=0;
      //    //Temperature_Control();            //计算PID_Control_Value 需要3ms 
      //    UpData_Dis_Buffer();              //更新显示缓冲区
      //    //UpData_Buffer();      
      //}
      //if(Flag_Read_Pressure==1){            //若应该进行读压力操作
      //    Flag_Read_Pressure=0; 
      //    //Get_Pressure();                   
      //    //UpData_Dis_Buffer();               //更新显示缓冲区
      //  //Over_Pressure_Protecting();      //水管堵塞,压力突增保护
       
      //}
      //if(Flag_Key_Scan==1){
      //   Flag_Key_Scan=0;
      //   Key_Process();
      //}
      //serial_communication(Buffer);                //串口通信函数,向PC机发送温度数值
 
  } //end while等待中断
  
}//end main()

⌨️ 快捷键说明

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