导航:首页 > 编程语言 > 51串口编程器

51串口编程器

发布时间:2023-02-12 14:33:12

❶ 51单片机串口通信

//////////////////////////////////////////////////////////////////////////////////////////////////
//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;
}
}
}

❷ 51编程器显示不可用

哪个51编程器?什么型号的?请补充问题。

❸ 45元在网上买了一个EP51编程器,串口通过,接收数据发生错误,检测器件时出现编程器不可用。问题出在哪~

装驱动程序

❹ EASY 51pro使用问题,串口通信成功了,但是点左边擦除,写,读器件都显示“编程器:不可用” 这是什么问题

来回答一个过时的问题吧 哈哈 希望能帮助以后进来的人。
首先你要插上EP51编程器的两根线,编程器那头一个是USB一个是串口,电脑那端都是USB口。
第二步下载 EASY51pro,运行之后点击设置波特率任选一个,端口选择这都不用告诉了吧,好吧 说说,右键我的电脑(这都不知道怎么操作就去吃shi)选择管理 ,设备管理器,端口,不知道 哪个端口是就把你的串口线拔一下,看不清哪个消失了你在插上总能看清楚哪个多出来了吧,那么就在软件的端口里选择一致的端口,如果电脑显示端口数大,软件里没有 ,那么就换U口 直到换出个小的,需要说明的是波特率,你软件是任选一个 但要记住,然后在设备管理器里边的端口上点击 右键选择属性,点端口设置,每秒的速度就是波特率一定要设置的和你软件的一样。在回到软件设置,自动检测器件设置能false。顺便设置下器件型号,然后关掉软件从开,在看下设置是不是你刚才设置的那样,然后你就可以插上器件读型号了,不出?你在拔下公对公的USB供电线在插上,还不出?那么你检查一下跳线帽,八个针的那个,用两个跳线帽把跟印着STC的那一边四个针全部插上,在测,在不出?就是跳线帽各种组合插,总是不出?把你的破逼板子扔马路上压三天回来再测吧

❺ 最近学单片机,买了个EP51编程器每次打开软件都是未初始化串口通讯.

按以下方式处理应该就可以了:
1:准备一根USB转RS232数据线,市场有买,注意你的操作系统该数据线是否支持
2:安装驱动程序,随数据线配备光盘上有驱动程序
3:插入数据线,系统应该能看到有设备插入
4:在系统设备管理器中,查看USB转RS232的端口编号是否为COM1~COM4,如不在其内将其编号变更为COM1~COM4任意一个,否则编程器可能无法识别
5:将电脑串口波特率调成与编程器一样

阅读全文

与51串口编程器相关的资料

热点内容
如何使用国外服务器 浏览:186
燃灯者pdf 浏览:468
编译器用数学吗 浏览:7
图形化apk反编译工具 浏览:48
考勤表加密怎么办 浏览:735
arj压缩与解压批处理怎么写 浏览:658
php和大数据哪个好 浏览:930
未来最值得投资的加密货币 浏览:526
ascii码是编译的时候用吗 浏览:781
压缩机感应包可以通用吗 浏览:412
方舟服务器怎么发布到搜索列表 浏览:270
xml防反编译 浏览:241
数据传输加密系统技术方案 浏览:842
程序员没有准备去面试 浏览:4
51单片机usb鼠标 浏览:881
qq服务器的ip地址查询 浏览:112
java仿qq聊天 浏览:402
解压的ipa重新打包 浏览:144
程序员那么可爱vip版 浏览:241
程序员怎么升职 浏览:245