📄 37.lst
字号:
C51 COMPILER V7.10 37 06/18/2007 10:36:06 PAGE 1
C51 COMPILER V7.10, COMPILATION OF MODULE 37
OBJECT MODULE PLACED IN 37.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 37.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*******************************************************************
2 **************重庆东电通信有限公司***************
3 文件名:SWS—3000加热软件(适用于双面加热)
4 版本:V3.5
5 编写:刘贤曙
6 创建日期:2006.10.7
7 2006.10.31调试OK
8 *******************************************************************/
9 #include<reg52.h>
10 #include<intrins.h>
11 #include<math.h>
12 #define uchar unsigned char
13 #define uint unsigned int
14
15 /********************以下是I2C通信定义******************/
16 uchar RCV_WD[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
17 uchar SEND_WD[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
18 #define SLVADR 0x40 //本机地址
19 union
20 {
21 uint I2c_STemperature;
22 uchar STemperature[2];
23 }byte;
24
25 #define TPL RCV_WD[0] //主机发来的目标温度低位--02h
26 #define TPH RCV_WD[1] //主机发来的目标温度高位--01h
27 #define FLOW RCV_WD[2] //主机发来的流量ml/min --03h
28 #define CWD RCV_WD[3] //主机发来的命令字- -00h
29 //#define RCV_WD[4] //保留
30 //#define RCV_WD[5] //保留
31 //#define RCV_WD[6] //保留
32 //#define RCV_WD[7] //保留
33 #define RTPL SEND_WD[0] //从机发送的适时温度低位--01h
34 #define RTPH SEND_WD[1] //从机发送的适时温度高位----00h
35 //#define SEND_WD[2] //保留
36 //#define SEND_WD[3] //保留
37 //#define SEND_WD[4] //保留
38 //#define SEND_WD[5] //保留
39 //#define SEND_WD[6] //保留
40 //#define SEND_WD[7] //保留
41 #define nop _nop_()
42 uchar reg_adr; //地址偏移量
43 sbit SDA = P3^5; //模拟I2C数据传送位
44 sbit SCL = P3^3; //模拟I2C时钟控制位
45 sbit K_INT = P3^4;
46 bit slv; //I2c数据控制状态标志位,0为发送,1为接收
47 bit DATOK_FLAG; //数据接收完标志
48 bit int1bz; //int1执行标志
49 /*******以下是AD转换定义************/
50
51 sbit AD7705_CLK = P1^3; //AD7705串行时钟
52 sbit AD7705_DIN = P1^4; //AD7705数据输入端
53 sbit AD7705_DOUT = P1^5; //AD7705数据输出端
54 sbit AD7705_DRDY = P3^2; //AD770准备好信号
55 sbit AD7705_REST = P1^2; //AD7705复位信号,低电平复位
C51 COMPILER V7.10 37 06/18/2007 10:36:06 PAGE 2
56 sbit Door = P1^7; //AD结果和环境温度显示转换开关
57 /*********以下是环境温度采集及加热板温度采集定义*********/
58
59 sbit DQ = P1^6;
60 /**************以下是PID调节定义************/
61
62 uchar Kp; //PID调节比例系数
63 #define T_C 2 //采样周期
64 float error; //当前偏差
65 float last_error; //上一次偏差
66 float sum_error; //偏差累加和
67 float P_out,I_out,D_out,PWM_0; //比例项/积分项/微分项
68 float T_target=0.0; //目标温度
69 float T_real = 0.0; //当前温度
70 float PWM = 0; //输出量
71 float Ki = 0; //PID调节积分系数
72 float SV=0;
73 float Kd = 0;
74 #define Ti_H 50
75 #define Td_H 45 //PID调节微分系数
76 #define Ti_L 50 //积分时间常数
77 #define Td_L 45 //微分时间常数
78 uint TC_CNT = 0;
79 uchar TC_zhi=0; //采样周期计数器
80 uchar PWM_CNT= 0 ;
81 uchar Per = 0; //t:占空比计数器; per:输出百分比
82 sbit LED2 = P2^3; //加热状态?灯亮表示正在加热,灯灭表示停止加热
83 sbit LED3 = P2^4; //通信指示,灯亮表示正在通信
84 sbit PID_SW = P1^0; //加热控制执行
85 sbit sanre = P1^1; //散热风扇控制
86 bit PID_flag = 0; //PID运算允许标志
87 //bit sanre_flag;
88 bit First_flag=0;
89 bit End_flag=0;
90 bit DY_flag=0;
91 /**********微秒延时函数********/
92 void delay_US(uchar i)
93 {
94 1 while(i--);
95 1 }
96 /****************************************************
97 *函数原形: void Write_7705(uchar word)
98 *功能: 写AD7705
99 *参数: AD7705控制命令
100 *返回值:无
101 ****************************************************/
102 void Write_7705(uchar Byte)
103 {
104 1 uchar i;
105 1 AD7705_CLK = 1;
106 1 for(i=8;i>0;i--)
107 1 {
108 2 if(Byte&0x80) AD7705_DIN = 1;
109 2 else AD7705_DIN = 0;
110 2 AD7705_CLK = 1;
111 2 nop;
112 2 AD7705_CLK = 0;
113 2 nop;
114 2 AD7705_CLK = 1;
115 2 Byte <<= 1;
116 2 }
117 1 AD7705_CLK = 1;
C51 COMPILER V7.10 37 06/18/2007 10:36:06 PAGE 3
118 1 nop;
119 1 AD7705_DIN = 0;
120 1 }
121
122 /****************************************************
123 **函数原形:uint Read_7705()
124 **功能:读AD7705转换后数据
125 **参数:无
126 **返回值:转换结果
127 *****************************************************/
128
129 uint Read_7705(void)
130 {
131 1 uchar i,j,k=4;
132 1 uint AD_data=0x0000;
133 1 long int sum_data=0;
134 1 for(j=0;j<8;j++)
135 1 {
136 2 Write_7705(0x38);
137 2 AD7705_CLK=1;
138 2 while(AD7705_DRDY==1)
139 2 { delay_US(100);
140 3 k-- ;
141 3 if(!k) break;
142 3 }
143 2 for(i=16;i>0;i--)
144 2 {
145 3 AD_data=AD_data<<1;
146 3 AD7705_CLK=0;
147 3 nop;
148 3 AD7705_DOUT=1;
149 3 if(AD7705_DOUT) AD_data|=0x0001;
150 3 else AD_data|=0x0000;
151 3 AD7705_CLK=1;
152 3 }
153 2 AD7705_CLK=1;
154 2 nop;
155 2 AD7705_DIN=1;
156 2 sum_data+=AD_data;
157 2 AD_data=0x0000;
158 2 }
159 1 AD_data=sum_data>>3;
160 1 return(AD_data);
161 1 }
162
163 /*******************************************************
164 **函数原形: void Init_7705(void)
165 **功能:初始化AD7705,设置为20HZ更新率、双极性、自校准、增益128
166 **参数:无
167 **返回值:无
168 *********************************************************/
169
170 void Init_7705(void) //初始化7705
171
172 {
173 1 uchar i;
174 1 AD7705_CLK=1;
175 1 nop;
176 1 AD7705_DIN=1;
177 1 for (i=0;i<40;i++) // AD7705复位
178 1 {
179 2 AD7705_CLK=0;
C51 COMPILER V7.10 37 06/18/2007 10:36:06 PAGE 4
180 2 nop;
181 2 AD7705_CLK=1;
182 2 }
183 1 Write_7705(0x20); //写通信寄存器设置通道1 选择下一个操作是写时钟寄存器
184 1 Write_7705(0x04); //写时钟寄存器设置更新速率为20Hz
185 1 Write_7705(0x10); //通道1 ,下一个写设置寄存器
186 1 Write_7705(0x7a); //写设置寄存器,设置成双极性、增益为128、自校准
187 1 }
188
189 /********************************************************
190 **
191 **环境温度采集
192 **
193 **
194 ********************************************************/
195
196 Init_DS18B20(void)
197 {
198 1 uchar x = 0;
199 1 DQ = 1; //DQ复位
200 1 delay_US(8);
201 1 DQ = 0; //拉低
202 1 delay_US(80); //延时 480us
203 1 DQ = 1; //拉高总线
204 1 delay_US(14); //稍延时后 如果DQ=0则初始化成功 DQ=1则初始化失败
205 1 x = DQ;
206 1 delay_US(20);
207 1 }
208
209 /*******************************************************
210 **函数原形:Read_byte(void )
211 **函数功能:读18B20一个字节
212 **参数:无
213 **返回值:读出的数据
214 ********************************************************/
215
216 Read_byte(void )
217 {
218 1 uchar i = 0,dat = 0;
219 1 for (i=8;i>0;i--)
220 1 {
221 2 DQ = 0; // 给脉冲信号
222 2 dat >>= 1;
223 2 DQ = 1; // 给脉冲信号
224 2 if(DQ)
225 2 dat |= 0x80;
226 2 delay_US(4);
227 2 }
228 1 return(dat);
229 1 }
230
231 /*******************************************************
232 **函数原形:void Write_byte(uchar dat)
233 **函数字功能:向DS18B20写入命令
234 **参数:命令数据
235 **返回值:无
236 ********************************************************/
237
238 void Write_byte(uchar dat)
239 {
240 1 uchar i = 0;
241 1 for (i=8; i>0; i--)
C51 COMPILER V7.10 37 06/18/2007 10:36:06 PAGE 5
242 1 {
243 2 DQ = 0;
244 2 DQ = dat&0x01;
245 2 delay_US(5);
246 2 DQ = 1;
247 2 dat >>= 1;
248 2 }
249 1 }
250
251 /*******************************************************
252 **函数原形:uint Read_Temp_surr(void)
253 **函数功能:读取DS18B20数据并计算出温度
254 **参数:无
255 **返回值:温度
256 ********************************************************/
257
258 uint Read_Temp_surr(void)
259 {
260 1 uchar th=0,tl=0;
261 1 uint temp=0;
262 1 EA=0; //禁T0中断
263 1 Init_DS18B20();
264 1 Write_byte(0xCC); // 跳过读序号列号的操作
265 1 Write_byte(0x44); // 启动温度转换
266 1 Init_DS18B20();
267 1 Write_byte(0xCC); //跳过读序号列号的操作
268 1 Write_byte(0xBE); //读取温度寄存器
269 1 tl=Read_byte(); //低字节
270 1 th=Read_byte(); //高字节
271 1 EA=1;
272 1 temp=(uint)((th*256+tl)/16.0*10);
273 1 return temp;
274 1 }
275
276 /***************************************
277 定时器初始化
278 ****************************************/
279
280 void T_Init()
281 {
282 1 TMOD = 0xe1 ; //定时器工作方式:定时器1外控、计数方式2,定时器0、方式1
283 1 IE = 0x0a ; //开外中断INT0
284 1 PT1 = 1 ; //定时器1中断优先
285 1 TH1 = 0x0ff ;
286 1 TL1 = 0x0ff ;
287 1 TH0 = 0xd8; //定时初值10MS
288 1 TL0 = 0xef;
289 1 nop;
290 1 EA = 1 ; //总中断开放
291 1 TR1 = 1 ; //启动T1
292 1 }
293
294 /*****************************************************
295 **函数原形
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -