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