📄 源程序.asm
字号:
;***********************ATMEGA8(L)简易并行编程器**********************/
;说明 适用于没用烧写ATMEGA8并行编程器的朋友,初用ATMEGA8的工程师常
;常在串行编程时写错熔丝位,及加密位,造成不能再串行编程的不便,没并
;行编程将无法再使用,本人就是因此才特花两天时间做了一个简易的并行编
;程器(很简单,用万能板搭焊即可),将的芯片加密位及熔丝恢复出厂默认值
;恢复串行编程。
;//////////////////////////////////////////////////////////////
;主控AT89C51,晶振6M
;P0口编程数据输入输出,P2编程控制
;
;/*******************AT89C51与ATMEGA8(L)各脚连接********************/
;P0.0-PB0,P0.1-PB1,P0.2-PB2,P0.3-PB3,P0.4-PB4,P0.5-PB5,P0.6-PC0,P0.7-PC1
;P2.0-PD7(PAGEL),P2.1-PD6(XA1),P2.2-PD5(XA0),P2.3-PB6(XTAL1)
;P2.4-PD4(BS1),P2.5-PD3(_WR),P2.6-PD2(_OE),P2.7-PD0(RDY/BSY)
;P1.0-PC2(BS2),P1.2---控制RESET(PC6)的12V电压P1.2=1时输出12V
;////////////////////////////////////////////////////////////////////
;若不用不清楚请参考DATESHEET
PAGEL EQU P2.0 ;FLASH和E2PROM页装入
XA1 EQU P2.1 ;XTAL编程动作位1
XA0 EQU P2.2 ;XTAL编程动作位0
XTAL1 EQU P2.3 ;晶振输入端
BS1 EQU P2.4 ;字节选择1(0=选低字节,1=选高字节)
_WR EQU P2.5 ;写脉冲
_OE EQU P2.6 ;输出允许(低有效)
RDY_BSY EQU P2.7 ;0=器件正在编程,1=器件就绪等待命令
LAMP EQU P1.3 ;编程指示灯
_RST_12V EQU P1.2 ;复位端12V电压
KEY EQU P1.1 ;执行按键
BS2 EQU P1.0 ;字节选择2(0=选低字节,1=选高字节)
ORG 0000H
AJMP MAIN
ORG 30H
MAIN: MOV SP,#70H
MOV P0,#0FFH ;初始化P0,P1,P2
MOV P1,#0FFH
MOV P2,#0FFH
CLR XTAL1
LOOP: CPL LAMP
ACALL DELAY_1S
JB KEY,LOOP
JNB KEY,$
SETB LAMP
ACALL PROG_ST ;进入并行编程模式
ACALL WRITE_FUSE ;写熔丝字节
CLR _RST_12V
CLR LAMP
AJMP LOOP
;**********************************
;进入并行编程模式子程序
;**********************************
PROG_ST: MOV R1,#7
PLS: SETB XTAL1 ;产生>6个的XTAL1时钟脉冲触发
CLR XTAL1
DJNZ R1,PLS
ANL P2,#0E0H ;PAGEL,XTAL1,XA1,XA0,BS1==0
NOP ;延时大于100NS
SETB _RST_12V ;RST加12V电压
NOP ;延时大于100NS
RET
;**********************************
;写熔丝子程序
;**********************************
WRITE_FUSE: CLR LAMP ;指示正忙
SETB XA1 ;设置XA1,XA0="10"允许装入命令
CLR XA0
CLR BS1
CLR BS2
MOV P0,#40H ;送出写熔丝命令
SETB XTAL1
CLR XTAL1 ;XTAL1输入正脉冲将命令装入芯片
CLR XA1 ;设置XA1,XA0="01"允许装入数据
SETB XA0
NOP
CLR BS1 ;BS1,BS2="00"表示熔丝低字节“10”表示高字节
CLR BS2
MOV P0,#0E1H ;DOBLEVEL=1,BODEN=1,SUT1=1,SUT1=0,SKSEL3=0,SKSEL2=0,SKSEL1=0,SKSEL0=1(工厂设定值)
SETB XTAL1
CLR XTAL1 ;XTAL1输入正脉冲数据装入芯片
SETB _WR
CLR _WR
SETB _WR ;_WR输入一个负脉冲,开始执行命令
JB RDY_BSY,$ ;等待RDY/BSY变高,表示完成
JNB RDY_BSY,$
ACALL DELAY_106US
;/*********写高字节**********/
MOV P0,#0D9H ;'D9'为出厂设定值
SETB XTAL1
CLR XTAL1 ;XTAL1输入正脉冲数据装入芯片
SETB BS1
SETB _WR
CLR _WR
SETB _WR ;_WR输入一个负脉冲,开始执行命令
JB RDY_BSY,$ ;等待RDY/BSY变高,表示完成
JNB RDY_BSY,$
CLR BS1
ACALL DELAY_106US
SETB LAMP ;指示空闲
RET
;**********************************
;延时子程序
;**********************************
DELAY_106US: MOV R4,#26
DJNZ R4,$
RET
DELAY_1S: MOV R5,#25 ;延时1秒
L1: MOV R6,#200
L2: MOV R7,#148
DJNZ R7,$
DJNZ R6,L2
DJNZ R5,L1
RET
END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -