附录:部分程序源代码1.程序初始化:;RAM定义BCOUNT DATA 07FHTIMER DATA 07EHTIMER1 DATA 07DHTIMER2 DATA 07CHHOURS DATA 07BHHOURG DATA 07AHMINUS DATA 079HMINUG DATA 078HSECOS DATA 077HSECOG DATA 076HSECO DATA 075HMINU DATA 074HHOUR DATA 073HTEN DATA 072HFLAG DATA 071HDIN DATA 020HDOUT DATA 021HSLA DATA 070HSUBA DATA 00HACK BIT 00H; I/O定义KEY BIT P3.2CS BIT P1.2CLK BIT P1.3DAT BIT P1.4SCL BIT P1.0SDA BIT P1.1MTD EQU 04AHMRD EQU 058HMRD1 EQU 063HORG 0000HAJMP STARTORG 0003H ;外部中断0中断服务子程序入口地址AJMP INTLORG 0013H ;外部中断1中断服务子程序入口地址AJMP INTYORG 0100HSTART: MOV SP,#30HMOV P1,#11110011B ;initial I/OMOV SLA,#0A0H ;FM24C16器件从地址MOV SUBA,#00H ;器件子地址CLR P2.1MOV TMOD,#20H ;串行口初始化MOV TH1,#0FDHMOV TL1,#0FDHMOV PCON,#00HMOV SCON,#40HSETB TR1SETB IT0 ;INT0为1,边沿触发方式SETB IT1 ;INT1为1,边沿触发方式SETB EX0SETB EX1SETB PX1 ;INT1为高优先级SETB EA ;开总中断MAIN: …AJMP MAIN ;主程序INTL: …RETI ;外部中断0中断服务子程序INTY: …RETI ;外部中断1中断服务子程序END2. HD7279键盘显示子程序INTL: MOV DOUT,#15H ;读键盘指令ACALL SENDACALL RECV ;读键盘数据SETB CSMOV A,DINMOV B,#10 ;HEX change BCD codeDIV ABMOV DOUT,#10100001BACALL SENDMOV DOUT,#11001000BACALL SENDMOV DOUT,B ;send 个位to HD7279AACALL SENDSETB CSRETISEND: MOV BCOUNT,#8 ;set bit counter=8CLR CS ;CS for lvACALL LDELAY ;long delaySLOOP: MOV C,DOUT.7 ;output 1 bitMOV DAT,CSETB CLK ;set CLK for hvMOV A,DOUT ;the data that will send left moveRL AMOV DOUT,AACALL SDELAY ;short delayCLR CLK ;set CLK for lvACALL SDELAYDJNZ BCOUNT,SLOOP ;check 8 bit send over or elseCLR DAT ;send over, returnRETRECV: MOV BCOUNT,#8SETB DAT ;set (DATA) hv(input state)ACALL LDELAYRLOOP: SETB CLKACALL SDELAYMOV A,DINRL AMOV DIN,AMOV C,DATMOV DIN.0,CCLR CLKACALL SDELAYDJNZ BCOUNT,RLOOPRETLDELAY: MOV TIMER,#25 ;delay 50uSDELOOP: DJNZ TIMER,DELOOPRETSDELAY: MOV TIMER,#4 ;delay 8uSSHOTLOP:DJNZ TIMER,SHOTLOPRET3. FM24C16读写子程序START: SETB SDANOPSETB SCL ;起始条件建立时间大于4.7usACALL DELAYCLR SDAACALL DELAYCLR SCL ;钳住总线,准备发数据NOPRETSTOP: CLR SDANOPSETB SCL ;发送结束条件的时钟信号ACALL DELAYSETB SDA ;结束总线ACALL DELAYRETMACK: CLR SDA ;将SDA置0NOPNOPSETB SCLACALL DELAYCLR SCLNOPNOPRETMNACK: SETB SDA ;将SDA置1 NOPNOPSETB SCLACALL DELAYCLR SCLNOPNOPRETCACK: SETB SDANOPNOPSETB SCLCLR ACKNOPNOPMOV C,SDAJC CENDSETB ACK ;判断应答位CEND: NOPCLR SCLNOPRETWRBYTE: MOV R0,#08HWLP: RLC A ;取数据位JC WR1SJMP WR0 ;判断数据位WLP1: DJNZ R0,WLPNOPRETWR1: SETB SDA ;发送1NOPSETB SCLACALL DELAYCLR SCLSJMP WLP1WR0: CLR SDA ;发送0NOPSETB SCLACALL DELAYCLR SCLSJMP WLP1RDBYTE: MOV R0,#08HRLP: SETB SDANOPSETB SCL ;时钟线为高,接收数据位NOPNOPMOV C,SDA ;读取数据位MOV A,R2CLR SCL ;将SCL拉低,时间大于4.7usRLC A ;进行数据位的处理MOV R2,ANOPNOPNOPDJNZ R0,RLP ;未够8位,再来一次RETIWRNBYTE: MOV A,#11MOV R3,ALCALL START ;起动总线MOV A,SLALCALL WRBYTE ;发送器件从地址LCALL CACKJNB ACK,RETWRN ;无应答则退出MOV A,SUBA ;指定子地址LCALL WRBYTELCALL CACKMOV R1,#MTDWRDA: MOV A,@R1LCALL WRBYTE ;开始写入数据LCALL CACKJNB ACK,IWRNBYTEINC R1DJNZ R3,WRDA ;判断写完没有RETWRN: LCALL STOPRETIRDNBYTE: MOV R3,#11LCALL STARTMOV A,SLALCALL WRBYTE ;发送器件从地址LCALL CACKJNB ACK,RETRDNMOV A,SUBA ;指定子地址LCALL WRBYTELCALL CACKLCALL START ;重新起动总线MOV A,SLAINC A ;准备进行读*作LCALL WRBYTELCALL CACKJNB ACK,IRDNBYTEMOV R1,#MRDRDN1: LCALL RDBYTE ;读*作开始MOV @R1,ADJNZ R3,SACKLCALL MNACK ;最后一字节发非应答位RETRDN: LCALL STOP ;并结束总线RETSACK: LCALL MACKINC R1SJMP RDN1DELAY: NOPNOPNOPNOPNOPRET4. DS12887应用子程序DS12887: CLR P2.7INTTIM:MOV DPTR,#7F0BHMOV A,#0A2H ;选BCD码,24小时制MOVX @DPTR,AMOV DPTR,#7F04H ;HOUR单元地址MOV A,#07HMOVX @DPTR,Ainc dptrmov a,#08hmovx @dptr,aMOV DPTR,#7F02H ;MINUTE单元地址MOV A,#59HMOVX @DPTR,Ainc dptrmov a,#00hmovx @dptr,aMOV DPTR,#7F00H ;SEC0ND单元地址MOV A,#58HMOVX @DPTR,Ainc dptrmov a,#00hmovx @dptr,aMOV DPTR,#7F0AH ;寄存器A地址MOV A,#20H ;############MOVX @DPTR,AMOV DPTR,#7F0CH ;寄存器C地址MOVX A,@DPTRINC DPTRMOVX A,@DPTR ;寄存器D地址MOV DPTR,#7F0BH ; 寄存器B地址MOV A,#22HMOVX @DPTR,AMOV IE,#84HRET。