• 帅帅的帅哥
    了解作者
  • C/C++
    开发工具
  • 581KB
    文件大小
  • rar
    文件格式
  • 0
    收藏次数
  • 1 积分
    下载积分
  • 368
    下载次数
  • 2007-12-13 23:32
    上传日期
51单片机编程器的全部资料,包括PCB,原理图,监控程序原代码,上位机软件,系统采用USB供电,串口数据传输编程,早些时候做成产品在卖呢,现在全部公开。
5123467.rar
  • 5123467
  • 编程器软件
  • ChipList.chip
    296B
  • XT2000Lib.dll
    1.1MB
  • ChipManager.exe
    40KB
  • Easy 51Pro.exe
    108KB
  • EasyPro_Info.ini
    139B
  • Hook.dll
    28KB
  • WinIo.dll
    48KB
  • WinIo.sys
    4.8KB
  • EasyIsp.ini
    1.1KB
  • IspTest.exe
    120KB
  • LastFile.ini
    20B
  • 监控程序
  • 编程文件
  • Easy 51Pro.bin
    2.1KB
  • E51Pro.hex
    6.2KB
  • 源程序
  • E51p.M51
    10.4KB
  • E51PRO.C
    5.9KB
  • E51Pro.ORC
    590B
  • E51p.Uv2
    2.5KB
  • E51p_Uv2.Bak
    2.5KB
  • AT89S51PRO.__i
    130B
  • E51Pro.M51
    51.4KB
  • E51PRO.SRC
    11.7KB
  • E51p_Opt.Bak
    2.3KB
  • AT89C2051PRO.C
    4.2KB
  • AT89C51PRO.SRC
    14.1KB
  • E51Pro.lnp
    134B
  • AT89S51PRO.C
    4KB
  • AT89C2051PRO.__i
    132B
  • AT89C51PRO.C
    3.7KB
  • AT89C51PRO.LST
    28.7KB
  • AT89C51PRO.ls1
    56.1KB
  • E51p.lnp
    46B
  • E51Pro
    47KB
  • E51P.C
    1.1KB
  • AT89C51PRO.__i
    130B
  • E51PRO.LS1
    48.5KB
  • E51Pro.plg
    522B
  • E51p.Opt
    2.3KB
  • E51PRO.__I
    126B
  • E51PRO.LST
    49.7KB
  • E51Pro.hex
    6.2KB
  • AT89C2051PRO.LST
    30KB
  • AT89S51PRO.LST
    30.4KB
  • E51PRO.H
    2.4KB
  • 我的编程器.ddb
    530KB
