?? 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 + -