📄 main.c
字号:
/////////////////////////////////////
// Generated Initialization File //
/////////////////////////////////////
#include "includes.h"
// Peripheral specific initialization functions,
// Called from the Init_Device() function
void Reset_Sources_Init()
{
WDTCN = 0xDE;
WDTCN = 0xAD;
}
void Timer_Init()
{
CKCON = 0x10;
TCON = 0x40;
TMOD = 0x20;
TH1 = 0xFA;
}
void UART_Init()
{
SCON0 = 0x50;
}
void Port_IO_Init()
{
// P0.0 - TX0 (UART0), Open-Drain, Digital
// P0.1 - RX0 (UART0), Open-Drain, Digital
// P0.2 - Unassigned, Open-Drain, Digital
// P0.3 - Unassigned, Open-Drain, Digital
// P0.4 - Unassigned, Open-Drain, Digital
// P0.5 - Unassigned, Open-Drain, Digital
// P0.6 - Unassigned, Open-Drain, Digital
// P0.7 - Unassigned, Open-Drain, Digital
// P1.0 - Unassigned, Open-Drain, Digital
// P1.1 - Unassigned, Open-Drain, Digital
// P1.2 - Unassigned, Open-Drain, Digital
// P1.3 - Unassigned, Open-Drain, Digital
// P1.4 - Unassigned, Open-Drain, Digital
// P1.5 - Unassigned, Open-Drain, Digital
// P1.6 - Unassigned, Open-Drain, Digital
// P1.7 - Unassigned, Open-Drain, Digital
// P2.0 - Unassigned, Open-Drain, Digital
// P2.1 - Unassigned, Open-Drain, Digital
// P2.2 - Unassigned, Open-Drain, Digital
// P2.3 - Unassigned, Open-Drain, Digital
// P2.4 - Unassigned, Open-Drain, Digital
// P2.5 - Unassigned, Open-Drain, Digital
// P2.6 - Unassigned, Open-Drain, Digital
// P2.7 - Unassigned, Open-Drain, Digital
// P3.0 - Unassigned, Open-Drain, Digital
// P3.1 - Unassigned, Open-Drain, Digital
// P3.2 - Unassigned, Open-Drain, Digital
// P3.3 - Unassigned, Open-Drain, Digital
// P3.4 - Unassigned, Open-Drain, Digital
// P3.5 - Unassigned, Open-Drain, Digital
// P3.6 - Unassigned, Open-Drain, Digital
// P3.7 - Unassigned, Open-Drain, Digital
P1MDOUT = 0xff;
XBR0 = 0x04;
XBR2 = 0x40;
}
void Oscillator_Init()
{
int i = 0;
OSCXCN = 0x67;
for (i = 0; i < 3000; i++); // Wait 1ms for initialization
while ((OSCXCN & 0x80) == 0);
OSCICN = 0x0C;
}
// Initialization function for device,
// Call Init_Device() from your main program
void Init_Device(void)
{
Reset_Sources_Init();
Timer_Init();
UART_Init();
Port_IO_Init();
Oscillator_Init();
}
sbit P16 = P1^6;
UINT8 FlashPageMax = 119;
#define START 0x43 //向主机发送,请求数据发送
#define ACK 0x06 //每接收到一个程序,如果验证正确,发送ack
#define SOH 0x01 //主机发送帧头
#define EOT 0x04 // 发送结束.
#define NAK 0x15
//定义状态.
#define SendStart 0
#define RecData 1
#define SendAck 2
#define RunUsr 3
#define RecSOH 4
#define SaveData 5
#define SendNak 6
typedef union{
UINT16 intnum;
UINT8 charnum[2];
}UNION16;
void main()
{
UINT8 flashErasePage=0;
UINT8 stage;
UINT8 tmp[2] = {0};
UINT8 flashData[512] ={0};
UINT8 tmpBuf[132] = {0};
UINT8 tmpBufIndex;
UINT16 flashDataIndex;
UINT8 index = 0;
UNION16 crc;
Init_Device();
stage = SendStart;
while(1) {
switch(stage){
case SendStart://发送起始传输命令
SBUF0 = START;
while(TI0==0);
TI0=0;
//stage = SendStart;
stage = RecSOH;
break;
case RecSOH:
while(RI0==0);
RI0=0;
tmp[0] = SBUF0;
if(SOH==tmp[0]){//接收到SOH起始帧头
stage = RecData;
}
else if(EOT==tmp[0]){//接收到EOT结束帧头.
stage = RunUsr;
}
break;
case RecData:
for(tmpBufIndex=0;tmpBufIndex<132;tmpBufIndex++){
while(RI0==0);
RI0=0;
tmpBuf[tmpBufIndex] = SBUF0;
}
if(tmpBuf[0]+tmpBuf[1]==0xff){//序列号正确
crc.intnum = Crc16Cal(&tmpBuf[2],128);
if((crc.charnum[0]==tmpBuf[130])&&(crc.charnum[1]==tmpBuf[131])){
stage = SaveData;
}
}else{
stage = SendNak;
}
case SaveData:
/* for(flashDataIndex;flashDataIndex+128;flashDataIndex++){
flashData[flashDataIndex] = tmpBuf[tmpBufIndex++];
}
if(flashDataIndex ==512){
if(flashErasePage>FlashPageMax){
while(1){
SBUF0 =0x43;//C
while(TI0 == 0);
TI0 = 0;
}
}
FlashErase(flashErasePage);
FlashWrite(flashData,flashErasePage);
flashDataIndex = 0;
flashErasePage++;
} */
stage = SendAck;
break;
case SendAck:
SBUF0 = ACK;
stage = RecSOH;
break;
case SendNak:
SBUF0 = NAK;
stage = RecSOH;
break;
case RunUsr:
SBUF0 = ACK;
while(TI0==0);
TI0=0;
while(1);
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -