硬件资源的介绍
  三种使用方式
  At24c02的使用
  DS18b20的使用
  DS18b20液晶显示
  1602液晶的使用
  单个数码管的显示实验
  4个数码管的显示实验
  继电器的使用
  发光二极管的使用
  蜂鸣器的实验
  红外线解码(PWM制式)
  成品发售形式
  配套产品
实验工具>>实验板>>At24c02的使用

一、实验目的:
24c02读/写存储显示实验,4个按键操作4个数码管,其中第一个按键按下时对应数码管加1,同时对24C02进行一次写操作,其它3个数码管每按一下对应数码管加1直到10归0
二、实验设备:
51通用实验板一个,12V电源一个,51仿真器一个,RS232串口线一条。
三、实验电路原理图:

四、实验内容:

五、参考程序:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;24C02读取/存储显示实验
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
SDA EQU p3.7 ;存储器读写程序
SCL EQU p3.6 ;

SLA EQU 40H
NUMBYT EQU 41H

SLAR EQU 0A1H
SLAW EQU 0A0H
MTD EQU 20H
MRD EQU 30H
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;功能:24c02读/写存储显示实验,4个按键操作4个数码管,其中第一个按键按下时对应数码管加1,
; 同时对24C02进行一次写操作,其它3个数码管每按一下对应数码管加1到10归0;
;使用资源: SDA=P3.7,SCL=P3.6 数码管显示数据口:P0口,控制口:P2.0,P2.1,P2.2,P2.3
;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
ORG 0000H
LJMP MAIN
ORG 0030H
;*****************************************
MAIN:
MOV SP,#07H
LCALL RDEEPROM;读地址为:50H的24C02数据(4个数据)
LCALL INIT ;初始化数码管
STAR: LCALL DISP ;数码管显示
JNB p3.2,CHG1 ;检测按钮1
JNB p3.3,CHG2 ;检测按钮2
JNB p3.4,CHG3 ;检测按钮3
JNB p3.5,CHG4 ;检测按钮4
LJMP STAR

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHG1: ;第一个按钮按下
CALL delay ; 按p3.2的消除抖动
JNB p3.2,$ ; p3.2放开否?
CALL delay ;放开消除抖动

MOV A,70H ;加1比较程序
INC A
CJNE A,#0AH,SD11
MOV A,#0
AJMP SD1
SD11: JC SD1
MOV A,#0
SD1: MOV 70H,A
LCALL WREEPROM
JMP STAR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHG2: ;第二个按钮按下
CALL delay ; 按p3.3的消除抖动
JNB p3.3,$ ; p3.3放开否?
CALL delay ;放开消除抖动

MOV A,71H ;加1比较程序
INC A
CJNE A,#0AH,SD21
MOV A,#0
AJMP SD2
SD21: JC SD2
MOV A,#0
SD2: MOV 71H,A
JMP STAR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHG3: ;第三个按钮按下
CALL delay ; 按p3.4的消除抖动
JNB p3.4,$ ; p3.4放开否?
CALL delay ;放开消除抖动

MOV A,72H ;加1比较程序
INC A
CJNE A,#0AH,SD31
MOV A,#0
AJMP SD3
SD31: JC SD3
MOV A,#0
SD3: MOV 72H,A
JMP STAR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
CHG4: ;第四个按钮按下
CALL delay ; 按p3.3的消除抖动
JNB p3.5,$ ; p3.3放开否?
CALL delay ;放开消除抖动

MOV A,73H ;加1比较程序
INC A
CJNE A,#0AH,SD41
MOV A,#0
AJMP SD4
SD41: JC SD4
MOV A,#0
SD4: MOV 73H,A
JMP STAR
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; 将EEPROM的地址50H~53H中4个数据读出并存入以MRD(30H)为首地址的4个单元中
RDEEPROM: MOV MTD,#50H ;#50H为指定存储器(EEPROM)读写的子地址
MOV SLA,#SLAW
MOV NUMBYT,#1
LCALL WRNBYT
MOV SLA,#SLAR
MOV NUMBYT,#04 ;从EEPROM的50H~53H中读出4个数额
LCALL RDNBYT ;并存放在以MRD(30H)为首地址的4个单元中
RET
;;;;;;;;;;;;;;;;;;;;
WREEPROM:
ACALL WMOV5 ;把70H,71H,72H,73H中的数据放到50H为首的地址中
MOV SLA,#SLAW ;写指令
MOV NUMBYT,#05H ;再将RAM 20H-23H中存放的数据发送到EEPROM中去
LCALL WRNBYT
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
WMOV5: MOV MTD,#50H
MOV R0,#MTD ;发送区首地址
MOV R1,#70H ;将70H,71H,72H,73H中的数据放到50H,51H,52H,53H中
MOV R2,#4 ;准备发送到EEPROM中去
INC R0
WMOV: MOV A,@R1
MOV @R0,A
INC R0
INC R1
DJNZ R2,WMOV
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DISP: MOV R0,#0FEH
MOV R1,#70H
DISP1:
MOV A,R0
MOV P2,A ;数码管的控制位发出
MOV A,@R1 ;输出要显示的数据
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV P0,A
LCALL DLYS
INC R1 ;显示数据加1
MOV A,R0
RL A ;控制位左移
MOV R0,A
JB ACC.4,DISP1 ;测试到第5位为0返回
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
INIT: ;初始化70H---73H中的数据
MOV A,30H
ANL A,#0FH
MOV 70H,A
MOV A,31H
ANL A,#0FH
MOV 71H,A
MOV A,32H
ANL A,#0FH
MOV 72H,A
MOV A,33H
ANL A,#0FH
MOV 73H,A
RET

