📄 text1.lst
字号:
C51 COMPILER V7.06 TEXT1 09/17/2008 20:17:38 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: D:\keil C51完全破解版\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <REG52.H>
2
3 #define uint unsigned int
4 #define uchar unsigned char
5
6 #define tim 65535-5000
7 #define pwm 2000
8
9 #define T 5
10
11 sbit key0 =P2^0;
12 sbit key1 =P2^1;
13 sbit PWMB =P3^3; //PWM输出口
14
15 bit PWMX;
16
17 uint pwmh,pwml,pwmm;
18 uint sudu_set,sudu_now;
19 int e0,sudu_d;
20
21 uchar pid_b,tm=0;
22 uchar count;
23
24 uchar disp[5],dis =0;
25 uchar key,keyx;
26 int para[4];
27 char ptr =0;
28 uchar code numtab[5] ={ 0x40,0x20,0x10,0x04,0x08 }; //按键与显示扫描口
29 uchar code distab[16]={ 0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea, //数码管显示值
30 0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71 };
31 uchar code ledtab[8] ={ 0x08,0x10,0x20,0x40,0x80 }; //LED显示
32
33
34 void delay(uint timer)
35 {
36 1 for(;timer >0;timer --);
37 1 }
38
39 void distran()
40 {
41 1 disp[4]=distab[para[ptr]%10]; //编码转换
42 1 disp[0]=distab[(para[ptr]/10)%10];
43 1 disp[1]=distab[(para[ptr]/100)%10];
44 1 disp[2]=distab[(para[ptr]/1000)%10];
45 1 disp[3]=~ledtab[ptr]; //选中要点亮的LED
46 1 }
47
48 void display()
49 {
50 1 dis=(dis+1)%5;
51 1 P2 =0xff;
52 1 P0 =disp[dis]; //扫描数码管和LED
53 1 P2 =~numtab[dis];
54 1
55 1 key0=1; key1=1; //读取按键值
C51 COMPILER V7.06 TEXT1 09/17/2008 20:17:38 PAGE 2
56 1 if(!key0) keyx=dis+1;
57 1 if(!key1) keyx=dis+5;
58 1 }
59
60 void keyproc() //按键处理程序
61 {
62 1 if(key>0)
63 1 {
64 2 if(ptr!=1)
65 2 {
66 3 switch(key)
67 3 {
68 4 case 1: para[ptr]--; break; //设定速度值
69 4 case 5: para[ptr]++; break;
70 4 case 2: para[ptr]-=10; break;
71 4 case 6: para[ptr]+=10; break;
72 4 case 3: para[ptr]-=100; break;
73 4 case 7: para[ptr]+=100; break;
74 4 case 4: ptr--; break;
75 4 case 8: ptr++; break;
76 4 }
77 3 }
78 2 else
79 2 {
80 3 switch(key)
81 3 {
82 4 case 4: ptr--; break;
83 4 case 8: ptr++; break;
84 4 }
85 3 }
86 2 if(ptr>2) ptr=0;
87 2 if(ptr<0) ptr=2;
88 2 if(para[ptr]<0) para[ptr]=0;
89 2 if(para[ptr]>1000) para[ptr]=1000;
90 2 distran(); //刷新显示
91 2 }
92 1 key=0;
93 1 }
94
95 /***************PID算法********************/
96 void PID_Control(void)
97 {
98 1 sudu_now = TH1*256+TL1; //读取速度反馈值
99 1
100 1 TH1 =0;
101 1 TL1 =0;
102 1 TR1 =1;
103 1 para[1] = sudu_now*40;
104 1 if(para[1] >(sudu_set+40))
105 1 {
106 2 e0 =(para[1]-sudu_set)/4;
107 2 pwml =pwmm-e0;
108 2 if(pwml >2000)
109 2 {
110 3 pwml =2000;
111 3 }
112 2 pwmh =pwm-pwml;
113 2 pwmh =65535-pwmh;
114 2 pwml =65535-pwml;
115 2 }
116 1 else
117 1 if(para[1] <(sudu_set-40))
C51 COMPILER V7.06 TEXT1 09/17/2008 20:17:38 PAGE 3
118 1 {
119 2 e0 =(sudu_set-para[1])/4;
120 2 pwml =pwmm+e0; //计算输出占空比
121 2 if(pwml <1)
122 2 {
123 3 pwml =1;
124 3 }
125 2 pwmh =pwm-pwml;
126 2 pwmh =65535-pwmh;
127 2 pwml =65535-pwml;
128 2 }
129 1 }
130
131 void timer0() interrupt 1 using 0 //显示扫描
132 {
133 1 if(!PWMX)
134 1 {
135 2 TH0 =pwmh>>8;
136 2 TL0 =pwmh;
137 2 }
138 1 else
139 1 {
140 2 TH0 =pwml>>8;
141 2 TL0 =pwml;
142 2 }
143 1 PWMX =~PWMX;
144 1 PWMB =PWMX;
145 1
146 1 }
147
148 void timer2() interrupt 5 using 2 //PWM输出
149 {
150 1 TF2 =0;
151 1 TH2 =tim>>8;
152 1 TL2 =tim;
153 1 tm ++;
154 1 if(tm ==T)
155 1 {
156 2 tm =0;
157 2 TR1 =0;
158 2 pid_b =1;
159 2 }
160 1 display();
161 1 }
162
163 void timer_int(void)
164 {
165 1 TMOD=0x51; //设置定时器0的工作模式----定时模式,定时器1的工作模式----计数模式 //51
166 1 T2CON=0x00; //T2MOD=0x00; //定时器2模式设置----定时模式(向上计数)
167 1
168 1 TH0 =tim>>8;
169 1 TL0 =tim;
170 1 TH1 =0;
171 1 TL1 =0;
172 1 TH2 =tim>>8;
173 1 TL2 =tim;
174 1
175 1 ET0 =0; //定时器0开中断
176 1 ET1 =0; //定时器1关中断
177 1 ET2 =1; //定时器2关中断
178 1
179 1 TR0 =1; //启动定时器0
C51 COMPILER V7.06 TEXT1 09/17/2008 20:17:38 PAGE 4
180 1 TR1 =1; //启动计数器1
181 1 TR2 =1; //启动定时器2
182 1
183 1 EA = 1; //开总中断
184 1 }
185
186 void main()
187 {
188 1 char i;
189 1
190 1 PWMB =1;
191 1 timer_int();
192 1 for(i=0;i<3;i++)
193 1 para[i]=i; //初始化速度存储数组
194 1 distran(); //刷新显示缓存区
195 1 sudu_set = para[0];
196 1 while(1)
197 1 {
198 2 if(keyx >0)
199 2 {
200 3 key =keyx;
201 3 while(keyx!=0) {keyx=0; delay(2500);}
202 3 keyproc(); //调用按键处理程序
203 3 sudu_set =para[0];
204 3 if(sudu_set <300)
205 3 {
206 4 PWMB =1;
207 4 ET0 =0;
208 4 }
209 3 else
210 3 {
211 4 PWMB =0;
212 4 pwmm = (sudu_set/1.28)-para[2];
213 4 pwmh =pwm-pwmm;
214 4 pwmh =65535-pwmh;
215 4 pwml =65535-pwmm;
216 4 ET0 =1;
217 4 }
218 3 }
219 2 if(pid_b)
220 2 {
221 3 pid_b =0;
222 3 PID_Control(); //调用PID调速程序
223 3 count++;
224 3 if(count >10) {count=0; distran();} //刷新显示
225 3 }
226 2 }
227 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 1084 ----
CONSTANT SIZE = 29 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 34 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -