ImageVerifierCode 换一换
格式:DOCX , 页数:22 ,大小:18.33KB ,
资源ID:11913499      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-11913499.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(编程器程序.docx)为本站会员(b****8)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

编程器程序.docx

1、编程器程序编程器程序#include typedef unsigned int UINT;typedef unsigned long ULONG;typedef unsigned char BYTE;typedef bit BOOL;sbit P3_2=P32;sbit P3_5=P35;sbit P3_6=P36;sbit P3_7=P37;sbit P1_5=P15;sbit P1_6=P16;sbit P1_7=P17;sbit A_0=ACC0;/方便位操作sbit A_1=ACC1;sbit A_2=ACC2;sbit A_3=ACC3;sbit A_4=ACC4;sbit A_5=

2、ACC5;sbit A_6=ACC6;sbit A_7=ACC7;sbit B_0=B0;/方便位操作sbit B_1=B1;sbit B_2=B2;sbit B_3=B3;sbit B_4=B4;sbit B_5=B5;sbit B_6=B6;sbit B_7=B7;struct _prowork/概念编程器的一般操作,具体器件的编程器实现下列函数 void (*fpInitPro)();/编程前的预备工作 void (*fpReadSign)();/读特征字 void (*fpErase)();/擦除器件 BOOL (*fpWrite)(BYTE);/写器件 BYTE (*fpRead)(

3、);/读器件 void (*fpLock)();/写锁定位 void (*fpProOver)();/编程结束后的工作;typedef struct _prowork ProWork;BYTE ComBuf18;/串口通信数据缓存,发送和接收都利用UINT nAddress;/ROM中地址计数UINT nTimeOut;/超时计数ProWork pw;/编程器一般操作void Delay_us(BYTE nUs)/微秒级延时255us TH0=0; TL0=0; TR0=1; while(TL0nUs)/利用T0做按时计数器,循环采样,直抵达到按时值 TR0=0;void Delay_ms(U

4、INT nMs)/豪秒级的延时65535ms UINT n=0; TR0=1; while(nnMs)/利用T0做按时计数器,循环采样,直抵达到按时值 TH0=0; TL0=20; while(TH04) n+; TR0=0; BOOL WaitComm()/等待上位机的命令,18字节 BYTE n=0; RI=0; while(!RI)/等待第一个字节 ComBufn=SBUF; RI=0; n+; for(n;n10000)/后17个字节都有超时限制 return 0; ComBufn=SBUF; RI=0; return 1;BOOL WaitResp()/等待上位机回应,1字节,有超时

5、限制 nTimeOut=0; RI=0; while(!RI) nTimeOut+; if(nTimeOut50000) return 0; RI=0; ComBuf0=SBUF; return 1;BOOL WaitData()/写器件时等待上位机数据,18字节,有超时限制 BYTE n; RI=0; for(n=0;n10000) return 0; RI=0; ComBufn=SBUF; return 1;void SendData()/发送数据或回应操作完成,18字节 BYTE n=0; for(n;n=17;n+) TI=0; SBUF=ComBufn; while(!TI) TI=

6、0; void SendResp()/回应上位机1个字节,在写器件函数中利用 TI=0; SBUF=ComBuf0; 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()/编程器复位 ();/直接编程结束 SendData();/通知上位机,表示编程器就绪,能够直接用此函数因为协议号(ComBuf0)还没被修改,下同void ReadSig

7、n()/读特征字 (); SendData();/通知上位机,送出读出器件特征字void Erase()/擦除器件 (); SendData();/通知上位机,擦除器件void Write()/写器件 BYTE n; ();/编程前的预备工作 SendData();/回应上位机表示进入写器件状态,能够发来数据 while(1) if(WaitData()/若是等待数据成功 if(ComBuf0=0x07)/判断是不是继续写 for(n=2;n=17;n+)/ComBuf217为待写入数据块 if(!(ComBufn)/挪用写该器件一个单元的函数 ();/犯错了就结束编程 ComBuf0=0xf

8、f; SendResp();/回应上位机一个字节,表示写数据犯错了 WaitData();/等待上位机的回应后就结束 return; nAddress+;/下一个单元 ComBuf0=1;/回应上位机一个字节,表示数据块顺利完成,请求继续 SendResp(); else if(ComBuf0=0x00)/写器件结束 break; else/可能是通信犯错了 (); return; else/等待数据失败 (); return; ();/编程结束后的工作 Delay_ms(50);/延时等待上位机写线程结束 ComBuf0=0;/通知上位机编程器进入就绪状态 SendData();void R

9、ead()/读器件 BYTE n; ();/先设置成编程状态 SendData();/回应上位机表示进入读状态 while(1) if(WaitResp()/等待上位机回应1个字节 if(ComBuf0=0)/ComBuf0=0表示读结束 break; else if(ComBuf0=0xff)/0xff表示重发 nAddress=nAddress-0x0010; for(n=2;n=17;n+)/ComBuf217保留读出的数据块 ComBufn=();/挪用写该器件一个单元的函数 nAddress+;/下一个单元 ComBuf0=6;/向上位机发送读出的数据块 SendData(); el

10、se break;/等待回应失败 ();/操作结束设置为运行状态 ComBuf0=0;/通知上位机编程器进入就绪状态 SendData();void Lock()/写锁定位 (); 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为5

11、v 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秒后编程器自举 ComBuf0=0; SendData(); while(1)/串口

12、通讯采用查询方式 if(!WaitComm()/若是超时,通信犯错 Delay_ms(500); ComBuf0=0;/让编程器复位,使编程器就绪 switch(ComBuf1)/按照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

13、: ComBuf0=0xff; ComBuf1=0xff;/表示无效的操作 break; switch(ComBuf0)/按照操作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; /F

14、ID=02:AT89S51系列编程器/实现编程的读,写,擦等细节/特殊处:采用ISP编程方式,只需对,RST引脚控制;用MOSI串行发送死令的同时用MISO接收相关数据/SCK输出同步时钟脉冲/#include #define MOSI P1_5#define MISO P1_6#define SCK P1_7 BYTE OutBuf4;/发送死令缓冲BYTE InBuf4;/接收缓冲/*下面这一段是我Copy的*/*void Delay_ms(UINT nMs)/豪秒级的延时65535ms UINT n=0; TR0=1; while(nnMs)/利用T0做按时计数器,循环采样,直抵达到按时

15、值 TH0=0; TL0=20; while(TH04) n+; TR0=0;*/void SendInstrc(BYTE nByte)/用MOSI串行发送死令的同时用MISO接收相关数据 BYTE n; for(n=0;n1000)/超时了 return 0; /- return 1;void Lock02()/写锁定位/- /按照器件的DataSheet,设置相应的编程控制信号 if(ComBuf2=1)/ComBuf2为锁定位 InitPro02(); OutBuf0=0xac; OutBuf1=0xe1; SendInstrc(4); Delay_ms(1); if(ComBuf2=2) InitPro02(); OutBuf0=0xac; OutBuf1=0xe2; SendInstrc(4); Delay_ms(1); if(ComBuf2=3) InitPro02(); OutBuf0=0xac; OutBuf1=0xe3; SendInstrc(4); Delay_ms(1); /- ProOver02();void PreparePro02()/设置pw中的函数指针,让主程序能够挪用上面的函数 =InitPro02; =ReadSign02; =Erase02; =Write02; =Read02; =Lock02; =ProOver02;

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2