📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 11/10/2010 15:11:26 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE main.c BROWSE DEFINE(XTAL=19660800) DEBUG OBJECTEXTEND
line level source
1 #include <stdio.h>
2 #include <intrins.h>
3 #include "STC12C5202AD.H"
4 #include "sio.h"
5
6 typedef struct PID
7 {
8
9 int p; // 比例常数 Proportional Const
10 int i; // 积分常数 Integral Const
11 int d; // 微分常数 Derivative Const
12
13 int position;
14 int hisPosition;
15 int lastPosition[3];
16 } PID;
17
18 static PID idata pid;
19 static int GAIN;
20
21 #define MIN9MS (XTAL/2L/256L*9L/1000L*9L/10L) //9ms脉宽*90%
22 #define MAX9MS (XTAL/2L/256L*9L/1000L*11L/10L) //9ms脉宽*110%
23
24 #define MIN45MS (XTAL/2L/256L*45L/10000L*9L/10L) //4.5ms脉宽
25 #define MAX45MS (XTAL/2L/256L*45L/10000L*11L/10L)
26
27 #define MIN225MS (XTAL/2L/256L*225L/100000L*9L/10L) //2.25ms脉宽
28 #define MAX225MS (XTAL/2L/256L*225L/100000L*11L/10L)
29
30 #define MIN056MS (XTAL/2L/256L*56L/100000L*6L/10L) //0.56ms脉宽*60%,下限
31 #define MAX056MS (XTAL/2L/256L*56L/100000L*14L/10L)
32
33 #define MIN168MS (XTAL/2L/256L*168L/100000L*6L/10L) //1.68ms脉宽*60%
34 #define MAX168MS (XTAL/2L/256L*168L/100000L*14L/10L)
35
36 sfr ISP_CUNTR = 0xE7;
37
38 sbit LED1 = P3^0;
39 sbit LED2 = P3^1;
40
41 sbit AD_LED1 = P2^0;
42 sbit AD_LED2 = P2^1;
43 sbit AD_LED3 = P2^7;
44
45 sbit IR_FRONT = P3^2;
46 sbit IR_LEFT = P3^3;
47 sbit IR_RIGHT = P2^6;
48 sbit IR_BACK = P3^7;
49
50 sbit IR_OUT = P3^5;
51
52 sbit MOTO_IN_B1 = P2^5;
53 sbit MOTO_IN_B2 = P2^4;
54
55 sbit MOTO_IN_A1 = P2^3;
C51 COMPILER V7.50 MAIN 11/10/2010 15:11:26 PAGE 2
56 sbit MOTO_IN_A2 = P2^2;
57
58 static unsigned char idata ad_datas[8]; //8路光电管采样电压
59 static unsigned char idata ad_datas_check[8]; //8路光电管采样电压校验值,轨道的白色背景的采样值
60
61 bit power_stat;
62 static unsigned char car_stat; //小车状态:0,停止;1,前进;2,后退;3,左转;4,右转;5,寻线模式;ff,自控避障模式
63 static unsigned int now;
64
65 static unsigned char code led_mod_table[3][20] = {
66 {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
67 {1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0},
68 {1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0}
69 };
70 unsigned char idata led_mod = 0;
71 static unsigned char idata led_tick = 0;
72 static unsigned char idata led_ptr = 0;
73
74
75 static bit test;
76
77 static unsigned char tick = 0;
78 static unsigned int pwm38k = 0;
79 static unsigned char check;
80
81 static unsigned char pwm_moto = 0;
82 static unsigned char pwm_moto_left = 0;
83 static unsigned char pwm_moto_right = 0;
84 static bit moto_left_forward = 1;
85 static bit moto_right_forward = 1;
86
87
88 #define IR_SINGAL_DELAY 11 //接收管输出延迟载波数量
89 #define TEST_PERIOD 1620 //评估周期,这个不同的接收管差别很大.
90 #define IR_SINGAL_PERIOD 76 //持续发射红外线载波数量
91 #define IR_VALID_THROLD 70 //判断是否前方有障碍的阀值
92
93 /*
94 #define IR_SINGAL_DELAY 1 //接收管输出延迟载波数量
95 #define TEST_PERIOD 200 //评估周期,这个不同的接收管差别很大.
96 #define IR_SINGAL_PERIOD 10 //持续发射红外线载波数量
97 #define IR_VALID_THROLD 8 //判断是否前方有障碍的阀值
98 */
99 static unsigned char idata front_signal = 0;
100 static unsigned char idata back_signal = 0;
101 static unsigned char idata left_signal = 0;
102 static unsigned char idata right_signal = 0;
103
104 static bit front_obj = 0, back_obj = 0, left_obj = 0, right_obj = 0;
105
106 /*
107 * PCA中断计数,根据位置判断信号区域和定义,位置0表示初始,1代表引导码信号,2表示引导码间隔,
108 * 3表示第一个bit的信号,4表示第一个bit的间隔,以次类推...
109 * 更具体见对应的红外线协议.
110 */
111 static unsigned int idata pca_tick;
112 static unsigned char idata pca_int_count;
113 static unsigned char data pca_int_total; /* 根据引导头确定总长度 */
114 static unsigned int idata period; /* 红外信号占或空周期计数 */
115 static unsigned char idata data_buf[6]; /* 红外线协议数据缓冲区 */
116 static unsigned int idata ccap1; //PCA0上一次的的计数
117 static unsigned char idata frame_dog; //红外帧看门狗,限定时间未接收完成清除工作
C51 COMPILER V7.50 MAIN 11/10/2010 15:11:26 PAGE 3
118
119 static void delay_ms(unsigned int v) {
120 1 unsigned int wait = pca_tick + v / 7 + 1;
121 1 while (wait != pca_tick) {
122 2 PCON |= 0x01;
123 2 }
124 1 }
125
126 static void delay_100us(unsigned char v) {
127 1 unsigned char wait = tick + v * 2; //每tick约50us
128 1 while (wait != tick) {
129 2 ;//PCON |= 0x01;
130 2 }
131 1 }
132
133 void pid_init(PID *pid)
134 {
135 1 pid->position = 0;
136 1 pid->hisPosition = 0;
137 1 pid->lastPosition[0] = 0;
138 1 pid->lastPosition[1] = 0;
139 1 pid->lastPosition[2] = 0;
140 1 pid->p = 2;
141 1 pid->i = 0;
142 1 pid->d = 8;
143 1 }
144
145 void read_sensors(unsigned char sensors[]) { //读光电传感器的采样值
146 1 unsigned char i;
147 1
148 1 for (i = 0; i < 8; i++) { //LED熄灭状态测量一次电压
149 2 ADC_CONTR = 0xE0 | i; //设置AD通道, 快速AD采样.
150 2 delay_100us(5); //延迟等待电压稳定
151 2 ADC_RES = 0;
152 2 ADC_CONTR = 0xE8 | i;; //启动AD
153 2 while (!(ADC_CONTR & 0x10)) {
154 3
155 3 }
156 2 ADC_CONTR &= 0xE7;
157 2 sensors[i] = ADC_RES;
158 2 }
159 1
160 1 AD_LED1 = 0;
161 1 AD_LED2 = 0;
162 1 AD_LED3 = 0;
163 1
164 1 for (i = 0; i < 8; i++) { //LED打开再测量一次电压,用于消除环境光的差异.
165 2 ADC_CONTR = 0xE0 | i; //设置AD通道, 快速AD采样.
166 2
167 2 delay_100us(5); //延迟等待电压稳定
168 2
169 2 ADC_RES = 0;
170 2 ADC_CONTR = 0xE8 | i;; //启动AD
171 2 while (!(ADC_CONTR & 0x10)) {
172 3
173 3 }
174 2 ADC_CONTR &= 0xE7;
175 2
176 2 if (ADC_RES > sensors[i])
177 2 sensors[i] = ADC_RES - sensors[i];
178 2 else
179 2 sensors[i] = ADC_RES;
C51 COMPILER V7.50 MAIN 11/10/2010 15:11:26 PAGE 4
180 2 }
181 1 AD_LED1 = 1;
182 1 AD_LED2 = 1;
183 1 AD_LED3 = 1;
184 1 }
185
186 static void read_sensors_check() { //从flash中读取光电传感器的校验值,结构是8byte的值+1字节的crc
187 1 unsigned char i, crc = 0;
188 1 IAP_ADDRH = 0;
189 1 IAP_CONTR = 0x80; //允许ISP/IAP操作
190 1 IAP_CMD = 0x01; //读flash
191 1
192 1 for (i = 0; i < 8; i++) {
193 2 IAP_ADDRL = i;
194 2 IAP_TRIG = 0x5A;
195 2 IAP_TRIG = 0xA5; //启动IAP操作
196 2 _nop_();
197 2 ad_datas_check[i] = IAP_DATA;
198 2 crc += IAP_DATA;
199 2 //com_putchar(IAP_DATA);
200 2 }
201 1 IAP_ADDRL = 8;
202 1 IAP_TRIG = 0x5A;
203 1 IAP_TRIG = 0xA5; //启动IAP操作
204 1 _nop_();
205 1
206 1 if (crc != IAP_DATA) { //crc验证错误,flash数据失效
207 2 for (i = 0; i < 8; i++) {
208 3 ad_datas_check[i] = 0xff;
209 3 }
210 2 }
211 1
212 1 IAP_CONTR = 0; //禁止IAP,防止误操作
213 1 IAP_CMD = 0;
214 1 IAP_TRIG = 0;
215 1 IAP_ADDRH = 0xff;
216 1 IAP_ADDRL = 0xff;
217 1 }
218
219 static void write_sensors_check() { //将光电传感器的校验值写入flash,结构是8byte的值+1字节的crc
220 1 unsigned char i, crc = 0;
221 1 IAP_ADDRH = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -