93c46 演示程序 <br />93c46是1k位串行EEPROM储存器。 每一个储存器都可以通过DI/DO引脚写入或读出。它的存储容量为1024位,内部为128×8位或64×16位。93C46为串行三线SPI操作芯片,在时钟时序的同步下接收数据口的指令。指令码为9位十进制码,具有7个指令,读、擦写使能、擦除、写、全擦、全写及擦除禁止。该芯片擦写时间快,有擦写使能保护,可靠性高,擦写次数可达100万次,以下给出了93C46与单片机的接线图,和引脚说明。 <table class=ubb cellspacing=0><TR><td class=ubb><br /><table class=ubb cellspacing=0><TR><td class=ubb></td></TR><TR><td class=ubb></td><td class=ubb><img src="http://www.51c51.com/TEST/XL1000/g1.jpg"></td></TR></table><br /> <br /><br />说明: 93c46的第6脚org为16/8位模式选择, XL2000套件第6脚接地,仅工作在8位模式下。 </td><td class=ubb><br /><table class=ubb cellspacing=0><TR><td class=ubb></td></TR><TR><td class=ubb></td><td class=ubb><img src="http://www.51c51.com/TEST/XL1000/g2.jpg"></td></TR></table><br /></td></TR><TR><td class=ubb><br /><table class=ubb cellspacing=0><TR><td class=ubb></td></TR><TR><td class=ubb></td><td class=ubb><img src="http://www.51c51.com/TEST/XL1000/g3.jpg"></td></TR></table><br />XL2000的93C46部分原理图 </td></TR></table><br /><img src="http://www.51c51.com/TEST/XL1000/g4.jpg"> <br />接线方法: <br />1用一个4PIN数据排线一端插入CPU部分JP53(P3口)的P3.4,P3.5,P3.6,P3.7。另外一端插入93C46部分的输入端JP46. <br />2用一条8PIN的数据排线把CPU部份的P2口(JP52)接到八路指示灯部份的JP32。 <br />此程序先把8路跑马灯的数据写入93C46, 然后读出送P2口显示。 运行程序可以观察到8路跑马灯。 <br />为证明93C46的作用, 可以拔下93c46的数据线, 再次运行程序, 则没有跑马灯。 <img src="http://www.51c51.com/TEST/XL1000/2000SHIYAN/93C46.jpg"> <br /><br />93C46的跑马灯运行照片 <br /> READ EQU 0 ;读93C46<br />WRITE EQU 2 ;写入93C46<br />EWEN EQU 4 ; 93C46写入使能<br />EWDS EQU 6 ; 93C46写入禁止<br />CS BIT P3.7 ; 93C46 CS<br />CLK BIT P3.6 ; 93C46 CLK<br />DI BIT P3.5 ; 93C46 DI<br />DO BIT P3.4 ; 93C46 DO<br />ADR46 EQU 20H<br />ORG 00H<br />START0: MOV 21H,#00H ; 取地址码<br />MOV 22H,#08H ; 8组8个码<br />MOV P3,#10H<br />MOV ADR46,#00H ;93C46地址00H<br />START: MOV A,#EWEN ;写入使能<br />CALL TO9346<br />MOV A ,21H ;载入取码指针<br />MOV DPTR,#TABLE ;至TABLE取码<br />MOVC A,@A+DPTR<br />MOV R4,A ;存入"写入寄存器"<br />MOV A,#WRITE ;写入数据<br />CALL TO9346<br />MOV A,#EWDS ;写禁止<br />CALL TO9346<br />INC 21H ;取下一个码<br />INC ADR46 ;下一个地址<br />CALL DELAY1<br />DJNZ 22H,START<br />MOV R0,#30H ;存入8051的RAM 地址<br />MOV ADR46,#00H ;93C46 :00地址<br />MOV 22H,#08H ; 93C46 8个地址8个码<br />A1: MOV A,#READ ;读(地址)的数据<br />CALL TO9346<br />MOV A,R4 ;93C46输出的数据载入ACC<br />MOV @R0,A<br />INC ADR46 ;读下一个地址<br />INC R0 ;下一个RAM<br />DJNZ 22H,A1<br />A2: MOV 22H,#08H<br />MOV R0,#30H<br />OUTPUT:MOV A,@R0<br />MOV P2,A ;输出至P2<br />CALL DELAY1 ;<br />INC R0<br />DJNZ 22H,OUTPUT<br />JMP A2<br />TO9346: SETB CS ;93C46 CS=1<br />SETB DI ;DI=1<br />SETB CLK ;CLK=1<br />CALL DELAY ;启动位<br />CLR CLK ;CLK=0<br />CALL DELAY<br />MOV DPTR,#JPTBL46<br />JMP @A+DPTR ;依ACC值跳至相关地址<br />JPTBL46: AJMP SREAD ;读<br />AJMP SWRITE ;写<br />AJMP SEWEN ;写使能<br />AJMP SEWDS ;写禁止<br />SREAD:<br />MOV A,#80H ;送操作码10<br />CALL SDATA<br />MOV A,ADR46 ;载入93C46地址<br />CALL SADR ;写入7位地址(DI)<br />CALL RDT46 ;读出数据(DO),存入3CH<br />MOV R4,A<br />;CALL RDT46 ;读出数据(DO),存入3DH<br />;MOV 3DH,A<br />JMP EX9346<br />SWRITE:<br />MOV A,#40H ;送操作码01<br />CALL SDATA<br />MOV A,ADR46 ;载入93C46地址<br />CALL SADR ;写入7位地址<br />MOV A,R4 ;写入(3CH)数据<br />CALL SDT46<br />;MOV A,3DH ;写入(3DH)数据<br />;CALL SDT46<br />JMP EX9346<br />SEWEN:<br />CLR A ;送操作码00<br />CALL SDATA<br />MOV A,#60H ;写使能操作码11XXXXX<br />CALL SADR<br />JMP EX9346<br />SEWDS:<br />CLR A ;送操作码00<br />CALL SDATA<br />CLR A ;写7位禁止操作码000XXXX<br />CALL SADR<br />EX9346: CLR CS ;CS=0<br />RET<br />SADR:<br />CLR C<br />RLC A<br />MOV R3,#7<br />JMP SD1<br />SDATA:<br />MOV R3,#2<br />JMP SD1<br />SDT46: MOV R3,#8 ;写入8位数据<br />SD1: RLC A ;<br />MOV DI,C<br />SETB CLK<br />CALL DELAY<br />CLR CLK<br />CALL DELAY<br />DJNZ R3,SD1<br />RET<br />RDT46: MOV R3,#8 ;读出8位数据<br />RD1: SETB CLK<br />CALL DELAY<br />CLR CLK<br />CALL DELAY<br />MOV C,DO<br />RLC A<br />DJNZ R3,RD1<br />RET<br />DELAY: MOV R7,#0FH<br />DJNZ R7,$<br />RET<br />DELAY1: MOV R4,#20<br />D1: MOV R5,#20<br />D2: MOV R6,#248<br />DJNZ R6,$<br />DJNZ R5,D2<br />DJNZ R4,D1<br />RET<br />TABLE : DB 0FEH ,0FDH ,0FBH, 0F7H ;广告一个灯左移<br />DB 0EFH ,0DFH ,0BFH, 7FH ;<br />END<br />
|