实例介绍
有详细的例子
TL= unsigned char(256-(XTAL/(32L*12L* baudrate);〃定时器0赋初值 SCON=0×50 PCON = OXO0 TR1=1: E=0x00;∥禁止任何中断 while( Whe(R|==0) R|=0: C=SBUF;∥从缓冲区中把接收的字符放入c中 SBUF=c;∥要发送的字符放入缓冲区 while(ti==0) M/E51Proc asy51Pro编程器主程序,负责通讯,管理编程操作 #include <E51 Pro. h> BYTE Com Buf[18]/串口通讯数据缓存,发送和接收都使用 U| NT aDdress;/ROM中地址计数 U| NT tImeout;超时计数 ProWork pw;/编程器一般撅作 void delay_ us( BYTE nUs)微秒级延时<255us TH0=0; TL0=0 TR0=1 While(TL0<ηUs)利用T0做定时计数器,循环采样,直到达到定时值 TR0=0; void Delay ms( UINT nMs)豪秒级的延时<65535ms UINT n=0 TR0=1; while((n<nMs)∥/利用T0做定吋计数器,循环采样,直到达到定时值 TH0=0 TL0=20 while(THO<4) TR0=0; booL Waitcomm(∥等待上位机的命令,18字节 BYTEn=0: R|=0 while(!R)∥等待第一个字节 ComBuf[]=SBUF; R|=0 n++; for(n;n≤=17;n++) tImeoUt=0 while Rl) nTime out++ if(n TimeOut>10000后17个字节都有超时限制 return 0 Com BufIn]=SBUF R|=0 return 1 BOOL WaitResp(等待上位机回应,1字节,有超时限制 tImeout=0 R|=0 while(rl) Time○ut++ if(n out>50000) return o R|=0 ComBuf[O=SBUF return 1 BOoL WaitData()∥写器件时等待上位机数据,18字节,有超时限制 BYTE Rl=0; for(n=0;n<=17;n++) nTime○ut=0 while(!RI) nTime out++. if(n Time Out> 10000) return o R|=0 Com Buf[n]=SBUF return 1 void send data(川∥发送数据或回应操作完成,18字节 BYTE n=0 for(n;n≤=17n++ T|=0 SBUF=ComBuf[n while(!TIt T=0; void Send Resp(∥问应上位机1个字节,在写器件函数中使用 T=0; SBUF=ComBuf[O while(!Tit T=0 void Setvpp5V(∥设置Vpp为5V P34=0 P33=0 void SetVppl0VO∥设置Ⅴpp为0v 3=0; 4=1; void SetVpp12V设置vpp为12V P33=1; void EstEro()∥编程器复位 pw. fpProOver();直接编程结束 Send data();通知上位机,表示编程器就绪,可以直接用此函数因为协议号( Com BufI0〕〕还没被修改,下同 void Readsign(∥读特征字 pw. fpReadsign() Send data();知上位机,送出读出器件特征字 void erase(川/擦除器件 pw prAseo Send Data();/通知上位机,擦除了器件 void write(川∥/写器件 BYTE pw. fplnitPro(O,H/编程前的准备工作 Send data();/应上位机表示进入写器件状态, 可以发米数据 while(1) f(WaitData(y如果等待数据成功 if( ComBuf01=0x07川判断是否继续写 for(n=2n<=17;n++∥ ComBuf[2-17为待写入数据块 f! pw. fpWrite( ComBufn])≤<调用写该器件一个单元的函数 pw fp Provera();/出错了就结束编程 Com Buf[O=oXff Send Respo;/应上位机个字节, 表示写数据出错了 WaitData();/等待上位机的回应后就结束 return aDdress++;//一个单元 Com Bu「0j=1;/回应上位机一个字节,表示数据块顺利亢成,请求继续 SendRespo else if(( ComBuf]==0×00)∥写器件结束 break else/何能是通讯出错了 pw. tpProOver( return; else∥等待数据失败 pw. fpProOver( return: pw. fpProover(;/编程结束后的工作 Delay_ms(50)∥延时等待上位机写线程结束 ComBuf]=0;)通知上位机编程器进入就绪状态 Send DataO void read(∥读器件 BYTE n pw.fplnitPro(;∥先设置成编程状态 Send Data)应上位机表示进入读状态 while(1) f( aitResp()〃等待上位机回应1个字节 i( ComBufl0]==0)/ Com Buf[O]==0表示读结束 break. else if(( ComBuf[]=0xf/)0xf表小重发 aDdress=n Address-0x0010 for(n=2;n<=17;n++∥ ComBufl2-17保仔读出的数据块 ComBuf[n] pw. fpReadl);/<<≤<调用写该器件一个单元的函数 aDdress++;/|一个单元 ComBuf0]=6;/l上位机发送读出的数据块 Send Data(: else break;/待回应失败 pw. fpProover(;∥操作结束设置为运行状态 ComBuf[O]=0;/通知上位机编程器进入就绪状态 Send Data0; void lock(∥写锁定位 pw. fpLocko Send Datao ∥/支持的F|D,请在这里继续添加 extern void PrepareProt00):FD=00:AT89C51编程器 extern void Prepare Pro01();/F|D=01:AT89c2051编程器 extern void PreparePro02();∥FD=02∶AT89S51编程器 void main() SP=0x60 SetVpp5V();∥先初始化pp为5V SCON=OXOO: TCONEOXOO ∥PCON=0x00;/波特率*2 E=0x00 //TMOD: GATEC/!TM1MOGATEIC/T M1MO 0100001 TMOD=0x21;/T0用于延时程序 TH1=Oxff TL1=0x,/)特率28800*2,注意PCON //SCON: SMO SM1 B8 RB8TIRI 01010000 SC○N=0X50 TR1=1; Delay_ms(1000)H延时1秒后编程器自举 ComBuf[0=0; Send datal Whil)/串口通讯采用查询方式 f!W/ Vaitcommo)∥/如果超时通讯出错 Delay ms(500); ComBuf[O]=;/}编程器复位,使编程器就绪 switch( ComBuf1y/根据FD设置( ProWork)W中的函数指针 case o ∥lt89c51编程器 PreparePro00(; break ase 1 ∥lt89c2051编程器 PreparePro010; break case 2. ∥lt89s51编程器 Prepare); break; ∥rase3:支持新器件吋,请继续向下添加 ∥ break; ∥/case4: ∥ break default: ComBuf[O]=Oxff ComBuf[1]=0xf;∥.示无效的操作 break switch( ComBuf[O)∥根据操作D跳到不同的操作函数 case Oxo RstPro(; break;//编程器复位 case oxo Roadsign(); break;∥读特征字 case 0x02 Erase(); break;/擦瘵除器件 case 0x03 Wrte(; break;∥/写器件 case 0x04 Read(: break!/器件 case 0x05 Lock(); break;/写锁定位 default: Send Data(; break; void Init serial(void) TMOD=0x20;∥T1方式2 PCON=0×00;∥/PCON=00H,SMOD=0PD=PCON2=1进入护电模式 TH1=TL1= BAUD 9600: //BAUD: 9600 SC○N=0×50;∥串行通信方式1REN=1允许接收 ET1=0:/不允许中断 TR1=1;∥开启定时器1 E=0;∥关闭所有中断允许位 memset(& serial buf,0×00, SERIAL BUF LEN);∥/初始化 SerialBuf[ SERIAL BUF LEN /体★****★大*k*大木***木*大*木大木*为*太*★本大*大*本太木太大*大 名称: SendByte( 功能:串口发送一个字节 输入: cdAta *返回:无 说明:无 大★六大大大古大和大大★古古大★言★古卞大大大★水古大大★大古大六水大大大大★言k大大★ void Send Byte(unsigned char cdAta SBUF ucData while(TI) CLRWDT T=0 6R232串口通信程序 include sat89X52.H> unsigned char code dispcode1t" welcome!]: unsignedcharcodedispcode2i=fwww.zhaoiian.comy unsigned char i,j, k, I, DData sbit rs= P3 5 sbit rw p3 6 bit e= p3 7 unsigned char m=0 void delay {for(1=0;1<=100:1++){}} void enable(//write order RS=O RW=0 E=0; delay(: E=1; void enable(//write data RS=1; RW=0; F=0; dclay (; E=1; void initializtion //cd initializtion for(i=0;i<=100计+) PO=OXO1; cnablc(; P0=0x38; enable( PO=OxOf; enabled PO=0X06; enable 【实例截图】
【核心代码】
标签:
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论