📄 温度控制.lst
字号:
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 + -