📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 08/18/2007 15:46:46 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include <intrins.h>
3 #include <absacc.h>
4 #include "define.h"
5 #include "delay.h"
6 #include "da0832.h"
7 #include "DS18B20_5.h"
8 #include "lcd1602.h"
9 #include "zlg.h"
10 #define PMAX 100
11 #define PMIN 0
12 typedef struct
13 {
14 char kp,ki,kd;
15 int e2,e1,e0;
16 long pa,vpa;
17 }mypid;
18 mypid p1;
19 int final_tem,cur_tem;
20 //uchar point_on;
21
22 //sbit point0=P1^3;
23 //sbit pout=P1^4;
24 #define Time_Unit 80
25 uchar num_unit=0;
26 uint num100unit=0;
27 int2char pwm_dtime;
28 uchar Action();//执行控制量
29 uint Set_Tem4();//设定4位的温度值
30 int PID();//增量式pid算法,输出为控制量增量p1.vpa 和 p1.pa
31 void main()
32 {
33 1 uchar keyv;
34 1 Lcd_Initial();
35 1 Key_Initial();
36 1 p1.kp=50;//pid参数设置
37 1 p1.ki=10;
38 1 p1.kd=5;
39 1
40 1 da_1=0;
41 1 final_tem=Set_Tem4();//设定温度
42 1 p1.pa=0;
43 1 p1.e2=0;
44 1 p1.e1=0;
45 1 p1.e0=0;
46 1 //point_on=100;//不导通
47 1
48 1 TR0=0;//开定时器0
49 1 TMOD=0x11;
50 1 TH0=0xff;
51 1 TL0=0xe0;
52 1 TR0=1;
53 1 IE=IE|0x02;
54 1 EA=1;
55 1 num_unit=0;
C51 COMPILER V7.50 MAIN 08/18/2007 15:46:46 PAGE 2
56 1
57 1 //=======================以上为始化
58 1 while(1)
59 1 {
60 2 if(key)//查询按键
61 2 {
62 3 keyv=Keyscan();
63 3 if(keyv==15)
64 3 {
65 4 da_1=0;
66 4 final_tem=Set_Tem4();//设定温度
67 4 p1.pa=0;
68 4 p1.e2=0;
69 4 p1.e1=0;
70 4 p1.e0=0;
71 4 //point_on=100;//不导通
72 4 }
73 3 else if(keyv==14)//停止加热
74 3 {
75 4 EA=0;
76 4 //pout=0;
77 4 da_1=0;
78 4 }
79 3 }
80 2 if((num100unit&0x00ff)==0)//2.56s为周期
81 2 {
82 3 Lcd_Puts(1,0,"aim_tem:");
83 3 Lcd_Putfloat(9,0,3,1,final_tem);
84 3 cur_tem=GetTemperature();//读取当前温度值并显示
85 3 Lcd_Puts(1,1,"now_tem:");
86 3 Lcd_Putfloat(9,1,3,1,cur_tem);
87 3 PID();//pid控制
88 3 Action();//控制执行
89 3 }
90 2 }
91 1 }
92 uint Set_Tem4()//设定4位的温度值
93 {
94 1 uchar a,b,c,d;
95 1 Lcd_Clr();
96 1 Lcd_Puts(1,0,"set Tem:");
97 1 while(!key);
98 1 a=Keyscan();
99 1 Lcd_Putint(10,0,1,a);
100 1 while(!key);
101 1 b=Keyscan();
102 1 Lcd_Putint(11,0,1,b);
103 1 while(!key);
104 1 c=Keyscan();
105 1 Lcd_Putint(12,0,1,c);
106 1 while(!key);
107 1 d=Keyscan();
108 1 Lcd_Putint(13,0,1,d);
109 1 return (a*1000+b*100+c*10+d);
110 1 }
111
112 void Int_T0()interrupt 1 using 2 //ie0x02//TMOD=0x11;
113 {
114 1 EA=0;
115 1 TR0=0;
116 1 pwm_dtime.time=0xffff-Time_Unit;
117 1 TH0=pwm_dtime.hl[0];
C51 COMPILER V7.50 MAIN 08/18/2007 15:46:46 PAGE 3
118 1 TL0=pwm_dtime.hl[1];//定时us
119 1 TR0=1;//开定时器0
120 1 //t0f=1;//标志置1
121 1 /*if(point0==0)//查询到0点
122 1 {
123 1 num_unit=0;
124 1 }*/
125 1 if(num_unit==100)
126 1 {
127 2 num_unit=0;
128 2 num100unit++;
129 2 }
130 1 /*if(num_unit==0)//0点不导通
131 1 {
132 1 pout=0;
133 1 }
134 1 if(num_unit==point_on)//导通点
135 1 {
136 1 pout=1;
137 1 }*/
138 1 num_unit++;
139 1 EA=1;
140 1 }
141 int PID()//增量式pid算法,输出为控制量增量p1.vpa 和 p1.pa
142 {
143 1 p1.e2=final_tem - cur_tem;
144 1 p1.vpa=p1.kp*((long)p1.e2-p1.e1)
145 1 +p1.ki*(long)p1.e2
146 1 +p1.kd*((long)p1.e2+p1.e0-2*p1.e1);
147 1 p1.e1=p1.e2;
148 1 p1.e0=p1.e1;
149 1 p1.pa+=p1.vpa;
150 1 }
151 uchar Action()//执行控制量
152 {
153 1 long temp;
154 1 if(p1.pa>0)//控制量大于0
155 1 {
156 2 temp=p1.pa;
157 2 temp=temp>>5;
158 2 if(temp>PMAX)//完全导通
159 2 {
160 3 //point_on=0;
161 3 da_1=255;
162 3 }
163 2 else if(temp<PMIN)//完全截至
164 2 {
165 3 //point_on=100;
166 3 da_1=0;
167 3 }
168 2 else
169 2 {
170 3 //point_on=100*(PMAX-temp)/(PMAX-PMIN);
171 3 da_1=255*temp/(PMAX-PMIN);
172 3 }
173 2 }
174 1 else
175 1 {
176 2 //point_on=100;//完全截至
177 2 da_1=0;
178 2 }
179 1 return 1;
C51 COMPILER V7.50 MAIN 08/18/2007 15:46:46 PAGE 4
180 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1955 ----
CONSTANT SIZE = 29 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 49
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -