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

📄 温度控制.lst

📁 PID 的温度控制
💻 LST
📖 第 1 页 / 共 2 页
字号:
C51 COMPILER V6.12  _耞萠___                                                               03/11/2009 16:17:00 PAGE 1   


C51 COMPILER V6.12, COMPILATION OF MODULE _耞萠___
OBJECT MODULE PLACED IN .\温度控制.OBJ
COMPILER INVOKED BY: F:\Keil\C51\BIN\C51.EXE .\温度控制.c BROWSE DEBUG OBJECTEXTEND

stmt level    source

   1          #include <REG52.H>
   2          #include <intrins.h>
   3          #define uint unsigned int
   4          #define uchar unsigned char
   5          
   6          sbit  wireless_1 = P3^0;
   7          sbit  wireless_2 = P3^1;
   8          sbit  wireless_3 = P3^2;
   9          sbit  wireless_4 = P3^3;
  10          sbit  ACC0 = ACC^0;
  11          sbit  ACC7 = ACC^7;
  12          
  13          void show_time(); //液晶显示程序
  14          #define tim0 65536-1000    
  15          #define tim1 65536-20000
  16          uchar tm=1,tx=0;          //记数两个定时中断的
  17          enum{Y,U,R,Ts,Kd,Kp};//Y采集量 U控制量 R 设定量 Ts 采样时间 Kd 微分 Kp比例
  18          int para[6],ptr,out;       //out 是从PID()得到的控制量
  19          int wd,wd1,r,kp,kd,ts,e2,e1,e0,u; //wd 是从DS18B20采到的数据
  20          
  21          bit  dealCS=0;
  22          sbit EN1=P2^2;
  23          sbit IN1=P2^1;
  24          sbit PWM=P2^0;
  25          
  26          
  27          
  28          
  29          sbit DQ = P2^4;        //温度传送数据IO口
  30          char done,count,temp,flag,up_flag,down_flag;
  31          uchar temp_value;      //温度值
  32          uchar TempBuffer[15], week_value[2];
  33          uchar TempBuffer1[7];
  34          uchar Ctrltab[20]={8,15,20,40,50,60,70,80,100,120,140,160,180,200};
  35          
  36          char	T=23;
  37          char 	disp;
  38          void	show_time1(void);
  39          void	debouncer(void);   //去键盘抖动延时函数
  40          void	shezhiwendu(void); //设定温度函数
  41          void	scanner(void);
  42          void     PID(); 	   //键盘扫描函数
  43          #define	rowkey()(~P1)&0x0f //读取端口宏定义
  44          
  45          /**************去抖动延时函数***************/
  46          void	debouncer(void)
  47          {	int i;
  48   1      	for(i=0;i<2400;i++);
  49   1      }
  50          /*******************************************/
  51          
  52          /**************设置温度函数***************/
  53          void	shezhiwendu(void)
  54          {
  55   1       while(1)
C51 COMPILER V6.12  _耞萠___                                                               03/11/2009 16:17:00 PAGE 2   

  56   1            { 
  57   2      	  	scanner();
  58   2      		show_time1();
  59   2      
  60   2      	  	if(disp==2)   { T++;	disp=0; } 
  61   2      			 
  62   2              if(disp==3)   { T--;	disp=0; } 
  63   2      			  
  64   2      	    if(disp==4)    break; 
  65   2      		
  66   2            }
  67   1      }
  68          
  69          /*******************************************/
  70          
  71          /***********键盘扫描函数********************/
  72          
  73          void	scanner(void)
  74          {	char	col,row;
  75   1      	char	scan,keyin;
  76   1      	scan=0xef;
  77   1      	for(col=0;col<4;col++)
  78   1      	{	P1=scan;
  79   2      		keyin=rowkey();
  80   2      		if(keyin!=0)
  81   2      			{	for(row=0;row<4;row++)
  82   3      					{	if(keyin==(0x01<<row))
  83   4      							{	disp=row+4*col;
  84   5      								break;
  85   5      							}
  86   4      							if(row==4)
  87   4      							disp=0;
  88   4      					}
  89   3      					while(rowkey());
  90   3      					debouncer();
  91   3      			}
  92   2      			scan=(scan<<1)|0x01;
  93   2      	}
  94   1      }
  95          
  96          /*****************************************************/
  97          
  98          
  99          
 100          
 101          void  initTimer0_Timer1()    //初始化定时器0,定时器1
 102          {
 103   1      
 104   1      
 105   1      TMOD=0x01;
 106   1      TH0=tim0>>8; TL0=tim0; 
 107   1      
 108   1      TR0=1;
 109   1      ET0=1;
 110   1      EA=1;
 111   1      
 112   1      
 113   1      }
 114          
 115          void  initPID()          //初始化PID函参数
 116          {
 117   1       
C51 COMPILER V6.12  _耞萠___                                                               03/11/2009 16:17:00 PAGE 3   

 118   1        para[Kp]=100; 
 119   1        para[Kd]=3;  
 120   1        para[Ts]=10;
 121   1        
 122   1      }
 123          
 124          
 125          void PID()             //PID服务程序
 126          {  
 127   1         
 128   1         TR0=0;
 129   1         ET0=0;
 130   1         EA=0;       		       //检测的温度
 131   1        		               //wd设定的温度
 132   1        e0=e1;e1=e2;e2=wd-T; 
 133   1        kp=para[Kp]; kd=para[Kd]; ts=para[Ts];
 134   1        u=wd+kp*(e2+kd*(e2-e1));
 135   1        if(u<0) u=0;
 136   1        if(u>500) u=500;
 137   1        out=u/10;		       //控制量
 138   1         
 139   1         TR0=1;
 140   1         ET0=1;
 141   1         EA=1; 
 142   1      
 143   1      
 144   1      }
 145          
 146          
 147          void PWM_timer0() interrupt 1    //定时器0中断服务子程序
 148          {
 149   1        TH0=tim0>>8; TL0=tim0; 
 150   1        
 151   1           if(tm++>=out) 
 152   1             
 153   1            PWM=0;        //通过变量out控制PWM脉冲宽度
 154   1             else PWM=1; 
 155   1       
 156   1      if(tm>=50) 
 157   1       {  
 158   2      
 159   2      PID();     
 160   2      tm=1;           //通过变量tm控制PWM的周期
 161   2        }  
 162   1      		   
 163   1      }
 164          
 165          
 166          /*
 167          
 168          void timer1() interrupt 3      //定时器1中断服务子程序 
 169          {
 170            TH1=tim1>>8; TL1=tim1;
 171            if(dealCS==0)            ///模糊控制
 172            {
 173              wdCtrl=para[R];
 174              if((wdCtrl-wd/10)>10)out=0;
 175              else if((wd/10-wdCtrl)>2)out=225;
 176            else out=Ctrltab[wdCtrl+2-wd/10]; 
 177            }
 178          else if(tx++>=ts)          //dealCS为1,选择的是PID();
 179            {
C51 COMPILER V6.12  _耞萠___                                                               03/11/2009 16:17:00 PAGE 4   

 180          
 181            tx=0;
 182            }
 183          }	*/	
 184            
 185          
 186          /***********1602液晶显示部分子程序****************/
 187          
 188          sbit LcdRs		= P2^5;
 189          sbit LcdRw		= P2^6;
 190          sbit LcdEn  	= P2^7;
 191          sfr  DBPort 	= 0x80;		//P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
 192          
 193          //内部等待函数**************************************************************************
 194          unsigned char LCD_Wait(void)
 195          {
 196   1      	LcdRs=0;
 197   1      	LcdRw=1;	_nop_();
 198   1      	LcdEn=1;	_nop_();
 199   1      						 
 200   1      	LcdEn=0;
 201   1      	return DBPort;		
 202   1      }
 203          //向LCD写入命令或数据************************************************************
 204          #define LCD_COMMAND			0      // Command
 205          #define LCD_DATA			1      // Data
 206          #define LCD_CLEAR_SCREEN	0x01      // 清屏
 207          #define LCD_HOMING  		0x02      // 光标返回原点
 208          
 209          void LCD_Write(bit style, unsigned char input)
 210          {
 211   1      	LcdEn=0;
 212   1      	LcdRs=style;
 213   1      	LcdRw=0;		_nop_();
 214   1      	DBPort=input;	_nop_();//注意顺序
 215   1      	LcdEn=1;		_nop_();//注意顺序
 216   1      	LcdEn=0;		_nop_();
 217   1      	LCD_Wait();	
 218   1      }
 219          
 220          //设置显示模式************************************************************
 221          #define LCD_SHOW			0x04    //显示开
 222          #define LCD_HIDE			0x00    //显示关	  
 223          
 224          #define LCD_CURSOR			0x02 	//显示光标
 225          #define LCD_NO_CURSOR		0x00    //无光标		     
 226          
 227          #define LCD_FLASH			0x01    //光标闪动
 228          #define LCD_NO_FLASH		0x00    //光标不闪动
 229          
 230          void LCD_SetDisplay(unsigned char DisplayMode)
 231          {
 232   1      	LCD_Write(LCD_COMMAND, 0x08|DisplayMode);	
 233   1      }
 234          
 235          //设置输入模式************************************************************
 236          #define LCD_AC_UP			0x02
 237          #define LCD_AC_DOWN			0x00      // default
 238          
 239          #define LCD_MOVE			0x01      // 画面可平移
 240          #define LCD_NO_MOVE			0x00      //default
 241          

⌨️ 快捷键说明

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