用89S51制作簡易并行編程器ATmega16
;***********************ATmega16(L)簡易并行編程器**********************/
;說明:
;用于沒有燒寫ATmega16并行編程器的朋友,初用ATmega16的工程師在串行
;編程時寫錯熔絲位,及加密位,造成不能再應(yīng)用串行編程,構(gòu)成不便,沒并行
;編程將無法再使用,做了一個簡易的并行編程器(很簡單,用萬能板搭焊即可),
;將的芯片加密位及熔絲恢復(fù)出廠默認(rèn)值及恢復(fù)串行在線編程功能(ISP)。
;**********************************************************************
;使用說明:
;本電路有1按鍵(key),執(zhí)行1次將芯片加密位擦除,都要按下按鍵1秒鐘才
;執(zhí)行操作,可將at89S51的P3.1(TXD)連接1只NPN三極管(9014)、2支電阻作為
;P3.1(TXD)輸出5V反相器,連接PC的RS-232接收端(RXD),就可通過在PC執(zhí)行1
;個串口調(diào)試軟件SSCOMV3.0,設(shè)置波特率(2400、8、1、N),查看到之前的加
;密位及熔絲高低字節(jié)內(nèi)容,以及執(zhí)行了加密位擦除之后的加密位及熔絲高低字
;節(jié)內(nèi)容(FF99E1)。
;//////////////////////////////////////////////////////////////
;主控at89S51,晶振6M
;P0口編程數(shù)據(jù)輸入輸出,;P2編程控制
;/*******************AT89C51與ATmega16(L)各腳連接********************/
;P0.0~7<-->PB.0~PB.7
;P0.0~7要連接4.7Kx8上拉電阻到VCC(要注意:沒有上拉電阻本電路是不能工作)
;********************************************************************
;P2.0-PD7(PAGEL)
;P2.1-PD6(XA1)
;P2.2-PD5(XA0)
;P2.3-PD4(BS1)
;P2.4-PD3(_WR)
;P2.5-PD2(_OE)
;P2.6-PD1(RDY/BSY)
;P2.7-(XTAL1)
;P1.0-PA0(BS2)
;-----------------------------------------
;P1.1---LED指示運行狀態(tài)(p1.1=0時LED亮)
;P1.2---控制reset腳的12v電壓(p1.2=1時輸出12v,0時沒有電壓輸出)
;P1.3---連接1個按鍵(key)的1接點,按鍵另1接點連接到GND
;////////////////////////////////////////////////////////////////////
;若不用不清楚請參考datesheet;
;制作成功后你就狂燒熔絲和加密位吧!!!!!!!!!!!!!!!!!!
PAGELBITP2.0;PD7flash和E2PROM頁裝入
XA1BITP2.1;PD6XTAL編程動作位1
XA0BITP2.2;PD5XTAL編程動作位0
BS1BITP2.3;PD4字節(jié)選擇1(0:選低字節(jié),1:選高字節(jié))
_WRBITP2.4;PD3寫脈沖
_OEBITP2.5;PD2輸出允許(低有效)
RDY_BSYBITP2.6;PD10:器件正在編程,1:器件就緒等待命令
XTAL1BITP2.7;晶振輸入端
;-----------------------------------------------------
BS2BITP1.0;PA0字節(jié)選擇2(0:選低字節(jié),1:選高字節(jié))
;-----------------------------------------------------
LAMPBITP1.1;編程指示燈
_RST_12VBITP1.2;復(fù)位端12V電壓
KEYBITP1.3;執(zhí)行按鍵
CREQU0DH;CARRIAGERETURN
LFEQU0AH;LINEFEED
;****************************************************************************
ORG0000H
AJMPMAIN
ORG0030H
MAIN:
MOVSP,#70H
MOVP0,#0FFH;初始化P0,P1,P2
MOVP1,#11111000B;P1.7~4=1,KEY=1,_RST_12V=0,LED=0V.BS2=0
MOVP2,#01110000B;XTAL1=0,RDY_BSY=1,_OE=1,_WR=1,(BS1,XA0,XA1,PAGEL=0)
ACALLINT_SIO;初始化SIO
LOOP:
CPLLAMP
ACALLDELAY_1S
JBKEY,LOOP
JNBKEY,$
SETBLAMP
ACALLPROG_ST;進(jìn)入并行編程模式
ACALLREAD_FUSE;讀之前熔絲字節(jié)及經(jīng)過TXD將內(nèi)容發(fā)送到PCRS-232
ACALLChip_ERASE;擦除加密位,存儲器
ACALLWRITE_FUSE;寫熔絲字節(jié)
ACALLREAD_FUSE;讀之后熔絲字節(jié)及經(jīng)過TXD將內(nèi)容發(fā)送到PCRS-232
CLR_RST_12V
CLRLAMP
ACALLSIO_CR_LF
AJMPLOOP
;**********************************
;進(jìn)入并行編程模式子程序
;**********************************
PROG_ST:
MOVR1,#6
PLS:
SETBXTAL1;產(chǎn)生6個的XTAL1時鐘脈沖觸發(fā)
CLRXTAL1
DJNZR1,PLS
ANLP2,#01110000B;PAGEL,XTAL1,XA1,XA0,BS1==0
NOP;延時大于100ns
SETB_RST_12V;RST加12v電壓
NOP;延時大于100ns
RET
;**********************************
;擦除加密位、存儲器子程序
;***********************************
CHIP_ERASE:
CLRLAMP;指示正忙
SETBXA1;設(shè)置XA1,XA0="10"允許裝入命令
CLRXA0
CLRBS1
CLRBS2
MOVP0,#80H;送出芯片擦除命令
SETBXTAL1
CLRXTAL1;輸入正脈沖將命令裝入芯片
NOP
SETB_WR
CLR_WR
SETB_WR;輸入一個負(fù)脈沖,開始執(zhí)行命令擦除芯片
JBRDY_BSY,$;等待RDY/BSY變高,表示擦除完成
JNBRDY_BSY,$
ACALLDELAY_106US
SETBLAMP;指示空閑
ACALLDELAY_106US
RET
;///////////////寫熔絲高低字節(jié)子程序////////////////
WRITE_FUSE:
CLRLAMP;指示正忙
SETBXA1;設(shè)置XA1,XA0="10"允許裝入命令
CLRXA0
CLRBS1
CLRBS2
MOVP0,#40H;送出寫熔絲命令
SETBXTAL1
CLRXTAL1;XTAL1輸入正脈沖將命令裝入芯片
CLRXA1;設(shè)置XA1,XA0="01"允許裝入數(shù)據(jù)
SETBXA0
NOP
CLRBS1;BS1,BS2="00"表示熔絲低字節(jié)“10”表示高字節(jié)
CLRBS2
MOVP0,#0E1H;DOBLEVEL=1,BODEN=1,SUT1=1,SUT1=0,SKSEL3=0,
;SKSEL2=0,SKSEL1=0,SKSEL0=1(工廠設(shè)定值)
SETBXTAL1
CLRXTAL1;XTAL1輸入正脈沖數(shù)據(jù)裝入芯片
SETB_WR
CLR_WR
SETB_WR;_WR輸入一個負(fù)脈沖,開始執(zhí)行命令
JBRDY_BSY,$;等待RDY/BSY變高,表示完成
JNBRDY_BSY,$
ACALLDELAY_106US
;/*********寫高字節(jié)**********/
MOVP0,#99H;'99'為出廠設(shè)定值
SETBXTAL1
CLRXTAL1;XTAL1輸入正脈沖數(shù)據(jù)裝入芯片
SETBBS1
SETB_WR
CLR_WR
SETB_WR;_WR輸入一個負(fù)脈沖,開始執(zhí)行命令
JBRDY_BSY,$;等待RDY/BSY變高,表示完成
JNBRDY_BSY,$
CLRBS1
ACALLDELAY_106US
SETBLAMP;指示空閑
RET
;/**********讀熔絲及加密位************/
READ_FUSE:
CLRLAMP;指示正忙
SETBXA1;設(shè)置XA1,XA0="10"允許裝入命令
CLRXA0
CLRBS1
CLRBS2
MOVP0,#04H;送出讀熔絲和鎖定位命令
CLRXTAL1
SETBXTAL1
CLRXTAL1;XTAL1輸入正脈沖將命令裝入芯片
NOP
CLR_OE
CLRBS2;讀熔絲低字節(jié)
CLRBS1
MOVP0,#0FFH
MOVR7,P0
SETBBS2;讀熔絲高字節(jié)
SETBBS1
MOVR6,P0
CLRBS2;讀加密位
MOVR5,P0
SETB_OE
SETBLAMP
ACALLSIO_TO_PC
RET
;------------------
DELAY_1S:
MOVR7,#1
DELAY11:
MOVR6,#0FFH
DELAY12:
MOVR5,#0FFH
DJNZR5,$
DJNZR6,DELAY12
DJNZR7,DELAY11
RET
;-------------------
DELAY_106US:
MOVR5,#18H
DJNZR5,$
RET
;************************************************************
;將R5R6R7的內(nèi)容經(jīng)TXD發(fā)送到PC子程序
;*************************************************************
SIO_TO_PC:
MOVA,R5;加密鎖定字節(jié)
SWAPA
ACALLHEX_ASC
ACALLSIO_SEND_OUT;經(jīng)TXD發(fā)送加密鎖定字節(jié)的高4BIT
MOVA,R5
ACALLHEX_ASC
ACALLSIO_SEND_OUT;經(jīng)TXD發(fā)送加密鎖定字節(jié)的低4BIT
MOVA,#''
ACALLSIO_SEND_OUT;經(jīng)TXD發(fā)送空格
MOVA,R6;熔絲高字節(jié)
SWAPA
ACALLHEX_ASC
ACALLSIO_SEND_OUT;經(jīng)TXD發(fā)送熔絲高字節(jié)的高4BIT
MOVA,R6
ACALLHEX_ASC
ACALLSIO_SEND_OUT;經(jīng)TXD發(fā)送熔絲高字節(jié)的低4BIT
MOVA,R7;熔絲低字節(jié)
SWAPA
ACALLHEX_ASC
ACALLSIO_SEND_OUT;經(jīng)TXD發(fā)送熔絲低字節(jié)的高4BIT
MOVA,R7
ACALLHEX_ASC
ACALLSIO_SEND_OUT;經(jīng)TXD發(fā)送熔絲低字節(jié)的低4BIT
MOVA,#CR
ACALLSIO_SEND_OUT
MOVA,#LF
ACALLSIO_SEND_OUT
RET
;*****************************************
;初始化SIO波特率2400(晶振6MHz)
;*****************************************
INT_SIO:
ORLPCON,#10000000B;SMOD=1T1
MOVTMOD,#00100000B
MOVTH1,#256-13;設(shè)置波特率為2400
MOVTL1,#256-13;6.MHZ石英/12/16/13=2400
SETBTR1;啟動定時器T1TR1=1
ORLSCON,#01000000B;SETSIOMODE1
;******************************************
SIO_CR_LF:
MOVA,#CR
ACALLSIO_SEND_OUT
MOVA,#LF
ACALLSIO_SEND_OUT
RET
;*****************************************
;*SENDONEDATASUBROUTINE*
;*USEAFORSENDDATA*
;*****************************************
SIO_SEND_OUT:
MOVSBUF,A
JNBTI,$
CLRTI
RET
;*****************************************
;*INVERTHEXTOASCIISUBROUTINE*
;*INPUTHEXLOW4BITTOA*
;*OUTPUTASCIIFORMA*
;*****************************************
HEX_ASC:
ANLA,#00001111B
INCA
MOVCA,@A+PC
RET
DB'0123456789ABCDEF'
END