;***********************ATmega16(L)簡易并行編程器**********************/ ;說明: ; 用于沒有燒寫ATmega16并行編程器的朋友,初用ATmega16的工程師在串行 ;編程時寫錯熔絲位,及加密位,造成不能再應用串行編程,構(gòu)成不便,沒并行 ;編程將無法再使用,做了一個簡易的并行編程器(很簡單,用萬能板搭焊即可), ;將的芯片加密位及熔絲恢復出廠默認值及恢復串行在線編程功能(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)試軟件SSCOM V3.0,設(shè)置波特率(2400、8、1、N),查看到之前的加 ;密位及熔絲高低字節(jié)內(nèi)容,以及執(zhí)行了加密位擦除之后的加密位及熔絲高低字 ;節(jié)內(nèi)容(FF 99 E1)。 ;////////////////////////////////////////////////////////////// ;主控at89S51,晶振6M ;P0口編程數(shù)據(jù)輸入輸出 ,;P2編程控制 ;/*******************AT89C51與ATmega16(L)各腳連接********************/ ;P0.0~7 <-->PB.0~PB.7 ;P0.0~7 要連接4.7K x 8 上拉電阻到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; ;制作成功后你就狂燒熔絲和加密位吧!!!!!!!!!!!!!!!!!! PAGEL BIT P2.0 ;PD7 flash和E2PROM頁裝入 XA1 BIT P2.1 ;PD6 XTAL編程動作位1 XA0 BIT P2.2 ;PD5 XTAL編程動作位0 BS1 BIT P2.3 ;PD4 字節(jié)選擇1(0:選低字節(jié),1:選高字節(jié)) _WR BIT P2.4 ;PD3 寫脈沖 _OE BIT P2.5 ;PD2 輸出允許(低有效) RDY_BSY BIT P2.6 ;PD1 0:器件正在編程,1:器件就緒等待命令 XTAL1 BIT P2.7 ;晶振輸入端 ;----------------------------------------------------- BS2 BIT P1.0 ;PA0 字節(jié)選擇2(0:選低字節(jié),1:選高字節(jié)) ;----------------------------------------------------- LAMP BIT P1.1 ;編程指示燈 _RST_12V BIT P1.2 ;復位端12V電壓 KEY BIT P1.3 ;執(zhí)行按鍵
CR EQU 0DH ;CARRIAGE RETURN LF EQU 0AH ;LINE FEED ;****************************************************************************
ORG 0000H AJMP MAIN ORG 0030H MAIN: MOV SP,#70H MOV P0,#0FFH ;初始化P0,P1,P2 MOV P1,#11111000B ;P1.7~4=1,KEY=1,_RST_12V=0,LED=0V.BS2=0 MOV P2,#01110000B ;XTAL1=0,RDY_BSY=1,_OE=1,_WR =1,(BS1,XA0,XA1,PAGEL=0) ACALL INT_SIO ;初始化SIO LOOP: CPL LAMP ACALL DELAY_1S JB KEY,LOOP JNB KEY,$ SETB LAMP
ACALL PROG_ST ;進入并行編程模式 ACALL READ_FUSE ;讀之前熔絲字節(jié)及經(jīng)過TXD將內(nèi)容發(fā)送到PC RS-232 ACALL CHIP_ERASE ;擦除加密位,存儲器 ACALL WRITE_FUSE ;寫熔絲字節(jié) ACALL READ_FUSE ;讀之后熔絲字節(jié)及經(jīng)過TXD將內(nèi)容發(fā)送到PC RS-232 CLR _RST_12V CLR LAMP ACALL SIO_CR_LF AJMP LOOP ;********************************** ;進入并行編程模式子程序 ;********************************** PROG_ST: MOV R1,#6 PLS: SETB XTAL1 ;產(chǎn)生6個的XTAL1時鐘脈沖觸發(fā) CLR XTAL1 DJNZ R1,PLS ANL P2,#01110000B ;PAGEL,XTAL1,XA1,XA0,BS1==0 NOP ;延時大于100ns SETB _RST_12V ;RST加12v電壓 NOP ;延時大于100ns RET ;********************************** ;擦除加密位、存儲器子程序 ;*********************************** CHIP_ERASE: CLR LAMP ;指示正忙 SETB XA1 ;設(shè)置XA1,XA0="10"允許裝入命令 CLR XA0 CLR BS1 CLR BS2 MOV P0,#80H ;送出芯片擦除命令 SETB XTAL1 CLR XTAL1 ;輸入正脈沖將命令裝入芯片 NOP SETB _WR CLR _WR SETB _WR ;輸入一個負脈沖,開始執(zhí)行命令擦除芯片 JB RDY_BSY,$ ;等待RDY/BSY變高,表示擦除完成 JNB RDY_BSY,$ ACALL DELAY_106US SETB LAMP ;指示空閑 ACALL DELAY_106US RET ;///////////////寫熔絲高低字節(jié)子程序//////////////// WRITE_FUSE: CLR LAMP ;指示正忙 SETB XA1 ;設(shè)置XA1,XA0="10"允許裝入命令 CLR XA0 CLR BS1 CLR BS2 MOV P0,#40H ;送出寫熔絲命令 SETB XTAL1 CLR XTAL1 ;XTAL1輸入正脈沖將命令裝入芯片 CLR XA1 ;設(shè)置XA1,XA0="01"允許裝入數(shù)據(jù) SETB XA0 NOP CLR BS1 ;BS1,BS2="00"表示熔絲低字節(jié)“10”表示高字節(jié) CLR BS2 MOV P0,#0E1H ;DOBLEVEL=1,BODEN=1,SUT1=1,SUT1=0,SKSEL3=0, ;SKSEL2=0,SKSEL1=0,SKSEL0=1(工廠設(shè)定值) SETB XTAL1 CLR XTAL1 ;XTAL1輸入正脈沖數(shù)據(jù)裝入芯片 SETB _WR CLR _WR SETB _WR ;_WR輸入一個負脈沖,開始執(zhí)行命令 JB RDY_BSY,$ ;等待RDY/BSY變高,表示完成 JNB RDY_BSY,$ ACALL DELAY_106US ;/*********寫高字節(jié)**********/ MOV P0,#99H ;'99'為出廠設(shè)定值 SETB XTAL1 CLR XTAL1 ;XTAL1輸入正脈沖數(shù)據(jù)裝入芯片 SETB BS1 SETB _WR CLR _WR SETB _WR ;_WR輸入一個負脈沖,開始執(zhí)行命令 JB RDY_BSY,$ ;等待RDY/BSY變高,表示完成 JNB RDY_BSY,$ CLR BS1 ACALL DELAY_106US SETB LAMP ;指示空閑 RET ;/**********讀熔絲及加密位************/ READ_FUSE: CLR LAMP ;指示正忙 SETB XA1 ;設(shè)置XA1,XA0="10"允許裝入命令 CLR XA0 CLR BS1 CLR BS2 MOV P0,#04H ;送出讀熔絲和鎖定位命令 CLR XTAL1 SETB XTAL1 CLR XTAL1 ;XTAL1輸入正脈沖將命令裝入芯片 NOP CLR _OE CLR BS2 ;讀熔絲低字節(jié) CLR BS1 MOV P0,#0FFH MOV R7,P0 SETB BS2 ;讀熔絲高字節(jié) SETB BS1 MOV R6,P0 CLR BS2 ;讀加密位 MOV R5,P0 SETB _OE SETB LAMP ACALL SIO_TO_PC RET ;------------------ DELAY_1S: MOV R7,#1 DELAY11: MOV R6,#0FFH DELAY12: MOV R5,#0FFH DJNZ R5,$ DJNZ R6,DELAY12 DJNZ R7,DELAY11 RET ;------------------- DELAY_106US: MOV R5,#18H DJNZ R5,$ RET ;************************************************************ ;將R5 R6 R7 的內(nèi)容經(jīng) TXD 發(fā)送到 PC 子程序 ;************************************************************* SIO_TO_PC: MOV A,R5 ;加密鎖定字節(jié) SWAP A ACALL HEX_ASC ACALL SIO_SEND_OUT ;經(jīng)TXD發(fā)送加密鎖定字節(jié)的高4BIT MOV A,R5 ACALL HEX_ASC ACALL SIO_SEND_OUT ;經(jīng)TXD發(fā)送加密鎖定字節(jié)的低4BIT
MOV A,#' ' ACALL SIO_SEND_OUT ;經(jīng)TXD發(fā)送 空格 MOV A,R6 ;熔絲高字節(jié) SWAP A ACALL HEX_ASC ACALL SIO_SEND_OUT ;經(jīng)TXD發(fā)送熔絲高字節(jié)的高4BIT MOV A,R6 ACALL HEX_ASC ACALL SIO_SEND_OUT ;經(jīng)TXD發(fā)送熔絲高字節(jié)的低4BIT
MOV A,R7 ;熔絲低字節(jié) SWAP A ACALL HEX_ASC ACALL SIO_SEND_OUT ;經(jīng)TXD發(fā)送熔絲低字節(jié)的高4BIT MOV A,R7 ACALL HEX_ASC ACALL SIO_SEND_OUT ;經(jīng)TXD發(fā)送熔絲低字節(jié)的低4BIT MOV A,#CR ACALL SIO_SEND_OUT MOV A,#LF ACALL SIO_SEND_OUT RET ;***************************************** ;初始化SIO 波特率 2400 (晶振6MHz) ;***************************************** INT_SIO: ORL PCON,#10000000B ;SMOD=1 T1 MOV TMOD,#00100000B MOV TH1,#256-13 ;設(shè)置波特率為2400 MOV TL1,#256-13 ;6.MHZ石英/12/16/13=2400 SETB TR1 ;啟動定時器T1 TR1=1 ORL SCON,#01000000B ;SET SIO MODE 1 ;****************************************** SIO_CR_LF: MOV A,#CR ACALL SIO_SEND_OUT MOV A,#LF ACALL SIO_SEND_OUT RET ;***************************************** ;* SEND ONE DATA SUBROUTINE * ;* USE A FOR SEND DATA * ;***************************************** SIO_SEND_OUT: MOV SBUF,A JNB TI,$ CLR TI RET ;***************************************** ;* INVERT HEX TO ASCII SUBROUTINE * ;* INPUT HEX LOW 4BIT TO A * ;* OUTPUT ASCII FORM A * ;***************************************** HEX_ASC: ANL A,#00001111B INC A MOVC A,@A+PC RET
DB '0123456789ABCDEF' END
|
|