📄 main.lst
字号:
C51 COMPILER V7.04 MAIN 12/26/2007 09:33:09 PAGE 1
C51 COMPILER V7.04, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN MAIN.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE MAIN.c BROWSE DEBUG OBJECTEXTEND CODE
stmt level source
1 /***********************************************************************/
2 /* 文件名 :main.c
3 /* 芯片 :Atmel AT89C51
4 /* 作者 :Ericson
5 /* 日期 :2007.11.15
6 /* 功能描述:走纸影像靶集中控制系统主程序。
7
8 /***********************************************************************/
9
10 //***********************************************************************
11 //包含头文件
12 #include "I2C.h"
13
14 //***********************************************************************
15 //宏定义
16 #define BUFFER_LENGTH 6 //串行命令帧长度
17 #define UART_MESGFLAG 0xA1 //接收消息开始字节
18
19 //串行口指令码定义
20 //控制码由主机发至控制箱,标识码由控制箱发至主机,数据码用于携带数据信息
21 #define MOTO_RUN 0x0001 //电机运行控制码
22 #define MOTO_STATER 0x0002 //读取当前电机运行状态
23 #define MOTO_CFGR 0x0003 //读取电机单步运行时间
24 #define IRLED_CFGR 0x0004 //读取红外灯亮度
25 #define IRLED_ON 0x0005 //红外灯打开
26 #define IRLED_OFF 0x0006 //红外灯关闭
27 #define NVM_RESET 0x0007 //复位E2PROM
28 #define MOTO_CFGM 0x0008 //修改电机单步运行时间
29 #define IRLED_CFGM 0x0009 //修改红外灯亮度
30
31 //辅助命令
32 #define MOTO_RUNALLTIME 0x000A //使电机一直走
33 #define MOTO_STOPALLTIME 0x000B //强制电机停止
34 #define MOTO_ALTERSTATE 0x000C //强制改变状态
35
36 //反馈命令
37 #define MOTO_STOP 0x8001 //电机停止
38 #define MOTO_STATERFB 0x8002 //电机当前运行状态
39 #define MOTO_CFGRFB 0x8003 //电机配置信息读取
40 #define IRLED_CFGRFB 0x8004 //红外灯亮度数据
41 #define POS_INDICATOR 0x8005 //到位信息有效
42 #define SIG_INDICATOR 0x8006 //射击信息有效
43 #define INIT_SUCCESS 0x8007 //系统初始化成功
44
45 //电机状态定义
46 //状态字节定义:FR ** ** ** ** ** MR ML
47 #define MOTO_FIRSTRUN 0x80
48 #define MOTO_MOVL 0x01
49 #define MOTO_MOVR 0x02
50
51 #define MOTO_PRERUN_TIME 1000 //电机预走纸时间
52 #define DEFAULT_MOTOSTATE 0x02 //电机缺省向右转动
53 #define DEFAULT_MOTOCYCLE 100 //电机缺省按单步运行100ms
54 #define DEFAULT_IRLEDLIGHT 128 //红外发光管缺省亮128
55
C51 COMPILER V7.04 MAIN 12/26/2007 09:33:09 PAGE 2
56 #define NVM_CONTROL 0xA0 //AT24C32控制字节为1010 0000
57 #define NVM_MOTOSTATE_ADDR 0x0000 //电机当前状态地址
58 #define NVM_MOTOCYCLE_ADDR NVM_MOTOSTATE_ADDR+1 //电机单步运行时间地址
59 #define NVM_IRLEDLIGHT_ADDR NVM_MOTOSTATE_ADDR+2 //红外发光管亮度
60
61 //***********************************************************************
62 //端口定义
63 sbit MANUALR = P1^2; //纸带右移手动操作输入端口
64 sbit MANUALL = P1^3; //纸带左移手动操作输入端口
65 sbit LEDR = P1^4; //纸带右移LED显示
66 sbit LEDL = P1^5; //纸带左移LED显示
67 sbit UARTCTRL= P1^7; //RS485收/发控制端口
68 sbit MOTO = P2^0; //电机互锁控制:0--左电机,1--右电机
69 sbit MOTOCTL = P2^1; //电机信号输出控制:0--信号有效,1--信号无效
70 sbit CLUTHCTL= P2^2; //离合器信号输出控制:0--信号有效,1--信号无效
71 sbit CLUTH = P2^3; //离合器互锁控制:0--左离合器,1--右离合器
72 sbit LEDCTL1 = P2^4; //红外照明灯控制:0--打开红外照明设备
73 // 1--关闭红外照明设备
74 //sbit LEDCTL2 = P2^5; //红外照明灯控制:0--打开红外照明设备
75 // 1--关闭红外照明设备(备用)
76 //sbit TEST1 = P2^6; //测试端口(备用)
77 //sbit TEST2 = P2^7; //测试端口(备用)
78 sbit PINT0 = P3^2; //外部中断0端口
79 sbit PINT1 = P3^3; //外部中断1端口
80 sbit MODESIG = P2^6; //用于模式信号输出,方便操作
81 sbit MODECTL = P2^7; //模式控制端口,用于屏蔽手动工作,0--手动,1--自动
82
83 //***********************************************************************
84 //全局变量定义
85 uchar T0Counter = 0,T0Counter1 = 0,T0Counter2 = 0,T1Counter = 0;
86 uchar T0Flag1 = 0,T0Flag2 = 0;
87 bit POS_TimeOut = 0,SIG_TimeOut = 0;
88 bit POSFlag = 0,SIGFlag = 0,MODEFLAG = 0;
89
90 bit UARTFlag = 0;
91 uchar rlength = 0;
92 uchar checksum = 0;
93 uchar RcvBUF[BUFFER_LENGTH];
94 uchar TrxBUF[BUFFER_LENGTH];
95
96 struct NVMConfig
97 {
98 uchar MotoState; //状态字节定义:FR ** ** ** ** ** MR ML
99 uchar MotoRunCycle; //电机当前单步运行时间
100 uchar IRLEDLight; //红外灯当前亮度
101 } CurConfig;
102
103 //***********************************************************************
104 //局部函数声明
105 void Delay_nms(uint n); //nms定时子程序
106 bit UART_SendStr(uchar *str,uchar len);//串行口发送一个字符串函数
107
108 void System_Init(void); //系统初始化程序
109 void System_SetMoto(void); //电机、离合器状态初始化函数
110 void System_ExchangeMoto(void); //电机、离合器状态切换函数
111 void System_MotoRun(uint time); //系统电机运行函数
112 void System_SendCommand(uint comid); //系统反馈当前信息函数
113 void System_ParseCommand(void); //系统解析当前信息函数
114
115 //***********************************************************************
116 //主函数
117 void main(void)
C51 COMPILER V7.04 MAIN 12/26/2007 09:33:09 PAGE 3
118 {
119 1 uchar Temp;
120 1 System_Init(); //系统初始化
121 1 EA = 0; //关闭中断
122 1 if( NVM_ReadB(NVM_CONTROL,NVM_MOTOSTATE_ADDR,&Temp) )
123 1 { //读取当前电机状态
124 2 if(Temp&MOTO_FIRSTRUN) //如果设备第一次运行
125 2 {
126 3 CurConfig.MotoState = DEFAULT_MOTOSTATE; //初始化电机状态
127 3 CurConfig.MotoRunCycle = DEFAULT_MOTOCYCLE; //电机缺省单步运行时间100ms
128 3 CurConfig.IRLEDLight = DEFAULT_IRLEDLIGHT; //红外灯缺省亮度
129 3 NVM_WriteStr(NVM_CONTROL,NVM_MOTOSTATE_ADDR,(uchar *)(&CurConfig),3);
130 3 }
131 2 else //如果不是第一次运行
132 2 { //读取EEPROM内各配置信息
133 3 NVM_ReadStr(NVM_CONTROL,NVM_MOTOSTATE_ADDR,(uchar *)(&CurConfig),3);
134 3 }
135 2 }
136 1 else
137 1 {
138 2 Temp = 0x00;
139 2 //EEPROM读数错误处理代码
140 2 }
141 1 EA = 1;
142 1 System_SetMoto(); //根据读取的状态内容设定电机和离合器工作方式
143 1 System_MotoRun(MOTO_PRERUN_TIME); //系统启动后根据状态值预运行
144 1 System_SendCommand(INIT_SUCCESS); //向主机反馈系统初始化成功
145 1
146 1 //系统进入等待状态
147 1 while(1)
148 1 {
149 2 TR0 = MODECTL; //MODECTL = 1,手动有效;否则无效
150 2 if(T0Flag1 == 1) //电机手动右转有效
151 2 {
152 3 EA = 0;
153 3 CLUTH = 1; //离合器2吸合
154 3 CLUTHCTL = 0; //打开离合器屏蔽端口
155 3 Delay_nms(10); //定义在I2C.h,等待离合器吸合
156 3 MOTO = 1; //电机2吸合
157 3 MOTOCTL = 0; //打开电机屏蔽端口
158 3 LEDR = 0;
159 3 EA = 1;
160 3 T0Flag1 = 2;
161 3 }
162 2 if(T0Flag1 == 3) //电机手动右转结束
163 2 {
164 3 EA = 0;
165 3 MOTOCTL = 1; //关闭电机屏蔽端口
166 3 LEDR = 1;
167 3 EA = 1;
168 3 T0Flag1 = 0;
169 3 System_SetMoto(); //恢复到自动运行状态
170 3 }
171 2 if(T0Flag2 == 1) //电机手动左转有效
172 2 {
173 3 EA = 0;
174 3 CLUTH = 0; //离合器1吸合
175 3 CLUTHCTL = 0; //打开离合器屏蔽端口
176 3 Delay_nms(10); //定义在I2C.h,等待离合器吸合
177 3 MOTO = 0; //电机1吸合
178 3 MOTOCTL = 0; //打开电机屏蔽端口
179 3 LEDL = 0;
C51 COMPILER V7.04 MAIN 12/26/2007 09:33:09 PAGE 4
180 3 EA = 1;
181 3 T0Flag2 = 2;
182 3 }
183 2 if(T0Flag2 == 3) //电机手动左转结束
184 2 {
185 3 EA = 0;
186 3 MOTOCTL = 1; //关闭电机屏蔽端口
187 3 LEDL = 1;
188 3 EA = 1;
189 3 T0Flag2 = 0;
190 3 System_SetMoto(); //恢复到自动运行状态
191 3 }
192 2 if(POSFlag == 1) //如果到位信息有效
193 2 {
194 3 System_ExchangeMoto(); //电机改变运行状态
195 3 EA = 0;
196 3 NVM_WriteB(NVM_CONTROL,NVM_MOTOSTATE_ADDR,CurConfig.MotoState); //更新EEPROM
197 3 EA = 1;
198 3 System_SendCommand(POS_INDICATOR); //反馈电机到位信息
199 3 POSFlag = 0;
200 3 }
201 2 if(SIGFlag == 1) //如果射击信息有效
202 2 {
203 3 //添加射击传感器接收信号代码
204 3 System_SendCommand(SIG_INDICATOR); //反馈电机到位信息
205 3 SIGFlag = 0;
206 3 }
207 2 if(UARTFlag == 1) //收到串口指令有效
208 2 {
209 3 System_ParseCommand(); //处理串口指令
210 3 UARTFlag = 0;
211 3 }
212 2 }
213 1 }
214
215 //***********************************************************************
216 //系统初始化程序
217 void System_Init(void)
218 {
219 1 uchar index;
220 1
221 1 TMOD = 0x23; //定时器0工作在模式3定时方式,受TR0,TR1控制,定时器1用于串行口波特率发生器
222 1 TCON = 0x05; //外部中断INT0、INT1工作在脉冲触发方式
223 1 TH1 = 0xFD; //串行口波特率为9600bps
224 1 TL1 = 0xFD;
225 1 SCON = 0x50; //串行口工作在方式1,允许接收
226 1 PCON = 0x00; //SMOD = 0;
227 1 TH0 = 0x00;
228 1 TL0 = 0x00;
229 1 IE = 0x9F; //开启所有中断
230 1 IP = 0x15; //INT0、INT1、UART优先级为1,定时器0、1为0
231 1 UARTCTRL = 0; //RS485接口处在接收状态
232 1 MOTOCTL = 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -