📄 updata1.c
字号:
#include <REGW78E58B.H>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define WaitTI while(TI==0);TI=0 /* 等待串行口发送中断 */
#define WaitRI while(RI==0);RI=0 /* 等待串行口接收中断 */
#define True 1
#define False 0
sbit P1_0=P1^0;
sbit P1_1=P1^1;
sbit P1_2=P1^2;
sbit P1_3=P1^3;
sbit P1_4=P1^4;
sbit P1_5=P1^5;
sbit P1_6=P1^6;
sbit P1_7=P1^7;
sbit P2_0=P2^0;
sbit P2_1=P2^1;
sbit P2_2=P2^2;
sbit P2_3=P2^3;
sbit P2_4=P2^4;
sbit P2_5=P2^5;
sbit P2_6=P2^6;
sbit P2_7=P2^7;
sbit P3_0=P3^0;
sbit P3_1=P3^1;
sbit P3_2=P3^2;
sbit P3_3=P3^3;
sbit P3_4=P3^4;
sbit P3_5=P3^5;
sbit P3_6=P3^6;
sbit P3_7=P3^7;
sbit P4_0=P4^0;
sbit P4_1=P4^1;
sbit P4_2=P4^2;
sbit P4_3=P4^3;
#define EraseCode 0xA0 //擦除命令命令字
#define BlankCode 0xA1 //全空检查命令命令字
#define ProgramCode 0xA2 //编程命令命令字
#define VerifyCode 0xA3 //检验命令命令字
#define EncryptCode 0XA4 //加密命令字
#define RestMcuCode 0xA5 //软件复位
#define Head_Flag1 0x1B
#define Head_Flag2 0x10
//**************错误代码*******
#define BlankER 0x80
//*****************************
bit fini,SerialBit,BagHeadBit;
uint crc16;
uchar idata handle;
uchar THH0,TLL0; //定时时间变量
typedef struct{
uchar OKHead[4];
uchar OKData[140];
}TxOKDataDef;
typedef struct{
uchar ReceiveHead[5];
uchar ReceiveData[140];
}ReceiveDataDef;
typedef struct{
uchar ProgramHead[5];
uchar ProgramAdd[4];
uchar ProgramData[140];
}ProgramDataDef;
union{
uchar ComBuf[150];
TxOKDataDef OK;
ReceiveDataDef RXD;
ProgramDataDef PR;
}idata Un;
void TIMER0_INTRRUPT(void);// interrupt 1 using 1;
void initialization(void);
void RESET_MCU(); //软件复位MCU
void PROGRAM_32K_LOOP(); //写MCU
void ERASE_MCU();
void BANK_CHECK_32K(); //擦除MCU
void protect_data();
void verfiy_data(); //读数据
uint cal_crc(unsigned char *ptr, unsigned char len); //计算数据串的CRC值
/**********************************************************************************/
/* 从232接收一个数据,数据保存到UC0变量中 */
uchar RcvDataBy232(void)
{
uchar Temp;
uint Counter=0; //清零计数指针
do
{
Counter++;
if(Counter>0xFff)
{ // 如果等待记时过长则退出
RI=0; //清除接收中断标志
SerialBit=1; // 设置接收数据超时标志
return(0xFF); //退出接收
}
}while(RI==0); //没有接收到数据继续等待
Temp=SBUF; //保存接收到的数据
RI=0;
return(Temp); //返回接收到的数据
}
/****************************************
--------- 串口中断 ----------
*****************************************/
void ssio(void) interrupt 4 using 3
{
uchar data Slen,uc0,j=0;
ES=0; /* 关串行中断 */
BagHeadBit=0; /* 接收命令包头出错标志位 */
SerialBit=0; /* 接收命令包时长度不够标志位 */
uc0=RcvDataBy232();
if(uc0!=Head_Flag1) /* 命令头 0X1B */
//命令头不为0X1B,设置命令头错标志,等待该包数据发送完毕后退出
{ BagHeadBit=1; do{RcvDataBy232();}while(SerialBit==0); SerialBit=0; handle=0xff; goto reti;}
Un.RXD.ReceiveHead[0]=uc0;
uc0=RcvDataBy232(); //接收第二字节
if(uc0!=Head_Flag2) /*0X10*/
//命令头第二个字节数据不是0X10,柚妹
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -