📄 main.lst
字号:
C51 COMPILER V8.02 MAIN 09/17/2008 10:45:02 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\c51.exe main.c DB OE
line level source
1
2 //c8051 datasheet推荐的系统时钟选择流程
3 //Step 1. Force the XTAL1 and XTAL2 pins low by writing 0s to the port latch.
4 //Step 2. Configure XTAL1 and XTAL2 as analog inputs.
5 //Step 3. Enable the external oscillator.
6 //Step 4. Wait at least 1 ms.
7 //Step 5. Poll for XTLVLD => '1'.
8 //Step 6. Switch the system clock to the external oscillator.
9
10
11 //------------------------------------------------------------------------------------
12 //
13 // FILE NAME : main.c
14 // TARGET DEVICE : C8051F314
15 // CREATED ON : 07/14/06
16 // CREATED BY : Jzp
17 //
18 // Revision 1.0
19 //
20 //------------------------------------------------------------------------------------
21
22 #include <C8051F310.H>
23 #include <stdio.h>
24 #include "..\\inc\\define.h"
25 #include "..\\inc\\key_scan.h"
26 #include "..\\inc\\ow_comm.h"
27
28 //#define SMB_MASTER 1
29 //#define SMB_SLAVE 0
30 // sfr定义
31 //sfr16 TMR3RL = 0x92; // Timer2 reload registers
32 //sfr16 TMR3 = 0x94; // Timer3 counter registers
33 //sfr16 TMR0 = 0X8A; // Timer0
34 //sbit KbBlCtl = P3^2; //键盘有动作,键盘灯点亮,否则经过延时后,熄灭
35
36 UCHAR Tmr0High;
37 UCHAR Tmr0Low;
38
39 UCHAR *ptr_snd;
40 UCHAR gSndLen;
41 UCHAR gSndFlag;
42 UCHAR xdata gSndBuf[16];
43 //UCHAR xdata gOwdevNum;
44
45 extern UCHAR KbIsValid;
46 extern UCHAR ow_reset(void);
47 extern void delay_us(UINT us);
48 //extern void ow_test(void);
49
50
51 //extern KbBlCtl;
52
53 // Peripheral specific initialization functions,
54 // Called from the Init_Device() function
55 void Oscillator_Init()
C51 COMPILER V8.02 MAIN 09/17/2008 10:45:02 PAGE 2
56 {
57 1 OSCICN = 0x83; // 复位后,默认为内部振荡器。
58 1 // bit7:=1 使能内部振荡器 bit1:0 = 0x11 系统时钟为24.5M
59 1 CKCON = 0X00; // 所有的定时器都取(SCACS1:0 = 00)1/12为时钟源
60 1 }
61
62 void Timer0_Init()
63 {
64 1 // TMR2CN = 0x00; // Timer0工作在16位重装模式
65 1 // TMR2 = -(SYSCLK/12/100); // Timer0溢出率为10ms
66 1 // TMR2RL = -(SYSCLK/12/100);
67 1 //// TL0 = -(SYSCLK/12/100);
68 1 // TR2 = 1; // Timer0运行
69 1 TMOD |= 0X01;
70 1 TL0 = 0X40;
71 1 TH0 = 0XB0;
72 1 Tmr0High = 0xb0;
73 1 Tmr0Low = 0x40;
74 1 TR0 = 1;
75 1 }
76
77
78 /************************************************************
79 -----IIC设备初始化程序-----
80 入口参数:flag = 1则初始化为从机 flag = 0则初始化为主机,缺省方式为从机
81 只有当需要回复数据时,才将它设为主机
82
83 //void iic_init(void)
84 *************************************************************/
85 void iic_init(void)
86 {
87 1 SMB0CF = 0x1C; //|ENSMB|INH|BUSY|EXTHOLD|SMBTOE|SMBFTE|SMBCS1|SMBCS0
88 1 //00011100
89 1 // timer 0 溢出作为时钟源 CS = 0:0
90 1 // 因为工作与从方式,总线速度有主机决定,所以该设置对从机无意义
91 1 // 允许总线工作于从模式 INH = 0
92 1 // 允许建立/保持时间扩展 EXTHOLD = 1
93 1 // 禁止总线空闲超时检测 SMBFTE = 0
94 1 // 允许总线低电平超时检测 SMBTOE = 1
95 1 SMB0CF |= 0x80; // 总线允许;
96 1 }
97
98 /************************************************************
99 -----TIMER1初始化程序-----
100 Timer1 溢出作为UART0波特率发生器
101
102 //void Timer1_Init(void)
103 *************************************************************/
104 void UART0_Init (void)
105 {
106 1 // CKCON &= ~0x13; // bit1:0 = 00 SYSCLK / 12作为timer 1的时钟源
107 1 TMOD |= 0x20; // Timer 1工作在8位重装模式
108 1 TH1 = -(SYSCLK/BAUD_RATE/12/2); // Timer1溢出率为波特率的2倍
109 1 TL1 = -(SYSCLK/BAUD_RATE/12/2);
110 1 TR1 = 1; // Timer1 enabled
111 1 TI0 = 0;
112 1 RI0 = 0;
113 1 SCON0 = 0x10; // bit7 = 0:8bit 方式,bit4 = 1:允许接收
114 1 }
115
116
117 /************************************************************
C51 COMPILER V8.02 MAIN 09/17/2008 10:45:02 PAGE 3
118 -----TIMER3初始化程序-----
119 Timer3配置如下:
120 工作在16bit自动重装模式
121 sysclk/12作为它的时钟源
122 溢出率设置为25ms,即检测到SCL为低电平超过25ms则产生中断
123 //void Timer3_Init(void)
124 *************************************************************/
125 void Timer3_Init (void)
126 {
127 1 TMR3CN = 0x00; // 工作在16bit自动重装模式
128 1 TMR3 = -(SYSCLK/12/40); // 溢出率设置为25ms,即检测到SCL为低电平超过25ms则产生中断
129 1 TMR3RL = -(SYSCLK/12/40); //
130 1 CKCON &= ~0x40; // 复位后缺省为sysclk/12作为它的时钟源
131 1 TMR3CN |= 0x04; // Timer3 left disabled. This line should be uncommented if using SCL low time
-out detection
132 1 }
133
134
135 void Port_IO_Init()
136 {
137 1 // P0.0 - SDA (SMBus), Open-Drain, Digital
138 1 // P0.1 - SCL (SMBus), Open-Drain, Digital
139 1 // P0.4 - TX0 (UART0), Open-Drain, Digital
140 1 // P0.5 - RX0 (UART0), Open-Drain, Digital
141 1
142 1 P0MDOUT = 0xC0;
143 1 P1MDOUT = 0xF0;
144 1 P2MDOUT = 0xFF;
145 1 P3MDOUT = 0x1D;
146 1 P0SKIP = 0xC0;
147 1 XBR0 = 0x05;
148 1 XBR1 = 0x40;
149 1 }
150
151 void Interrupts_Init()
152 {
153 1 EIE1 = 0x81; // 使能定时器3中断,使能SMBUS中断
154 1 IE = 0x12; // 使能串行中断,注意此时全局中断仍未打开
155 1 EA = 1; // 此处使能所有中断
156 1 EA = 1;
157 1 }
158
159 // Initialization function for device,
160 // Call Init_Device() from your main program
161 void Init_Device(void)
162 {
163 1 Oscillator_Init();
164 1 Port_IO_Init();
165 1 Timer0_Init();
166 1 UART0_Init();
167 1 Timer3_Init();
168 1 iic_init();
169 1 Interrupts_Init();
170 1 }
171
172
173 void main(void)
174 {
175 1 UCHAR i,j;
176 1 static UCHAR sndbat_flag = 1; //debug
177 1 PCA0MD &= ~0x40; // WDTE = 0 (Disable watchdog timer)
178 1 // debug one-wire protocol
C51 COMPILER V8.02 MAIN 09/17/2008 10:45:02 PAGE 4
179 1 // gSndFlag = 1;
180 1 // Init_Device();
181 1 // KbBlCtl = 0;
182 1 //// while(1)
183 1 //// {
184 1 // ow_test();
185 1 // delay_us(1000);
186 1 //// }
187 1 // // 串口发送rom addr
188 1 // for(i = 0; i < 8; i++)
189 1 // {
190 1 // gSndBuf[i] = g_testaddr.romaddr[i];
191 1 // }
192 1 // gSndLen = 8;
193 1 // gSndFlag = 0;
194 1 // ptr_snd = &gSndBuf[0];
195 1 // TI0 = 1;
196 1 // while(gSndFlag == 1);
197 1 // while(1);
198 1 // end debug one-wire protocol
199 1 for(j = 0; j <8; j++)
200 1 {
201 2 g_romaddr[0].romaddr[j] = 0; //将所有器件地址清零
202 2 g_romaddr[1].romaddr[j] = 0;
203 2 }
204 1 gOwdevNum = 0; //初始化无OW器件
205 1 HasDs2762 = 0; //
206 1 HasDs2415 = 0;
207 1
208 1 Init_Device(); //初始化C8051
209 1 init_keyscan();
210 1 KbBlCtl = 0;
211 1 gOwdevNum = find_ow_dev();
212 1 if(gOwdevNum != 0)
213 1 KbBlCtl = 0;
214 1 else
215 1 KbBlCtl = 1;
216 1 for(i = 0; i < 8; i++)
217 1 {
218 2 gSndBuf[i] = g_romaddr[0].romaddr[i];
219 2 }
220 1 for(i = 8; i < 16; i++)
221 1 {
222 2 gSndBuf[i] = g_romaddr[1].romaddr[i-8];
223 2 }
224 1 gSndLen = 16;
225 1 gSndFlag = 0;
226 1 ptr_snd = &gSndBuf[0];
227 1 TI0 = 1;
228 1 while(gSndFlag == 1);
229 1 // while(1);
230 1 while(1)
231 1 {
232 2 task_owcomm();
233 2 task_keyscan();
234 2 if(KbIsValid == 1)
235 2 {
236 3 for(i = 0; i < 2; i++)
237 3 {
238 4 gSndBuf[i] = KeyBuffer[i];
239 4 }
240 3 gSndLen = 2;
C51 COMPILER V8.02 MAIN 09/17/2008 10:45:02 PAGE 5
241 3 gSndFlag = 0;
242 3 ptr_snd = &gSndBuf[0];
243 3 TI0 = 1; //强制进入发送中断
244 3 while(gSndFlag == 1); //等待发送完成
245 3 KbIsValid = 0;
246 3 }
247 2 if(sndbat_flag == 1)
248 2 {
249 3 for(i = 0; i < 4; i++)
250 3 {
251 4 gSndBuf[i] = RtcClk[i];
252 4 }
253 3 for(i = 4; i < 6; i++)
254 3 {
255 4 gSndBuf[i] = BatVol[i-4];
256 4 }
257 3 for(i = 6; i < 8; i++)
258 3 {
259 4 gSndBuf[i] = BatCur[i-6];
260 4 }
261 3 gSndLen = 8;
262 3 gSndFlag = 0;
263 3 ptr_snd = &gSndBuf[0];
264 3 TI0 = 1; //强制进入发送中断
265 3 while(gSndFlag == 1); //等待发送完成
266 3 sndbat_flag = 0;
267 3 }
268 2
269 2 }
270 1 }
271
272
273 void UART0_ISR (void) interrupt 4
274 {
275 1 ES0 = 0;
276 1 // EA = 0;
277 1
278 1 // ptr_snd = &gSndBuf[0];
279 1 if(TI0)
280 1 {
281 2 TI0 = 0;
282 2 if(gSndLen > 0)
283 2 {
284 3 SBUF0 = *ptr_snd++;
285 3 gSndLen--;
286 3 }
287 2 else
288 2 gSndFlag = 1;
289 2 }
290 1 else if(RI0)
291 1 {
292 2 RI0 = 0;
293 2 }
294 1 else
295 1 {
296 2 TI0 = 0;
297 2 RI0 = 0;
298 2 }
299 1 ES0 = 1;
300 1 // EA = 1;
301 1 }
C51 COMPILER V8.02 MAIN 09/17/2008 10:45:02 PAGE 6
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 588 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 16 ----
PDATA SIZE = ---- ----
DATA SIZE = 8 1
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 + -