📄 motor.lst
字号:
C51 COMPILER V8.05a MOTOR 08/21/2007 16:36:56 PAGE 1
C51 COMPILER V8.05a, COMPILATION OF MODULE MOTOR
OBJECT MODULE PLACED IN motor.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE motor.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <REG52.H>
2 #include <intrins.h>
3 #define uchar unsigned char //用uchar代替unsigned char
4 #define uint unsigned int //uint代替unsigned int
5 #define MotPort P1
6 #define TH0VAL -64608/256
7 #define TL0VAL -64608%256 //定时初始
8
9 uchar code Mot1Code[]={0xf2,0xf6,0xf4,0xfc,0xf8,0xf9,0xf1,0xf3}; //M1步码表
10 uchar code Mot2Code[]={0x2f,0x6f,0x4f,0xcf,0x8f,0x9f,0x1f,0x3f}; //M2步码表
11 uchar code SpeedTab[]={45,38,30,23,17,12,8,5,3,2}; //10级速度表
12
13 /*马达状态字定义
14 ---------------------------------------------
15 MotorWorkMode | D3 | D2 | D1 | D0 | 16进制值
16 ---------------------------------------------
17 M1停止M2正转 | 0 | 1 | x | 0 |0x4或0x6
18 ---------------------------------------------
19 M1停止M2反转 | 1 | 1 | x | 0 |0xc或0xe
20 ---------------------------------------------
21 M1正转M2停止 | x | 0 | 0 | 1 |0x1或0x9
22 ---------------------------------------------
23 M1反转M2停止 | x | 0 | 1 | 1 |0x3或0xb
24 ---------------------------------------------
25 M1正转M2正转 | 0 | 1 | 0 | 1 |0x5
26 ---------------------------------------------
27 M1反转M2正转 | 0 | 1 | 1 | 1 |0x7
28 ---------------------------------------------
29 M1正转M2反转 | 1 | 1 | 0 | 1 |0xd
30 ---------------------------------------------
31 M1反转M2反转 | 1 | 1 | 1 | 1 |0xf
32 ---------------------------------------------
33 */
34 uchar bdata MotorWorkMode=0; //马达工作状态寄存器
35 sbit B_M1StartStop=MotorWorkMode^0; //M2运动/停止(0:停止;1:运动)
36 sbit B_M1Face=MotorWorkMode^1; //M2方向(0:正转;1:反转)
37 sbit B_M2StartStop=MotorWorkMode^2; //M1运动/停止(0:停止;1:运动)
38 sbit B_M2Face=MotorWorkMode^3; //M1方向(0:正转;1:反转)
39
40 sbit K_M1StartStop=P0^0; //M1停止/运行
41 sbit K_M1Face=P0^1; //M1方向
42 sbit K_M2StartStop=P0^2; //M2停止/运行
43 sbit K_M2Face=P0^3; //M2方向
44 sbit K_SpeedAdd=P0^4; //速度加
45 sbit K_SpeedDec=P0^5; //速度减
46
47 sbit P_M1H=P3^0; //M1上限
48 sbit P_M1L=P3^1; //M1下限
49 sbit P_M2H=P3^2; //M2上限
50 sbit P_M2L=P3^3; //M2下限
51 uchar count=1; //计数器
52 uchar SpeedStep; //速度级0-9
53 //主函数
54 void main()
55 {
C51 COMPILER V8.05a MOTOR 08/21/2007 16:36:56 PAGE 2
56 1 TH0 = TH0VAL;
57 1 TL0 = TL0VAL; //定时器0初值
58 1 TR0 = 1; //定时器0开始计数
59 1 ET0 = 1; //开CTC0中断
60 1 EA = 1; //开总中断
61 1 P0=0xff;
62 1 while(1)
63 1 {
64 2
65 2 if (!K_M1StartStop)
66 2 {
67 3 while(!K_M1StartStop);
68 3 B_M1StartStop=!B_M1StartStop;
69 3 }
70 2
71 2 if (!K_M1Face)
72 2 {
73 3 while(!K_M1Face);
74 3 B_M1Face=!B_M1Face;
75 3 }
76 2
77 2 if (!K_M2StartStop)
78 2 {
79 3 while(!K_M2StartStop);
80 3 B_M2StartStop=!B_M2StartStop;
81 3 }
82 2
83 2 if (!K_M2Face)
84 2 {
85 3 while(!K_M2Face);
86 3 B_M2Face=!B_M2Face;
87 3 }
88 2
89 2 if (!K_SpeedAdd) //速度加
90 2 {
91 3 while(!K_SpeedAdd);
92 3 SpeedStep++;
93 3 if (SpeedStep==10) {SpeedStep=9;}
94 3 }
95 2
96 2 if (!K_SpeedDec) //速度减
97 2 {
98 3 while(!K_SpeedDec);
99 3 SpeedStep--;
100 3 if (SpeedStep==255) {SpeedStep=0;}
101 3 }
102 2 }
103 1 }
104
105 //定时器0中断
106 void Timer0(void) interrupt 1 using 2
107 {
108 1 static uchar M1Index,M2Index; //步码索引
109 1 TH0 = TH0VAL;
110 1 TL0 = TL0VAL; //定时器0初值
111 1 count--;
112 1 if (count==0)
113 1 {
114 2 count=SpeedTab[SpeedStep]; //根据速度级重装计数器,需要更快速度请更改定时器初值
115 2 switch (MotorWorkMode)
116 2 {
117 3 case 0x4:{if (P_M2H==1) {M2Index++;} break;} //M2正转,M1停止
C51 COMPILER V8.05a MOTOR 08/21/2007 16:36:56 PAGE 3
118 3 case 0x6:{if (P_M2H==1) {M2Index++;} break;} //M2正转,M1停止
119 3
120 3 case 0xc:{if (P_M2L==1) {M2Index--;} break;} //M2反转,M1停止
121 3 case 0xe:{if (P_M2L==1) {M2Index--;} break;}
122 3
123 3 case 0x1:{if (P_M1H==1) {M1Index++;} break;} //M1正转,M2停止
124 3 case 0x9:{if (P_M1H==1) {M1Index++;} break;}
125 3
126 3 case 0x3:{if (P_M1L==1) {M1Index--;} break;} //M1反转,M1停止
127 3 case 0xb:{if (P_M1L==1) {M1Index--;} break;}
128 3
129 3 case 0x5:{if (P_M1H==1) {M1Index++;} if (P_M2H==1) {M2Index++;} break;} //M1正转,M2正转
130 3 case 0x7:{if (P_M1L==1) {M1Index--;} if (P_M2H==1) {M2Index++;} break;} //M1反转,M2正转
131 3 case 0xd:{if (P_M1H==1) {M1Index++;} if (P_M2L==1) {M2Index--;} break;} //M1正转,M2反转
132 3 case 0xf:{if (P_M1L==1) {M1Index--;} if (P_M2L==1) {M2Index--;} break;} //M1反转,M2反转
133 3 default:break;
134 3 }
135 2 if (M1Index==8)
136 2 {M1Index=0;}
137 2 else
138 2 {
139 3 if (M1Index==255) {M1Index=7;}
140 3 }
141 2 if (M2Index==8)
142 2 {M2Index=0;}
143 2 else
144 2 {
145 3 if (M2Index==255) {M2Index=7;}
146 3 }
147 2 MotPort=Mot1Code[M1Index]&Mot2Code[M2Index]; //输出M1和M2步码 ----驱动电机运动的代码
148 2 }
149 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 352 ----
CONSTANT SIZE = 26 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 5 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -