📄 rs232c.lst
字号:
C51 COMPILER V7.50 RS232C 11/28/2008 16:09:25 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE RS232C
OBJECT MODULE PLACED IN RS232C.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE RS232C.C BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <at89x52.h>
2 #include <stdio.h>
3
4 sfr WDTRST = 0xA6;
5
6 sbit MOTOR_STOP = P2^0;
7 unsigned int number = 0;
8 unsigned char r_buf=0;
9 unsigned char motor_direction = 0;
10 unsigned char stop = 0;
11 unsigned char disp_buf=0;
12 unsigned char counter;
13
14 #define STEP 500 //设置step_run模式时的步长
15
16 void watch_dog(void);
17 void step_motor(unsigned int);
18 void delay_msec(unsigned int);
19 //实验板上的数码管编码
20 unsigned char code tube_array[23] = {0x28,0x7e,0xA2,0x62,0x74,0x61,0x21,0x7a,0x20,0x60,0x30,0x25,0xa9,0x26
-,0xa1,0xb1,0x35,0xad,0x38,0xb0,0x2c,0xFF,0xa0};
21 // ********************* 0 ** 1 ** 2 ** 3 ** 4 ** 5 ** 6 ** 7 ** 8 ** 9 ** A ** b ** C ** d ** E ** F ** h
- ** L ** n ** P ** U ** ** e **
22
23 void main()
24 {
25 1 unsigned int msec_reg = 5, number_reg = 0;
26 1 TMOD = 0x21;//定时器1用来作为串行通讯的波特率发生器,工作在方式2; 定时器0用来喂狗
27 1 SCON = 0x50;//串行口工作在方式1,置位串行口接收允许位REN。
28 1 PCON = 0;//设置SMOD为0.
29 1 TH0 = (65536-2000)/256; TL0 = (65536-2000)%256;//定时器0置初值
30 1 TH1 = 0xE8; TL1 = 0xE8;//设置波特率为1200。
31 1 TR0 = 1;
32 1 ET0 = 1;
33 1 TR1 = 1;
34 1 ES = 1;
35 1 IP=0x10;
36 1 EA = 1;
37 1
38 1 watch_dog();
39 1 stop = 1;
40 1
41 1 while(1)
42 1 {
43 2 if(r_buf&&r_buf!=255)
44 2 {
45 3 disp_buf=r_buf;
46 3 //SBUF = 1;
47 3 //while(!TI);
48 3 //TI=0;
49 3 ES = 0; //关串口中断
50 3 switch(r_buf) //根据串口送过来的不同字符,单片机采取不同动作
51 3 {
52 4 case 49: r_buf = 0; //步进,步长可以通过宏STEP调整
53 4 number_reg = number;
C51 COMPILER V7.50 RS232C 11/28/2008 16:09:25 PAGE 2
54 4 if(40000-number_reg<1000)
55 4 {
56 5 number = 0;
57 5 number_reg = 0;
58 5 }
59 4
60 4 stop = 0;
61 4 while((number-number_reg<=STEP)&&!stop)
62 4 {
63 5 step_motor(msec_reg);
64 5 }
65 4 stop = 1;
66 4 break;
67 4 case 50: r_buf = 0; //改变msec_reg,从而改变电机的速度,低速模式
68 4 msec_reg = 5;
69 4 break;
70 4 case 51: r_buf = 0; //改变msec_reg,从而改变电机的速度,高速模式
71 4 msec_reg = 2;
72 4 break;
73 4 case 52: r_buf = 0;
74 4 motor_direction = 1; //改变电机转动的方向
75 4 break;
76 4 case 53: r_buf = 0; //改变电机转动的方向
77 4 motor_direction = 0;
78 4 break;
79 4 default: r_buf = 0; //清除r_buf不做任何动作
80 4 break;
81 4 }
82 3 ES = 1;//开串口中断
83 3 }
84 2 }
85 1 }
86
87 void step_motor(unsigned int msec)
88 {
89 1 if(!stop)
90 1 {
91 2 if(motor_direction)
92 2 {
93 3 P1 = 0xf1;
94 3 delay_msec(msec);
95 3 P1 = 0xf3;
96 3 delay_msec(msec);
97 3 P1 = 0xf2;
98 3 delay_msec(msec);
99 3 P1 = 0xf6;
100 3 delay_msec(msec);
101 3 P1 = 0xf4;
102 3 delay_msec(msec);
103 3 P1 = 0xfc;
104 3 delay_msec(msec);
105 3 P1 = 0xf8;
106 3 delay_msec(msec);
107 3 P1 = 0xf9;
108 3 delay_msec(msec);
109 3 }
110 2 else
111 2 {
112 3 P1 = 0xf9;
113 3 delay_msec(msec);
114 3 P1 = 0xf8;
115 3 delay_msec(msec);
C51 COMPILER V7.50 RS232C 11/28/2008 16:09:25 PAGE 3
116 3 P1 = 0xfc;
117 3 delay_msec(msec);
118 3 P1 = 0xf4;
119 3 delay_msec(msec);
120 3 P1 = 0xf6;
121 3 delay_msec(msec);
122 3 P1 = 0xf2;
123 3 delay_msec(msec);
124 3 P1 = 0xf3;
125 3 delay_msec(msec);
126 3 P1 = 0xf1;
127 3 delay_msec(msec);
128 3 }
129 2 number++; //计数
130 2 if(number==40000) number = 0;
131 2 }
132 1 }
133
134 void watch_dog(void)
135 {
136 1 WDTRST=0x1e;
137 1 WDTRST=0xe1;
138 1 }
139
140
141 void time0(void) interrupt 1
142 {
143 1 TH0 = (65536-2000)/256; TL0 = (65536-2000)%256;//定时器0置初值
144 1 watch_dog();
145 1 if(MOTOR_STOP) stop = 1; //当P2_0为高时,停止电机转动
146 1
147 1 counter++;
148 1 if(counter>=3) counter=0;
149 1 switch(counter)
150 1 {
151 2 case 0:
152 2 P2=0x7F;
153 2 P0=tube_array[disp_buf%100%10];
154 2 break;
155 2 case 1:
156 2 P2=0xBF;
157 2 P0=tube_array[(disp_buf%100)/10];
158 2 break;
159 2 case 2:
160 2 P2=0xDF;
161 2 P0=tube_array[disp_buf/100];
162 2 break;
163 2 }
164 1 }
165
166
167 void serial(void) interrupt 4
168 {
169 1 if(RI)
170 1 {
171 2 r_buf=SBUF;
172 2 RI=0;
173 2 }
174 1 }
175
176 void delay_msec(unsigned int i)
177 {
C51 COMPILER V7.50 RS232C 11/28/2008 16:09:25 PAGE 4
178 1 unsigned char j;
179 1 while(i--)
180 1 {
181 2 for(j=0;j<125;j++);
182 2 }
183 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 521 ----
CONSTANT SIZE = 23 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 7 6
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 + -