?? test.lst
字號:
C51 COMPILER V6.12 TEST 10/14/2008 15:04:16 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN .\test.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE .\test.c DEBUG OBJECTEXTEND
stmt level source
1 //庫文件
2 #include <stdio.h>
3 #include "W78E516B.H" //本地目錄中,W78E516B頭文件
4 #include "APROM.H" //本地目錄中,自定義頭文件
5 //定時中斷0
6 void Timer0 (void) interrupt 1 using 1
7 {
8 1 TR0=0; //關中斷
9 1 TF0=0;
10 1 }
11 //串口處理程序
12 void Serial(void) interrupt 4 using 3
13 {
14 1 uint i,j,CodeTemp; //CodeTemp為指令臨時變量,i為Index,j為串口數據
15 1 //未接收到數據
16 1 if(RI==0)
17 1 {
18 2 TI=0;
19 2 }
20 1 //接收到數據,做判斷
21 1 else
22 1 {
23 2 JmpLDROM=1;
24 2 i=0; //i從0~8,目前上位機使用9個字符作為升級指令SYNTEC001
25 2 while(1)
26 2 {
27 3 j=SBUF; //接收串口數據
28 3 CodeTemp=UpdateCommandCode[i];
29 3 //不是升級指令
30 3 if(j!=CodeTemp)
31 3 {
32 4 JmpLDROM=0;
33 4 goto ERROR; //不是升級指令出口
34 4 }
35 3 //判斷Index是否為最后一個字符,即判斷完畢
36 3 while(i==UpdateCommandCodeTotalNumber)//i=8
37 3 {
38 4 goto OK; //通信正常,并且接收完畢,并且為升級指令出口
39 4 }
40 3 RecDataCheck(); //檢測串行通信是否正常
41 3 //通信超時
42 3 if(TimerOut==1)
43 3 {
44 4 JmpLDROM=0;
45 4 goto ERROR; //通信錯誤出口
46 4 }
47 3 i++;
48 3 }
49 2 }
50 1 OK: //成功
51 1 ;
52 1 ERROR: //錯誤
53 1 ;
54 1 RI=0;
55 1 TR0=0;
C51 COMPILER V6.12 TEST 10/14/2008 15:04:16 PAGE 2
56 1
57 1 }
58
59 //主程序
60 void main(void)
61 {
62 1 int i,k; //i為Index,8ms的循環使用,k為查詢串口次數index,
63 1 k=0;
64 1 InitialProgram(); //初始化程序
65 1 JmpLDROM=0; //跳轉LDROM狀態位,1跳轉,0不跳轉
66 1 while(1)
67 1 {
68 2 if(JmpLDROM==1) //跳轉 LDROM狀態位為1
69 2 {
70 3 ES=0; //關串口
71 3
72 3 ChangeAPtoLD(); //跳轉LDROM
73 3 }
74 2 for(i=0;i<8000;i++); //8ms循環判斷一次JmpLDROM
75 2 {
76 3 ;
77 3 }
78 2 k++;
79 2 if(k==25) //循環判斷25次后如果還是不能接收正確并跳轉LDROM,則說明不用升級直接執行用戶應用程序,
-根據需要可以修改
80 2 {
81 3 goto UserApplication;
82 3 }
83 2 }
84 1
85 1 //用戶應用程序
86 1 UserApplication:
87 1 P2 = 0xaa; //測試進入用戶程序
88 1 ; //
89 1
90 1 }
91 //初始化程序
92 void InitialProgram(void)
93 {
94 1 IE=0x00;
95 1 ET0=1; // timer0 interrupt enable
96 1 ES=1; // RS-232 interrupt enable
97 1 EA=1; // all interrupt enable
98 1 // Timer2BaudRate();
99 1 SCON=0x50; // mode=mode1 ,ren=enable
100 1 T2CON=0x30; // Timer2=BaudRate CLK
101 1
102 1 RCAP2H = 0xff; //Fosc = 11.0592M
103 1 RCAP2L = 0xdc; //BaudRate = 9600
104 1
105 1 TH2=RCAP2H;
106 1 TL2=RCAP2L;
107 1 TR2=1;
108 1 }
109
110 //串口通信檢測
111 void RecDataCheck(void)
112 {
113 1 uint delay;
114 1 RI=0;
115 1 TimerOut=0;
116 1
C51 COMPILER V6.12 TEST 10/14/2008 15:04:16 PAGE 3
117 1 TMOD=0x11; //工作方式1,16位定時器
118 1 TR0=1;
119 1
120 1 for(delay=50; delay>0; delay--) //50*1ms=50ms
121 1 { //11.0592M
122 2 TH0 = 0xfc; // th0=(65536-(1000*(Fosc/12000000)))/256, delay x 1ms
123 2 TL0 = 0x66; // tl0=65536-(1000*(Fosc/12000000)), delay x 1ms
124 2 for(TF0=0; TF0==0; ) //處理定時器未溢出時,判斷接收位
125 2 {
126 3 while(RI==1) //正常
127 3 {
128 4 goto OK ;
129 4 }
130 3 }
131 2 }
132 1 TimerOut=1; //通信超時
133 1 OK: ; //通信正常
134 1 }
135
136 //APROM 跳轉 LDROM ,即ISP模式
137 void ChangeAPtoLD(void)
138 {
139 1 //單片機重啟,軟復位
140 1 CHPENR=0x87; // write enable
141 1 CHPENR=0x59; // write enable
142 1 CHPCON=0x03; // bank=4k,flash mode
143 1 TL0=0xfe;
144 1 TH0=0xff;
145 1 TR0=1; //打開定時器T0中斷,從Idle模式喚醒MCU
146 1 PCON=0x01; // enter idle mode
147 1 }
148
149
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 243 ----
CONSTANT SIZE = 9 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 4
IDATA SIZE = ---- ----
BIT SIZE = 2 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -