⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 updata1.c

📁 C51写的华邦8位单片机ISP程序,请配合本人用VB写的PC端ISP程序W78E516UpdataOfVB使用
💻 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 + -