?? main.lst
字號:
C51 COMPILER V7.50 MAIN 11/09/2007 16:11:08 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <C8051F120.H>
2 #define SYSCLK 49000000
3
4 #define BAUDRATE 115200 // Baud rate of UART in bps
5 #define uchar unsigned char
6 #define uint unsigned int
7 #define SAMPLE_RATE 50000 // Sample frequency in Hz
8
9 sfr16 RCAP3 = 0xCA; // Timer3 reload value
10 sfr16 TMR3 = 0xCC; // Timer3 counter
11 sfr16 RCAP2 = 0xca;
12 sfr16 TMR2 = 0xcc; // Timer2
13
14 sbit CLK_PIN = P1^4;
15 sbit DataOut= P1^5;
16
17 void UART0_Init (void);
18 void SYSCLK_Init (void);
19 void PORT_Init (void);
20 void Timer3_Init (int counts);
21 void RevCardNoBin(void);
22 void LRC(void) ;
23 unsigned long Conect_digit(void);
24 void BCD_BIN(void);
25 void hextobcd(unsigned long hexs,unsigned char j);
26 void SendData(void);
27 void wait_ms(uchar ms);
28 void delay(void);
29
30 uchar Len;
31 uchar RevCardFlag;
32 uchar Start_Flag;
33 uchar CardNoBCD[10];
34 uchar CardNoBin[80];
35 uchar Data_Addr;
36 uchar Original_CardNo[5]={0x62,0xE3,0x08,0x6C,0x0ED};
37 //------------------------------------------------------------------------------------
38 // MAIN Routine
39 //------------------------------------------------------------------------------------
40 void main (void) {
41 1
42 1 unsigned long s=0;
43 1 uchar i;
44 1 // disable watchdog timer
45 1 WDTCN = 0xde;
46 1 WDTCN = 0xad;
47 1
48 1 SFRPAGE = CONFIG_PAGE;
49 1 SYSCLK_Init();
50 1 PORT_Init ();
51 1 UART0_Init();
52 1
53 1
54 1 Timer3_Init (SYSCLK/SAMPLE_RATE); // initialize Timer3 to overflow at
55 1 // sample rate
C51 COMPILER V7.50 MAIN 11/09/2007 16:11:08 PAGE 2
56 1
57 1 EA = 1; // enable global interrupts
58 1 Len=0;
59 1 Start_Flag=0;
60 1 Data_Addr=0;
61 1 RevCardFlag=0;
62 1 CLK_PIN=1;
63 1
64 1
65 1
66 1 s=Conect_digit();
67 1 hextobcd(s,10) ;
68 1 RevCardNoBin();
69 1 RevCardFlag=1;
70 1 while(1)
71 1 {
72 2 i=80;
73 2 while(i--)
74 2 {
75 3 wait_ms(10);
76 3 SendData();
77 3 }
78 2 delay();
79 2 }
80 1 while(1);
81 1
82 1 }
83
84
85 void SYSCLK_Init (void)
86 {
87 1 int i; // delay counter
88 1 char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
89 1 SFRPAGE = CONFIG_PAGE; // set SFR page
90 1 OSCXCN = 0x67; // Start_Flag external oscillator with
91 1 // 22.1184MHz crystal
92 1 for (i=0; i < 100; i++) ; // Wait for osc. to Start_Flag up
93 1 while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle
94 1 CLKSEL = 0x01; // Select the external osc. as
95 1 // the SYSCLK_PIN source
96 1 OSCICN= 0x00; // Disable the internal osc.
97 1 //Turn on the PLL and increase the system clock by a factor of M/N = 9/4
98 1 SFRPAGE = CONFIG_PAGE;
99 1 PLL0CN = 0x04; // Set PLL source as external osc.
100 1
101 1 PLL0CN |= 0x01; // Enable Power to PLL
102 1 PLL0DIV = 0x04; // Set Pre-divide value to N (N = 4)
103 1 PLL0FLT = 0x01; // Set the PLL filter register for
104 1 // a reference clock from 19 - 30 MHz
105 1 // and an output clock from 45 - 80 MHz
106 1 PLL0MUL = 0x09; // Multiply SYSCLK_PIN by M (M = 9)
107 1 for (i=0; i < 100; i++) ; // Wait at least 5us
108 1 PLL0CN |= 0x02; // Enable the PLL
109 1 while(!(PLL0CN & 0x10)); // Wait until PLL frequency is locked
110 1 CLKSEL = 0x02; // Select PLL as SYSCLK_PIN source
111 1 SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
112 1 }
113
114 void PORT_Init (void)
115 {
116 1 char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
117 1 SFRPAGE = CONFIG_PAGE; // set SFR page
C51 COMPILER V7.50 MAIN 11/09/2007 16:11:08 PAGE 3
118 1 //XBR0 = 0x04; // Enable UART0
119 1 //XBR1 = 0x00;
120 1 XBR2 = 0x40; // Enable crossbar and weak pull-up
121 1 //P0MDOUT |= 0x01; // Set TX0 pin to push-pull
122 1 P1MDOUT |= 0xFF; // Set P1.6(LED) to push-pull
123 1 SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
124 1 }
125
126 void UART0_Init (void)
127 {
128 1 char SFRPAGE_SAVE = SFRPAGE;
129 1 SFRPAGE =0x00;
130 1 SCON0 = 0x50;
131 1 SSTA0 = 0x10;
132 1
133 1 SFRPAGE = TIMER01_PAGE;
134 1 TMOD &= ~0xF0;
135 1 TMOD |= 0x20;
136 1 TH1 = -(SYSCLK/BAUDRATE/16);
137 1
138 1 CKCON |= 0x10;
139 1 TL1 = TH1;
140 1 TR1 = 1;
141 1 SFRPAGE = UART0_PAGE;
142 1 TI0 = 1;
143 1 SFRPAGE = SFRPAGE_SAVE;
144 1
145 1 }
146
147
148 /*
149 void Timer3_ISR (void) interrupt 14
150 {
151
152 CLK_PIN=~CLK_PIN;
153 TF3 = 0; // clear TF3
154 }
155
156 */
157 void LRC(void)
158 {
159 1 uchar frist=11;
160 1 uchar end=15;
161 1 uchar str=0;
162 1 uchar i;
163 1 str=frist;
164 1 for(i=0;i<10;i++)
165 1 str=str^CardNoBCD[i];
166 1 str=str^end;
167 1
168 1 CardNoBin[70]=str&0x01;
169 1 CardNoBin[71]=(str&0x02)>>1;
170 1 CardNoBin[72]=(str&0x04)>>2;
171 1 CardNoBin[73]=(str&0x08)>>3;
172 1 CardNoBin[74]=1;
173 1
174 1 }
175
176 unsigned long Conect_digit(void)
177 {
178 1 unsigned long hexs ;
179 1 hexs=Original_CardNo[1]*16777216+Original_CardNo[2]*65536+ Original_CardNo[3]*256+Original_CardNo[4]; //去
C51 COMPILER V7.50 MAIN 11/09/2007 16:11:08 PAGE 4
-掉卡號前面的第一個字節
180 1 return hexs;
181 1 }
182
183 void hextobcd(unsigned long hexs,unsigned char j) {
184 1
185 1 unsigned long va;
186 1 uchar i;
187 1 va = 1000000000;
188 1 for (i=j-1;i;i--) {
189 2 CardNoBCD[i] = 0; //目標數組清零
190 2 while ((hexs>=va)&&(va>9)) {
191 3 hexs -= va; //減除數
192 3 CardNoBCD[i]=CardNoBCD[i]+1; //商位加1
193 3 }
194 2 va /= 10; //除數除10,指向低一位
195 2 }
196 1 CardNoBCD[0]=hexs; //最后個位數
197 1 }
198
199 void BCD_BIN(void)
200 {
201 1 uchar i,j,m,l,count,s;
202 1 j=15;
203 1 for(m=0;m<10;m++)
204 1 {
205 2 s=CardNoBCD[9-m];
206 2 count=0;
207 2 for(l=0;l<4;l++)
208 2 {
209 3 i=s&0x01;
210 3 CardNoBin[j]=i;
211 3 j++;
212 3 if(i)
213 3 count=count+1;
214 3 s=s>>1;
215 3 }
216 2 if(count%2==0)
217 2 CardNoBin[j]=1;
218 2 else
219 2 CardNoBin[j]=0;
220 2 j++;
221 2
222 2
223 2
224 2 }
225 1 }
226
227
228
229 void RevCardNoBin(void)
230 {
231 1 uchar i;
232 1 for (i=0;i<10;i++)
233 1 CardNoBin[i]=0;
234 1 CardNoBin[10]=1;
235 1 CardNoBin[11]=1;
236 1 CardNoBin[12]=0;
237 1 CardNoBin[13]=1;
238 1 CardNoBin[14]=0;
239 1 BCD_BIN();
240 1 for (i=65;i<70;i++)
C51 COMPILER V7.50 MAIN 11/09/2007 16:11:08 PAGE 5
241 1 CardNoBin[i]=1;
242 1 LRC();
243 1 for (i=75;i<80;i++)
244 1 CardNoBin[i]=0;
245 1 }
246
247 void SendData(void)
248 {
249 1 if(Start_Flag==1)
250 1 {
251 2 CLK_PIN=~CLK_PIN;
252 2 if(CLK_PIN==1)
253 2 {
254 3 if(CardNoBin[Data_Addr]==1)
255 3 DataOut=0;
256 3 if(CardNoBin[Data_Addr]==0)
257 3 DataOut=1;
258 3 // DataOut=CardNoBin[Data_Addr];
259 3 Data_Addr++;
260 3 if(Data_Addr==80)
261 3 {
262 4 Start_Flag=0;
263 4 Data_Addr=0;
264 4 RevCardFlag=1;
265 4 }
266 3 }
267 2
268 2
269 2 }
270 1
271 1 if(RevCardFlag==1)
272 1 {
273 2
274 2 if(CLK_PIN==1)
275 2 {
276 3 Start_Flag=1;
277 3 DataOut=1;
278 3 RevCardFlag=0;
279 3 }
280 2
281 2 }
282 1
283 1
284 1 }
285
286
287 void wait_ms(uchar ms)
288 {
289 1 char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
290 1
291 1 SFRPAGE = TMR2_PAGE;
292 1
293 1 TMR2CN = 0x00; // Stop Timer3; Clear TF3;
294 1 TMR2CF = 0x00; // use SYSCLK_PIN/12 as timebase
295 1
296 1 RCAP2 = -(SYSCLK/1000/12); // Timer 2 overflows at 1 kHz
297 1 TMR2 = RCAP2;
298 1
299 1 ET2 = 0; // Disable Timer 2 interrupts
300 1
301 1 TR2 = 1; // Start_Flag Timer 2
302 1
C51 COMPILER V7.50 MAIN 11/09/2007 16:11:08 PAGE 6
303 1 while(ms){
304 2 TF2 = 0;
305 2 while(!TF2); // wait until timer overflows
306 2 ms--; // decrement ms
307 2 }
308 1
309 1 TR2 = 0; // Stop Timer 2
310 1
311 1 SFRPAGE = SFRPAGE_SAVE; // Restore SFRPAGE
312 1 }
313
314
315 void Timer3_Init (int counts)
316 {
317 1 char SFRPAGE_SAVE = SFRPAGE; // Save Current SFR page
318 1
319 1 SFRPAGE = TMR3_PAGE;
320 1
321 1 TMR3CN = 0x00; // Stop Timer3; Clear TF3;
322 1 TMR3CF = 0x08; // use SYSCLK_PIN as timebase
323 1
324 1 RCAP3 = -counts; // Init reload values
325 1 TMR3 = RCAP3; // set to reload immediately
326 1 EIE2 &= ~0x01; // disable Timer3 interrupts
327 1 TR3 = 1; // Start_Flag Timer3
328 1
329 1 SFRPAGE = SFRPAGE_SAVE; // Restore SFR page
330 1 }
331
332 void delay(void)
333 {
334 1 uchar i,j,k;
335 1 for(i=0;i<255;i++)
336 1 for(j=0;j<255;j++)
337 1 for(k=0;k<255;k++);
338 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 774 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 99 11
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -