📄 main.c
字号:
//********************************************
//Sue & 20071117
//********************************************
#include "c8051F020.h"
#include "main.h"
#include "intrins.h"
unsigned char StaFlag;
unsigned char SPI_rx_buff[SIZE];
unsigned char SPI_tx_buff[SIZE];
//-----------------------------------------------------------------------------
// MAIN Routine
//-----------------------------------------------------------------------------
void main (void)
{
unsigned char i = 0;
//-----------------
// 初始化
WDTCN = 0xde;
WDTCN = 0xad; // 关看门狗
EA = 0;
Oscillator_Init();
Port_IO_Init();
SPI0_Init();
Timer0_Init();
UART1_Init ();
tx_buffer_Init ();
EA = 1;
while (1)
{
if (SPIF)
{
SPIF = 0;
if (SPI0DAT == 40)
{
StaFlag = 1; // 开始通信
}
if (StaFlag)
{
SPI_rx_buff[i] = SPI0DAT;
SBUF1 = SPI0DAT;
i++;
if (i == SIZE)
{
StaFlag = 0; // 结束通信
i = 0;
}
}
else
{
i = 0;
}
}
if (!SLVSEL)
{
SPI0DAT = SPI_tx_buff[i];
P7 ^= 0x01;
}
if (WCOL)
{
WCOL = 0;
}
}
}
void tx_buffer_Init (void)
{
unsigned int i;
SPI_tx_buff[0] = 0x01;
for (i=1; i<SIZE; i++)
{
SPI_tx_buff[i] = SPI_tx_buff[i-1] + 0x01;
}
}
// This routine initializes the system clock to use an 22.1184MHz crystal as its clock source.
void Oscillator_Init (void)
{
int i; // delay counter
OSCXCN = 0x67; // start external oscillator with 22.1184MHz crystal
for (i=0; i < 3000; i++); // XTLVLD blanking interval (>1ms)
while ((OSCXCN & 0x80) == 0); // Wait for crystal osc. to settle
OSCICN = 0x88; // select external oscillator as SYSCLK source
// and enable missing clock detector
}
// 配置数据交叉开关和通用I/O口
void Port_IO_Init(void)
{
XBR0 = 0x07; // XBR0.2允许UART0 在P0.0 (TX0)P0.1 (RX1)
// XBR0.1允许SPI在P0.2 (SCK),P0.3 (MISO),P0.4 (MOSI)P0.5 (NSS)
// XBR0.0允许I2C在P0.6 (SDA),P0.7 (SCL)
XBR1 = 0x14; // 允许/INT0在P1.2/INT1在P1.3
XBR2 = 0x44; // 交叉开关使能 允许UART0 在P1.0 (TX0)P1.1 (RX1)
P0MDOUT = 0xC9; // 使能 TX0, MISO为推挽输出
P1MDOUT = 0x01; // 使能 TX1为推挽方式
P74OUT = 0xC0; // 允许P7为推挽方式
// P0 |= 0x34; // 允许SPI的三个管脚为数字输入
}
// SPIO初始化
void SPI0_Init (void)
{
SPI0CFG = 0x07; // 空闲时为低电平,在第一个上升沿采样数据;8-bit数据传输
// SPI0CFG |= 0xC0; // 空闲时为高电平,在第二个上升沿采样数据
SPI0CN = 0x01; // 主模式; 使能SPI; 清中断标志
SPI0CKR = SYSCLK/2/SPICLK-1; // SPI时钟 <= 8MHz (limited by EEPROM spec.)
EIE1 = 0x01; // 开SPI中断
EIP1 = 0x01; // SPI中断设高优先级
}
// Timer0初始化
void Timer0_Init (void)
{
CKCON |= 0x78; // 使用系统时钟SYSCLK为时钟
TMOD |= 0x01; // 16Bit Timer
TR0 = 0; // STOP Timer0
TH0 = (0x00-SYSCLK/1000) >> 8; // set Timer0 to overflow in 1ms
TL0 = (0x00-SYSCLK/1000);
TR0 = 1; // START Timer0
ET0 = 1; // 开定时器0中断
}
// UART1初始化
// 设置UART1, 用定时器1为波特率发生器
// 波特率为9600,用于PC通信
void UART1_Init (void)
{
CKCON |= 0x10; // 选用SYSCLK作为分频时钟
TMOD |= 0x20; // T1自动重载方式
PCON |= 0x10; // SMOD1 = 1,波特率加倍
SCON1 = 0x50; // SCON1: 模式1, 8位UART, 允许RX
TH1 = -(SYSCLK/BAUDRATE1/16); // 按波特率设置定时器1重装值
TL1 = -(SYSCLK/BAUDRATE1/16);
TR1 = 1; // 起动定时器1
// EIP2 |= 0x40; // 设置UART1为高优先级
EIE2 |= 0x40; // 允许UART1中断
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -