📄 conrol.lst
字号:
C51 COMPILER V7.05 CONROL 09/27/2007 11:17:01 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE CONROL
OBJECT MODULE PLACED IN CONROL.OBJ
COMPILER INVOKED BY: C:\silabs\IDEfiles\C51\BIN\C51.exe CONROL.C DB OE
stmt level source
*** WARNING C500 IN LINE 1 OF CONROL.C: MISSING DEVICE (SECURITY KEY NOT FOUND)
1 //通信9个字节,前3个字节为帧头,均为0xff;第四个字节为距离,a路占高4位
2 //bc路占低4位;第五个字节位速度a路占高4位,bc路占低4位;第六个字节为A路衰减量;
3 //第7个字节为B路衰减量;第8个字节为c路衰减量;第9个字节为控制开关信号,8位分别为
4 //* * * * 相参开关,c路开关,b路开关,a路开关,其中1为开,0为关
5 //系统采用15M晶振,每100ms更新一次距离延时,每秒钟更新10次对应速度分别0,100m/s
6 //200m/s,300m/s,400m/s,500m/s,所以每100ms应该更新的距离分别为0m,10m,20m,30m
7 //40m,50m。15M的晶振一个脉冲对应的距离是10m。所以0m,10m,20m,30m
8 //40m,50m对应的脉冲改变量分别为0,1个,2个,3个,4个,5个。
9 //
10 //
11 //
12 //
13 //
14 #include <C8051F020.h>
15 #include <absacc.h>
16 #include <stdio.h>
17 #include <intrins.h>
18 #define uchar unsigned char
19 #define uint unsigned int
20 #define a_dis_com XBYTE[0x0FFF]
21 #define a_updata_com XBYTE[0x1FFF]
22 #define bc_dis_com XBYTE[0x2FFF]
23 #define bc_updata_com XBYTE[0x3FFF]
24 #define a_bc_v_com XBYTE[0x4FFF]
25 #define a_att_com XBYTE[0x5FFF]
26 #define b_att_com XBYTE[0x6FFF]
27 #define c_att_com XBYTE[0x7FFF]
28 #define on_off_com XBYTE[0X8FFF]
29 bit flag_a;
30 bit flag_bc;
31
32 uint code distance[]={1500,2000,5000,8000,15000,18000,21000,24000,27000,30000,32000};
33 uchar count_interrupt=0;
34 uchar count_receive_data;
35 uchar receive_data[9];
36 uchar a_dis,bc_dis;
37 uint a_conversion_data,bc_conversion_data;
38 uint save_a_inital_distance,save_bc_inital_distance;
39 uchar hex_h,hex_l;
40 uchar a_velocity,bc_velocity;
41 void dec_hex(uint x)
42 {hex_h=x/0xff;
43 1 hex_l=x%0xff;
44 1
45 1 }
46 void config_mcu (void)
47 {
48 1 //----------------------------------------------------------------
49 1 //看门狗配置
50 1 WDTCN = 0x07; // Watchdog Timer Control Register
51 1 WDTCN = 0xde; // 禁止看门狗
52 1 WDTCN = 0xAD;
53 1 // Configure the XBRn Registers
54 1 XBR0 = 0x04; // XBAR0: Initial Reset Value串口0使能
C51 COMPILER V7.05 CONROL 09/27/2007 11:17:01 PAGE 2
55 1 XBR1 = 0x00; // XBAR1: Initial Reset Value
56 1 XBR2 = 0xC0; // XBAR2: Initial Reset Value弱上拉全局禁止
57 1 P0MDOUT = 0xff; // Output configuration for P0
58 1 P1MDOUT = 0xff; // Output configuration for P1
59 1 P2MDOUT = 0xff; // Output configuration for P2
60 1 P3MDOUT = 0xff; // Output configuration for P3
61 1 P74OUT = 0xff; // Output configuration for P4-7
62 1 P1MDIN = 0xFF; // Input configuration for P1
63 1 EMI0CF = 0x3f; // EMIF ACTIVE ON p4-p7非复用movx指令访问外部ram
64 1 }
65 //-------------------------------------------------------------------------
66 void SYSCLK_Init (void)
67 {
68 1 int i; /*延时计数器*/
69 1
70 1 OSCXCN = 0x67; /*打开外部晶体振荡器*/
71 1 for (i=0; i < 256; i++) ; /*延时*/
72 1
73 1 while (!(OSCXCN & 0x80)) ; /*查询外部晶体是否稳定起振*/
74 1
75 1 OSCICN = 0x08; /*用外部晶体作为系统时钟,并禁止时钟丢失检测*/
76 1 }
77 //--------------------------------------------------------------------------
78 void UART0_Init (void)
79 {
80 1 SCON0 = 0x50; /*SCON0:模式1,8位UART,时能RX*/
81 1 TMOD = 0x20; /*TMOD: 定时器工作再模式2, 8位重载*/
82 1 TH1=0xfa; //波特率设置
83 1 TL1=0xfa; /*设置定时1用作波特率的重载值*/
84 1 TR1 = 1; /*开定时器1*/
85 1 CKCON = 0x00; /*定时器1用系统时钟作12分频为它的时基,定时器0用系统时钟的12分频作为
-时钟,定时器2使用系统时钟的12分频作为时钟*/
86 1 PCON = 0x80; /*SMOD00 = 1*/
87 1 }
88
89 //---------------------------------------------------------------------------------
90 void ComTx(uchar x){
91 1 SBUF0=x;
92 1 while(TI0==0);
93 1 TI0=0;
94 1 }
95 //-------------------------------------------------------------------------------------
96 void output_control_paramater(uint a_distance_data,uint bc_distance_data,uchar a_bc_v_data ,uchar a_att_
-data,
97 uchar b_att_data,uchar c_att_data,uchar on_off_data)
98 {dec_hex(a_distance_data);
99 1 a_dis_com=hex_l;
100 1 a_dis_com=hex_h;
101 1 a_updata_com=0x00;
102 1 dec_hex(bc_distance_data);
103 1 bc_dis_com=hex_l;
104 1 bc_dis_com=hex_h;
105 1 bc_updata_com=0x00;
106 1 a_bc_v_com=a_bc_v_data ;
107 1 a_att_com=a_att_data;
108 1 b_att_com=b_att_data;
109 1 c_att_com=c_att_data;
110 1 on_off_com=on_off_data;
111 1 }
112 //-------------------------------------------------------------------------------------
113 void main(void)
114 {
C51 COMPILER V7.05 CONROL 09/27/2007 11:17:01 PAGE 3
115 1
116 1 uchar crc,i;
117 1 crc=0;
118 1 config_mcu();
119 1 SYSCLK_Init();
120 1 UART0_Init();
121 1 output_control_paramater(0X00,0X00,0X00,0X00,0X00,0X00,0x00);//A,B,C路关闭
122 1 count_receive_data=0;
123 1 receive_data[9]=(0,0,0,0,0,0,0,0,0);
124 1 TL0=0xdf; //定时器0定时60ms
125 1 TH0=0x01;
126 1 T2CON=T2CON & 0XF0;//
127 1 EA=1;//使能总中断
128 1 ES0=1;//使能串口0中断
129 1 ET0=1;//使能定时器0中断
130 1 ET2=1;//使能定时器2中断
131 1
132 1 //ComTx(0x30);
133 1 while(1)
134 1 { do
135 2 { if (count_receive_data>=1)
136 3 //TR0=1;
137 3 ;
138 3 }
139 2 while(count_receive_data<9);
140 2 EA=0;
141 2 TR0=0;
142 2 TL0=0xdf;//定时器0定时20ms
143 2 TH0=0x01;
144 2 TL2=0x77; //定时器2定时50ms
145 2 TH2=0xec;
146 2 RCAP2L=0x77;
147 2 RCAP2H=0xec;
148 2 bc_dis=receive_data[3]&0x0f;//为转换BC路距离,可直接查表
149 2 a_dis=receive_data[3]>>4;//为转换后A路距离,可直接查表
150 2 a_velocity=(receive_data[4]>>4);//为转换后A路速度,
151 2 if (a_velocity>=8)
152 2 flag_a=1;
153 2 else
154 2 flag_a=0;
155 2 a_velocity=a_velocity&0x07;//去掉符号位
156 2 bc_velocity=(receive_data[4]&0x0f);//为转换后BC路速度,
157 2 if (bc_velocity>=8)
158 2 flag_bc=1;
159 2 else
160 2 flag_bc=0;
161 2 bc_velocity=bc_velocity&0x07;//去掉符号位
162 2 a_conversion_data=distance[a_dis];//转换成A路应延时的脉冲数
163 2 bc_conversion_data=distance[bc_dis];//转换成BC路应延时的脉冲数
164 2 save_a_inital_distance=a_conversion_data;
165 2 save_bc_inital_distance=bc_conversion_data;
166 2
167 2 if( receive_data[0]==0xff && receive_data[1]==0xff && receive_data[2]==0xff)
168 2 {for (i=3;i<9;i++)
169 3 crc=crc+receive_data[i];
170 3 ComTx(crc);
171 3 crc=0;
172 3 output_control_paramater(a_conversion_data,bc_conversion_data,receive_data[4],receive_data[5],receive
-_data[6],receive_data[7],receive_data[8]);
173 3 TR2=1;
174 3 }
175 2 count_receive_data=0;
C51 COMPILER V7.05 CONROL 09/27/2007 11:17:01 PAGE 4
176 2 receive_data[9]=(0,0,0,0,0,0,0,0,0);
177 2 EA=1;
178 2 }
179 1 }
180
181 /*串口中断0子程序*/
182 void UART0_ISR (void) interrupt 4
183 {
184 1 if(!TI0) //是发送中断还是接收中断
185 1 { receive_data[count_receive_data]=SBUF0;
186 2 count_receive_data++;
187 2 RI0 = 0; /*清接收标志位*/
188 2 }
189 1 TI0 = 0; /*清发送标志位*/
190 1
191 1 }
192 /*定时器0中断服务程序*/
193 void Timer0_Isr(void) interrupt 1
194 {
195 1 TR0=0;
196 1 TL0=0xdf;//定时器0定时20ms
197 1 TH0=0x01;
198 1 count_receive_data=0;
199 1 receive_data[9]=(0,0,0,0,0,0,0,0,0);
200 1 }
201 void Timer2_ISR (void) interrupt 5
202 {
203 1 TF2=0; //清除中断标志
204 1 count_interrupt++;//中断次数加1
205 1 if (count_interrupt==2) //100ms定时到
206 1 {count_interrupt=0;
207 2 //A路转换后的距离换算
208 2 if(!flag_a)
209 2 a_conversion_data=a_conversion_data-a_velocity;
210 2 else
211 2 a_conversion_data=a_conversion_data+a_velocity;
212 2 //BC路转换后的距离换算
213 2 if(!flag_bc)
214 2 bc_conversion_data=bc_conversion_data-bc_velocity;
215 2 else
216 2 bc_conversion_data=bc_conversion_data+bc_velocity;
217 2 output_control_paramater(a_conversion_data,bc_conversion_data,receive_data[4],receive_data[5],receive_da
-ta[6],receive_data[7],receive_data[8]);
218 2 if ((a_conversion_data>36000 )||(a_conversion_data<5))
219 2 a_conversion_data=save_a_inital_distance;
220 2 if ((bc_conversion_data>=36000) ||(bc_conversion_data<=5))
221 2 bc_conversion_data=save_bc_inital_distance;
222 2 }
223 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 711 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 10
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 1 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -