微机原理与单片机技术课程实验教学

76794973

贡献于2014-12-29

字数:0 关键词: 嵌入式开发 教学

第二部分 微机原理与单片机技术课程实验教学 - 1 - 第一章 基础实验 单元 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 - 2 - 第二章 综合实验 单元 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 - 3 - 第三章 课程设计 题目一 电子音乐演奏……………………………………………253 题目二 智能温度测量……………………………………………259 题目三 红外线通信控制…………………………………………273 题目四 基于 ISD1420 的语音复读控制…………………………280 题目五 交通灯控制………………………………………………292 - 4 - 第一章 基础实验 单元一 软件实验 实验一 清零程序 一、实验目的: 掌握汇编语言设计和调试方法,熟悉键盘操作。 二、实验内容: 把 2000H~20FFH 的内容清零。 三、实验程序框图 四、实验步骤: 用连续或单步方式运行程序,检查 2000~20FF 中执行程序 前后的内容变化。 五、思考:假使把 1000H~10FFH 中的内容改成 FF,如何修改程序,请分别 用连续和单步方式运行程序来完成校验证。 六、程序清单 (1)基本程序(文件名 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 - 5 - CJNE R0,#00H,LOO1 LOOP:SJMP LOOP END (2)带注释的基本程序(文件名 SJXSW01.ASM,与 SW01.ASM 相比,为方便 程序阅读仅对注释部分做了详细的注释而已,后同) ORG 0000H LJMP SE01 ORG 0640H SE01: MOV R0,#00H ;(00H)送 R0,R0 为计数器 MOV DPTR,#2000H ;(2000H)送 DPTR LOO1: CLR A ;累加器 A 清零 MOVX @DPTR,A ;存储空间内容清零 INC DPTR ;DPTR 加 1 INC R0 ;R0 加 1 CJNE R0,#00H,LOO1 ;若 R0 不等于 00,则跳转至 LOO1 继续循环 LOOP: SJMP LOOP END - 6 - 实验二 拆字程序 一、实验目的:掌握汇编语言设计和调试方法。 二、实验内容:把 2000H 的内容拆开,高位送 2001H 低位,低位送 2002H 低 位,2001H、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 - 7 - (2)带注释的基本程序(文件名 SJXSW02.ASM) ORG 0000H LJMP SE02 ORG 0660H SE02: MOV DPTR,#2000H MOVX A,@DPTR ;(2000)送 A 中 MOV B,A ;A 送 B,B 保存 A 的内容 SWAP A ;A 的高位与低位交换 ANL A,#0FH ;屏蔽高位,保留低位 INC DPTR ;DPTR 加 1 MOVX @DPTR,A ;A 送 2001 中 INC DPTR MOV A,B ;B 送 A 中,取出 A 的原值 ANL A,#0FH ;屏蔽高位,保留低位 MOVX @DPTR,A LOOP: SJMP LOOP END - 8 - 实验三 拼字程序 一、实验目的:进一步掌握汇编语言设计和调试方法。. 二、实验内容:把 2000H、2001H 的低位分别送入 2002H 高低位,一般本程 序用于把显示缓冲区的数据取出拼装成一字节。 三、实验程序框图 四、实验步骤:单步或用断点方式运行程序,检查 2002H 内容变化情况。 五、思考:如何用断点方式调试本程序。 六、程序清单 (1)基本程序(文件名 SW03.ASM) ORG 0000H LJMP START ORG 0680H START: 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 (2)带注释的基本程序(文件名 SJXSW03.ASM) ORG 0000H LJMP START - 9 - ORG 0680H START: MOV DPTR,#2000H MOVX A,@DPTR ;(2000H)内容送入 A 中 ANL A,#0FH ;(2000H)内容屏蔽高位,保留低位 SWAP A ;高位与低位交换 MOV B,A ;(2000H)内容低位保存在 B 的高位中 INC DPTR MOVX A,@DPTR ;(2001H)内容送入 A 中 ANL A,#0FH ;(2001H)内容屏蔽高位,保留低位 ORL A,B ;A 与 B 逻辑或运算,结果保留在 A 中 INC DPTR MOVX @DPTR,A ;A 送 2002H END - 10 - 实验四 数据区传送子程序 一、实验目的:掌握 RAM 中的数据操作。 二、实验内容:把 R2、R3 源 RAM 区首址内的 R6、R7 字节数据传送到 R4、 R5 目的 RAM 区。 三、实验程序框图 开始 源地址内容送A A还目的地址 源地址低8位R3=0FFH? 源地址高8位R2加1 源地址低8位R3加1 目的地址低8位 R5=0FFH? 目的地址高8位R4加1 目的地址低8位R5加1 计数器低8位R7=00H? 计数器高8位R6=00H? R7减1 R6减1 R7减1结束 Y Y Y Y N N N N 四、实验步骤 在 R2、R3 中输入源首址(例如 0000H),R4、R5 中输入目的地址(例如 2000H),R6、R7中输入字节数(例如lFFFH),运行程序,检查0000H~lFFFH 中内容是否和 2000H~3FFFH 中内容完全一致。 五、程序清单 (1)基本程序(文件名 SW04.ASM) ORG 0000H LJMP SE22 ORG 07B0H SE22: MOV DPL,R3 MOV DPH,R2 MOVX A,@DPTR MOV DPL,R5 - 11 - MOV DPH,R4 MOVX @DPTR,A CJNE R3,#0FFH,LO42 INC R2 LO42: INC R3 CJNE R5,#0FFH,LO43 INC R4 LO43: INC R5 CJNE R7,#00H,LO44 CJNE R6,#00H,LO45 LOOP: SJMP LOOP NOP LO44: DEC R7 SJMP SE22 LO45: DEC R7 DEC R6 SJMP SE22 END (2)带注释的基本程序(文件名 SJXSW04.ASM) ORG 0000H LJMP SE22 ORG 07B0H SE22: MOV DPL,R3 ;源地址低 8 位 R3 送 DPL MOV DPH,R2 ;源地址高 8 位 R2 送 DPH MOVX A,@DPTR ;源地址内容送 A MOV DPL,R5 ;目的地址低 8 位 R5 送 DPL MOV DPH,R4 ;目的地址高 8 位 R4 送 DPH MOVX @DPTR,A ;目的地址内容送 A CJNE R3,#0FFH,LO42 ;源地址低 8 位 R3 不等于 0ff,则跳转 INC R2 ;源地址高 8 位 R2 加 1 LO42: INC R3 ;源地址低 8 位 R3 加 1 CJNE R5,#0FFH,LO43 ;目的地址低 8 位 R5 不等于 0ff,则跳转 INC R4 ;目的地址高 8 位 R4 加 1 LO43: INC R5 ;目的地址低 8 位 R5 加 1 CJNE R7,#00H,LO44 ;计数器低 8 位 R7 不等于 0,则跳转 CJNE R6,#00H,LO45 ;计数器高 8 位 R6 不等于 0,则跳转 LOOP: SJMP LOOP NOP LO44: DEC R7 ;计数器低 8 位 R7 减 1 SJMP SE22 LO45: DEC R7 ;计数器低 8 位 R7 减 1 DEC R6 ;计数器高 8 位 R6 减 1 SJMP SE22 END - 12 - 单元 2 P 口及控制实验 实验五 P1 口亮灯实验 一、实验目的 (1)学习 P1 口的使用方法; (2)学习延时子程序的编写。 二、实验预备知识 (l)Pl 口为准双向口,每一位都可独立地定义为输入或输出,在作输 入线使用前,必须向锁存器相应位写入“1”,该位才能作为输入。 (2)本实验中延时子程序采用指令循环来实现,机器周期(12/6MHz) *指令所需机器周期数*循环次数,在系统时间允许的情况下可以采用此方法。 三、实验内容 P1 口作为输出口,接 8 只发光二极管,编写程序,使发光二极管循环 点亮。 四、实验程序框图 五、实验接线图 - 13 - 六、实验步骤 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 - 14 - END (2)带注释的基本程序(文件名 SJXHW01.ASM) ORG 0000H LJMP SE18 ORG 0790H SE18: MOV P1,#0FFH ;P1 口置高电平,P1 口初始化 LO34: MOV A,#0FEH LO33: MOV P1,A ;L1 灯亮,#0FEH 中的(E)=1110,其中 0 驱使 L1 灯亮 LCALL SE19 ;延时 RL A ;A 左循环移位 SJMP LO33 ORG 07A0H SE19: MOV R6,#0A0H ;延时程序 LO36: MOV R7,#0FFH LO35: DJNZ R7,LO35 DJNZ R6,LO36 RET END - 15 - 实验六 P1口转弯灯实验 一、实验目的:进一步了解 P1 口的使用,学习汇编语言编程方法及调试技 巧。 二、实验内容 P1.0 接开关上拨为 5V,左转弯灯闪亮,P1.1 接开关为 5V 时右转弯灯 闪亮,P1.0,P1.1 接开关同时接 5V 或接地时,转弯灯均不闪亮。 三、实验程序框图 开始 P1口初始化 ,关灯 只是P1.0为高电平吗? 只是P1.1为高电平吗? 关灯 标志位A为1吗? 标志位B为1吗? 关灯 关灯 延时 延时 标志位A置为0 标志位B置为0 开L1,L2灯 关L5,L6灯 延时 标志位A置为1 关L1,L2灯 开L5,L6灯 延时 标志位B置为1 Y YY Y N N N N 四、实验接线图 - 16 - 五、实验步骤 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 PX00: MOV P1,#0FFH PX03: 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 PX04: SETB P1.4 SETB P1.5 SETB P1.6 SETB P1.7 MOV R2,#20H LCALL DELY CLR 00H AJMP PX03 PX01: CJNE A,#02H,PX02 JB 01H,PX05 SETB P1.4 - 17 - 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: 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 (2)带注释的基本程序(文件名 SJXHW02.ASM) ORG 0000H LJMP PX00 ORG 0C30H PX00: MOV P1,#0FFH ;P1 口初始化,置为高电平 PX03: MOV A,P1 ;取出当前 P1 口的状态 MOV B,A ANL A,#03H ;A 与#03H 逻辑与操作,保留 P1.0 和 P1.1 状态 CJNE A,#01H,PX01 ;A 与#01H 不相等,则跳转 JB 00H,PX04 ;标志位 A 为 1 跳转,位寻址 - 18 - CLR P1.4 ;点亮 L1 灯 CLR P1.5 ;点亮 L2 灯 SETB P1.6 ;L5 灯灭 SETB P1.7 ;L6 灯灭 MOV R2,#20H ;延时 LCALL DELY SETB 00H ;标志位 A 置 1 LJMP PX03 PX04: SETB P1.4 ;L1 置为高电平,L1 灯灭 SETB P1.5 ;L2 置为高电平,L2 灯灭 SETB P1.6 ;L5 置为高电平,L5 灯灭 SETB P1.7 ;L6 置为高电平,L6 灯灭 MOV R2,#20H ;延时 LCALL DELY CLR 00H ;标志位 A 清零 AJMP PX03 PX01: CJNE A,#02H,PX02 ;A 与#02H 不相等,则跳转 JB 01H,PX05 ;标志位 B 为 1,则跳转 SETB P1.4 ;L1 灯灭 SETB P1.5 ;L2 灯灭 CLR P1.6 ;L5 灯亮 CLR P1.7 ;L6 灯亮 MOV R2,#20H ;延时 LCALL DELY SETB 01H ;标志位 B 置为 1 LJMP PX03 PX05: SETB P1.4 SETB P1.5 SETB P1.6 SETB P1.7 MOV R2,#20H LCALL DELY CLR 01H ;标志位 B 置为 0 LJMP PX03 PX02: SETB P1.4 SETB P1.5 SETB P1.6 SETB P1.7 LJMP PX03 DELY: PUSH 02H ;堆栈方式的延时程序 DEL2: PUSH 02H DEL3: PUSH 02H DEL4: DJNZ R2,DEL4 POP 02H - 19 - DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END - 20 - 实验七 P3.3口输入,P1 口输出 一、实验目的:掌握 P3 口、P1 口简单使用。 二、实验内容: P3.3 口输入一脉冲,P1 口按 16 进制加一方式点亮发光二 极管。 三、实验程序框图 - 21 - 四、实验接线图 五、实验步骤 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 J100: MOV A,#00H J101: JB P3.3,J101 MOV R2,#10H LCALL DELY JB P3.3,J101 J102: 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 J101 - 22 - 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 (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 - 23 - 实验八 继电器控制 一、实验目的:掌握用继电器的基本方法和编程。 二、实验内容:利用 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 LOOP: CLR P1.0 MOV R2,#30H LCALL DELY SETB P1.0 MOV R2,#30H LCALL DELY SJMP LOOP DELY: PUSH 02H DEL2: PUSH 02H - 24 - DEL3: PUSH 02H DEL4: 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 LOOP: CLR P1.0 ;p1.0 用于控制继电器,P1.0 置为 0,L1 灯亮 MOV R2,#30H ;延时 LCALL DELY SETB P1.0 ;P1.0 置为 1,L2 灯亮 MOV R2,#30H LCALL DELY SJMP LOOP ;循环 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 - 25 - 单元三 中断系统实验 实验九 中断基础实验 一、实验目的: 掌握 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 秒,退出中断程序时,使发光管灭。 四、实验程序框图 五、实验接线图 - 26 - 六、实验步骤 把“总线插孔”框中的 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 ;外中断 0 入口地址 LJMP INTER0 org 0660h MAIN: JB P1.3,MAIN1 ;判断是电平触发还是沿触发 clr it0 ;P1.3=0 低电平触发 lJMP MAIN2 MAIN1: SETB it0 ;中断初始化,P1.3=1 下降沿边缘触发 MAIN2: ORL IE,#81H ORL IP,#02H lJMP MAIN INTER0: CLR EA ;中断处理程序 SETB P1.2 - 27 - 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 - 28 - 实验十 电脑时钟(定时器、中断综合实验) 一、实验目的 熟悉 MCS-5l 定时器和中断初始化编程方法,了解定时器的应用实时程 序的设计与调试技巧。 二、实验内容 编写程序,从实验系统键盘上输入时间初值,用定时器产生 0.lS 定时 中断,对时钟计数器计数,并将数值实时地送数码管显示。 三、实验程序框图 四、实验步骤 连续运行程序,在键盘上输入时间初值“时、分、秒”,按执行键 EX /FV 执行,数码管实时显示时间值。 五、思考 (1)电子钟走时精度和程序中那些常数有关? (2)修改程序使定时器工作方式改变,调节有关参数,进一步提高精 度。 六、程序清单 (1)基本程序(文件名 SW10.ASM) ORG 0000H LJMP CHK0 - 29 - 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 - 30 - CLOCK: 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 DONE: POP ACC POP PSW RETI ORG 0D50H SSEE: SETB RS1 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: MOV R1,#20H MOV A,30H CPL A MOVX @R1,A MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF MOVC A,@A+DPTR - 31 - 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 X3: 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 X31: MOVX @R0,A INC DPTR PUSH DPL PUSH DPH RET X30: DEC R1 MOV A,R1 SJMP X31 X2: MOV R6,#50H X0: ACALL XLE JNB ACC.5,XX0 DJNZ R6,X0 MOV R6,#20H MOV R0,#59H MOVX A,@R0 - 32 - MOV R0,A MOV A,@R0 MOV R7,A MOV A,#10H MOV @R0,A X1: ACALL XLE JNB ACC.5,XX1 DJNZ R6,X1 MOV A,R7 MOV @R0,A SJMP X2 XX1: MOV R6,A MOV A,R7 MOV @R0,A MOV A,R6 XX0: RET XLE: 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 X10: 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,#20H - 33 - DEC R2 SJMP X13 X12: MOV R4,#0FH x11: MOV R2,04H MOV R4,03H X13: MOV R1,#48H MOV A,R2 MOVX @R1,A INC R1 MOV A,R3 MOVX @R1,A MOV A,R4 RET LS3: DB 07H,04H,08H,05H,09H,06H,0AH DB 0BH,01H,00H,02H,0FH,03H,0EH DB 0CH,0DH DIS: PUSH DPH PUSH DPL SETB RS1 MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#LS0 LS2: 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 LS1: 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 - 34 - RET LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH KEY: SETB RS1 MOV R2,#0FEH MOV R3,#08H MOV R0,#00H LP1: 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 XP33: MOV A,#20H XP3: CLR RS1 RET LP0: CPL A JB ACC.0,XP0 MOV A,#00H SJMP LPP XP0: JB ACC.1,XP1 MOV A,#08H SJMP LPP XP1: JB ACC.2,XP2 MOV A,#10H SJMP LPP XP2: JB ACC.3,XP33 MOV A,#18H LPP: ADD A,R0 CLR RS1 CJNE A,#10H,LX0 LX0: JNC XP35 MOV DPTR,#LS3 - 35 - MOVC A,@A+DPTR XP35: RET LCK0: 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 - 36 - 单元四 定时/计数器系统实验 实验十一 定时/计数器基础实验 一、 实验目的: 掌握 MCS-51 单片机内部定时/计数器的程序设计与调试方 法。 二、实验预备知识 MCS-51 单片机有两个 16 位的定时计数器 T0 和 T1,它们都有定时和对 外部事件进行计数的功能,可用于定时控制、对外部事件检测和计数等场合。 计数和定时实质上都是对脉冲信号进行计数,只不过脉冲源不同而已。 当工作在定时方式时,计数脉冲来自单片机的内部,即振荡器信号 12 分频后作计数脉冲,每个机器周期的时间使计数器加 1,由于计数脉冲的频 率是固定的(即每个脉冲为 1 个机器周期的时间),故可通过设定计数值来 实现定时功能; 当工作在计数方式时,计数脉冲来自单片机的引脚,每当引脚上出现一 个脉冲时,计数器加 1,从而实现计数功能。可以通过编程来指定定时/计 数器的功能,以及它的工作方式。 中断申请标志 TF,在中断响应后有硬件中断清零,查询方式时必须由 软件清零。 三、实验内容 利用定时器 1,通过对外部脉冲的计数,利用查询方式,实现在 P1.0 引脚上产生输出信号。 四、实验程序框图 五、实验接线图 - 37 - 六、实验步骤 把 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 ;T1 计数,工作方式 2 MOV TH1,#0FEH ;赋初值 MOV TL1,#0FEH SETB TR1 ;启动 DEL: JBC TF1 ,REP ;查询计数溢出 AJMP DEL REP: CPL P1.0 ;取反 AJMP DEL END - 38 - 实验十二 脉冲计数(定时/计数器实验) 一、实验目的 熟悉单片机内部定时/计数器功能,掌握初始化编程方法。 二、实验内容 把定时器 0 外部输入的脉冲进行计数,并送显示器显示。 三、实验程序框图实验程序框图 四、实验接线图 五、实验步骤 P3.4 依次接脉冲输出插孔(单脉冲与时钟单元),执行程序,观察数码 - 39 - 管上计数脉冲的速度及个数。 快捷连线说明:P3.4→脉冲输出孔 六、思考 修改程序使显示器上可显示到 999999 个脉冲个数。 七、程序清单 (1)基本程序(文件名 SW09.ASM) ORG 0000H LJMP SE15 ORG 06E0H SE15: 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 LO29: 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 ZOY0: CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,#10H LO30: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6 - 40 - 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: SETB RS1 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 - 41 - 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 END - 42 - 单元五 串并转换实验 实验十三 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 SIB CLK Q0 Q1 Q2 Q3 Q4 Q5 Q6 0 X X X 0 0 0 0 0 0 0 1 1 1 ↑ 1 Q0 Q1 Q2 Q3 Q4 Q5 Q6 1 0 X ↑ 0 Q0 Q1 Q2 Q3 Q4 Q5 Q6 1 X 0 ↑ 0 Q0 Q1 Q2 Q3 Q4 Q5 Q6 - 43 - 五、实验步骤 用双头线连接,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 0000H LJMP MAIN ORG 0100H MAIN: MOV 30H,#00H ;给显示缓冲区赋初值 MOV 31H,#00H L0: SETB P1.0 ;164 清零端‘CLR’置 1(低电平有效) INC 30H MOV A,30H CJNE A,#0AH,AA MOV 30H,#00H INC 31H MOV A,31H CJNE A,#0AH,AA MOV 30H,#00H MOV 31H,#00H ;使 31H,30H 单元内容在 00~99 循环变化 AA: MOV SCON,#00H ;设置串行口 MOV R7,#02H ;设置要发送的字节个数 MOV R0,#30H ;设置地址指针 MOV DPTR,#TAB LOOP: MOV A,@R0 MOVC A,@A+DPTR ;取出字型码 MOV SBUF,A ;发送 WAIT: JNB TI,WAIT ;等待一帧发关完毕 CLR TI INC R0 ;指向下一个字形码 - 44 - DJNZ R7,LOOP MOV R2,#30H ;调用延时子程序 LCALL DELYA CLR P1.0 ;164 清零端'CLR'置 0(低电平有效) SJMP L0 TAB: 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 0000H LJMP MAIN ORG 0100H MAIN: MOV 30H,#00H ;给显示缓冲区赋初值 MOV 31H,#00H L0: SETB P1.0 ;P1.0 置为高电平 INC 30H MOV A,30H CJNE A,#0AH,AA MOV 30H,#00H INC 31H MOV A,31H CJNE A,#0AH,AA MOV 30H,#00H MOV 31H,#00H ;使 31H,30H 单元内容在 00~99 循环变化 AA: MOV SCON,#00H ;设置串行口 MOV R7,#02H ;设置要发送的字节个数 MOV R0,#30H ;设置地址指针 MOV DPTR,#TAB LOOP: MOV A,@R0 MOVC A,@A+DPTR ;取出字型码 - 45 - MOV SBUF,A ;发送 WAIT: JNB TI,WAIT ;等待一帧发关完毕 CLR TI INC R0 ;指向下一个字形码 DJNZ R7,LOOP MOV R2,#30H ;调用延时子程序 LCALL DELYA CLR P1.0 ;164 清零端'CLR'置 0(低电平有效) SJMP L0 TAB: 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 - 46 - 实验十四 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)相连。 四、实验接线原理图 - 47 - 五、实验程序框图: 六、实验步骤 P1.0~P1.7 接 D7~D0,P3 .0接 Q7,P3. 1接 CP (CLK),,P3.2 接 S/L。 调入程序 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 0000H LJMP MAIN ORG 0500H MAIN: MOV R7,#10 ;设置并行读入数据个数为 10 个 MOV R0,#50H ;设置内部 RAM 数据区首址,接收外部并行输入数据 MOV 40H,#00H START: INC 40H MOV P1,40H ;将 P1 口输出的数据作为 74LS165 的并行输入 CLR P3.2 ;并行置入数据,S/L=0 - 48 - SETB P3.2 ;允许串行移位,S/L=0 RXDATA: MOV SCON,#10H ;设串行口方式 0,允许接收,启动接收过程 WAIT: JNB RI,WAIT ;未接收完一帧,循环等待 CLR RI ;清 RI 标志,准备下次接收 MOV A,SBUF ;读入数据 MOV @R0,A ;送至 RAM 缓冲区 INC R0 ;指向下一个地址 DJNZ R7,START ;10 个数据未读完重新并行置入 SJMP $ ;10 个数据读完,程序就地循环 END ;查看 CPU 内部存储区 50H~59H 数据是否为 01~0AH (2)带注释的基本程序(文件名 SJXHW39.ASM) ORG 0000H LJMP MAIN ORG 0500H MAIN: MOV R7,#10 ;设置并行读入数据个数为 10 个 MOV R0,#50H ;设置内部 RAM 数据区首址,接收外部并行输入数据 MOV 40H,#00H START: INC 40H MOV P1,40H ;将 P1 口输出的数据作为 74LS165 的并行输入 CLR P3.2 ;并行置入数据,S/L=0 SETB P3.2 ;允许串行移位,S/L=0 RXDATA: MOV SCON,#10H ;设串行口方式 0,允许接收,启动接收过程 WAIT: JNB RI,WAIT ;未接收完一帧,循环等待 CLR RI ;清 RI 标志,准备下次接收 MOV A,SBUF ;读入数据 MOV @R0,A ;送至 RAM 缓冲区 INC R0 ;指向下一个地址 DJNZ R7,START ;10 个数据未读完重新并行置入 SJMP $ ;10 个数据读完,程序就地循环 END ;查看 CPU 内部存储区 50H~59H 数据是否为 01~0AH - 49 - 第二章 综合实验 单元一 并口扩展 实验一 工业顺序控制 一、实验目的 掌握工业顺序控制程序的简单编程,中断的使用。 二、实验预备知识 在工业控制中,象冲压、注塑、轻纺、制瓶等生产过程,都是一些继续 生产过程,按某种顺序有规律地完成预定的动作,对这类继续生产过程的控 制称顺序控制,象注塑机工艺过程大致按“合模→注射→延时→开模→产伸 →产退”顺序动作,用单片机最易实现。 三、实验内容 由 P1.0~1.6 控制注塑机的七道工序,现模拟控制七只发光二极的点亮, 低电平有效,设定每道工序时间转换为延时,P3.4 为开工启动开关,高电 平启动。P3.3 为外部故障输入模拟开关,低电平报警,P1.7 为报警声音输 出,设定 6 道工序只有一位输出,第七道工序三位有输出。 四、实验程序框图 - 50 - - 51 - 五、实验接线图 六、实验步骤 将 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 PO10: MOV P1,#7FH ORL P3,#00H PO11: JNB P3.4,PO11 - 52 - ORL IE,#84H ORL IP,#04H MOV PSW,#00H MOV SP,#53H PO12: 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 PO16: MOV B,R2 PO17: MOV P1,#7FH MOV 20H,#0A0H PO18: 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 PO19: MOV R2,#10H ACALL DELY RET PO1A: MOV R2,#06H ACALL DELY RET PO1B: MOV R2,#30H ACALL DELY RET DELY: PUSH 02H DEL2: PUSH 02H - 53 - DEL3: PUSH 02H DEL4: 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 ;外部中断 1 入口地址 LJMP PO16 ORG 0190H PO10: MOV P1,#7FH ;P1 口初始化 ORL P3,#00H ;P3 口初始化 PO11: JNB P3.4,PO11 ;P3.4 为 1,表示开工,跳出循环 ORL IE,#84H ;开全局中断和外部中断 1 ORL IP,#04H ;外部中断 1 为高级中断 MOV PSW,#00H ;PSW 初始化 MOV SP,#53H ;堆栈指针初始化 PO12: MOV P1,#7EH ;工序 1,L1 灯亮 ACALL PO1B ;延时 MOV P1,#7DH ;工序 2,L2 灯亮 ACALL PO1B MOV P1,#7BH ;工序 3,L3 灯亮 ACALL PO1B MOV P1,#77H ;工序 4,L4 灯亮 ACALL PO1B MOV P1,#6FH ;工序 5,L5 灯亮 ACALL PO1B MOV P1,#5FH ;工序 6,L6 灯亮 ACALL PO1B MOV P1,#0FH ;工序 7,L5,L6,L7 灯亮 ACALL PO1B SJMP PO12 PO16: MOV B,R2 ;外部中断 1 程序,首先保护现场 PO17: MOV P1,#7FH ;关闭输出 MOV 20H,#0A0H ;计数,每隔一段时间检查一次 P3.3 状态 PO18: SETB P1.7 ;P1.7 置为 1,报警 ACALL PO1A - 54 - CLR P1.7 ;P1.7 置为 0,报警声音暂停 ACALL PO1A DJNZ 20H,PO18 CLR P1.7 ACALL PO1A JNB P3.3,PO17 ;P3.3 为高电平时报警清除 MOV R2,B ;现场恢复 RETI PO19: MOV R2,#10H ;延时程序 ACALL DELY RET PO1A: MOV R2,#06H ACALL DELY RET PO1B: MOV R2,#30H ACALL DELY RET 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 - 55 - 实验二 8255 A.B.C 口输出方波 一、 实验目的 掌握可编程 I/O 接口芯片 8255 的接口原理使用,熟悉对 8255 初始化 编程和输入/输出软件的设计为法。 二、 实验内容 在 8255 的 A.B.C 口用示波器或万用表可测出每个口线的高 低电平变化。 三、 实验程序框图 开始 8255控制口初始化 ,55送入A 8255PA口地址送DPTR A送入8255PA口 DPTR加1,A送入8255PB口 DPTR加1,A送入8255PC口 延时 A取反 中断开始 保护现场 关输出 报警 故障清除了吗? 恢复现场 中断返回 Y N 中断服务子程序 Y 四、实验原理图 - 56 - 五、实验步骤 实验接线内部已经连好,执行程序,用示波器或万用表测量 8255A.B.C 口应有高低电平变化(或用 8255A.B.C 口分别用导线连至 Ll~L8,观察发 光二极管变化情况)。 六、 思考 输出 1KHz,点空比为 25%从 PA0 输出,编写程序实验。 七、 程序 (1)基本程序(文件名 HW05.ASM ) ORG 0000H LJMP SE09 ORG 0580H SE09: MOV DPTR,#0FF2BH MOV A,#80H MOVX @DPTR,A MOV A,#55H LO15: 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 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 (2)带注释的基本程序(文件名 SJXHW05.ASM) ORG 0000H LJMP SE09 ORG 0580H SE09: MOV DPTR,#0FF2BH ;8255 控制口初始化 MOV A,#80H MOVX @DPTR,A - 57 - MOV A,#55H ;55 送入 A,55 驱动 L2,L4,L6,L8 灯亮 LO15: MOV DPTR,#0FF28H ;8255PA 口地址送 DPTR MOVX @DPTR,A ;A 送 8255PA 口 INC DPTR ;DPTR 加 1,为 8255PB 口地址 MOVX @DPTR,A ;A 送 8255PB 口 INC DPTR ;DPTR 加 1,为 8255PC 口地址 MOVX @DPTR,A ;A 送 8255PC 口 MOV R2,#30H ;延时 LCALL DELY CPL A ;A 取反 SJM P LO15 ORG 05A0H 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 - 58 - 实验三 8255 PA 口控制 PB 口 一、实验目的 掌握单片机系统中扩展外围芯片的方法,了解 8255 芯片的 结构及编程方法。 二、实验内容 用 8255 PA 口作开关量输入口,PB 口作输出口。 三、实验程序框图 开始 8255初始化 A口内容读出 A口状态向B口输 出 循环 四、实验连线图 - 59 - 五、实验步骤 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.ASM ORG 0000H LJMP SE17 ORG 0770H SE17: MOV DPTR,#0FF2BH MOV A,#90H MOVX @DPTR,A LO32: MOV DPTR,#0FF28H MOVX A,@DPTR INC DPTR MOVX @DPTR,A SJMP LO32 END (2)带注释的基本程序(文件名 SJXHW06.ASM) ORG 0000H LJMP SE17 ORG 0770H SE17: MOV DPTR,#0FF2BH ;8255 控制口初始化 MOV A,#90H MOVX @DPTR,A LO32: MOV DPTR,#0FF28H ;PA 口地址送入 DPTR MOVX A,@DPTR ;PA 口状态送入 A 中 INC DPTR ;DPTR 加 1,DPTR 为 PB 口地址 MOVX @DPTR,A ;A(PA 口状态)送入到 PB 口 SJMP LO32 END - 60 - 实验四 简单 I/O 口扩展 一、实验目的 学习单片机系统中扩展简单 I/O 口的方法; 学习数据输入输出程序的 编制方法。 二、实验内容 利用 74LS244 作为输入口,读取开关状态,并将此状态,通过 74LS273 再驱动发光二极管显示出来。 三、实验程序框图 四、实验接线图 - 61 - 五、实验步骤 用扁平线将 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.ASM ORG 0000H LJMP GOD0 ORG 0B80H GOD0: MOV DPTR,#0FF80H MOVX A,@DPTR MOV DPTR,#0FF90H MOVX @DPTR,A SJMP GOD0 END (2)带注释的基本程序(文件名 SJXHW08.ASM) ORG 0000H LJMP GOD0 ORG 0B80H GOD0: MOV DPTR,#0FF80H MOVX A,@DPTR ;读出 FF80 状态 MOV DPTR,#0FF90H MOVX @DPTR,A ;FF80 状态送入 FF90 SJMP GOD0 END - 62 - 实验五 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) - 63 - 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 SE11: MOV SP,#53H ;堆栈初始化 mov p2,#0ffh ;P2 口初始化 MOV A,#81H ;8255 控制口初始化 MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#00H ;显示缓冲区初值 MOV 7DH,#08H MOV 7CH,#00H MOV 7BH,#09H MOV 7AH,#10H MOV 79H,#10H LO18: LCALL SSEE ;调用显示子程序 MOV A,#00H MOV DPTR,#0FF80H ;0809 的 0 通道采样 MOVX @DPTR,A MOV R7,#0FFH ;延时 LO17: DJNZ R7,LO17 MOVX A,@DPTR ;取出采样值 MOV R0,#79H LCALL PTDS SJMP LO18 ;采样值送显示缓冲区 ORG 05D0H PTDS: MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH - 64 - MOV @R0,A INC R0 RET ORG 0D50H ;显示子程序 SSEE: SETB RS1 ;换工作区 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH END - 65 - 实验六 D/A 0832 转换实验 一、实验目的 (1)了解 D/A 转换与单片机的接口方法; (2)了解 D/A 转换芯片 0832 的性能及编程方法; (3)了解单片机系统中扩展 D/A 转换芯片的基本方法。 二、实验内容 利用 0832 输出一个从 0V 开始逐渐升至 5V 再降至 0V 的可变电压。 三、实验接线图 四、实验程序框图 开始 0832初始化 显示 转换显示加 1 输入是否到FF 转换显示减 1 Y N Y 输出是否减到00 N - 66 - 五、实验步骤 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 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 MOV R0,#79H LCALL PTDS LCALL SSEE MOV R2,#08H LCALL DELYA INC R6 CJNE R6,#0FFH,LO21 LO22: 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,LO22 - 67 - SJMP LO20 ;ORG 0620H PTDS: MOV R1,A LCALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET ORG 0D50H SSEE: SETB RS1 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH DELYA: PUSH 02H DELYB: PUSH 02H DELYC: PUSH 02H DELYD: DJNZ R2,DELYD LCALL SSEE POP 02H - 68 - 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 ;拆送后送显示缓冲区 - 69 - LCALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET ORG 0D50H ;显示子程序 SSEE: SETB RS1 ;换工作区 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH DELYA: PUSH 02H ;延时子程序 DELYB: PUSH 02H DELYC: PUSH 02H DELYD: DJNZ R2,DELYD LCALL SSEE ;调用显示子程序 POP 02H DJNZ R2,DELYC POP 02H DJNZ R2,DELYB - 70 - POP 02H DJNZ R2,DELYA RET END - 71 - 实验七 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)数据传送确认 - 72 - (5)写操作 (6)读操作 四、实验接线图 - 73 - 五、实验程序框图 六、实验步骤 (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.ASM ORG 0000H SCL EQU 0B0H ;IC2401,byte-wr SDA EQU 0B1H ;------------------------------------------------------- - 74 - 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 00h ;R0 IS IC CAR WR ADDRESS push 01h ;R1 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,#4000h ;[4000H----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: - 75 - 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 - 76 - 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 - 77 - 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 - 78 - 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 - 79 - 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 - 80 - 实验八 AT24C02 I2C 总线存储器读写实验 一、实验目的 (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)管脚图及管脚描述 1、SCL:串行时钟。这是一个输入管脚,用于产生器件所有数据发送或 接收的时钟。 2、SDA:串行数据/地址。这是一个双向传输端,用于传送地址和所有 数据的发送或接收。 3、A0、A1、A2:器件地址输入端。这些输入端用于多个器件级联时设 置器件地址。当这些脚悬空时默认为 0。 4、WP: 写保护。如果 WP 管脚连接到 Vcc,所有的内容都被写保护(只 能读)。当 WP 管脚连接到 Vss 或悬空,允许器件进行正常的读/写操作。 (2)器件的寻址 主器件通过发送一个起始信号启动发送过程,然后发送它所要寻址的从 器件的地址。8 位从器件地址的高 4 位 D7-D4 固定为 1010,接下的 3 位 D3-D1 (A2、A1、A0)为器件的片选地址位或作为存储器页地址选择位,用来定义 哪个器件以及器件的哪个部分被主器件访问。从器件 8 位地址的最低位 D0, 作为读写控制位。“1”表示对从器件进行读操作,“0”表示对从器件进行 写操作。 - 81 - (3) AT24C0X 数据写入操作 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 位字节数据。主器件不需 型号 控制 码 片选 读/写 总线访问的器 件 AT24C 01 1010 A2 A1 A0 R/W 最多 8 个 AT24C 02 1010 A2 A1 A0 R/W 最多 8 个 AT24C 04 1010 A2 A1 P0 R/W 最多 4 个 AT24C 08 1010 A2 P1 P0 R/W 最多 2 个 AT24C 16 1010 P2 P1 P0 R/W 最多 1 个 - 82 - 发送一个应答信号,但要产生一个停止信号。 2、随机地址读取 随机读操作允许主器件对寄存器的任意字节进行读操作,主器件首先通 过发送起始信号、从器件地址和它想读取的字节数据的地址执行一个伪写操 作。在 AT24CXX 应答后,主器件重新发送起始信号和从器件地址,此时 R/W 位置 1,AT24CXX 响应并发送应答信号,然后输出所要求的一个 8 位字节数 据,主器件不发送应答信号但产生一个停止信号。 3、顺序地址读取 顺序读操作可通过立即读或选择性读操作作启动。在 AT24CXX 发送完一 个 8 位字节数据后,主器件产生一个应答信号来响应,告知 AT24CXX 主器件 要求更多的数据,对应每个主机产生的应答信号 AT24CXX 将发送一个 8 位数 据字节。当主器件不发送应答信号而发送停止位时结束此操作。 四、实验程序框图 - 83 - 开始 程序初始化 ,并对外部数据 存储器清零 AT24C02写入数据,每次写 入一页 读出AT24C02数据,每次读 出一页 将AT24C02独处数据写入首 址为4000H的外部数据存储 器 是否写完32页? 结束 Y N 五、实验接线图 六、实验步骤 将 AT24C02 实验模块(I2CRAM 模块)的串行时钟端 SCL 接至 P1.6,串行 数据端 SDA 接至 P1.7,P1.0 接 L1(写指示灯),P1.1 接 L2(读指示灯),A0、 A1、A2 接地(直流电源 GND)。运行程序,读写指示灯 L1、L2 闪烁几秒后熄 灭,表示数据读写完毕。此时刷新外部数据存储器,4000H~40FFH 单元中内 - 84 - 容应为 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 0000H LJMP MAIN ORG 0100H MAIN: MOV R5,#00 ;页计数器,每页 8 个字节,共写 32 页 MOV R6,#00H ;写入 EEPROM 的数据寄存器,每写一次加 1 MOV DPL,#00H ;将数据存储器 0000~FF00 的地址空间清零 MOV DPH,#00H CLEAR: MOV A,#00H MOVX @DPTR,A INC DPTR MOV A,DPH CJNE A,#0FFH,CLEAR ;清零结束 - 85 - MOV DPL,#00H ;外部数据存储器 4000H 地址 MOV DPH,#40H ;用于存放 EEPROM 中读出的数据 NEXT: MOV R4,#0F0H DJNZ R4,$ ;延时,等待其它芯片复位好 MOV MTD,R6 INC R6 MOV MTD+1,R6 INC R6 MOV MTD+2,R6 INC R6 MOV MTD+3,R6 INC R6 MOV MTD+4,R6 INC R6 MOV MTD+5,R6 INC R6 MOV MTD+6,R6 INC R6 MOV MTD+7,R6 ;AT24C02 一次最多写入 8 个字节(即 1 页) INC R6 WRAT: MOV SLA,#AT24C02 ;AT24C02 数据写入操作*** MOV A,R5 MOV B,#08 MUL AB MOV SUBA,A ;指定器件子地址,此处为“页”地址 MOV NUMBYTE,#08 CLR WRL ;写指示灯亮 SETB RDL ;读指示灯灭 LCALL IWRNBYTE MOV R2,#12H LCALL DELYA SETB WRL ;写指示灯灭 CLR RDL ;读指示灯亮 RDAT: MOV SLA,#AT24C02 ;AT24C02 数据读出操作*** MOV A,R5 MOV B,#08 MUL AB MOV SUBA,A ;指定器件子地址,此处为"页"地址 MOV NUMBYTE,#08 LCALL IRDNBYTE MOV R2,#12H LCALL DELYA - 86 - SETB RDL ;一页数据读取完毕,读指示灯灭 NOP MOV R1,#MRD ;将接收数据缓冲区 MRD 中的一页数据写入 MOV R7,#08H ;4000H 为首址的外部数据存储器中 LL: MOV A,@R1 MOVX @DPTR,A INC R1 INC DPTR DJNZ R7,LL NOP ;一页数据写入完毕 INC R5 CJNE R5,#32,NEXT ;判断 AT24C02 中 32 页数据是否读写完毕? SETB WRL SETB RDL ;读写完毕,读写指示灯灭! LO: SJMP LO 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 ;------------------------------------------------------------------------- ------------------------------- ; 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 - 87 - NOP SETB SCL ;起始条件建立时间大于 4.7us NOP NOP NOP NOP NOP CLR SDA NOP ;起始条件锁定时大于 4us NOP NOP NOP NOP CLR SCL ;钳住总线,准备发数据 NOP RET ;结束总线子程序 STOP: CLR SDA NOP SETB SCL ;发送结束条件的时钟信号 NOP ;结束总线时间大于 4us NOP NOP NOP NOP SETB SDA ;结束总线 NOP ;保证一个终止信号和起始信号的空 闲时间大于 4.7us NOP NOP NOP RET ;发送应答信号子程序 MACK: CLR SDA ;将 SDA 置 0 NOP NOP SETB SCL NOP ;保持数据时间,即 SCL 为高时间大于 4.7us NOP NOP NOP - 88 - NOP CLR SCL NOP NOP RET ;发送非应答信号 MNACK: SETB SDA ;将 SDA 置 1 NOP NOP SETB SCL NOP NOP ;保持数据时间,即SCL 为高时间大于4.7us 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 ;发送字节子程序 ;字节数据放入 ACC ;每发送一字节要调用一次 CACK 子程序,取应答位 WRBYTE: MOV R0,#08H WLP: RLC A ;取数据位 JC WR1 - 89 - SJMP WR0 ;判断数据位 WLP1: DJNZ R0,WLP NOP RET WR1: SETB SDA ;发送 1 NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL SJMP WLP1 WR0: CLR SDA ;发送 0 NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL SJMP WLP1 ;读取字节子程序 ;读出的值在 ACC ;每取一字节要发送一个应答/非应答信号 RDBYTE: MOV R0,#08H RLP: SETB SDA NOP SETB SCL ;时钟线为高,接收数据位 NOP NOP NOP ;+1 MOV C,SDA ;读取数据位 MOV A,R2 CLR SCL ;将 SCL 拉低,时间大于 4.7us RLC A ;进行数据位的处理 MOV R2,A NOP - 90 - NOP NOP DJNZ R0,RLP ;未够 8 位,再来一次 RET ;========================================================================= =============== ;========================================================================= =============== ; 以下是用户接口子程序 ; ;无子地址器件写字节数据 ;入口参数: 数据为 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 ;发送非应信号 - 91 - RETRDB: LCALL STOP ;结束总线 RET ;向器件指定子地址写 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 CACK MOV R1,#MTD WRDA: MOV A,@R1 LCALL WRBYTE ;开始写入数据 LCALL CACK JNB ACK,IWRNBYTE INC R1 DJNZ R3,WRDA ;判断写完没有 RETWRN: LCALL STOP RET ;向器件指定子地址读取 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 ;准备进行读操作 - 92 - LCALL WRBYTE LCALL CACK JNB ACK,IRDNBYTE MOV R1,#MRD RDN1: LCALL RDBYTE ;读操作开始 MOV @R1,A ;NOP ;+1 ;NOP ;+1 DJNZ R3,SACK LCALL MNACK ;最后一字节发非应答位 RETRDN: LCALL STOP ;并结束总线 RET SACK: LCALL MACK INC R1 SJMP 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 - 93 - ;占用: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 目录) ; ; 用户可以对"用户接口子程序"进行裁减,即把自已不使用的接口子程序删掉,以 节省程序空间。 ;************************************************************************* ********************* - 94 - 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 0000H LJMP MAIN ORG 0100H MAIN: MOV R5,#00 ;页计数器,每页 8 个字节,共写 32 页 MOV R6,#00H ;写入 EEPROM 的数据寄存器,每写一次加 1 MOV DPL,#00H ;将数据存储器 0000~FF00 的地址空间清零 MOV DPH,#00H CLEAR: MOV A,#00H MOVX @DPTR,A INC DPTR MOV A,DPH CJNE A,#0FFH,CLEAR ;清零结束 MOV DPL,#00H ;外部数据存储器 4000H 地址 MOV DPH,#40H ;用于存放 EEPROM 中读出的数据 NEXT: MOV R4,#0F0H DJNZ R4,$ ;延时,等待其它芯片复位好 MOV MTD,R6 INC R6 - 95 - MOV MTD+1,R6 INC R6 MOV MTD+2,R6 INC R6 MOV MTD+3,R6 INC R6 MOV MTD+4,R6 INC R6 MOV MTD+5,R6 INC R6 MOV MTD+6,R6 INC R6 MOV MTD+7,R6 ;AT24C02 一次最多写入 8 个字节(即 1 页) INC R6 WRAT: MOV SLA,#AT24C02 ;AT24C02 数据写入操作*** MOV A,R5 MOV B,#08 MUL AB MOV SUBA,A ;指定器件子地址,此处为“页”地址 MOV NUMBYTE,#08 CLR WRL ;写指示灯亮 SETB RDL ;读指示灯灭 LCALL IWRNBYTE MOV R2,#12H LCALL DELYA SETB WRL ;写指示灯灭 CLR RDL ;读指示灯亮 RDAT: MOV SLA,#AT24C02 ;AT24C02 数据读出操作*** MOV A,R5 MOV B,#08 MUL AB MOV SUBA,A ;指定器件子地址,此处为"页"地址 MOV NUMBYTE,#08 LCALL IRDNBYTE MOV R2,#12H LCALL DELYA SETB RDL ;一页数据读取完毕,读指示灯灭 NOP MOV R1,#MRD ;将接收数据缓冲区 MRD 中的一页数据写入 MOV R7,#08H ;4000H 为首址的外部数据存储器中 LL: MOV A,@R1 MOVX @DPTR,A - 96 - INC R1 INC DPTR DJNZ R7,LL NOP ;一页数据写入完毕 INC R5 CJNE R5,#32,NEXT ;判断 AT24C02 中 32 页数据是否读写完毕? SETB WRL SETB RDL ;读写完毕,读写指示灯灭! LO: SJMP LO 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 ;------------------------------------------------------------------------- ------------------------------- ; 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 ;起始条件建立时间大于 4.7us NOP NOP NOP NOP - 97 - NOP CLR SDA NOP ;起始条件锁定时大于 4us NOP NOP NOP NOP CLR SCL ;钳住总线,准备发数据 NOP RET ;结束总线子程序 STOP: CLR SDA NOP SETB SCL ;发送结束条件的时钟信号 NOP ;结束总线时间大于 4us NOP NOP NOP NOP SETB SDA ;结束总线 NOP ;保证一个终止信号和起始信号的空 闲时间大于 4.7us NOP NOP NOP RET ;发送应答信号子程序 MACK: CLR SDA ;将 SDA 置 0 NOP NOP SETB SCL NOP ;保持数据时间,即 SCL 为高时间大于 4.7us NOP NOP NOP NOP CLR SCL NOP NOP RET - 98 - ;发送非应答信号 MNACK: SETB SDA ;将 SDA 置 1 NOP NOP SETB SCL NOP NOP ;保持数据时间,即SCL 为高时间大于4.7us 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 ;发送字节子程序 ;字节数据放入 ACC ;每发送一字节要调用一次 CACK 子程序,取应答位 WRBYTE: MOV R0,#08H WLP: RLC A ;取数据位 JC WR1 SJMP WR0 ;判断数据位 WLP1: DJNZ R0,WLP NOP RET WR1: SETB SDA ;发送 1 NOP - 99 - SETB SCL NOP NOP NOP NOP NOP CLR SCL SJMP WLP1 WR0: CLR SDA ;发送 0 NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL SJMP WLP1 ;读取字节子程序 ;读出的值在 ACC ;每取一字节要发送一个应答/非应答信号 RDBYTE: MOV R0,#08H RLP: SETB SDA NOP SETB SCL ;时钟线为高,接收数据位 NOP NOP NOP ;+1 MOV C,SDA ;读取数据位 MOV A,R2 CLR SCL ;将 SCL 拉低,时间大于 4.7us RLC A ;进行数据位的处理 MOV R2,A NOP NOP NOP DJNZ R0,RLP ;未够 8 位,再来一次 RET - 100 - ;========================================================================= =============== ;========================================================================= =============== ; 以下是用户接口子程序 ; ;无子地址器件写字节数据 ;入口参数: 数据为 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 - 101 - ; 占用: 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 CACK MOV R1,#MTD WRDA: MOV A,@R1 LCALL WRBYTE ;开始写入数据 LCALL CACK JNB ACK,IWRNBYTE INC R1 DJNZ R3,WRDA ;判断写完没有 RETWRN: LCALL STOP RET ;向器件指定子地址读取 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 - 102 - ;NOP ;+1 ;NOP ;+1 DJNZ R3,SACK LCALL MNACK ;最后一字节发非应答位 RETRDN: LCALL STOP ;并结束总线 RET SACK: LCALL MACK INC R1 SJMP 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 - 103 - 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 目录) ; ; 用户可以对"用户接口子程序"进行裁减,即把自已不使用的接口子程序删掉,以 节省程序空间。 ;************************************************************************* ********************* END - 104 - 实验九 TL549 串行 A/D 转换实验 一、实验目的 (1)了解串行器件 TLC549 的工作原理。 (2)掌握单片机系统中 TL549 的数据采集及编程方法。 二、实验内容 利用实验系统上的 TLC549 做 A/D 转换器,实验系统上的电位器提供模 拟量输入,编制程序,将模拟量转换成数字,通过数码管显示出来。 三、编程指南 TLC549 是 TI 公司生产的一种低价位、高性能的8位 A/D 转换器,它以 8位开关电容逐次逼近的方法实现 A/D 转换,其转换速度小于 17us,最大 转换速率为 40000HZ,4MHZ 典型内部系统时钟,电源为 3V 至 6V。它能方便 地采用三线串行接口方式与各种微处理器连接,构成各种廉价的测控应用系 统。 (1) TLC549 引脚图及各引脚功能 REF+:正基准电压输入 2.5V≤REF+≤Vcc+0.1。 REF-:负基准电压输入端,-0.1V≤REF-≤2.5V。 且要求:(REF+)- (REF-) ≥1V。 VCC:系统电源3V≤Vcc≤6V。 GND:接地端。 /CS:芯片选择输入端,要求输入高电平 VIN≥2V,输入低电平 VIN≤0.8V。 DATA OUT:转换结果数据串行输出端,与 TTL 电平兼容,输出时高位在前, 低位在后。 ANALOGIN:模拟信号输入端,0≤ANALOGIN≤Vcc,当 ANALOGIN≥REF+电压 时,转换结果为全“1”(0FFH),ANALOGIN≤REF-电压时,转换结果为全 “0”(00H)。 I/O CLOCK:外接输入/输出时钟输入端,同于同步芯片的输入输出操作, 无需与芯片内部系统时钟同步。 (2)TLC549 器件工作时序 当/CS 变为低电平后,TLC549 芯片被选中,同时前次转换结果的最高有 效位 MSB(A7)自 DATA OUT 端输出,接着要求自 I/O CLOCK 端输入8个外 部时钟信号,前7个 I/O CLOCK 信号的作用,是配合 TLC549 输出前次转换 - 105 - 结果的 A6-A7 位,并为本次转换做准备:在第4个 I/O CLOCK 信号由高至低 的跳变之后,片内采样/保持电路对输入模拟量采样开始,第8个 I/O CLOCK 信号的下降沿使片内采样/保持电路进入保持状态并启动 A/D 开始转换。转 换时间为 36 个系统时钟周期,最大为 17us。直到 A/D 转换完成前的这段时 间内,TLC549 的控制逻辑要求:或者/CS 保持高电平,或者 I/O CLOCK 时钟 端保持36个系统时钟周期的低电平。由此可见,在自 TLC549 的 I/O CLOCK 端输入8个外部时钟信号期间需要完成以下工作:读入前次A/D转换结果; 对本次转换的输入模拟信号采样并保持;启动本次 A/D 转换开始。 四、实验接线图 五、实验程序框图 开始 结束 程序初始化 ,显示缓 冲区赋初值 调用显示子程序 TLC549通道采样、读 取数据 六、实验步骤 TLC549 的 AIN (ANALOGIN)模拟量输入通道用连线接至电位器输出端 VOUT 孔,电位器输入端 VIN 接直流电源+5V,CLK(I/O CLOCK)接 P1.6,DO (DATA OUT)接 P1.7,CS 接 P1.0,运行程序,数码管上显示“549-XX”, 后二位显示当前采集的电压转换的数字量,调节电位器,该两位将随着电压 变化而相应变化。 - 106 - 快捷连线说明:AIN→VOUT VIN→+5V CLK →P1.6 D0 →P1.7 CS →P1.0 七、思考:该器件工作时序的模拟设计与单片机的工作速度有关吗?若有关则 该如何考虑时间要求? 八、程序清单 (1)基本程序(文件名 TLC549.ASM) ;********I2C 串行 8 位 A/D TL549 实验程序************* SDA EQU P1.7 ;DATA OUT SCL EQU P1.6 ;I/O CLOCK CS EQU P1.0 ;/CS 片选 MTD EQU 30H ;发送缓冲区首址 MRD EQU 40H ;接收缓冲区首址 ORG 0000H LJMP SE11 ORG 0590H SE11: MOV SP,#53H mov p2,#0ffh MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#05H ;显示缓冲区赋初值 MOV 7DH,#04H MOV 7CH,#09H MOV 7BH,#14H MOV 7AH,#10H MOV 79H,#10H LO18: LCALL SSEE ;调用显示子程序 CLR CS ;选中 TLC549 器件 LCALL RDBYTE ;读取采样/保持的数字量,并送到寄存器 A SETB CS ;等待 A/D 转换结束 NOP ;NOP NOP NOP NOP NOP NOP MOV R0,#79H LCALL PTDS SJMP LO18 - 107 - ORG 05D0H PTDS: MOV R1,A ;拆送显示缓冲区 ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET ORG 0D50H SSEE: SETB RS1 ;换工作区 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 ;8 次显示完了吗? CLR RS1 RET DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH ;读取字节子程序,读出的值在 ACC RDBYTE: MOV R0,#08H RLP: SETB SDA SETB SCL ;时钟线为高,接收数据位 MOV C,SDA ;读取数据位 MOV A,R2 CLR SCL ;将 SCL 拉低 - 108 - RLC A ;进行数据位的处理 MOV R2,A CLR SCL DJNZ R0,RLP ;未够 8 位,再来一次 RET END (2)带注释的基本程序(文件名 SJXHW30.ASM) ;********I2C 串行 8 位 A/D TL549 实验程序************* SDA EQU P1.7 ;DATA OUT SCL EQU P1.6 ;I/O CLOCK CS EQU P1.0 ;/CS 片选 MTD EQU 30H ;发送缓冲区首址 MRD EQU 40H ;接收缓冲区首址 ORG 0000H LJMP SE11 ORG 0590H SE11: MOV SP,#53H mov p2,#0ffh MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#05H ;显示缓冲区赋初值 MOV 7DH,#04H MOV 7CH,#09H MOV 7BH,#14H MOV 7AH,#10H MOV 79H,#10H LO18: LCALL SSEE ;调用显示子程序 CLR CS ;选中 TLC549 器件 LCALL RDBYTE ;读取采样/保持的数字量,并送到寄存器 A SETB CS ;等待 A/D 转换结束 NOP ;NOP NOP NOP NOP NOP NOP MOV R0,#79H LCALL PTDS SJMP LO18 ORG 05D0H PTDS: MOV R1,A ;拆送显示缓冲区 ACALL PTDS1 - 109 - MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET ORG 0D50H SSEE: SETB RS1 ;换工作区 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 ;8 次显示完了吗? CLR RS1 RET DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH ;读取字节子程序,读出的值在 ACC RDBYTE: MOV R0,#08H RLP: SETB SDA SETB SCL ;时钟线为高,接收数据位 MOV C,SDA ;读取数据位 MOV A,R2 CLR SCL ;将 SCL 拉低 RLC A ;进行数据位的处理 MOV R2,A CLR SCL - 110 - DJNZ R0,RLP ;未够 8 位,再来一次 RET END - 111 - 实验十 TLC5615 10 位 D/A 串行转换实验 一、实验目的 (1)了解 TLC5615 10 位串行 D/A 转换器的工作原理。 (2)掌握 TLC5615 10 位串行 D/A 转换器在单片机系统中的连接与编程。 二、实验内容 利用 TLC5615 输出一个从 0V 开始逐渐升至 5V 再降至 0V 的可变电压, 并用来驱动直流电机,或用电压表观测电压的变化。 三、编程指南 TLC5615 为美国德州仪器公司 1999 年推出的产品,是具有串行接口的 数模转换器,其输出为电压型,最大输出电压是基准电压值的两倍。带有上 电复位功能,即把 DAC 寄存器复位至全零。性能比早期电流型输出的 DAC 要 好。只需要通过 3 根串行总线就可以完成 10 位数据的串行输入,易于和工 业标准的微处理器或微控制器(单片机) 接口, 适用于电池供电的测试仪表、 移动电话,也适用于数字失调与增益调整以及工业控制场合。 (1)TLC5615 器件的引脚图及各引脚功能。 DIN: 串行数据输入端; SCLK: 串行时钟输入端; /CS: 芯片选用通端,低电平有效; DOUT: 用于级联时的串行数据输出端; AGND: 模拟地; REFIN:基准电压输入端, 2V~ (VDD - 2); OUT: DAC 模拟电压输出端; VDD: 正电源端,4.5~5.5V ,通常取 5V。 (2) 功能框图 TLC5615 的内部功能框图如下图所示,它主要由以下几部分组成: 1、 10 位 DAC 电路; 2、 一个 16 位移位寄存器, 接受串行移入的二进制数,并且有一个级联的 数据输出端 DOUT ; 3、 并行输入输出的 10 位 DAC 寄存器, 为 10 位 DAC 电路提供待转换的二 进制数据; 4、 电压跟随器为参考电压端 REFIN 提供很高的输入阻抗,大约 10MΩ ; 5、 ×2 电路提供最大值为 2 倍于 REFIN 的输出; 6、 上电复位电路和控制电路。 - 112 - 两种工作方式:(A)从上图可以看出,16 位移位寄存器分为高 4 位虚 拟位、低两位填充位以及 10 位有效位。在单片 TLC5615 工作时,只需要向 16 位移位寄存器按先后输入 10 位有效位和低 2 位填充位,2 位填充位数 据任意,这是第一种方式,即 12 位数据序列。(B)第二种方式为级联方式, 即 16 位数据列,可以将本片的 DOU T 接到下一片的 DIN , 需要向 16 位移位 寄存器按先后输入高 4 位虚拟位、10 位有效位和低 2 位填充位, 由于增加 了高 4 位虚拟位, 所以需要 16 个时钟脉冲。 (3) TLC5615 的工作时序 TLC5615 工作时序如上图所示。可以看出,只有当片选 CS 为低电平时, 串行输入数据才能被移入 16 位移位寄存器。当 CS 为低电平时,在每一个 SCLK 时钟的上升沿将 DIN 的一位数据移入 16 位移寄存器。注意, 二进制 最高有效位被导前移入。接着,CS 的上升沿将 16 位移位寄存器的 10 位有 效数据锁存于 10 位 DAC 寄存器, 供 DAC 电路进行转换; 当片选 CS 为高电 平时,串行输入数据不能被移入 16 位移位寄存器。注意, CS 的上升和下降 都必须发生在 SCL K 为低电平期间。 - 113 - 四、实验程序框图 开始 程序初始化,R4、R5赋初值00H 10位有效值即R4、R5的计数值。并加1 将R4、R5内容左移2位,送给R6、R7 数码管显示 将R6、R7内容传送给TLC5615移位寄存 器 判断R4、R5值是否到FFH? 10位有效值即R4、R5的计数值并减1 将R4、R5内容左移2位,送给R6、R7 数码管显示 判断R4、R5值是否到00H? 将R6、R7内容传送给TLC5615移位寄存 器 N Y N Y 五、实验接线图 - 114 - 六、实验步骤 把 TLC5615 的数据输入端 DIN 接至 P1.2,时钟输入端 SCLK 接至 P1.1, 片选端/CS 接至 P1.0,模拟电压输出端 OUT 接至直流电机 DJ,运行程序,数 码管上显示不断加大或减小的数字量 000~3FF(即 10 位有效值)“- - - X X X”后面三位表示变化的数字量,直流电机的转速会随着输出模拟量的大 小变化。 此时用电压表测试 TLC5615 模拟输出孔 OUT 也能测出不断变化的 电压值。 快捷连线说明:DIN→P1.2 SCLK→P1.1 /CS→P1.0 OUT→DJ(直流电机) 七、思考:该器件工作时序的模拟设计与单片机的工作速度有关吗?若有关则 该如何考虑时间要求? 八、程序清单 (1)基本程序(文件名 TLC5615.ASM) ;************************************************************ ;*************TLC5615 10 位 D/A 串行转换器程序设计************** ;************ P1.0 接 CS,P1.1 接 SLCLK,P1.2 接 DIN**************** ;***********R4、R5 用来计数----R6、R7 用来存放 10 位数据值********* ;************************************************************ ORG 0000H LJMP SE13 ORG 0100H SE13: MOV SP,#53H mov p2,#0ffh MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#14H - 115 - MOV 7DH,#14H MOV 7CH,#14H LOOP: MOV R4,#00H ;高二位 MOV R5,#00H ;低八位 ;LJMP L2 L1: INC R5 MOV A,R5 ;***开始:将 R4,R5 中 10 位有效值左移两位,分别移入 R6,R7 中 RLC A MOV R7,A MOV A,R4 RLC A MOV R6,A ;移完第一位 MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A ;***移完第二位,移位结束!!! MOV A,R5 MOV R0,#79H ;数码管显示 LCALL PTDS MOV A,R4 ANL A,#03H MOV @R0,A LCALL SSEE MOV R2,#05H ;调用延时子程序 LCALL DELYA ;TLC5615 开始传送 12 位数据****************************** LO21: CLR P1.1 ;SLCLK SETB P1.0 ;CS CLR P1.2 ;DIN NOP NOP CLR P1.0 ;片选有效 MOV R2,#4 ;将要送入的前四位数据位数 - 116 - MOV A,R6 ;前四位数据送累加器低四位 SWAP A ;A 中高四位与低四位互换 LCALL WRDATA ;DIN 输入前四位数据 MOV R2,#8 ;将要送入的后八位数据位数 MOV A,R7 ;八位数据送入累加器 A LCALL WRDATA ;DIN 输入后八位数据 CLR P1.1 ;时钟低电平 SETB P1.0 ;片选高电平,输入的 12 位数据有效 ;TLC5615 传送 12 位数据结束!!!************************** CJNE R5,#0FFH,L1 MOV R5,#00H INC R4 CJNE R4,#04H,L1 MOV R5,#0FFH MOV R4,#03H L2: DEC R5 MOV A,R5 ;开始:将 R4,R5 中 10 位有效值左移两位,分别移入 R6,R7 中 RLC A MOV R7,A MOV A,R4 RLC A MOV R6,A ;移完第一位 MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A ;移完第二位,移位结束!!! MOV A,R5 MOV R0,#79H ;数码管显示 LCALL PTDS MOV A,R4 ANL A,#03H MOV @R0,A LCALL SSEE MOV R2,#05H ;调用延时子程序 LCALL DELYA - 117 - LO22: CLR P1.1 ;SLCLK SETB P1.0 ;CS CLR P1.2 ;DIN NOP NOP CLR P1.0 ;片选有效 MOV R2,#4 ;将要送入的前四位数据位数 MOV A,R6 ;前四位数据送累加器低四位 SWAP A ;A 中高四位与低四位互换 LCALL WRDATA ;DIN 输入前四位数据 MOV R2,#8 ;将要送入的后八位数据位数 MOV A,R7 ;八位数据送入累加器 A LCALL WRDATA ;DIN 输入后八位数据 CLR P1.1 ;时钟低电平 SETB P1.0 ;片选高电平,输入的 12 位数据有效 CJNE R5,#00H,L2 MOV R5,#0FFH DEC R4 CJNE R4,#00H,L2 LJMP LOOP ;********************************************************* PTDS: MOV R1,A LCALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET ORG 0D50H SSEE: SETB RS1 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: MOV R1,#20H MOV A,30H - 118 - 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 DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH,0B9H ;送数子程序如下: WRDATA: NOP LOOPA: RLC A ;数据送入位标志位 CY MOV P1.2,C ;数据输入有效 CLR P1.1 ;时钟低电平 NOP SETB P1.1 ;时钟高电平 DJNZ R2,LOOPA ;循环送数 RET ;返回 DELYA: PUSH 02H ;延时子程序 DELYB: PUSH 02H DELYC: PUSH 02H DELYD: DJNZ R2,DELYD LCALL SSEE POP 02H DJNZ R2,DELYC POP 02H - 119 - DJNZ R2,DELYB POP 02H DJNZ R2,DELYA RET END (2)、带注释的基本程序:文件名:SJXHW31.ASM ;************************************************************ ;*************TLC5615 10 位 D/A 串行转换器程序设计************** ;************ P1.0 接 CS,P1.1 接 SLCLK,P1.2 接 DIN**************** ;***********R4、R5 用来计数----R6、R7 用来存放 10 位数据值********* ;************************************************************ ORG 0000H LJMP SE13 ORG 0100H SE13: MOV SP,#53H mov p2,#0ffh MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#14H MOV 7DH,#14H MOV 7CH,#14H LOOP: MOV R4,#00H ;高二位 MOV R5,#00H ;低八位 ;LJMP L2 L1: INC R5 MOV A,R5 ;***开始:将 R4,R5 中 10 位有效值左移两位,分别 移入 R6,R7 中 RLC A MOV R7,A MOV A,R4 RLC A MOV R6,A ;移完第一位 MOV A,R7 RLC A MOV R7,A - 120 - MOV A,R6 RLC A MOV R6,A ;***移完第二位,移位结束!!! MOV A,R5 MOV R0,#79H ;数码管显示 LCALL PTDS MOV A,R4 ANL A,#03H MOV @R0,A LCALL SSEE MOV R2,#05H ;调用延时子程序 LCALL DELYA ;TLC5615 开始传送 12 位数据****************************** LO21: CLR P1.1 ;SLCLK SETB P1.0 ;CS CLR P1.2 ;DIN NOP NOP CLR P1.0 ;片选有效 MOV R2,#4 ;将要送入的前四位数据位数 MOV A,R6 ;前四位数据送累加器低四位 SWAP A ;A 中高四位与低四位互换 LCALL WRDATA ;DIN 输入前四位数据 MOV R2,#8 ;将要送入的后八位数据位数 MOV A,R7 ;八位数据送入累加器 A LCALL WRDATA ;DIN 输入后八位数据 CLR P1.1 ;时钟低电平 SETB P1.0 ;片选高电平,输入的 12 位数据有效 ;TLC5615 传送 12 位数据结束!!!************************** CJNE R5,#0FFH,L1 MOV R5,#00H INC R4 CJNE R4,#04H,L1 MOV R5,#0FFH MOV R4,#03H L2: DEC R5 MOV A,R5 ;***开始:将R4,R5 中 10 位有效值左移两位,分别移入 R6, - 121 - R7 中 RLC A MOV R7,A MOV A,R4 RLC A MOV R6,A ;移完第一位 MOV A,R7 RLC A MOV R7,A MOV A,R6 RLC A MOV R6,A ;***移完第二位,移位结束!!! MOV A,R5 MOV R0,#79H ;数码管显示 LCALL PTDS MOV A,R4 ANL A,#03H MOV @R0,A LCALL SSEE MOV R2,#05H ;调用延时子程序 LCALL DELYA LO22: CLR P1.1 ;SLCLK SETB P1.0 ;CS CLR P1.2 ;DIN NOP NOP CLR P1.0 ;片选有效 MOV R2,#4 ;将要送入的前四位数据位数 MOV A,R6 ;前四位数据送累加器低四位 SWAP A ;A 中高四位与低四位互换 LCALL WRDATA ;DIN 输入前四位数据 MOV R2,#8 ;将要送入的后八位数据位数 MOV A,R7 ;八位数据送入累加器 A LCALL WRDATA ;DIN 输入后八位数据 CLR P1.1 ;时钟低电平 SETB P1.0 ;片选高电平,输入的 12 位数据有效 CJNE R5,#00H,L2 - 122 - MOV R5,#0FFH DEC R4 CJNE R4,#00H,L2 LJMP LOOP ;********************************************************* PTDS: MOV R1,A LCALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET ORG 0D50H SSEE: SETB RS1 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 - 123 - CLR RS1 RET DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH,0B9H ;送数子程序如下: WRDATA: NOP LOOPA: RLC A ;数据送入位标志位 CY MOV P1.2,C ;数据输入有效 CLR P1.1 ;时钟低电平 NOP SETB P1.1 ;时钟高电平 DJNZ R2,LOOPA ;循环送数 RET ;返回 DELYA: PUSH 02H ;延时子程序 DELYB: PUSH 02H DELYC: PUSH 02H DELYD: DJNZ R2,DELYD LCALL SSEE POP 02H DJNZ R2,DELYC POP 02H DJNZ R2,DELYB POP 02H DJNZ R2,DELYA RET END - 124 - 实验十一 串行存储芯片 93C46 读写实验 一、实验目的 (1)了解串行存储芯片 93C46 的工作原理。 (2)了解串行存储芯片 93C46 的工作时序。 (3)掌握 93C46 芯片在单片机系统中的应用及编程。 二、实验内容 利用串行存储芯片 93C46 的数据存储功能,将八个数码写入 93C46 中, 然后将八个数依次读出,存入单片机内部 RAM30H~37H 单元空间中,最后将 30H~37H 的数值再依次传送给单片机的 P1 口,由 P1 口驱动发光二极管 L1~L8 依闪点亮,实现一个灯的右移效果。 三、编程指南 93C46 是一种存储器可以定义为 16 位(ORG 引脚接 Vcc 或悬空时) 或者定义为 8 位(ORG 引脚接 GND) 的 1K 位(共 128 个字节)的串行 E2PROM 。 每一个的存储器都可以通过 DI 引脚或 DO 引脚进行写入或读出。每一片 93C46 都是采用先进的 CMOS E2PROM 浮动门工艺加工器件可以经受 1,000,000 次的写入/擦除操作,片内数据保存寿命达到 100 年。广泛应用 在无线电话、点钞机、防盗报警器等系列产品上。 (1)93C46 管脚图及管脚功能 (2)93C46 指令表及工作时序 93C46 共有 7 条指令,如下表所示: 管脚名 称 功能 CS 片选信号 SK 时钟输入 DI 数据输入 DO 数据输出 VCC 电源(+1.8~6V) END 接地 ORG 存储器结构选择 NC 不用连接 - 125 - 指令地址和写入的数据在时钟信号 SK 的上升沿时由 DI 引脚输入。DO 引脚除了从器件读取数据或在进行了写操作后查询准备/繁忙 ready/busy 的器件工作状态外,平常是高阻态的。 准备/繁忙(ready/busy)是开始了一个写操作后选择器件 CS 为高电平 后,从 DO 引脚读得用来测定期间工作状态的信号。DO 为低电平则表示写操 作还没有完成,当 DO 为高电平时则表示器件可以输入下一条指令此时如果 有需要可以在 DI 引脚移入一个高电平,DO 会进入高阻态。DO 引脚会在时 钟 SK 的下降沿时进入高阻态。 1、读操作指令(READ) 在接收到一个读指令和地址(从 DI 引脚在时钟驱动下输入)之前,93C46 的 DO 引脚是高阻态的。接收到读指令和地址后,DO 引脚先输出一个虚拟 的低电平,然后数据根据时钟信号移位输出(高位在前)。数据在时钟信号 SK 的上升沿时输出并经过一定的时间后稳定(tPD0 或 tPD1)。 2、写操作指令(WRITE) 在接收到写指令、地址和数据以后,片选引脚 CS 不片选芯片的时间要 必须大于 tCSMIN .片选引脚 CS 在下降沿的时候,器件开动自动时钟去擦除 并把数据存放到指定存储器。在器件进入自动时钟的模式后时钟.信号引脚 SK 的信号不是必须的。93C46 的准备/繁忙(ready/busy)状态可以选择器件 并测试数据输出引脚 DO 得到,因为器件有在写入前自动清除的特性,所以 没有必要在写入之前将存储器该地址的内容擦除。 3、擦除操作指令(ERASE) 在接收到擦除、指令和地址以后,片选引脚 CS 不片选芯片的时间要必 - 126 - 须大于 tCSMIN。片选引脚 CS 在下降沿的时候,器件开动自动时钟,擦除指 定存储器。在器件进入自动时钟的模式后时钟信号引脚 SK 的信号不是必须 的。93C46 的准备/繁忙(ready/busy)状态可以选择器件并测试数据输出 引脚 DO 得到。一旦清除了,该位就回到逻辑 1 的状态。 4、擦除/写入允许(EWEN)和禁止(EWDS)操作指令 93C46 在上电时是默认写禁止的。任何在上电和写禁止(EWDS)指令后 的写入操作都必须先发送写允许(EWEN)指令。一旦设置了写允许,它会持 续有效直到断电或发送一条写禁止指令。写禁止指令用来禁止对 93C46 的写 入和擦除操作,同时也可以防止意外地对器件进行写入和擦除。数据可以照 常从器件中读取无论是写允许还是写禁止状态。 5、全部擦除操作指令(ERAL) 在接收到全部擦除指令后,片选引脚 CS 不片选芯片的时间要必须大于 tCSMIN。片选引脚 CS 在下降沿的时候,器件开动自动时钟擦除存储器的所 有内容。在器件进入自动时钟的模式后时钟信号引脚 SK 的信号是必须的。 93C46 的准备/繁忙(ready/busy)状态可以选择器件并测试数据输出引脚 DO 得到。一旦清除了,所有位都回到逻辑 1 的状态。 - 127 - 6、写全部操作指令(WRAL) 在接收到写全部指令后,片选引脚 CS 不片选芯片的时间要必须大于 tCSMIN。片选引脚 CS 在下降沿的时候,器件开动自动时钟把数据内容,写 满器件的所有存储器。在器件进入自动时钟的模式后时钟信号引脚 SK 的信 号不是必须的。93C46 的准备/繁忙(ready/busy)状态可以选择器件并测 试数据输出引脚 DO 得到,没有必要去在写全部之前存储器内容擦除。 四、实验程序框图 开始 将八位数码写入 93C46 00~03单元中 把93C46中数据独到内部 RAM30H~37单元 将30H~37H中数值传依次 送至P1口 五、实验接线图 - 128 - 六、实验步骤 把串行存储芯片 93C46 模块的片选端 CS 接至 P3.0,时钟输入端 CLK(SK) 接至 P3.1,串行数据输入端 DI 接至 P3.2,串行数据输出端 DO 接至 P3.3, P1.0~P1.7 接至 LED 发光二极管 L1~L8。运行程序,LED 发光二极管 L1~L8 依次右移点亮,并不断循环,达到一个灯的右移效果。 快捷连线说明:P3.0→CS P3.1→SK P3.2→DI P3.3→DO P1.0~P1.7→L1~L8(发光二极管) 七、思考:(1)LJMP 前加分号,第一次写存储器 (2)写完之后,停止程序,将 LJMP 前的分号去掉,此时运行程 序,读取存储器的数据。 七、程序清单 (1)基本程序(文件名 93C46.ASM) ;********串行存储芯片 93C46 读写实验************ ;子程序名称功能 : ;READ 把 R7 指向地址的内容读入到 R6(H),R5(L) ;WRITE 把 R6(H),R5(L)的内容写到 R7 指向地址上 ;WRAL 把 R6(H),R5(L)的内容写到全部存储器上 ;ERASE 把 R7 指向地址的内容擦除 ;ERAL 把全部存储器的内容擦除 ;93C46 的地址为 00~3F,如果地址值超过范围,例如给地址值 40H 写入数据 ;将会写入 00H,依次类推! CS_93C46 BIT P3.0 SK_93C46 BIT P3.1 DI_93C46 BIT P3.2 DO_93C46 BIT P3.3 BIT_CNT DATA 10H BIT_SEND DATA 11H DATSEND DATA 12H ORG 0000H MAIN: LJMP READDATA ;93C46 写入一次后,即永久保存 LCALL ERAL ;把全部存储器的内容擦除 WRITEDATA: MOV R7,#00H ;将 93C46 存储器中 00~03H 空间中写入 - 129 - MOV R5,#0FEH ;0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH MOV R6,#0FDH LCALL WRITE NOP NOP MOV R7,#01H MOV R5,#0FBH MOV R6,#0F7H LCALL WRITE NOP NOP MOV R7,#02H MOV R5,#0EFH MOV R6,#0DFH LCALL WRITE NOP NOP MOV R7,#03H MOV R5,#0BFH MOV R6,#07FH LCALL WRITE NOP NOP READDATA: MOV R7,#00H ;读出 93C46 存储器中 00~03 单元中的八个字 节数据 LCALL READ ;并将数据存入 8051 内部 RAM30H~37H 单元中 NOP NOP MOV 30H,R5 MOV 31H,R6 MOV R7,#01H LCALL READ NOP NOP MOV 32H,R5 - 130 - MOV 33H,R6 MOV R7,#02H LCALL READ NOP NOP MOV 34H,R5 MOV 35H,R6 MOV R7,#03H LCALL READ NOP NOP MOV 36H,R5 MOV 37H,R6 LOOP4: MOV R3,#08H ;将 30H~37H 中的数值依次送给 P1 口 MOV R0,#30H ;实现一个灯的右移效果 LOOP3: MOV A,@R0 MOV P1,A ;P1 口接 LED 发光二极管 L1~L8 INC R0 SETB RS1 ;换工作区 MOV R5,#03H ;延时子程序段 LL3: MOV R6,#0FFH LL2: MOV R7,#0FFH LL1: DJNZ R7,LL1 DJNZ R6,LL2 DJNZ R5,LL3 CLR RS1 DJNZ R3,LOOP3 SJMP LOOP4 ;以下子程序为 93C46 汇编读写操作软件包:更新日期:2005.12.25 SUNZHIJIANG ;******************************************************************** ;名称:读指令(READ 指令) ;功能:把 93C46 中 R7 所指向的存储器的数据读到 R6(H),R5(L) ;******************************************************************** READ: CALL START_93C46 - 131 - MOV DATSEND,#06H ;发送读操作指令 MOV BIT_SEND,#03H LCALL SEND_DATA MOV DATSEND,R7 ;发送写入地址 MOV BIT_SEND,#06H LCALL SEND_DATA SETB DO_93C46 ;准备读入数据 MOV BIT_CNT,#16 READ1: SETB SK_93C46 ;产生一个时钟信号 SETB SK_93C46 CLR SK_93C46 CLR SK_93C46 NOP MOV C,DO_93C46 ;读取 DO 的信息 MOV A,R5 ;移位保存 RLC A MOV R5,A MOV A,R6 RLC A MOV R6,A DJNZ BIT_CNT,READ1 LCALL STOP_93C46 RET ;****************************************************************** ;名称:写指令(WRITE 指令) ;功能:把 R6(H),R5(L)的数据写到 93C46 中 R7 所指向的存储器中 ;****************************************************************** WRITE: LCALL WEN_93C46 LCALL START_93C46 MOV DATSEND,#05H ;发送写入操作指令 MOV BIT_SEND,#03H LCALL SEND_DATA MOV DATSEND,R7 ;发送写入地址 MOV BIT_SEND,#06H LCALL SEND_DATA MOV DATSEND,R6 ;发送写入数据 MOV BIT_SEND,#08H - 132 - LCALL SEND_DATA MOV DATSEND,R5 MOV BIT_SEND,#08H LCALL SEND_DATA LCALL STOP_93C46 LCALL WDS_93C46 RET ;****************************************************************** ;名称:写全部(WRAL 指令) ;功能:把 R6(H),R5(L)的数据写到 93C46 的全部存储器中 ;****************************************************************** WRAL: LCALL WEN_93C46 LCALL START_93C46 MOV DATSEND,#11H ;发送写全部操作指令 MOV BIT_SEND,#05H LCALL SEND_DATA MOV DATSEND,#00H MOV BIT_SEND,#04H LCALL SEND_DATA MOV DATSEND,R6 ;发送写全部数据(高位) MOV BIT_SEND,#08H LCALL SEND_DATA MOV DATSEND,R5 ;发送写全部数据(低位) MOV BIT_SEND,#08H LCALL SEND_DATA LCALL STOP_93C46 LCALL WDS_93C46 RET ;****************************************************************** ;名称:START_93C46 ;功能:片选 93C46 做好读/写数据的准备 ;****************************************************************** START_93C46: SETB DO_93C46 SETB DI_93C46 CLR SK_93C46 SETB CS_93C46 - 133 - JNB DO_93C46,$ ;查询器件是否繁忙 SETB SK_93C46 CLR SK_93C46 CLR CS_93C46 CLR SK_93C46 CLR DI_93C46 SETB CS_93C46 RET ;****************************************************************** ;名称:STOP_93C46 ;功能:停止对 93C46 操作 ;****************************************************************** STOP_93C46: CLR SK_93C46 CLR DI_93C46 CLR CS_93C46 SETB DO_93C46 RET ;****************************************************************** ;名称:WEN_93C46(EWEN 指令) ;功能:93C46 写允许 ;****************************************************************** WEN_93C46: LCALL START_93C46 MOV DATSEND,#04H ;发送开始位和写允许操作码,共 3 位 MOV BIT_SEND,#03H LCALL SEND_DATA ;调用发送子程序 MOV DATSEND,#30H ;发送 6 位的指令操作码 MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 RET ;****************************************************************** ;名称:WDS_93C46(EWDS 指令) ;功能:93C46 写禁止 ;****************************************************************** WDS_93C46: LCALL START_93C46 MOV DATSEND,#04H ;发送开始位和写禁止操作码,共 3 位 MOV BIT_SEND,#03H - 134 - LCALL SEND_DATA ;调用发送子程序 MOV DATSEND,#00H ;发送 6 位的指令操作码 MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 RET ;****************************************************************** ;名称:ERASE(ERASE 指令) ;功能:擦除 93C46 中 R7 所指向的地址的内容 ;****************************************************************** ERASE: LCALL WEN_93C46 LCALL START_93C46 MOV DATSEND,#07H ;发送擦除指令 MOV BIT_SEND,#03H LCALL SEND_DATA MOV DATSEND,R7 MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 LCALL WDS_93C46 RET ;****************************************************************** ;名称:ERAL(ERAL 指令) ;功能:擦除 93C46 所有内容 ;****************************************************************** ERAL: LCALL WEN_93C46 LCALL START_93C46 MOV DATSEND,#04H ;发送全部擦除指令 MOV BIT_SEND,#03H LCALL SEND_DATA MOV DATSEND,#20H MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 LCALL WDS_93C46 RET ;****************************************************************** - 135 - ;名称:SEND_DATA ;功能:数据发送子程序,把待发送数据 DATSEND 的低 BIT_SEND 位送到 DI 上 ;****************************************************************** ;因为为了使程序容易读懂,前面把要发送的内容直接送给 DATSEND, ;而现在就要把 DATSEND 中无用的位去掉,把要发送的内容移到最高位来 SEND_DATA: MOV BIT_CNT,BIT_SEND MOV A,#08H ;计算要移位的个数 CLR C SUBB A,BIT_CNT MOV BIT_CNT,A JZ SEND_DATA2 ;如果发送的位数为 8 位,则不用移位,跳转 MOV A,DATSEND ;把要送出数据的移到 DATSEND 的最高位 SEND_DATA1: RL A DJNZ BIT_CNT,SEND_DATA1 JMP SEND_DATA3 SEND_DATA2: ;把要送出的 8 位数据 DATSEND 传给 A MOV A,DATSEND ;(只有 8 位数据都要送出时才执行这条指令) SEND_DATA3: MOV BIT_CNT,BIT_SEND SEND_DATA4: RLC A ;移位送出 BIT_SEND 位数据 JC SEND_DATA5 CLR DI_93C46 ;发送 0 码 JMP SEND_DATA6 SEND_DATA5: SETB DI_93C46 ;发送 1 码 NOP NOP SEND_DATA6: SETB SK_93C46 ;产生移位时钟信号 CLR SK_93C46 DJNZ BIT_CNT,SEND_DATA4 RET END (2)带注释的基本程序(文件名 SJXHW35.ASM) - 136 - ;********串行存储芯片 93C46 读写实验************ ;子程序名称功能 : ;READ 把 R7 指向地址的内容读入到 R6(H),R5(L) ;WRITE 把 R6(H),R5(L)的内容写到 R7 指向地址上 ;WRAL 把 R6(H),R5(L)的内容写到全部存储器上 ;ERASE 把 R7 指向地址的内容擦除 ;ERAL 把全部存储器的内容擦除 ;93C46 的地址为 00~3F,如果地址值超过范围,例如给地址值 40H 写入数据 ;将会写入 00H,依次类推! CS_93C46 BIT P3.0 SK_93C46 BIT P3.1 DI_93C46 BIT P3.2 DO_93C46 BIT P3.3 BIT_CNT DATA 10H BIT_SEND DATA 11H DATSEND DATA 12H ORG 0000H MAIN: LJMP READDATA ;93C46 写入一次后,即永久保存 LCALL ERAL ;把全部存储器的内容擦除 WRITEDATA: MOV R7,#00H ;将 93C46 存储器中 00~03H 空间中写入 MOV R5,#0FEH ;0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH MOV R6,#0FDH LCALL WRITE NOP NOP MOV R7,#01H MOV R5,#0FBH MOV R6,#0F7H LCALL WRITE NOP NOP MOV R7,#02H MOV R5,#0EFH MOV R6,#0DFH - 137 - LCALL WRITE NOP NOP MOV R7,#03H MOV R5,#0BFH MOV R6,#07FH LCALL WRITE NOP NOP READDATA: MOV R7,#00H ;读出 93C46 存储器中 00~03 单元中的八个字 节数据 LCALL READ ;并将数据存入 8051 内部 RAM30H~37H 单元中 NOP NOP MOV 30H,R5 MOV 31H,R6 MOV R7,#01H LCALL READ NOP NOP MOV 32H,R5 MOV 33H,R6 MOV R7,#02H LCALL READ NOP NOP MOV 34H,R5 MOV 35H,R6 MOV R7,#03H LCALL READ NOP NOP MOV 36H,R5 MOV 37H,R6 - 138 - LOOP4: MOV R3,#08H ;将 30H~37H 中的数值依次送给 P1 口 MOV R0,#30H ;实现一个灯的右移效果 LOOP3: MOV A,@R0 MOV P1,A ;P1 口接 LED 发光二极管 L1~L8 INC R0 SETB RS1 ;换工作区 MOV R5,#03H ;延时子程序段 LL3: MOV R6,#0FFH LL2: MOV R7,#0FFH LL1: DJNZ R7,LL1 DJNZ R6,LL2 DJNZ R5,LL3 CLR RS1 DJNZ R3,LOOP3 SJMP LOOP4 ;以下子程序为 93C46 汇编读写操作软件包:更新日期:2005.12.25 SUNZHIJIANG ;******************************************************************** ;名称:读指令(READ 指令) ;功能:把 93C46 中 R7 所指向的存储器的数据读到 R6(H),R5(L) ;******************************************************************** READ: CALL START_93C46 MOV DATSEND,#06H ;发送读操作指令 MOV BIT_SEND,#03H LCALL SEND_DATA MOV DATSEND,R7 ;发送写入地址 MOV BIT_SEND,#06H LCALL SEND_DATA SETB DO_93C46 ;准备读入数据 MOV BIT_CNT,#16 READ1: SETB SK_93C46 ;产生一个时钟信号 SETB SK_93C46 CLR SK_93C46 CLR SK_93C46 NOP MOV C,DO_93C46 ;读取 DO 的信息 MOV A,R5 ;移位保存 RLC A - 139 - MOV R5,A MOV A,R6 RLC A MOV R6,A DJNZ BIT_CNT,READ1 LCALL STOP_93C46 RET ;****************************************************************** ;名称:写指令(WRITE 指令) ;功能:把 R6(H),R5(L)的数据写到 93C46 中 R7 所指向的存储器中 ;****************************************************************** WRITE: LCALL WEN_93C46 LCALL START_93C46 MOV DATSEND,#05H ;发送写入操作指令 MOV BIT_SEND,#03H LCALL SEND_DATA MOV DATSEND,R7 ;发送写入地址 MOV BIT_SEND,#06H LCALL SEND_DATA MOV DATSEND,R6 ;发送写入数据 MOV BIT_SEND,#08H LCALL SEND_DATA MOV DATSEND,R5 MOV BIT_SEND,#08H LCALL SEND_DATA LCALL STOP_93C46 LCALL WDS_93C46 RET ;****************************************************************** ;名称:写全部(WRAL 指令) ;功能:把 R6(H),R5(L)的数据写到 93C46 的全部存储器中 ;****************************************************************** WRAL: LCALL WEN_93C46 LCALL START_93C46 MOV DATSEND,#11H ;发送写全部操作指令 MOV BIT_SEND,#05H - 140 - LCALL SEND_DATA MOV DATSEND,#00H MOV BIT_SEND,#04H LCALL SEND_DATA MOV DATSEND,R6 ;发送写全部数据(高位) MOV BIT_SEND,#08H LCALL SEND_DATA MOV DATSEND,R5 ;发送写全部数据(低位) MOV BIT_SEND,#08H LCALL SEND_DATA LCALL STOP_93C46 LCALL WDS_93C46 RET ;****************************************************************** ;名称:START_93C46 ;功能:片选 93C46 做好读/写数据的准备 ;****************************************************************** START_93C46: SETB DO_93C46 SETB DI_93C46 CLR SK_93C46 SETB CS_93C46 JNB DO_93C46,$ ;查询器件是否繁忙 SETB SK_93C46 CLR SK_93C46 CLR CS_93C46 CLR SK_93C46 CLR DI_93C46 SETB CS_93C46 RET ;****************************************************************** ;名称:STOP_93C46 ;功能:停止对 93C46 操作 ;****************************************************************** STOP_93C46: CLR SK_93C46 CLR DI_93C46 CLR CS_93C46 SETB DO_93C46 - 141 - RET ;****************************************************************** ;名称:WEN_93C46(EWEN 指令) ;功能:93C46 写允许 ;****************************************************************** WEN_93C46: LCALL START_93C46 MOV DATSEND,#04H ;发送开始位和写允许操作码,共 3 位 MOV BIT_SEND,#03H LCALL SEND_DATA ;调用发送子程序 MOV DATSEND,#30H ;发送 6 位的指令操作码 MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 RET ;****************************************************************** ;名称:WDS_93C46(EWDS 指令) ;功能:93C46 写禁止 ;****************************************************************** WDS_93C46: LCALL START_93C46 MOV DATSEND,#04H ;发送开始位和写禁止操作码,共 3 位 MOV BIT_SEND,#03H LCALL SEND_DATA ;调用发送子程序 MOV DATSEND,#00H ;发送 6 位的指令操作码 MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 RET ;****************************************************************** ;名称:ERASE(ERASE 指令) ;功能:擦除 93C46 中 R7 所指向的地址的内容 ;****************************************************************** ERASE: LCALL WEN_93C46 LCALL START_93C46 MOV DATSEND,#07H ;发送擦除指令 MOV BIT_SEND,#03H LCALL SEND_DATA MOV DATSEND,R7 - 142 - MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 LCALL WDS_93C46 RET ;****************************************************************** ;名称:ERAL(ERAL 指令) ;功能:擦除 93C46 所有内容 ;****************************************************************** ERAL: LCALL WEN_93C46 LCALL START_93C46 MOV DATSEND,#04H ;发送全部擦除指令 MOV BIT_SEND,#03H LCALL SEND_DATA MOV DATSEND,#20H MOV BIT_SEND,#06H LCALL SEND_DATA LCALL STOP_93C46 LCALL WDS_93C46 RET ;****************************************************************** ;名称:SEND_DATA ;功能:数据发送子程序,把待发送数据 DATSEND 的低 BIT_SEND 位送到 DI 上 ;****************************************************************** ;因为为了使程序容易读懂,前面把要发送的内容直接送给 DATSEND, ;而现在就要把 DATSEND 中无用的位去掉,把要发送的内容移到最高位来 SEND_DATA: MOV BIT_CNT,BIT_SEND MOV A,#08H ;计算要移位的个数 CLR C SUBB A,BIT_CNT MOV BIT_CNT,A JZ SEND_DATA2 ;如果发送的位数为 8 位,则不用移位,跳转 MOV A,DATSEND ;把要送出数据的移到 DATSEND 的最高位 SEND_DATA1: RL A DJNZ BIT_CNT,SEND_DATA1 JMP SEND_DATA3 SEND_DATA2: ;把要送出的 8 位数据 DATSEND 传给 A - 143 - MOV A,DATSEND ;(只有 8 位数据都要送出时才执行这条指令) SEND_DATA3: MOV BIT_CNT,BIT_SEND SEND_DATA4: RLC A ;移位送出 BIT_SEND 位数据 JC SEND_DATA5 CLR DI_93C46 ;发送 0 码 JMP SEND_DATA6 SEND_DATA5: SETB DI_93C46 ;发送 1 码 NOP NOP SEND_DATA6: SETB SK_93C46 ;产生移位时钟信号 CLR SK_93C46 DJNZ BIT_CNT,SEND_DATA4 RET END - 144 - 单元 4 电机控制实验 实验十二 步进电机控制 一、实验目的 了解步进电机控制的基本原理,掌握步进电机转动编程方法。 二、实验内容 读取显示器上显示的正、反转命令,转速(16 级)和转动 步数后执行,转动步数减为零时停止转动。 三、实验预备知识 步进电也称为脉冲电机,它可以直接接收来自计算机的数字脉冲,使电 机旋转过相应的角度。步进电机在要求快速启停,精确定位的场合做为执行 部件,得到了广泛采用。 四相步进电机的工作方式: *单相四拍工作方式,其电机控制绕组 A、B、C、D 相的正转通电顺序为: ABCDA;反转通电顺序为:ADCBA。 *四相八拍工作方式,正转的绕组通电顺序为: AABBBCCCDD DAA;反向的通电顺序为:AADDDCCCBBBAA。 *双四拍工作方式,正转的绕组通电顺序为:ABBCCDDAAB;反 向的通电顺序为:ABADDCCBBA。 步进电机有如下特点:给步进脉冲电机就转,不给步进脉冲电机就不转; 步进脉冲的频率越高,步进电机转得越快;改变各相的通电方式,可以改变 电机的运行方式;改变通电顺序,可以控制电机的正、反转。 本实验程序采用单相四拍工作方式。 四、实验接线图 - 145 - 五、实验程序框图 六、实验步骤 Pl.0~Pl.3 接 HA~HD。执行程序,从键盘上输入数字使显示器显示,第一 位为 0(正转),为 1(反转),第二位 0~F 显示转速,第三~六位为设定步数, 如输入“011000”,按 EX/ FV 键后,步进电机开始转动,步数逐渐减小到零 时步进电机停止转动。 快捷连线说明:P1.0~P1.3→HA~HD 七、思考: 四相八拍的工作方式是何意思? 八、程序清单 (1)基本程序(文件名 HW19·ASM) ORG 0000H MOV P2,#0FFH MOV 7EH,#11H MOV 7DH,#10H MOV 7CH,#10H MOV 7BH,#10H MOV 7AH,#10H MOV 79H,#10H MOV A,#89H - 146 - MOV DPTR,#0FF23H MOVX @DPTR,A mov r0,#59h mov a,#7eh movx @r0,a DOJ0: MOV SP,#53H DOJ6: LCALL X2 ;! JNC DOJ5 LCALL X3 MOV R1,#7EH SJMP DOJ6 DOJ5: CJNE A,#16H,DOJ6 MOV A,7AH SWAP A ORL A,79H MOV R6,A MOV A,7CH SWAP A ORL A,7BH MOV R7,A MOV A,7EH CJNE A,#00H,DOJ2 DOJ1: MOV P1,#03H LCALL DEL0Y LCALL GGJ0 MOV P1,#06H LCALL DEL0Y LCALL GGJ0 MOV P1,#0CH LCALL DEL0Y LCALL GGJ0 MOV P1,#09H LCALL DEL0Y LCALL GGJ0 SJMP DOJ1 DOJ2: MOV P1,#09H LCALL DEL0Y LCALL GGJ0 MOV P1,#0CH LCALL DEL0Y LCALL GGJ0 MOV P1,#06H LCALL DEL0Y LCALL GGJ0 - 147 - MOV P1,#03H LCALL DEL0Y LCALL GGJ0 SJMP DOJ2 DEL0Y: MOV A,7DH SWAP A MOV R2,A MOV R5,#80H DEL1Y: DJNZ R5,DEL1Y LCALL SSEE DJNZ R2,DEL1Y RET GGJ0: CJNE R7,#00H,GGJ1 CJNE R6,#00H,GGJ1 AJMP DOJ4 GGJ1: DJNZ R6,DOJ3 CJNE R7,#00H,DDJ8 DOJ4: LCALL DOJ7 SJMP DOJ4 DDJ8: DJNZ R7,DOJ3 AJMP DOJ4 DOJ3: LCALL DOJ7 RET DOJ7: MOV R0,#79H MOV A,R6 LCALL PTDS5 MOV A,R7 LCALL PTDS5 LCALL SSEE RET PTDS5: MOV R1,A ACALL PTDS6 MOV A,R1 SWAP A PTDS6: ANL A,#0FH MOV @R0,A INC R0 RET ORG 1D00H X3: MOV R4,A MOV R0,#59H MOVX A,@R0 MOV R1,A MOV A,R4 - 148 - 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 X31: MOVX @R0,A INC DPTR PUSH DPL PUSH DPH RET X30: DEC R1 MOV A,R1 SJMP X31 X2: MOV R6,#50H X0: ACALL XLE JNB ACC.5,XX0 DJNZ R6,X0 MOV R6,#20H MOV R0,#59H MOVX A,@R0 MOV R0,A MOV A,@R0 MOV R7,A MOV A,#10H MOV @R0,A X1: ACALL XLE JNB ACC.5,XX1 DJNZ R6,X1 MOV A,R7 MOV @R0,A SJMP X2 XX1: MOV R6,A MOV A,R7 MOV @R0,A MOV A,R6 XX0: RET XLE: ACALL DIS ACALL KEY MOV R4,A MOV R1,#48H - 149 - 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 X10: 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,#20H DEC R2 SJMP X13 X12: MOV R4,#0FH x11: MOV R2,04H MOV R4,03H X13: MOV R1,#48H MOV A,R2 MOVX @R1,A INC R1 MOV A,R3 MOVX @R1,A MOV A,R4 RET LS3: DB 07H,04H,08H,05H,09H,06H,0AH DB 0BH,01H,00H,02H,0FH,03H,0EH DB 0CH,0DH DIS: PUSH DPH PUSH DPL SETB RS1 MOV R0,#7EH MOV R2,#20H - 150 - MOV R3,#00H MOV DPTR,#LS0 LS2: 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 LS1: 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 RET LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH KEY: SETB RS1 MOV R2,#0FEH MOV R3,#08H MOV R0,#00H LP1: 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 - 151 - ; JB ACC.4,XP33 MOV A,#20H ;19H SJMP XP3 XP33: MOV A,#20H XP3: CLR RS1 RET LP0: CPL A JB ACC.0,XP0 MOV A,#00H SJMP LPP XP0: JB ACC.1,XP1 MOV A,#08H SJMP LPP XP1: JB ACC.2,XP2 MOV A,#10H SJMP LPP XP2: JB ACC.3,XP33 MOV A,#18H LPP: ADD A,R0 CLR RS1 CJNE A,#10H,LX0 LX0: JNC XP35 MOV DPTR,#LS3 MOVC A,@A+DPTR XP35: RET ORG 0D50H SSEE: SETB RS1 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 - 152 - 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 END (2)带注释的基本程序(文件名 SJXHW19.ASM) ORG 0000H MOV P2,#0FFH MOV 7EH,#11H MOV 7DH,#10H MOV 7CH,#10H MOV 7BH,#10H MOV 7AH,#10H MOV 79H,#10H ;显示缓冲区赋初值 MOV A,#89H MOV DPTR,#0FF23H MOVX @DPTR,A ;8255 赋初值,8255 用于控制数码管和键盘 mov r0,#59h mov a,#7eh movx @r0,a DOJ0: MOV SP,#53H DOJ6: LCALL X2 ;调用键盘扫描显示子程序 JNC DOJ5 LCALL X3 ;调数字键处理子程序 MOV R1,#7EH SJMP DOJ6 DOJ5: CJNE A,#16H,DOJ6 ;判断执行键是否按下 MOV A,7AH SWAP A ORL A,79H MOV R6,A ;低字节步距送 R6 MOV A,7CH SWAP A ORL A,7BH MOV R7,A ;高字节步距送 R7 MOV A,7EH CJNE A,#00H,DOJ2 ;判断转动方向 DOJ1: MOV P1,#03H ;顺时针转动子程序 - 153 - LCALL DEL0Y LCALL GGJ0 MOV P1,#06H LCALL DEL0Y LCALL GGJ0 MOV P1,#0CH LCALL DEL0Y LCALL GGJ0 MOV P1,#09H LCALL DEL0Y LCALL GGJ0 SJMP DOJ1 DOJ2: MOV P1,#09H ;逆时针转动子程序 LCALL DEL0Y LCALL GGJ0 MOV P1,#0CH LCALL DEL0Y LCALL GGJ0 MOV P1,#06H LCALL DEL0Y LCALL GGJ0 MOV P1,#03H LCALL DEL0Y LCALL GGJ0 SJMP DOJ2 ;延时子程序 DEL0Y: MOV A,7DH ;根据(7D)内容判断延时时间 SWAP A MOV R2,A MOV R5,#80H DEL1Y: DJNZ R5,DEL1Y LCALL SSEE DJNZ R2,DEL1Y RET GGJ0: CJNE R7,#00H,GGJ1 ;步距数为 0 停止 CJNE R6,#00H,GGJ1 ;不为 0 减 1 后,显示 AJMP DOJ4 GGJ1: DJNZ R6,DOJ3 CJNE R7,#00H,DDJ8 DOJ4: LCALL DOJ7 SJMP DOJ4 DDJ8: DJNZ R7,DOJ3 AJMP DOJ4 DOJ3: LCALL DOJ7 - 154 - RET DOJ7: MOV R0,#79H MOV A,R6 LCALL PTDS5 MOV A,R7 LCALL PTDS5 LCALL SSEE ;调用显示子程序 RET PTDS5: MOV R1,A ;拆送数据子程序 ACALL PTDS6 MOV A,R1 SWAP A PTDS6: ANL A,#0FH MOV @R0,A INC R0 RET ORG 1D00H X3: 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 X31: MOVX @R0,A INC DPTR PUSH DPL PUSH DPH RET X30: DEC R1 MOV A,R1 SJMP X31 X2: MOV R6,#50H X0: ACALL XLE JNB ACC.5,XX0 DJNZ R6,X0 MOV R6,#20H - 155 - MOV R0,#59H MOVX A,@R0 MOV R0,A MOV A,@R0 MOV R7,A MOV A,#10H MOV @R0,A X1: ACALL XLE JNB ACC.5,XX1 DJNZ R6,X1 MOV A,R7 MOV @R0,A SJMP X2 XX1: MOV R6,A MOV A,R7 MOV @R0,A MOV A,R6 XX0: RET XLE: 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 X10: 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 - 156 - MOV R4,#20H DEC R2 SJMP X13 X12: MOV R4,#0FH x11: MOV R2,04H MOV R4,03H X13: MOV R1,#48H MOV A,R2 MOVX @R1,A INC R1 MOV A,R3 MOVX @R1,A MOV A,R4 RET LS3: DB 07H,04H,08H,05H,09H,06H,0AH DB 0BH,01H,00H,02H,0FH,03H,0EH DB 0CH,0DH DIS: PUSH DPH PUSH DPL SETB RS1 MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#LS0 LS2: 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 LS1: DJNZ R3,LS1 ;等键盘输入命令 CLR C RRC A MOV R2,A JNZ LS2 INC R1 MOV A,#0FFH MOVX @R1,A CLR RS1 POP DPL - 157 - POP DPH RET LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH KEY: SETB RS1 MOV R2,#0FEH MOV R3,#08H MOV R0,#00H LP1: 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 ;19H SJMP XP3 XP33: MOV A,#20H XP3: CLR RS1 RET LP0: CPL A JB ACC.0,XP0 MOV A,#00H SJMP LPP XP0: JB ACC.1,XP1 MOV A,#08H SJMP LPP XP1: JB ACC.2,XP2 MOV A,#10H SJMP LPP XP2: JB ACC.3,XP33 MOV A,#18H LPP: ADD A,R0 CLR RS1 CJNE A,#10H,LX0 LX0: JNC XP35 - 158 - MOV DPTR,#LS3 MOVC A,@A+DPTR XP35: RET ORG 0D50H ;显示子程序 SSEE: SETB RS1 ;换工作区 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 ;6 位显示完了吗? DJNZ R5,SSE2 ;5 次显示完了吗? 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 END - 159 - 实验十三 小直流电机闭环调速实验 一、实验目的 (1)掌握用单片机数控直流电机的速度。 (2)了解霍尔传感器的工作特性及使用。 二、实验内容 利用 DAC0832 芯片进行数/模控制,输出的电压经放大后驱动小直流电 机的速度进行数字量调节。本实验可‘测量’、‘设定’、‘显示’直流电机的 转速,程序中不断检测比较当前电机实际转速和设定转速,以判断程序中传 送给 D/A 0832 的数据应该增加还是减少,以此把数字量的变化转换成模拟 量的变化,以控制直流电机的转速。(注:设定输入、显示均为十六进制数 据) 本实验中通过直流电机和霍尔传感器组成测速机构(模块),小直流电 机转盘上装有磁钢,霍尔传感器装在转盘下面,当转盘转动一圈,磁钢感应 传感器一次,传感器产生一个脉冲信号,然后我们通过利用单片机的外部中 断 0 计数,即可测出当前电机的实际转速。我们可以用实际转速和设定转速 进行比较,从而控制 D/A0832 输出电压信号的大小,使得电机工作在程序设 定的转速,实验小直流机的闭环调速控制。 三、实验接线图 - 160 - 四、实验程序框图 五、实验步骤 P1.0~P1.7→K8~K1;(通过 K1~K8 可设定直流电机转速,圈数/S,十六 进制输入),P3.2→HOUT(直流电机传感器输出);CS5→FF80H,AOUT→DJ, WR→/IOWR,JX2→JX0。 运行程序:数码管上显示“设定转速值- -当前转速值”! 注意:设定圈数/S 值不要太高,因为小直流电机实际转速大约在 1F/S。 快捷连线说明:P1.0~P1.7→K8~K1, P3.2→HOUT, CS5→FF80H, AOUT→DJ, WR→/IOWR, JX2→JX0。 六、思考: 霍尔传感器测到的速度在程序设计中是如何实现判定的? - 161 - 七、程序清单 (1)基本程序:文件名:control.ASM ORG 0000H LJMP SE11 ORG 0003H LJMP COUNTER ORG 000BH LJMP CTIME ORG 0590H SE11: MOV SP,#53H MOV P2,#0FFH MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A SETB EA ;开所有中断 SETB EX0 ;开外部中断 0 SETB IT0 ;外部中断 0 下降沿有效 SETB ET0 ;开定时器 0 断 MOV TMOD,#01H ;定时器 0 工作在方式 1 MOV TH0,#0B4H ;每 50MS 中断一次 MOV TL0,#00H SETB TR0 MOV 40H,#00H MOV 41H,#00H MOV 42H,#00H MOV R6,#00H MOV 7EH,#00H ;第一、第二位显示开关输入每秒钟转数 MOV 7DH,#00H MOV 7CH,#14H ;第三、第四位显示“- -” MOV 7BH,#14H MOV 7AH,#00H ;第五、第六位显示当前实际每秒钟转速值 MOV 79H,#00H LO18: LCALL SSEE MOV R7,#0FFH LO17: DJNZ R7,LO17 MOV A,42H MOV R0,#79H LCALL PTDS MOV A,P1 ;开关输入转数,并把数值送入显示缓冲区 MOV B,A ANL A,#0FH MOV 7DH,A MOV A,B SWAP A - 162 - ANL A,#0FH MOV 7EH,A ;由数码管第一、第二位显示 MOV DPTR,#0FF80H MOV A,R6 MOVX @DPTR,A ;送 0832 转换 MOV A,42H MOV B,P1 SUBB A,B ;实际转速与设定转速进行比较。 JZ LL AD: JC AA MOV R2,#09H ;延时 LCALL DELYA CJNE R6,#01H,L1 JMP LL L1: DEC R6 JMP LL AA: MOV R2,#09H ;延时 LCALL DELYA CJNE R6,#0FFH,L2 JMP LL L2: INC R6 LL: SJMP LO18 ORG 0700H PTDS: MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH ;拆送显示缓冲区 MOV @R0,A INC R0 RET ORG 0D50H SSEE: SETB RS1 ;换工作区 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: MOV R1,#20H MOV A,30H CPL A MOVX @R1,A ;字位送入 MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF - 163 - 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 COUNTER: ;外部中断 0,电机转一圈计数一次! INC 40H RETI CTIME: ;定时器 0,定时 1S,并显示每秒钟电机转动圈数! MOV TH0,#0B4H MOV TL0,#00H INC 41H MOV A,41H CJNE A,#20,WW ;20*50MS=1S MOV 42H,40H ;42H 用来存放 1S 钟的所转的圈数! MOV 40H,#00H MOV 41H,#00H WW: RETI DELYA: PUSH 02H DELYB: PUSH 02H DELYC: PUSH 02H DELYD: DJNZ R2,DELYD LCALL SSEE POP 02H DJNZ R2,DELYC POP 02H DJNZ R2,DELYB POP 02H DJNZ R2,DELYA RET DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH END - 164 - (2)带注释的基本程序(文件名 SJXHW21.ASM) ORG 0000H LJMP SE11 ORG 0003H ;外部中断 0 入口地址 LJMP COUNTER ORG 000BH ;定时器 0 中断入口地址 LJMP CTIME ORG 0590H SE11: MOV SP,#53H MOV P2,#0FFH MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A SETB EA ;开所有中断 SETB EX0 ;开外部中断 0 SETB IT0 ;外部中断 0 下降沿有效 SETB ET0 ;开定时器 0 断 MOV TMOD,#01H ;定时器 0 工作在方式 1 MOV TH0,#0B4H ;每 50MS 中断一次 MOV TL0,#00H SETB TR0 MOV 40H,#00H MOV 41H,#00H MOV 42H,#00H MOV R6,#00H MOV 7EH,#00H ;第一、第二位显示开关输入每秒钟转数 MOV 7DH,#00H MOV 7CH,#14H ;第三、第四位显示“- -” MOV 7BH,#14H MOV 7AH,#00H ;第五、第六位显示当前实际每秒钟转速值 MOV 79H,#00H LO18: LCALL SSEE MOV R7,#0FFH LO17: DJNZ R7,LO17 MOV A,42H MOV R0,#79H LCALL PTDS MOV A,P1 ;开关输入转数,并把数值送入显示缓冲区 MOV B,A ANL A,#0FH MOV 7DH,A MOV A,B SWAP A ANL A,#0FH - 165 - MOV 7EH,A ;由数码管第一、第二位显示 MOV DPTR,#0FF80H MOV A,R6 MOVX @DPTR,A ;送 0832 转换 MOV A,42H MOV B,P1 SUBB A,B ;实际转速与设定转速进行比较。 JZ LL AD: JC AA MOV R2,#09H ;延时 LCALL DELYA CJNE R6,#01H,L1 JMP LL L1: DEC R6 JMP LL AA: MOV R2,#09H ;延时 LCALL DELYA CJNE R6,#0FFH,L2 JMP LL L2: INC R6 LL: SJMP LO18 ORG 0700H PTDS: MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH ;拆送显示缓冲区 MOV @R0,A INC R0 RET ORG 0D50H SSEE: SETB RS1 ;换工作区 MOV R5,#05H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: MOV R1,#20H MOV A,30H CPL A MOVX @R1,A ;字位送入 MOV R0,31H MOV A,@R0 MOV DPTR,#DDFF MOVC A,@A+DPTR ;取字形代码 - 166 - 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 COUNTER: ;外部中断 0,电机转一圈计数一次! INC 40H RETI CTIME: ;定时器 0,定时 1S,并显示每秒钟电机转动圈数! MOV TH0,#0B4H MOV TL0,#00H INC 41H MOV A,41H CJNE A,#20,WW ;20*50MS=1S MOV 42H,40H ;42H 用来存放 1S 钟的所转的圈数! MOV 40H,#00H MOV 41H,#00H WW: RETI DELYA: PUSH 02H DELYB: PUSH 02H DELYC: PUSH 02H DELYD: DJNZ R2,DELYD LCALL SSEE POP 02H DJNZ R2,DELYC POP 02H DJNZ R2,DELYB POP 02H DJNZ R2,DELYA RET DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH END - 167 - 实验十四 PWM 脉冲宽度调制实验 一、实验目的 (1)了解 PWM 工作原理。 (2)学会设计 PWM 转换电路,以满足各种能量转换需要。 二、实验内容 利用单片机 I/0 口 P1.7 来产生一个 PWM 信号(脉冲宽度可在程序中设 定),然后通过 PWM 转换电路,来驱动小直流电机转动,调整 PWM 信号脉冲 宽度,观察小直流电机工作有何变化。 三、PWM 硬件转换电路原理图 四、实验程序框图 - 168 - 五、实验步骤 PWMIN 接 P1.7,VOUT 接小直流电机输入端 DJ 孔。运行程序,观察小 直流电机的工作情况,修改程序中的高、低电平延时比例,重新保存、编译、 装载、运行,观察电机工作有何变化? 快捷连线说明:PWMIN→P1.7, VOUT→DJ(小直流电机) 六、思考:单片机是如何实现 PWM 脉冲宽度调制的? 七、实验程序清单 (1)、基本程序:文件名: PWM.ASM ;改变“设置低电平持续时间”,“设置高电平持续时间”的比例,即改变脉冲宽度比例! OUTPORT BIT P1.7 ORG 0000H JMP START ORG 100H START: CLR OUTPORT MOV R2,#5 LCALL DELY ;设置低电平持续时间 SETB OUTPORT MOV R2,#5 LCALL DELY ;设置高电平持续时间 LJMP START 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 (2)带注释的基本程序(文件名 SJXHW26.ASM) ;改变“设置低电平持续时间”,“设置高电平持续时间”的比例,即改变脉冲宽 度比例! OUTPORT BIT P1.7 ORG 0000H JMP START ORG 100H - 169 - START: CLR OUTPORT MOV R2,#5 LCALL DELY ;设置低电平持续时间 SETB OUTPORT MOV R2,#5 LCALL DELY ;设置高电平持续时间 LJMP START 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 - 170 - 单元 5 显示技术实验 实验十五 8 段 LED 数码管显示实验 一、实验目的 (1)掌握 8 段 LED 数码管管动态显示的原理及编程方法。 (2)熟悉 8255 接口芯片的编程与应用。 二、实验内容 (1)利用实验仪已有 6 位 8 段码 LED 显示电路,用动态方式循环显示 一组数据。 (2)七段数码管的字段分配 三、实验程序框图 四、实验接线图 - 171 - 位码由 8255 的 PA 口输出,字形由经 8255 的 PB 口输出。LED 八段管为 共阴连接。 8255 芯片的 I/O 地址分配如下: 8255 的控制口地址为 0FF23H; 8255 的 PA 口(字位控制口)地址为 0FF20H; 8255 的 PB 口(字形控制口)0FF21H。 8255 的 PC 口(键入口)0FF22H。 五、思考:如要固定显示(如 201211),程序应如何修改? 六、程序清单 基本程序(文件名 ledsy09ok') ;;ledsy09ok' OUTBIT equ 0ff20h ; 位控制口 ff20h,字形口 ff21h LEDBuf equ 60h ; 显示缓冲 Num equ 70h ; 显示的数据 DelayT equ 75h org 0000h ljmp qq org 0660h qq: ljmp Start LEDMAP: ; 共阳 LED 八段管显示码 DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH Delay: ; 延时子程序 mov r7, #0 DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop - 172 - ret DisplayLED: mov r0, #LEDBuf mov r1, #6 ; 共 6 个八段管 mov r2, #11011111b ; 从左边开始显示(0 有效) Loop: mov dptr, #OUTBIT mov a,#0ffh;字段 1 有效 movx @dptr, a ; 关所有八段管 mov a, @r0 mov dptr,#0ff21h movx @dptr, a ;送字形码 mov dptr, #OUTBIT;位控口 mov a, r2 movx @dptr, a ; 显示一位八段管 mov r6, #1 call Delay mov a, r2 ; 显示下一位 rr a mov r2, a;显示下一位 inc r0 djnz r1, Loop mov dptr, #OUTBIT mov a, #0ffh movx @dptr, a ; 关所有八段管 ret Start: mov dptr,#0ff23h; 8255 控制口 mov a,#81h movx @dptr,a mov sp, #40h mov Num, #0 MLoop: inc Num mov a, Num mov b, a mov r0, #LEDBuf FillBuf: mov a, b anl a, #0fh mov dptr, #LEDMap movc a, @a+dptr ; 数字转换成显示码 mov @r0,a ; 显示在码填入显示缓冲 inc r0 inc b - 173 - cjne r0, #LEDBuf+6, FillBuf mov DelayT,#80 DispAgain: call DisplayLED ; 显示 djnz DelayT,DispAgain ljmp MLoop END - 174 - 实验十六 LED16*16 点阵显示实验 一、实验目的 (1)利用单片机并行控制 LED 点阵显示。 (2)掌握单片机与 LED 点阵块之间接口电路设计及编程。 二、实验内容 利用取模软件建立标准字库,编制程序实现点阵循环左移显示 汉字。 三、编程指南 根据提供 I/O 地址、功能,由不同 I/O 口分别提供字形代码送行,列扫 描信号送列扫描行,凡字形代码位"1"、列扫描信号"0"该点点亮,否则熄灭, 通过逐列扫描,循环点亮字形或曲线。 四、实验接线图 五、实验步骤 将 JHPC 接 JX16,JHP1 接 JP10,JLPA 接 JX9,JLPB 接 JX15,运行程序 即可左移显示“启东计算机总厂 OK”字样。 快捷连线说明:JLPC→JX16 JHP1→JX10 JLPA→JX9 JLPB→JX15 - 175 - 六、思考:修改设计右移显示“东莞计算机总厂 OK”字样。 七、程序清单 (1)基本程序(文件名 LEDQDB·ASM) ORG 0000H LJMP START ORG 2D80H XPA EQU 0FF28H ;L-SAO-1,CTL-MODE:BING XIN KO XPB EQU 0FF29H ;L-SAO-2 ;----------------------------------------------------------------- XPC EQU 0FF2AH ;H-CODE-2 XPCTL EQU 0FF2BH START: MOV DPTR,#XPCTL ;THIS IS A PROGRAM OF L-MOVE-WORD MOV A,#80H MOVX @DPTR,A ;WR-CTL CALL OFFLED ;OFFLED CLR 00H MOV R6,#28H MOV R7,#0FFH ;---------------------------------------- X0: MOV R0,#00H ;ONE-WORD-FIRST-NUM X1: CALL DEL1 ;QI INC R0 ;RL-1-BIT mov a,r0 anl a,#0fh cjne a,#00h,l2 mov a,#10h add a,r0 mov r0,a l2:CJNE R0,#00H,X1 SJMP X0 ;----------------------------------------------------------------- DISPW: PUSH 00H ;DISP-ONE-WORD MOV R1,#01H ;L-NUM CLR C DISP1: MOV A,R0 ;BH1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV DPTR,#XPC MOVX @DPTR,A ;------------------------------------------- mov a,#10h add a,r0 MOV DPTR,#TAB MOVC A,@A+DPTR - 176 - MOV P1,A INC R0 ;BH2 ;------------------------------------------- mov a,r0 anl a,#0fh cjne a,#00h,l1 mov a,#10h add a,r0 mov r0,a clr c ;!!!!! l1: MOV DPL,R6 ;XPA/XPB MOV DPH,R7 MOV A,R1 ;L0----L7 CPL A MOVX @DPTR,A mov r3,#80h djnz r3,$ CALL OFFLED MOV A,R1 RLC A MOV R1,A JNC DISP1 JB 00H,EXIT ;---------------------------------- SETB 00H CLR C MOV R1,#01H MOV R6,#29H MOV R7,#0FFH AJMP DISP1 EXIT: MOV R6,#28H MOV R7,#0ffH CLR 00H POP 00H RET ;----------------------------------------------------------------- DEL1: MOV R2,#05H DELY: PUSH 02H DEL2: PUSH 02H DEL3: PUSH 02H DEL4: DJNZ R2,DEL4 CALL DISPW POP 02H DJNZ R2,DEL3 - 177 - POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET ;--------------------------------------------------------- OFFLED: MOV DPTR,#XPA MOV A,#0FFH MOVX @DPTR,A MOV DPTR,#XPB MOVX @DPTR,A RET tab: ;-- 文字: 祝 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 10H,10H,91H,73H,15H,18H,00H,7FH,41H,41H,41H,41H,7FH,00H,00H,00H ;DB 40H,80H,00H,0FFH,00H,0C1H,02H,0CH,0F0H,00H,00H,0FEH,01H,01H,0FH,00 H ;-- 文字: 高 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 20H,20H,20H,20H,2EH,2AH,0AAH,6AH,2AH,2AH,2EH,20H,20H,20H,20H,00H ;DB 00H,0FFH,80H,80H,0BCH,0A4H,0A4H,0A4H,0A4H,0A4H,0BCH,82H,81H,0FEH,0 0H,00H ;-- 文字: 教 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 08H,28H,29H,2BH,0FDH,29H,39H,28H,0AH,1FH,0F0H,10H,11H,1EH,10H,00H ;DB 90H,90H,12H,11H,7EH,0A0H,22H,22H,04H,04H,0C8H,30H,0CCH,03H,02H,00h ;-- 文字: 会 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 01H,02H,02H,04H,0AH,12H,22H,0C2H,22H,12H,0AH,04H,06H,03H,02H,00H ;DB 00H,00H,42H,47H,4AH,52H,62H,46H,44H,44H,54H,4FH,46H,00H,00H,00H ;-- 文字: 胜 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB - 178 - 00H,00H,7FH,48H,48H,7FH,04H,38H,08H,08H,0FFH,08H,08H,08H,00H,00H ;DB 02H,0CH,0F0H,84H,82H,0FCH,04H,84H,84H,84H,0FCH,84H,84H,84H,04H,00H ;-- 文字: 利 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 00H,04H,24H,24H,27H,3FH,44H,44H,44H,00H,1FH,00H,00H,00H,0FFH,00H ;DB 08H,10H,20H,0C0H,00H,0FFH,80H,70H,20H,00H,0F0H,04H,02H,01H,0FEH,00 H ;-- 文字: 召 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 00H,00H,41H,41H,42H,44H,48H,70H,40H,42H,42H,43H,42H,7CH,00H,00H ;DB 00H,00H,00H,00H,0FFH,82H,82H,82H,82H,82H,82H,82H,0FFH,00H,00H,00H ;-- 文字: 开 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 02H,42H,42H,42H,42H,7FH,42H,42H,42H,42H,7FH,42H,42H,42H,42H,00H ;DB 00H,02H,04H,08H,30H,0C0H,00H,00H,00H,00H,0FEH,00H,00H,00H,00H,00H ;-- 文字: 来 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 00H,01H,21H,21H,29H,25H,23H,0FFH,21H,23H,2DH,29H,21H,21H,01H,00H ;DB 04H,04H,08H,08H,10H,20H,40H,0FFH,80H,40H,20H,10H,18H,0CH,08H,00H ;-- 文字: 宾 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 00H,18H,20H,20H,2FH,29H,29H,0A9H,69H,29H,29H,21H,29H,30H,20H,00H ;DB 20H,21H,22H,24H,0ECH,38H,28H,20H,20H,0F0H,28H,2CH,27H,22H,20H,00H ;-- 文字: 您 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 01H,02H,0CH,3FH,0C0H,09H,16H,60H,20H,2FH,20H,24H,22H,31H,20H,00H ;DB 00H,04H,1CH,0C0H,1CH,02H,02H,92H,4AH,82H,02H,0EH,00H,90H,0CH,00H - 179 - ;-- 文字: 好 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 08H,08H,0FH,0F8H,08H,0FH,01H,41H,41H,41H,4FH,51H,61H,41H,01H,00H ;DB 01H,0C2H,44H,28H,30H,0CEH,04H,00H,02H,01H,0FEH,00H,00H,00H,00H,00H ;-- 文字: 欢 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 28H,24H,22H,21H,26H,38H,04H,18H,0F0H,17H,10H,10H,14H,18H,10H,00H ;DB 04H,08H,32H,0C2H,0C2H,34H,04H,08H,30H,0C0H,60H,18H,0CH,06H,04H,00H ;-- 文字: 迎 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 02H,82H,73H,20H,00H,3FH,20H,40H,40H,3FH,20H,20H,20H,3FH,00H,00H ;DB 02H,04H,0F8H,04H,02H,0E2H,42H,82H,02H,0FAH,02H,42H,22H,0C2H,02H,00 H ;-- 文字: 光 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 00H,02H,42H,22H,3AH,13H,02H,0FEH,02H,03H,0AH,72H,22H,06H,02H,00H ;DB 00H,01H,02H,04H,18H,0E0H,00H,00H,00H,0FCH,02H,02H,02H,02H,1EH,00H ;-- 文字: 临 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- ;DB 00H,1FH,00H,00H,7FH,02H,0CH,0F1H,50H,10H,18H,16H,10H,11H,10H,00H ;DB 00H,0F8H,00H,00H,0FEH,00H,00H,0FEH,84H,84H,0FCH,84H,84H,0FEH,80H,0 0H ;-- 文字: 启 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,1FH,12H,12H,12H,92H,72H,52H,12H,12H,12H,1EH,00H,00H DB 02H,04H,18H,0E0H,00H,7EH,44H,44H,44H,44H,44H,44H,44H,7EH,00H,00H - 180 - ;-- 文字: 东 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,20H,20H,23H,2DH,31H,0E1H,21H,2FH,21H,21H,21H,21H,20H,00H,00H DB 00H,00H,04H,18H,70H,20H,04H,02H,0FFH,00H,40H,20H,18H,0CH,00H,00H ;-- 文字: 计 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 04H,84H,74H,27H,00H,00H,04H,04H,04H,04H,0FFH,04H,04H,04H,04H,00H DB 00H,00H,00H,0FEH,04H,08H,10H,00H,00H,00H,0FFH,00H,00H,00H,00H,00H ;-- 文字: 算 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 10H,0E0H,5FH,55H,75H,55H,55H,15H,35H,0D5H,55H,7FH,50H,40H,40H,00H DB 10H,10H,0D1H,56H,78H,50H,50H,50H,50H,7FH,50H,0D0H,10H,10H,10H,00H ;-- 文字: 机 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 10H,10H,13H,0FFH,12H,11H,10H,00H,7FH,40H,40H,40H,7FH,00H,00H,00H DB 20H,0C0H,00H,0FFH,00H,82H,0CH,30H,0C0H,00H,00H,00H,0FCH,02H,1EH,00 H ;-- 文字: 总 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,1FH,91H,71H,11H,11H,11H,31H,0D1H,1FH,00H,00H,00H,00H DB 00H,04H,1CH,00H,3CH,02H,02H,42H,32H,02H,02H,0EH,20H,18H,0CH,00H ;-- 文字: 厂 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,7FH,40H,40H,40H,40H,40H,40H,40H,40H,40H,40H,40H,40H,00H DB 02H,0CH,0F0H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: O k -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=8x16 -- DB 07H,08H,10H,10H,10H,08H,07H,00H,10H,1FH,11H,03H,14H,18H,10H,00H DB 0F0H,08H,04H,04H,04H,08H,0F0H,00H,04H,0FCH,04H,80H,64H,1CH,04H,00H END - 181 - 实验十七 128*64 LCD 液晶显示 1、实验目的 (1)掌握单片机与液晶显示器之间接口设计与编程。 (2)利用点阵式液晶显示器显示汉字或图形。 2、实验内容 编制程序,利用标准字库,在液晶显示器上显示汉字。 3、编程指南 (1)显示内存与液晶显示屏关系 Correspondence with data bits and arrow direction →DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7 (2)利用 P1 口作为液晶显示器接口的数据线,P3 口作为其控制线,利 用取模软件建立标准字库后,通过查表程序依次将字库中的字形代码送显示 内存显示汉字或图形。 (3)编程流程:开显 示→ 设置页地址→ 设置 Y 地→ 写数据表 1→写 数据表 2。 (4)显示控制指令表 - 183 - 四、实验接线图 五、实验步骤 用扁平线连 JP10 座(P1 口)接到 JX12 座(DB0~DB7),连 JP11 座(P3 口) 到 JX14 座,用双头线将液晶显示的/RST 孔接到单片机“总线插孔”框中的 /RST。运行程序 LCDQD1·ASM 或 LCDQD2·ASM。观察液晶屏显示。 快捷连线说明:JX10→JX12 JX11→JX14 /RST→/RST 六、思考:如何修改显示内容? 七、程序清单 (1)基本程序(文件名 LCDQD1·ASM) ;Program Example ;*************** THIS IS A 51 PROGRAM (128*64) ****** ; 1 2 3 4 5 6 7 8 9--16 ; CS1 CS2 Vss Vdd Vee RS R/W E DB0--DB7 ; P3.4 P3.5 P3.0 P3.1 P3.2 P1 ;**************************************************** org 0000h ljmp rst RS EQU 0B0h ;P3.0 RW EQU 0B1H ;P3.1 E EQU 0B2H ;P3.2 CS1 EQU 0B4H ;P3.4 CS2 EQU 0B5H ;P3.6(5103k),5203k:p3.5 ;***************************************************** ORG 30F0H RST: MOV R7, #04H LCALL DELAYXMS - 184 - CLR E SETB RS SETB CS1 ;SELECT-CS1 CLR CS2 CLR RS MOV P1, #3FH ;DISPLAY ON LCALL WRITE MOV R7, #01H ; LCALL DELAYXMS SETB CS2 ;SELECT-CS2 CLR CS1 CLR RS MOV P1, #3FH ;DISPLAY ON LCALL WRITE MAIN: MOV R7, #01FH MOV DPTR, #TAB5 LCALL ZXL MOV R7,#01FH LCALL DELAYXMS MOV DPTR,#TAB6 LCALL ZXL MOV R7,#01FH LCALL DELAYXMS LJMP MAIN ;*************************************************** ZXL: CLR CS2 SETB CS1 ;S-CS1 LCALL XPAGE ;R0=08H,R2=B8H,Z=Y=PAG=00 LCALL COM CLR CS1 SETB CS2 LCALL XPAGE LCALL COM RET ;***************************************************** XPAGE:CLR E CLR RS MOV P1, #0C0H ;SET-Z=00,FIRST H LCALL WRITE MOV P1, #40H ;SET-Y=00,FIRST L LCALL WRITE MOV R0, #08H MOV R2, #0B8H MOV P1, #0B8H ;SET-PAG=00 - 185 - LCALL WRITE RET ;****************************************************** COM: MOV R1, #40H ;R0=#08H,R2=#0B8H SETB RS ;WR-DATA J4: CLR A MOVC A, @A+DPTR ;DPTR=#TAB5 MOV P1, A LCALL WRITE INC DPTR DJNZ R1, J4 ;LOAD-64-BYTE CLR RS ;WR-COMD INC R2 MOV P1, R2 LCALL WRITE ;SET-PAG=01 MOV P1, #40H ;SET-Y=00H LCALL WRITE DJNZ R0, COM RET ;*************************************************** WRITE:CLR RW CLR E SETB E LCALL DELAY2MS CLR E RET ;********************************* DELAY2MS: MOV R6, #02H DELAY0: MOV R5, #0FH DELAY1: DJNZ R5, DELAY1 DJNZ R6, DELAY0 RET ;************************************* DELAYXMS: MOV R5, #40H D1: MOV R6, #0FFH D2: DJNZ R6, D2 DJNZ R5, D1 DJNZ R7, DELAYXMS RET TAB5: DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H - 186 - DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 38H,0F8H,0F0H,10H,10H,10H,16H,1EH DB 1CH,10H,10H,10H,0F8H,0F8H,10H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 0FEH,0FFH,07H,0F9H,0F9H,11H,11H,11H DB 11H,11H,11H,11H,0FBH,0FBH,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,08H,0EH,07H DB 01H,00H,00H,0FH,0FH,02H,02H,02H DB 02H,02H,02H,02H,07H,07H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 08H,18H,70H,70H,60H,00H,00H,00H DB 00H,00H,0F0H,0F0H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,80H,0E0H,78H,38H,0E8H,0E0H,20H DB 0A0H,0E0H,68H,38H,28H,20H,0E0H,0E0H DB 30H,30H,20H,00H,00H,00H,00H,00H DB 00H,00H,00H,38H,0F8H,0F8H,80H,80H DB 00H,00H,00H,00H,00H,00H,00H,08H DB 08H,0FCH,0FCH,0CH,04H,84H,84H,04H DB 04H,04H,0FFH,0FFH,04H,04H,04H,06H DB 06H,04H,00H,00H,00H,00H,00H,02H DB 03H,01H,00H,0FFH,0FFH,95H,95H,95H DB 95H,95H,95H,95H,95H,0FFH,0FFH,00H DB 00H,00H,00H,00H,00H,00H,00H,00H - 187 - DB 01H,81H,0F1H,7FH,0FFH,0FFH,19H,31H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,0FH,1FH,1CH,07H,03H,00H,00H DB 00H,00H,3FH,3FH,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 04H,24H,24H,34H,1CH,0FH,07H,04H DB 04H,04H,04H,3FH,3FH,02H,02H,02H DB 03H,03H,02H,00H,00H,00H,00H,00H DB 03H,03H,00H,3EH,3FH,3FH,30H,18H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,10H,10H,10H,10H,90H,0F0H DB 0F8H,3EH,9EH,90H,90H,10H,10H,10H DB 10H,18H,18H,10H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,04H,0C6H,0E7H,75H DB 34H,04H,07H,0FFH,0FFH,14H,34H,64H DB 0E6H,0C6H,84H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,02H,03H,01H,01H,00H,00H - 188 - DB 04H,0CH,0CH,0FH,07H,00H,00H,00H DB 00H,01H,03H,03H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,0E0H,0E0H,20H,20H,20H,0E0H,0E0H DB 20H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,10H,30H,70H DB 60H,00H,80H,0E0H,78H,18H,90H,80H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,0F0H,0F0H,20H,20H,20H,20H DB 20H,20H,20H,20H,20H,20H,20H,20H DB 30H,10H,00H,00H,00H,00H,00H,00H DB 31H,0FFH,0FFH,00H,00H,00H,0FFH,0FFH DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,7FH,0FFH,0A1H,21H DB 61H,0E1H,0A1H,21H,21H,61H,0FFH,0BFH DB 01H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,0FFH,0FFH,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 0EH,07H,01H,00H,00H,00H,1FH,1FH DB 10H,1EH,1EH,18H,00H,00H,00H,00H DB 00H,18H,1EH,0EH,00H,1FH,3FH,31H DB 20H,20H,23H,23H,00H,3EH,3EH,11H DB 07H,0FH,0CH,00H,00H,00H,00H,00H DB 38H,1FH,07H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H TAB6: DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H - 189 - DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 08H,0F8H,0F8H,08H,08H,08H,18H,70H DB 0E0H,80H,00H,00H,00H,08H,08H,08H DB 0F8H,0F8H,08H,08H,08H,00H,00H,00H DB 80H,0E0H,70H,18H,08H,08H,08H,18H DB 78H,78H,00H,00H,08H,0F8H,0F8H,08H DB 08H,08H,88H,98H,38H,20H,00H,00H DB 00H,04H,04H,04H,44H,64H,64H,74H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,0FFH,0FFH,00H,00H,00H,80H,0E0H DB 7FH,1FH,00H,00H,00H,00H,00H,00H DB 0FFH,0FFH,00H,00H,00H,00H,00H,00H DB 3FH,0FFH,0C0H,80H,00H,00H,00H,80H DB 0E0H,60H,00H,00H,00H,0FFH,0FFH,02H DB 02H,02H,0FH,8FH,0C0H,40H,00H,00H DB 00H,00H,00H,84H,0CCH,0ECH,76H,36 DB 00H,00H,00H,00H,00H,00H,00H,00H DB 01H,01H,01H,01H,01H,01H,01H,00H DB 00H,00H,00H,00H,00H,01H,01H,01H DB 01H,01H,01H,01H,01H,00H,00H,00H DB 00H,00H,00H,01H,01H,01H,01H,01H DB 00H,00H,00H,00H,01H,01H,01H,01H DB 01H,01H,01H,01H,01H,00H,00H,00H DB 02H,02H,03H,01H,00H,00H,02H,02H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,80H,0F0H,0F0H,20H,0A0H DB 0A0H,20H,24H,3CH,0BCH,0B8H,20H,20H DB 20H,0A0H,0E0H,60H,60H,00H,00H,00H DB 00H,10H,0D0H,0D0H,10H,0F0H,0F8H,18H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,41H,41H,44H,4CH,78H DB 79H,57H,47H,0C0H,0FFH,07FH,43H,40H DB 40H,40H,60H,60H,40H,00H,00H,00H DB 80H,9CH,9FH,97H,90H,9FH,0FFH,0FCH DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H - 190 - DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,20H,30H,10H,10H,18H DB 01H,0CH,06H,03H,01H,03H,02H,02H DB 06H,0CH,1CH,18H,00H,00H,00H,00H DB 01H,01H,00H,08H,18H,1CH,0FH,07H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 5CH,0CEH,0C6H,0C2H,62H,32H,33H,11H DB 01H,01H,00H,00H,00H,00H,00H,04H DB 04H,84H,0E4H,0FCH,5CH,44H,0C4H,0C4H DB 0C6H,06H,04H,0F0H,0F0H,00H,00H,0FEH DB 0FEH,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 07H,05H,0FCH,0FCH,24H,25H,67H,66H DB 0CEH,0CCH,80H,00H,00H,00H,00H,08H DB 0EH,07H,83H,0CEH,6CH,3CH,1FH,07H DB 00H,00H,00H,7FH,7FH,00H,00H,0FFH DB 0FFH,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 02H,06H,07H,03H,00H,00H,00H,00H DB 01H,03H,03H,00H,00H,00H,04H,04H DB 06H,03H,01H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,02H,06H,06H,07H DB 03H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H - 191 - DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,80H,0E0H,0F8H,3CH,3CH,0E0H,0C0H DB 80H,00H,00H,00H,00H,00H,00H,00H DB 00H,0C0H,0F8H,7CH,1CH,00H,80H,80H DB 08H,38H,70H,60H,00H,0E0H,0E0H,40H DB 00H,00H,00H,00H,00H,00H,00H,0F8H DB 0F8H,90H,90H,0F8H,0F8H,00H,00H,0F8H DB 0F8H,90H,90H,0F8H,0F8H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 36H,0F7H,0C5H,34H,0F4H,0C4H,06H,0E3H DB 0F3H,33H,02H,02H,00H,00H,10H,1CH DB 0EH,0FFH,0FFH,0FFH,00H,00H,03H,0FH DB 3CH,0F0H,0E0H,0F8H,3FH,07H,01H,00H DB 00H,00H,00H,00H,80H,84H,0C4H,0C5H DB 0E5H,0B4H,0BCH,0DDH,0CFH,07H,0C4H,0CCH DB 9DH,0B7H,0A6H,0E6H,0E4H,46H,46H,40H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 10H,13H,13H,11H,11H,1DH,1FH,13H DB 18H,08H,08H,00H,00H,00H,00H,00H DB 00H,1FH,1FH,1FH,10H,18H,0CH,06H DB 07H,03H,01H,03H,07H,06H,0CH,0CH DB 08H,08H,00H,00H,00H,00H,00H,0FH DB 0FH,08H,08H,0FH,0FH,00H,1FH,1FH DB 08H,08H,08H,0FH,0FH,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H END LCDQD2·ASM。 RS EQU 0B0h ;P3.0:数据、命令输入控制端 RW EQU 0B1H ;P3.1:数据读写控制端 E EQU 0B2H ;P3.2: 使能控制端 CS1 EQU 0B4H ;P3.4:LCD 左半区控制芯片片选 CS2 EQU 0B5H ;P3.5:LCD 右半区控制芯片片选 ;P1 口作为数据总线 ;***************************************************** ; ORG 0000H - 192 - RST: MOV R7, #04H LCALL DELAYXMS CLR E SETB RS SETB CS1 ;SELECT-CS1 CLR CS2 CLR RS MOV P1, #3FH ;DISPLAY ON LCALL WRITE MOV R7, #01H SETB CS2 ;SELECT-CS2 CLR CS1 CLR RS MOV P1, #3FH ;DISPLAY ON LCALL WRITE MAIN: MOV R7, #0FH MOV DPTR, #TAB5 LCALL ZXL MOV R7,#03FH LCALL DELAYXMS ;延时子程序 MOV DPTR,#TAB6 LCALL ZXL MOV R7,#03FH LCALL DELAYXMS ;延时子程序 LJMP MAIN ;*************************************************** ZXL: CLR CS2 SETB CS1 ;S-CS1 有效 LCALL XPAGE ;R0=08H,R2=B8H,Z=Y=PAG=00 LCALL COM CLR CS1 SETB CS2 ;S-CS2 有效 LCALL XPAGE LCALL COM RET ;***************************************************** XPAGE: CLR E CLR RS MOV P1, #0C0H ;SET-Z=00,FIRST 第一行 LCALL WRITE MOV P1, #40H ;SET-Y=00,FIRST L 第一列 LCALL WRITE MOV R0, #08H MOV R2, #0B8H - 193 - MOV P1, #0B8H ;SET-PAG=00 第一页 LCALL WRITE RET ;****************************************************** COM: CLR 00H COM1: MOV R1, #40H ;R0=#08H,R2=#0B8H MOV R3,#10H SETB RS ;WR-DATA PUSH DPH PUSH DPL J4: CLR A MOVC A, @A+DPTR ;DPTR=#TAB5 MOV P1, A LCALL WRITE INC DPTR DJNZ R3,J41 MOV R3,#10H CLR C MOV A,DPL ADD A,#10H MOV DPL,A JNC J41 INC DPH J41: DJNZ R1, J4 ;LOAD-64-BYTE CLR RS ;WR-COMD INC R2 MOV P1, R2 LCALL WRITE ;SET-PAG=01 MOV P1, #40H ;SET-Y=00H LCALL WRITE POP DPL POP DPH CPL 00H JNB 00H,J43 CLR C MOV A,DPL ADD A,#10H MOV DPL,A JNC J42 INC DPH AJMP J42 J43: CLR C MOV A,DPL ADD A,#70H - 194 - MOV DPL,A JNC J42 INC DPH J42: DJNZ R0, COM1 RET ;*************************************************** WRITE: CLR RW ;写数据或命令子程序 CLR E SETB E LCALL DELAY2MS CLR E RET ;********************************* DELAY2MS: MOV R6, #02H ;延时 2MS 子程序 DELAY0: MOV R5, #0FH DELAY1: DJNZ R5, DELAY1 DJNZ R6, DELAY0 RET ;************************************* DELAYXMS: MOV R5, #40H ;延时子程序 D1: MOV R6, #0FFH D2: DJNZ R6, D2 DJNZ R5, D1 DJNZ R7, DELAYXMS RET TAB5: DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 欢 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 14H,24H,44H,84H,64H,1CH,20H,18H,0FH,0E8H,08H,08H,28H,18H,08H,00H DB 20H,10H,4CH,43H,43H,2CH,20H,10H,0CH,03H,06H,18H,30H,60H,20H,00H ;-- 文字: 迎 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,41H,0CEH,04H,00H,0FCH,04H,02H,02H,0FCH,04H,04H,04H,0FCH,00H,00H DB 40H,20H,1FH,20H,40H,47H,42H,41H,40H,5FH,40H,42H,44H,43H,40H,00H ;-- 文字: 启 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0F8H,48H,48H,48H,49H,4EH,4AH,48H,48H,48H,78H,00H,00H - 195 - DB 40H,20H,18H,07H,00H,7EH,22H,22H,22H,22H,22H,22H,22H,7EH,00H,00H ;-- 文字: 东 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,04H,04H,0C4H,0B4H,8CH,87H,84H,0F4H,84H,84H,84H,84H,04H,00H,00H DB 00H,00H,20H,18H,0EH,04H,20H,40H,0FFH,00H,02H,04H,18H,30H,00H,00H ;-- 文字: 计 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 20H,21H,2EH,0E4H,00H,00H,20H,20H,20H,20H,0FFH,20H,20H,20H,20H,00H DB 00H,00H,00H,7FH,20H,10H,08H,00H,00H,00H,0FFH,00H,00H,00H,00H,00H ;-- 文字: 算 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 08H,07H,0FAH,0AAH,0AEH,0AAH,0AAH,0A8H,0ACH,0ABH,0AAH,0FEH,0AH,02H,02H,00H DB 08H,08H,8BH,6AH,1EH,0AH,0AH,0AH,0AH,0FEH,0AH,0BH,08H,08H,08H,00H ;-- 文字: 产 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,04H,0E4H,44H,4CH,74H,54H,45H,46H,64H,54H,4CH,44H,64H,44H,00H DB 40H,30H,0FH,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 的 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,0F8H,8CH,8BH,88H,0F8H,40H,30H,8FH,08H,08H,08H,08H,0F8H,00H,00H DB 00H,7FH,10H,10H,10H,3FH,00H,00H,00H,03H,26H,40H,20H,1FH,00H,00H ;-- 文字: D -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 08H,0F8H,08H,08H,08H,10H,0E0H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 20H,3FH,20H,20H,20H,10H,0FH,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: I -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,08H,08H,0F8H,08H,08H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,20H,20H,3FH,20H,20H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 实 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,10H,0CH,04H,4CH,0B4H,94H,05H,0F6H,04H,04H,04H,14H,0CH,04H,00H DB 00H,82H,82H,42H,42H,23H,12H,0AH,07H,0AH,12H,0E2H,42H,02H,02H,00H ;-- 文字: 验 -- - 196 - ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 02H,0FAH,82H,82H,0FEH,80H,40H,60H,58H,46H,48H,50H,20H,20H,20H,00H DB 08H,08H,04H,24H,40H,3FH,22H,2CH,21H,2EH,20H,30H,2CH,23H,20H,00H ;-- 文字: 教 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 10H,14H,94H,0D4H,0BFH,94H,9CH,14H,50H,0F8H,0FH,08H,88H,78H,08H,00H DB 09H,09H,48H,88H,7EH,05H,44H,44H,20H,20H,13H,0CH,33H,0C0H,40H,00H ;-- 文字: 学 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,30H,10H,12H,5CH,54H,50H,51H,5EH,0D4H,50H,18H,57H,32H,10H,00H DB 00H,02H,02H,02H,02H,02H,42H,82H,7FH,02H,02H,02H,02H,02H,02H,00H ;-- 文字: 使 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,20H,0F0H,1CH,07H,0F2H,94H,94H,94H,0FFH,94H,94H,94H,0F4H,04H,00H DB 00H,00H,7FH,00H,40H,41H,22H,14H,0CH,13H,10H,30H,20H,61H,20H,00H ;-- 文字: 用 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0FEH,22H,22H,22H,22H,0FEH,22H,22H,22H,22H,0FEH,00H,00H DB 80H,40H,30H,0FH,02H,02H,02H,02H,0FFH,02H,02H,42H,82H,7FH,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 机 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 08H,08H,0C8H,0FFH,48H,88H,08H,00H,0FEH,02H,02H,02H,0FEH,00H,00H,00H DB 04H,03H,00H,0FFH,00H,41H,30H,0CH,03H,00H,00H,00H,3FH,40H,78H,00H ;-- 文字: 总 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0F8H,89H,8EH,88H,88H,88H,8CH,8BH,0F8H,00H,00H,00H,00H DB 00H,20H,38H,00H,3CH,40H,40H,42H,4CH,40H,40H,70H,04H,18H,30H,00H ;-- 文字: 厂 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,0FEH,02H,02H,02H,02H,02H,02H,02H,02H,02H,02H,02H,02H,00H DB 40H,30H,0FH,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 生 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- - 197 - DB 00H,80H,60H,1EH,10H,10H,10H,10H,0FFH,12H,10H,10H,98H,10H,00H,00H DB 01H,40H,40H,41H,41H,41H,41H,41H,7FH,41H,41H,41H,41H,61H,40H,00H ;-- 文字: C -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 0C0H,30H,08H,08H,08H,08H,38H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 07H,18H,20H,20H,20H,10H,08H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: E -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 08H,0F8H,88H,88H,0E8H,08H,10H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 20H,3FH,20H,20H,23H,20H,18H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 系 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,02H,22H,0B2H,0AAH,66H,62H,22H,11H,4DH,81H,01H,01H,00H,00H DB 00H,40H,21H,13H,09H,05H,41H,81H,7FH,01H,05H,09H,13H,62H,00H,00H ;-- 文字: 列 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 02H,82H,42H,0BAH,16H,12H,92H,7AH,12H,00H,0F8H,00H,00H,0FFH,00H,00H DB 41H,40H,20H,10H,09H,06H,01H,00H,00H,00H,07H,20H,40H,3FH,00H,00H ;-- 文字: 仪 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,20H,0F0H,0CH,03H,00H,38H,0C0H,01H,0EH,04H,0E0H,1CH,00H,00H,00H DB 00H,00H,0FFH,00H,40H,40H,20H,10H,0BH,04H,0BH,10H,20H,60H,20H,00H ;-- 文字: 器 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,40H,4FH,49H,49H,0C9H,0CFH,70H,0C0H,0CFH,49H,59H,69H,4FH,00H,00H DB 02H,02H,7EH,45H,45H,44H,7CH,00H,7CH,44H,45H,45H,7EH,06H,02H,00H ;-- 文字: ! -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0F0H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,5FH,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: ! -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0F0H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,5FH,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H TAB6: DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H - 198 - DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 欢 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 14H,24H,44H,84H,64H,1CH,20H,18H,0FH,0E8H,08H,08H,28H,18H,08H,00H DB 20H,10H,4CH,43H,43H,2CH,20H,10H,0CH,03H,06H,18H,30H,60H,20H,00H ;-- 文字: 迎 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,41H,0CEH,04H,00H,0FCH,04H,02H,02H,0FCH,04H,04H,04H,0FCH,00H,00H DB 40H,20H,1FH,20H,40H,47H,42H,41H,40H,5FH,40H,42H,44H,43H,40H,00H ;-- 文字: 启 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0F8H,48H,48H,48H,49H,4EH,4AH,48H,48H,48H,78H,00H,00H DB 40H,20H,18H,07H,00H,7EH,22H,22H,22H,22H,22H,22H,22H,7EH,00H,00H ;-- 文字: 东 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,04H,04H,0C4H,0B4H,8CH,87H,84H,0F4H,84H,84H,84H,84H,04H,00H,00H DB 00H,00H,20H,18H,0EH,04H,20H,40H,0FFH,00H,02H,04H,18H,30H,00H,00H ;-- 文字: 计 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 20H,21H,2EH,0E4H,00H,00H,20H,20H,20H,20H,0FFH,20H,20H,20H,20H,00H DB 00H,00H,00H,7FH,20H,10H,08H,00H,00H,00H,0FFH,00H,00H,00H,00H,00H ;-- 文字: 算 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 08H,07H,0FAH,0AAH,0AEH,0AAH,0AAH,0A8H,0ACH,0ABH,0AAH,0FEH,0AH,02H,02H,00H DB 08H,08H,8BH,6AH,1EH,0AH,0AH,0AH,0AH,0FEH,0AH,0BH,08H,08H,08H,00H ;-- 文字: 产 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,04H,0E4H,44H,4CH,74H,54H,45H,46H,64H,54H,4CH,44H,64H,44H,00H DB 40H,30H,0FH,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 的 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,0F8H,8CH,8BH,88H,0F8H,40H,30H,8FH,08H,08H,08H,08H,0F8H,00H,00H DB 00H,7FH,10H,10H,10H,3FH,00H,00H,00H,03H,26H,40H,20H,1FH,00H,00H - 199 - ;-- 文字: D -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 08H,0F8H,08H,08H,08H,10H,0E0H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 20H,3FH,20H,20H,20H,10H,0FH,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: I -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,08H,08H,0F8H,08H,08H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,20H,20H,3FH,20H,20H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 实 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,10H,0CH,04H,4CH,0B4H,94H,05H,0F6H,04H,04H,04H,14H,0CH,04H,00H DB 00H,82H,82H,42H,42H,23H,12H,0AH,07H,0AH,12H,0E2H,42H,02H,02H,00H ;-- 文字: 验 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 02H,0FAH,82H,82H,0FEH,80H,40H,60H,58H,46H,48H,50H,20H,20H,20H,00H DB 08H,08H,04H,24H,40H,3FH,22H,2CH,21H,2EH,20H,30H,2CH,23H,20H,00H ;-- 文字: 教 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 10H,14H,94H,0D4H,0BFH,94H,9CH,14H,50H,0F8H,0FH,08H,88H,78H,08H,00H DB 09H,09H,48H,88H,7EH,05H,44H,44H,20H,20H,13H,0CH,33H,0C0H,40H,00H ;-- 文字: 学 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,30H,10H,12H,5CH,54H,50H,51H,5EH,0D4H,50H,18H,57H,32H,10H,00H DB 00H,02H,02H,02H,02H,02H,42H,82H,7FH,02H,02H,02H,02H,02H,02H,00H ;-- 文字: 使 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,20H,0F0H,1CH,07H,0F2H,94H,94H,94H,0FFH,94H,94H,94H,0F4H,04H,00H DB 00H,00H,7FH,00H,40H,41H,22H,14H,0CH,13H,10H,30H,20H,61H,20H,00H ;-- 文字: 用 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0FEH,22H,22H,22H,22H,0FEH,22H,22H,22H,22H,0FEH,00H,00H DB 80H,40H,30H,0FH,02H,02H,02H,02H,0FFH,02H,02H,42H,82H,7FH,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 机 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 08H,08H,0C8H,0FFH,48H,88H,08H,00H,0FEH,02H,02H,02H,0FEH,00H,00H,00H DB 04H,03H,00H,0FFH,00H,41H,30H,0CH,03H,00H,00H,00H,3FH,40H,78H,00H ;-- 文字: 总 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0F8H,89H,8EH,88H,88H,88H,8CH,8BH,0F8H,00H,00H,00H,00H - 200 - DB 00H,20H,38H,00H,3CH,40H,40H,42H,4CH,40H,40H,70H,04H,18H,30H,00H ;-- 文字: 厂 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,0FEH,02H,02H,02H,02H,02H,02H,02H,02H,02H,02H,02H,02H,00H DB 40H,30H,0FH,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 生 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,80H,60H,1EH,10H,10H,10H,10H,0FFH,12H,10H,10H,98H,10H,00H,00H DB 01H,40H,40H,41H,41H,41H,41H,41H,7FH,41H,41H,41H,41H,61H,40H,00H ;-- 文字: C -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 0C0H,30H,08H,08H,08H,08H,38H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 07H,18H,20H,20H,20H,10H,08H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;- 文字: E -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 08H,0F8H,88H,88H,0E8H,08H,10H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 20H,3FH,20H,20H,23H,20H,18H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: 系 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,02H,22H,0B2H,0AAH,66H,62H,22H,11H,4DH,81H,01H,01H,00H,00H DB 00H,40H,21H,13H,09H,05H,41H,81H,7FH,01H,05H,09H,13H,62H,00H,00H ;-- 文字: 列 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 02H,82H,42H,0BAH,16H,12H,92H,7AH,12H,00H,0F8H,00H,00H,0FFH,00H,00H DB 41H,40H,20H,10H,09H,06H,01H,00H,00H,00H,07H,20H,40H,3FH,00H,00H ;-- 文字: 仪 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,20H,0F0H,0CH,03H,00H,38H,0C0H,01H,0EH,04H,0E0H,1CH,00H,00H,00H DB 00H,00H,0FFH,00H,40H,40H,20H,10H,0BH,04H,0BH,10H,20H,60H,20H,00H ;-- 文字: 器 -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 40H,40H,4FH,49H,49H,0C9H,0CFH,70H,0C0H,0CFH,49H,59H,69H,4FH,00H,00H DB 02H,02H,7EH,45H,45H,44H,7CH,00H,7CH,44H,45H,45H,7EH,06H,02H,00H ;-- 文字: ! -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0F0H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,5FH,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H ;-- 文字: ! -- ;-- 宋体 12; 此字体下对应的点阵为:宽 x 高=16x16 -- DB 00H,00H,00H,0F0H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H DB 00H,00H,00H,5FH,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H END - 201 - 单元 6 MCU 通信技术实验 实验十八 8250 可编程异步通讯接口实验(自发自收) 一、实验目的 (1)系统扩展以 8250 为核心的可编程串行异步通讯接口芯片。 (2)对扩展的串行通讯接口实现自发自收。 二、实验内容 将寄存器 B 的内容从 10H 开始通过 8250 发送、接收,每次收发后自动 增 1,再将每次接收到的数据,写到内存 4000H~40EFH 单元中,实现自发 自收。 三、编程指南 (1)通讯协议 1 个起始位,8 位数据位,1 个停止位,波特率:4800。 (2)8250 的内部寄存器的端口地址 * 通讯线控制寄存器第 7 位(DLAB)=0; ** DLAB=1; (3)8250 的内部寄存器格式 ◆ 通讯线控制寄存器格式: - 202 - ◆ 通迅线状态寄存器格式 ◆ 中断允许寄存器格式 - 203 - ◆ 中断识别寄存器格式 ◆ MODEN 状态寄存器格式 (4)波特率除数锁存器的值与波特率的对应关系(16 进制数) - 204 - (5)8250 的初始化编程 ◆ 设置波特率 ◆ 设置通讯数据格式 ◆ 设置操作方式 ◆ 设置中断允许寄存器 四、实验接线图 五、实验步骤 用扁平线连 JX0(D0~D7)到 JX3(D0~D7),连 FF80H 孔到 CS7,连 TXD 到 RXD(8250 实验区)。打开“DICE-51 仿真开发系统”连接、装载程序 8250·ASM, 然后点击全速运行,当系统显示"8250--good"表示自发自收收结束,按 RST 钮,检查在 51 仿真开发系统软件“视图”,“存储空间1或2”,“数据存储 器”单元 4000H~40EFH 内容是否为 10H~FFH,验证其正确性。 快捷连线说明:JX0→JX3 CS7→FF80H TXD→RXD - 205 - 六、思考;8250 的波特率是如何设计的? 七、程序清单 (1)基本程序:文件名:8250·ASM org 0000h ljmp start ORG 39A0H ;RCV DATA IN 4000h..... :10h,11h,12h PDATA EQU 0FF80H ;BTS-LSB MSB EQU 0FF81H LINE EQU 0FF83H LSTAT EQU 0FF85H START: MOV SP,#50H MOV P2,#0FFH MOV A,#89H MOV DPTR,#0FF23H MOVX @DPTR,A MOV A,#1FH MOV DPTR,#0FF20H MOVX @DPTR,A INC DPTR MOV A,#0CEH MOVX @DPTR,A MOV A,#80H ;DLAB=1 MOV DPTR,#LINE MOVX @DPTR,A MOV A,#18H ;BTS=4800 MOV DPTR,#0FF80H MOVX @DPTR,A MOV DPTR,#MSB MOV A,#00H MOVX @DPTR,A MOV A,#03H ;8-BIT,1-STOP MOV DPTR,#LINE MOVX @DPTR,A MOV A,#00H ;NO-INT MOV DPTR,#0FF81H MOVX @DPTR,A MOV B,#10H MOV DPTR,#4000h MAIN: PUSH DPH PUSH DPL CALL SEND CALL RCV POP DPL - 206 - POP DPH MOVX @DPTR,A INC DPTR INC B MOV A,B CJNE A,#00H,MAIN ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; GOOD: MOV R4,#0A0H CALL BUF1 GOOD1: CALL DIS DJNZ R4,GOOD1 CALL BUF2 GOOD2: CALL DIS SJMP GOOD2 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ERR: CALL BUF3 ERR1: CALL DIS SJMP ERR1 BUF1: MOV 7EH,#08H MOV 7DH,#02H MOV 7CH,#05H MOV 7BH,#00H MOV 7AH,#14H MOV 79H,#14H RET BUF2: MOV 7EH,#09H MOV 7DH,#00H MOV 7CH,#00H MOV 7BH,#0DH MOV 7AH,#10H MOV 79H,#10H RET BUF3: MOV 7EH,#08H MOV 7DH,#02H MOV 7CH,#05H MOV 7BH,#00H MOV 7AH,#0EH MOV 79H,#15H RET ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; SEND: MOV DPTR,#LSTAT WAIT1: MOVX A,@DPTR ANL A,#20H - 207 - JZ WAIT1 MOV A,B MOV DPTR,#PDATA MOVX @DPTR,A RET ;------------------------------------------------------ RCV: MOV DPTR,#LSTAT WAIT2: MOVX A,@DPTR JNB ACC.0,WAIT2 ANL A,#0EH JNZ ERR MOV DPTR,#PDATA MOVX A,@DPTR RET ;--------------------------------------------------------- DIS: MOV A,#0FFH MOV R0,#20H MOVX @R0,A MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#LS0 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 LS1: DJNZ R3,LS1 CLR C RRC A MOV R2,A JNZ LS2 INC R1 MOV A,#0FFH MOVX @R1,A RET LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH,8FH END - 208 - 实验十九 8251 可编程通讯接口实验(与 PC 机) 一、实验目的 利用实验机内的 8251 芯片,实现与 PC 机通讯。 二、实验内容 (1)利用机内的 8253 芯片的分频作为 8251 的收发时钟频率。 (2)利用机内小键盘,每按动一次任一数字键 ,就把该键值通过 8251 发 送给 PC 机接收,并在 PC 机屏幕上显示出该键值。 三、编程指南 (1)8251 状态口地址:8001H,8251 数据口地址:8000H; (2)8253 命令口地址:9003H,8253 计数器#1 口地址:9001H; 以上修改为: (1)8251 状态口地址:FF81H,8251 数据口地址:FF80H; (2)8253 命令口地址:FF93H,8253 计数器#1 口地址:FF91H (3)8155 命令口地址:0FF20H,键扫口/字位口:0FF21H,键入口 PC:0FF23H, 字形口 PB:0FF22H; 改为: (3)8255 命令口地址:0FF23H,键扫口/字位口 PA:0FF20H;字形口 PB: 0FF21H;键入口 PC:0FF22H。 (4)通讯约定:异步方式,字符 8 位,一个起始位,一个停止位,波特率 因子为 16,波特率为 9600; (5)计算 T/RXC,收发时钟 fc,fc=16*9600=153.6K; (6)8253 分频系数:1843.2K / 153.6K=12; 四、实验接线图 - 209 - 五、实验步骤 (1)8251 单元:CS8→FF80H,CLK→1.8432M,T/RXC→OUT1(8253 单 元),TXD→EX-TXD,RXD→EX-RXD,JX20→JX17;(注:TXD、RXD 在 8251 单 元;EX-TXD、EX-RXD 在 CZ11 用户通讯口,对应标号为 TXD、RXD); (2)8253 单元:CS3→FF90H,GATE1→+5V,CLK1→1.8432M; (3)开关设置: SW3、SW4、SW5 置 ON,PC 机串口(或者 PC 的 USB 口 转串口)连至 CZ11 用户通讯口插座上; (4)运行"串口调试助手",设置对应的串口和波特率(9600),运行程 序,显示闪动 P,按动小键盘数字键,在 PC 机屏幕上显示相应的数字,按 MON返P态。 六、思考:8251、8253 的各个口地址如何来的?提示请结合电路接口及芯 片本身来考虑。 七、程序清单 (1)、基本程序(文件名 P8251T·ASM) ORG 0000H LJMP START ORG 0F20H Z8251 EQU 0FF81H D8251 EQU 0FF80H COM_MOD EQU 04EH COM_COM EQU 25H XTC EQU 0FF93H XT1 EQU 0FF91H ;------------------------ START: MOV P2,#0FFH MOV A,#89H MOV DPTR,#0FF23H MOVX @DPTR,A MOV DPTR,#Z8251 MOV A,#COM_MOD MOVX @DPTR,A MOV A, #COM_COM MOVX @DPTR,A LCALL FOR8253 L0: MOV R0,#79H MOV A,#10H LT1: MOV @R0,A INC R0 CJNE R0,#7EH,LT1 MOV A,#11H MOV @R0,A MOV R0,#59H MOV A,#7EH - 210 - MOVX @R0,A L1: LCALL X2 CJNE A,#1FH,L3 LCALL SEND SJMP L0 L3: LCALL X3 DB 79H,7EH SJMP L2 L2: mov a,b CLR C SUBB A,#0AH JNC L4 MOV A,B ADD A,#30H SJMP L5 L4: MOV A,B ADD A,#37H L5: LCALL SEND SJMP L1 ;------------------------------ X3: MOV R4,A MOV R0,#59H MOVX A,@R0 MOV R1,A MOV A,R4 MOV @R1,A mov b,a CLR A POP DPH POP DPL MOVC A,@A+DPTR INC DPTR CJNE A,01H,X30 CLR A MOVC A,@A+DPTR X31: MOVX @R0,A INC DPTR PUSH DPL PUSH DPH RET X30: DEC R1 MOV A,R1 SJMP X31 ;---------------------- - 211 - X2: MOV R6,#50H X0: ACALL XLE JNB ACC.5,XX0 DJNZ R6,X0 MOV R6,#20H MOV R0,#59H MOVX A,@R0 MOV R0,A MOV A,@R0 MOV R7,A MOV A,#10H MOV @R0,A X1: ACALL XLE JNB ACC.5,XX1 DJNZ R6,X1 MOV A,R7 MOV @R0,A AJMP X2 XX1: MOV R6,A MOV A,R7 MOV @R0,A MOV A,R6 XX0: RET ;------------------------- XLE: ACALL DIS LCALL 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 X10: DEC R4 MOV A,R4 XRL A,#82H JZ X11 - 212 - MOV A,R4 XRL A,#0EH JZ X11 MOV A,R4 ORL A,R4 JZ X12 MOV R4,#20H DEC R2 SJMP X13 X12: MOV R4,#0FH X11: MOV R2,04H MOV R4,03H X13: MOV R1,#48H MOV A,R2 MOVX @R1,A INC R1 MOV A,R3 MOVX @R1,A MOV A,R4 RET LS3: DB 07H,04H,08H,05H,09H,06H,0AH DB 0BH,01H,00H,02H,0FH,03H,0EH DB 0CH,0DH ;----------------------------------------- DIS: PUSH DPH PUSH DPL SETB RS1 MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#LS0 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 LS1: DJNZ R3,LS1 CLR C RRC A - 213 - MOV R2,A JNZ LS2 INC R1 MOV A,#0FFH MOVX @R1,A CLR RS1 POP DPL POP DPH RET LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH ;------------------------------------------ KEY: SETB RS1 MOV R2,#0FEH MOV R3,#08H MOV R0,#00H LP1: 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,#19H SJMP XP3 XP33: MOV A,#20H XP3: CLR RS1 RET LP0: CPL A JB ACC.0,XP0 MOV A,#00H SJMP LPP XP0: JB ACC.1,XP1 MOV A,#08H SJMP LPP XP1: JB ACC.2,XP2 - 214 - MOV A,#10H SJMP LPP XP2: JB ACC.3,XP33 MOV A,#18H LPP: ADD A,R0 CLR RS1 CJNE A,#10H,LX0 LX0: JNC XP35 MOV DPTR,#LS3 MOVC A,@A+DPTR XP35: RET ;-------------------------------- SEND: PUSH ACC MOV DPTR,#Z8251 WAITS: MOVX A,@DPTR RRC A JNC WAITS POP ACC MOV DPTR,#D8251 MOVX @DPTR,A ret FOR8253: MOV DPTR,#XTC MOV A,#76H MOVX @DPTR,A MOV DPTR,#XT1 MOV A,#0CH MOVX @DPTR,A MOV A,#00H MOVX @DPTR,A RET ;------------------------------ END - 215 - 实验二十 单片机 RS232/RS485 串行发送实验(双机通讯) 一、实验目的 (1)了解单片机 8251 串行口的工作原理以及收/发送方式 (2)了解 RS232 以及 RS485 接口的工作原理及收/发送方式。 二、实验内容 用两台 5208K 进行双机通讯,一台作为发送,另一台作为接收。 三、实验原理 在实际使用中,RS232 主要完成电平匹配(通讯距离最远为 15 米),RS485 为有线远程通讯(最远距离为 1200 米),我们在这里使用的 RS485 芯片 75176 或 MAX485 功能一样,都是半双功,所以在发送和接收时,需要一个控制脚, 实验时插孔为 R/TEN,如用 P1.0=1 时,RS485 可以发送,在进行 RS232 / RS485 接口实验时,实验程序是相同的,只是接线略有不同。 四、实验接线图 五、实验步骤 (1)准备两台 5208K 实验机,确定 1 号机为发送,2 号机为接收; (2)当作 RS232 接口实验时:1 号机、2 号机 P3.0、P3.1 交叉相连,两机 共地。 (3)当作 RS485 接口实验时,P3.0→R0,P3.1→DI,P1.0→TEN/R,1 号 机、2 号机 A、B 对应用导线连接,两机共地。 (4)先运行 2 号机,使 2 号机处于待命状态 P。后运行 1 号机使 1 号机处 于发送状态 P。在 1 号机键盘上按动数字键,在 2 号机的数码管上应显示对 应的数字键值。 - 216 - 六、思考:若要实现双方互相通信可以吗?若可以应如何设计? 七、程序清单 (1)、基本程序(文件名 P8958T·ASM) ORG 0000H LJMP START TEN EQU P1.0 START: MOV P2,#0FFH MOV A,#89H MOV DPTR,#0FF23H MOVX @DPTR,A MOV TMOD,#21H MOV TL1,#0E8H ;F=11.0592,BPS=2400 MOV TH1,#0E8H SETB TR1 MOV 87H,#80H MOV SCON,#0D8H L0: MOV R0,#79H MOV A,#10H LT1: MOV @R0,A INC R0 CJNE R0,#7EH,LT1 MOV A,#11H MOV @R0,A MOV R0,#59H MOV A,#7EH MOVX @R0,A L1: LCALL X2 CJNE A,#20H,L31 sjmp l1 l31: CJNE A,#1FH,L3 LCALL SEND SJMP L0 L3: LCALL SEND LCALL X3 DB 79H,7EH SJMP L1 ;------------------------------ X3: MOV R4,A MOV R0,#59H MOVX A,@R0 MOV R1,A MOV A,R4 MOV @R1,A mov b,a - 217 - CLR A POP DPH POP DPL MOVC A,@A+DPTR INC DPTR CJNE A,01H,X30 CLR A MOVC A,@A+DPTR X31: MOVX @R0,A INC DPTR PUSH DPL PUSH DPH RET X30: DEC R1 MOV A,R1 SJMP X31 ;---------------------- X2: MOV R6,#50H X0: ACALL XLE JNB ACC.5,XX0 DJNZ R6,X0 MOV R6,#20H MOV R0,#59H MOVX A,@R0 MOV R0,A MOV A,@R0 MOV R7,A MOV A,#10H MOV @R0,A X1: ACALL XLE JNB ACC.5,XX1 DJNZ R6,X1 MOV A,R7 MOV @R0,A AJMP X2 XX1: MOV R6,A MOV A,R7 MOV @R0,A MOV A,R6 XX0: RET ;------------------------- XLE: ACALL DIS LCALL KEY MOV R4,A - 218 - 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 X10: 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,#20H DEC R2 SJMP X13 X12: MOV R4,#0FH X11: MOV R2,04H MOV R4,03H X13: MOV R1,#48H MOV A,R2 MOVX @R1,A INC R1 MOV A,R3 MOVX @R1,A MOV A,R4 RET LS3: DB 07H,04H,08H,05H,09H,06H,0AH DB 0BH,01H,00H,02H,0FH,03H,0EH DB 0CH,0DH ;----------------------------------------- DIS: PUSH DPH PUSH DPL SETB RS1 - 219 - MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#LS0 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 LS1: 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 RET LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH ;------------------------------------------ KEY: SETB RS1 MOV R2,#0FEH MOV R3,#08H MOV R0,#00H LP1: 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 - 220 - INC R0 DJNZ R3,LP1 MOVX A,@R1 JB ACC.4,XP33 MOV A,#19H SJMP XP3 XP33: MOV A,#20H XP3: CLR RS1 RET LP0: CPL A JB ACC.0,XP0 MOV A,#00H SJMP LPP XP0: JB ACC.1,XP1 MOV A,#08H SJMP LPP XP1: JB ACC.2,XP2 MOV A,#10H SJMP LPP XP2: JB ACC.3,XP33 MOV A,#18H LPP: ADD A,R0 CLR RS1 CJNE A,#10H,LX0 LX0: JNC XP35 MOV DPTR,#LS3 MOVC A,@A+DPTR XP35: RET ;-------------------------------- SEND: SETB TEN MOV SBUF,A YTXD1: JBC TI,EXIT1 SJMP YTXD1 EXIT1: CLR TEN RET YRXD: JBC RI,YRXD1 SJMP YRXD YRXD1: MOV A,SBUF RET END - 221 - 实验二十一 单片机 RS232/RS485 串行接收实验(双机通讯) 程序清单 文件名(P8958R·asm)(其余同实验二十) ORG 0000H LJMP START START: MOV P2,#0FFH clr p1.0 MOV A,#89H MOV DPTR,#0FF23H MOVX @DPTR,A MOV TMOD,#21H MOV TL1,#0E8H ;F=11.0592,BPS=2400 MOV TH1,#0E8H SETB TR1 MOV 87H,#80H MOV SCON,#0D8H L0: MOV R0,#79H MOV A,#10H LT1: MOV @R0,A INC R0 CJNE R0,#7EH,LT1 MOV A,#11H MOV @R0,A CON: LCALL RCV MOV @R0,A DEC R0 CJNE R0,#78H,CON MOV R0,#7EH AJMP CON DIS: PUSH DPH PUSH DPL SETB RS1 MOV A,#0FFH MOV R0,#20H MOVX @R0,A MOV R0,#7EH MOV R2,#20H MOV R3,#00H MOV DPTR,#LS0 LS2: MOV A,@R0 MOVC A,@A+DPTR - 222 - MOV R1,#21H MOVX @R1,A MOV A,R2 DEC R1 CPL A MOVX @R1,A CPL A DEC R0 LS1: 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 RET LS0: DB 0C0H,0F9H,0A4H,0B0H,99H,92H DB 82H,0F8H,80H,90H,88H,83H,0C6H DB 0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH ;------------------------------------------ ;-------------------------------- SEND: MOV SBUF,A YTXD1: JBC TI,EXIT1 SJMP YTXD1 EXIT1: RET RCV: LCALL DIS JBC RI,YRXD1 SJMP RCV YRXD1:MOV A,SBUF RET END - 223 - 单元 7 其它实验 实验二十二 PCF8563 实时时钟/日历芯片实验 一、实验目的 (1)了解 PCF8563 实时时钟/日历芯片的工作原理。 (2)了解 PCF8563 芯片中 16 个寄存器的功能。 (3)掌握 PCF8563 在单片机系统中的应用及编程。 二、实验内容 利用实验系统上的 PCF8563 实时时钟/日历芯片,在数码管上显示出年/ 月/日,时/分/秒,由 1 位电平开关来实现显示切换。 三、编程指南 (1)实时时钟 PCF8563 简介 PCF8563 是 PHILIPS 公司推出的一款工业级内含 I2C 总线接口功能的 具有极低功耗的多功能时钟/日历芯片。PCF8563 的多种报警功能、定时器 功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可 为单片机提供看门狗功能。内部时钟电路、内部振荡电路、内部低电压检测 电路以及两线制 I2C 总线通讯方式,不但使外围电路及其简洁,而且也增加 了芯片的可靠性。同时每次读写数据后,内嵌的字地址寄存器会自动产生增 量。当然作为时钟芯片 PCF8563 亦解决了 2000 年问题。因而,PCF8563 是 一款性价比极高的时钟芯片,它已被广泛用于电表水表气表电话传真机便携 式仪器以及电池供电的仪器仪表等产品领域。 其主要特性有: 1、宽电压范围 1.0~5.5V, 复位电压标准值 Vlow=0.9V。 2、超低功耗:典型值为 0.25uA(VDD=3.0V,Tamb=25。C)。 3、可编程时钟输出频率为:32.768KHz 、1024Hz 、32Hz 、1Hz。 4、四种报警功能和定时器功能。 5、内含复位电路、振荡器电容和掉电检测电路。 6、开漏中断输出。 7、400kHz I2C 总线(VDD=1.8~5.5V),其从地址读 0A3H;写 0A2H。 - 224 - (2)PCF8563 管脚图及描述 (3)PCF8563 基本工作原理 PCF8563 有 16 个位寄存器:一个可自动增量的地址寄存器,一个内置 32.768KHz 的振荡器(带有一个内部集成的电容)一个分频器(用于给实时 时钟 RTC 提供源时钟)一个可编程时钟输出,一个定时器,一个报警器, 一个掉电检测器和一个 400KHz I2C 总线接口。 所有 16 个寄存器设计成可寻址的 8 位并行寄存器,但不是所有位都有 用。前两个寄存器(内存地址 00H,01H)用于控制寄存器和状态寄存器, 内存地址 02H~08H 用于时钟计数器(秒~年计数器),地址 09H~0CH 用于报 警寄存器(定义报警条件),地址 0DH 控制 CLKOUT 管脚的输出频率,地址 0EH 和 0FH 分别用于定时器控制寄存器和定时器寄存器。秒、分钟、小时、 日、月、年、分钟报警、小时报警、日报警寄存器,编码格式为 BCD, 星 期和星期报警寄存器不以 BCD 格式编码。当一个 RTC 寄存器被读时,所有 计数器的内容被锁存,因此,在传送条件下,可以禁止对时钟日历芯片的错 读。 A、报警功能模式 一个或多个报警寄存器 MSB(AE=Alarm Enable 报警使能位)清 0 时, 相应的报警条件有效,这样,一个报警将在每分钟至每星期范围内产生一次。 设置报警标志位 AF(控制/状态寄存器的 2 的位 3)用于产生中断,AF 只可 以用软件清除。 B、定时器 8 位的倒计数器(地址 0FH) 由定时器控制寄存器(地址 0EH)控制, 符号 管 脚 号 描 述 OSCI 1 振荡器输入 OSCO 2 振荡器输出 /INT 3 中断输出(开漏:低电平 有效) VSS 4 地 SDA 5 串行数据 I/O SCL 6 串行时钟输入 CLKO UT 7 时钟输出(开漏) VDD 8 正电源 - 225 - 定时器控制寄存器用于设定定时器的频率(4096,64,1 或 1/60Hz), 以 及设定定时器有效或无效。定时器从软件设置的 8 位二进制数倒计数,每 次倒计数结束,定时器设置标志位 TF,定时器标志位 TF 只可以用软件清除, TF 用于产生一个中断(/INT), 每个倒计数周期产生一个脉冲作为中断信 号。TI/TP 控制中断产生的条件。当读定时器时,返回当前倒计数的数值。 C、CLKOUT 输出 管脚 CLKOUT 可以输出可编程的方波。CLKOUT 频率寄存器(地址 0DH) 决定方波的频率,CLKOUT 可以输出 32.768KHz(缺省值)、1024、32、1Hz 的方波。CLKOUT 为开漏输出管脚,上电时输出有效,无效时输出为高阻抗。 D、复位 PCF8563 包含一个片内复位电路,当振荡器停止工作时,复位电路开始 工作。在复位状态下,I2C 总线初始化,寄存器 TF、VL、TD1、TD0、TESTC、 AE 被置逻辑 1,其它的寄存器和地址指针被清 0。 E、掉电检测器和时钟监控 PCF8563 内嵌掉电检测器, 当 VDD 低于 Vlow 时,位 VL(Voltage Low, 秒寄存器的位 7)被置 1,用于指明可能产生不准确的时钟/日历信息,VL 标 志位只可以用软件清除。当 VDD 慢速降低(例如以电池供电)达到 Vlow 时, 标志位 VL 被设置,这时可能会产生中断. F、PCF8563 内部寄存器 表 F.1 寄存器结构 地 址 寄存器名称 D7 D 6 D5 D4 D3 D 2 D 1 D 0 00H 控制/状态寄存器 1 TE ST 0ST OP 0 TTES TC 0 0 0 01H 控制/状态寄存器 2 0 0 0 TI /T P AF T F A I E T I E 02H 秒寄存器 VL 00~59 BCD 码格式数 03H 分寄存器 -- 00~59 BCD 码格式数 04H 时寄存器 -- 00~23 BCD 码格式数 05H 日寄存器 -- 00~31 BCD 码格式数 06H 星期寄存器 -- 00~06 BCD 码格式数 07H 月/世纪寄存器 C 01~12 BCD 码格式数 08H 年寄存器 00~99 BCD 码格式数 09H 分钟报警寄存器 AE 00~59 BCD 码格式数 0AH 时钟报警寄存器 AE 00~23 BCD 码格式数 0BH 日报警寄存器 AE 00~31 BCD 码格式数 0CH 星期报警寄存器 AE 00~06 BCD 码格式数 0DH CLKOUT 频率寄存器 FE -- -- -- - - F d F d - 226 - 1 0 0EH 定时控制寄存器 TE -- -- -- - - T d 1 T d 0 0FH 定时器倒计时数值 寄存器 定时器倒计时数值寄存器 表 F.2 控制/状态寄存器 1 位描述(地址 00H) 表 F.3 控制/状态寄存器 2 位描述(地址 01H) 表 F.4 /INT 操作(TI/TP=1) 表 F.5 AF 和 TF 值描述 表 F.6 秒寄存器位描述(地址 02H) - 227 - 表 F.7 分钟寄存位描述(地址 03H) 表 F.8 小时寄存器位描述(地址 04H) 表 F.9 日寄存器位描述(地址 05H) 表 F.10 星期寄存器位描述(地址 06H) 表 F.11 星期分配表 表 F.12 月/世纪寄存器位描述(地址 07H) - 228 - 表 F.13 月分配表 表 F.14 年寄存器位描述(地址 08H) 表 F.15 分钟报警寄存器位描述(地址 09H) 表 F.16 小时报警寄存器位描述(地址 0AH) 表 F.17 日报警寄存器位描述(地址 0BH) 表 F.18 星期报警寄存器位描述(地址 0CH) - 229 - 表 F.19 CLKOUT 频率寄存器位描述(0DH) 表 F.20 CLKOUT 频率选择表 表 F.21 定时器控制器寄存器位描述(地址 0EH) 表 F.22 定时器时钟频率选择 表 F.23 定时器倒计数数值寄存器位描述(地址 OFH) 四、实验接线 PCF8563 实时时钟模块显示电路见单片机系统原理图部分。PCF8563 模 块电路见下图。 - 230 - 五、实验程序框图 开始 程序初始化 PCF8563置初值 读PCF8563寄存器值 P1.0为高? 显示时、分、秒显示年、月、日 YN 六、实验步骤 把 PCF8563 的数据端 SDA 用导线接至 P1.7,时钟端 SCL 接至 P1.6,电平 开关 K1 接至 P1.0。当 P1.0 为低电平时,数码管显示“时、分、秒”;当 P1.0 为高电平时,数码管显示“年、月、日”。 快捷连线说明:SDA→P1.7 SCL→P1.6 K1→P1.0 七、思考 修改程序,使 CLKOUT 输出想要的输出频率,并设置报警寄存器。 八、程序清单 (1)基本程序(PCF8563.ASM) SDA BIT P1.7 ;I2C 总线定义 SCL BIT P1.6 MTD EQU 30H ;发送数据缓冲器 - 231 - MRD EQU 40H ;接收数据缓冲区 ;定义器件地址,变量 PCF8563 EQU 0A2H ;PCF8563 的器件地址 ACK BIT 10H ;应答标志位 SLA DATA 50H ;器件的从地址 SUBA DATA 51H ;器件的子地址 NUMBYTE DATA 52H ;读/写的字节数变量 ORG 0000H AJMP MAIN ORG 0100H MAIN: MOV R4,#0F0H ;延时,等待芯片复位 DJNZ R4,$ SETB EA SETB EX0 mov p2,#0ffh MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A ;LJMP RD8563 ;设置 PCF8563 初值只要一次,以后会自动计时,否 则每次运行程序会 SET8563: ;************* 设 置 PCF8563 的 时 间 初 值 ******************************** MOV MTD,#00H ;控制字 0,启动时钟 MOV MTD+1,#00H ;不允许中断 MOV MTD+2,#30H ;秒 设置为 2005/12/27 星期二 10:07:30 MOV MTD+3,#07H ;分 MOV MTD+4,#10H ;时 MOV MTD+5,#27H ;日 MOV MTD+6,#02H ;星期 MOV MTD+7,#12H ;月份/世纪 MOV MTD+8,#05H ;年 MOV SLA,#PCF8563 MOV SUBA,#00H MOV NUMBYTE,#9 LCALL IWRNBYTE NOP RD8563: ;**********读出 PCF8563 的时间值*********************** MOV SUBA,#02H MOV SLA,#PCF8563 MOV NUMBYTE,#7 ;读入 7 个时间信息值 LCALL IRDNBYTE MOV A,MRD ;取秒字节 - 232 - ANL A,#7FH ;屏蔽无效位 MOV MRD,A MOV A, MRD+1 ;取分钟字节 ANL A,#7FH ;屏蔽无效位 MOV MRD+1,A MOV A, MRD+2 ;取小时字节 ANL A,#3FH ;屏蔽无效位 MOV MRD+2,A MOV A, MRD+3 ;取天字节 ANL A,#3FH ;屏蔽无效位 MOV MRD+3,A MOV A, MRD+4 ;取星期字节 ANL A,#07H ;屏蔽无效位 MOV MRD+4,A MOV A,MRD+5 ;取月字节 ANL A,#9FH ;屏蔽无效位最高位为世纪位 MOV MRD+5,A NOP ;要此设置断点观察 MRD 区其数据顺序 对应于 ;PCF8563 的寄存器 02H――08H ;在 LED 上显示小时:分钟:秒*********************** ;入口参数:R6:复合命令的第一个字节,R7:复合命令的第二个字节。R2:要显示的 LED 数 JNB P1.0,AA LJMP BB AA: LCALL SSEE MOV A,MRD MOV R1,A ANL A,#0FH MOV 79H,A ;秒低位 MOV A,R1 SWAP A ANL A,#0FH MOV 7AH,A ;秒高位 MOV A,MRD+1 MOV R1,A ANL A,#0FH MOV 7BH,A ; 分低位 MOV A,R1 SWAP A ANL A,#0FH MOV 7CH,A ;分高位 MOV A,MRD+2 MOV R1,A - 233 - ANL A,#0FH MOV 7DH,A ;时低位 MOV A,R1 SWAP A ANL A,#0FH MOV 7EH,A ;时高位 LCALL SSEE LJMP RD8563 ;在 LED 上显示年:月:日 ;入口参数:R6:复合命令的第一个字节,R7:复合命令的第二个字节。R2:要显示的 LED 数 BB: LCALL SSEE MOV A,MRD+3 MOV R1,A ANL A,#0FH MOV 79H,A ;日低位 MOV A,R1 SWAP A ANL A,#0FH MOV 7AH,A ;日高位 MOV A,MRD+5 MOV R1,A ANL A,#0FH MOV 7BH,A ;月低位 MOV A,R1 SWAP A ANL A,#0FH MOV 7CH,A ;月高位 MOV A,MRD+6 MOV R1,A ANL A,#0FH MOV 7DH,A ;年低位 MOV A,R1 SWAP A ANL A,#0FH MOV 7EH,A ;年高位 LCALL SSEE LJMP RD8563 SSEE: SETB RS1 ;换工作区 MOV R5,#08H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: MOV R1,#20H - 234 - 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 ;8 次显示完了吗? CLR RS1 RET DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH ;----------------------------------------------------------------------------- --------------------------- ; 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 两个子程序, ;这两个子程序用于主从通讯上及一此特殊器件的读写操作较为方便. ; 更新时间:2002.06.04 ;----------------------------------------------------------------------------- --------------------------- ;启动 I2C 总线子程序 START: SETB SDA NOP SETB SCL ;起始条件建立时间大于 4.7us NOP NOP NOP NOP NOP CLR SDA - 235 - NOP ;起始条件锁定时大于 4us NOP NOP NOP NOP CLR SCL ;钳住总线,准备发数据 NOP RET ;结束总线子程序 STOP: CLR SDA NOP SETB SCL ;发送结束条件的时钟信号 NOP ;结束总线时间大于 4us NOP NOP NOP NOP SETB SDA ;结束总线 NOP ;保证一个终止信号和起始信号的空闲时间 大于 4.7us NOP NOP NOP RET ;发送应答信号子程序 MACK: CLR SDA ;将 SDA 置 0 NOP NOP SETB SCL NOP ;保持数据时间,即 SCL 为高时间大于 4.7us NOP NOP NOP NOP CLR SCL NOP NOP RET ;发送非应答信号 MNACK: SETB SDA ;将 SDA 置 1 NOP NOP - 236 - SETB SCL NOP NOP ;保持数据时间,即 SCL 为高时间大于 4.7us 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 ;发送字节子程序 ;字节数据放入 ACC ;每发送一字节要调用一次 CACK 子程序,取应答位 WRBYTE: MOV R0,#08H WLP: RLC A ;取数据位 JC WR1 SJMP WR0 ;判断数据位 WLP1: DJNZ R0,WLP NOP RET WR1: SETB SDA ;发送 1 NOP SETB SCL NOP NOP NOP NOP NOP - 237 - CLR SCL SJMP WLP1 WR0: CLR SDA ;发送 0 NOP SETB SCL NOP NOP NOP NOP NOP CLR SCL SJMP WLP1 ;读取字节子程序 ;读出的值在 ACC ;每取一字节要发送一个应答/非应答信号 RDBYTE: MOV R0,#08H RLP: SETB SDA NOP SETB SCL ;时钟线为高,接收数据位 NOP NOP NOP ;+1 NOP ;+1 NOP ;+1 NOP ;+1 NOP ;+1 MOV C,SDA ;读取数据位 MOV A,R2 CLR SCL ;将 SCL 拉低,时间大于 4.7us RLC A ;进行数据位的处理 MOV R2,A NOP NOP NOP NOP ;+1 NOP ;+1 NOP ;+1 NOP ;+1 NOP ;+1 DJNZ R0,RLP ;未够 8 位,再来一次 RET ;============================================================================= =========== ;============================================================================= - 238 - =========== ; 以下是用户接口子程序 ; ;无子地址器件写字节数据 ;入口参数: 数据为 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 ; 占用: A 、R0 、R1 、R3 、CY IWRNBYTE: MOV A,NUMBYTE MOV R3,A LCALL START ;起动总线 MOV A,SLA LCALL WRBYTE ;发送器件从地址 LCALL CACK - 239 - JNB ACK,RETWRN ;无应答则退出 MOV A,SUBA ;指定子地址 LCALL WRBYTE LCALL CACK MOV R1,#MTD WRDA: MOV A,@R1 LCALL WRBYTE ;开始写入数据 LCALL CACK JNB ACK,IWRNBYTE INC R1 DJNZ R3,WRDA ;判断写完没有 RETWRN: LCALL STOP RET ;向器件指定子地址读取 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 ;NOP ;+1 ;NOP ;+1 DJNZ R3,SACK LCALL MNACK ;最后一字节发非应答位 RETRDN: LCALL STOP ;并结束总线 RET SACK: LCALL MACK INC R1 SJMP RDN1 - 240 - ;无子地址器件写 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 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 - 241 - ;***************************************************************************** **************** ; 请注意 ; ; 占用内部资源: 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 目录) ; ; 用户可以对"用户接口子程序"进行裁减,即把自已不使用的接口子程序删掉,以节省 程序空间。 ;***************************************************************************** ***************** ;$INCLUDE(ZLG7290.INC) ;包含 ZLG7290 软件包 ;$INCLUDE(VI2C_ASM.INC) ;包含 VIIC 软件包 END - 242 - 实验二十三 MAX813L 看门狗复位电路实验 一、实验目的 (1) 了解复位电路、及看门狗电路在单片机系统中的作用及工作原理。 (2) 掌握 MAX813L 专用芯片的使用及工作原理。 二、实验内容 用 MAX813 芯片来实现上电复位、手动复位、看门狗功能。 三、实验原理 (1)MAX813L 功能介绍 MAX813L 监控电路可用于计算机、控制器、自动化设备、智能设备及微 处理器监控中。它们有以下四方面的功能: (1) 上电、掉电状态下的复位功能; (2) MAX813 L 还有 WATCHDOG 输出功能; (3) 内有一个 1.25V 掉电告警门限检测器; (4) 手动复位输入。 MAX813L 当供电电压降至 4.65V 以下将会产生一个复位脉冲,它有 DIP、 SO 封装。 (2)MAX813L 管脚图及管脚功能 (1)脚 1(/MR):当电压降至 0.8V 以下时,手动复位触发一个复位脉 冲。这个低电平为有效输入提供一个内部 250uA 的 上拉电流。它能被 TTL 或 CMOS 逻辑电路来驱动。 (2)脚 2(VCC):+5V 电源输入端。 (3)脚 3(GND):对所有信号 0V 参考地。 (4)脚 4(PFI):电源失效监督输入端。当 PFI 低于 1.25V,/PFO 为 低电平。若 PFI 不用,可将其与 GND 或 VCC 相连。 (5)脚 5(/PFO):当 PFI 低于 1.25V 时,电源失效输出为低电平,且 吸收电流。 (6)脚 6(WDI):看门狗输入端。当 WDI 维持高电平或低电平达 1.6S 时,其内部 WATCHDOG 定时器完成计数,且 WDO 为 低电平。WDI 悬空或将 WDI 接到一个三态高阻缓冲 器可使 WACHTDOG 失去作用。一旦证实复位发生, WDI 处于三态状态,或在 WDI 端检测到一个上升沿 或下降沿,内部 WATCHDOG 定时器则被清零。 (7)脚 7(RESET):高电平及效输出端。 (8)脚 8(/WDO):看门狗输出端。当内部看门狗定时器完成 1.6S 计 数后,/WDO 为低电平,且直到 WATCHDOG 被清零, /WDO 不变为高电平。/WDO 在低压条件下为低电平。 当 VCC 低于复位门限时,/WDO 维持在低电平。然 - 243 - 而与 RESET 不同,/WD0 并没有其最少脉宽。一旦 VCC 升至复位门限之上,/WDO 即刻变成高电平。 四、实验步骤 (1) MAX813L 具有上电、掉电复位功能:因此可将 MAX813L 复位输出(高 电平有效输出 )直接与单片机 RESET 相连。如需低电平有效输出, 可外加反相器输出。 (2) 手动复位:手动复位输入(/MR)允许复位通过一个按键开关来触发, 其开关通过 140ms 最小复位脉冲宽度来消除不稳定。/MR 是与 TTL/CMOS 逻辑兼容,因此它可由一根外部逻辑线来驱动。将看门狗 复位电路的手动复位插孔/MR 与开关 K1 相连,插孔 RESET 与发光二 极管 L1 相连,按动开关 K1,可观察到一个持续 200ms 的高脉冲。 (3) WATCHDOG 定时器:MAX813L 看门狗电路监视微处理器的工作。若微处 理器在 1.6S 内不触发 WDI,且 WDI 不呈三态状态,则/WDO 为低电平。 只要保证 RESET 有效或 WDI 输入为三态,则 WATCHDOG 定时器被清零 且不计数。一旦释放出复位信号,且 WDI 被驱动为高电平或高电平时, 定时器开始计数,可检测到短至 50ns 的脉冲。 A:将 WDI 悬空,/WDO 输出保持高电平。将 WDI 与开关 K1 相连,/WDO 与发光二极管 L1 相连,当 K1 保持高电平或低电平 1.6S 以上,/WDO 将由高电平变为低电平。 B:将/MR 与/WDO 相连,WDI 与开关 K1 相连,RESET 与发光二极管 L1 相连,当 K1 保持高电平或低电平 1.6S 以上,RESET 将产生一个复 位信号,可通过 L1 观察到。(因与 RESET 相连的电阻太大,不能够 驱动 L1 亮灯,可将 RESET 输出信号与万用表连接,观察万用表电 压变化情况) (4) 电源失效比较器:电源失效比较器由于其输出和非反相输入端在内部 并不相连,故其能被用于多种目的。它的反相输入端内部连至一个 1.25V 基准电压。为了建立一个早期电源失效告警电路,可将 PFI 脚 与一个电压分压器相连。选择电压分压比率 以至在+5V 稳压器下降 以前,PFI 电压降到 1.25V 以下。用/PFO 中断微处理器, 以至它能 为将产生的电源掉电作准备。 A:将 PFI 与实验箱电位器输出 AOUT1 相连,/PFO 与发光二极 管L1相连, 调节电位器,当 PFI 电平低于 1.25V 时,/PFO 由高电平变为 低电平,发 光管 L1 点亮。 五、思考:若用软件防止程序“跑飞”,应如何设计“看门狗”? - 244 - 实验二十四 LM331电压/频率转换实验 一、实验目的 (1)了解 LM331 器件的工作原理,及外部电路的连接。 (2)利用 LM331 器件实验 V/F 转换。 (3)用单片机系统设计一个低频频率计,测量并显示 LM331 转换的频率值。 二、实验内容 利用 LM331 器件实现 V/F 转换,将 0~5V 的模拟电压,转换成与模拟量 电压变化成线性关系的频率值,设计一个频率计程序,并把所测频率通过数 码管显示出来。 三、实验原理 (1)LM311 器件概述 LM331 是美国 NS 公司生产的性能价格比较高的集成芯片,可用作精密频 率电压转换器、A/ D 转换器、线性频率调制解调、长时间积分器及其他相 关器件。LM331 采用了新的温度补偿能隙基准电路, 在整个工作温度范围内 和低到 4.0V 电源电压下都有极高的精度。LM331 的动态范围宽, 可达 100dB ; 线性度好, 最大非线性失真小于 0.01% ,工作频率低到 0.1Hz 时尚有较好的 线性;变换精度高,数字分辨率可达 12 位; 外接电路简单,只需接入几个外 部元件就可方便构成 V/F 或 F/V 等变换电路,并且容易保证转换精度。 (2)LM331 器件管脚图及管脚功能 引脚号 引脚名 功能 1 Current Output 电流输出 2 Ref Current 基准电流 3 Frequency Output 频率输出 4 GND 接地 5 R/C 接 RC 定时电路 6 Thresholod 阈值 7 Comparator Input 比较输入 8 VS 电源 - 245 - (3)LM331 内部功能图 LM331 的内部电路组成如右图所示由输入比较器、定时比较器、R-S 触 发器、输出驱动管、复零晶体管、能隙基准电路、精密电流源电路、电流开 关、输出保护管等部分组成。输出驱动管采用集电极开路形式,因而可以通 过选择逻辑电流和外接电阻,灵活改变输出脉冲的逻辑电平,以适配 TTL、DTL 和 CMOS 等不同的逻辑电路。LM331 可采用双电源或单电源供电,可工作在 4.0~40V 之间,输出可高达 40V,而且可以防止 Vcc 短路。 (4)电压-频率变换器工作原理 上图是由 LM331 组成的电压—频率变换电路。外接电阻 Rt 、Ct 和定时 比较器、复零晶体管、R-S 触发器等构成单稳定时电路。当输入端 Vi+输入 一正电压时,输入比较器输出高电平,使 R-S 触发器置位,Q 输出高电平,输出 驱动管导通,输出端 fo 为逻辑低电平,同时,电流开关打向右边,电流源 IR 对 - 246 - 电容 CL 充电。此时由于复零晶体管截止,电源 Vcc 也通过电阻 Rt 对电容 Ct 充电。当电容 Ct 两端充电电压大于 Vcc 的 2/3 时,定时比较器输出一高电平, 使 R-S 触发器复位,Q 输出低电平,输出驱动管截止,输出端 fo 为逻辑高电平, 同时,复零晶体管导通,电容 Ct 通过复零晶体管迅速放电;电流开关打向左 边,电容 CL 对电阻 RL 放电。当电容 CL 放电电压等于输入电压 Vi 时,输入比 较器再次输出高电平,使 R-S 触发器置位,如此反复循环,构成自激振荡。右 图画出了电容 Ct、CL 充放电和输出脉冲 f0 的波形。设电容 CL 的充电时间 为 t1,放电时间为 t2,则根据电容 CL 上电荷平衡的原理,我们有: (IR-VL/RL)t1=t2VL/RL 右图为电容充放电输出波形图: 从上式可得: f0=1/(t1+t2)=VL/(RLIRt1) 实际上,该电路的 VL 在很少的范围内(大约 10mV)波动,因此, 可认为 VL=Vi, 故上式可以表示为: f0==Vi/(RLIRt1) 可见,输出脉冲频率 f0 与输入电压 Vi 成正比,从而实现了电压-频率变换。 式中 IR 由内部基准电压源供给的 1.90V 参考电压和外接电阻 Rs 决 定,IR=1.90/Rs,改变 Rs 的值,可调节电路的转换增益,t1 由定时元件 Rt 和 Ct 决定,其关系是:t1=1.1RtCt, 典型值 Rt=6.8kΩ,Ct=0.01μF,t1 =7.5μs。 由 f0=Vi/(RLIRt)可知,电阻 Rs、RL、Rt 和电容 Ct 直接影响转换结果 f0, 因此对元件的精度要有一定的要求,可根据转换精度适当选择。电容 CL 对转 换结果虽然没有直接的影响。但应选择漏电流小的电容器。电阻 R1 和电容 C1 组成低通滤波器, 可减少输入电压中的干扰脉冲, 有利于提高转换精度。 (5)频率计程序设计 单片机对频率测量有两种测量方法:即测量频率法和测量周期法。测量 频率法是在单位时间内对被测信号进行计数。测量周期法是在被测信号周期 时间内对某一基准时间进行计数。 本实验中,我们采用测量频率法来设计频率计程序。测量频率法的最简 单的接口电路,可将频率脉冲直接连接到 MCS-51 单片机的 T1 端,将 T/C0 - 247 - 用做定时器,T/C1 用作计数器。在 T/C0 定时时间里,对频率脉冲进行计数。 T/C1 计数值便是单位定时时间里的脉冲个数。然后把计数值送暂存器 50H, 51H,再把 50H,51H 中的计数值分别送给寄存器 R2、R3,进行十进制调整, 调整后送 R6、R5、R4 寄存器,最后将 R6、R5、R4 中的数值进行拆分,送显 示缓冲区 79H、7AH、7BH、7CH、7DH,7E。 四、实验程序框图 五、实验接线图 单片机系统外围电路及显示电路部分详见系统原理图。 - 248 - 六、实验步骤 将 LM331 电压/频率(V/F)转换模块电压输入端 VIN0 接电位器 VOUT,频 率输出端 FOUT 接 P3.5,电位器 VIN 接+5V,运行程序,数据码管上显示当 前所测频率值,调节电位器,改变电压值,数码管上频率值相应变化。 快捷连线说明:VIN0→电位器 VOUT 电位器输入端 VIN→+5V 频率输出端 FOUT→P3.5 七、P3.5 测量到的频率值是如何转换到显示的? 八、程序清单 (1)基本程序(文件名 LM331.ASM) ;************************************************************ ;***********LM331 V/F 转换实验******************************** ;************************************************************ ORG 0000H LJMP MAIN ORG 000BH ;TIM0 interupt input address! LJMP CLK ORG 0100H MAIN: MOV P2,#0FFH MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A SETB EA ;开所有中断 SETB ET0 ;开定时器 0 SETB EX0 ;开外部中断 0 SETB IT0 ;外部中断 0 下降沿有效 MOV TMOD,#51H ;定时器 0 工作在方式 1,计数器 1 工作在方式 1 MOV TH0,#04CH ;每 50MS 中断一次 MOV TL0,#00H - 249 - MOV TH1,#00H MOV TL1,#00H SETB TR0 SETB TR1 MOV 50H,#00H MOV 51H,#00H LOOP0: MOV R2,50H MOV R3,51H LCALL LOOP1 ;调用二进制转十进制子程序 MOV R0,#79H ;转换结果送显示缓冲器 MOV A,R6 LCALL PTDS MOV A,R5 LCALL PTDS MOV A,R4 LCALL PTDS LCALL SSEE ;调用显示子程序 SJMP LOOP0 LOOP1: CLR A ;二进制转十进制子程序 MOV R4,A MOV R5,A MOV R6,A MOV R7,#10H LOOP2: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6 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,LOOP2 RET - 250 - PTDS: MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET SSEE: SETB RS1 MOV R5,#08H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH CLK: CLR TR0 ;定时 1S ### MOV TH0,#04CH ;每 50MS 中断一次 MOV TL0,#00H CPL P1.1 INC 41H MOV A,41H - 251 - CJNE A,#20,WWW ;20*50MS=1S MOV 41H,#00H CPL P1.0 MOV 50H,TH1 MOV 51H,TL1 MOV TL1,#00H MOV TH1,#00H WWW: SETB TR0 RETI END (3) 带注释的基本程序:文件名:SJXHW34.ASM ;************************************************************ ;***********LM331 V/F 转换实验******************************** ;************************************************************ ORG 0000H LJMP MAIN ORG 000BH ;定时器 0 中断入口地址 LJMP CLK ORG 0100H MAIN: MOV P2,#0FFH MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A SETB EA ;开所有中断 SETB ET0 ;开定时器 0 SETB EX0 ;开外部中断 0 SETB IT0 ;外部中断 0 下降沿有效 MOV TMOD,#51H ;定时器 0 工作在方式 1,计数器 1 工作在方式 1 MOV TH0,#04CH ;每 50MS 中断一次 MOV TL0,#00H MOV TH1,#00H MOV TL1,#00H SETB TR0 SETB TR1 MOV 50H,#00H MOV 51H,#00H LOOP0: MOV R2,50H MOV R3,51H LCALL LOOP1 ;调用二进制转十进制子程序 MOV R0,#79H ;转换结果送显示缓冲器 MOV A,R6 - 252 - LCALL PTDS MOV A,R5 LCALL PTDS MOV A,R4 LCALL PTDS LCALL SSEE ;调用显示子程序 SJMP LOOP0 LOOP1: CLR A ;二进制转十进制子程序 MOV R4,A MOV R5,A MOV R6,A MOV R7,#10H LOOP2: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,R6 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,LOOP2 RET PTDS: MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET SSEE: SETB RS1 MOV R5,#08H - 253 - SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH CLK: CLR TR0 ;定时 1S ### MOV TH0,#04CH ;每 50MS 中断一次 MOV TL0,#00H CPL P1.1 INC 41H MOV A,41H CJNE A,#20,WWW ;20*50MS=1S MOV 41H,#00H CPL P1.0 MOV 50H,TH1 MOV 51H,TL1 MOV TL1,#00H MOV TH1,#00H WWW: SETB TR0 RETI END - 254 - 第三章 课程设计 题目一 电子音乐演奏 一、设计任务 1、利用 51 单片机内部定时计数器编写一个电子音乐发生器。 2、编制一个程序,可自动演奏电子音乐<<东方红>>或非设计示例中的其它 歌曲。 二、设计参考示例 1、设计原理 音名与频率的关系: 音乐的十二平均率规定:每两个八度音(如简谱中的中音 1 与高音 1) 之间的频率相差一倍。在两个八度音之间,又可分为十二个半音,每两个半 音的频率比为 12 更号 2。另外,音名A(简谱中的低音6)的频率为440HZ, 音名B到C之间、E到F之间为半音,其余为全音。由此可以计算出简谱中 从低度音 1 至高音 1 之间每个音名的频率,如下表所示: 简谱中音名与频率的关系表 音名 频率 (HZ) 音名 频率 (HZ) 音名 频率(HZ) 低音 1 261.63 中音 1 523.25 高音 1 1046.50 低音 2 293.67 中音 2 587.33 高音 2 1174.66 低音 3 329.63 中音 3 659.25 高音 3 1318.51 低音 4 349.23 中音 4 698.46 高音 4 1396.92 低音 5 391.99 中音 5 783.99 高音 5 1567.98 低音 6 440 中音 6 880 高音 6 1760 低音 7 493.88 中音 7 987.76 高音 7 1975.52 由于音阶频率多为非整数,而分频系数又不能为小数,故必须将计算得 到的分频数四舍五入取整。若基准频率过低,则由于分频系数过小,四舍五 入取整后的误差较大。若基准频率过高,虽然误码差变小,但分频结构将变 大。实际的设计应综合考虑两方面的因素,在尽量减小频率误差的前提下取 合适的基准频率。 2、原理图 - 255 - 3、操作步骤 P1.5 接蜂鸣器 SP 孔。运行程序 music1 或 music2,蜂鸣器将演奏音乐。 快捷连线说明:P1.5→SP(蜂鸣器) 或 P1.5→VIN(扬声器,音频功放单元) 4、程序清单 (1)基本程序(文件名 MUSIC1.ASM 或 MUSIC2.ASM) MUSIC1.ASM org 0000h ;MUSIC LJMP START ORG 000BH LJMP INTT0 START: MOV SP,#50H MOV TH0,#0D8H MOV TL0,#0EFH MOV TMOD,#01H MOV IE,#82H MUSIC0: NOP MOV DPTR,#DAT MOV 20H,#00H MUSIC1: NOP CLR A MOVC A,@A+DPTR JZ END0 CJNE A,#0FFH,MUSIC5 LJMP MUSIC3 MUSIC5: NOP MOV R6,A INC DPTR MOV A,#0 MOVC A,@A+DPTR MOV R7,A SETB TR0 MUSIC2: NOP CPL P1.5 MOV A,R6 MOV R3,A LCALL DEL MOV A,R7 CJNE A,20H,MUSIC2 MOV 20H,#00H INC DPTR LJMP MUSIC1 MUSIC3: NOP CLR TR0 - 256 - MOV R2,#0DH MUSIC4: NOP MOV R3,#0FFH LCALL DEL DJNZ R2,MUSIC4 INC DPTR LJMP MUSIC1 END0: NOP MOV R2,#0FFH MUSIC6: MOV R3,#00H LCALL DEL DJNZ R2,MUSIC6 LJMP MUSIC0 DEL: NOP DEL3: MOV R4,#02H DEL4: NOP DJNZ R4,DEL4 NOP DJNZ R3,DEL3 RET NOP INTT0: INC 20H MOV TH0,#0D8H MOV TL0,#0EFH RETI DAT: DB 18H,30H,1CH,10H DB 20H,40H,1CH,10H DB 18H,10H,20H,10H DB 1CH,10H,18H,40H DB 1CH,20H,20H,20H DB 1CH,20H,18H,20H DB 20H,80H,0FFH,20H DB 30H,1CH,10H,18H DB 20H,15H,20H,1CH DB 20H,20H,20H,26H DB 40H,20H,20H,2BH DB 20H,26H,20H,20H DB 20H,30H,80H,0FFH DB 20H,20H,1CH,10H DB 18H,10H,20H,20H DB 26H,20H,2BH,20H DB 30H,20H,2BH,40H DB 20H,20H,1CH,10H - 257 - DB 18H,10H,20H,20H DB 26H,20H,2BH,20H DB 30H,20H,2BH,40H DB 20H,30H,1CH,10H DB 18H,20H,15H,20H DB 1CH,20H,20H,20H DB 26H,40H,20H,20H DB 2BH,20H,26H,20H DB 20H,20H,30H,80H DB 20H,30H,1CH,10H DB 20H,10H,1CH,10H DB 20H,20H,26H,20H DB 2BH,20H,30H,20H DB 2BH,40H,20H,15H DB 1FH,05H,20H,10H DB 1CH,10H,20H,20H DB 26H,20H,2BH,20H DB 30H,20H,2BH,40H DB 20H,30H,1CH,10H DB 18H,20H,15H,20H DB 1CH,20H,20H,20H DB 26H,40H,20H,20H DB 2BH,20H,26H,20H DB 20H,20H,30H,30H DB 20H,30H,1CH,10H DB 18H,40H,1CH,20H DB 20H,20H,26H,40H DB 13H,60H,18H,20H DB 15H,40H,13H,40H DB 18H,80H,00H END MUSIC2.ASM numtim equ 20h gewei equ 21h shiwei equ 22h scanled equ 23h org 000h jmp start org 00bh jmp tim0 org 100h start: mov tmod,#00000001b - 258 - mov ie,#10000010b mov numtim,#01h start0:mov 30h,#00h next:mov a,30h mov dptr,#table movc a,@a+dptr mov r2,a jz end0 anl a,#0fh mov r5,a mov a,r2 swap a anl a,#0fh jnz sing clr tr0 jmp d1 sing: dec a mov 22h,a rl a mov dptr,#table1 movc a,@a+dptr mov th0,a mov 21h,a mov a,22h rl a inc a movc a,@a+dptr mov tl0,a mov 20h,a setb tr0 d1:lcall delay inc 30h jmp next end0:clr tr0 jmp start0 tim0:push acc push psw mov tl0,20h mov th0,21h cpl p1.5 pop psw pop acc reti - 259 - delay: mov r7,#02h d2: mov r4,#187 d3: mov r3,#248 djnz r3,$ djnz r4,d3 djnz r7,d2 djnz r5,delay ret table1: dw 64260,64400,64524,64580 dw 64684,64777,64820,64898 dw 64968,65030,65058,65110 dw 65157,65178,65217 table:db 82h,01h,81h,94h,84h db 0b4h,0a4h,04h db 82h,01h,81h,94h,84h db 0c4h,0b4h,04h db 82h,01h,81h,0f4h,0d4h db 0b4h,0a4h,94h db 0e2h,01h,0e1h,0d4h,0b4h db 0c4h,0b4h,04h db 82h,01h,81h,94h,84h db 0b4h,0a4h,04h db 82h,01h,81h,94h,84h db 0c4h,0b4h,04h db 82h,01h,81h,0f4h,0d4h db 0b4h,0a4h,94h db 0e2h,01h,0e1h,0d4h,0b4h db 0c4h,0b4h,04h db 00 TABLE2:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H end - 260 - 题目二 智能温度测量 一、 设计任务 1.测温范围为-10℃-+100℃,测量分辨率为 0.1℃。 2.温度值显示在 2 位以上的动态数码管上。 3.51 单片机完成温度采集与显示控制. 4. 3 秒测量 1 次送显示,单片机用中断方式完成温度的测量与显示.当温 度不在 10℃-+30℃时报警,并交替显示 ERROR 字样与温度值. 二、设计编程指南 (1)DS18B20 的性能特点 1、采用单总线专用技术,既可通过串行口线,也可通过其它 I/O 口线与微 机接口,无须经过其它变换电路,直接输出被测温度值(9 位二进制数,含 符号位)。 2、测温范围为-55℃-+125℃,测量分辨率为 0.0625℃。 3、内含 64 位经过激光修正的只读存储器 ROM。 4、用户可分别设定各路温度的上、下限。 5、内含寄生电源。 (2)DS18B20 的内部结构 DS18B20 内部结构主要由四部分组成:64 位光刻 ROM;温度传感器;非 挥发的温度报警触发器 TH 和 TL;高速暂存器。DS18B20 的 管脚排列如右下图所示: 1、64 位光刻 ROM 光刻 ROM 中的 64 位序列号是出厂前被光刻好的,它可以 看作是该 DS18B20 的地址序列码。64 位光刻 ROM 的排列是: 开始 8 位(28H)是产品类型标号,接着的 48 位是该 DS18B20 自身的序列号,最后 8 位是前面 56 位的循环冗余校验码 (CRC=X8+X5+X4+1)。光刻 ROM 的作用是使每一个 DS18B20 都各不相同,这样就可以实现一根总线上挂接多个 DS18B20 的目的。 2、高速暂存器 3、以 12 位转化为例说明温度高低字节存放形式及计算 12 位转化后得到的 12 位数据,存储在 18B20 的两个高低两个 8 位的 RAM 中,二进制中的前面 5 位 S 是符号位。如果测得的温度大于 0,这5位为0, 只要将测到的数值乘于 0.0625 即可得到实际温度;如果温度小于 0,这 5 - 261 - 位为 1,测到的数值需要取反加 1 再乘于 0.0625 才能得到实际温度。 4、配置寄存器 5、DS18B20 控制方法 根据 DS18B20 的通讯协议,主机控制 DS18B20 完成温度转换必须经过三 个步骤:每一次读写之前都要对 DS18B20 进行复位,复位成功后发送一条 ROM 指令,最后发送 RAM 指令,这样才能对 DS18B20 进行预定的操作。复位 要求主 CPU 将数据线下拉 500 微秒,然后释放,DS18B20 收到信号后等待 16~ 60 微秒左右,后发出 60~240 微秒的存在低脉冲,主 CPU 收到此信号表示 复位成功。 在硬件上,DS18B20 与单片机的连接有两种方法,一种是 Vcc 接外部电 源,GND 接地,I/O 与单片机的 I/O 线相连;另一种是用寄生电源供电,此 时 UDD、GND 接地,I/O 接单片机 I/O。无论是内部寄生电源还是外部供电, I/O 口线要接 5KΩ 左右的上拉电阻。 DS18B20 有多条控制命令,如表所示: 指令 约定代 码 功能 读 ROM 33H 读 DS18B20 中的编码(即 64 位地址) 符合 ROM 55H 发出此命令后,发出 64 位编码地址,找出地址相对应的 DS18B20 器件,为下一步对该 DS18B20 的读写作准备 搜索 ROM 0F0H 用于确定挂接在同一总线上的 DS18B20 的个数和 64 位 ROM 地址 跳过 ROM 0CCH 忽略 64 位 ROM 地址,直接向 DS18B20 发温度转换命令, 适用于单片工作 告警搜索命 令 0ECH 执行后,只有温度值超过设定值上限或下限的片子才会 做出反应 温度变换 44H 启动 DS18B20 开始进行温度转换,结果存入内部 RAM 中 读暂存器 0BEH 读暂存器 RAM 中的温度值 - 262 - 写暂存器 4EH 向内容 RAM 中的第 3、4 字节写入上、下限温度命令,紧 跟命令之后,传送的是两字节的数据 复制暂存器 48H 将 RAM 中的第 3、4 字节内容复制到 E2PROM 中 重调 E2PROM 0B8H 将 E2PROM 中内容恢复到 RAM 中的第 3、4 字节 读供电方式 0B4H 读 DS18B20 的供电模式,寄后供电是发送0,外接电源供 电发送 1 三、设计示例 1、接线图 单片机电路及显示接口电路详见系统原理图部分,DS18B20 芯片接线如右图 所示。 2、程序流程图 开始 程序初始化 调用显示子程序 调用DS18B20温度处理程序 将温度值读出到指定位 ,并 进行移位 、十进制调整 温度值送显示缓冲区 - 263 - 3、操作步骤 把 DS18B20 芯片的单总线端口 DQ 用连线接至 P1.0,运行程序,数码管 上显示“18b-XX”,后二位显示采集的温度值。 快捷连线说明:P1.0→DQ 4、程序清单 (1)基本程序(文件名 DS18B20.ASM) ;***********DS18B20 智能温度控制器 数据线接 P1.0******* ;***六位数码显示,前三位显示“18b”******************* ;***第四位表示温度的正负符号,正为“┩”,负为“-”**** ;***第五位和第六位显示温度(显示范围-55~+99 摄氏度) TEMPER_L EQU 29H;用于保存读出温度的低 8 位 TEMPER_H EQU 28H;用于保存读出温度的高 8 位 FLAG1 EQU 38H;是否检测到 DS18B20 标志位 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV SP,#53H MOV P2,#0FFH ;******************** MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#01H MOV 7DH,#08H MOV 7CH,#0BH MOV 7BH,#14H MOV 7AH,#10H MOV 79H,#10H LOOP: LCALL SSEE LCALL GET_TEMPER;调用读温度子程序 ;进行温度显示,这里我们用两位数码管来显示温度 ;显示范围-55 到+99 度,显示精度为 1 度 ;因为 12 位转化时每一位的精度为 0.0625 度,我们不要求显示小数所以可以抛弃 29H 的低 4 位 ;将 28H 中的低 4 位移入 29H 中的高 4 位,这样获得一个新字节,这个字节就是实际测量 获得的温度 - 264 - ;这个转化温度的方法非常简洁无需乘于 0.0625 系数 MOV A,29H MOV C,40H ;将 28H 中的最低位移入 C RRC A MOV C,41H RRC A MOV C,42H RRC A MOV C,43H RRC A JNB 43H,POSITIVE ;判断 28H 中的第 4 个字节,“0”表示温度值为正, “1”表示为负 CPL A ;如果为负值,显示“-”号,且数值必需取补码后 送显示才正确! ADD A,#01H ;如果为正值,显示“┩”号! MOV 7BH,#14H JMP MINUS POSITIVE: MOV 7BH,#15H MINUS: MOV 29H,A CPL P1.0 MOV A,29H ;十进制调整开始 MOV R0,#8 MOV R3,#00H MOV R4,#00H MOV R3,A NEXT1: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ R0,NEXT1 MOV 50H,A ;十进制调整结束 MOV A,50H ;取出温度值 - 265 - ;***************************** MOV R0,#79H ;温度值送显示缓冲区 LCALL PTDS SJMP LOOP ORG 05D0H PTDS: MOV R1,A ;拆送显示缓冲区 ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET ORG 0200H SSEE: SETB RS1 ;换工作区 MOV R5,#08H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 ;8 次显示完了吗? - 266 - CLR RS1 RET DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH,0B9H ;*********************************** ; 这是 DS18B20 复位初始化子程序 ;*********************************** INIT_1820: SETB P1.0 NOP CLR P1.0 MOV R1,#3 ;主机发出延时 537 微秒的复位低脉冲 TSR1: MOV R0,#107 DJNZ R0,$ DJNZ R1,TSR1 SETB P1.0 ;然后拉高数据线 NOP NOP NOP MOV R0,#25H TSR2: JNB P1.0,TSR3 ;等待 DS18B20 回应 DJNZ R0,TSR2 LJMP TSR4 ;延时 TSR3: SETB FLAG1 ;置标志位,表示 DS1820 存在 CLR P1.7 ;检查到 DS18B20 就点亮 P1.7LED LJMP TSR5 TSR4: CLR FLAG1 ;清标志位,表示 DS1820 不存在 CLR P1.1 LJMP TSR7 TSR5: MOV R0,#117 TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间 TSR7: SETB P1.0 RET ;**************************** ; 读出转换后的温度值子程序 - 267 - ;**************************** GET_TEMPER: SETB P1.0 LCALL INIT_1820 ;先复位 DS18B20 JB FLAG1,TSS2 CLR P1.2 RET ;判断 DS1820 是否存在?若 DS18B20 不存在则返回 TSS2: CLR P1.3 ;DS18B20 已经被检测到!!! MOV A,#0CCH ;跳过 ROM 匹配 LCALL WRITE_1820 MOV A,#44H ;发出温度转换命令 LCALL WRITE_1820 LCALL SSEE ;这里通过调用显示子程序实现延时一段时间,等待 AD 转换结束,12 位的话 750 微秒 LCALL INIT_1820 ;准备读温度前先复位 MOV A,#0CCH ;跳过 ROM 匹配 LCALL WRITE_1820 MOV A,#0BEH ;发出读温度命令 LCALL WRITE_1820 LCALL READ_18200 ;将读出的温度数据保存到 29H/28H CLR P1.4 RET ;************************************** ;写 DS18B20 的子程序(有具体的时序要求) ;************************************** WRITE_1820: MOV R2,#8 ;一共 8 位数据 CLR C WR1: CLR P1.0 MOV R3,#5 DJNZ R3,$ RRC A MOV P1.0,C MOV R3,#21 - 268 - DJNZ R3,$ SETB P1.0 NOP DJNZ R2,WR1 SETB P1.0 RET ;*************************************************** ; 读 DS18B20 的程序,从 DS18B20 中读出两个字节的温度数据 ;*************************************************** READ_18200: MOV R4,#2 ;将温度高位和低位从 DS18B20 中读出 MOV R1,#29H ;低位存入 29H(TEMPER_L),高位存入 28H(TEMPER_H) RE00: MOV R2,#8 ;数据一共有 8 位 RE01: CLR C SETB P1.0 NOP NOP CLR P1.0 NOP NOP NOP SETB P1.0 MOV R3,#8 RE10: DJNZ R3,RE10 MOV C,P1.0 MOV R3,#21 RE20: DJNZ R3,RE20 RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET END (2)带注释的基本程序(文件名 SJXHW28.ASM) - 269 - ;***********DS18B20 智能温度控制器 数据线接 P1.0******* ;***六位数码显示,前三位显示“18b”******************* ;***第四位表示温度的正负符号,正为“┩”,负为“-”**** ;***第五位和第六位显示温度(显示范围-55~+99 摄氏度) TEMPER_L EQU 29H;用于保存读出温度的低 8 位 TEMPER_H EQU 28H;用于保存读出温度的高 8 位 FLAG1 EQU 38H;是否检测到 DS18B20 标志位 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV SP,#53H MOV P2,#0FFH ;******************** MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A MOV 7EH,#01H MOV 7DH,#08H MOV 7CH,#0BH MOV 7BH,#14H MOV 7AH,#10H MOV 79H,#10H ;显示缓冲区初值 LOOP: LCALL SSEE LCALL GET_TEMPER ;调用读温度子程序 ;进行温度显示,这里我们用两位数码管来显示温度 ;显示范围-55 到+99 度,显示精度为 1 度 ;因为 12 位转化时每一位的精度为 0.0625 度,我们不要求显示小数所以可以抛弃 29H 的低 4 位 ;将 28H 中的低 4 位移入 29H 中的高 4 位,这样获得一个新字节,这个字节就是实际测量 获得的温度 ;这个转化温度的方法非常简洁无需乘于 0.0625 系数 MOV A,29H MOV C,40H ;将 28H 中的最低位移入 C RRC A MOV C,41H RRC A - 270 - MOV C,42H RRC A MOV C,43H RRC A JNB 43H,POSITIVE ;判断 28H 中的第 4 个字节,“0”表示温度值为正, “1”表示为负 CPL A ;如果为负值,显示“-”号,且数值必需取补码后 送显示才正确! ADD A,#01H ;如果为正值,显示“┩”号! MOV 7BH,#14H JMP MINUS POSITIVE: MOV 7BH,#15H MINUS: MOV 29H,A CPL P1.0 MOV A,29H ;十进制调整开始 MOV R0,#8 MOV R3,#00H MOV R4,#00H MOV R3,A NEXT1: CLR C MOV A,R3 RLC A MOV R3,A MOV A,R4 ADDC A,R4 DA A MOV R4,A DJNZ R0,NEXT1 MOV 50H,A ;十进制调整结束 MOV A,50H ;取出温度值 ;***************************** MOV R0,#79H ;温度值送显示缓冲区 LCALL PTDS SJMP LOOP ORG 05D0H PTDS: MOV R1,A ;拆送显示缓冲区 ACALL PTDS1 - 271 - MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET ORG 0200H ;显示子程序 SSEE: SETB RS1 ;换工作区 MOV R5,#08H SSE2: MOV 30H,#20H MOV 31H,#7EH MOV R7,#06H SSE1: 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 ;8 次显示完了吗? CLR RS1 RET DDFF: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0F1H,0C6H,092H,0BFH,0B9H ;*********************************** ; 这是 DS18B20 复位初始化子程序 ;*********************************** - 272 - INIT_1820: SETB P1.0 NOP CLR P1.0 MOV R1,#3 ;主机发出延时 537 微秒的复位低脉冲 TSR1: MOV R0,#107 DJNZ R0,$ DJNZ R1,TSR1 SETB P1.0 ;然后拉高数据线 NOP NOP NOP MOV R0,#25H TSR2: JNB P1.0,TSR3 ;等待 DS18B20 回应 DJNZ R0,TSR2 LJMP TSR4 ;延时 TSR3: SETB FLAG1 ;置标志位,表示 DS1820 存在 CLR P1.7 ;检查到 DS18B20 就点亮 P1.7LED LJMP TSR5 TSR4: CLR FLAG1 ;清标志位,表示 DS1820 不存在 CLR P1.1 LJMP TSR7 TSR5: MOV R0,#117 TSR6: DJNZ R0,TSR6 ;时序要求延时一段时间 TSR7: SETB P1.0 RET ;**************************** ; 读出转换后的温度值子程序 ;**************************** GET_TEMPER: SETB P1.0 LCALL INIT_1820 ;先复位 DS18B20 JB FLAG1,TSS2 CLR P1.2 RET ;判断 DS1820 是否存在?若 DS18B20 不存在则返回 TSS2: CLR P1.3 ;DS18B20 已经被检测到!!! - 273 - MOV A,#0CCH ;跳过 ROM 匹配 LCALL WRITE_1820 MOV A,#44H ;发出温度转换命令 LCALL WRITE_1820 LCALL SSEE ;这里通过调用显示子程序实现延时一段时间,等待 AD 转换结束,12 位的话 750 微秒 LCALL INIT_1820 ;准备读温度前先复位 MOV A,#0CCH ;跳过 ROM 匹配 LCALL WRITE_1820 MOV A,#0BEH ;发出读温度命令 LCALL WRITE_1820 LCALL READ_18200 ;将读出的温度数据保存到 29H/28H CLR P1.4 RET ;************************************** ;写 DS18B20 的子程序(有具体的时序要求) ;************************************** WRITE_1820: MOV R2,#8 ;一共 8 位数据 CLR C WR1: CLR P1.0 MOV R3,#5 DJNZ R3,$ RRC A MOV P1.0,C MOV R3,#21 DJNZ R3,$ SETB P1.0 NOP DJNZ R2,WR1 SETB P1.0 RET ;*************************************************** ; 读 DS18B20 的程序,从 DS18B20 中读出两个字节的温度数据 ;*************************************************** READ_18200: - 274 - MOV R4,#2 ;将温度高位和低位从 DS18B20 中读出 MOV R1,#29H ;低位存入 29H(TEMPER_L),高位存入 28H(TEMPER_H) RE00: MOV R2,#8 ;数据一共有 8 位 RE01: CLR C SETB P1.0 NOP NOP CLR P1.0 NOP NOP NOP SETB P1.0 MOV R3,#8 RE10: DJNZ R3,RE10 MOV C,P1.0 MOV R3,#21 RE20: DJNZ R3,RE20 RRC A DJNZ R2,RE01 MOV @R1,A DEC R1 DJNZ R4,RE00 RET END - 275 - 题目三 红外线通信控制 一、设计任务 1.利用遥控器 LC7461 芯片、SM0038 芯片完成红外的发射与接收。 2.用单片机实现对红外接收器数据的解码并通过数码管显示对应接收 数据。 3.无按键时显示“E”,有按键时显示对应的键值。 4. 单片机采用外部中断 1 接收红外信号.将接收到的数值依次显示在 6 位 LED 上,每次按键值需显示在最右边一位,数值依次左移,多于 6 位时从最 左边移出,若顺序出现”123”则停止接受. 二、设计提示 (1)红外线遥控系统:通用红外遥控系统由发射和接收两大部分组成,应 用编/解码专用集成电路芯片来进行控制操作。发射部分包括光、电转换放 大器、解调、解码电路。 (2)遥控发射器及其编码:遥控发射器专用芯片很多,根据编码格式可以 分成脉冲宽度调制和脉冲相位调制两在类,这里我们以运用比较广泛,解码 比较容易的脉冲宽度调制来加以说明,现以 LC7461 组成发射电路为例说明 编码原理。当发射器按键按下后,即有遥控码发出,所按的键不同遥控编码 也不同。 这种遥控码具备有以下特征: 采用脉宽调制的串行码,以脉宽为 0.565ms、间隔 0.56ms、周期为 1.125ms 的组合表示二进制的“0”;以脉宽为 0.565ms、间隔 1.685ms、周 期为 2.25ms 的组合表示二进制的“1”。 上述“0”和“1”组成的 42 位二进制码经 38kHz 的载频进行二次调制 以提高发射效率,达到降低电源功耗的目的。然后再通过红外发射二极管产 生红外线向空间发射, 7461 产生的遥控编码是连续的 42 位二进制码组,其中前 26 位为用户识 别码,能区别不同的红外遥控设备,防止不同机种遥控码互相干扰。后 16 位为 8 位的操作码和 8 位的操作反码用于核对数据是否接收准确。 当遥控器上任意一个按键按下超过 36ms 时,LC7461 芯片的振荡器使芯 片激活,将发射一个特定的同步码头,对于接收端而言就是一个 9ms 的低电 平,和一个 4.5ms 的高电平,这个同步码头可以使程序知道从这个同步码头 以后可以开始接收数据。 解码的关键是如何识别“0”和“1”,从位的定义我们可以发现 “0”、“1”均以 0.56ms 的低电平开始,不同的是高电平的宽度不同,“0” 为 0.56ms,“1”为 1.68ms,所以必须根据高电平的宽度区别“0”和“1”。 - 276 - 如果从 0.56ms 低电平过后,开始延时,0.56ms 以后,若读到的电平为低, 说明该位为“0”,反之则为“1”,为了可靠起见,延时必须比 0.56ms 长 些,但又不能超过 1.12ms,否则如果该位为“0”,读到的已是下一位的高 电平,因此取(1.12ms+0.56ms)/2=0.84ms 最为可靠,一般取 0.84ms 左右 即可。 根据红外编码的格式,程序应该等待 9ms 的起始码和 4.5ms 的结果 码完成后才能读码。 (3)接收器及解码 SM0038 是塑封一体化红外线接收器,它是一种集红外线接收、放大、整 形于一体的集成电路,不需要任何外接元件,就能完成从红外线接收到输出 与 TTL 电平信号兼容的所有工作,没有红外遥控信号时为高电平,收到红外 信号时为低电平,而体积和普通的塑封三极管大小一样,它适合于各种红外 线遥控和红外线数据传输。 (4)遥控器键值 三、设计参考示例 1、原理图 2、操作步骤 - 277 - 红外线接收器插孔 HOUT 接 P3.2 ,蜂鸣器插孔 SP 接 P1.5,运行程序 SM0038.ASM,实验箱数码管低两位将显示“P ”,此时按动遥控器上的按钮, 将会显示对应的键值。 快捷连线说明:P3.2→HOUT P1.5→SP(蜂鸣器) 3、程序清单 (1)基本程序(文件名 SM0038N.ASM) ;HOUT 接 P3.2;SP 接 P1.5 ;单片机晶振为:11.0592 ORG 0000H AJMP MAIN ;转入主程序 ORG 0003H ;外部中断 P3.2 脚 INT0 入口地址 AJMP INT ;转入外部中断服务子程序(解码程序) ORG 100H a_bit EQU 20H ;个位 b_bit EQU 21H ;十位 ;以下为主程序进行 CPU 中断方式设置 MAIN: MOV SP,#60H MOV P2,#0FFH MOV A,#81H MOV DPTR,#0FF23H MOVX @DPTR,A ;设置 8155 控制字 SETB EA ;打开 CPU 总中断请求 SETB IT0 ;设定 INT0 的触发方式为脉冲负边沿触发 SETB EX0 ;打开 INT0 中断请求 MOV R4,#00H MOV a_bit,#0FFh ;off MOV b_bit,#14H ;p LOOP: ACALL SSEE AJMP LOOP SSEE: SETB RS1 ;显示子程序 MOV R5,#05H SSE2: MOV 30H,#02H MOV 31H,#21H - 278 - MOV R7,#02H SSE1: MOV R1,#20H MOV A,30H CPL A MOVX @R1,A MOV R0,31H MOV A,@R0 MOV DPTR,#TAB 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 TAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,0DEH,08CH PDS: PUSH ACC ;拆送显示缓冲区子程序 ANL A,#0FH MOV a_bit,A POP ACC SWAP A ANL A,#0FH MOV b_bit,A RET ;以下为进入 P3.2 脚外部中断子程序,也就是解码程序 INT: CLR EA ;暂时关闭 CPU 的所有中断请求 - 279 - MOV R6,#10 SB: ACALL YS1 ;调用 882 微秒延时子程序 JB P3.2,EXIT ;延时 882 微秒后判断 P3.2 脚是否出现高电平如果有 就退出解码程序 DJNZ R6, SB ;重复 10 次,目的是检测在 8820 微秒内如果出现高电 平就退出解码程序 ;以上完成对遥控信号的 9000 微秒的初始低电平信号的识别。 JNB P3.2,$ ;等待高电平避开 9 毫秒低电平引导脉冲 ACALL YS2 ;延时 4.74 毫秒避开 4.5 毫秒的结果码 ;MOV R7,#26 ;忽略前 26 位系统识别码 MOV R7,#16;忽略前 16 位系统识别码,PT2221 共发送 32 位数据,前 16 位为用户 码,后 16 为数据码才是我们需要的 JJJJA: JNB P3.2,$ ;等待地址码第一位的高电平信号 LCALL YS1 ;高电平开始后用 882 微秒的时间尺去判断信号此时的 高低电平状态 MOV C,P3.2 ;将 P3.2 引脚此时的电平状态 0 或 1 存入 C 中 JNC UUUA ;如果为 0 就跳转到 UUUA LCALL YS3 ;检测到高电平 1 的话延时 1 毫秒等待脉冲高电平结束 UUUA: DJNZ R7,JJJJA MOV R1,#1AH ;设定 1AH 为起始 RAM 区 MOV R2,#2 ;接收从 1AH 到 1BH 的 2 个内存,用于存放操作码和操 作反码 PP: MOV R3,#8 ;每组数据为 8 位 JJJJ: JNB P3.2,$ ;等待地址码第一位的高电平信号 LCALL YS1 ;高电平开始后用 882 微秒的时间尺去判断信号此时的 高低电平状态 MOV C,P3.2 ;将 P3.2 引脚此时的电平状态 0 或 1 存入 C 中 JNC UUU ;如果为 0 就跳转到 UUU LCALL YS3 ;检测到高电平 1 的话延时 1 毫秒等待脉冲高电平结束 UUU: MOV A,@R1 ;将 R1 中地址的给 A RRC A ;将 C 中的值 0 或 1 移入 A 中的最低位 MOV @R1,A ;将 A 中的数暂时存放在 R1 数值的内存中 DJNZ R3,JJJJ ;接收满 8 位换一个内存 INC R1 ;对 R1 中的值加 1,换下一个 RAM DJNZ R2,PP ;接收完 8 位数据码和 8 位数据反码,存放在 1AH/1BH 中 MOV A,1AH - 280 - CPL A ;对 1AH 取反后和 1BH 比较 CJNE A,1BH,EXIT ;如果不等表示接收数据发生错误,放弃 MOV A,1AH ACALL PDS CLR P1.5 LCALL YS2 LCALL YS2 LCALL YS2 SETB P1.5 EXIT: SETB EA ;允许中断 RETI ;退出解码子程序 ;延时子程序 1,精确延时 882 微秒 ;YS1: MOV R4,#20 ;12M 晶振请用此句延时 YS1: MOV R4,#17 ;11.0592M 晶振请用此句延时 D1: MOV R5,#19 DJNZ R5,$ DJNZ R4,D1 RET ;延时子程序 2,精确延时 4740 微秒 YS2: MOV R4,#10 ;D2: MOV R5,#235 ;12M 晶振请用此句延时 D2: MOV R5,#217 ;11.0592M 晶振请用此句延时 DJNZ R5,$ DJNZ R4,D2 RET ;延时程序 3,精确延时 1000 微秒 YS3: MOV R4,#2 ;D3: MOV R5,#248 ;12M 晶振请用此句延时 D3: MOV R5,#230 ;11.0592M 晶振请用此句延时 DJNZ R5,$ DJNZ R4,D3 RET END - 281 - 题目四 语音控制实验 一、设计任务 1.设计 51 单片机、ISD1730 录音控制及接口电路。 2.用单片机控制 ISD1730 的分地址录放音,增加系统的语音提示功能,并在 LED 数码管上显示。 3.把语音芯片 ISD1730 录放音时间 20 秒分成 20 段,每段一秒,调用录音 子程序,录入语音,建立语音库。 4.语音录入结束后,根据段地址,调用放音子程序,还原原来录入语音信 号。 5.录放音要求有手动方式与单片机控制方式 2 种模式。 6. 录音时,点亮二极管灯,每次 0.5S,总共点亮 40 次。 7. 设计一个开关控制连续播放所录语音.单片机以中断方式接受连续播放 申请. 二、设计提示 ISD1730 是华邦 ISD 公司 2007 年新推出的单片优质语音录放电路,该芯 片提供多项新功能,包括内置专利的多信息管理系统,新信息提示( vAlert ) , 双运作模式(独立 & 嵌入式),以及可定制的信息操作指示音效。芯片内部 包 含有自动增益控制、麦克风前置扩大器、扬声器驱动线路、振荡器与内存等的 全方位整合系统功能。 (1) 特点: · 可录、放音十万次,存储内容可以断电保留一百年 · 两种控制方式,两种录音输入方式,两种放音输出方式 · 可处理多达 255 段信息 · 有丰富多样的工作状态提示 · 多种采样频率对应多种录放时间 · 音质好,电压范围宽,应用灵活,价廉物美 (2)电特性: · 工作电压: 2.4V-5.5V,, 最高不能超过 6V · 静态电流: 0.5 - 1 μA · 工作电流: 20mA - 282 - 用户可利用震荡电阻来自定芯片的采样频率,从而决定芯片的录放时间和 录放音质。下表为 ISD1730 的参数表: 时间(秒) 20 37 45 60 采样率( KHZ ) 12 8 6.4 5.3 4 ROSC 阻值( KΩ ) 60 80 100 120 160 (3)独立手动按键工作模式 ISD1730 的独立按键工作模式录放电路非常简单(后附图),而且功能强 大。不仅有录、放功能,还有快进、擦除、音量控制、直通放音和复位等功能。 这些功能仅仅通过按键就可完成。 在按键模式工作时,芯片可以通过 LED 管脚给出信号来提示芯片的工作状 态,并且伴随有提示音,脉冲计数 用户也可自定 4 种提示音效。 录音操作: 按下 REC 键, REC 管脚电平变低后开始录音,直到松开按键使电平拉高 或者芯片录满时结束。录音结束后,录音指针自动移向下一个有效地址。而放 音指针则指向刚刚录完的那段语音地址。 放音操作 : 放音操作有两种模式,分别是边沿触发和电平触发,都由 PLAY 管脚触发。 A )边沿触发模式: 点按一下 PLAY 键, PLAY 管脚电平变低便开始播放当前段的语音,并在 遇到 EOM 标志后自动停止。放音结束后,播放指针停留在刚播放的语音起始地 址处,再次点按放音键会重新播放刚才的语音。在放音期间, LED 灯会闪烁直 到放音结束时熄灭。如果在放音期间点按放音键会停止放音。 B )电平放音模式: 如果一直按住 PLAY 键,使 PLAY 管脚电平持续为低,那么会将芯片内所 - 283 - 有语音信息播放出来,并且循环播放直到松开按键将 PLAY 管脚电平拉高。在 放音期间 LED 闪烁。当放音停止,播放指针会停留在当前停止的语音段起始位 置。 快进操作: 点按一下 FWD 按钮将 FWD 端拉低,会启动快进操作。快进操作用来将播 放指针移向下一段语音信息。当播放指针到达最后一段语音处时,再次快进, 指针会返回到第一段语音。当下降沿来到 FWD 端时,快进操作还要决定于芯片 当时的状态: 如果芯片在掉电状态并且当前播放指针的位置不在最后一段,那么指针会 前进一段,到达下一段语音处。 如果芯片在掉电状态并且当前播放指针的位置在最后一段,那么指针会返 回到第一段语音处。 如果芯片正在播放一段语音(非最后一段),那么此时放音停止,播放指 针前进到下一段,紧接着播放新的语音。 如果芯片正在播放最一段语音,那么此时,放音停止,播放指针返回到第 一段语音,紧接着播放第一段语音。 擦除操作: 擦除操作分为单段擦除和全体擦除两种擦除方式,区别如下: 单个擦除: 只有第一段或最后一段语音可以被单个擦除。点按一下 ERASE 健将 ERASE 管脚拉低,这时具体的擦除情况要看播放指针的状态: · 如果芯片空闲并且播放指针指向第一段语音,则会删除第一段语音,播 放指针指向新的第一段语音(执行擦除操作前的第二段) · 如果芯片空闲并且播放指针指向最后一段语音,则会删除最后一段语音, 播放指针指向新的最后一段语音(执行擦除操作前的倒数第二段) · 如果芯片空闲并且播放指针指向没有指向第一或最后一段语音,则不会 删除任何语音,播放指针也不会被改变 · 如果芯片当前正在播放第一段或最后一段语音,点按下 ERASE 键会删 除当前语音。 全体擦除: 当按下 ERASE 键将 ERASE 管脚电平拉低超过 10 秒钟,会触发全体擦除操 作,删除全部语音信息。 复位操作: 如果用 RESET 控制此管脚,建议 RESET 管脚与地之间连接 一个 0.1 μF 电容。当 RESET 被触发,芯片将播放指针和录音指针都放置在最后一段语音信 息的位置。 音量操作: 点按一下 VOL 键将 VOL 管脚拉低会改变音量大小。每按一下,音量会减 小一档,再到达最小档后再按的话,会增加音量直到最大档,如此循环。总共 有 8 个音量档供用户选择,每一档会改变 4dB 。复位操作会将音量档放在默 认位置,即最大音量。 FT 直通操作: 按住 FT 键将 FT 管脚持续保持在低电平会启动直通模式。出厂设定的是 在芯片空闲状态,直通操作会将语音从 Analn 端直接通往喇叭端或 AUD 输出 - 284 - 口。在录音期间按下 FT 键,会同时录下 Analn 进入的语音信号。 三、接线图 四、设计参考示例 1、手动实验: SP 接 VIN(音频功放,用短路块将 5V 与 ON 短路),按下 REC 键不放,LED 指示灯亮,此时可对准 MIC 麦克风开始录音,松开 REC 键,既可录完一段。如果 继续录音,同样操作,不过地址指针会自动向下加 1,不会覆盖前面的内容。 放音时,按下 PLAY 键,即右播放当前地址内容。 其按键操作详见实验介绍和 PDF 文档“ISD1730 使用手册”。 2、联机 SPI 程序控制: SP 接 VIN(音频功放,用短路块将 5V 与 ON 短路) P1.0 接/SS,P1.1 接 SCLK,P1.2 接 MOSI,P1.3 接 MISO; P1.4 接 K1(K1=1 录音,K1=0 放音); P1.5 接 K2(复位,“0”低电平位复位,正常工作时应打在“1”高电平); P1.6 接 K3(录音时,K3 置低电平,运行程序,L1 亮,若 L1 不亮,则重新 装载运行直至 L1 亮,此时可以录音。 放音时,重新装载运行程序,K3 给一个脉冲,L1 亮后,即可放音。); P1.7 接 L1(发光二极管); P3.1 接 K4(“1”高电平时,MIC 录音;“0”低电平时,线录录音) 录放音时,将开关设置好,调入程序运行。 3、程序清单 文件名:1730·ASM - 285 - SS EQU P1.0 ; 片选 SCLK EQU P1.1 ; ISD1730 时钟 MOSI EQU P1.2 ; 数据输入 MISO EQU P1.3 ; 数据输出 LED EQU P1.7 ; 指示灯 AN EQU P1.6 ; 执行 "0" STOP EQU P1.5 ; 复位"0" PR EQU P1.4 ; PR=1 录音 PR=0 放音 MORA EQU P3.1 ; MIC录音"1"----线录录音"0" ;*************************************************** ;20H-25H 为 SPI 命令字的 1-6 位存储单元 ;*************************************************** ORG 0000H ; AJMP MAIN ; MAIN: MOV SP,#70H ; MOV P1,#0FFH ; ;MOV P2,#0FFH ; ;MOV P3,#0FFH ; SETB P3.1 ;MOV P0,#0FFH ; CLR EA ; MAII: ACALL REST ;芯片复位 ACALL DSTOP ;ISD 掉电 SETB LED ;关指示灯 MAS0: MOV 3AH,#200 JNB STOP,REC6 ; MAS1: JB AN,MAS0 ;等按 AN 键 DJNZ 3AH,MAS1 ; PU: ACALL UP ;ISD 上电 JB MORA,MICREC MOV 21H,#08H MOV 22H,#04H AJMP GOON MICREC: MOV 21H,#40H MOV 22H,#04H GOON: ACALL WR_APC ACALL WAITRDY ; 等待 RDY 置 1 ACALL CLRINT ; 清除中断 ACALL WAITRDY ACALL CHK_MEM ; 检查芯片环状存储结构 JB PR,REC ;PR=1 录音 AJMP PLAY ;PR=0 放音 REC: MOV 36H,#10 ACALL YS50 ; 延时录音 - 286 - DJNZ 36H,REC1 REC1: MOV 20H,#51H ;#51H ; 发送 REC 命令 MOV 21H,#00H MOV A,20H ACALL SPIO MOV A,21H ACALL SPIO SETB SS ; 关片选 ACALL CHECKRDY JNB ACC.3,REC1 ; 检查 SR0 寄存器 REC 位,如果没有启动 REC 则重新发送命令 CLR LED ; 开 LED 灯 REC3: MOV 35H,#200 REC4: ACALL CHECKFULL ; 检查芯片存储器是否溢出 JNB AN,REC3 DJNZ 35H,REC4 SETB LED ACALL CLRINT ACALL STOPP ; 停止录音 REC5: JNB STOP,REC6 JB AN,REC5 ACALL STOPP ACALL CLRINT ACALL WAITRDY ACALL CHK_MEM AJMP REC REC6: MOV R1,#60H TOERASE: JB STOP,TOPD ACALL YS50 DJNZ R1,TOERASE ACALL G_ERASE MOV R1,#03H LEDWAIT: CLR LED ACALL LEDELAY SETB LED ACALL LEDELAY DJNZ R1,LEDWAIT TOPD: ACALL STOPP ACALL CLRINT AJMP MAII REC7: SETB LED MOV 36H,#10 - 287 - REC8: ACALL YS50 JB AN,REC6 DJNZ 36H,REC8 CLR LED MOV 36H,#10 REC9: ACALL YS50 JB AN,REC6 DJNZ 36H,REC9 AJMP REC7 PLAY: JNB AN,PLAY REPLAY: MOV 20H,#50H ;#50H ; 发送放音指令 MOV 21H,#00H MOV A,20H ACALL SPIO MOV A,21H ACALL SPIO SETB SS ACALL CHECKSR ; 扫描 SR 寄存器 JB ACC.0,REPLAY ; 如果指令没有接收,则重新发送 CLR LED PLAY1: JNB STOP,REC6 ACALL CHECKRDY ; 等待放音结束(检查 RDY 是否置 1 ) JNB ACC.0,PLAY1 SETB LED ACALL STOPP PLAY2: JNB STOP,REC6 JB AN,PLAY2 ACALL FWD ; 发送快进指令,将放音指针跳向下一段语音信息 ACALL CHECKRDY ACALL CHK_MEM AJMP PLAY ; 扫描 ISD1700 状态寄存器 SR1 CHECKRDY: MOV 20H,#05H MOV 21H,#00H MOV 22H,#00H CHECKRDY1: ACALL RDSTATUS MOV A,20H ACALL SPIO MOV 26H,a MOV A,21H ACALL SPIO - 288 - MOV 27H,A MOV A,22H ACALL SPIO MOV 28h,A RET ; 扫描 ISD1700 状态寄存器 SR0 CHECKSR: MOV 20H,#05H ACALL RDSTATUS MOV A,20H ACALL SPIO MOV 26H,a RET ; 等待 ISD1700 状态寄存器 SR1.0 位( RDY ) 置 1 WAITRDY: ACALL CHECKRDY JNB ACC.0,WAITRDY RET ; 检测 ISD1700 状态寄存器 SR0.1 位( FULL) ,是否为 1 CHECKFULL: ACALL RDSTATUS MOV A,20H ACALL SPIO JNB ACC.1,CHECKFULL2 LJMP REC7 CHECKFULL2: RET ; 清楚中断标志 INT 指令 << CLR_INT >> CLRINT: MOV 20H,#04H MOV 21H,#00H MOV A,20H ACALL SPIO MOV A,21H ACALL SPIO SETB SS ACALL YS50 ;50mS 延时 ACALL YS50 ;50mS 延时 RET ; ;ISD1700 上电 << POWERUP >> UP: MOV 20H,#01H MOV 21H,#00H MOV A,20H ACALL SPIO - 289 - MOV A,21H ACALL SPIO SETB SS ACALL YS50 ;50mS 延时 ACALL YS50 ;50mS 延时 RET ; 停止当前操作 << STOP >> STOPP: MOV 20H,#02H MOV 21H,#00H MOV A,20H ACALL SPIO MOV A,21H ACALL SPIO SETB SS ACALL YS50 ;50mS 延时 ACALL YS50 ;50mS 延时 RET ; 检测环行内存指令 << CHK_MEM >> CHK_MEM: MOV 20h,#49H MOV 21H,#00H MOV A,20H ACALL SPIO MOV A,21H ACALL SPIO SETB SS RET ; 快进指令 <> FWD: MOV 20h,#48H MOV 21H,#00H MOV A,20H ACALL SPIO MOV A,21H ACALL SPIO SETB SS RET ; 停止当前操作掉电 << PD >> DSTOP: MOV 20H,#07H MOV 21H,#00H MOV A,20H ACALL SPIO MOV A,21H ACALL SPIO SETB SS - 290 - RET ; 写入 APC 寄存器指令 << WR_APC2 >> , 写入内容放置在 21H,22H 里 WR_APC: MOV 20h,#65H MOV A,20h ACALL SPIO MOV A,21h ACALL SPIO MOV A,22H ACALL SPIO SETB SS RET ; 读取 SR 状态寄存器指令 << RD_STATUS >> RDSTATUS: MOV 20h,#05H MOV 21h,#00H MOV 22H,#00H MOV A,20h ACALL SPIO MOV A,21h ACALL SPIO MOV A,22H ACALL SPIO SETB SS RET ;擦除芯片所有语音 G_ERASE: MOV 20H,#43H ; MOV 21H,#00H MOV A,20H ACALL SPIO MOV A,21H ACALL SPIO ; SETB SS ; 关片选 ACALL YS50 ;50mS 延时 ACALL YS50 ;50mS 延时 RET ; 复位指令 << RESET >> REST: MOV 20H,#03H MOV 21h,#00H MOV A,20h ACALL SPIO MOV A,21h ACALL SPIO - 291 - SETB SS ;***************************** ; 89c 51 模拟 SPI 口 发送和接收子程序 ;***************************** SPIO: SETB SCLK CLR SS MOV R6,#08 SPIO1: CLR SCLK NOP NOP MOV C,MISO RRC A MOV MOSI,C SETB SCLK DJNZ R6,SPIO1 CLR MOSI RET ;LED 延迟 LEDELAY: MOV R2,#08H LEDELAY1: CALL YS50 DJNZ R2,LEDELAY1 RET ;**** 10mS 延时 **** YS10: MOV TMOD,#01H ; MOV TH0,#0DCH ;10mS 延时初值置入 ;11.0592M MOV TL0,#00H ;(65536-X)*1.0850302=10MS SETB TR0 ;65536-(10000/1.0850302)=DC00H ;MOV TH0,#0D8H ;10mS 延时初值置入 ;12M ;MOV TL0,#0F0H ;(65536-X)*1=10MS ;SETB TR0 ;65536-(10000/1)=D8F0H JNB TF0,$ ; CLR TF0 ; CLR TR0 ; RET ; ;**** 50mS 延时 **** YS50: MOV TMOD,#01H ; MOV TH0,#4BH ;50mS 延时初值置入 ;11.0592 MOV TL0,#0FEH ;(65536-X)*1=50MS SETB TR0 ;65536-(50000/1) =4BFEH ;MOV TH0,#3CH ;50mS 延时初值置入 ;12M ;MOV TL0,#0B0H ;(65536-X)*1=50MS ;SETB TR0 ;65536-(50000/1) - 292 - JNB TF0,$ ; CLR TF0 ; CLR TR0 ; RET END ; - 293 - 题目五 交通灯控制 一、设计任务 1.利用单片机内部定时计数器完成时间计量。 2.利用 51 单片机设计扩展并行接口,控制六个发光二极管燃灭,模拟交通 灯管理。 3.初始态为所有红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮, 东西路口方向通车,延时 10S 后东西路口的绿灯熄灭,黄灯开始闪烁,闪烁 3 次后(共 3S),东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向开 始通车,延时 10S 后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁 3 次后(共 3S),再切换到东西路口方向,之后重复以上过程。 4. 扩展设计:用键盘输入或开关完成黄灯开始闪烁次数(时间 2S-6S)和绿灯 亮的时间(时间 5S-15S)预置,步进为 1S. 二、设计参考示例 1、程序框图 2、接线图 - 294 - 3、操作步骤 8255 PA0~PA2 口接 L3~L1 灯、PA3~PA5 口接 L7~L5 灯。执行程序,初 始态为四个路口的红灯全亮之后,东西路口的绿灯亮,南北路口的红灯亮, 东西路口方向通车,延时一段时间后东西路口的绿灯熄灭,黄灯开始闪烁, 闪烁若干次后,东西路口红灯亮,而同时南北路口的绿灯亮,南北路口方向 开始通车,延时一段时间后,南北路口的绿灯熄灭,黄灯开始闪烁,闪烁若 干次后,再切换到东西路口方向,之后重复以上过程。 快捷连线说明: PA0~PA2→L3~L1 PA3~PA5→L7~L5 4、程序 (1)基本程序(文件名 HW07·ASM) ORG 0000H LJMP JOD0 ORG 0BB0H JOD0: MOV SP,#60H MOV DPTR,#0FF2BH MOV A,#88H MOVX @DPTR,A MOV DPTR,#0FF28H MOV A,#0B6H MOVX @DPTR,A INC DPTR MOV A,#0DH MOVX @DPTR,A MOV R2,#25H LCALL DELY - 295 - JOD3: MOV DPTR,#0FF28H MOV A,#75H MOVX @DPTR,A INC DPTR MOV A,#0DH MOVX @DPTR,A MOV R2,#55H LCALL DELY MOV R7,#05H JOD1: MOV DPTR,#0FF28H MOV A,#0F3H MOVX @DPTR,A INC DPTR MOV A,#0CH MOVX @DPTR,A MOV R2,#20H LCALL DELY MOV DPTR,#0FF28H MOV A,#0F7H MOVX @DPTR,A INC DPTR MOV A,#0DH MOVX @DPTR,A MOV R2,#20H LCALL DELY DJNZ R7,JOD1 MOV DPTR,#0FF28H MOV A,#0AEH MOVX @DPTR,A INC DPTR MOV A,#0BH MOVX @DPTR,A MOV R2,#55H LCALL DELY MOV R7,#05H JOD2: MOV DPTR,#0FF28H MOV A,#9EH MOVX @DPTR,A INC DPTR MOV A,#07H MOVX @DPTR,A MOV R2,#20H LCALL DELY MOV DPTR,#0FF28H - 296 - MOV A,#0BEH MOVX @DPTR,A INC DPTR MOV A,#0FH MOVX @DPTR,A MOV R2,#20H LCALL DELY DJNZ R7,JOD2 LJMP JOD3 ORG 0C30H 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 (2)带注释的基本程序:文件名:SJXHW07.ASM ORG 0000H LJMP JOD0 ORG 0BB0H JOD0: MOV SP,#60H MOV DPTR,#0FF2BH ;8255 控制口初始化 MOV A,#88H MOVX @DPTR,A MOV DPTR,#0FF28H MOV A,#0B6H MOVX @DPTR,A ;四个路口红灯亮 MOV R2,#25H ;延时 LCALL DELY JOD3: MOV DPTR,#0FF28H MOV A,#75H MOVX @DPTR,A ;东西绿灯亮,南北红灯亮 MOV R2,#55H ;延时 LCALL DELY MOV R7,#05H ;黄灯闪烁 5 次 JOD1: MOV DPTR,#0FF28H MOV A,#0F3H - 297 - MOVX @DPTR,A ;东西黄灯亮,南北红灯亮 MOV R2,#20H ;延时 LCALL DELY MOV DPTR,#0FF28H MOV A,#0F7H MOVX @DPTR,A ;东西黄灯灭,南北红灯亮 MOV R2,#20H LCALL DELY DJNZ R7,JOD1 ;R7 减 1 后不为 0,则跳转 MOV DPTR,#0FF28H MOV A,#0AEH MOVX @DPTR,A ;东西红灯亮,南北绿灯亮 MOV R2,#55H LCALL DELY MOV R7,#05H JOD2: MOV DPTR,#0FF28H MOV A,#9EH MOVX @DPTR,A ;东西红灯亮,南北黄灯亮 MOV R2,#20H LCALL DELY MOV DPTR,#0FF28H MOV A,#0BEH MOVX @DPTR,A ;东西红灯亮,南北灯灭 MOV R2,#20H LCALL DELY DJNZ R7,JOD2 ;R7 减 1 后不为 0,则跳转 LJMP JOD3 ORG 0C30H 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

下载文档,方便阅读与编辑

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档

相关文档