89o6欧浏
1 89C51 实 训 指导书
录 基本I/O口实训 外部数据存储器的应用(6264) 外部数据存储器的应用(2864) 468 键盘显示接口芯片的应用 并口扩展的应用 12 A/D转换的实训 14 D/A转换的实训 采集温度 制作音乐盒 制作四字单色显示屏 31 控制微型打印机
2 目 录 基本 I/O 口实训··································1 外部数据存储器的应用(6264)····················· 4 外部数据存储器的应用(2864)····················· 6 键盘显示接口芯片的应用·························· 8 并口扩展的应用··································12 A/D 转换的实训··································14 D/A 转换的实训··································20 采集温度········································21 制作音乐盒······································27 制作四字单色显示屏······························31 控制微型打印机··································39
实验一:基本功/0口的实训 目的:通过对单片机的编程仿真,学会单片机仿真系统的基本工作过程 要求:用LED的亮/灭来体现单片机高/低电平的变化,连接单片机的基本I/0口,对单片机 进行编程使其完成 (1)8个LED顺序点亮,顺序熄灭,依此循环4次。 (2)8个LED,第1、3、5、7与2、4、6、8LED交替点亮,依此循环4次。 (3)(1)和(2)无限次循环 步骤:1,连接系统板的P1口到LED 2,连接PC机和仿真机的串口线 3,给仿真机接通电源 4,打开仿真机的电源开关,电源灯亮表示仿真系统已经带电 5,编程。 6,调试 7,改换其它IO口,调试程序
3 实验一:基本 I/O 口的实训 目的:通过对单片机的编程仿真,学会单片机仿真系统的基本工作过程。 要求:用 LED 的亮/灭来体现单片机高/低电平的变化,连接单片机的基本 I/O 口,对单片机 进行编程使其完成: (1)8 个 LED 顺序点亮,顺序熄灭,依此循环 4 次。 (2)8 个 LED,第 1、3、5、7 与 2、4、6、8 LED 交替点亮,依此循环 4 次。 (3)(1)和(2)无限次循环。 原理: 1 2 3 4 A B C D 1 2 3 4 D C B A Title Size Number Revision A Date: 22-Sep-2005 Sheet of File: D:\chu\MyDesign1. ddb Drawn By: EA/VP 3 1 X 1 1 9 X 2 1 8 RESET 9 R D 1 7 W R 1 6 INT0 1 2 INT1 1 3 T0 1 4 T1 1 5 P10 1 P11 2 P12 3 P13 4 P14 5 P15 6 P16 7 P17 8 P00 3 9 P01 3 8 P02 3 7 P03 3 6 P04 3 5 P05 3 4 P06 3 3 P07 3 2 P20 2 1 P21 2 2 P22 2 3 P23 2 4 P24 2 5 P25 2 6 P26 2 7 P27 2 8 PSEN 2 9 ALE/P 3 0 TXD 1 1 RXD 1 0 89C51 1 Y 1 Y 3 Y 4 Y 5 Y 6 Y 7 Y 8 Y 1 A 2 A 3 A 4 A 5 A 6 A 7 A 8 A 74A LS04 300 300 300 300 300 300 300 300 +5V 20uF 1 K +5V 11. 0592MHz 30PF 30PF 步骤:1,连接系统板的 P1 口到 LED。 2,连接 PC 机和仿真机的串口线。 3,给仿真机接通电源。 4,打开仿真机的电源开关,电源灯亮表示仿真系统已经带电。 5,编程。 6,调试。 7,改换其它 I/O 口,调试程序
参考程序: 0000H MAIN: MOV 1. #OFFH R7,#04H BACKI CLR P1. 0 LCALL YS cLR P1. 1 LCALL YS CLR P1.2 LCALL CLR P1.3 LCALL YS CLR P1.4 LCALL YS CLR P1.5 LCALL YS CLR P1. 6 LCALL YS CLR P1.7 LCALL YS SETB Pl. 0 LCALL YS setB Pl. 1 LCALL YS SETB P1. 2 LCALL YS TB Pl. 3 CALL YS SETB P1. 4 LCALL YS SetB P1. 5 LCALL YS SETB Pl LCALL YS SETB P1. 7 LCALL YS CLR P3. 0 DJNZ R7, BACK1 MOV R7, #04H BACK2: SETB P3. 0 CLR P1.1 CLR P1.3
4 参考程序: ORG 0000H MAIN: MOV P1,#0FFH MOV R7,#04H BACK1: SETB P3.0 CLR P1.0 LCALL YS CLR P1.1 LCALL YS CLR P1.2 LCALL YS CLR P1.3 LCALL YS CLR P1.4 LCALL YS CLR P1.5 LCALL YS CLR P1.6 LCALL YS CLR P1.7 LCALL YS SETB P1.0 LCALL YS SETB P1.1 LCALL YS SETB P1.2 LCALL YS SETB P1.3 LCALL YS SETB P1.4 LCALL YS SETB P1.5 LCALL YS SETB P1.6 LCALL YS SETB P1.7 LCALL YS CLR P3.0 DJNZ R7,BACK1 MOV R7,#04H BACK2: SETB P3.0 CLR P1.1 CLR P1.3
CLR P1.5 CLR P1.7 LCALL YS LCALL YS BBB P1.5 SeTB P1. 7 CLR CLR P1. 2 CLR P1.4 CLR LCALL YS LCALL YS SETB Pl. 0 SETB P1.2 SETB P1. 4 Etb P1. 6 DJNZ BACK2 L JMP MAIN MOV TMOD, #OlH MOV R5,#05H LOOP MO\ THO, #4CH MOV TLO. #OOH SETB TRO CL BRR TFO, S DJNZ R5, LOOP RET SJMP 心得体会
5 CLR P1.5 CLR P1.7 LCALL YS LCALL YS SETB P1.1 SETB P1.3 SETB P1.5 SETB P1.7 CLR P1.0 CLR P1.2 CLR P1.4 CLR P1.6 LCALL YS LCALL YS SETB P1.0 SETB P1.2 SETB P1.4 SETB P1.6 CLR P3.0 DJNZ R7,BACK2 LJMP MAIN YS: MOV TMOD,#01H MOV R5,#05H LOOP: MOV TH0,#4CH MOV TL0,#00H SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 DJNZ R5,LOOP RET SJMP $ END 心得体会:
实验二:外部数据存储器的应用(6264) 目的:学会用单片机和外部数据存储器进行交流,了解单片机和外部数据进行交换时的时序 关系。 要求:以6264数据存储器为实例,按照系统板上的硬件地址对其进行编程,写出 单片机与6264的接口地址,读出6264中连续16个字节的随机数,由小到大排序, 然后再存放到6264的相应字节中。(由BC7281显示地址及数据,前四位地址,最后 两位数据) 酸酸酸酶 T5 步骤:1,连接PC机和仿真机的串口线。 2,连接P10—DAT,P1.1—KEY,P1.2—CLK ,给仿真机接通电源 4,打开仿真机的电源开关,电源灯亮表示仿真机已经带电。 5,编程
6 实验二:外部数据存储器的应用(6264) 目的:学会用单片机和外部数据存储器进行交流,了解单片机和外部数据进行交换时的时序 关系。 要求:以 6264 数据存储器为实例,按照系统板上的硬件地址对其进行编程,写出 单片机与 6264 的接口地址,读出 6264 中连续 16 个字节的随机数,由小到大排序, 然后再存放到 6264 的相应字节中。(由 BC7281 显示地址及数据,前四位地址,最后 两位数据) 原理: 1 2 3 4 5 6 A B C D 1 2 3 4 5 6 D C B A Title Size Number Revision B Date: 22-Sep-2005 Sheet of File: D:\chu\MyDesign1. ddb Drawn By: EA/VP 3 1 X 1 1 9 X 2 1 8 RESET 9 R D 1 7 W R 1 6 INT0 1 2 INT1 1 3 T0 1 4 T1 1 5 P10 1 P11 2 P12 3 P13 4 P14 5 P15 6 P16 7 P17 8 P00 3 9 P01 3 8 P02 3 7 P03 3 6 P04 3 5 P05 3 4 P06 3 3 P07 3 2 P20 2 1 P21 2 2 P22 2 3 P23 2 4 P24 2 5 P25 2 6 P26 2 7 P27 2 8 PSEN 2 9 ALE/P 3 0 TXD 1 1 RXD 1 0 89C51 20uF 1 K +5V 11. 0592MHz 30PF 30PF A 0 1 0 A 1 9 A 2 8 A 3 7 A 4 6 A 5 5 A 6 4 A 7 3 A 8 2 5 A 9 2 4 A10 2 1 A11 2 3 A12 2 CS1 2 0 CS2 2 6 WE 2 7 O E 2 2 D 0 1 1 D 1 1 2 D 2 1 3 D 3 1 5 D 4 1 6 D 5 1 7 D 6 1 8 D 7 1 9 6264 A 0 2 A 1 3 A 2 4 A 3 5 A 4 6 A 5 7 A 6 8 A 7 9 B 0 1 8 B 1 1 7 B 2 1 6 B 3 1 5 B 4 1 4 B 5 1 3 B 6 1 2 B 7 1 1 E 1 9 DIR 174A LS245 O C 1 C 1 1 1 D 2 2 D 3 3 D 4 4 D 5 5 D 6 6 D 7 7 D 8 8 D 9 1 Q 1 9 2 Q 1 8 3 Q 1 7 4 Q 1 6 5 Q 1 5 6 Q 1 4 7 Q 1 3 8 Q 1 2 74ALS573 A 1 B 2 C 3 E1 4 E2 5 E3 6 Y 0 1 5 Y 1 1 4 Y 2 1 3 Y 3 1 2 Y 4 1 1 Y 5 1 0 Y 6 9 Y 7 7 74ALS138 +5v +5v 1 2 3 A 74ALS00 1 2 3 A 74ALS00 步骤:1,连接 PC 机和仿真机的串口线。 2,连接 P1.0—DAT,P1.1—KEY,P1.2—CLK。 3,给仿真机接通电源。 4,打开仿真机的电源开关,电源灯亮表示仿真机已经带电。 5,编程
6,调试。 参考程序 CCQ EQU2000H;外部数据RAM的地址从2000H开始到3FH结東 BIT COUNT DATA 06FH TIMER DATA 06EH TIMERI DATA 06DH TEMP DATA O6CH DATA IN DATA 02FH DATA OUT DATA 02EH BIT P1. 2 定义I/0口 DAT bIT PL. 0 bIT PL. 1 ORG OOOOH MAIN LCALL XSFW MOv RO. #30H MOV R1, #10H MOV DPTR, #CCQ MovX A @DPTR @RO. A DPTR DJNZ Rl, BACK LCALL PAIXU MOV RO. #30H MOV R1. #10H MOV DPTR,#CCQ;外部数据RAM的地址从2000H开始到3FFH结束 BACK1 MOV A, ORO MOVX DPTR. A DPTR DJNZ Rl, BACKI LCALL XSSHJ SJMP S PAIXU MOV R0. #30H 排序子程序 MOV R1, #31H MOV 40H #OFH A ERO SUBB A JC NEXT MOV A
7 6,调试。 参考程序: CCQ EQU 2000H;外部数据 RAM 的地址从 2000H 开始到 3FFFH 结束 BIT_COUNT DATA 06FH TIMER DATA 06EH TIMER1 DATA 06DH TEMP DATA 06CH DATA_IN DATA 02FH DATA_OUT DATA 02EH CLK BIT P1.2 ;定义 I/O 口 DAT BIT P1.0 ; KEY BIT P1.1 ; ORG 0000H MAIN: LCALL XSFW MOV R0,#30H MOV R1,#10H MOV DPTR,#CCQ BACK: MOVX A,@DPTR MOV @R0,A INC R0 INC DPTR DJNZ R1,BACK LCALL PAIXU MOV R0,#30H MOV R1,#10H MOV DPTR,#CCQ;外部数据RAM的地址从2000H开始到3FFFH结束 BACK1: MOV A,@R0 MOVX @DPTR,A INC R0 INC DPTR DJNZ R1,BACK1 LCALL XSSHJ SJMP $ PAIXU: MOV R0,#30H ;排序子程序 MOV R1,#31H MOV 40H,#0FH LOP: MOV 41H,40H LP: MOV A,@R0 CLR CY SUBB A,@R1 JC NEXT MOV A,@R0
XCH A, OR1 MOV @RO, A NEXT 41H LP )v A, RO A MOV RI.A DJNZ 40H, LOP RET MOV TIMER. #50 START DELAY: MOV TIMERI, #255 延时以确保BC728X完成复位 START DELAY1: DJNZ TIMERl, START DELAY1 DJNZ TIMER, START DELAY MOV DATA OUT,#12H;BC728X初始化 LCALL SEND MOV DATA OUT,#8OH;设定为164模式,不反相 LCALL SEND RET 水水水水水水水水水水水客水水水水水水水水水客水水水水冰水水水冰水水水水水水水客水客水水水水水客水水水水水** *向BC728X发送一个字节子程序,待发送数据存于 DATA OUT CLR CLK 在CLK输出一脉冲 SETB CLK WAITI JB DAT, WAITI ;等待DAT变为低电平 CLR CLK 再输出一CLK脉冲 TB CLK WAIT2 JNB DAT,WAIT2;等待DAT恢复高电平(输入状态) MOV BIT COUNT, #8 SEND LOOP MOV C, DATA OUT. 7 输出BIT7 MOV DAT, C CLR CLK 输出一CLK脉冲 SETB CLK MOV A DATA OUT MOV DATA OUT. A DATA OUT左移一位 NOP 短暂延时 NOP NOP DJNZ BIT COUNT, SEND LOOP SETB DAT 恢复DAT为高电平 RET 本水水水水冰水冰本水冰客水水水水冰水客水冰水水水水水水水水水水水水水水冰水水水水水客水客水冰本水水冰水冰*水
8 XCH A,@R1 MOV @R0,A NEXT: INC R1 DJNZ 41H,LP INC R0 MOV A,R0 INC A MOV R1,A DJNZ 40H,LOP RET ;*********************************************************** XSFW: MOV TIMER,#50 START_DELAY: MOV TIMER1,#255 ;延时以确保 BC728X 完成复位 START_DELAY1: DJNZ TIMER1,START_DELAY1 DJNZ TIMER,START_DELAY MOV DATA_OUT,#12H ;BC728X 初始化 LCALL SEND MOV DATA_OUT,#80H ;设定为 164 模式, 不反相 LCALL SEND RET ;************************************************************* ;* 向 BC728X 发送一个字节子程序,待发送数据存于 DATA_OUT ;************************************************************ SEND: CLR CLK ;在 CLK 输出一脉冲 SETB CLK WAIT1: JB DAT,WAIT1 ;等待 DAT 变为低电平 CLR CLK ;再输出一 CLK 脉冲 SETB CLK WAIT2: JNB DAT,WAIT2 ;等待 DAT 恢复高电平(输入状态) MOV BIT_COUNT,#8 SEND_LOOP: MOV C,DATA_OUT.7 ;输出 BIT7 MOV DAT,C CLR CLK ;输出一 CLK 脉冲 SETB CLK MOV A,DATA_OUT RL A MOV DATA_OUT,A ;DATA_OUT 左移一位 NOP ;短暂延时 NOP NOP DJNZ BIT_COUNT,SEND_LOOP SETB DAT ;恢复 DAT 为高电平 RET ;*************************************************************
;*从BC728X接收一个字节子程序,接收到的数据存于 DATA IN 冰水冰水水冰冰水水冰水水水水水水水冰水水冰水水水水水水求水冰水冰水水本*水水水水冰水冰本水水冰水水水*水 RECEIVE CLR CLK 发出一CLK脉冲 SETB CLK WAIT JB DAT, WAIT3 等待DAT低电平响应信号 CLR CLK 再发出一CLK脉冲,准备接收数据 SETB CLK MOV BIT COUNT, #8 RECV LOOP NOP 短暂延时 NOP NOP NOP NOP MOV A, DATA IN MOV C DAT 读入一位 RLC A MOV DATA IN A CLR CLK 发出CLK脉冲 SETB CLK DJNZ BIT COUNT, RECV LOOP XSSHJ MOV RO. #30H MOV R1.#10H MOV 41H #OOH MOv DPTR, #CCQ BACK3 MOV DATA OUT, #15H HEX译码指令 LCALL SEND MOV A DPH ANL A #OFOH 取键码的低4位 SWAP A ADD A 41H MOV DATA OUT. a ;在第0位显示 LCALL SEND MOV A 41H ADD A#1oH MOV 41H.A MOV DATA OUT, #15H HEX译码指令
9 ;* 从 BC728X 接收一个字节子程序,接收到的数据存于 DATA_IN ;************************************************************* RECEIVE: CLR CLK ;发出一 CLK 脉冲 SETB CLK WAIT3: JB DAT,WAIT3 ;等待 DAT 低电平响应信号 CLR CLK ;再发出一 CLK 脉冲,准备接收数据 SETB CLK MOV BIT_COUNT,#8 RECV_LOOP: NOP ;短暂延时 NOP NOP NOP NOP NOP NOP NOP MOV A,DATA_IN MOV C,DAT ;读入一位 RLC A MOV DATA_IN,A CLR CLK ;发出 CLK 脉冲 SETB CLK DJNZ BIT_COUNT,RECV_LOOP RET XSSHJ: MOV R0,#30H MOV R1,#10H MOV 41H,#00H MOV DPTR,#CCQ BACK3: MOV DATA_OUT,#15H ;HEX 译码指令 LCALL SEND MOV A,DPH ANL A,#0F0H ;取键码的低 4 位 SWAP A ADD A,41H MOV DATA_OUT,a ;在第 0 位显示 LCALL SEND MOV A,41H ADD A,#10H MOV 41H,A MOV DATA_OUT,#15H ;HEX 译码指令
LCALL SEND Mov A DPH A #OFH 取键码的低4位 A,41H MOV DATA oUT. a 在第0位显示 CALL SEND MOV A 41H ADD A #10H MOV 41H. A MOV DATA OUT. #15H HEX译码指令 LCALL SEND MOV A DPL ANL A #OFOH 取键码的低4位 SWAP A ADD A 41H MOV DATA OUT, a ;在第0位显示 LCALL SEND MOV A 41H ADD A #10H MOV 41H. A MOV DATA OUT, #15H HEX译码指令 LCALL SEND MOV A DPL ANL A#OFH 取键码的低4位 ADD A 41H MoV DATA oUT. a 在第0位显示 LCALL SEND MOV A 41H ADD A#30H MOV 41H. A MOV DATA OUT. #15H HEX译码指令 LCALL SEND MOV A eRO 取键码的低4位 SWAP A ADD A 41H MoV DATA oUT. a 在第0位显示 LCALL SEND MOV A 41H
10 LCALL SEND MOV A,DPH ANL A,#0FH ;取键码的低 4 位 ADD A,41H MOV DATA_OUT,a ;在第 0 位显示 LCALL SEND MOV A,41H ADD A,#10H MOV 41H,A MOV DATA_OUT,#15H ;HEX 译码指令 LCALL SEND MOV A,DPL ANL A,#0F0H ;取键码的低 4 位 SWAP A ADD A,41H MOV DATA_OUT,a ;在第 0 位显示 LCALL SEND MOV A,41H ADD A,#10H MOV 41H,A MOV DATA_OUT,#15H ;HEX 译码指令 LCALL SEND MOV A,DPL ANL A,#0FH ;取键码的低 4 位 ADD A,41H MOV DATA_OUT,a ;在第 0 位显示 LCALL SEND MOV A,41H ADD A,#30H MOV 41H,A MOV DATA_OUT,#15H ;HEX 译码指令 LCALL SEND MOV A,@R0 ANL A,#0F0H ;取键码的低 4 位 SWAP A ADD A,41H MOV DATA_OUT,a ;在第 0 位显示 LCALL SEND MOV A,41H