📄 xin.lst
字号:
C51 COMPILER V7.06 XIN 03/11/2012 17:31:57 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE XIN
OBJECT MODULE PLACED IN xin.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE xin.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<reg51.h> //包含单片机寄存器的头文件
2 #include<intrins.h> //包含_nop_()函数定义的头文件
3 //x5045引脚定义
4 sbit SCK=P2^2; //将SCK位定义为P3.4引脚
5 sbit SI=P2^3; //将SI位定义为P3.5引脚
6 sbit SO=P2^1; //将SO位定义为P3.6引脚
7 sbit CS=P2^0; //将SCK位定义为P3.7引脚
8 //功能变量定义
9 #define WREN 0x06 //写使能锁存器允许
10 #define WRDI 0x04 //写使能锁存器禁止
11 #define WRSR 0x01 //写状态寄存器
12 #define READ 0x03 //读出
13 #define WRITE 0x02 //写入
14 #define uchar unsigned char
15 #define uint unsigned int
16 /***************电动机控制定义*******************/
17 sbit powder1L=P0^0;//普通电机1低电平正转
18 sbit powder1R=P0^1;//普通电机1低电平反转
19 sbit powder2L=P0^2;//步进电机2低电平正转
20 sbit powder2R=P0^3;//步进电机2低电平反转
21 sbit powder3L=P0^4;//步进电机3低电平正转
22 sbit powder3R=P0^5;//步进电机3低电平反转
23 sbit powder4L=P0^6;//步进电机4低电平正转
24 sbit powder4R=P0^7;//步进电机4低电平反转
25 sbit powder5L=P3^2;//步进电机5低电平正转
26 sbit powder5R=P3^3;//步进电机5低电平反转
27 /*****************步进电机脉冲信号**************/
28 sbit P25=P2^5;
29 sbit P26=P2^6;
30 sbit P27=P2^7;
31 /********************行程开关定义**************/
32 sbit K1=P1^0;
33 sbit K2=P1^1;
34 sbit K3=P1^2;
35 sbit K4=P1^3;
36 sbit K5=P1^4;
37 sbit K6=P1^5;
38 sbit K7=P1^6;
39 sbit K8=P1^7;
40 sbit K9=P3^0;
41 sbit K10=P3^1;
42 sbit P24=P2^4;
43 /******************LED定义*////
44 sbit LED1=P3^4;
45 sbit LED2=P3^5;
46 /*****************************************************
47 函数功能:延时1ms
48 (3j+2)*i=(3×33+2)×10=1010(微秒),可以认为是1毫秒
49 ***************************************************/
50 void delay1ms()
51 {
52 1 unsigned char i,j;
53 1
54 1 for(i=0;i<10;i++)
55 1 for(j=0;j<33;j++);
C51 COMPILER V7.06 XIN 03/11/2012 17:31:57 PAGE 2
56 1
57 1 }
58 /*****************************************************
59 函数功能:延时若干毫秒
60 入口参数:n
61 ***************************************************/
62 void delayms(unsigned char n)
63 {
64 1 unsigned char i;
65 1 for(i=0;i<n;i++)
66 1 delay1ms();
67 1 }
68 void delay4s()
69 {
70 1 unsigned char h,i,j,k;
71 1
72 1
73 1 for(h=20;h>0;h--)
74 1
75 1 for(i=4;i>0;i--)
76 1
77 1 for(j=116;j>0;j--)
78 1
79 1 for(k=214;k>0;k--);
80 1
81 1
82 1 }
83 /*****************************************************
84 函数功能:从X5045的当前地址读出数据
85 出口参数:x
86 ***************************************************/
87 unsigned char ReadCurrent(void)
88 {
89 1 unsigned char i;
90 1 unsigned char x=0x00; //储存从X5045中读出的数据
91 1 SCK=1; //将SCK置于已知的高电平状态
92 1 for(i=0;i<8;i++)
93 1 {
94 2 SCK=1; //拉高SCK
95 2 SCK=0; //在SCK的下降沿输出数据
96 2 x<<=1; //将x中的各二进位向左移一位,因为首先读出的是字节的最高位数据
97 2 x|=(unsigned char)SO; //将SO上的数据通过按位"或"运算存入 x
98 2 }
99 1 return(x); //将读取的数据返回
100 1 }
101 /*****************************************************
102 函数功能:写数据到X5045的当前地址
103 入口参数:dat
104 ***************************************************/
105 void WriteCurrent(unsigned char dat)
106 {
107 1 unsigned char i;
108 1 SCK=0; //将SCK置于已知的低电平状态
109 1 for(i=0;i<8;i++) // 循环移入8个位
110 1 {
111 2 SI=(bit)(dat&0x80); //通过按位"与"运算将最高位数据送到S
112 2 //因为传送时高位在前,低位在后
113 2 SCK=0;
114 2 SCK=1; //在SCK上升沿写入数据
115 2 dat<<=1; //将y中的各二进位向左移一位,因为首先写入的是字节的最高位
116 2 }
117 1 }
C51 COMPILER V7.06 XIN 03/11/2012 17:31:57 PAGE 3
118 /*****************************************************
119 函数功能:写状态寄存器 ,可以设置看门狗的溢出时间及数据保护
120 入口参数:rs; //储存寄存器状态值
121 ***************************************************/
122 void WriteSR(unsigned char rs)
123 {
124 1 CS=0; //拉低CS,选中X5045
125 1 WriteCurrent(WREN); //写使能锁存器允许
126 1 CS=1; //拉高CS
127 1 CS=0; //重新拉低CS,否则下面的写寄存器状态指令将被丢弃
128 1 WriteCurrent(WRSR); //写状态寄存器
129 1 WriteCurrent(rs); //写入新设定的寄存器状态值
130 1 CS=1; //拉高CS
131 1 }
132 /*****************************************************
133 函数功能:写数据到X5045的指定地址
134 入口参数:addr
135 ***************************************************/
136 void WriteSet(unsigned char dat,unsigned char addr)
137 {
138 1 SCK=0; //将SCK置于已知状态
139 1 CS=0; //拉低CS,选中X5045
140 1 WriteCurrent(WREN); //写使能锁存器允许
141 1 CS=1; //拉高CS
142 1 CS=0; //重新拉低CS,否则下面的写入指令将被丢弃
143 1 WriteCurrent(WRITE); //写入指令
144 1 WriteCurrent(addr); //写入指定地址
145 1 WriteCurrent(dat); //写入数据
146 1 CS=1; //拉高CS
147 1 SCK=0; //将SCK置于已知状态
148 1 }
149 /*****************************************************
150 函数功能:从X5045的指定地址读出数据
151 入口参数:addr
152 出口参数:dat
153 ***************************************************/
154 unsigned char ReadSet(unsigned char addr)
155 {
156 1 unsigned char dat;
157 1 SCK=0; //将SCK置于已知状态
158 1 CS=0; //拉低CS,选中X5045
159 1 WriteCurrent(READ); //开始读
160 1 WriteCurrent(addr); //写入指定地址
161 1 dat=ReadCurrent(); //读出数据
162 1 CS=1; //拉高CS
163 1 SCK=0; //将SCK置于已知状态
164 1 return dat; //返回读出的数据
165 1 }
166 /*****************************************************
167 函数功能:看门狗复位程序
168 ***************************************************/
169 void WatchDog(void)
170 {
171 1 CS=1; //拉高CS
172 1 CS=0; //CS引脚的一个下降沿复位看门狗定时器
173 1 CS=1; //拉高CS
174 1 }
175 /*****************************************************
176 函数功能:主程序
177 ***************************************************/
178 void main(void)
179 { uchar V;
C51 COMPILER V7.06 XIN 03/11/2012 17:31:57 PAGE 4
180 1
181 1 V=ReadSet(0x10);
182 1 delayms(10);
183 1 WriteSR(0x12); //写状态寄存器
184 1 delayms(10);
185 1 TMOD=0x21 ;
186 1 TH0=0xfe ;
187 1 TL0=0xe8 ; //280微秒
188 1 TH1=0x88 ; //120微秒
189 1 TL1=0x88 ;
190 1 EA=1;
191 1 ET0=1;
192 1 ET1=1;
193 1 TR0=1 ;
194 1
195 1
196 1
197 1
198 1
199 1 if(V==1)
200 1 { powder1L=0;
201 2 delay4s();
202 2 }
203 1 if(V==2)
204 1
205 1 {
206 2 if(K1==1)
207 2 {
208 3 powder1L=1;
209 3 delayms(200);
210 3 powder2L=0;//第2台电机正转
211 3 delay4s();//未定的数值移动若干距离
212 3 powder2L=1;
213 3 delayms(200);
214 3 powder3L=0;//步时电机3正转触发单片机板进行控制
215 3 delayms(100);
216 3 powder3L=1;
217 3 delayms(200);
218 3 powder4L=0;//旋转后开始上升
219 3 }
220 2
221 2 }
222 1 if(V==3)
223 1 { powder1L=1;
224 2 delayms(200);
225 2 powder2L=0;//第2台电机正转
226 2 delay4s();//未定的数值移动若干距离
227 2 powder2L=1;
228 2 delayms(200);
229 2 powder3L=0;//步时电机3正转触发单片机板进行控制
230 2 delayms(100);
231 2 powder3L=1;
232 2 delayms(200);
233 2 powder4L=0;//旋转后开始上升
234 2 }
235 1 if(V==4)
236 1 { powder4L=1;
237 2 delayms(200);
238 2 powder2L=0;//电步进电机2开始工作
239 2 }
240 1 if(V==5)//遇行程开关K6电机2停止工作
241 1 {
C51 COMPILER V7.06 XIN 03/11/2012 17:31:57 PAGE 5
242 2 powder2L=1;
243 2 delayms(200);
244 2 powder5L=0;//电机1第二次正转
245 2 }
246 1 if(V==6)//遇行程开关K8,电机1停止工作
247 1 {
248 2 powder5L=1;
249 2 delay4s();//电机1延时4秒后反转
250 2 powder5R=0;
251 2
252 2 //遇K7电机1停止工作
253 2 delay4s();
254 2 powder5R=1;
255 2 delayms(200);
256 2 powder2L=0;//第2台电机反转
257 2 powder2R=0;
258 2 delay4s();//未知数值
259 2 powder2L=1;
260 2 powder2R=1;
261 2 delayms(200);
262 2 powder4R=0;//第4台电机反转
263 2 powder4L=0;
264 2 }
265 1
266 1 if(V==7)
267 1 { powder4R=1;
268 2 powder4L=1;
269 2 delayms(200);
270 2 powder3R=0;//第三台电动机反旋转
271 2 powder3L=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -