📄 motor_dri.lst
字号:
C51 COMPILER V7.01 MOTOR_DRI 09/19/2005 08:40:54 PAGE 1
C51 COMPILER V7.01, COMPILATION OF MODULE MOTOR_DRI
OBJECT MODULE PLACED IN motor_dri.OBJ
COMPILER INVOKED BY: C:\keil\C51\BIN\C51.EXE motor_dri.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #pragma small
2 #include "reg66x.h"
3 #include "motor_dri.h"
4 #include "electromotion.h"
5 #define T2_CONSTANT_FOR_1MS (65536-2000) //定时1ms
6
7 //电机驱动器设定:400步一圈,单脉冲方式,半电流,输出电流选择最大。
8 unsigned int motor_degree[5] = {2048,1024,512,384,340}; //五级变速调控
9 bit timer0_end_flag = 1; //==1定时结束,可以走下一步
10 bit run_next_cycle = 0; //一个呼吸周期标志
11 unsigned int timer_cycle = 0; //一个呼吸周期中循环1ms的个数
12
13
14 //定时器初始化
15 void init_timer(void)
16 {
17 1 //T0用作步进电机步间隙时间
18 1 TMOD = 0x01; //方式1
19 1 TR0 = 0;
20 1 IEN0 = 0x82;
21 1 TCON = 0;
22 1
23 1 //T1用作波特率发生器
24 1 TMOD |= 0x20; //方式2
25 1 TH1 = TL1 = 0xF3; //12M下2400
26 1 PCON = 0x00;
27 1 S0CON = 0x50;
28 1 TR1 = 1;
29 1 IEN0 |= 0x10;
30 1
31 1 //T2用作定时一个呼吸周期时间
32 1 TL2 = RCAP2L = T2_CONSTANT_FOR_1MS;
33 1 TH2 = RCAP2H = T2_CONSTANT_FOR_1MS / 0x100;
34 1 T2MOD = 0x00;
35 1 T2CON = 0x00; //自动装载
36 1 IEN1 = 0x01;
37 1 }
38
39
40 //步进电机归零
41 void regress_stepmotor(void)
42 {
43 1 unsigned char i;
44 1 unsigned int temp;
45 1 temp = 65535 - motor_degree[1];
46 1 P1_4 = 0;
47 1 P1_5 = 1;
48 1 for(i = 0;i < 10;i++);
49 1 if(P1_5)
50 1 while(P1_5)
51 1 {
52 2 P1_1 = BACKWARD;
53 2 TH0 = temp / 256;
54 2 TL0 = temp % 256;
55 2 TR0 = 1;
C51 COMPILER V7.01 MOTOR_DRI 09/19/2005 08:40:54 PAGE 2
56 2 timer0_end_flag = 0;
57 2 while(!timer0_end_flag);
58 2 }
59 1 else
60 1 while(!P1_5)
61 1 {
62 2 P1_1 = FORWARD;
63 2 TH0 = temp / 256;
64 2 TL0 = temp % 256;
65 2 TR0 = 1;
66 2 timer0_end_flag = 0;
67 2 while(!timer0_end_flag);
68 2 }
69 1 }
70
71
72 /************************步进电机驱动程序*****************/
73 /*********************************************************
74 函数名称:motor_driver()
75 功能描述:根据提供的速度.脉冲步数和方向,做出实时的处理.
76 被调用的函数列表:无
77 参数说明:
78 返 回 值:
79 注 释:
80 **********************************************************/
81 bit motor_driver(unsigned int motor_speed,unsigned int motor_pulse,bit motor_direct)
82 {
83 1 unsigned int i,temp;
84 1 P1_4 = 0;
85 1 P1_1 = motor_direct; //==1正转;
86 1
87 1 if(motor_pulse > 200)
88 1 {
89 2 motor_pulse -= 200;
90 2 temp = 65535 - motor_speed - 30*100;
91 2 for(i = 0;i < 100;i++)
92 2 {
93 3 TH0 = temp / 256;
94 3 TL0 = temp % 256;
95 3 temp += 30;
96 3 TR0 = 1;
97 3 timer0_end_flag = 0;
98 3 while(!timer0_end_flag);
99 3 }
100 2 temp = 65535 - motor_speed;
101 2 for(i = motor_pulse;i>0;i--)
102 2 {
103 3 TH0 = temp / 256;
104 3 TL0 = temp % 256;
105 3 TR0 = 1;
106 3 timer0_end_flag = 0;
107 3 while(!timer0_end_flag);
108 3 }
109 2 temp = 65535 - motor_speed;
110 2 for(i = 100;i > 0;i--)
111 2 {
112 3 TH0 = temp / 256;
113 3 TL0 = temp % 256;
114 3 temp -= 30;
115 3 TR0 = 1;
116 3 timer0_end_flag = 0;
117 3 while(!timer0_end_flag);
C51 COMPILER V7.01 MOTOR_DRI 09/19/2005 08:40:54 PAGE 3
118 3 }
119 2 motor_pulse = 0;
120 2 return(1);
121 2 }
122 1 else
123 1 {
124 2 if(motor_speed < motor_degree[1])
125 2 {
126 3 temp = 65535 - motor_degree[1];
127 3 for(i = 0;i < motor_pulse;i++)
128 3 {
129 4 TH0 = temp / 256;
130 4 TL0 = temp % 256;
131 4 TR0 = 1;
132 4 timer0_end_flag = 0;
133 4 while(!timer0_end_flag);
134 4 }
135 3 }
136 2 else
137 2 {
138 3 temp = 65535 - motor_speed;
139 3 for(i = 0;i < motor_pulse;i++)
140 3 {
141 4 TH0 = temp / 256;
142 4 TL0 = temp % 256;
143 4 TR0 = 1;
144 4 timer0_end_flag = 0;
145 4 while(!timer0_end_flag);
146 4 }
147 3 }
148 2 motor_pulse = 0;
149 2 return(1);
150 2 }
151 1 }
152
153
154 //T0中断服务函数,定时步进电机每步时间
155 void timer0_int(void) interrupt 1 using 1
156 {
157 1 unsigned char i;
158 1 TR0 = 0;
159 1 P1_0 = 1;
160 1 for (i = 0; i < 30; i++); //极限i=20
161 1 P1_0 = 0;
162 1 timer0_end_flag = 1;
163 1 }
164
165
166 //T2中断服务函数,定时一个呼吸周期时间
167 void timer2_int(void) interrupt 7 using 2
168 {
169 1 TF2 = 0;
170 1 TR2 = 1;
171 1 timer_cycle ++;
172 1 if(timer_cycle > time_respiration)
173 1 {
174 2 timer_cycle = 0;
175 2 run_next_cycle = 1;
176 2 }
177 1 }
C51 COMPILER V7.01 MOTOR_DRI 09/19/2005 08:40:54 PAGE 4
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 463 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 12 4
IDATA SIZE = ---- ----
BIT SIZE = 2 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -