📄 tes1.lst
字号:
C51 COMPILER V7.06 TES1 09/17/2008 22:01:04 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE TES1
OBJECT MODULE PLACED IN .\Tes1.obj
COMPILER INVOKED BY: D:\keil C51完全破解版\C51\BIN\C51.EXE ..\Tes1.c BROWSE DEBUG OBJECTEXTEND OBJECT(.\Tes1.obj)
stmt level source
1 #include <AT89X52.H>
2 #define uint unsigned int
3 #define uchar unsigned char
4 #define tim 65535-5000
5 #define pwm 1100
6 #define K 1
7 #define Kp 1
8 #define Ki 0
9 #define Kd 1
10 #define T 4
11 sbit dis0 =P2^6;
12 sbit dis1 =P2^5;
13 sbit dis2 =P2^4;
14 sbit dis3 =P2^3;
15 sbit dis4 =P2^2;
16 sbit key1 =P2^1;
17 sbit key0 =P2^0;
18 sbit PWMB=P1^0;
19
20 bit PWMX;
21
22 uint pwmh,pwml;
23 int sudu_set,sudu_now,sudu_old;
24 int e0=0,e1=0,e2=0,sudu_d;
25 int sb;
26 uchar pid_b,tm;
27 uchar count;
28
29 uchar disp[5],dis;
30 uchar key,keyx,ts;
31 int para[8],ptr;
32 uchar code numtab[5]={0x40,0x20,0x10,0x04,0x08};
33 uchar code distab[16]={ 0x28,0xee,0x32,0xa2,0xe4,0xa1,0x21,0xea,
34 0x20,0xa0,0x60,0x25,0x39,0x26,0x31,0x71};
35 uchar code ledtab[8]={0x08,0x10,0x20,0x40,0x88,0x90,0xa0,0xc0};
36
37 void time(uint tm)
38 {
39 1 for(tm;tm>0;tm--);
40 1 }
41
42 void distran()
43 {
44 1 disp[4]=distab[para[ptr]%10]; //编码转换
45 1 disp[0]=distab[(para[ptr]/10)%10];
46 1 disp[1]=distab[(para[ptr]/100)%10];
47 1 disp[2]=distab[(para[ptr]/1000)%10];
48 1 disp[3]=~ledtab[ptr]; //选中要点亮的LED
49 1 }
50
51 void display()
52 {
53 1 dis=(dis+1)%5;
54 1 P2=0xff;
55 1 P0=disp[dis]; //扫描数码管和LED
C51 COMPILER V7.06 TES1 09/17/2008 22:01:04 PAGE 2
56 1 P2=~numtab[dis];
57 1
58 1 key0=1; key1=1; //读取按键值
59 1 if(!key0) keyx=dis+1;
60 1 if(!key1) keyx=dis+5;
61 1 }
62
63 void keyproc() //按键处理程序
64 {
65 1 if(key>0)
66 1 {
67 2 switch(key)
68 2 {
69 3 case 1: para[ptr]--; break; //设定速度值
70 3 case 5: para[ptr]++; break;
71 3 case 2: para[ptr]-=10; break;
72 3 case 6: para[ptr]+=10; break;
73 3 case 3: para[ptr]-=100; break;
74 3 case 7: para[ptr]+=100; break;
75 3 case 4: ptr--; break;
76 3 case 8: ptr++; break;
77 3 }
78 2 if(ptr>2) ptr=0;
79 2 if(ptr<0) ptr=2;
80 2 if(para[ptr]<0) para[ptr]=0;
81 2 if(para[ptr]>1000) para[ptr]=1000;
82 2 distran(); //刷新显示
83 2 }
84 1 key=0;
85 1 }
86
87
88 /***************PID算法********************/
89 void PID_Control(void)
90 {
91 1 sudu_old = sudu_now;
92 1 sudu_now =TH1*256+ TL1; //读取速度反馈值
93 1 para[1] = sudu_now*40;
94 1 para[2]=TH1;
95 1 TH1=0; TL1=0;
96 1 e2=e1;e1=e0;
97 1 e0 = sudu_set-(sudu_now*40); // 偏差
98 1 //sudu_d = sudud_now-sudu_old; // 微分
99 1 sb += Kp*e0; //+ Kd*sudu_d;
100 1 if(sb<1) sb=0;
101 1 else if(sb>6000) sb=6000;
102 1 pwml=sudu_set;//sb*K; // pwmh=sb*k,k=30
103 1 pwmh=pwm*3-pwml; //计算输出占空比
104 1 pwmh=65535-pwmh;
105 1 pwml=65535-pwml;
106 1 }
107
108 void timer0() interrupt 1 using 0 //显示扫描
109 {
110 1 TH0=tim>>8;
111 1 TL0=tim;
112 1 tm++;
113 1 if(tm>T)
114 1 {pid_b=1;tm=0; }
115 1 display();
116 1 }
117
C51 COMPILER V7.06 TES1 09/17/2008 22:01:04 PAGE 3
118 void timer1() interrupt 3 using 1 //脉冲检测-----计数法
119 {
120 1 }
121
122 void temer2() interrupt 5 using 2 //PWM输出
123 { TF2=0;
124 1 if(!PWMX)
125 1 {
126 2 TH2=pwmh>>8;TL2=pwmh;
127 2 }
128 1 else
129 1 {
130 2 TH2=pwml>>8;TL2=pwml;
131 2 }
132 1 PWMX=~PWMX;
133 1 PWMB=PWMX;
134 1 }
135
136 void main()
137 { char i;
138 1 EA = 1;
139 1 TMOD=0X01; //设置定时器0的工作模式----定时模式
140 1 ET0=1; //定时器0开中断
141 1 TH0=tim>>8; TL0=tim; TR0=1; //启动定时器0定时5ms
142 1 TMOD|=0X50; //设置定时器1的工作模式----计数模式
143 1 ET1=0; //定时器1关中断
144 1 TH1=0; TL1=0; TR1=1; //启动计数器1
145 1 T2MOD=0x00; //定时器2模式设置----定时模式(向上计数)
146 1 T2CON=0x00;
147 1 ET2=1; //定时器2开中断
148 1 TH2=tim>>8; TL2=tim; TR2=1; //启动定时器2
149 1
150 1 dis=0;ptr=0;
151 1 for(i=0;i<5;i++) para[i]=i; //初始化速度存储数组
152 1 distran(); //刷新显示缓存区
153 1 sudu_set = para[0];
154 1 /*pwmh=sudu_set*30;
155 1 pwml=pwm-pwmh;
156 1 pwmh=65535-pwmh;
157 1 pwml=65535-pwml; */
158 1 for(;;)
159 1 {
160 2 if(keyx>0)
161 2 {
162 3 key=keyx;
163 3 while(keyx!=0) {keyx=0; time(3000);} //等待按键
164 3 keyproc(); //调用按键处理程序
165 3 sudu_set = para[0];
166 3 }
167 2
168 2 if(!para[0]){PWMB=1;} else
169 2
170 2 if(pid_b)
171 2 { pid_b = 0;
172 3 PID_Control(); //调用PID调速程序
173 3 count++;
174 3 if(count>10) {count=0; distran();} //刷新显示
175 3 }
176 2 }
177 1 }
C51 COMPILER V7.06 TES1 09/17/2008 22:01:04 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 893 ----
CONSTANT SIZE = 29 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 50 ----
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 + -