内容介绍
////////////////////////////////////////////////////////////////////////////////////////////////// //E51Pro.c //Easy 51Pro编程器主程序,负责通讯,管理编程操作 /////////////////////////////////////////////////////////////////////////////////////////////////// #include <E51Pro.h> BYTE ComBuf[18];//串口通讯数据缓存,发送和接收都使用 UINT nAddress;//ROM中地址计数 UINT nTimeOut;//超时计数 ProWork pw;//编程器一般操作 void Delay_us(BYTE nUs)//微秒级延时<255us { TH0=0; TL0=0; TR0=1; while(TL0<nUs)//利用T0做定时计数器,循环采样,直到达到定时值 { } TR0=0; } void Delay_ms(UINT nMs)//豪秒级的延时<65535ms { UINT n=0; TR0=1; while(n<nMs)////利用T0做定时计数器,循环采样,直到达到定时值 { TH0=0; TL0=20; while(TH0<4) { } n++; } TR0=0; } BOOL WaitComm()//等待上位机的命令,18字节 { BYTE n=0; RI=0; while(!RI){}//等待第一个字节 ComBuf[n]=SBUF; RI=0; n++; for(n;n<=17;n++) { nTimeOut=0; while(!RI) { nTimeOut++; if(nTimeOut>10000)//后17个字节都有超时限制 return 0; } ComBuf[n]=SBUF; RI=0; } return 1; } BOOL WaitResp()//等待上位机回应,1字节,有超时限制 { nTimeOut=0; RI=0; while(!RI) { nTimeOut++; if(nTimeOut>50000) { return 0; } } RI=0; ComBuf[0]=SBUF; return 1; } BOOL WaitData()//写器件时等待上位机数据,18字节,有超时限制 { BYTE n; RI=0; for(n=0;n<=17;n++) { nTimeOut=0; while(!RI) { nTimeOut++; if(nTimeOut>10000) { return 0; } } RI=0; ComBuf[n]=SBUF; } return 1; } void SendData()//发送数据或回应操作完成,18字节 { BYTE n=0; for(n;n<=17;n++) { TI=0; SBUF=ComBuf[n]; while(!TI){} TI=0; } } void SendResp()//回应上位机1个字节,在写器件函数中使用 { TI=0; SBUF=ComBuf[0]; while(!TI){} TI=0; } void SetVpp5V()//设置Vpp为5v { P3_4=0; P3_3=0; } void SetVpp0V()//设置Vpp为0v { P3_3=0; P3_4=1; } void SetVpp12V()//设置Vpp为12v { P3_4=0; P3_3=1; } void RstPro()//编程器复位 { pw.fpProOver();//直接编程结束 SendData();//通知上位机,表示编程器就绪,可以直接用此函数因为协议号(ComBuf[0])还没被修改,下同 } void ReadSign()//读特征字 { pw.fpReadSign(); SendData();//通知上位机,送出读出器件特征字 } void Erase()//擦除器件 { pw.fpErase(); SendData();//通知上位机,擦除了器件 } void Write()//写器件 { BYTE n; pw.fpInitPro();//编程前的准备工作 SendData();//回应上位机表示进入写器件状态,可以发来数据 while(1) { if(WaitData())//如果等待数据成功 { if(ComBuf[0]==0x07)//判断是否继续写 { for(n=2;n<=17;n++)//ComBuf[2~17]为待写入数据块 { if(!pw.fpWrite(ComBuf[n]))//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数 { pw.fpProOver();//出错了就结束编程 ComBuf[0]=0xff; SendResp();//回应上位机一个字节,表示写数据出错了 WaitData();//等待上位机的回应后就结束 return; } nAddress++;//下一个单元 } ComBuf[0]=1;//回应上位机一个字节,表示数据块顺利完成,请求继续 SendResp(); } else if(ComBuf[0]==0x00)//写器件结束 break; else//可能是通讯出错了 { pw.fpProOver(); return; } } else//等待数据失败 { pw.fpProOver(); return; } } pw.fpProOver();//编程结束后的工作 Delay_ms(50);//延时等待上位机写线程结束 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); } void Read()//读器件 { BYTE n; pw.fpInitPro();//先设置成编程状态 SendData();//回应上位机表示进入读状态 while(1) { if(WaitResp())//等待上位机回应1个字节 { if(ComBuf[0]==0)//ComBuf[0]==0表示读结束 { break; } else if(ComBuf[0]==0xff)//0xff表示重发 { nAddress=nAddress-0x0010; } for(n=2;n<=17;n++)//ComBuf[2~17]保存读出的数据块 { ComBuf[n]=pw.fpRead();//<<<<<<<<<<<<<<<<<<<调用写该器件一个单元的函数 nAddress++;//下一个单元 } ComBuf[0]=6;//向上位机发送读出的数据块 SendData(); } else break;//等待回应失败 } pw.fpProOver();//操作结束设置为运行状态 ComBuf[0]=0;//通知上位机编程器进入就绪状态 SendData(); } void Lock()//写锁定位 { pw.fpLock(); SendData(); } /////////////////////////////////////////////////////////////////////////////////////////////////// //所支持的FID,请在这里继续添加 /////////////////////////////////////////////////////////////////////////////////////////////////// extern void PreparePro00();//FID=00:AT89C51编程器 extern void PreparePro01();//FID=01:AT89C2051编程器 extern void PreparePro02();//FID=02:AT89S51编程器 void main() { SP=0x60; SetVpp5V();//先初始化Vpp为5v SCON=0x00; TCON=0x00; //PCON=0x00;//波特率*2 IE=0x00; //TMOD: GATE|C/!T|M1|M0|GATE|C/!T|M1|M0 // 0 0 1 0 0 0 0 1 TMOD=0x21;//T0用于延时程序 TH1=0xff; TL1=0xff;//波特率28800*2,注意PCON //SCON: SM0|SM1|SM2|REN|TB8|RB8|TI|RI // 0 1 0 1 0 0 0 0 SCON=0x50; TR1=1; Delay_ms(1000);//延时1秒后编程器自举 ComBuf[0]=0; SendData(); while(1)//串口通讯采用查询方式 { if(!WaitComm())//如果超时,通讯出错 { Delay_ms(500); ComBuf[0]=0;//让编程器复位,使编程器就绪 } switch(ComBuf[1])//根据FID设置(ProWork)pw中的函数指针 { case 0://at89c51编程器 PreparePro00(); break; case 1://at89c2051编程器 PreparePro01(); break; case 2://at89s51编程器 PreparePro02(); break; //case 3:支持新器件时,请继续向下添加 // break; //case 4: // break; default: ComBuf[0]=0xff; ComBuf[1]=0xff;//表示无效的操作 break; } switch(ComBuf[0])//根据操作ID跳到不同的操作函数 { case 0x00: RstPro();//编程器复位 break; case 0x01: ReadSign();//读特征字 break; case 0x02: Erase();//擦除器件 break; case 0x03: Write();//写器件 break; case 0x04: Read();//读器件 break; case 0x05: Lock();//写锁定位 break; default: SendData(); break; } } }
评论
  • qwe88 2017-12-09 17:51:14
    浪费积分
相关推荐