用位移指令实现两两亮灯,c语言左移指令运行3次,右移运行3次结束

【图文】项目3-2_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢赞助商链接
当前位置: >>
东莞理工学院单片机原理与接口技术实验讲义
第二部分微机原理与单片机技术课程实验教学 第一章 基础实验单元 1 软件实验 实验一 清零程序 ?????????????????????4 实验二 拆字程序 ?????????????????????6 实验三 拼字程序 ?????????????????????8 实验四 数据区传送子程序?????????????????10 单元 2 P 口及控制实验 实验五 P1 口亮灯实验???????????????????12 实验六 P1 口转弯灯实验??????????????????15 实验七 P3.3 口输入,P1 口输出???????????????20 实验八 继电器控制 ????????????????????23 单元 3 中断系统实验 实验九 中断基础实验 ???????????????????25 实验十 电脑时钟(定时器、中断综合实验) ?????????28 单元 4 定时/计数器系统实验 实验十一 定时/计数器基础实验???????????????36 实验十二 脉冲计数(定时/计数器综合实验)?????????38 单元 5 串并转换实验 实验十三 164 串进并出实验 ????????????????42 实验十四 165 并串转换实验?????????????????46-1- 第二章综合实验单元 1 并口扩展 实验一 工业顺序控制 ???????????????????49 实验二 8255 A、B、C 口输出方波??????????????55 实验三 8255 PA 口控制 PB 口 ????????????????58 实验四 简单 I/O 扩展 ???????????????????60 单元 2 数模转换实验 实验五 A/D 转换实验???????????????????62 实验六 D/A 转换实验???????????????????65 单元 3 串行总线及接口技术实验 实验七 I2C 存储卡读写实验 ????????????????71 实验八 AT24C02 I2C 总线存储器读写实验??????????80 实验九 TL549 串行 A/D 转换实验??????????????104 实验十 TLC5615 10 位 D/A 串行转换实验 ??????????111 实验十一 串行存储芯片 93C46 读写实验???????????124 单元 4 电机控制实验 实验十二 步进电机控制??????????????????144 实验十三 小直流电机闭环调速实验?????????????159 实验十四 PWM 脉冲宽度调制实验??????????????167 单元 5 显示技术实验 实验十五 8 段 LED 数码管显示实验?????????????170 实验十六 LED16*16 点阵显示实验 ??????????????174 实验十七 128*64 LCD 液晶显示实验 ????????????180 单元 6 MCU 通信技术实验 实验十八 8250 可编程异步通讯接口实验(自发自收)?????200 实验十九 8251 可编程通讯接口实验(与 PC 机) ???????207 实验二十 单片机 RS232 / RS485 串行发送实验(双机通讯)??214 实验二十一 单片机 RS232 / RS485 串行接收实验(双机通讯)??220 单元 7 其它 实验二十二 PCF8563 实时时钟/日历芯片实验?????????222 实验二十三 MAX813L 看门狗复位电路实验??????????241 实验二十四 LM331 电压/频率转换实验 ???????????243-2- 第三章题目一 题目二 题目三 题目四 题目五课程设计电子音乐演奏?????????????????253 智能温度测量?????????????????259 红外线通信控制????????????????273 基于 ISD1420 的语音复读控制??????????280 交通灯控制??????????????????292-3- 第一章 基础实验单元一 软件实验实验一 清零程序一、实验目的: 掌握汇编语言设计和调试方法,熟悉键盘操作。 二、实验内容: 把 2000H~20FFH 的内容清零。 三、实验程序框图开始 00H送R0, 2000H送DPTR00送@DPTR DPTR+1 R0+1 R0=FF? Y 结束 N四、实验步骤: 用连续或单步方式运行程序,检查 2000~20FF 中执行程序 前后的内容变化。 五、思考:假使把 1000H~10FFH 中的内容改成 FF,如何修改程序,请分别 用连续和单步方式运行程序来完成校验证。 六、程序清单 (1)基本程序(文件名 SW01.ASM)ORG 0000H LJMP SE01 ORG 0640H MOV R0,#00H MOV DPTR,#2000H CLR A MOVX @DPTR,A INC DPTR INC R0SE01: LOO1:-4- CJNE R0,#00H,LOO1 LOOP:SJMP LOOP END(2)带注释的基本程序(文件名 SJXSW01.ASM,与 SW01.ASM 相比,为方便 程序阅读仅对注释部分做了详细的注释而已,后同)ORG 0000H LJMP SE01 ORG 0640H SE01: MOV R0,#00H MOV DPTR,#2000H LOO1: CLR A MOVX @DPTR,A INC DPTR INC R0 CJNE R0,#00H,LOO1 LOOP: SJMP LOOP END;(00H)送 R0,R0 为计数器 ;(2000H)送 DPTR ;累加器 A 清零 ;存储空间内容清零 ;DPTR 加 1 ;R0 加 1 ;若 R0 不等于 00,则跳转至 LOO1 继续循环-5- 实验二拆字程序一、实验目的:掌握汇编语言设计和调试方法。 二、实验内容:把 2000H 的内容拆开,高位送 2001H 低位,低位送 2002H 低 位,2001H、2002H 高位清零,一般本程序用于把数据送显示缓冲区时用。 三、实验程序框图开始2000H内容送A 高低位交换,屏蔽高 位后送H内容送A屏蔽高位后送2002H结束四、实验步骤:用连续或单步方式运行程序,检查 2000H~2002H 中内容变化 情况。 五、思考:如何用断点方式调试本程序。 六、程序清单 (1)基本程序(文件名:SW02.ASM)ORG 0000H LJMP SE02 ORG 0660H SE02: MOV DPTR,#2000H MOVX A,@DPTR MOV B,A SWAP A ANL A,#0FH INC DPTR MOVX @DPTR,A INC DPTR MOV A,B ANL A,#0FH MOVX @DPTR,A LOOP: SJMP LOOP END-6- (2)带注释的基本程序(文件名 SJXSW02.ASM)ORG 0000H LJMP SE02 ORG 0660H MOV DPTR,#2000H MOVX A,@DPTR MOV B,A SWAP A ANL A,#0FH INC DPTR MOVX @DPTR,A INC DPTR A,B A,#0FH MOVX @DPTR,A SJMP LOOP ENDSE02:;(2000)送 A 中 ;A 送 B,B 保存 A 的内容 ;A 的高位与低位交换 ;屏蔽高位,保留低位 ;DPTR 加 1 ;A 送 2001 中 ;B 送 A 中,取出 A 的原值 ;屏蔽高位,保留低位MOV ANL LOOP:-7- 实验三拼字程序一、实验目的:进一步掌握汇编语言设计和调试方法。. 二、实验内容:把 2000H、2001H 的低位分别送入 2002H 高低位,一般本程 序用于把显示缓冲区的数据取出拼装成一字节。 三、实验程序框图开始(2000H)送A,屏蔽高位A交换高低位后,送给B (2001H)送A,屏敝高位A和B或后送2002H结束四、实验步骤:单步或用断点方式运行程序,检查 2002H 内容变化情况。 五、思考:如何用断点方式调试本程序。 六、程序清单 (1)基本程序(文件名 SW03.ASM)ORG 0000H LJMP START ORG 0680H MOV DPTR,#2000H MOVX A,@DPTR ANL A,#0FH SWAP A MOV B,A INC DPTR MOVX A,@DPTR ANL A,#0FH ORL A,B INC DPTR MOVX @DPTR,A ENDSTART:(2)带注释的基本程序(文件名 SJXSW03.ASM)ORG 0000H LJMP START-8- START:ORG 0680H MOV DPTR,#2000H MOVX A,@DPTR ANL A,#0FH SWAP A MOV B,A INC DPTR MOVX A,@DPTR ANL A,#0FH ORL A,B INC DPTR MOVX @DPTR,A END;(2000H)内容送入 A 中 ;(2000H)内容屏蔽高位,保留低位 ;高位与低位交换 ;(2000H)内容低位保存在 B 的高位中 ;(2001H)内容送入 A 中 ;(2001H)内容屏蔽高位,保留低位 ;A 与 B 逻辑或运算,结果保留在 A 中 ;A 送 2002H-9- 实验四数据区传送子程序一、实验目的:掌握 RAM 中的数据操作。 二、实验内容:把 R2、R3 源 RAM 区首址内的 R6、R7 字节数据传送到 R4、 R5 目的 RAM 区。 三、实验程序框图开始源地址内容送AA还目的地址源地址低8位R3=0FFH? YN源地址高8位R2加1源地址低8位R3加1目的地址低8位 R5=0FFH? YN目的地址高8位R4加1目的地址低8位R5加1N计数器低8位R7=00H? Y 计数器高8位R6=00H? Y NR7减1结束R6减1 R7减1四、实验步骤 在 R2、R3 中输入源首址(例如 0000H) ,R4、R5 中输入目的地址(例如 2000H) R6、 中输入字节数 , R7 (例如 lFFFH) 运行程序, , 检查 0000H~lFFFH 中内容是否和 2000H~3FFFH 中内容完全一致。 五、程序清单 (1)基本程序(文件名 SW04.ASM)ORG 0000H LJMP SE22 ORG 07B0H MOV DPL,R3 MOV DPH,R2 MOVX A,@DPTR MOV DPL,R5SE22:- 10 - LO42:LO43:LOOP: LO44: LO45:MOV DPH,R4 MOVX @DPTR,A CJNE R3,#0FFH,LO42 INC R2 INC R3 CJNE R5,#0FFH,LO43 INC R4 INC R5 CJNE R7,#00H,LO44 CJNE R6,#00H,LO45 SJMP LOOP NOP DEC R7 SJMP SE22 DEC R7 DEC R6 SJMP SE22 END ORG 0000H LJMP SE22 ORG 07B0H MOV DPL,R3 MOV DPH,R2 MOVX A,@DPTR MOV DPL,R5 MOV DPH,R4 MOVX @DPTR,A CJNE R3,#0FFH,LO42 INC R2 INC R3 CJNE R5,#0FFH,LO43 INC R4 INC R5 CJNE R7,#00H,LO44 CJNE R6,#00H,LO45 SJMP LOOP NOP DEC R7 SJMP SE22 DEC R7 DEC R6 SJMP SE22 END(2)带注释的基本程序(文件名 SJXSW04.ASM)SE22:LO42:LO43:;源地址低 8 位 R3 送 DPL ;源地址高 8 位 R2 送 DPH ;源地址内容送 A ;目的地址低 8 位 R5 送 DPL ;目的地址高 8 位 R4 送 DPH ;目的地址内容送 A ;源地址低 8 位 R3 不等于 0ff,则跳转 ;源地址高 8 位 R2 加 1 ;源地址低 8 位 R3 加 1 ;目的地址低 8 位 R5 不等于 0ff,则跳转 ;目的地址高 8 位 R4 加 1 ;目的地址低 8 位 R5 加 1 ;计数器低 8 位 R7 不等于 0,则跳转 ;计数器高 8 位 R6 不等于 0,则跳转LOOP: LO44: LO45:;计数器低 8 位 R7 减 1 ;计数器低 8 位 R7 减 1 ;计数器高 8 位 R6 减 1- 11 - 单元 2P 口及控制实验实验五 P1 口亮灯实验一、实验目的 (1)学习 P1 口的使用方法; (2)学习延时子程序的编写。 二、实验预备知识 (l)Pl 口为准双向口,每一位都可独立地定义为输入或输出,在作输 入线使用前,必须向锁存器相应位写入“1” ,该位才能作为输入。 (2)本实验中延时子程序采用指令循环来实现,机器周期(12/6MHz) *指令所需机器周期数*循环次数, 在系统时间允许的情况下可以采用此方法。 三、实验内容 P1 口作为输出口,接 8 只发光二极管,编写程序,使发光二极管循环 点亮。 四、实验程序框图开始P1口初始化点亮1位打光二极管延时左移一位循环五、实验接线图- 12 - 六、实验步骤 P1.0~P1.7 用导线连至 L1~L8(发光二极管),运行程序后,观察发光 二极管闪亮移位情况。 快捷连线说明:P1.0~P1.7→L1~L8(发光二极管) 七、思考 改变延时常数,使发光二极管闪亮时间改变。修改程序,使发光二极管 闪亮移位方向改变。 八、程序清单 (1)基本程序(文件名 HW01?ASM)ORG 0000H LJMP SE18 ORG 0790H SE18: MOV P1,#0FFH LO34: MOV A,#0FEH LO33: MOV P1,A LCALL SE19 RL A SJMP LO33 ORG 07A0H SE19: MOV R6,#0A0H LO36: MOV R7,#0FFH LO35: DJNZ R7,LO35 DJNZ R6,LO36 RET- 13 - END(2)带注释的基本程序(文件名 SJXHW01.ASM)ORG 0000H LJMP SE18 ORG 0790H MOV P1,#0FFH MOV A,#0FEH MOV P1,A LCALL SE19 RL A SJMP LO33 ORG 07A0H MOV R6,#0A0H MOV R7,#0FFH DJNZ R7,LO35 DJNZ R6,LO36 RET ENDSE18: LO34: LO33:;P1 口置高电平,P1 口初始化 ;L1 灯亮,#0FEH 中的(E)=1110,其中 0 驱使 L1 灯亮 ;延时 ;A 左循环移位SE19: LO36: LO35:;延时程序- 14 - 实验六P1 口转弯灯实验一、实验目的:进一步了解 P1 口的使用,学习汇编语言编程方法及调试技 巧。 二、实验内容 P1.0 接开关上拨为 5V,左转弯灯闪亮,P1.1 接开关为 5V 时右转弯灯 闪亮,P1.0,P1.1 接开关同时接 5V 或接地时,转弯灯均不闪亮。 三、实验程序框图开始P1口初始化,关灯只是P1.0为高电平吗? Y N 标志位A为1吗? YN只是P1.1为高电平吗? Y 标志位B为1吗? YNN开L1,L2灯 关L5,L6灯 延时关灯关灯关L1,L2灯 开L5,L6灯 延时关灯延时延时标志位A置为1标志位A置为0标志位B置为0标志位B置为1四、实验接线图- 15 - 五、实验步骤 P1.0 接 K1,P1.1 接 K2,P1.4~P1.7 接 L1、L2、L5、L6,连续运行本 程序,拨动开关 K1、K2,应看到转弯灯正确闪亮,在用单步方式调试本程 序时需修改延时子程序 (如: 可把延时程序第一个字节改成返回指令 22H) , 以便观察。 快捷连线说明:P1.0→K1 P1.1→K2 P1.4→L1 P1.5→L2 P1.6→L5 P1.7→L6 六、思考:利用堆栈实现延时的子程序 DELY,其工作过程是怎样的? 七、程序清单 (1)基本程序(文件名 HW02.ASM)ORG 0000H LJMP PX00 ORG 0C30H MOV P1,#0FFH MOV A,P1 MOV B,A ANL A,#03H CJNE A,#01H,PX01 JB 00H,PX04 CLR P1.4 CLR P1.5 SETB P1.6 SETB P1.7 MOV R2,#20H LCALL DELY SETB 00H LJMP PX03 SETB P1.4 SETB P1.5 SETB P1.6 SETB P1.7 MOV R2,#20H LCALL DELY CLR 00H AJMP PX03 CJNE A,#02H,PX02 JB 01H,PX05 SETB P1.4PX00: PX03:PX04:PX01:- 16 - SETB P1.5 CLR P1.6 CLR P1.7 MOV R2,#20H LCALL DELY SETB 01H LJMP PX03 PX05: SETB P1.4 SETB P1.5 SETB P1.6 SETB P1.7 MOV R2,#20H LCALL DELY CLR 01H LJMP PX03 PX02: SETB P1.4 SETB P1.5 SETB P1.6 SETB P1.7 LJMP PX03 DELY: DEL2: DEL3: DEL4: PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END(2)带注释的基本程序(文件名 SJXHW02.ASM)ORG 0000H LJMP PX00 ORG 0C30H PX00: MOV P1,#0FFH PX03: MOV A,P1 MOV B,A ANL A,#03H CJNE A,#01H,PX01 JB 00H,PX04- 17 -;P1 口初始化,置为高电平 ;取出当前 P1 口的状态 ;A 与#03H 逻辑与操作,保留 P1.0 和 P1.1 状态 ;A 与#01H 不相等,则跳转 ;标志位 A 为 1 跳转,位寻址 PX01:PX05:PX02:DELY: DEL2: DEL3: DEL4:CLR P1.4 CLR P1.5 SETB P1.6 SETB P1.7 MOV R2,#20H LCALL DELY SETB 00H LJMP PX03 PX04: SETB P1.4 SETB P1.5 SETB P1.6 SETB P1.7 MOV R2,#20H LCALL DELY CLR 00H AJMP PX03 CJNE A,#02H,PX02 JB 01H,PX05 SETB P1.4 SETB P1.5 CLR P1.6 CLR P1.7 MOV R2,#20H LCALL DELY SETB 01H LJMP PX03 SETB P1.4 SETB P1.5 SETB P1.6 SETB P1.7 MOV R2,#20H LCALL DELY CLR 01H LJMP PX03 SETB P1.4 SETB P1.5 SETB P1.6 SETB P1.7 LJMP PX03 PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DEL4 POP 02H;点亮 L1 灯 ;点亮 L2 灯 ;L5 灯灭 ;L6 灯灭 ;延时 ;标志位 A 置 1 ;L1 置为高电平,L1 灯灭 ;L2 置为高电平,L2 灯灭 ;L5 置为高电平,L5 灯灭 ;L6 置为高电平,L6 灯灭 ;延时 ;标志位 A 清零 ;A 与#02H 不相等,则跳转 ;标志位 B 为 1,则跳转 ;L1 灯灭 ;L2 灯灭 ;L5 灯亮 ;L6 灯亮 ;延时 ;标志位 B 置为 1;标志位 B 置为 0;堆栈方式的延时程序- 18 - DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END- 19 - 实验七P3.3 口输入,P1 口输出一、实验目的:掌握 P3 口、P1 口简单使用。 二、实验内容: P3.3 口输入一脉冲,P1 口按 16 进制加一方式点亮发光二 极管。 三、实验程序框图开始 A初始化为0P3.3为高电平吗? NY延时P3.3真的为高电平 吗? N P3.3为低电平吗? N YY延时P3.3真的为低电平 吗? NYA=A+1 A入栈 A取反 A送P1口 A出栈- 20 - 四、实验接线图五、实验步骤 P3.3 用导线连至 K1 开关,P1.0~P1.7 导线连至 L1~L8, 拨动一次, K1 L1~L8 发光二极管按 16 进制方式加一点亮。 快捷连线说明:P3.3→K1 P1.0~P1.7→L1~L8(发光二极管) 六、思考: 修改程序,使发光二极管左移方式点亮。 七、程序清单 (1)基本程序(文件名 HW03.ASM)ORG 0000H LJMP J100 ORG 0810H MOV A,#00H JB P3.3,J101 MOV R2,#10H LCALL DELY JB P3.3,J101 JNB P3.3,J102 MOV R2,#10H LCALL DELY JNB P3.3,J102 INC A PUSH ACC CPL A MOV P1,A POP ACC AJMP J101J100: J101:J102:- 21 - DELY: DEL2: DEL3: DEL4:PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END(2)带注释的基本程序(文件名 SJXHW03.ASM) ORG 0000H LJMP J100 ORG 0810H J100: MOV A,#00H ;A 初始化为 0 J101: JB P3.3,J101 ;P3.3 为高电平,继续循环 MOV R2,#10H ;延时 LCALL DELY JB P3.3,J101 ;确认 P3.3 是否为高电平 J102: JNB P3.3,J102 ;P3.3 为低电平,继续循环 MOV R2,#10H ;延时 LCALL DELY JNB P3.3,J102 ;确认 P3.3 是否为低电平 INC A PUSH ACC ;A 入栈 CPL A ;A 取反 MOV P1,A ;A 送 P1 口 POP ACC ;A 出栈 AJMP J101 DELY: PUSH 02H ;延时程序 DEL2: PUSH 02H DEL3: PUSH 02H DEL4: DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END- 22 - 实验八继电器控制一、实验目的:掌握用继电器的基本方法和编程。 二、实验内容:利用 P1 口输出高低电平,控制继电器的开合,以实现对外部 装置的控制。 三、实验预备知识 现代自动控制设备中都存在一个电子与电气电路的互相联结问题,一方 面要使电子电路的控制信号能够控制电气电路,提供良好的电隔离,以保护 电子电路和人身的安全,继电器便能完成这一桥梁作用。特别注意的是,在 继电器吸合到断开的瞬间,由于线圈中的电流不能突变,将在线圈产生下正 上负的感应电压,使晶体管9014承受很高电压,有可能损坏驱动管9014,为 此在继电器线圈两端并接一个续流二极管4001, 使线圈两端的感应电压被箝 位在0.7V左右。 (具体电路请看下面电路图) 。 四、实验接线图五、实验步骤 把 Pl.0 接 JIN 端,继电器的 JZ 接地(直流电源的 GND) 。JK 接 L1,JB 接 L2。编制程序,使 P1.0 电平变化,高电平时继电器吸合,常开触点接上 Ll 点亮,L2 熄灭,低电平时继电器不工作,常闭触点闭合,Ll 熄灭,L2 点 亮。 快捷连线说明:P1.0→JIN, JZ→GND(地), JK→L1, JB→L2 六、程序清单 (1)基本程序(文件名 HW18.ASM)ORG 0000H LJMP LOOP ORG 0F00H CLR P1.0 MOV R2,#30H LCALL DELY SETB P1.0 MOV R2,#30H LCALL DELY SJMP LOOP PUSH 02H PUSH 02HLOOP:DELY: DEL2:- 23 - DEL3: DEL4:PUSH 02H DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END(2)带注释的基本程序(文件名 SJXHW18.ASM)ORG 0000H LJMP LOOP ORG 0F00H CLR P1.0 MOV R2,#30H LCALL DELY SETB P1.0 MOV R2,#30H LCALL DELY SJMP LOOP PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET ENDLOOP:;p1.0 用于控制继电器,P1.0 置为 0,L1 灯亮 ;延时 ;P1.0 置为 1,L2 灯亮;循环 ;延时子程序DELY: DEL2: DEL3: DEL4:- 24 - 单元三中断系统实验实验九 中断基础实验一、实验目的: 掌握 MCS-51 单片机中断原理以及编程使用方法;理解 下降沿中断和低电平中断的区别。 二、实验预备知识 MCS-51 单片机有 2 个由/INT0、/INT1 引脚输入的外部中断源。 触发外部中断有两种方式,即下降沿引起中断或低电平引起中断。当编 程 TCON 中的 ITi(i=1 或 0,下同)为 1 时,则引起触发的方式为边沿触发 方式,反之为低电平触发方式。每个中断源的中断请求能否得到响应要受两 级“开关”的控制,即一个总“开关”EA 和 EXi 的控制,只有当 EA 为 1, 且对应的分“开关” EXi 也为 1 时,相应中断源的中断请求才能被响应。 外部中断 0、 外部中断 1 对应有 2 个固定的中断服务程序入口地址 0003H、 0013H。 响应中断后中断申请标志 IEi 由硬件自动清零。 三、实验内容 编写主程序,读取 K1 状态,当其与地端闭合时(P1.3 为低电平)初始 化为低电平触发,反之,初始化为下降沿触发,且发光二极管灭;编写中断 服务程序,使图中的发光管闪烁 5 次,间隔 250ms,即中断服务程序的执行 时间为 2.5 秒,退出中断程序时,使发光管灭。 四、实验程序框图五、实验接线图- 25 - 六、实验步骤 把“总线插孔”框中的 P1.2、P1.3、P3.2 分别连 L1、 K1、“单脉冲 与时钟”的“ ”孔。 快捷连线说明:P1.2→L1, P1.3→K1, P3.2→ 七、思考: 1.要 LED 亮 5 次,程序应如何改动? 2.若改为外部中断 1 来实现以上实验,如何修改实验的硬件和软件? 3.电平触发在输入信号后,灯闪的次数受谁的控制? 八、程序清单 (1)基本程序(文件名 int011ok?ASM)ORG 0000H lJMP MAIN ORG 0003H LJMP INTER0 org 0660h JB P1.3,MAIN1 clr it0 lJMP MAIN2 SETB it0 ORL IE,#81H ORL IP,#02H lJMP MAIN CLR EA SETB P1.2;外中断 0 入口地址MAIN:;判断是电平触发还是沿触发 ;P1.3=0 低电平触发 ;中断初始化,P1.3=1 下降沿边缘触发MAIN1: MAIN2:INTER0:;中断处理程序- 26 - LCALL DELY CLR P1.2 LCALL DELY SETB P1.2 LCALL DELY CLR P1.2 LCALL DELY SETB P1.2 LCALL DELY CLR P1.2 LCALL DELY SETB EA RETI DELY: MOV R6,#00H ;延时 DELY1: MOV R7,#00H DELY2: DJNZ R7,DELY2 DJNZ R6,DELY1 RET END- 27 - 实验十电脑时钟(定时器、中断综合实验)一、实验目的 熟悉 MCS-5l 定时器和中断初始化编程方法,了解定时器的应用实时程 序的设计与调试技巧。 二、实验内容 编写程序,从实验系统键盘上输入时间初值,用定时器产生 0.lS 定时 中断,对时钟计数器计数,并将数值实时地送数码管显示。 三、实验程序框图定时中断开始恢复初值保护NN键盘输入时分秒合乎规定 吗? Y1秒到吗? Y0.1秒加1定时、中断、初始化、开定 时 显示 关中断显示P0.1秒单元清零,60秒 到吗? Y 秒单元清零,60分到 吗? Y 分单元清零,24小时到 吗? YN秒加1N分加1N时单元清零 时加1 退栈返回四、实验步骤 连续运行程序,在键盘上输入时间初值“时、分、秒” ,按执行键 EX /FV 执行,数码管实时显示时间值。 五、思考 (1)电子钟走时精度和程序中那些常数有关? (2)修改程序使定时器工作方式改变,调节有关参数,进一步提高精 度。 六、程序清单 (1)基本程序(文件名 SW10.ASM)ORG 0000H LJMP CHK0- 28 - ORG 000BH LJMP CLOCK ORG 0030H CHK0: MOV SP,#60H MOV P2,#0FFH MOV 7EH,#11H MOV 7DH,#10H MOV 7CH,#10H MOV 7BH,#10H MOV 7AH,#10H MOV 79H,#10H MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A mov r0,#59h mov a,#7eh movx @r0,a LCALL LCK0 LCALL PTDS0 MOV TMOD,#01H ORL IE,#82H MOV TL0,#0E6H MOV TH0,#0DBH MOV 23H,#00H SETB TR0 LOO5: LCALL SSEE LCALL PTDS0 SJMP LOO5 PTDS0: MOV R0,#79H MOV A,22H ACALL PTDS MOV A,21H ACALL PTDS MOV A,20H ACALL PTDS RET PTDS: MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET- 29 - CLOCK:DONE:SSEE: SSE2:SSE1:MOV TL0,#0E6H MOV TH0,#0DBH PUSH PSW PUSH ACC SETB 0D3H INC 23H MOV A,23H CJNE A,#64H,DONE MOV 23H,#00H MOV A,22H INC A DA A MOV 22H,A CJNE A,#60H,DONE MOV 22H,#00H MOV A,21H INC A DA A MOV 21H,A CJNE A,#60H,DONE MOV 21H,#00H MOV A,20H INC A DA A MOV 20H,A CJNE A,#24H,DONE MOV 20H,#00H POP ACC POP PSW RETI ORG 0D50H SETB RS1 MOV R5,#05H MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H MOV R1,#20H MOV A,30H CPL A MOVX @R1,A MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF MOVC A,@A+DPTR- 30 - X3:X31:X30:X2: X0:MOV R1,#21H MOVX @R1,A MOV A,30H RR A MOV 30H,A DEC 31H MOV A,#0FFH MOVX @R1,A DJNZ R7,SSE1 DJNZ R5,SSE2 CLR RS1 RET DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH ORG 1D00H MOV R4,A MOV R0,#59H MOVX A,@R0 MOV R1,A MOV A,R4 MOV @R1,A CLR A POP DPH POP DPL MOVC A,@A+DPTR INC DPTR CJNE A,01H,X30 CLR A MOVC A,@A+DPTR MOVX @R0,A INC DPTR PUSH DPL PUSH DPH RET DEC R1 MOV A,R1 SJMP X31 MOV R6,#50H ACALL XLE JNB ACC.5,XX0 DJNZ R6,X0 MOV R6,#20H MOV R0,#59H MOVX A,@R0- 31 - X1:XX1:XX0: XLE:MOV R0,A MOV A,@R0 MOV R7,A MOV A,#10H MOV @R0,A ACALL XLE JNB ACC.5,XX1 DJNZ R6,X1 MOV A,R7 MOV @R0,A SJMP X2 MOV R6,A MOV A,R7 MOV @R0,A MOV A,R6 RET ACALL DIS ACALL KEY MOV R4,A MOV R1,#48H MOVX A,@R1 MOV R2,A INC R1 MOVX A,@R1 MOV R3,A MOV A,R4 XRL A,R3 MOV R3,04H MOV R4,02H JZ X10 MOV R2,#88H MOV R4,#88H DEC R4 MOV A,R4 XRL A,#82H JZ X11 MOV A,R4 XRL A,#0EH JZ X11 MOV A,R4 ORL A,R4 JZ X12 MOV R4,#20HX10:- 32 - X12: x11: X13:LS3:DIS:LS2:LS1:DEC R2 SJMP X13 MOV R4,#0FH MOV R2,04H MOV R4,03H MOV R1,#48H MOV A,R2 MOVX @R1,A INC R1 MOV A,R3 MOVX @R1,A MOV A,R4 RET DB 07H,04H,08H,05H,09H,06H,0AH DB 0BH,01H,00H,02H,0FH,03H,0EH DB 0CH,0DH PUSH DPH PUSH DPL SETB RS1 MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#LS0 MOV A,@R0 MOVC A,@A+DPTR MOV R1,#21H MOVX @R1,A MOV A,R2 CPL A DEC R1 MOVX @R1,A CPL A DEC R0 DJNZ R3,LS1 CLR C RRC A MOV R2,A JNZ LS2 INC R1 MOV A,#0FFH MOVX @R1,A CLR RS1 POP DPL POP DPH- 33 - LS0:KEY:LP1:XP33: XP3: LP0:XP0:XP1:XP2: LPP:LX0:RET DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH SETB RS1 MOV R2,#0FEH MOV R3,#08H MOV R0,#00H MOV A,R2 MOV R1,#20H MOVX @R1,A RL A MOV R2,A MOV R1,#22H MOVX A,@R1 CPL A ANL A,#0FH JNZ LP0 INC R0 DJNZ R3,LP1 MOVX A,@R1 JB ACC.4,XP33 MOV A,#20H SJMP XP3 MOV A,#20H CLR RS1 RET CPL A JB ACC.0,XP0 MOV A,#00H SJMP LPP JB ACC.1,XP1 MOV A,#08H SJMP LPP JB ACC.2,XP2 MOV A,#10H SJMP LPP JB ACC.3,XP33 MOV A,#18H ADD A,R0 CLR RS1 CJNE A,#10H,LX0 JNC XP35 MOV DPTR,#LS3- 34 - XP35:MOVC A,@A+DPTR RETLCK0: LCALL X2 JNC LCK1 LCALL X3 MOV R1,#7EH SJMP LCK0 LCK1: CJNE A,#16H,LCK0 MOV A,7AH SWAP A ORL A,79H MOV 22H,A CJNE A,#60H,LCK2 LCK2: JNC EXIT MOV A,7CH SWAP A ORL A,7BH MOV 21H,A CJNE A,#60H,CLK3 CLK3: JNC EXIT MOV A,7EH SWAP A ORL A,7DH MOV 20H,A CJNE A,#24H,CLK4 CLK4: JNC EXIT RET EXIT: AJMP LCK0 END- 35 - 单元四定时/计数器系统实验实验十一 定时/计数器基础实验一、 实验目的: 掌握 MCS-51 单片机内部定时/计数器的程序设计与调试方 法。 二、实验预备知识 MCS-51 单片机有两个 16 位的定时计数器 T0 和 T1,它们都有定时和对 外部事件进行计数的功能, 可用于定时控制、 对外部事件检测和计数等场合。 计数和定时实质上都是对脉冲信号进行计数,只不过脉冲源不同而已。 当工作在定时方式时,计数脉冲来自单片机的内部,即振荡器信号 12 分频后作计数脉冲,每个机器周期的时间使计数器加 1,由于计数脉冲的频 率是固定的(即每个脉冲为 1 个机器周期的时间),故可通过设定计数值来 实现定时功能; 当工作在计数方式时,计数脉冲来自单片机的引脚,每当引脚上出现一 个脉冲时,计数器加 1,从而实现计数功能。可以通过编程来指定定时/计 数器的功能,以及它的工作方式。 中断申请标志 TF,在中断响应后有硬件中断清零,查询方式时必须由 软件清零。 三、实验内容 利用定时器 1,通过对外部脉冲的计数,利用查询方式,实现在 P1.0 引脚上产生输出信号。 四、实验程序框图五、实验接线图- 36 - 六、实验步骤 把 P3.5、P1.0 分别连 K1、L1。 快捷连线说明:P3.5→K1 P1.0→L1 七、思考: 1.开关来回拨 4 次才取反,程序应如何修改? 2.采用中断方式,该如何设计程序? 八、程序清单 基本程序(文件名 TIME01ok.ASM)ORG 0000h LJMP DSJU ORG 0660H DSJU: MOV TMOD,#60h MOV TH1,#0FEH MOV TL1,#0FEH SETB TR1 DEL: JBC TF1 ,REP AJMP DEL REP: CPL P1.0 AJMP DEL END;T1 计数,工作方式 2 ;赋初值 ;启动 ;查询计数溢出 ;取反- 37 - 实验十二脉冲计数(定时/计数器实验)一、实验目的 熟悉单片机内部定时/计数器功能,掌握初始化编程方法。 二、实验内容 把定时器 0 外部输入的脉冲进行计数,并送显示器显示。 三、实验程序框图实验程序框图开始 0送R4,R5,R6(20H)送A 堆栈、定时/计数初 始化 开定时器16送为计数器R70送CY R2,R3右移一位 2*(R4R5R6)+CY 送 R4R5R6 (R7-1) 送R7取出TL0,TH0内容转 换 显示N(R7)=0? Y结束四、实验接线图五、实验步骤 P3.4 依次接脉冲输出插孔(单脉冲与时钟单元) ,执行程序,观察数码- 38 - 管上计数脉冲的速度及个数。 快捷连线说明:P3.4→脉冲输出孔 六、思考 修改程序使显示器上可显示到 999999 个脉冲个数。 七、程序清单 (1)基本程序(文件名 SW09.ASM)ORG 0000H LJMP SE15 ORG 06E0H MOV SP,#53H MOV P2,#0FFH MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A ; 1 MOV TMOD,#05H MOV TH0,#00H MOV TL0,#00H SETB TR0 MOV R2,TH0 MOV R3,TL0 LCALL ZOY0 MOV R0,#79H MOV A,R6 LCALL PTDS MOV A,R5 LCALL PTDS MOV A,R4 LCALL PTDS LCALL SSEE SJMP LO29 CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,#10H CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6SE15:LO29:ZOY0:LO30:- 39 - DA A MOV R6,A MOV A,R5 ADDC A,R5 DA A MOV R5,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ R7,LO30 RET PTDS: MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET SSEE: SSE2: SETB RS1 MOV R5,#05H MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H MOV R1,#20H MOV A,30H CPL A MOVX @R1,A MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF MOVC A,@A+DPTR MOV R1,#21H MOVX @R1,A MOV A,30H RR A MOV 30H,A DEC 31H MOV A,#0FFH MOVX @R1,A DJNZ R7,SSE1SSE1:- 40 - DDFF:DJNZ R5,SSE2 CLR RS1 RET DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH END- 41 - 单元五串并转换实验实验十三 74LS164 串进并出实验一、实验目的 1、了解 74LS164 芯片的工作原理,以及与单片机的接口方法。 2、掌握单片机串行口的工作原理以及编程方法。 二、实验内容 用 74LS164 芯片扩展并行输出口,本实验中我们用 74LS164 扩展两个 8 位输出口的接口显示电路,两位数码管循环显示 00~99 之间的数字。 三、编程指南 1、本实验中 MCS-51 单片机串行口工作在方式 0(移位寄存器方式,用 于并行 I/0 口扩展)的发送状态时,串行数据由 P3.0(RXD)送出,移位时钟 由 P3.1(TXD)送出。在移位时钟的作用下,串行口发送缓冲器的数据一位 一位地移入 74LS164 中。需要指出的是,由于 741S164 无并行输出控制端, 因而在串行输入过程中,其输出端的状态会不断变化,故在某些应用场合, 在 74LS164 的输出端应加接输出三态门控制, 以便保证串行输入结束后再输 出数据。 2、74LS164 引脚功能图 管脚说明: SIA、SIB --- Serial inputs Q0 through Q7 ---- Data outputs CLK ---- CLOCK CLR ---- Clear input功能表:CLR SIA 0 X 1 1 1 1 0 X SIB CLK X X 1 X 0 ↑ ↑ ↑ Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q7 0 0 0 0 0 0 0 01 Q0 Q1 Q2 Q3 Q4 Q5 Q6 0 0 Q0 Q1 Q2 Q3 Q4 Q5 Q6 Q0 Q1 Q2 Q3 Q4 Q5 Q6四、实验接线图- 42 - 五、实验步骤 用双头线连接,P3.0 接插孔 A/B,P3.1 接插孔 CP,P1.0 接插孔/CLR, 调入程序运行,两位数码管上循环显示数字 00~99。 快捷连线说明:P3.0→A/B P3.1→CP P1.0→/CLR 六、思考: 修改程序,使两位数码管上循环显示数字 55~00,以递减方式 显示。 七、程序清单 (1)基本程序(文件名 164.ASM)ORG LJMP ORG MOV MOV SETB INC MOV CJNE MOV INC MOV CJNE MOV MOV MOV MOV MOV MOV MOV MOVC MOV JNB CLR INC 0000H MAIN 0100H 30H,#00H 31H,#00H P1.0 30H A,30H A,#0AH,AA 30H,#00H 31H A,31H A,#0AH,AA 30H,#00H 31H,#00H SCON,#00H R7,#02H R0,#30H DPTR,#TAB A,@R0 A,@A+DPTR SBUF,A TI,WAIT TI R0MAIN: L0:;给显示缓冲区赋初值 ;164 清零端‘CLR’置 1(低电平有效)AA:;使 31H,30H 单元内容在 00~99 循环变化 ;设置串行口 ;设置要发送的字节个数 ;设置地址指针LOOP:WAIT:;取出字型码 ;发送 ;等待一帧发关完毕 ;指向下一个字形码- 43 - TAB:DJNZ R7,LOOP MOV R2,#30H ;调用延时子程序 LCALL DELYA CLR P1.0 ;164 清零端'CLR'置 0(低电平有效) SJMP L0 DB 3FH,06H,5BH,04FH,66H,6DH,7DH,07H,7FH,6FH ;七段 LED 段选码(共阴极) DB 77H,7CH,39H,5EH,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH DELYA: PUSH 02H DELYB: PUSH 02H DELYC: PUSH 02H DELYD: DJNZ R2,DELYD POP 02H DJNZ R2,DELYC POP 02H DJNZ R2,DELYB POP 02H DJNZ R2,DELYA RET END ;延时子程序(2)带注释的基本程序(文件名 SJXHW38.ASM)ORG LJMP ORG MOV MOV SETB INC MOV CJNE MOV INC MOV CJNE MOV MOV MOV MOV MOV MOV MOV MOVC 0000H MAIN 0100H 30H,#00H 31H,#00H P1.0 30H A,30H A,#0AH,AA 30H,#00H 31H A,31H A,#0AH,AA 30H,#00H 31H,#00H SCON,#00H R7,#02H R0,#30H DPTR,#TAB A,@R0 A,@A+DPTRMAIN: L0:;给显示缓冲区赋初值 ;P1.0 置为高电平AA:;使 31H,30H 单元内容在 00~99 循环变化 ;设置串行口 ;设置要发送的字节个数 ;设置地址指针LOOP:;取出字型码- 44 - WAIT:TAB:MOV SBUF,A ;发送 JNB TI,WAIT ;等待一帧发关完毕 CLR TI INC R0 ;指向下一个字形码 DJNZ R7,LOOP MOV R2,#30H ;调用延时子程序 LCALL DELYA CLR P1.0 ;164 清零端'CLR'置 0(低电平有效) SJMP L0 DB 3FH,06H,5BH,04FH,66H,6DH,7DH,07H,7FH,6FH ;七段 LED 段选码(共阴极) DB 77H,7CH,39H,5EH,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DELYD POP 02H DJNZ R2,DELYC POP 02H DJNZ R2,DELYB POP 02H DJNZ R2,DELYA RET END ;延时子程序DELYA: DELYB: DELYC: DELYD:- 45 - 实验十四165 并串转换实验一、实验目的 (1)了解 74LS165 芯片的工作原理。 (2)掌握 74LS165 芯片在单片机系统中的应用及编程。 二、实验内容 利用实验系统上的 74LS165 芯片,编程实现 8 位数据并行输入,串行口 串行接收,并将接收的数据存放在 CPU 内部存储区 50H~59H 中,共 10 个数 据。 (并行输入数据由 P1 口来送入) 三、编程指南 (1)74LS165 芯片引脚图 管脚说明: D0 through D7 --Parallel inputs SI -- Serial input Q7,/Q7 -- Data outputs CLK -- Clock CKIN -- Clock inhibit S/L -- (高有效)Shift/Parallel-load control(低有效) (2)编程说明 74LS165 是 8 位并行置入移位寄存器。当移位/置入端(S/L)由高到低 跳变时,并行输入端的数据被置入寄存器;当 S/L=1,且时钟禁止端(第 15 脚)为低电平时,允许时钟输入,这时在时钟脉冲的作用下,数据由 D0 到 D7 方向移位。如下的电路原理图中,TXD(P3.1)作为移位脉冲输出端与所 有 74LS165 的移位脉冲输入端 CP 相连; RXD(P3.0)作为串行输入端与 74LS165 的串行输出端 Q7 相连; P3.2 用来控制 74LS165 的移位与置入而同 S/L 相连; 74LS165 的时钟禁止端(15 脚)接地,表示允许时钟输入。当扩展多个 8 位 并行输入口时,两芯片的首尾(Q7 与 Sin)相连。 四、实验接线原理图- 46 - 五、实验程序框图:开始程序初始化将P1口输出的数据作为165 的并行输入设置串行口接成收方式从SBUF读出数据送入RAM缓 冲区N10个数据读完? Y 结束六、实验步骤 P1.0~P1.7 接 D7~D0, .0 接 Q7, 1 接 CP (CLK), P3.2 接 S/L。 P3 P3. , 调入程序 165.ASM,编译、装载、运行。检查 CPU 内部存储器 50H~59H 中的 数据是否为 01H~0AH(注意刷新存储器) 。 快捷连线说明:P1.0~P1.7→D7~D0 P3.0→Q7 P3.1→CP (CLK) P3.2→S/L 七、思考: 修改程序,使 CPU 内部存储器 50H~59H 中的数据为 0BH~02H。 八、实验程序清单 (1)基本程序(文件名 165.ASM)ORG LJMP ORG MOV MOV MOV INC MOV CLR 0000H MAIN 0500H R7,#10 R0,#50H 40H,#00H 40H P1,40H P3.2MAIN:;设置并行读入数据个数为 10 个 ;设置内部 RAM 数据区首址,接收外部并行输入数据START:;将 P1 口输出的数据作为 74LS165 的并行输入 ;并行置入数据,S/L=0- 47 - RXDATA: WAIT:SETB MOV JNB CLR MOV MOV INC DJNZ SJMP ENDP3.2 SCON,#10H RI,WAIT RI A,SBUF @R0,A R0 R7,START $;允许串行移位,S/L=0 ;设串行口方式 0,允许接收,启动接收过程 ;未接收完一帧,循环等待 ;清 RI 标志,准备下次接收 ;读入数据 ;送至 RAM 缓冲区 ;指向下一个地址 ;10 个数据未读完重新并行置入 ;10 个数据读完,程序就地循环 ;查看 CPU 内部存储区 50H~59H 数据是否为 01~0AH(2)带注释的基本程序(文件名 SJXHW39.ASM)ORG LJMP ORG MOV MOV MOV INC MOV CLR SETB MOV JNB CLR MOV MOV INC DJNZ SJMP END 0000H MAIN 0500H R7,#10 R0,#50H 40H,#00H 40H P1,40H P3.2 P3.2 SCON,#10H RI,WAIT RI A,SBUF @R0,A R0 R7,START $MAIN:;设置并行读入数据个数为 10 个 ;设置内部 RAM 数据区首址,接收外部并行输入数据START:RXDATA: WAIT:;将 P1 口输出的数据作为 74LS165 的并行输入 ;并行置入数据,S/L=0 ;允许串行移位,S/L=0 ;设串行口方式 0,允许接收,启动接收过程 ;未接收完一帧,循环等待 ;清 RI 标志,准备下次接收 ;读入数据 ;送至 RAM 缓冲区 ;指向下一个地址 ;10 个数据未读完重新并行置入 ;10 个数据读完,程序就地循环 ;查看 CPU 内部存储区 50H~59H 数据是否为 01~0AH- 48 - 第二章单元一 并口扩展综合实验实验一 工业顺序控制一、实验目的 掌握工业顺序控制程序的简单编程,中断的使用。 二、实验预备知识 在工业控制中,象冲压、注塑、轻纺、制瓶等生产过程,都是一些继续 生产过程,按某种顺序有规律地完成预定的动作,对这类继续生产过程的控 制称顺序控制,象注塑机工艺过程大致按“合模→注射→延时→开模→产伸 →产退”顺序动作,用单片机最易实现。 三、实验内容 由 P1.0~1.6 控制注塑机的七道工序, 现模拟控制七只发光二极的点亮, 低电平有效,设定每道工序时间转换为延时,P3.4 为开工启动开关,高电 平启动。P3.3 为外部故障输入模拟开关,低电平报警,P1.7 为报警声音输 出,设定 6 道工序只有一位输出,第七道工序三位有输出。 四、实验程序框图- 49 - 开始P1,P3口初始化N是否开工? YIE,IP,PSW,SP初始化工序1,延时,L1灯亮工序2,延时,L2灯亮工序3,延时,L3灯亮工序4,延时,L4灯亮工序5,延时,L5灯亮工序6,延时,L6灯亮 工序7,延时,L5,L6,L7 灯亮- 50 - 五、实验接线图六、实验步骤 将 JP 插针用短路块将+5V,0N 短接(音频功放) ,P3.4 接 K1,P3.3 接 K2,P1.0~P1.6 接 L1~L7,P1.7 接 VIN,按图接好连线,初始状态 K1 为低电 平,K2 为高电平。执行程序,把 K1 接到高电平,启动开工,观察发光二极 管点亮情况,确定工序执行是否正常,然后把 K2 置为低电平,看是否有声 音报警, 恢复中断 1 报警停, 又从刚才报警时一道工序执行下去。 可用单步、 单步跟踪,非全速断点、全速断点,连续执行功能调试软件,直到符合自己程 序设计要求为止。 快捷连线说明:P3.4→K1 P3.3→K2 P1.0~P1.6→L1~L7 P1.7→VIN JP 短路块接 ON(音频功放) 七、思考 设每道工序时间不等,如 2s-3s-4s-1s-2s-4s,设计程序实验 八、程序 (1)基本程序(文件名:HW04.ASM)ORG 0000H LJMP PO10 ORG 0013H LJMP PO16 ORG 0190H MOV P1,#7FH ORL P3,#00H JNB P3.4,PO11PO10: PO11:- 51 - PO12:PO16: PO17: PO18:PO19:PO1A:PO1B:ORL IE,#84H ORL IP,#04H MOV PSW,#00H MOV SP,#53H MOV P1,#7EH ACALL PO1B MOV P1,#7DH ACALL PO1B MOV P1,#7BH ACALL PO1B MOV P1,#77H ACALL PO1B MOV P1,#6FH ACALL PO1B MOV P1,#5FH ACALL PO1B MOV P1,#0FH ACALL PO1B SJMP PO12 MOV B,R2 MOV P1,#7FH MOV 20H,#0A0H SETB P1.7 ACALL PO1A CLR P1.7 ACALL PO1A DJNZ 20H,PO18 CLR P1.7 ACALL PO1A JNB P3.3,PO17 MOV R2,B RETI MOV R2,#10H ACALL DELY RET MOV R2,#06H ACALL DELY RET MOV R2,#30H ACALL DELY RET PUSH 02H PUSH 02HDELY: DEL2:- 52 - DEL3: DEL4:PUSH 02H DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END(2)带注释的基本程序(文件名 SJXHW04.ASM)ORG 0000H LJMP PO10 ORG 0013H LJMP PO16 ORG 0190H MOV P1,#7FH ORL P3,#00H JNB P3.4,PO11 ORL IE,#84H ORL IP,#04H MOV PSW,#00H MOV SP,#53H MOV P1,#7EH ACALL PO1B MOV P1,#7DH ACALL PO1B MOV P1,#7BH ACALL PO1B MOV P1,#77H ACALL PO1B MOV P1,#6FH ACALL PO1B MOV P1,#5FH ACALL PO1B MOV P1,#0FH ACALL PO1B SJMP PO12 MOV B,R2 MOV P1,#7FH MOV 20H,#0A0H SETB P1.7 ACALL PO1A;外部中断 1 入口地址PO10: PO11:PO12:;P1 口初始化 ;P3 口初始化 ;P3.4 为 1,表示开工,跳出循环 ;开全局中断和外部中断 1 ;外部中断 1 为高级中断 ;PSW 初始化 ;堆栈指针初始化 ;工序 1,L1 灯亮 ;延时 ;工序 2,L2 灯亮 ;工序 3,L3 灯亮 ;工序 4,L4 灯亮 ;工序 5,L5 灯亮 ;工序 6,L6 灯亮 ;工序 7,L5,L6,L7 灯亮PO16: PO17: PO18:;外部中断 1 程序,首先保护现场 ;关闭输出 ;计数,每隔一段时间检查一次 P3.3 状态 ;P1.7 置为 1,报警- 53 - PO19:PO1A:CLR P1.7 ACALL PO1A DJNZ 20H,PO18 CLR P1.7 ACALL PO1A JNB P3.3,PO17 MOV R2,B RETI MOV R2,#10H ACALL DELY RET MOV R2,#06H ACALL DELY RET MOV R2,#30H ACALL DELY RET PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END;P1.7 置为 0,报警声音暂停;P3.3 为高电平时报警清除 ;现场恢复 ;延时程序PO1B:DELY: DEL2: DEL3: DEL4:- 54 - 实验二8255 A.B.C 口输出方波一、 实验目的 掌握可编程 I/O 接口芯片 8255 的接口原理使用,熟悉对 8255 初始化 编程和输入/输出软件的设计为法。 二、 实验内容 在 8255 的 A.B.C 口用示波器或万用表可测出每个口线的高 低电平变化。 三、 实验程序框图开始 中断开始8255控制口初始化,55送入A保护现场8255PA口地址送DPTR关输出A送入8255PA口报警DPTR加1,A送入8255PB口故障清除了吗? YNDPTR加1,A送入8255PC口Y 恢复现场延时中断返回中断服务子程序A取反四、实验原理图- 55 - 五、实验步骤 实验接线内部已经连好,执行程序,用示波器或万用表测量 8255A.B.C 口应有高低电平变化(或用 8255A.B.C 口分别用导线连至 Ll~L8,观察发 光二极管变化情况) 。 六、 思考 输出 1KHz,点空比为 25%从 PA0 输出,编写程序实验。 七、 程序 (1)基本程序(文件名 HW05.ASM )ORG 0000H LJMP SE09 ORG 0580H MOV DPTR,#0FF2BH MOV A,#80H MOVX @DPTR,A MOV A,#55H MOV DPTR,#0FF28H MOVX @DPTR,A INC DPTR MOVX @DPTR,A INC DPTR MOVX @DPTR,A MOV R2,#30H LCALL DELY CPL A SJMP LO15 ORG 05A0H PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END ORG 0000H LJMP SE09 ORG 0580H MOV DPTR,#0FF2BH MOV A,#80H MOVX @DPTR,ASE09:LO15:DELY: DEL2: DEL3: DEL4:(2)带注释的基本程序(文件名 SJXHW05.ASM)SE09:;8255 控制口初始化- 56 - LO15:DELY: DEL2: DEL3: DEL4:MOV A,#55H MOV DPTR,#0FF28H MOVX @DPTR,A INC DPTR MOVX @DPTR,A INC DPTR MOVX @DPTR,A MOV R2,#30H LCALL DELY CPL A SJM P LO15 ORG 05A0H PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END;55 送入 A,55 驱动 L2,L4,L6,L8 灯亮 ;8255PA 口地址送 DPTR ;A 送 8255PA 口 ;DPTR 加 1,为 8255PB 口地址 ;A 送 8255PB 口 ;DPTR 加 1,为 8255PC 口地址 ;A 送 8255PC 口 ;延时 ;A 取反- 57 - 实验三8255PA 口控制 PB 口一、实验目的 掌握单片机系统中扩展外围芯片的方法,了解 8255 芯片的 结构及编程方法。 二、实验内容 用 8255 PA 口作开关量输入口,PB 口作输出口。 三、实验程序框图开始8255初始化A口内容读出 A口状态向B口输 出 循环四、实验连线图- 58 - 五、实验步骤 8255 PA 口接 Kl~K8,PB0~PB7 接 L1~L8 运行程序,按 K1~K8,观察 L1~L8 发光二极管是否对应点亮。 快捷连线说明:PA0~PA7→K1~K8 PB0~PB7→L1~L8 六、思考:修改设计用 8255 PB 口作开关量输入口,PA 口作输出口。 七、程序 (1) 、基本程序:文件名:HW06.ASMORG 0000H LJMP SE17 ORG 0770H MOV DPTR,#0FF2BH MOV A,#90H MOVX @DPTR,A MOV DPTR,#0FF28H MOVX A,@DPTR INC DPTR MOVX @DPTR,A SJMP LO32 END ORG 0000H LJMP SE17 ORG 0770H MOV DPTR,#0FF2BH MOV A,#90H MOVX @DPTR,A MOV DPTR,#0FF28H MOVX A,@DPTR INC DPTR MOVX @DPTR,A SJMP LO32 ENDSE17:LO32:(2)带注释的基本程序(文件名 SJXHW06.ASM)SE17:;8255 控制口初始化LO32:;PA 口地址送入 DPTR ;PA 口状态送入 A 中 ;DPTR 加 1,DPTR 为 PB 口地址 ;A(PA 口状态)送入到 PB 口- 59 - 实验四简单 I/O 口扩展一、实验目的 学习单片机系统中扩展简单 I/O 口的方法; 学习数据输入输出程序的 编制方法。 二、实验内容 利用 74LS244 作为输入口,读取开关状态,并将此状态,通过 74LS273 再驱动发光二极管显示出来。 三、实验程序框图开始读出FF80状态送FF90驱动发光二极管结束四、实验接线图- 60 - 五、实验步骤 用扁平线将 Y0~Y7 接 K1~K8,Q0~Q7 接 L1~L8,D0~D7(I/O 扩展单 元 D0~D7 数据线,JX7)接 JX0,用双头线将 CS1 接 FF80H 孔,CS2 接 FF90H 孔,执行程序,按动 K1~K8,观察 L1~L8 是否对应点亮。 快捷连线说明:Y0~Y7→K1~K8 Q0~Q7→L1~L8 JX0→JX7(D0~D7) CS1→FF80H CS2→FF90H 六、思考 可否用 273 输入,244 输出。 七、程序 (1) 、基本程序:文件名:HW08.ASMORG 0000H LJMP GOD0 ORG 0B80H MOV DPTR,#0FF80H MOVX A,@DPTR MOV DPTR,#0FF90H MOVX @DPTR,A SJMP GOD0 ENDGOD0:(2)带注释的基本程序(文件名 SJXHW08.ASM)ORG 0000H LJMP GOD0 ORG 0B80H MOV DPTR,#0FF80H MOVX A,@DPTR ;读出 FF80 状态 MOV DPTR,#0FF90H MOVX @DPTR,A ;FF80 状态送入 FF90 SJMP GOD0 ENDGOD0:- 61 - 实验五A/D 0809 转换实验一、实验目的 (1)掌握 A/D 转换与单片机接口的方法; (2)了解 A/D 芯片 0809 转换性能及编程方法; (3)通过实验了解单片机如何进行数据采集。 二、实验内容 利用实验系统上的 0809 做 A/D 转换器,实验系统上的电位器提供模拟 量输入,编制程序,将模拟量转换成数字,通过数码管显示出来。 三、实验接线图四实验程序框图开始 程序初始化调用显示子程序0809 采样采样值送显示缓存区结束五、实验步骤 IN0→VOUT(可调电压输出口) ,VIN→+5V(直流电源) ,CS4→FF80H, JX0→JX6,WR→/IOWR,RD→/IORD,ADDA、ADDB、ADDC→地(直流电源 GND)- 62 - CLK→500K 运行程序,数码管上显示 0809.XX,后二位显示当前采集的电压 转换的数字量,调节 W1,该二位将随着电压变化而相应变化。 快捷连线说明:IN0→VOUT VIN→+5V CS4→FF80H JX0→JX6 WR→/IOWR RD→/IORD ADDA、ADDB、ADDC→地 六、 思考 修改程序和 ADDA、 ADDB、 ADDC 接线, IN0、 用 IN7 通道轮流采样。 并送数码管上显示 Y .XX,Y 为通道号,XX 是采样数字量,每隔 4S 采样一 次,轮流循环。 七、程序 (1)基本程序(文件名 HW09.ASM)ORG 0000H LJMP SE11 ORG 0590H MOV SP,#53H mov p2,#0ffh MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#00H MOV 7DH,#08H MOV 7CH,#00H MOV 7BH,#09H MOV 7AH,#10H MOV 79H,#10H LCALL SSEE MOV A,#00H MOV DPTR,#0FF80H MOVX @DPTR,A MOV R7,#0FFH DJNZ R7,LO17 MOVX A,@DPTR MOV R0,#79H LCALL PTDS SJMP LO18 ORG 05D0H MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A ANL A,#0FHSE11:;堆栈初始化 ;P2 口初始化 ;8255 控制口初始化;显示缓冲区初值LO18:;调用显示子程序 ;0809 的 0 通道采样 ;延时 ;取出采样值LO17:;采样值送显示缓冲区PTDS:PTDS1:- 63 - SSEE: SSE2:SSE1:DDFF:MOV @R0,A INC R0 RET ORG 0D50H ;显示子程序 SETB RS1 ;换工作区 MOV R5,#05H MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H MOV R1,#20H MOV A,30H CPL A MOVX @R1,A ;字位送入 MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF MOVC A,@A+DPTR ;取字形代码 MOV R1,#21H MOVX @R1,A MOV A,30H RR A MOV 30H,A DEC 31H MOV A,#0FFH ;关显示 MOVX @R1,A DJNZ R7,SSE1 ;六位显示完了吗? DJNZ R5,SSE2 ;5 次显示完了吗? CLR RS1 RET DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH END- 64 - 实验六D/A 0832 转换实验一、实验目的 (1)了解 D/A 转换与单片机的接口方法; (2)了解 D/A 转换芯片 0832 的性能及编程方法; (3)了解单片机系统中扩展 D/A 转换芯片的基本方法。 二、实验内容 利用 0832 输出一个从 0V 开始逐渐升至 5V 再降至 0V 的可变电压。 三、实验接线图四、实验程序框图开始0832初始化显示转换显示加1N输入是否到FF Y转换显示减1N输出是否减到00 Y- 65 - 五、实验步骤 CS5→FF80H,JX2→JX0,WR→/IOWR,AOUT 输出接电压表或小直流电机 DJ,运行程序,数码管上显示不断加大或减小的数字量,用万用表测试 D/A 输出孔 AOUT 应也能测出不断加大或减小的电压值。 快捷连线说明:CS5→FF80H JX2→JX0 WR→/IOWR AOUT→电压表或小直流电机 DJ 六、思考 修改程序,使能产生锯齿波,计算信号的频率。 七、程序 (1)基本程序(文件名 HW10.ASM)ORG 0000H LJMP SE13 ORG 05E0H MOV SP,#53H mov p2,#0ffh MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#00H MOV 7DH,#08H MOV 7CH,#03H MOV 7BH,#02H MOV R6,#00H MOV DPTR,#0FF80H MOV A,R6 MOVX @DPTR,A MOV R0,#79H LCALL PTDS LCALL SSEE MOV R2,#08H LCALL DELYA INC R6 CJNE R6,#0FFH,LO21 MOV DPTR,#0FF80H DEC R6 MOV A,R6 MOVX @DPTR,A MOV R0,#79H LCALL PTDS LCALL SSEE MOV R2,#08H LCALL DELYA CJNE R6,#00H,LO22SE13:LO20: LO21:LO22:- 66 - PTDS:PTDS1:SSEE: SSE2:SSE1:DDFF: DELYA: DELYB: DELYC: DELYD:SJMP LO20 ;ORG 0620H MOV R1,A LCALL PTDS1 MOV A,R1 SWAP A ANL A,#0FH MOV @R0,A INC R0 RET ORG 0D50H SETB RS1 MOV R5,#05H MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H MOV R1,#20H MOV A,30H CPL A MOVX @R1,A MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF MOVC A,@A+DPTR MOV R1,#21H MOVX @R1,A MOV A,30H RR A MOV 30H,A DEC 31H MOV A,#0FFH MOVX @R1,A DJNZ R7,SSE1 DJNZ R5,SSE2 CLR RS1 RET DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DELYD LCALL SSEE POP 02H- 67 - DJNZ R2,DELYC POP 02H DJNZ R2,DELYB POP 02H DJNZ R2,DELYA RET END (2)带注释的基本程序:文件名:SJXHW10.ASM ORG 0000H LJMP SE13 ORG 05E0H SE13: MOV SP,#53H mov p2,#0ffh MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#00H ;显示缓冲区初值 MOV 7DH,#08H MOV 7CH,#03H MOV 7BH,#02H LO20: MOV R6,#00H LO21: MOV DPTR,#0FF80H MOV A,R6 MOVX @DPTR,A ;送 0832 转换 MOV R0,#79H LCALL PTDS LCALL SSEE ;调用显示子程序 MOV R2,#08H LCALL DELYA ;延时 INC R6 ;R6 加 1 CJNE R6,#0FFH,LO21 ;R6 不到 FF 继续加 LO22: MOV DPTR,#0FF80H DEC R6 MOV A,R6 MOVX @DPTR,A ;R6 减 1 后送 0832 MOV R0,#79H LCALL PTDS LCALL SSEE ;调用显示子程序 MOV R2,#08H LCALL DELYA ;延时 CJNE R6,#00H,LO22 ;R6 不为 0 继续减 SJMP LO20 ;ORG 0620H PTDS: MOV R1,A ;拆送后送显示缓冲区- 68 - PTDS1:SSEE: SSE2:SSE1:DDFF: DELYA: DELYB: DELYC: DELYD:LCALL PTDS1 MOV A,R1 SWAP A ANL A,#0FH MOV @R0,A INC R0 RET ORG 0D50H ;显示子程序 SETB RS1 ;换工作区 MOV R5,#05H MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H MOV R1,#20H MOV A,30H CPL A MOVX @R1,A ;字位送入 MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF MOVC A,@A+DPTR ;取字形代码 MOV R1,#21H MOVX @R1,A MOV A,30H RR A MOV 30H,A DEC 31H MOV A,#0FFH ;关显示 MOVX @R1,A DJNZ R7,SSE1 ;六位显示完了吗? DJNZ R5,SSE2 ;5 次显示完了吗? CLR RS1 RET DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH PUSH 02H ;延时子程序 PUSH 02H PUSH 02H DJNZ R2,DELYD LCALL SSEE ;调用显示子程序 POP 02H DJNZ R2,DELYC POP 02H DJNZ R2,DELYB- 69 - POP 02H DJNZ R2,DELYA RET END- 70 - 实验七I2C 存储卡读写实验一、实验目的 (1)熟悉 IC 卡(I2C 存储卡简称)工作原理及 I2C 总线结构。 (2)利用单片机的 I/O 口线 P3.0、P3.1 产生 I2C 总线 SCL、SDA。 二、实验内容 本实验以 AT24C01A 卡为例,根据 AT24C01A 卡的读写时序编写读写卡的 程序,把写入 IC 卡的数据读到系统内存 4000H~407EH 单元中。 三、编程指南 (1)AT24C01A 卡是一种 E2PROM 存储卡,容量为 128×8bit ,采用 I2C 总 线结构,其卡的结构及引脚排列见下图(2)操作状态开始和停止的定义(3)数据的有效性关系(4)数据传送确认- 71 - (5)写操作(6)读操作四、实验接线图- 72 - 五、实验程序框图开始 IC首址#00H→R0 内存首址#4000H→DPTRNIC卡插入吗? Y调用IC卡读子程序IC卡首址#00H→R0 写入IC卡首数据 #55H→R1把读到数据写入内存R5=00? N Y R5=00? NINC DPL INC R0调显示IC-ErrY调显示IC-Err调用IC卡写子程序 INC R0 INC R1YYR0≠#7FH?N调显示IC-goodR0≠#7FH? N六、实验步骤 (1)P3.0→SCL,P3.1→SDA (2)P1.0→INS,P1.0→L1,其中 INS 作为插卡识别信号,发光二极管 L1 作 为 IC 卡插入指示灯,灯熄灭表明 IC 卡插入正确。 (3)P1.1 →L2,P1.1 作为 IC 卡写信号指示,发光二极管 L2 作为 IC 卡写 信号指示灯,灯亮表明 IC 卡正在写。 (4)P1.2 → L3,P1.2 作为 IC 卡读信号指示,发光二极管 L3 作为 IC 卡 读信号指示灯,灯亮表明 IC 卡正在读。 (5)插卡方法:把 IC 卡芯片面向前、向下轻轻插入 IC 卡座。] (6)运行程序:IC?ASM 程序即可,如读写正确系统应显示“ICGOOD” ,打 开 51 仿真开发软件, 打开视图中数据存储器 4000H~407EH 单元中应为 55、 56、57??d3(H)内容,否则应显示“IC-ERR” 。 快捷连线说明:P3.0→SCL P3.1→SDA P1.0→INS P1.0~P1.2→L1~L3(发光二极管) 七、思考:4000H~407EH 单元中的内容为 55、56、57??d3(H)是如何预 置的? 八、程序清单 文件名:IC.ASMORG 0000H SCL EQU 0B0H ;IC2401,byte-wr SDA EQU 0B1H ;------------------------------------------------------- 73 - START:MOV SP,#53H mov p2,#0ffh MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV A,#1FH MOV DPTR,#0FF20H ;INC DPTR MOVX @DPTR,A INC DPTR MOV A,#0CEH MOVX @DPTR,A JB P1.0,$ LCALL DL10MS JB P1.0,START LCALL DL10MS MOV R0,#00H MOV R1,#55H conw1: push 00R0 IS IC CAR WR ADDRESS push 01R1 IS IC CAR I/O DATA CPL P1.1 ;WR-LED LCALL WR2401_1W ;Byte Wr CJNE R5,#00H,DISPERR pop 01h pop 00h inc r0 inc r1 cjne r0,#7fh,conw1 SETB P1.1 MOV R0,#00H ;R0 IS RD ADDRESS mov dptr,#H----407FH]=55,56,57,.................... conr1: push 00h CPL P1.2 ;RD-LED LCALL RD2401_1W CJNE R5,#00H,DISPERR pop 00h movx @dptr,a inc dpl inc r0 cjne r0,#7fh,conr1 SETB P1.2 condisp: lcall disp sjmp condisp DISPERR:- 74 - CALL DISP1 SJMP DISPERR DISP1: mov 7eh,#01h mov 7dh,#0ch mov 7ch,#10h mov 7bh,#0Eh mov 7ah,#14h mov 79h,#14h AJMP DISP2 DL10MS: MOV R7,#14H ;0AH DL0: MOV R6,#0FFH DJNZ R6,$ DJNZ R7,DL0 RET DISP: mov 7eh,#01h mov 7dh,#0ch mov 7ch,#09h mov 7bh,#00h mov 7ah,#00h mov 79h,#0dh DISP2: MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#TAB LS2: MOV A,@R0 MOVC A,@A+DPTR MOV R1,#21H MOVX @R1,A MOV A,R2 DEC R1 CPL A MOVX @R1,A CPL A DEC R0 DJNZ R3,$ CLR C RRC A MOV R2,A JNZ LS2 INC R1 MOV A,#0FFH MOVX @R1,A RET- 75 - TAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,0DEH,0F3H,8FH ;********************************************************************** ****** WR2401_1W: ;R0 IS ADDR,R1 IS DATA LCALL C_A2401 ;WR FIX ADDRESS AND PROGRAM ADDRESS TO IC CJNE R5,#00H,WR2401_ERROR MOV A,R1 ;WR DATA TO IC MOV R5,#08H WR2401_BIT: CLR SCL RLC A JNC CLR_SDA SETB SDA SJMP WR_NEXT_BIT CLR_SDA: CLR SDA WR_NEXT_BIT: LCALL DY SETB SCL LCALL DY DJNZ R5,WR2401_BIT CLR SCL LCALL DY SETB SCL LCALL DY JB SDA,WR2401_ERROR LCALL STOP2401 ;WR TIME LCALL DY LCALL DY MOV R5,#00H RET WR2401_ERROR: MOV R5,#5AH RET ;-------------------------------------------------DY: MOV R7,#70H;35H DJNZ R7,$ RET START2401: SETB SDA LCALL DY SETB SCL LCALL DY- 76 - CLR SDA LCALL DY CLR SCL LCALL DY RET STOP2401: CLR SCL ; LCALL DY CLR SDA LCALL DY SETB SCL LCALL DY SETB SDA LCALL DY RET ;--------------------------------------------------------C_A2401: ;R0 ADDR LCALL STOP2401 LCALL DY LCALL START2401 MOV A,#0A0H ;WR2401 MOV R5,#08H CONT2401: CLR SCL RLC A JNC CA_CLR_SDA SETB SDA SJMP CA_CONT_NEXT CA_CLR_SDA: CLR SDA CA_CONT_NEXT: LCALL DY SETB SCL LCALL DY DJNZ R5,CONT2401 CLR SCL LCALL DY SETB SCL LCALL DY JB SDA,C_A_ERROR MOV R5,#08H MOV A,R0 ;R0 INPUT ADDR ADDR2401: CLR SCL- 77 - RLC A JNC AD_CLR_SDA SETB SDA SJMP AD_CONT_NEXT AD_CLR_SDA: CLR SDA AD_CONT_NEXT: LCALL DY SETB SCL LCALL DY DJNZ R5,ADDR2401 CLR SCL LCALL DY SETB SCL LCALL DY JB SDA,C_A_ERROR LCALL DY CLR SCL LCALL DY MOV R5,#00H RET C_A_ERROR: MOV R5,#5AH RET ;----------------------------------------------------------------------------------------RD2401_1W: ;SUEI JI RD ,R0 INPUT ADDR,OUTPUT WORD,IN ACC LCALL C_A2401 ;KONG WR,SET FIRST ADDRESS CJNE R5,#00H,RD2401_ERROR LCALL START2401 ;START MOV R5,#08H ;DEVICE ADDERS MOV A,#0A1H RD_CONT2401: CLR SCL RLC A JNC RD24_CLR_SDA SETB SDA SJMP RD_CONT2401_NEXT RD24_CLR_SDA: CLR SDA RD_CONT2401_NEXT: LCALL DY SETB SCL LCALL DY DJNZ R5,RD_CONT2401- 78 - CLR SCL LCALL DY SETB SCL JNB SDA,RD_CONT_OK ;ACK LCALL STOP2401 SJMP RD2401_ERROR RD_CONT_OK: ;READ DATA CLR SCL MOV R5,#08H CLR A RD24_BIT: SETB SCL LCALL DY JNB SDA,RD24_0_DATA SETB C SJMP RD24_NEXT_BIT RD24_0_DATA: CLR C RD24_NEXT_BIT: CLR SCL LCALL DY RLC A DJNZ R5,RD24_BIT SETB SCL LCALL DY CLR SCL LCALL DY LCALL STOP2401 MOV R5,#00H RET RD2401_ERROR: ;OUTPUT IS IN ACC MOV R5,#5AH RET ;--------------------------------------------------------------------------END- 79 - 实验八 AT24C02 I C 总线存储器读写实验一、实验目的 (1)了解 AT24C02 串行 EEPROM 的工作原理及工作时序。 (2)掌握 I2C 总线的工作原理及 I2C 总线软件包的使用。 (3)掌握 AT24C02 在单片机系统中的连接与读写,编写出程序。 二、实验内容 本实验以 AT24C02 芯片为例,根据 AT24C02 芯片的读写时序,编写读写 程序,把写入 AT24C02 的数据读到外部数据存储器 4000H~40FFH 单元中,读 写数据为 00~FFH。 三、编程指南 AT24C02 是美国 ATMEL 公司的低功耗 CMOS 串行 EEPROM, 它是内含 256×8 位存储空间, 具有工作电压宽(2.5~5.5V) 擦写次数多(大于 10000 次) 、 、 写入速度快(小 于 10ms)等特点。 (1)管脚图及管脚描述21、SCL:串行时钟。这是一个输入管脚,用于产生器件所有数据发送或 接收的时钟。 2、SDA:串行数据/地址。这是一个双向传输端,用于传送地址和所有 数据的发送或接收。 3、A0、A1、A2:器件地址输入端。这些输入端用于多个器件级联时设 置器件地址。当这些脚悬空时默认为 0。 4、WP: 写保护。如果 WP 管脚连接到 Vcc,所有的内容都被写保护(只 能读) 。当 WP 管脚连接到 Vss 或悬空,允许器件进行正常的读/写操作。 (2)器件的寻址 主器件通过发送一个起始信号启动发送过程, 然后发送它所要寻址的从 器件的地址。 位从器件地址的高 4 位 D7-D4 固定为 1010, 8 接下的 3 位 D3-D1 (A2、A1、A0)为器件的片选地址位或作为存储器页地址选择位,用来定义 哪个器件以及器件的哪个部分被主器件访问。 从器件 8 位地址的最低位 D0, 作为读写控制位。“1”表示对从器件进行读操作,“0”表示对从器件进行 写操作。- 80 - 型号 AT24C 01 AT24C 02 AT24C 04 AT24C 08 AT24C 16控制 码 10 片选 A2 A1读/写 R/W R/W R/W R/W R/W总线访问的器 件 最多 8 个 最多 8 个 最多 4 个 最多 2 个 最多 1 个(3)A0 A2 A1 A0 A2 A1 P0 A2 P1 P0 P2 P1 P0AT24C0X 数据写入操作 1、字节写在字节写模式下,主器件发送起始命令和从器件地址信息给从器件, 主器件在收到从器件产生应答信号号后, 主器件发送 1 个 8 位字节地址字写 入 AT24C01/02/04/08/16 的地址指针, 主器件在收到从器件的另一个应答信 号后,再发送数据到被寻址的存储单元。 2、页写在页写模式下,AT24C01/02 可一次写入 8 个字节,AT24C04/08/16 可一 次写入 16 个字节。页写操作的启动和字节写一样,不同的是在于传送了一 字节数据后并不产生停止信号。主器件被允许发送 X(AT24C01/02: X=7; ATA24C04/08/16:X=15)个额外字节。 (4)AT24C0X 数据读取操作 1、立即地址读取 在立即地址读取模式下,AT24C0X 的地址计数器内容为最后操作字节的 地址加 1。也就是说,如果上次读/写地址为 N,则立即读的地址从地址 N+1 开始。它首先发送一个应答信号,然后发送一个 8 位字节数据。主器件不需- 81 - 发送一个应答信号,但要产生一个停止信号。2、随机地址读取 随机读操作允许主器件对寄存器的任意字节进行读操作,主器件首先通 过发送起始信号、 从器件地址和它想读取的字节数据的地址执行一个伪写操 作。在 AT24CXX 应答后,主器件重新发送起始信号和从器件地址,此时 R/W 位置 1,AT24CXX 响应并发送应答信号,然后输出所要求的一个 8 位字节数 据,主器件不发送应答信号但产生一个停止信号。3、顺序地址读取 顺序读操作可通过立即读或选择性读操作作启动。在 AT24CXX 发送完一 个 8 位字节数据后,主器件产生一个应答信号来响应,告知 AT24CXX 主器件 要求更多的数据, 对应每个主机产生的应答信号 AT24CXX 将发送一个 8 位数 据字节。当主器件不发送应答信号而发送停止位时结束此操作。四、实验程序框图- 82 - 开始程序初始化,并对外部数据 存储器清零AT24C02写入数据,每次写 入一页读出AT24C02数据,每次读 出一页将AT24C02独处数据写入首 址为4000H的外部数据存储 器 N是否写完32页? Y结束五、实验接线图六、实验步骤 将 AT24C02 实验模块(I2CRAM 模块)的串行时钟端 SCL 接至 P1.6,串行 数据端 SDA 接至 P1.7,P1.0 接 L1 (写指示灯) P1.1 接 L2 , (读指示灯) ,A0、 A1、A2 接地(直流电源 GND) 。运行程序,读写指示灯 L1、L2 闪烁几秒后熄 灭,表示数据读写完毕。此时刷新外部数据存储器,4000H~40FFH 单元中内- 83 - 容应为 00、01、02??FE,FF(H) ,即 00~FFH。 快捷连线说明:SCL→P1.6 SDA→P1.7 P1.0→L1(写指示灯) P1.1→L2(读指示灯) A0、A1、A2 接地 七、思考: 当 A0、A1、A2 悬空时,如何修改设计? 八、程序 (1)基本程序(文件名 AT24C02.ASM);*****************AT24C02 I2C 总 线 存 储 器 读 写 实 验 程 序 ******************************* ;****************** 程 序 调 用 通 用 I2C 总 线 软 件 包 ************************************** ;将 AT24C02 中 256 个字节中依次写入 00~FF, 并把数据读出, 写入外部数据存储器 4000H 为 ; 首 址 的 存 储 器 中 , 即 4000H~40FF 中 的 数 据 为 00~FF*************************************** SDA BIT P1.7 ;I2C 总线定义 SCL BIT P1.6 WRL BIT P1.0 ;写指示灯 RDL BIT P1.1 ;读指示灯 MTD EQU 30H ;发送数据缓冲器 MRD EQU 40H ;接收数据缓冲区 ;定义器件地址,变量 AT24C02 EQU 0A0H ACK BIT 10H SLA DATA 50H SUBA DATA 51H NUMBYTE DATA 52H ORG LJMP ORG MOV MOV MOV MOV MOV MOVX INC MOV CJNE;应答标志位 ;器件的从地址 ;器件的子地址 ;读/写的字节数变量MAIN:CLEAR:0000H MAIN 0100H R5,#00 ;页计数器,每页 8 个字节,共写 32 页 R6,#00H ;写入 EEPROM 的数据寄存器,每写一次加 1 DPL,#00H ;将数据存储器 0000~FF00 的地址空间清零 DPH,#00H A,#00H @DPTR,A DPTR A,DPH A,#0FFH,CLEAR ;清零结束- 84 - NEXT:MOV MOV MOV DJNZ MOV INC MOV INC MOV INC MOV INC MOV INC MOV INC MOV INC MOV INC MOV MOV MOV MUL MOV MOV CLR SETB LCALL MOV LCALL SETB CLR MOV MOV MOV MUL MOV MOV LCALL MOV LCALLDPL,#00H DPH,#40H R4,#0F0H R4,$ MTD,R6 R6 MTD+1,R6 R6 MTD+2,R6 R6 MTD+3,R6 R6 MTD+4,R6 R6 MTD+5,R6 R6 MTD+6,R6 R6 MTD+7,R6 R6 SLA,#AT24C02 A,R5 B,#08 AB SUBA,A NUMBYTE,#08 WRL RDL IWRNBYTE R2,#12H DELYA WRL RDL SLA,#AT24C02 A,R5 B,#08 AB SUBA,A NUMBYTE,#08 IRDNBYTE R2,#12H DELYA;外部数据存储器 4000H 地址 ;用于存放 EEPROM 中读出的数据 ;延时,等待其它芯片复位好;AT24C02 一次最多写入 8 个字节(即 1 页)WRAT:;AT24C02 数据写入操作***;指定器件子地址,此处为“页”地址 ;写指示灯亮 ;读指示灯灭;写指示灯灭 ;读指示灯亮 ;AT24C02 数据读出操作***RDAT:;指定器件子地址,此处为&页&地址- 85 - LL:LO: DELYA: DELYB: DELYC: DELYD:SETB NOP MOV MOV MOV MOVX INC INC DJNZ NOP INC CJNE SETB SETB SJMPRDL R1,#MRD R7,#08H A,@R1 @DPTR,A R1 DPTR R7,LL R5 R5,#32,NEXT WRL RDL LO;一页数据读取完毕,读指示灯灭 ;将接收数据缓冲区 MRD 中的一页数据写入 ;4000H 为首址的外部数据存储器中;一页数据写入完毕 ;判断 AT24C02 中 32 页数据是否读写完毕? ;读写完毕,读写指示灯灭!PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DELYD POP 02H DJNZ R2,DELYC POP 02H DJNZ R2,DELYB POP 02H DJNZ R2,DELYA RET;延时子程序;------------------------------------------------------------------------------------------------------; MCS-51 单片机模拟 I2C 软件包(V1.1) ; 文件名:VI2C_ASM.INC ; 功能说明:本模拟 I2C 软件包包含了 I2C 操作的底层子程序,使用前要定义 ;好 SCL 和 SDA。在标准 8051 模式(12 Clock)下,对主频要求是不高于 12MHz(即 1 个 ;机器周期 1us);若 Fosc&12MHz 则要增加相应的 NOP 指令数。(总线时序符合 I2C 标 ;准模式,100Kbit/S) ; 版本说明:本版新增了两个子程序,IWRNBYTEEXT,IRDNBYTEEXT 两个子程序, ;这两个子程序用于主从通讯上及一此特殊器件的读写操作较为方便. ;------------------------------------------------------------------------------------------------------;启动 I2C 总线子程序 START: SETB SDA- 86 - NOP SETB NOP NOP NOP NOP NOP CLR NOP NOP NOP NOP NOP CLR NOP RETSCL;起始条件建立时间大于 4.7usSDA ;起始条件锁定时大于 4usSCL;钳住总线,准备发数据;结束总线子程序 STOP: CLR SDA NOP SETB SCL NOP NOP NOP NOP NOP SETB SDA NOP 闲时间大于 4.7us NOP NOP NOP RET ;发送应答信号子程序 MACK: CLR SDA NOP NOP SETB SCL NOP NOP NOP NOP- 87 -;发送结束条件的时钟信号 ;结束总线时间大于 4us;结束总线 ;保证一个终止信号和起始信号的空;将 SDA 置 0;保持数据时间,即 SCL 为高时间大于 4.7us NOP CLR NOP NOP RETSCL;发送非应答信号 MNACK: SETB SDA NOP NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL NOP NOP RET ;检查应答位子程序 ;返回值,ACK=1 时表示有应答 CACK: SETB SDA NOP NOP SETB SCL CLR ACK NOP NOP MOV C,SDA JC CEND SETB ACK CEND: NOP CLR SCL NOP RET;将 SDA 置 1;保持数据时间, SCL 为高时间大于 4.7us 即;判断应答位;发送字节子程序 ;字节数据放入 ACC ;每发送一字节要调用一次 CACK 子程序,取应答位 WRBYTE: MOV R0,#08H WLP: RLC A ;取数据位 JC WR1- 88 - WLP1:WR1:SJMP WR0 DJNZ R0,WLP NOP RET SETB SDA NOP SETB SCL NOP NOP NOP NOP NOP CLR SJMP CLR NOP SETB NOP NOP NOP NOP NOP SCL WLP1 SDA SCL;判断数据位;发送 1WR0:;发送 0CLR SJMPSCL WLP1;读取字节子程序 ;读出的值在 ACC ;每取一字节要发送一个应答/非应答信号 RDBYTE: MOV R0,#08H RLP: SETB SDA NOP SETB SCL NOP NOP NOP ;+1 MOV C,SDA MOV A,R2 CLR SCL RLC A MOV R2,A NOP- 89 -;时钟线为高,接收数据位;读取数据位 ;将 SCL 拉低,时间大于 4.7进行数据位的处理 NOP NOP DJNZ RETR0,RLP;未够 8 位,再来一次;========================================================================= =============== ;========================================================================= =============== ; 以下是用户接口子程序 ; ;无子地址器件写字节数据 ;入口参数: 数据为 ACC、器件从地址 SLA ;占用: A、R0、CY IWRBYTE: PUSH ACC IWBLOOP: LCALL START MOV A,SLA LCALL WRBYTE LCALL CACK JNB ACK,RETWRB POP ACC LCALL WRBYTE LCALL CACK LCALL STOP RET RETWRB: POP ACC LCALL STOP RET ;无子地址器件读字节数据 ;入口参数: 器件从地址 SLA ;出口参数: 数据为 ACC ;占用: A 、R0、R2 、CY IRDBYTE: LCALL START MOV A,SLA INC A LCALL WRBYTE LCALL CACK JNB ACK,RETRDB LCALL RDBYTE LCALL MNACK- 90 -;起动总线 ;发送器件从地址 ;无应答则跳转 ;写数据;发送器件从地址;进行读字节操作 ;发送非应信号 RETRDB:LCALL RETSTOP;结束总线;向器件指定子地址写 N 字节数据 ;入口参数: 器件从地址 SLA、器件子地址 SUBA 、发送数据缓冲区 MTD、发送字节数 NUMBYTE ; 占用: A 、R0 、R1 、R3 、CY IWRNBYTE: MOV A,NUMBYTE MOV R3,A LCALL START ;起动总线 MOV A,SLA LCALL WRBYTE ;发送器件从地址 LCALL CACK JNB ACK,RETWRN ;无应答则退出 MOV A,SUBA ;指定子地址 LCALL WRBYTE LCALL MOV MOV LCALL LCALL JNB INC DJNZ LCALL RET CACK R1,#MTD A,@R1 WRBYTE CACK ACK,IWRNBYTE R1 R3,WRDA STOPWRDA:;开始写入数据;判断写完没有RETWRN:;向器件指定子地址读取 N 字节数据 ;入口参数: 器件从地址 SLA、器件子地址 SUBA、接收字节数 NUMBYTE ;出口参数: 接收数据缓冲区 MTD ;占用:A、 R0、 R1、 R2、 R3、 CY IRDNBYTE: MOV R3,NUMBYTE LCALL START MOV A,SLA LCALL WRBYTE ;发送器件从地址 LCALL CACK JNB ACK,RETRDN MOV A,SUBA ;指定子地址 LCALL WRBYTE LCALL CACK LCALL START ;重新起动总线 MOV A,SLA INC A ;准备进行读操作- 91 - RDN1:RETRDN: SACK:LCALL LCALL JNB MOV LCALL MOV ;NOP ;NOP DJNZ LCALL LCALL RET LCALL INC SJMPWRBYTE CACK ACK,IRDNBYTE R1,#MRD RDBYTE @R1,A ;+1 ;+1 R3,SACK MNACK STOP MACK R1 RDN1;读操作开始;最后一字节发非应答位 ;并结束总线;无子地址器件写 N 字节数据 ;入口参数: 器件从地址 SLA、发送数据缓冲区 MTD、发送字节数 NUMBYTE ; 占用: A 、R0 、R1 、R3 、CY ;不发送子地址 SUBA,直接发送多个数据. IWRNBYTEEXT: MOV A,NUMBYTE MOV R3,A LCALL START ;起动总线 MOV A,SLA LCALL WRBYTE ;发送器件从地址 LCALL CACK JNB ACK,RETWRNE ;无应答则退出 MOV R1,#MTD WRDAE: MOV A,@R1 LCALL WRBYTE ;开始写入数据 LCALL CACK JNB ACK,RETWRNE INC R1 DJNZ R3,WRDAE ;判断写完没有 RETWRNE: LCALL STOP RET;无子地址器件读取 N 字节数据 ;入口参数: 器件从地址 SLA、器件子地址 SUBA、接收字节数 NUMBYTE ;出口参数: 接收数据缓冲区 MTD- 92 - ;占用:A、 R0、 R1、 R2、 R3、 CY ;说明:此函数不发送子址,也不重新启动总线,而是直接读取多个数据. IRDNBYTEEXT: MOV R3,NUMBYTE LCALL START MOV A,SLA INC A LCALL WRBYTE ;发送器件从地址 LCALL CACK JNB ACK,RETRDNE MOV R1,#MRD RDNE1: LCALL RDBYTE ;读操作开始 MOV @R1,A DJNZ R3,SACKE LCALL MNACK ;最后一字节发非应答位 RETRDNE: LCALL STOP ;并结束总线 RET SACKE: LCALL MACK INC R1 SJMP RDNE1;************************************************************************* ******************** ; 请注意 ; ; 占用内部资源: R0,R1,R2,R3,ACC,Cy。 ; 在你的程序里要做以下定义: ; 1、 定义变量: SLA 器件从地址 SUBA 器件子地址 NUMBYTE 读/写的字节数 , 位变量 ACK ; 2、定义常量: SDA SCL 总线位 MTD 发送数据缓冲区首址 MRD 接收数据 缓冲区首址 ; ; (ACK 为调试/测试位,ACK 为 0 时表示无器件应答或总线出错) ; ; 在使用本软件包时,请在你的程序的未尾加入$INCLUDE (VI2C_ASM.INC)即可。 VI2C_ASM.INC 文件 ;复制到 IDE 包含文件所要求的目录(如:工作目录或 INC 目录) ; ; 用户可以对&用户接口子程序&进行裁减,即把自已不使用的接口子程序删掉,以 节省程序空间。 ;************************************************************************* *********************- 93 - END(2)带注释的基本程序(文件名 SJXHW36.ASM);*****************AT24C02 I2C 总 线 存 储 器 读 写 实 验 程 序 ******************************* ;****************** 程 序 调 用 通 用 I2C 总 线 软 件 包 ************************************** ;将 AT24C02 中 256 个字节中依次写入 00~FF, 并把数据读出, 写入外部数据存储器 4000H 为 ; 首 址 的 存 储 器 中 , 即 4000H~40FF 中 的 数 据 为 00~FF*************************************** SDA BIT P1.7 ;I2C 总线定义 SCL BIT P1.6 WRL BIT P1.0 ;写指示灯 RDL BIT P1.1 ;读指示灯 MTD EQU 30H ;发送数据缓冲器 MRD EQU 40H ;接收数据缓冲区 ;定义器件地址,变量 AT24C02 EQU 0A0H ACK BIT 10H SLA DATA 50H SUBA DATA 51H NUMBYTE DATA 52H ORG LJMP ORG MOV MOV MOV MOV MOV MOVX INC MOV CJNE MOV MOV MOV DJNZ MOV INC;应答标志位 ;器件的从地址 ;器件的子地址 ;读/写的字节数变量MAIN:CLEAR:NEXT:0000H MAIN 0100H R5,#00 R6,#00H DPL,#00H DPH,#00H A,#00H @DPTR,A DPTR A,DPH A,#0FFH,CLEAR DPL,#00H DPH,#40H R4,#0F0H R4,$ MTD,R6 R6;页计数器,每页 8 个字节,共写 32 页 ;写入 EEPROM 的数据寄存器,每写一次加 1 ;将数据存储器 0000~FF00 的地址空间清零;清零结束 ;外部数据存储器 4000H 地址 ;用于存放 EEPROM 中读出的数据 ;延时,等待其它芯片复位好- 94 - MOV INC MOV INC MOV INC MOV INC MOV INC MOV INC MOV INC WRAT: MOV MOV MOV MUL MOV MOV CLR SETB LCALL MOV LCALL SETB CLR MOV MOV MOV MUL MOV MOV LCALL MOV LCALL SETB NOP MOV MOV MOV MOVXMTD+1,R6 R6 MTD+2,R6 R6 MTD+3,R6 R6 MTD+4,R6 R6 MTD+5,R6 R6 MTD+6,R6 R6 MTD+7,R6 R6 SLA,#AT24C02 A,R5 B,#08 AB SUBA,A NUMBYTE,#08 WRL RDL IWRNBYTE R2,#12H DELYA WRL RDL SLA,#AT24C02 A,R5 B,#08 AB SUBA,A NUMBYTE,#08 IRDNBYTE R2,#12H DELYA RDL R1,#MRD R7,#08H A,@R1 @DPTR,A;AT24C02 一次最多写入 8 个字节(即 1 页);AT24C02 数据写入操作***;指定器件子地址,此处为“页”地址 ;写指示灯亮 ;读指示灯灭;写指示灯灭 ;读指示灯亮 ;AT24C02 数据读出操作***RDAT:;指定器件子地址,此处为&页&地址;一页数据读取完毕,读指示灯灭 ;将接收数据缓冲区 MRD 中的一页数据写入 ;4000H 为首址的外部数据存储器中LL:- 95 - LO: DELYA: DELYB: DELYC: DELYD:INC INC DJNZ NOP INC CJNE SETB SETB SJMPR1 DPTR R7,LL ;一页数据写入完毕 R5 R5,#32,NEXT WRL RDL LO ;判断 AT24C02 中 32 页数据是否读写完毕? ;读写完毕,读写指示灯灭!PUSH 02H PUSH 02H PUSH 02H DJNZ R2,DELYD POP 02H DJNZ R2,DELYC POP 02H DJNZ R2,DELYB POP 02H DJNZ R2,DELYA RET;延时子程序;------------------------------------------------------------------------------------------------------; MCS-51 单片机模拟 I2C 软件包(V1.1) ; 文件名:VI2C_ASM.INC ; 功能说明:本模拟 I2C 软件包包含了 I2C 操作的底层子程序,使用前要定义 ;好 SCL 和 SDA。在标准 8051 模式(12 Clock)下,对主频要求是不高于 12MHz(即 1 个 ;机器周期 1us);若 Fosc&12MHz 则要增加相应的 NOP 指令数。(总线时序符合 I2C 标 ;准模式,100Kbit/S) ; 版本说明:本版新增了两个子程序,IWRNBYTEEXT,IRDNBYTEEXT 两个子程序, ;这两个子程序用于主从通讯上及一此特殊器件的读写操作较为方便. ;------------------------------------------------------------------------------------------------------;启动 I2C 总线子程序 START: SETB SDA NOP SETB SCL NOP NOP NOP NOP- 96 -;起始条件建立时间大于 4.7us NOP CLR NOP NOP NOP NOP NOP CLR NOP RETSDA ;起始条件锁定时大于 4usSCL;钳住总线,准备发数据;结束总线子程序 STOP: CLR SDA NOP SETB SCL NOP NOP NOP NOP NOP SETB SDA NOP 闲时间大于 4.7us NOP NOP NOP RET ;发送应答信号子程序 MACK: CLR SDA NOP NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL NOP NOP RET;发送结束条件的时钟信号 ;结束总线时间大于 4us;结束总线 ;保证一个终止信号和起始信号的空;将 SDA 置 0;保持数据时间,即 SCL 为高时间大于 4.7us- 97 - ;发送非应答信号 MNACK: SETB SDA NOP NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL NOP NOP RET ;检查应答位子程序 ;返回值,ACK=1 时表示有应答 CACK: SETB SDA NOP NOP SETB SCL CLR ACK NOP NOP MOV C,SDA JC CEND SETB ACK CEND: NOP CLR SCL NOP RET;将 SDA 置 1;保持数据时间, SCL 为高时间大于 4.7us 即;判断应答位;发送字节子程序 ;字节数据放入 ACC ;每发送一字节要调用一次 CACK 子程序,取应答位 WRBYTE: MOV R0,#08H WLP: RLC A ;取数据位 JC WR1 SJMP WR0 ;判断数据位 WLP1: DJNZ R0,WLP NOP RET WR1: SETB SDA ;发送 1 NOP- 98 - SETB NOP NOP NOP NOP NOP CLR WR0: SCL SJMP CLR NOP SETB NOP NOP NOP NOP NOPSCLWLP1 SDA SCL;发送 0CLR SJMPSCL WLP1;读取字节子程序 ;读出的值在 ACC ;每取一字节要发送一个应答/非应答信号 RDBYTE: MOV R0,#08H RLP: SETB SDA NOP SETB SCL NOP NOP NOP ;+1 MOV C,SDA MOV A,R2 CLR SCL RLC A MOV R2,A NOP NOP NOP DJNZ R0,RLP RET;时钟线为高,接收数据位;读取数据位 ;将 SCL 拉低,时间大于 4.7进行数据位的处理;未够 8 位,再来一次- 99 - ;========================================================================= =============== ;========================================================================= =============== ; 以下是用户接口子程序 ; ;无子地址器件写字节数据 ;入口参数: 数据为 ACC、器件从地址 SLA ;占用: A、R0、CY IWRBYTE: PUSH ACC IWBLOOP: LCALL START MOV A,SLA LCALL WRBYTE LCALL CACK JNB ACK,RETWRB POP ACC LCALL WRBYTE LCALL CACK LCALL STOP RET RETWRB: POP ACC LCALL STOP RET ;无子地址器件读字节数据 ;入口参数: 器件从地址 SLA ;出口参数: 数据为 ACC ;占用: A 、R0、R2 、CY IRDBYTE: LCALL START MOV A,SLA INC A LCALL WRBYTE LCALL CACK JNB ACK,RETRDB LCALL RDBYTE LCALL MNACK RETRDB: LCALL STOP RET;起动总线 ;发送器件从地址 ;无应答则跳转 ;写数据;发送器件从地址;进行读字节操作 ;发送非应信号 ;结束总线;向器件指定子地址写 N 字节数据 ;入口参数: 器件从地址 SLA、器件子地址 SUBA 、发送数据缓冲区 MTD、发送字节数 NUMBYTE- 100 - ; 占用: A 、R0 IWRNBYTE: MOV MOV LCALL MOV LCALL LCALL JNB MOV LCALL LCALL MOV MOV LCALL LCALL JNB INC DJNZ LCALL RET、R1 、R3 、CY A,NUMBYTE R3,A START A,SLA WRBYTE CACK ACK,RETWRN A,SUBA WRBYTE CACK R1,#MTD A,@R1 WRBYTE CACK ACK,IWRNBYTE R1 R3,WRDA STOP;起动总线 ;发送器件从地址 ;无应答则退出 ;指定子地址WRDA:;开始写入数据;判断写完没有RETWRN:;向器件指定子地址读取 N 字节数据 ;入口参数: 器件从地址 SLA、器件子地址 SUBA、接收字节数 NUMBYTE ;出口参数: 接收数据缓冲区 MTD ;占用:A、 R0、 R1、 R2、 R3、 CY IRDNBYTE: MOV R3,NUMBYTE LCALL START MOV A,SLA LCALL WRBYTE ;发送器件从地址 LCALL CACK JNB ACK,RETRDN MOV A,SUBA ;指定子地址 LCALL WRBYTE LCALL CACK LCALL START ;重新起动总线 MOV A,SLA INC A ;准备进行读操作 LCALL WRBYTE LCALL CACK JNB ACK,IRDNBYTE MOV R1,#MRD RDN1: LCALL RDBYTE ;读操作开始 MOV @R1,A- 101 - RETRDN: SACK:;NOP ;NOP DJNZ LCALL LCALL RET LCALL INC SJMP;+1 ;+1 R3,SACK MNACK STOP MACK R1 RDN1 ;最后一字节发非应答位 ;并结束总线;无子地址器件写 N 字节数据 ;入口参数: 器件从地址 SLA、发送数据缓冲区 MTD、发送字节数 NUMBYTE ; 占用: A 、R0 、R1 、R3 、CY ;不发送子地址 SUBA,直接发送多个数据. IWRNBYTEEXT: MOV A,NUMBYTE MOV R3,A LCALL START ;起动总线 MOV A,SLA LCALL WRBYTE ;发送器件从地址 LCALL CACK JNB ACK,RETWRNE ;无应答则退出 MOV R1,#MTD WRDAE: MOV A,@R1 LCALL WRBYTE ;开始写入数据 LCALL CACK JNB ACK,RETWRNE INC R1 DJNZ R3,WRDAE ;判断写完没有 RETWRNE: LCALL STOP RET;无子地址器件读取 N 字节数据 ;入口参数: 器件从地址 SLA、器件子地址 SUBA、接收字节数 NUMBYTE ;出口参数: 接收数据缓冲区 MTD ;占用:A、 R0、 R1、 R2、 R3、 CY ;说明:此函数不发送子址,也不重新启动总线,而是直接读取多个数据. IRDNBYTEEXT: MOV R3,NUMBYTE LCALL START MOV A,SLA- 102 - RDNE1:RETRDNE: SACKE:INC LCALL LCALL JNB MOV LCALL MOV DJNZ LCALL LCALL RET LCALL INC SJMPA WRBYTE CACK ACK,RETRDNE R1,#MRD RDBYTE @R1,A R3,SACKE MNACK STOP MACK R1 RDNE1;发送器件从地址;读操作}

我要回帖

更多关于 单片机左移指令 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信