;***************************************
STA: CLR SDA
NOP
SETB SDA;启动I2C总线
SETB SCL
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
NOP
NOP
NOP
CLR SCL
RET
;****************************************
STOP: CLR SCL
CLR SDA;停止I2C总线数据传送
SETB SCL
NOP
NOP
NOP
NOP
NOP
SETB SDA
NOP
NOP
NOP
NOP
NOP
CLR SDA
NOP
CLR SCL
NOP
RET
;*************************************************************
CACK: SETB SDA ;置VSDA为输入方式
SETB SCL ;使VSDA上数据有效
CLR F0 ;预设F0=0
MOV C,SDA ;输入VSDA引脚状态
JNC CEND ;检查VSDA状态,正常应答转CEND,且F0=0
SETB F0 ;无正常应答,F0=1
CEND: CLR SCL ;子程序结束,使VSCL=0
RET
;*************************************************************
MACK: CLR SDA
SETB SCL
NOP
NOP
CLR SCL
SETB SDA
RET
;************************************************************
;发送非应答位 MNACK子程序
MNACK: SETB SDA
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
RET
;******************************************写一个字节
WRBYT: MOV R0,#08H ;8为数据长度送R0中
WLP: RLC A ;发送数据左移,使发送位入C
JC WR1 ;判断发送"1"还是"0",发送"1"转WR1
AJMP WR01 ;发送"0"转WR0
WLP1: DJNZ R0,WLP ;8位是否发送完,未完转WLP
RET ;8位发送完结束
WR1: SETB SDA ;发送"1"程序段
SETB SCL
NOP
NOP
CLR SCL
CLR SDA
AJMP WLP1
WR01: CLR SDA ;发送"0"程序段
SETB SCL
NOP
NOP
CLR SCL
AJMP WLP1
;****************************************读一个字节\
RDBYT: MOV R0,#08H ;8位数据长度如R0
RLP: SETB SDA ;置VSDA为输入方式
SETB SCL ;使VSDA上数据有效
MOV C,SDA ;读入VSDA引脚状态
MOV A,R2 ;读入"0"程序段,由C拼装入R2中
RLC A
MOV R2,A
CLR SCL ;使VSCL=0可继续接收数据位
DJNZ R0,RLP ;8位读完否?未读完转RLP
RET
;***************************************读N个字节:NUMBYT个数,SLA读地址
RDNBYT:MOV R3,NUMBYT
LCALL STA ;发送启动位
MOV A,SLA ;发送寻址字节(读)
LCALL WRBYT
LCALL CACK ;检查应答位
JB F0,RDNBYT ;非正常应答时重新开始
RDN: MOV R1,#MRD ;接收数据缓冲区首址MDR入R1
RDN1: LCALL RDBYT ;读入一个字节到接收数据缓冲中
MOV @R1,A
DJNZ R3,ACK ;N节读完否?未完转ACK
LCALL MNACK ;N个字节读完发送非应答位
LCALL STOP ;发送停止信号
RET ;子程序结束
ACK: LCALL MACK ;发送应答位
INC R1 ;指向下一个接收数据缓冲单元
SJMP RDN1
;**************************************写N个字节:NUMBYT 个数,STA地址,MTD首地址
WRNBYT: MOV R3,NUMBYT
LCALL STA ;启动I2C总线
MOV A,SLA ;发送SLAW字节
LCALL WRBYT
LCALL CACK ;检查应答位
JB F0,WRNBYT ;非应答位则重发
MOV R1,#MTD
WRDA: MOV A,@R1
LCALL WRBYT
LCALL CACK
JB F0,WRNBYT
INC R1
DJNZ R3,WRDA
LCALL STOP
RET
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay: MOV R1,#40 ;延时程序
d1: MOV R2,#248
DJNZ R2,$
DJNZ R1,d1
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;延时子程序
DLYS: MOV R6,#5
DLYS0:MOV R7,#150
DJNZ R7,$
DJNZ R6,DLYS0
RET

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
TAB:
DB 0C0H,0F9H,0A4H,0B0H; 0,1,2,3
DB 99H,92H,82H,0F8H;?,5,6,7
DB 80H,90H,88H,83H;?,9,A,B
DB 0C6H,0A1H,86H,8EH;C,D,E,F
DB 8CH,89H,07fh,0bFH;P,H,.,-11001011
END

回到顶部
                     51单片机实验网   津ICP备05003923
               关于我们  | 下载说明  |  联系站长  | 本站声明