📄 main.lst
字号:
C51 COMPILER V7.50 MAIN 11/16/2007 15:12:19 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
2 #include "c8051F020.h"
3 #include "main.h"
4 #include "intrins.h"
5
6
7 unsigned char StaFlag;
8 unsigned char SPI_rx_buff[SIZE];
9 unsigned char SPI_tx_buff[SIZE];
10 //-----------------------------------------------------------------------------
11 // MAIN Routine
12 //-----------------------------------------------------------------------------
13
14 void main (void)
15 {
16 1
17 1 unsigned char i = 0;
18 1
19 1 //-----------------
20 1 // 初始化
21 1 WDTCN = 0xde;
22 1 WDTCN = 0xad; // 关看门狗
23 1 EA = 0;
24 1
25 1 Oscillator_Init();
26 1 Port_IO_Init();
27 1 SPI0_Init();
28 1 Timer0_Init();
29 1 UART1_Init ();
30 1 tx_buffer_Init ();
31 1
32 1 EA = 1;
33 1
34 1 while (1)
35 1 {
36 2 if (SPIF)
37 2 {
38 3 SPIF = 0;
39 3 if (SPI0DAT == 40)
40 3 {
41 4 StaFlag = 1; // 开始通信
42 4 }
43 3
44 3 if (StaFlag)
45 3 {
46 4 SPI_rx_buff[i] = SPI0DAT;
47 4 SBUF1 = SPI0DAT;
48 4 i++;
49 4
50 4 if (i == SIZE)
51 4 {
52 5 StaFlag = 0; // 结束通信
53 5 i = 0;
54 5 }
55 4 }
C51 COMPILER V7.50 MAIN 11/16/2007 15:12:19 PAGE 2
56 3 else
57 3 {
58 4 i = 0;
59 4 }
60 3 }
61 2
62 2 if (!SLVSEL)
63 2 {
64 3 SPI0DAT = SPI_tx_buff[i];
65 3 P7 ^= 0x01;
66 3 }
67 2
68 2 if (WCOL)
69 2 {
70 3 WCOL = 0;
71 3 }
72 2 }
73 1 }
74
75 void tx_buffer_Init (void)
76 {
77 1 unsigned int i;
78 1 SPI_tx_buff[0] = 0x01;
79 1
80 1 for (i=1; i<SIZE; i++)
81 1 {
82 2 SPI_tx_buff[i] = SPI_tx_buff[i-1] + 0x01;
83 2 }
84 1
85 1 }
86
87
88 // This routine initializes the system clock to use an 22.1184MHz crystal as its clock source.
89 void Oscillator_Init (void)
90 {
91 1 int i; // delay counter
92 1 OSCXCN = 0x67; // start external oscillator with 22.1184MHz crystal
93 1 for (i=0; i < 3000; i++); // XTLVLD blanking interval (>1ms)
94 1 while ((OSCXCN & 0x80) == 0); // Wait for crystal osc. to settle
95 1
96 1 OSCICN = 0x88; // select external oscillator as SYSCLK source
97 1 // and enable missing clock detector
98 1 }
99
100
101 // 配置数据交叉开关和通用I/O口
102 void Port_IO_Init(void)
103 {
104 1
105 1 XBR0 = 0x07; // XBR0.2允许UART0 在P0.0 (TX0)P0.1 (RX1)
106 1 // XBR0.1允许SPI在P0.2 (SCK),P0.3 (MISO),P0.4 (MOSI)P0.5 (NSS)
107 1 // XBR0.0允许I2C在P0.6 (SDA),P0.7 (SCL)
108 1 XBR1 = 0x14; // 允许/INT0在P1.2/INT1在P1.3
109 1 XBR2 = 0x44; // 交叉开关使能 允许UART0 在P1.0 (TX0)P1.1 (RX1)
110 1
111 1 P0MDOUT = 0xC9; // 使能 TX0, MISO为推挽输出
112 1 P1MDOUT = 0x01; // 使能 TX1为推挽方式
113 1 P74OUT = 0xC0; // 允许P7为推挽方式
114 1
115 1 // P0 |= 0x34; // 允许SPI的三个管脚为数字输入
116 1 }
117
C51 COMPILER V7.50 MAIN 11/16/2007 15:12:19 PAGE 3
118
119 // SPIO初始化
120 void SPI0_Init (void)
121 {
122 1 SPI0CFG = 0x07; // 空闲时为低电平,在第一个上升沿采样数据;8-bit数据传输
123 1 // SPI0CFG |= 0xC0; // 空闲时为高电平,在第二个上升沿采样数据
124 1 SPI0CN = 0x01; // 主模式; 使能SPI; 清中断标志
125 1 SPI0CKR = SYSCLK/2/SPICLK-1; // SPI时钟 <= 8MHz (limited by EEPROM spec.)
126 1 EIE1 = 0x01; // 开SPI中断
127 1 EIP1 = 0x01; // SPI中断设高优先级
128 1
129 1 }
130 // Timer0初始化
131 void Timer0_Init (void)
132 {
133 1
134 1 CKCON |= 0x78; // 使用系统时钟SYSCLK为时钟
135 1 TMOD |= 0x01; // 16Bit Timer
136 1 TR0 = 0; // STOP Timer0
137 1 TH0 = (0x00-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
138 1 TL0 = (0x00-SYSCLK/1000);
139 1 TR0 = 1; // START Timer0
140 1 ET0 = 1; // 开定时器0中断
141 1
142 1 }
143
144 // UART1初始化
145 // 设置UART1, 用定时器1为波特率发生器
146 // 波特率为9600,用于PC通信
147 void UART1_Init (void)
148 {
149 1 CKCON |= 0x10; // 选用SYSCLK作为分频时钟
150 1 TMOD |= 0x20; // T1自动重载方式
151 1 PCON |= 0x10; // SMOD1 = 1,波特率加倍
152 1
153 1 SCON1 = 0x50; // SCON1: 模式1, 8位UART, 允许RX
154 1 TH1 = -(SYSCLK/BAUDRATE1/16); // 按波特率设置定时器1重装值
155 1 TL1 = -(SYSCLK/BAUDRATE1/16);
156 1
157 1 TR1 = 1; // 起动定时器1
158 1 // EIP2 |= 0x40; // 设置UART1为高优先级
159 1 EIE2 |= 0x40; // 允许UART1中断
160 1 }
161
*** ERROR C249 IN LINE 161 OF MAIN.C: 'DATA': SEGMENT TOO LARGE
C51 COMPILATION COMPLETE. 0 WARNING(S), 1 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -