導航:首頁 > 編程語言 > 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串口編程器相關的資料

熱點內容
程序員怎麼升職 瀏覽:241
圖形化命令按鈕vb 瀏覽:985
vcu盤加密怎麼設置 瀏覽:412
如何加密備份微信聊天記錄 瀏覽:527
安卓手機如何模擬鍵盤 瀏覽:930
查看dns地址命令 瀏覽:767
android錄屏工具 瀏覽:840
成都互動直播系統源碼 瀏覽:955
usb藍牙android 瀏覽:409
伺服器顯示error1什麼意思 瀏覽:710
python代碼精簡 瀏覽:459
文件加密了怎麼找到了 瀏覽:195
jellyfin插件怎麼選擇主伺服器 瀏覽:839
asp用戶注冊源碼 瀏覽:48
什麼是照片壓縮文件 瀏覽:393
java調用js代碼 瀏覽:981
崑山市民app怎麼修改身份信息 瀏覽:779
php登陸次數 瀏覽:746
python字元轉成數字 瀏覽:824
海川用的是什麼伺服器 瀏覽:378