?? 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 + -