📄 text1.lst
字号:
C51 COMPILER V7.50 TEXT1 01/17/2009 12:52:54 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include "c8051F040.h"
2 #define uchar unsigned char
3 #define uint unsigned int
4
5 #define Motor_start 0x10 // 电机开启命令
6 #define Motor_stop 0x20 // 电机停止命令
7 #define Motor_control 0x30 // 接收数据的包头信号
8 #define Motor_turn 0x01 // 电机正转
9 #define Motor_Anti_turn 0x02 // 电机反转
10
11 bit Motor_Flag_turn=0; // 电机转动与停止转动的标志位
12
13 sbit Motor_CP =P4^1;
14 sbit Motor_DIR =P4^0;
15
16 sbit LED=P1^6; // 对LED操作的时候要先 SFRPAGE = CONFIG_PAGE;
17
18 xdata uchar uart0_data[5]={0xfe,0xcc,0x02,0x00,0x00};
19 uint pulse_num=0x0000; // 从串口接收到的脉冲数,脉冲数16进制高8位和低8位合并一个16位
20 uint Time0_num_LED=0; // 定时器中断次数,定时器每定时累积到1秒LED取反一次
21
22 // uart0_data[0]= TH0
23 // uart0_data[1]= TL0
24 // uart0_data[2]= 0x01正转 / 0x00反转
25 // uart0_data[3]= 脉冲数16进制高8位
26 // uart0_data[4]= 脉冲数16进制低8位
27
28 void port_init(); // 端口初始化函数
29 void os_init(); // 系统时钟初始化,选择外部晶体振荡器
30 void uart_init(); // 串口初始化,选择UART0
31 void time01_init(); // 定时器1初始化,作为UART0的波特率发生器,定时器0初始化
32
33
34 void delay(int tim)
35 {
36 1 int i,j;
37 1 for(i=0;i<tim;i++)
38 1 {
39 2 for(j=0;j<i;j++);
40 2 }
41 1 }
42
43 /*************************************************************************
44 *主函数
45 **************************************************************************/
46 void main()
47 {
48 1 WDTCN = 0xDE; // 关闭看门狗
49 1 WDTCN = 0xAD;
50 1
51 1 os_init(); // 晶振初始化
52 1 port_init(); // 端口初始化
53 1 uart_init(); // 串口初始化,选择UART0
54 1 time01_init(); // 定时器初始化,作为UART0的波特率发生器
55 1 SFRPAGE = CONFIG_PAGE;
C51 COMPILER V7.50 TEXT1 01/17/2009 12:52:54 PAGE 2
56 1
57 1 IE = 0x92; // 开中断 bit7=EA 全局总中断
58 1
59 1 while(1)
60 1 {
61 2 if(Motor_Flag_turn==1)
62 2 {
63 3 SFRPAGE = TIMER01_PAGE;
64 3 TR0=1;
65 3 }
66 2 if(Motor_Flag_turn==0)
67 2 {
68 3 SFRPAGE = TIMER01_PAGE;
69 3 TR0=0;
70 3
71 3 SFRPAGE = CONFIG_PAGE;
72 3 LED=1;
73 3 }
74 2 if(pulse_num==0)
75 2 {
76 3 SFRPAGE = UART0_PAGE;
77 3 SBUF0=0x20;
78 3 Motor_Flag_turn=0;
79 3 }
80 2 if(pulse_num!=0)
81 2 {
82 3 Motor_Flag_turn=1;
83 3 SFRPAGE = UART0_PAGE;
84 3 SBUF0=uart0_data[2];
85 3 }
86 2 delay(1000);
87 2 }
88 1
89 1 }
90
91 // uart0_data[0]= TH0
92 // uart0_data[1]= TL0
93 // uart0_data[2]= 0x01正转 / 0x00反转
94 // uart0_data[3]= 脉冲数16进制高8位
95 // uart0_data[4]= 脉冲数16进制低8位
96 void time0 (void) interrupt 1
97 {
98 1 char i;
99 1
100 1 // TR0=0; // 先停止计数,来赋值
101 1 TH0=uart0_data[0];
102 1 TL0=uart0_data[1]; // 赋脉冲频率值
103 1 // TR0=1;
104 1
105 1 if(Time0_num_LED==0x07d0) // 2000*0.0005=1秒
106 1 {
107 2 SFRPAGE = CONFIG_PAGE;
108 2 Time0_num_LED=0;
109 2 LED=~LED;
110 2 }
111 1 else Time0_num_LED++;
112 1
113 1 SFRPAGE = TIMER01_PAGE;
114 1
115 1
116 1
117 1 if(pulse_num !=0)
C51 COMPILER V7.50 TEXT1 01/17/2009 12:52:54 PAGE 3
118 1 {
119 2 i=uart0_data[2];
120 2 SFRPAGE = CONFIG_PAGE;
121 2 if(i==Motor_turn) // 电机正转
122 2 {
123 3 SFRPAGE = CONFIG_PAGE;
124 3 pulse_num--;
125 3 Motor_DIR=1;
126 3 Motor_CP=~Motor_CP ;
127 3 }
128 2 if(i==Motor_Anti_turn) // 电机反转
129 2 {
130 3 SFRPAGE = CONFIG_PAGE;
131 3 pulse_num--;
132 3 Motor_DIR=0;
133 3 Motor_CP=~Motor_CP ;
134 3 }
135 2 }
136 1 }
137
138
139 void UART0 (void) interrupt 4
140 {
141 1 uchar i,j;
142 1 uint temp=0x0000;
143 1 SFRPAGE = UART0_PAGE;
144 1 if(TI0==1) TI0=0;
145 1 if(RI0==1)
146 1 {
147 2 ET0=0; // 关定时器0中断 要置串口中断的优先级高于定时器中断
148 2 RI0=0;
149 2 i=SBUF0;
150 2 if(i==Motor_start) Motor_Flag_turn=1;
151 2 if(i==Motor_stop) Motor_Flag_turn=0;
152 2 if(i==Motor_control)
153 2 {
154 3 ES0=0;
155 3 SFRPAGE = UART0_PAGE;
156 3 for(j=0;j<5;j++)
157 3 {
158 4 while(RI0==0);
159 4 RI0=0;
160 4 uart0_data[j]=SBUF0;
161 4 }
162 3
163 3 ES0=1;
164 3
165 3 pulse_num=0x0000; // 从串口接收到的脉冲数,脉冲数16进制高8位和低8位合并一个16位
166 3 temp=uart0_data[3]; // 脉冲数16进制高8位
167 3 temp=temp<<8;;
168 3 pulse_num=temp;
169 3 temp=0x0000;
170 3 temp=uart0_data[4]; // 脉冲数16进制低8位
171 3 pulse_num=pulse_num|temp;
172 3 }
173 2 ET0=1; // 开定时器0中断
174 2 }
175 1 }
176
177 /*************************************************************************
178 *
179 *端口初始化函数
C51 COMPILER V7.50 TEXT1 01/17/2009 12:52:54 PAGE 4
180 **************************************************************************/
181 void port_init()
182 {
183 1 SFRPAGE = CONFIG_PAGE;
184 1 // XBR0,XBR1,XBR2,XBR3为I/O端口寄存器
185 1 XBR0 = 0x04; //bit2=1,UART0 TX0配置到P0.0,RX0配置到P0.1
186 1 XBR2 = 0x40;
187 1 //bit6=1,Crossbar开启,用法:交叉开关配置时,为了防止配置过程中功能引脚
188 1 //产生干扰,在引脚配置过程中,将XBARE清0,配置结束后,再将其置1,使交叉开关生效
189 1
190 1 P0MDOUT=0X10;//P0口输出模式控制, 1:相应口为推挽输出模式
191 1 P1MDOUT=0xff;
192 1 P1MDIN=0xff;
193 1 P4MDOUT=0xff;
194 1
195 1
196 1 }
197 /*************************************************************************
198 *系统时钟初始化,选择外部晶体振荡器 外部22.1184M晶振
199 **************************************************************************/
200 void os_init()
201 {
202 1 int i = 0;
203 1 SFRPAGE = CONFIG_PAGE;
204 1 OSCXCN = 0x67; //外部22.1184M晶振
205 1 // 0110 0111,bit6-4:110为外部石英晶振模式,bit2-0:111为设置外部晶振驱动电流配置表,书150页
206 1
207 1 for (i = 0; i < 3000; i++); //等待外部晶振稳定
208 1 while ((OSCXCN & 0x80) == 0); //OSCXCN的bit7位为只读,外部晶振稳定运行时为1
209 1 CLKSEL = 0x01; //bit7-1保留,bit0为1时SYSCLK采用外部时钟
210 1
211 1 }
212 /*************************************************************************
213 *串口初始化,选择UART0
214 **************************************************************************/
215 void uart_init()
216 {
217 1 SFRPAGE = UART0_PAGE;
218 1 SCON0 = 0x50; //允许uart0接收
219 1 // 0101 0000,bit4=1为UART0接收开启,bit7-6:01为模式1,8位UART可变波特率异部传输
220 1 }
221
222 /*************************************************************************
223 *定时器初始化,作为UART0的波特率发生器
224 *************************************************************************/
225 void time01_init()
226 {
227 1 SFRPAGE = TIMER01_PAGE;
228 1 TMOD=TMOD&0x0F;
229 1 TMOD=TMOD|0x20; //bit5-4=T1M1-T1M0=10为T1模式为2,8位自动重载定时/计数器
230 1 CKCON=CKCON&0XEF; //先将bit4清0,然后再赋值
231 1 CKCON=CKCON|0X10; //bit4=1,T1时钟为系统时钟
232 1 TH1=0xb8; //0xb8=184: 22.1184 M /(256-184) * 1/32=9600
233 1 ET1=0; // 不允许T0中断
234 1
235 1 // TR1=1; 这里不能用这句,因为开了TR1,下面的定时器0的初始化对TMOD等操作无效了
236 1 // 所以要等定时器1和定时器0都初始化完了,再开TR1和TR0置为1
237 1
238 1 SFRPAGE = TIMER01_PAGE;
239 1 TMOD=TMOD&0xF0;
240 1 TMOD=TMOD|0x01; // 模式1(16位定时/计数器),仅受TR0控制
241 1 CKCON=CKCON&0xF7; // 先将bit3清0,然后再赋值
C51 COMPILER V7.50 TEXT1 01/17/2009 12:52:54 PAGE 5
242 1 CKCON=CKCON|0x00; // bit3=0,T0时钟为系统时钟由SCA1~SCA0决定
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -