📄 system.lst
字号:
C51 COMPILER V7.06 SYSTEM 05/13/2005 02:59:37 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE SYSTEM
OBJECT MODULE PLACED IN system.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil20\C51\BIN\C51.EXE system.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 //-----------------------函数声明,变量定义--------------------------------------------------------
2 #include <reg51.h>
3 sbit INT_0 =P3^2; // 将p3.2外部中断0
4 sbit pulse_A=P1^2; // P1.2为脉冲A输入
5 sbit PWM=P1^0; //PWM波形输出
6 sbit DR=P1^1; //方向控制
7 //-----------------------预定义值--------------------------------------------------------
8 #define PWM_T 1800 //定义PWM的周期T为18ms
9 #define Ts 1000 //定义光电编码器采样时间为10ms
10 #define timer_data (256-10) //定时器预置值,12M时钟是,定时0.01ms
11 //-----------------------预设定值--------------------------------------------------------
12 bit direction; //方向标志位 用户设定
13 unsigned char R; //需要得到的直流电机转速 用户设定
14 //-----------------------实际运行状态--------------------------------------------------------
15 bit real_direction; //电机实际运行方向
16 unsigned char Rr; //直流电机实际转速
17 //-----------------------计算所得补偿状态------------------------------------------
18 bit compensate_polarity; //补偿极性
19 unsigned char dR; //转速补偿
20 //-----------------------经补偿后得到的脉宽------------------------------------------
21 unsigned char PWM_t; //PWM_t为脉冲宽度(320~400)时间为3.2~4.0ms
22 unsigned char PWM_count; //输出PWM周期计数
23 //-----------------------各中间计数值------------------------------------------
24 unsigned char pulseB_count; //脉冲计数
25 unsigned char time0_count; //定时计数
26 unsigned char time1_count; //定时计数
27 //--------------------------------------------------------------------------------------------------
28 // 函数名称:timer_init
29 // 函数功能:初始化设置定时器
30 //--------------------------------------------------------------------------------------------------
31 void timer_init()
32 {
33 1 TMOD=0x22; /*定时器1为工作模式2(8位自动重装),0为模式2(8位自动重装) */
34 1 PCON=0x00;
35 1 TF0=0;
36 1 TH0=timer_data; //保证定时时长为0.01ms
37 1 TL0=TH0;
38 1 TH1=timer_data; //保证定时时长为0.01ms
39 1 TL1=TH0;
40 1 ET0=1; //定时器0中断允许
41 1 TR0=1; //定时器0开始计数
42 1 ET1=1; //定时器1中断允许
43 1 TR1=1; //定时器1开始计数
44 1 EA=1; //中断允许
45 1 }
46 //--------------------------------------------------------------------------------------------------
47 // 函数名称: INT0_init()
48 // 函数功能: 初始化设置
49 // 设定INT0的工作方式
50 //--------------------------------------------------------------------------------------------------
51 void INT0_init(void )
52 {
53 1 pulseB_count=0; //脉冲计数器清零
54 1 IT0=1; //选择INT0为沿触发方式
55 1 EX0=1; //外部中断允许
C51 COMPILER V7.06 SYSTEM 05/13/2005 02:59:37 PAGE 2
56 1 EA=1; //系统中断允许
57 1 }
58 //--------------------------------------------------------------------------------------------------
59 // 函数名称:setting_PWM
60 // 函数功能:设置PWM的脉冲宽度和设定方向
61 //--------------------------------------------------------------------------------------------------
62 void setting_PWM()
63 {
64 1 // direction=1; //设定转动方向
65 1 // R=540; //设定转速
66 1 // dR=0; //转速补偿为零
67 1 // calculate_PWM_t(); //重新计算脉宽
68 1 }
69 //--------------------------------------------------------------------------------------------------
70 // 函数名称: calculate_PWM_t
71 // 入口参数: R需要得到的直流电机转速,dR转速补偿
72 // 出口参数: PWM_t为脉冲宽度(320~400)时间为3.2~4.0ms
73 // 函数功能: 计算脉冲宽度,PWM_t=R/150;
74 //--------------------------------------------------------------------------------------------------
75 void calculate_PWM_t()
76 {
77 1 if(compensate_polarity==1) //正补偿
78 1 PWM_t=(R+dR)/150;
79 1 else
80 1 PWM_t=(R-dR)/150; //负修正
81 1 }
82 //--------------------------------------------------------------------------------------------------
83 // 函数名称: calculate_Rr
84 // 入口参数: pulseB_count脉冲计数
85 // 出口参数: Rr直流电机实际转速
86 // 函数功能: 计算实际转速
87 //--------------------------------------------------------------------------------------------------
88 void calculate_Rr()
89 {
90 1 Rr=pulseB_count/6;
91 1 }
92 //--------------------------------------------------------------------------------------------------
93 // 函数名称: compensate_dR
94 // 入口参数: Rr直流电机实际转速
95 // R需要得到的直流电机转速
96 // 出口参数: dR转速补偿
97 // 函数功能: 计算实际补偿值和补偿极性 ,根据不同的补偿算法重新设计
98 //--------------------------------------------------------------------------------------------------
99 void compensate_Rr()
100 {
101 1 Rr=1;
102 1 if(Rr>R)
103 1 compensate_polarity=0; //补偿极性
104 1 else
105 1 compensate_polarity=1;
106 1 }
107 //--------------------------------------------------------------------------------------------------
108 // 函数名称: INT0_intrupt
109 // 函数功能: 外部中断0处理程序
110 //--------------------------------------------------------------------------------------------------
111 void INT0_intrupt() interrupt 0 using 1
112 {
113 1 pulseB_count++;
114 1 if(pulse_A==0)
115 1 {
116 2 real_direction=1; //若P1.2为低电平,则电机为正转,计数器N的值加1
117 2 }
C51 COMPILER V7.06 SYSTEM 05/13/2005 02:59:37 PAGE 3
118 1 else //若为高电平,则电机为反转,计数器N值减l。
119 1 {
120 2 real_direction=1;
121 2 }
122 1 }
123 //--------------------------------------------------------------------------------------------------
124 // 函数名称:IntTimer0
125 // 函数功能:定时器中断处理程序
126 //--------------------------------------------------------------------------------------------------
127 void IntTimer0() interrupt 1
128 {
129 1 time0_count++;
130 1 DR=direction;
131 1 if(time0_count>=PWM_T)
132 1 {
133 2 time0_count=0;
134 2 PWM_count++;
135 2 setting_PWM(); //每输出一个PWM波调用一次
136 2 }
137 1 if(time0_count<PWM_t)
138 1 PWM=1;
139 1 else
140 1 PWM=0;
141 1 }
142 //--------------------------------------------------------------------------------------------------
143 // 函数名称:IntTimer1
144 // 函数功能:定时器中断处理程序
145 //--------------------------------------------------------------------------------------------------
146 void IntTimer1() interrupt 3
147 {
148 1 time1_count++;
149 1 if(time1_count==1)
150 1 {
151 2 INT0_init(); //初始化外部中断设置
152 2 }
153 1 if(time1_count>=Ts)
154 1 {
155 2 time1_count=0; //一个补偿周期结束,计数器清零
156 2 calculate_Rr(); //计算实际转速
157 2 compensate_Rr(); //计算实际补偿值和补偿极性
158 2 calculate_PWM_t(); //重新计算脉宽
159 2 }
160 1 }
161 //--------------------------------------------------------------------------------------------------
162 // 函数名称:main
163 // 用户主函数
164 // 函数功能:主函数
165 //--------------------------------------------------------------------------------------------------
166 void main()
167 {
168 1 direction=1; //设定转动方向
169 1 R=540; //设定转速
170 1 dR=0; //转速补偿为零
171 1 calculate_PWM_t(); //重新计算脉宽
172 1 timer_init();
173 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 200 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
C51 COMPILER V7.06 SYSTEM 05/13/2005 02:59:37 PAGE 4
PDATA SIZE = ---- ----
DATA SIZE = 8 ----
IDATA SIZE = ---- ----
BIT SIZE = 3 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -