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

📄 module.lst

📁 一个锅炉温度控制程序
💻 LST
📖 第 1 页 / 共 3 页
字号:
C51 COMPILER V3.20,  SN-0  MODULE                                                          05/24/04  10:40:00  PAGE 1   


DOS C51 COMPILER V3.20, COMPILATION OF MODULE MODULE
OBJECT MODULE PLACED IN MODULE.OBJ
COMPILER INVOKED BY: C:\XINGYAN\FSI\BIN\C51.EXE MODULE.C DB SB OE ROM(LARGE) SMALL OT(2) RB(0) 

stmt level    source

   1          /* module.c
              * main program   新驱动(2路7703加2块继电器)					2003/1/11
              */
   4          #include "absacc.h"
   5          #include "math.h"
   6          #include "sja.h"
   7          #include "jdq.h"
   8          #include "pid.h"
   9          #include <reg52.h>
  10          #include <intrins.h>
  11          #include <string.h>
  12          #include "link.h"
  13          #include "ad7703_2.h"
  14          #include "watchdog.h"
  15          #include "delay.h"
  16          #include "exp.h"
  17          #include "L8279.h"
  18          #include "XData.h"
  19          //#include "PinAlarm.h"
  20          /*==================================================================
              								Main
              ==================================================================*/
  23          /*
              2003-2-27   王嵩
              1加入模块PID控制,并有多种算法选择;
              2断开模块PID时,由上位机给出控制量;
              3上位机能直接控制继电器;
              4若无阀位反馈,可用灵敏度法控制;
              5新增定时器0中断;
              6上位机可优化模块PID各参数;
              7实时采集温度数据;
              8可一次1帧或5帧收发数据;
              */
  34          /*数据采集双缓冲
              采集数据ad_val和cool_temp,外部读取ad_val_bk和cool_temp_bk*/
  36          
  37          /*
              *		修改:王占成
              *		zcwang@mail.ustc.edu.cn
              *		2003.4.29
              *		加入键盘和显示器部分
              *
              */
  44          
  45          /***************************************************************/
  46          /**********外部变量***************/
  47          BYTE RXdata[11];
  48          BYTE TXdata[11];
  49          idata BYTE nr_frame;
  50          idata BYTE TempTimes;
  51          idata BYTE PIDTimes;
  52          idata BYTE OnNewData;
  53          idata BYTE NewLEDStatus;
  54          idata BYTE TFlag;
  55          idata BYTE DispTtime;
C51 COMPILER V3.20,  SN-0  MODULE                                                          05/24/04  10:40:00  PAGE 2   

  56          idata BYTE DispTFlag;
  57          
  58          idata UINT cool_temp;
  59          idata UINT cool_temp_bk;
  60          idata UINT ad_val_bk[2];
  61          idata UINT SP_nCount = 0;
  62          
  63          BYTE p0val;
  64          
  65          
  66          void data_sample()/*采集AD7703温度角度数据和室温数据*/
  67          {	
  68   1      	ad_val00 = read_ad_1();	ad_val10 = read_ad_2();
  69   1      	ad_val01 = read_ad_1();	ad_val11 = read_ad_2();
  70   1      	ad_val02 = read_ad_1();	ad_val12 = read_ad_2();
  71   1      	ad_val03 = read_ad_1();	ad_val13 = read_ad_2();
  72   1      	
  73   1      	cool_temp = read_ds_data();
  74   1      	clear_watchdog();
  75   1      	return;
  76   1      }
  77          void order(UINT * table,BYTE size)/*排序   put the max into ad_val_0[4]*/
  78          {
  79   1      	BYTE i,j;
  80   1      	UINT tmp;
  81   1      	for(i=size-1;i>=1;i--){/*共比较(size-1)轮*/
  82   2      		clear_watchdog();
  83   2      		for(j=0;j<i;j++){
  84   3      			if(table[i] < table[j]){
  85   4      				tmp = table[j];
  86   4      				table[j] = table[i];
  87   4      				table[i] = tmp;			
  88   4      				}
  89   3      		}
  90   2      	}
  91   1      	return;
  92   1      }
  93          void cp_temp()/*处理7703采集的数据*/
  94          {
  95   1      	EA=0;
  96   1      	order((UINT *)XAD0,4);/*将ad_val[i]去掉1个最大值,1个最小值,剩余2个求平均*/
  97   1      	order((UINT *)XAD1,4);
  98   1      	ad_val_bk[0] = (ad_val01+ad_val02)>>1;
  99   1      	ad_val_bk[1] = (ad_val11+ad_val12)>>1;
 100   1      	cool_temp_bk = cool_temp & 0x7FF;
 101   1      	EA=1;
 102   1      	clear_watchdog();
 103   1      	return;
 104   1      }
 105          
 106          void PinAlarm()   /***++=蜂鸣器报警程序++=***/
 107          {  BYTE i;
 108   1        for(i=0;i<500;i++){    /***产生500Hz方波,持1秒***/
 109   2           P2=0x28;           /***选通Y1***/
 110   2           delay1ms();
 111   2           P2=0xF8;
 112   2           delay1ms();
 113   2         }
 114   1         clear_watchdog();
 115   1         AlarmFlag = 0;
 116   1      }
 117          
