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