📄 test.lst.svn-base
字号:
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 + -