C51 COMPILER V3.20,  SN-0  MODULE                                                          05/24/04  10:40:00  PAGE 3   

 118          void init_system()		/*系统初始化*/
 119          {  
 120   1      	BYTE baud;
 121   1      	EA = 0;	/* 禁止中断 */
 122   1      	
 123   1      	/* 设置CPU寄存器 */
 124   1      	
 125   1      	IE=0x2F;	/*定时器0中断计算温度角度*/
 126   1      				/*定时器1中断设定值曲线*/
 127   1      				/*定时器2中断PID计算*/
 128   1      				/*外部中断0收发数据*/
 129   1      				/*外部中断1响应键盘中断*/
 130   1      	
 131   1      	IP=0x01;    /*外部中断0优先级最高*/
 132   1      	
 133   1      	TCON=0x01;  /*外部中断0下降沿触发,外部中断1低电平触发*/
 134   1      	T2CON = 0x00; /*中断程序设置T2CON.7 = 0, T2CON.2 = 0 (stop counter) */
 135   1      	T2MOD = 0x00; /*增计数*/ 
 136   1      	RCAP2H = 0x9E;
 137   1      	RCAP2L = 0x58;/*定时长度25ms*/
 138   1      	TMOD=0x11;     /*定时器0,1工作在模式1,16位定时器*/
 139   1      	TH0 = 0;      
 140   1      	TL0 = 0;         /*定时器0定时长度65ms*/
 141   1      	TH1 = 0x3c;
 142   1      	TL1 = 0xaf;		/*定时器0定时长度50ms*/
 143   1      	
 144   1      	/* 读取模块地址 */
 145   1      	
 146   1      	P2 = 0x08;
 147   1      	p0val = P0;			/*不要使用访问内存的方法读取*/
 148   1      	P2 = 0xF8;
 149   1      	
 150   1      	/* 设置外设 */
 151   1      	init_watchdog();  /*初始化看门狗*/  
 152   1      	Init_8279();
 153   1      	init_jdq();
 154   1      	init_ad7703();    /* 4k Hz */
 155   1      	
 156   1      	switch(p0val&0xc0){
 157   2      	case 0x00:		baud=0xc3;		break;
 158   2      	case 0x40:		baud=0xc9;		break;
 159   2      	case 0x80:		baud=0xd3;		break;
 160   2      	case 0xc0:		baud=0xe7;		break;
 161   2      	}
 162   1      	
 163   1      	clear_watchdog();
 164   1      	init_sja(p0val&0x3f,baud);
 165   1      	
 166   1      	if((PIDIni != 0x01)&&(RFlag!=0xc5)) {    /***+++++ 上电复位时,初始化各PID参数++++****/
 167   2      		Init_Para();
 168   2      		PIDIni = 0x01;
 169   2      	}
 170   1      	
 171   1      
 172   1      	     
 173   1      	
 174   1      	EA = 1;
 175   1      	
 176   1      	TR0 = 1;/*定时器0开*/
 177   1      	TR2 = 1;/*定时器2开*/
 178   1      	  if(RFlag==0xC5)
 179   1      	      TR1 = 1;  /*定时器1开*/
C51 COMPILER V3.20,  SN-0  MODULE                                                          05/24/04  10:40:00  PAGE 4   

 180   1      	return;
 181   1      }
 182          
 183          void main()
 184          {
 185   1      	BYTE i;
 186   1      	OnNewData = TRUE;
 187   1      	NewLEDStatus = TRUE;
 188   1      	ResetFlag=0;
 189   1      	TempFlag=1;
 190   1      	PIDFlag = 0; 
 191   1      	TFlag = TRUE;
 192   1      	DispTtime = 0;
 193   1      	DispTFlag = TRUE;
 194   1      	AlarmFlag = 0;                 /*+++++AlarmFlag = 0 不报警 **/     
 195   1      	AlarmTime = 0;
 196   1      	AutoFlag = 1;                  /***自动控制**/
 197   1      	
 198   1      	init_system();			/*系统初始化*/
 199   1      	 
 200   1      	     
 201   1      	RFlag=0xC5;                    /**用于区分复位标志**/
 202   1      	do{		
 203   2      		if (ResetFlag == 1){
 204   3      			init_system();
 205   3      			ResetFlag=0;
 206   3      		}
 207   2      		
 208   2      		if((TFlag == TRUE) && (DispTFlag == TRUE)){
 209   3      			DispT();
 210   3      			DispTFlag = FALSE;
 211   3      		}
 212   2      		
 213   2              if (TempFlag == 1){			 /*采样*/	
 214   3      			data_sample();           /* 读取来自7703数据 */
 215   3      			cp_temp();               /*AD7703采样数据处理*/		
 216   3      			
 217   3                  TempFlag=0;
 218   3      			
 219   3      			Yk=CalcTemp();          /*计算当前温度*/
 220   3      			Angle=CalcAngle();      /*有反馈,计算当前阀位角度*/ 
 221   3      		}	
 222   2      		
 223   2      		if(OnNewData == TRUE)	{		/*接受到了新帧*/
 224   3      			Update_PID_Para();   /*更新PID参数,为测试用总更新*/
 225   3      		}
 226   2      		
 227   2      		if((PIDFlag == 1)&&(AutoFlag == 1)){/*PID计算 每4秒钟执行一次PID控制*/ 

⌨️ 快捷键说明

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