nbhkdz.com冰点文库

超想

时间:2014-02-25


超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

目 录
恒科 Keil C 超级仿真器使用说明?????????????????????????????????3 一、产品简介???????????????????????????????????????3 二、KEIL 软件的安装????????????????????????????????????3 三、 USB 驱动的安装?????????????????????????????????????5 四、KEIL C 软件的操作说明?????????????????????????????????5 ?产品简介??????????????????????????????????????????10 0.1 系统组成?????????????????????????????????????10 0.2 实验内容??????????????????????????????????????11 0.3 实验方式??????????????????????????????????????11 0.4 支持器件??????????????????????????????????????11 ?综合实验仪?????????????????????????????????????????12 1.1 实验模块??????????????????????????????????????12 1.2 常用逻辑门电路???????????????????????????????????19 1.3 自由实验插座????????????????????????????????????20 1.4 直流电源外引插座??????????????????????????????????20 1.5 总线插孔??????????????????????????????????????20 1.6 空间分配??????????????????????????????????????20 ?实验例程( MCS51) ?????????????????????????????????????21 第一节 软件实验????????????????????????????????????21 实验一 拆字程序实验???????????????????????????????????21 实验二 拼字程序实验???????????????????????????????????21 实验三 数据区传送子程序实验???????????????????????????????22 实验四 数据排序实验???????????????????????????????????22 实验五 清零程序(模拟调试)???????????????????????????????24 第二节 硬件基础性实验?????????????????????????????????25 实验一 八段数码管显示实验????????????????????????????????25 实验二 键盘扫描显示实验?????????????????????????????????28 实验三 脉冲计数 (定时/计数器记数功能实验) ????????????????????????33 实验四 A/D 转换实验???????????????????????????????????36 实验五 D/A0832 转换实验?????????????????????????????????39 实验六 电子琴实验????????????????????????????????????42 实验七 步进电机控制实验?????????????????????????????????45 实验八 RAM 扩展实验??????????????????????????????????50 实验九 工业顺序控制(INT0 INT1)综合实验?????????????????????????52 实验十 扩展时钟系统 (DS12887) 实验????????????????????????????55 实验十一 V/F 压频转换实验????????????????????????????????62 实验十二 力测量实验???????????????????????????????????66 实验十三 温度测量实验??????????????????????????????????69 实验十四 直流电机转速测量与控制实验???????????????????????????72 实验十五 点阵式 LCD 液晶显示屏实验????????????????????????????80 实验十六 点阵 LED 广告屏实验??????????????????????????????90
?1?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 实验十七 红外线遥控实验?????????????????????????????????91 实验十八 PWM 实验???????????????????????????????????100 实验十九 继电器控制实验????????????????????????????????101 第三节 “扩展性”实验(选配)??????????????????????????????102 实验一 数字温度计实验?????????????????????????????????102 实验二 数字语音录放实验????????????????????????????????104 实验三 IC 卡实验????????????????????????????????????110 实验四 LED16?16 图形点阵实验?????????????????????????????115 实验五 实验六 实验七 实验八 128?64 点阵式 LCD 显示屏实验??????????????????????????117 无线 MODEM 发送接收实验????????????????????????????? 123 无线摇控实验??????????????????????????????????131 红外感应实验??????????????????????????????????134

第四节 “自检式” 演示实验????????????????????????????????135 0 -- LCD 液晶显示器实验 1 -- V/F 压力频率转换实验 2 -- 脉冲计数实验 3 -- DA0832 转换实验 4 -- AD0809 转换实验 5 -- 红外线遥控实验 6 -- 温度测量实验 7 -- 力测量实验 8 -- 电子琴 9 -- 直流电机转速测量与控制实验 A -- 点阵 LED 广告屏实验 B -- 步进电机控制 C -- RS232 通讯实验 D -- 八段码管显示实验 E -- 键盘扫描显示实验 F -- 扩展时钟系统(DS12887)实验 MCS51 简易操作手册?????????????????????????????????????137 附录一 直流电机参数????????????????????????????????????139 附录二 步进电机参数????????????????????????????????????139 附录三 电阻应变计 (压力传感器) 参数?????????????????????????????139 附录四 热敏电阻参数对应表?????????????????????????????????139

?2?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

恒科 Keil C 超级仿真器使用说明
一、产品简介 keil C51 u Vision2 是德国 Keil 公司开发的基于 Windows 环境的 8051 软件开发平台,它集项目管理、源程 序编辑、程序调试于一体,是一个强大的集成开发环境。u Vision2 支持 Keil 的各种 8051 工具,包括:C 编译 器,宏汇编译器、连接/定位器及 Object-hex 转换程序,可以帮助用户快速有效的实现嵌入式系统的设计于调 试。采用 C 语言进行单片机系统的开发,具有避免手工分配寄存器,移植容易等优点。 恒科 Keil C 超级仿真器优特点: 1、仿真 8031 内核的单片机。 2、接支持 Keil C51 的 IDE 开发仿真环境,63K 用户程序空间。 3、全保留单片机特性,避免仿真正常而实际烧录芯片不正常的问题。 4、仿真频率 0—40MHZ 晶振可选。 5、程序代码可重复装载。 6、监控程序占用用户资源极少,全速运行不占用资源。 7、可在 Keil uVision2 下单步、断点、全速,可参考变量、RAM 变量、结构变量等。 8、支持汇编、C 语言、混合调试。 9、内部存储物理空间为 68K,是伟福通用仿真器 G6 型的 7 倍,是伟福 51 专用仿真器的 4 倍。 10、仿真频率可达 40MHZ。 11、支持 10 个硬件断点。 在 Keil C51 集成开发环境是使用工程方法来管理文件的,而不是单一文件的模式。所有的文件包括源程序 (包括 C 程序,汇编程序) 、头文件、甚至说明性的技术文档都可以放在工程项目文件里面统一管理。在使用 Keil C51 之前,您应该习惯这种工程的管理方式,对于刚刚使用 Keil C51 的用户来讲,一般可以按照下面的步 骤来创建一个自己的 Keil C51 应用程序。 1、建一个项目文件;2、工程选择一个目标器件(如 ATMEL89C52) ;3、创建源程序文件并输入程序代码 并保存;4、把源文件添加到项目中;5、为工程项目设置软硬件调试环境;6、编译项目文件;7、硬件或者软 件调试。 二、KEIL 软件的安装 将带有 KEIL 安装软件的光盘放入光驱,打开光驱中名为“keil750AHK(3000TC)”的文件夹再打开 setup 文件夹,双击 setup 文件夹中“setup”文件即开始安装。单击“Full Version”.。如图所示:

点击 “Next” → “Yes” →”Next”,此时则须序列号 (序列号在光盘 keil750AHK(3000Tc)) 文件夹目录下的”sn” 文件中’ )输入序列号,其他四项输入任意字母。如图:
?3?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

点击“Next” →Next”开始安装,点击 Next” →Finish 即完成安装。

?4?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

三、USB 驱动的安装:
若使用的仿真器是 USB 接口的,则需要安装 USB 驱动。打开 KEIL 安装光盘中的“USB 驱动”文件夹打开 window 文件夹,双击“Window”文件夹中的“setup”开始安装。安装完成后会提示你重新启动计算机。重启后 完成安装。

四、KEIL 软件的操作说明:
硬件基础实验操作(以实验一 八段数码管显示实验为例) : 将 KEIL 仿真器上 40 芯排线一端和实验箱上 51CPU 板上的 40 芯排针连接起来, 将仿真器连接的 USB 或串口 线与 PC 机对应的 USB 或串口连接起来,打开实验箱电源。 进入 KEIL 软件界面,点击项目/打开项目

在 C:\KEIL\UV2\3000TC51 配套实验例程中选择实验一,内有 ASM 和 C51 两种程序,进入 ASM 文件夹打开 LED 项目文件

进入如图所示界面
?5?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

点击“调试/启动/停止调试” ,进入调试界面,点击“调试/运行”可看到 8 段数码管交替显示 0—F

新建一个项目文件:

首先进入 Keil 软件,点击工具栏“项目”选项中的“新项目” ,如图所示:

输入工程文件名称,并选则保存文件的目录(该目录位置任意,可新建文件夹),如图:

为项目文件选择一个目标器件(ATMEL89C51) ,如图所示:

点确定后会弹出一个对话框选择否.

?6?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

右键点击项目工作区的目标 1,再弹出的菜单中选择“为目标‘目标 1’选项”如图所示:

在“为目标‘目标 1’设置选项”中,点击“调试”菜单,在此菜单中可选择是使用硬件仿真,还是软件仿真, 连接实验箱做实验时选择硬件仿真,点击硬件仿真选项后面的[设置]选项,在此对对话框中选择串口和波特率, 串口根据所连电脑来决定。波特率为 38400。如图所示:

点击“文件/新建”创建程序文件并输入源程序并保存。如图所示:

?7?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

右键点击目标 1 下的“源代码组 1” →“添加文件到源代码组 1” 。文件类型改为“所有文件” ,把源程序添加 进去,如图所示:

文件类型的设置:源程序示 C 语言就在“类型”选择 C 语言,是汇编则选择“汇编语言文件”点击确定。如图:

点击“编译连接”图标,对项目文件进行编译。如图:

?8?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

若编译无误,则点击“调试” →“启动/停止调试”进入调试界面。如图:

在调试界面中的可以对程序进行单步或全速运行的调试。如图:

?9?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

? 产品简介
随着社会对人才素质要求的不断提高, 同时也随着国家对教育投入的不断加大, 向学生提供高性能的实验/ 开发设备成为必要和可能。根据“世行贷款高等教育项目”招标书中技术指标的要求,根据本公司对市场的调 研,参考了国外先进教育设备的设计方法,研制了超想-3000TC 综合实验/仿真系统。 超想—3000TC 综合实验/仿真系统全面支持 MCS51 系列的实验仿真。 0.1 系统组成 超想-3000TC 开放式综合实验/仿真系统由仿真器、综合实验仪、软件、电源组成。 传统的实验仪: 把仿真器和实验模块合二为一设计,实验模块作为仿真器的扩展部分,采用“单板式” 方式进行实验,这 使得仿真器仿真特性和实验方式真实性、灵活性都受到了限制。 我们知道单片机完整的开发过程为: 确立方案 → 制作硬件 → 调测软件 → 固化代码 →脱机运行。 很显 然,传统实验仪由于硬件的封闭性,是无法进行“确立方案” 、 “制作硬件” 、 “固化代码” 、 “脱机运行”的实验, 其实验步骤与实际环境有较大差别。 另外,由于实验模块作为仿真器的扩展部分,占用了仿真器的资源,其仿真特性也大打折扣,事实上无法 满足学生毕业设计、电子竞赛、教师科研所需。 超想-3000TC 综合实验仪: 超想-3000TC 综合实验仪摒弃了传统实验仪的“单板式”设计方法,而采用了符合单片机开发过程的“仿 真式”综合设计思想,使得所有的实验模块及 CPU 资源均全力对用户开放,从而充分满足“验证式”→“模仿 式”→“探索式”→“开发式”的由浅入深的各种实验要求。并且,实验平台作为一个独立的目标系统,能让 用户进行脱机验证实验结果的实验,从而,使实验步骤与实际开发环境完全一致,学以致用。同时,仿真工具 作为一个可独立使用的仿真器,从而,又可满足学生毕业设计、电子竞赛、教师科研所需。达到一机多用之目 的。 0.1.0 仿真器 由于超想-3000TC 综合实验/仿真系统的“仿真器”与“实验平台”可分离使用,故原则上可配备任何品牌 的仿真工具。由于本手册是围绕 Keil C 超级仿真器进行编写,所以,选用该产品成为最佳选择。 作为仿真工具时,仿真器可与实验仪完全脱离 0.1.1 综合实验仪 新型实用模块: (1)LCD 液晶实验 (2)点阵 LED 广告屏 (3)DS12887 实时时钟 (4)红外线发送、接收 2 (5)直流电机恒速 (6)电子琴模拟实验 (7)串行 ROM/I C ROM(8)步进电机变速 传感器实验: (1)温度传感器 (2)压力传感器 (3)霍尔传感器 (4)红外传感器 传统实验模块: (1)模数转换 A/D0809 (2)数模转换 D/A0832 (3)8155 控制键显 (4)V/F 转换 LM331(5)串口 通讯 MAX232 (6)音响实验 LM386 (7)EPROM27C256 扩展(8)RAM6264 扩展 (9)PWM 模块 (10)微型打印机接口(选配) 通用实验模块: (1)模拟信号发生器 (2)开关量发生器 (3)发光二极管组 (4)信号发生器 (5)74LS138 译码器 (6)分频器电路 (7)LED6 位数码管 (8)20 个键盘组 (9)逻辑笔 (10)常用门电路 自由实验模块: 由 DIP40 锁紧插座及 40 个插孔组成,CPU 所有信号均以插孔方式引出,还设计了常用门电路、晶振源、电 源插孔等,可以完成以上实验模块的组合实验以及由实验者自行命题和新器件、新方案的实验,使得实验方式
?10?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 和内容不受限制。 扩展实验内容: 利用自由实验区可进行以下扩展实验: (1)8279 键盘显示接口 (2)8255I/O 口扩展 (3)8253 可编程计数器 (4)8251 可编程通信接口 (5)8259 中断优先级管理器 (6)8237DMA 数据传送 (7)并行 I/O 口扩展实验 (8)AT89C51 最小系统 2 (9)I C 总线 24C01 (10)GAL16V8 实验 (11)AT89C2051 实验 (12)译码器实验 模块自检接口: “实验连线”对于学生理解实验内容的本质,提高动手能力的培养十分必要。然而,对实验室管理员而言, 却是工作量倍增。 试想, 若对所有设备的所有实验模块进行一次全面的检测, 将需连多少根线?工作量有多大? 很显然, “模块自检接口”的自检功能十分必要。本产品的自检监控能对所有模块进行检测,管理员仅需在键盘 上输入各自检程序的代码即可。 0.1.2 软件支持:Keil uVision2 平台。 Keil uVision2 是德国 Keil 公司(Keil Quel)的产品,早期曾以美国 Franklin 公司在美国发行出售。其 性能较其它同类产品优异,特别是兼容 ANS1 C 后,又增加了很多与硬件密切相关的编译特性,使得在 8051 系 列单片机上开发应用程序更为方便和快捷。 在 Keil uVision2 的平台下,用户源程序的大小不再有任何限制,支持 ASM、C、PLM 语言混合编程,源文 本调试,具有项目管理功能,为用户的资源共享,课题重组提供强有力的手段。丰富的显示方式,多方位、动 态地显示仿真的各个过程,使用极为便利。 为了跟上形势,现在工程师需要掌握不同的项目管理器、编辑器、编译器。它们由不同的厂家开发,相互 不兼容,使用不同的界面,学习使用很吃力。Keil uVision2 调试软件为你提供了一个全集成环境,统一的界 面包含一个项目管理器,一个功能强劲的编辑器,以及汇编和调试工具,并提供一个与第三方编译器的接口。 由于风格一致,从而大大节省时间和精力。 0.1.3 电源 超想-3000TC 综合实验仪配备了+5V/2A、+12V/1A、-12V/0.5A 的电源,直接使用 220V 交流电源工作。 0.2 实验内容 分成软件实验和硬件实验,软件实验是指初学者先熟悉软件的使用和学习程序的编写,进一步掌握编程方 法的实验;硬件实验是通过使用实验箱使用各种模块通过连线在软件上编程实现某种特定功能的实验。 各实验例程均提供 ASM 语言、C 语言两套程序清单。以上实验已充分涉及单片机的原理、接口、传感器、 自控原理等方面的内容。 0.3 实验方式 ? 外接仿真器方式: 用 PC 机连仿真器,再连实验仪进行仿真和实验。 ? 软件模拟的方式: 无实验仪、无仿真器,仅在 PC 机上采用模拟软件进行实验。 ? 仿真器独立方式: 用户自制目标板,利用仿真器进行仿真实验。 ? 自检测实验方式: 利用自检插口和自检监控可进行演示实验,简单可靠。 0.4 支持器件 ? 选配 51CPU 适配板可支持 MCS51 系列 CPU 的实验; ? 选配 88CPU 适配板可支持 INTEL 系列 CPU 的实验; ? 选配 Keil C 超级仿真器可支持以下 CPU 的仿真开发: INTEL 系列 8 位 CPU:8031/32/51/52、87C51/52、8751FA/FB/FC ATMEL 系列 8 位 CPU:89C51/52/54/55/2051/1051 LG 系列 8 位 CPU:97C51/52、97C54/56/58/2051/1051 华邦系列 CPU:78E51/54/58 SST 系列 8 位 CPU:89C58、89C51、89C52、89C59/2051/1051 Termic 系列:80C51、80C52、80C154、80C154D、89C51、89C52 Qallas 系列:QS83C520、QS87C520
?11?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

? 综合实验仪
传统的单片机实验仪,是把实验模块作为仿真器的一个部分进行一体化设计,即所谓的“单板式”设计方 法。其在实验过程中并不涉及“仿真状态” (或称工作模式)这个重要的概念,亦不能进行开发式实验,调试的 程序不能进行脱机运行。显然,这种实验仪的实验过程与实际的开发步骤存在较大的差距。另外,由于此类实 验仪的仿真器,大多为单 CPU 架构,其仿真 RAM 空间被实验模块占用,所以,其仿真性能也不适合作为仿真工 具所用。 超想-3000TC 综合实验仪采用“仿真式”设计方法,仿真器与实验平台分离,采用“仿真”方式进行实验, 同时,允许进行脱机运行工作,所以,实验过程是与实际开发过程完全一致。Keil C 超级仿真器可满足学生毕 业设计,参加电子竞争,教师科研所需。 超想-3000TC 综合实验仪可根据教学实践的需要实现 MCS51/8088 单片机、微机原理与接口实验,并在硬件 上预留了自主开发实验的空间。该实验仪对基本实验仅需少量连线就可进行,以减少学员工作量,同时也提供 了一些需较多连线的扩展性实验以进一步锻炼学员的动手能力。 模块自检接口: “实验连线”对于学生理解实验内容的本质,提高动手能力的培养十分必要。然而,对实验 室管理员而言, 却是工作量倍增。 试想, 若对所有设备的所有实验模块进行一次全面的检测, 将需连多少根线? 工作量有多大?很显然, “模块自检接口”的自检功能十分必要。本产品的自检监控能对所有模块进行检测,管 理员仅需在键盘上输入各自检程序的代码即可。 1.1 实验模块 超想-3000TC 综合实验仪有丰富的实验电路和灵活的组成方法。这些电路即可以和 51CPU 适配板(Keil C 超级仿真器)组合,以完成 MCS51 系列实验;也可和 8086CPU 适配板相连,以完成 8086 系列实验(此项为选配 件) 。为了描述清楚,在此作统一的介绍。 1.1.0 模拟信号发生器:电位器电路用于产生可变的模拟量。顺时钟旋转,电压值加大;反之,减小。 减小 加大

1.1.1 138 译码器 为了使得 MCS51、8086 兼容实验,所以 ROM、RAM 同 64K 空间统一分配地址,程序空间占用前 32K (0000—7FFFH) ,数据空间占用后 32K(8000H-0FFFFH) ,使用两片 74LS138 译码器对后 32K 空间进行译码。其中:

EPROM27C256: (0000H-7FFFH) YC0-YC1(8000H-9FFFH) :6264RAM
?12?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 YC7(0F000H-0FFFFH) :U17 号 74LS138 选通 YC6(0E000H-0EFFFH) :8155 YC2(0A000H-0AFFFH) :备用 YC3(0B000H-0BFFFH) :备用 YS7(0FE00H-0FFFFH) :DALLAS12887 YS6(0FC00H-0FDFFH) :自检时的点阵 LED YS5(0FA00H-0FBFFH) :LCD 液晶显示 YS4(0F800H-0F9FFH) :LCD 液晶显示 YS2(0F400H-0F5FFH) :LED 发光二极管 YS1(0F200H-0F3FFH) :自检时的 DA0832 YS0(0F000H-0F1FFH) :自检时的 AD0809 1.1.2 开关量发生器 实验平台上有 8 只拨动开关 K0-K7 及相应的驱动电路,以产生“1” 、 “0”的逻辑电平。开关向上拨相应插 孔输出高电平为“1” ,反之,输出低电平为“0” 。

向上:1

向下:0

1.1.3 信号发生器:由 U3 的 74LS04、U43 的 74LS00 组成,每按一次带锁开关即产生一个单脉冲。

1.1.4 发光二极管组 实验平台上有 8 只发光二极管,由 U33 的 74HC245 驱动,以显示电平状态。高电平“1” 点亮发光二极管。

高电平“1”点亮

?13?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 1.1.5 步进电机实验电路 超想-3000TC 综合实验仪选用的是四相步进电机,由 U25 的 74LS04 和 U21、U23 的 75452 驱动。

1.1.6 D/A0832 模块

1.1.7 音响实验:喇叭由 U16 的 LM386 驱动。

?14?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 1.1.8 AD0809 模块

1.1.9 RS232 通讯模块

TDI

1.1.10 PWM 模块

?15?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 1.1.11 分频器模块:由 74LS74 的一组锁存器组成二分频的分频器,另一组的引脚均以插孔方式引出。如把 2D 孔与 2/Q 孔相连还可产生另一个二分频的分频器。 1.1.12 EPROM27256 扩展模块

分频器模块 1.1.13 V/F 压频转换 1.1.14 RAM6264 扩展模块

EPROM27256 扩展模块

V/F 压频转换 1.1.15 8155 键显模块

RAM6264 扩展模块

?16?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 1.1.16 DALLAS12887 时钟模块

1.1.17 霍尔传感器 1.1.18 直流电机

霍尔传感器 1.1.19 122X32LCD 液晶显示模块

直流电机

1.1.20 点阵 LED 模块

?17?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 1.1.21 压力传感器

1.1.22

温度传感器

1.1.23 微型打印机接口

?18?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 1.1.24 逻辑笔电路 超想-3000TC 综合实验仪上有逻辑测量电路,用于测量各种电平,其中红灯亮表示高电平,绿灯亮表示低 电平。如果两灯同时闪动,表示有脉冲信号;两灯都亮时,表示浮空(高阻态) 。 1.1.25 复位电路

逻辑笔电路 1.1.26 红外线发送/接收

复位电路

1.1.27 LED 发光二极管总线驱动

1.2 常用逻辑门电路

?19?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 1.3 自由实验插座 超想-3000TC 综合实验仪设计了一个扩展实验板,以供自开发实验用,插座全部引脚都被引出到相应的插 孔,40 芯、32 芯、28 芯、24 芯、20 芯、16 芯、14 芯、8 芯通用,并按照各自的封装标明引脚号。利用这些插 座,可对双列直插式的各种微机芯片进行实验。
18● 20● 19 ● 21 ● 22● 23● 24● 25 ● 27 ● 29 ● 31 ● 33● 26 ● 28 ● 30 ● 32 ● 34● 35● 36● 37 ● 38 ● 17● 16 ● 14 ● 12 ● 10 ● 15 ● 13 ● 11 ● 9● 8● 7● 6● 5● 4● 3●


2● 1●

锁 紧 插 座

39 ● 40 ●

1.4 直流电源外引插座 黑色:地

红色:+5V

1.5 总线插孔:超想-3000TC 综合实验仪的所有总线及控制信号均以插孔方式引出,以便进行开放式实验。

88

1.6 空间分配
扩 展 模 块 27C256 6264 8155 LCD 液晶显示 DS12887 LED 二极管总线驱动 自检时 AD0809 自检时 DA0832 自检时点阵 LED 自检时微型打印机 备 用 备 用 资源分配(138 译码) 0000H-7FFFH (YC0,YC1)8000H-9FFFH (YC6)0E000H-0EFFFH (YS4-YS5)0F800H-0FBFFH (YS7)0FE00H-0FFFFH (YS2)0F400H-0F5FFH (YS0)0F000H-0F1FFH (YS1)0F200H-0F3FFH (YS6)0FC00H-0FDFFH YC2(0A000H-0AFFFH) (YC2)0A000H-0AFFFH (YC3)0B000H-0BFFFH

?20?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

第?节

? 实验例程
软 件 实 验 实验一 拆字程序实验

(MCS51)

一、实验目的:掌握汇编语言设计方法。 二、实验内容:把 8000H 地址上的内容拆开,高位送 8001H 地址的低位,低位送 8002H 地址的低位,8001H、 8002H 地址的高位清零.本程序通常在把数据送显示缓冲区时使用。 三、实验器材: 计算机 1台 四、实验步骤: 1、按流程图编写程序,以下是通过计算机交叉汇编得到的.LST 文件清单,供参考。 2、文件编译连接、装载,用鼠标点击[项目/重建所有目标文件],系统自动进行编译,并弹出信息窗口, 若有错误则重新修改再编译;若无错误,点击[调试/启动/停止调试]后进入调试状态。 3、设置观察窗口: (1)用鼠标点击[视图/存储器窗口],在地址栏中输入[0X8000]; (2)在 8000H 中写入 数据(任意) ; (3)单步执行观察寄存器和 8000H—8002H 的变化。 五、程序框图: 七、实验程序 (51asm\A8051.ASM) 8000H 内容送 A ;把指定字节的高低位拆开分别存放,多用于显示子程序 ORG 0000H MOV DPTR,#8000H ;指定的字节 高低位交换 屏蔽高位后送 8001H MOVX A,@DPTR MOV B,A ;暂存 SWAP A ;交换 8000 内容送 A ANL A,#0FH ;屏敝高位 INC DPTR MOVX @DPTR,A 屏蔽高位后送 8002H INC DPTR MOV A,B 结 束 ANL A,#0FH ;指定字节的内容屏敝高位 MOVX @DPTR,A LOOP: SJMP LOOP END

实验二

拼字程序实验

一、实验目的:1、进一步掌握汇编语言设计;2、熟悉软件调试方法。 二、实验内容:把 8000H、8001H 两个字节的低位分别送入 8002H 的高位和低位。本程序一般用于把显示缓冲 区数据取出拼装成一个字节。 三、实验器材:计算机 1台 四、实验步骤:1、编写程序并编译成机器代码。 2、用断点或单步方式运行程序,检查 8000H-8002H,A,B 中內容变化情况。查看内部 RAM、外部 RAM、断 点运行方式、单步操作等请参阅有关章节。 3、打开 AP6264.asm 程序 (1)文件、编译、连接、装载:点击[项目/重建所有目标文件],系统进行自动编译,并弹出信息窗口, 点击[调试/启动/停止调试]进入调试状态。 (2)用鼠标点击[视图/存储器窗口],在地址栏中输入[0X8000],将地址定位于 8000H。 (3)在 8000H 中写入任意数据,单步执行观察寄存器和数据存储区的变化。 五、程序框图: 六、思考问题:修改 8000H、8001H 内容重复上述实验。 七、实验程序: (51asm\Ap6264.ASM) ;把两字节的低位合拼成一个字节,多用于显示子程序 ?21?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 ORG 0000h MOV DPTR,#8000H 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 ;送 8002H 存放 LOOP: SJMP LOOP END

8000H 的内容送 A,屏蔽高位 交换高低位送 B 屏蔽高位后送 200H 8001H 的内容送 A,屏蔽高位

A 和 B 或后送 8002H 结 束

实验三

数据区传送子程序实验

一、实验目的:学习 Windows 平台下的编辑、编译、排错调试方法。 二、实验内容:把外部扩展 RAM(6264)的 8000H-807FH 中的内容传送到 8080H 开始的空间中去。R2.R3 存 放源 RAM 区首址,R6.R7 存放需传送的字节数,R4.R5 存放目的 RAM 区首址。 三、实验器材:计算机 1 台 四、程序框图: 开 始 五、实验程序: (51asm\AS6264.ASM) ;数据传送子程序 ORG 0000H 源地址内容送 A LOOP0: MOV DPL,R3 MOV DPH,R2 ;建立源程序首地址 A 送目的地址 MOVX A,@DPTR ;取数 MOV DPL,R5 源地址加 1 MOV DPH,R4 ;目标首地址 LOOP: MOVX @DPTR,A ;传送 CJNE R3,#0FFH,LOOPA 目地址加 1 INC R2 LOOPA: INC R3 ;源地址加 1 字节数到吗? CJNE R5,#0FFH,LOOP1 INC R4 LOOP1: INC R5 ;目地址加 1 结 束 CJNE R7,#00H,LOOP2 CJNE R6,#00H,LOOP3 LOOP4: SJMP LOOP4 LOOP2: DEC R7 ;字节数减 1 SJMP LOOP0 LOOP3: DEC R7 DEC R6 SJMP LOOP0 ;未完继续 END

实验四

数据排序实验

一、实验目的:1、学习 WINDOWS 平台下的编辑、编译、排错、调试方法。 2、学习修改和观察变量的方法;综合使用单步、断点调试的方法。 二、实验内容:编写并调试一个排序子程序,其功能为用冒泡法将内部 RAM 中几个单字节无符号正整数,按从 小到大的次序重新排列。
?22?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 三、实验器材:计算机 1台 四、实验步骤:1、参阅《硬件安装》把综合实验仪、仿真器与 PC 机串行口连起来,打开电源。 2、在 PC 机上用鼠标点击“KEIL uvision 2”图标,进入 KEIL 调试环境,选择串行口,点击“确认” 。 3、打开“项目/新建项目” ,输入项目名,选择目标 MCU,如:intel 89C52。 4、编辑文件:用鼠标点击[文件|新文件],在文本编辑器中输入以下程序: ORG 0000H MOV R3,#50H LOOP0: MOV A,R3 MOV R0,A ;指针送 R0 MOV R7#0AH ;长度送 R7 CLR 00H ;标志位为 0 MOV A,@R0 LOOP1: INC R0 MOV R2,A CLR C MOV 22H,@R0 CJNE A,22H,LOOP2 ;相等吗? SETB C LOOP2: MOV A,R2 JC LOOP3 ;小于或等于不交换 SETB 00H XCH A,@R0 DEC R0 XCH A,@R0 INC R0 ;大于交换位置 LOOP3: MOV A,@R0 DJNZ R7,LOOP1 JB 00H,LOOP0 ;一次循环中有交换继续 LOOP: SJMP LOOP ;无交换退出 END 5、文件保存:用鼠标点击[文件|保存],在对话框中输入文件名。 6、为项目添加文件:单击左边的[项目工作区/源代码组 1]右键在出现菜单中选择[添加文件到组“源代码 组 1”],在弹出的对话框中选中您刚保存的文件,点击确认完成项目文件的添加。 7、为项目设置通讯口:单击左边的[项目工作区/目标 1]右键在出现的菜单中选择[为目标“目标 1”设置 选项],在弹出的菜单中选择[调试]。在新窗口中选择使用 Keil monitor-51 Driver。单击设置在出现的窗口 中设置串口和波特率(注:波特率必须为 38400) 。 8、文件编译、连接、装载:用鼠标点击[项目/重建所有目标文件],系统自动进行编译,并出现信息窗口。 若有语法错误,则需重新修正,需再次执行重建所有目标文件;若无语法错误,点击[调试/启动/停止调试]后, 进入调试状态。 9、设置观察窗口:用鼠标点击[视图/存储口窗口],在地址口输入 CPU 内部存贮区地址,回车之后出现地 址为 50H 的数据显示于窗口中。 10、单步执行程序:按 F11 键一条一条地执行下去,注意观察左边寄存器区中相应的寄存器或者 CPU 内部 存贮区中相应的数据寄存器单元的数据变化。 11、连续运行:用鼠标点击[外围设备/复位 CPU],使 PC 指向 0000H,点击[调试/运行]后,程序开始连续 运行。如需暂停,用鼠标点击[调试/停止运行]。 12、断点运行:要使程序执行到某条指令处暂停,如希望程序执行到 LOOP1 处暂停,可按如下操作:将光 标移到 LOOP1 处双击鼠标左键,即可设置断点,用鼠标点击[调试/运行],程序将在 LOOP 行停止运行。 13、复位:用鼠标点击[外围设备/复位 CPU],强迫 PC 指向 0000H。 五、实验框图: 六、思考问题:编一程序把 50H-5AH 中内容按从大到小排列。 七、实验程序: (51asm\APX.ASM) ;用冒泡法进行数据排序 ?23?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 ORG 0000H MOV R3,#50H LOOP0: MOV A,R3 MOV R0,A ;指针送 R0 MOV R7,#0AH ;长度送 R7 CLR 00H ;标志位为 0 MOV A,@R0 LOOP1: INC R0 MOV R2,A CLR C MOV 22H,@R0 CJNE A,22H,LOOP2 ;相等吗? SETB C LOOP2: MOV A,R2 JC LOOP3 ;小于或等于不交换 SETB 00H XCH A,@R0 DEC R0 XCH A,@R0 INC R0 ;大于交换位置 LOOP3: MOV A,@R0 DJNZ R7,LOOP1 JB 00H,LOOP0 ;一次循环中有交换继续 LOOP: SJMP LOOP ;无交换退出 END 开 始

清标志位

根据(R0)取数→A

(R0)+1 送 R0 Y (A)<( (R0) )? N 置标志位,交换内容 N

长度减 1=0? N 标志位=0? Y 结 Y 束

N

实验五

清零程序实验(模拟调试方法)

一、实验目的:学习 Windows 软件的调试方法 二、实验内容:把外部 RAM 的 2000-20FFH RAM 空间置零 三、实验器材:计算机 1 台 四、准备工作:时至今日,软件模拟功能已被作为评判仿真器性能高低的标准之一。作为初学者来说可在无仿 真器的情况下,即开始实验。作为实验室来说,为达到一机多用之目的提供了条件。而对于开发者而言,不仅 可在无仿真器的情况下,即开始编程调试,而且,在查找问题时,可为判断是软件问题还是硬件故障提供捷径。 KEILC 超级仿真器软件平台提供了强劲软件模拟功能,它可以模拟包括 MCS51 5 个中断源在内的所有 CPU 资源。以下例子以 Windows 平台为调试环境。KEIL 软件仿真设置请参阅 KEIL 帮助。 五、程序框图: 开 始 六、思考问题:修改程序把 4000H-5000H 中内容置 55H。 七、实验程序: (51asm\Aclear0.ASM) 外部 RAM 首地#2000H→DPTR ORG 000H MOV R0,#00H MOV DPTR,#2000H ;空间首地址送 DPTR 00H 送 A LOOP: mov a,#00h MOVX @DPTR,A ;清零 A→@DPTR INC DPTR ;DPTR 加 1 INC R0 ;字节数加 1 N CJNE R0,#00H,LOOP ;连续清 256 个字节 DPTR=#20FFH LOOP1:SJMP LOOP1 Y END 结 束
?24?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

第?节
硬 件 基 础 性 实 验 实验一 八段数码管显示实验

一、实验目的:1、了解数码管动态显示的原理。 2、了解 74LS164 扩展端口的方法。 二、实验要求:利用实验仪提供的显示电路,动态显示一行数据。 三、实验线路:这里只是显示草图,详细原理参见第一章的 1.1.15 “8155 键显模块”。

四、实验器材: 1、超想-3000TC 综合实验仪 1 台 2、KEIL 仿真器 1 台 3、计算机 1 台 五、实验说明: 1、本实验仪提供了 8 段码数码管 LED 显示电路,学生只要按地址输出相应数据,就可以实现对显示器的控制。 显示共有 6 位,采用动态方式显示。8 段数码管是由 8155 的 PB0、PB1 经 74LS164“串转并”后输出得到。6 位位码 由 8155 的 PA0 口输出,经 uA2003 反向驱动后,选择相应显示位。 74LS164 是串行输入并行输出转换电路,串行输入的数据位由 8155 的 PB0 控制,时钟位由 8155 的 PB1 控制输 出。 写程序时, 只要向数据位地址输出数据, 然后向时钟位地址输出一高一低两个电平就可以将数据位移到 74LS164 中,向显示位选通地址输出高电平就可以点亮相应的显示位。 本实验仪中数据位输出地址为 0e102H,时钟位输出地址为 0e102H,位选通输出地址为 0e101H。本实验涉 及到了 8155 I0/RAM 扩展芯片的工作原理以及 74LS164 器件的工作原理。 2、七段数码管的字型代码表如下表:
显示字形 0 1 2 3 4 5 6 7 8 9 A B C D E F g 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 f 1 0 0 0 1 1 1 0 1 1 1 1 1 0 1 1 e 1 0 1 0 0 0 1 0 1 0 1 1 1 1 1 1 d 1 0 1 1 0 1 1 0 1 1 0 1 1 1 1 0 c 1 1 0 1 1 1 1 1 1 1 1 1 0 1 0 0 b 1 1 1 1 1 0 0 1 1 1 1 0 0 1 0 0 a 1 0 1 1 0 1 1 1 1 1 1 0 1 0 1 1 段码 3fh 06h 5bh 4fh 66h 6dh 7dh 07h 7fh 6fh 77h 7ch 39h 5eh 79h 71h

a f g e d 。dp c b

?25?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 六、程序框图: 开始

初始化显示参数 关所有位显示

输出位选通信号 延时

取显示数据 数据移位输出到 164

位选通信号移位

指向下一个显示数据 否 是

输出时钟脉冲到 164 否 8 段码完成

6 位完成 是

返回 七、实验步骤: 1、将 KEIL 仿真器上 40 芯排线一端和实验箱上 51CPU 板上的 40 芯排针连接起来,将仿真器连接的 USB 或 串口线与 PC 机对应的 USB 或串口连接起来,打开实验箱电源。 2、进入 KEIL 软件界面,点击项目/打开项目

在 C:\KEIL\UV2\3000TC51 配套实验例程中选择实验一,内有 ASM 和 C51 两种程序,进入 ASM 文件夹打开 LED 项目文件

进入如图所示界面

点击“调试/启动/停止调试” ,进入调试界面,点击“调试/运行”可看到 8 段数码管交替显示 0—F

八、实验程序: OUTBIT equ 0e101h CLK164 equ 0e102h DAT164 equ 0e102h IN equ 0e103h LEDBuf equ 60h

; ; ; ;

位控制口 段控制口(接 164 时钟位) 段控制口(接 164 数据位) 键盘读入口 ; 显示缓冲
?26?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 Num DelayT equ equ org ljmp 70h 75h 0000h Start ; 显示的数据 ;

LEDMAP:

; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序 mov r7, #0 DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop ret DisplayLED: mov r0, #LEDBuf mov r1, #6 ; 共 6 个八段管 mov r2, #00100000b ; 从左边开始显示 Loop: mov dptr, #OUTBIT mov a, #00h movx @dptr, a ; 关所有八段管 mov a, @r0 mov B, #8 ; 送 164 DLP: rlc a mov r3, a mov acc.0, c ANL A, #0FDH mov dptr, #DAT164 movx @dptr, a mov dptr, #CLK164 orl a,#02h movx @dptr, a anl a,#0fDh movx @dptr, a mov a, r3 djnz B, DLP 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, #0 movx @dptr, a ; 关所有八段管 ret Start: mov dptr,#0e100h mov a,#03h movx @dptr,a mov sp, #40h mov Num, #0 ?27?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 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 cjne r0, #LEDBuf+6, FillBuf mov DelayT,#30 DispAgain: call DisplayLED ; 显示 djnz DelayT,DispAgain ljmp MLoop END

实验二

键盘扫描显示实验

一、实验目的:1、掌握键盘和显示器的接口方法和编程方法。 2、掌握键盘扫描和 LED 八段数码管显示器的工作原理。 二、实验要求:在上一个实验的基础上,利用实验仪提供的键盘扫描电路和显示电路,做一个扫描键盘和数码显 示实验,把按键输入的键码在六位数码管上显示出来。 实验程序可分成三个模块。 1、键输入模块:扫描键盘、读取一次键盘并将键值存入键值缓冲单元。 2、显示模块:将显示单元的内容在显示器上动态显示。 3、主程序:调用键输入模块和显示模块。 三、实验器材:1、超想-3000TC 综合实验仪 1 台 2、KEIL 仿真器 1 台 3、计算机 1 台 四、实验电路:这里只是键盘草图,详细原理参见“8155 键显模块”。

行码 (0e103H)

列码 (0e101H)

五、实验说明: 本实验仪提供了一个 6?4 的小键盘,向列扫描码地址(0e101H)逐列输出低电平,然后从行码地址(0e103H) 读回, 如果有键按下,则相应行的值应为低,如果无键按下,由于上拉的作用,行码为高.这样就可以通过输出的列 码和读取的行码来判断按下的是什么键。在判断有键按下后,要有一定的延时,防止键盘抖动。列扫描码还可以 分时用作 LED 的位选通信号。 六、实验框图: ?28?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 开始 显示缓冲区初始化 LED 显示 输出列扫描信号 否 有键输入? 是 读取键值 是 键值转换为显示数据 主程序框图 按照行列计算键值 该列有键输入? 否 否 查表得键码 6 列扫描完? 读入行信号 列扫描信号移位 初始化地址参数

等待键盘释放 S 待按键释放

返回 读键输入子程序框图 显示程序框图见上个实验 七、实验程序: ;键盘扫描实验 OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) IN equ 0e103h ; 键盘读入口 ORG 0000H LJMP STAR ;========================================================================== KEY1: MOV 13H,#06H MOV 12H,#20H KEY2: MOV A,12H CPL A MOV R7,A MOV DPTR,#0E101H MOV A,R7 MOVX @DPTR,A MOV A,12H CLR C RRC A MOV 12H,A MOV DPTR,#0E103H MOVX A,@DPTR MOV R7,A
?29?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 MOV A,R7 CPL A MOV R7,A MOV A,R7 ANL A,#0FH MOV 14H,A DEC 13H MOV R7,13H MOV A,R7 JZ KEYDIS MOV A,14H JZ KEY2 KEYDIS: MOV A,14H JZ TESTKEY5 MOV A,13H ADD A,ACC ADD A,ACC MOV 13H,A MOV A,14H JNB ACC.1,TESTKEY INC 13H SJMP TESTKEY2 ;;================================================= ;键盘扫描 TESTKEY: MOV A,14H JNB ACC.2,TESTKEY1 INC 13H INC 13H SJMP TESTKEY2 TESTKEY1: MOV A,14H JNB ACC.3,TESTKEY2 MOV A,#03H ADD A,13H MOV 13H,A TESTKEY2: MOV DPTR,#0E101H CLR A MOVX @DPTR,A TESTKEY3: MOV R7,#0AH LCALL MLOOP LCALL MLOOP4 MOV A,R7 JNZ TESTKEY3 MOV R7,13H MOV A,R7 MOV DPTR,#0134H MOVC A,@A+DPTR MOV R7,A RET ;========================================================================== TESTKEY4: DB 22H ;" ;========================================================================== TESTKEY5: MOV R7,#0FFH ?30?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 RET ;========================================================================== GETKEY: MOV 10H,#20H MOV 0EH,#00H GETKEY1: MOV A,0EH CLR C SUBB A,#06H JNC GOON2 MOV DPTR,#0E101H CLR A MOVX @DPTR,A MOV R7,0EH MOV A,#08H ADD A,R7 MOV R0,A MOV A,@R0 MOV R7,A MOV 11H,R7 MOV 0FH,#00H GETKEY2: MOV A,0FH CLR C SUBB A,#08H JNC GOON1 MOV A,11H JNB ACC.7,KLOOP MOV DPTR,#0E102H MOV A,#01H MOVX @DPTR,A SJMP KLOOP1 ;;========================================== KLOOP: MOV DPTR,#0E102H CLR A MOVX @DPTR,A KLOOP1: MOV DPTR,#0E102H MOVX A,@DPTR MOV R7,A MOV A,R7 ORL A,#02H MOV R7,A MOV A,R7 MOVX @DPTR,A MOV DPTR,#0E102H MOVX A,@DPTR MOV R7,A MOV A,R7 ANL A,#0FDH MOV R7,A MOV A,R7 MOVX @DPTR,A MOV A,11H ADD A,ACC MOV 11H,A ?31?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 INC 0FH SJMP GETKEY2 GOON1: MOV DPTR,#0E101H MOV A,10H MOVX @DPTR,A MOV R7,#01H LCALL MLOOP MOV A,10H CLR C RRC A MOV 10H,A INC 0EH SJMP GETKEY1 GOON2: RET ;========================================================================== WAIT: MOV DPTR,#0E100H MOV A,#03H MOVX @DPTR,A MOV 08H,#0FFH MOV 09H,#0FFH MOV 0AH,#0FFH MOV 0BH,#0FFH MOV 0CH,#00H MOV 0DH,#00H WAIT1: LCALL GETKEY LCALL MLOOP4 MOV A,R7 JZ WAIT1 LCALL KEY1 MOV R6,#00H MOV R6,#00H MOV A,R7 ANL A,#0FH MOV R7,A MOV A,#24H ADD A,R7 MOV DPL,A MOV A,#01H ADDC A,R6 MOV DPH,A CLR A MOVC A,@A+DPTR MOV R7,A MOV 0DH,R7 SJMP WAIT1 RET ;========================================================================== TAB: Q0124: DB 3FH, 06H, 5BH, 4FH, 66H, 6DH, 7DH, 07H ;?.[Ofm}. Q012C: DB 7FH, 6FH, 77H, 7CH, 39H, 5EH, 79H, 71H ;?ow|9^yq Q0134: DB 00H, 01H, 04H, 07H, 0FH, 02H, 05H, 08H ;........ Q013C: DB 0EH, 03H, 06H, 09H, 0DH, 0CH, 0BH, 0AH ;........ ?32?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 Q0144: DB 10H, 11H, 12H, 13H, 14H, 15H, 16H ;....... ;========================================================================== MLOOP: MOV 15H,R7 MLOOP1: MOV R7,15H DEC 15H MOV A,R7 JZ MLOOP3 MOV 16H,#64H MLOOP2: MOV A,16H JZ MLOOP1 DEC 16H SJMP MLOOP2 SJMP MLOOP1 MLOOP3: RET ;========================================================================== MLOOP4: MOV DPTR,#0E101H CLR A MOVX @DPTR,A MOV DPTR,#0E103H MOVX A,@DPTR MOV R7,A MOV A,R7 CPL A MOV R7,A MOV A,R7 ANL A,#0FH MOV R7,A RET ;========================================================================== STAR: MOV R0,#7FH CLR A STAR1: MOV @R0,A DJNZ R0,STAR1 MOV SP,#16H LJMP WAIT END ;==================================================================

实验三

脉冲计数(定时/计数器的记数功能实验)

一、实验目的:1、熟悉 8031 定时/计数器的记数功能;2、掌握初始化编程方法;3、掌握中断程序的调试方法。 二、实验内容:定时/记数器 0 对外部输入的脉冲进行计数,并送显示器显示。 三、实验器材: 1、超想-3000TC 综合实验仪 1 台 2、KEIL 仿真器 1 台 3、连线 若干 根 4、计算机 1 台 四、实验原理: MCS-51 有两个 16 位的定时/计数器:T0 和 T1。计数和定时实质上都是对脉冲信号进行计数,只不过脉冲 源不同而已。当工作在定时方式时,计数脉冲来自单片机的内部,每个机器周期使计数器加 1,由于计数脉冲 的频率是固定的(即每个脉冲为 1 个机器周期的时间) ,故可通过设定计数值来实现定时功能。当工作在计数方 式时,计数脉冲来自单片机的引脚,每当引脚上出现一个由 1 到 0 的电平变化时,计数器的值加 1,从而实现 计数功能。可以通过编程来指定时计数器的功能,以及它的工作方式。读取计数器的当前值时,应读 3 次。这 ?33?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 样可以避免在第一次读完后,第二次读之前,由于低位溢出向高位进位时的错误。 五、接线图案: 接线方案 1 接线方案 2

六、程序框图:
开 始

0 送 R4R5R6,10H→R7

0 送 CY 堆栈、定时/计数初始化 R2R3 右移一位 开定时器 2*(R4R5R6)+CY 送 R4R5R6 取出 TL0/TH0 内容转换 (R7-1)=0 显 示 结 束

主程序流程 图

二转十进制子程序

七、实验步骤:用连线把“系统资源区”的 P3.4 孔连“脉冲源”的“DOWN”孔 ,执行程序,按动 AN 锁按钮, 观察数码管上计数脉冲的个数。 八、思考问题:把 P3.4 孔分别与“脉冲源”的 2MHZ、1MHZ、0.5MHZ 孔相连时,显示值反而比连 0.25MHZ 孔更 慢,为什么?当 fosc=6MHZ 时,能够计数的脉冲信号最高频率为多少? 九、实验程序: ;对定时器 0 外部输入的脉冲信号进行计数且显示 OUTBIT equ 0e101h CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) LEDBuf equ 40h IN equ 0e103h ORG 0000h MOV SP,#60H MOV DPTR,#0e100H ;8155 初始化 MOV A,#03H MOVX @DPTR,A MOV TMOD,#05H ;定时器初始化 MOV TH0,#00H MOV TL0,#00H
?34?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 LOOP0: SETB TR0 MOV R2,TH0 MOV R3,TL0 LCALL LOOP1 MOV R0,#40H MOV A,R6 LCALL PTDS MOV A,R5 LCALL PTDS MOV A,R4 LCALL PTDS LCALL DISPLAY SJMP LOOP0 CLR A MOV R4,A MOV R5,A MOV R6,A MOV R7,#10H CLR C MOV A,R3 RLC A MOV R3,A MOV A,R2 RLC A MOV R2,A MOV A,R6 ADDC A,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 MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A ANL A,#0FH MOV @R0,A INC R0 RET r7, #0 r7, DelayLoop r6, DelayLoop 0d3h r0, #LEDBuf r1, #6

LOOP1:

;二转十子程序

LOOP2:

PTDS:

;拆字子程序

PTDS1:

Delay: mov DelayLoop: djnz djnz ret DISPLAY:setb mov mov ; 延时子程序

; 共 6 个八段管
?35?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov Loop: mov dptr, #OUTBIT mov a, #00h movx @dptr, a mov a, @r0 mov dptr,#LEDmap movc a,@a+dptr mov B, #8 DLP: rlc a mov r3, a mov acc.0, c anl a,#0fdh mov dptr, #DAT164 movx @dptr, a mov dptr, #CLK164 orl a,#02h movx @dptr, a anl a,#0fDh movx @dptr, a mov a, r3 djnz B, DLP mov dptr, #OUTBIT mov a, r2 movx @dptr, a mov r6, #1 call Delay mov a, r2 rl a mov r2, a inc r0 djnz r1, Loop mov dptr, #OUTBIT mov a, #0 movx @dptr, a clr 0d3h ret r2, #00000001b ; 从左边开始显示

; 关所有八段管

; 送 164

; 显示一位八段管

; 显示下一位

; 关所有八段管

LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h END

实验四

A/D 转换实验

一、实验目的:掌握 A/D 转换与单片机接口的方法;了解 A/D 芯片 0809 转换性能及编程方法。 二、实验内容:利用综合实验仪上的 0809 做 A/D 转换器,综合实验仪上的电位器提供模拟量输入,编制程序, 将模拟量转换成数字量,通过 8155 键显区数码管显示出来。 三、实验器材:1、超想-3000TC 综合实验仪 1 台 2、KEIL 仿真器 1 台 3、连线 若干 根 4、计算机 1 台 四、实验原理: A/D 转换器的功能主要是将输入的模拟信号转换成数字信号,如电压、电流、温度测量等都属于这种转换。 本实验中采用的转换器为 ADC0809,它是一个 8 位逐次逼近型 A/D 转换器,可以对 8 个模拟量进行转换,转换
?36?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 时间为 100μ S。其工作过程如下:首先由地址锁存信号 ALE 的上升沿将引脚 ADDA、ADDB 和 ADDC 上的信号锁存 到地址寄存器内,用以选择模拟量输入通道;START 信号的下降沿启动 A/D 转换器开始工作;当转换结束时, AD0809 使 EOC 引脚由低电平变成高电平,程序可以通过查询的方式读取转换结果,也可以通过中断方式读取结 果。CLOCK 为转换时钟输入端,频率为 100KHz-1.2MHz,推荐值为 640KHz。 五、程序框图: 0809 初始化 开 始

0809.0 通道采样

显示

六、实验步骤: 1、设定仿真模式为程序空间在仿真器上,数据空间在用户板上,即点击[设置]下的[仿真模式],在 RAM 区选中用户 RAM, ROM 区选中系统 ROM (注: 本书中的实验除另行说明外, 均与此相同) 。 把 AD0809 的零通道 09IN0 孔用连线接至模拟信号发生器的 VIN 孔,AD0809 的片选信号 CS09 孔接“译码器”YC2(0A000-0AFFFH)孔, “脉 冲源”中的 0.5MHZ 孔连 AD0809 的 CLOCK 孔。 2、编写程序,并编译通过。本程序使用查询的方式读取转换结果。在读取转换结果的指令后设置断点,运 行程序,在断点处检查并读出 A/D 转换结果,数据是否与 VIN 相对应。修改程序中错误,使显示值随 VIN 变化 而变化。 七、接线图案:

八、思考问题:1、试编写循环采集 8 路模拟量输入 A/D 转换程序;2、以十进制方式显示。 九、实验程序: OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) IN equ 0e103h ; 键盘读入口 LEDBuf equ 40h ; 显示缓冲 ?37?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 org 0000h mov sp,#60h mov dptr,#0e100h ;8155 初始化 mov a,#03h movx @dptr,a mov 40h,#00h ;显示缓冲器初始化 mov 41h,#08h mov 42h,#00h mov 43h,#09h mov 44h,#00h mov 45h,#00h LOOP1: MOV R7,#40 VI: lcall DISPLAY DJNZ R7,VI mov a,#00h mov dptr,#0a000h ;0809AD 的通道开始转换吗? movx @dptr,a mov r7,#0fh loop2: djnz r7,loop2 movx a,@dptr mov r0,#45h ;拆字 lcall ptds sjmp loop1 ptds: mov r1,a lcall ptds1 mov a,r1 swap a ptds1: anl a,#0fh mov @r0,a dec r0 ret Delay: mov r7, #0 ; 延时子程序 DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop ret DISPLAY: setb 0d3h mov r0, #LEDBuf mov r1, #6 ; 共 6 个八段管 mov r2, #00100000b ; 从左边开始显示 Loop: mov dptr, #OUTBIT mov a, #00h movx @dptr, a ; 关所有八段管 mov a, @r0 mov dptr,#LEDmap movc a,@a+dptr mov B, #8 ; 送 164 DLP: rlc a mov r3, a ?38?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov acc.0, c anl a,#0fdh mov dptr, #DAT164 movx @dptr, a mov dptr, #CLK164 orl a,#02h movx @dptr, a anl a,#0fDh movx @dptr, a mov a, r3 djnz B, DLP 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, #0 movx @dptr, a clr 0d3h ; 关所有八段管 ret LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h END

实验五

D/A0832 转换实验

一、实验目的:了解 D/A 转换与单片机的接口方法;了解 D/A 转换芯片 DA0832 的性能及编程方法。 二、实验内容: 利用 0832 输出一个从 0V 开始逐渐升至 5V 再降至 0V 的三角波电压,数码管显示数字量值。 三、实验器材: 1、超想-3000TC 综合实验仪 1 台 2、KEIL 仿真器 1 台 3、连线 若干 根 4、计算机 1 台 四、接线图案:

?39?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 五、程序框图: 0832 初始化 显 示 转换显示加 1 输入是否到 FF? N

输入显示减 1 Y N 输入是否到 00? Y 六、实验原理: D/A 转换器的功能主要是将输入的数字量转换成模拟量输出,在语音合成等方面得到了广泛的应用。本实 验中采用的转换器为 DAC0832,该芯片为电流输出型 8 位 D/A 转换器,输入设有两级缓冲锁存器,因此可同时 输出多路模拟量。本实验中采用单级缓冲连接方式,用 0832 来产生三角波,具体线路如上图所示。VREF 引脚 的电压极性和大小决定了输出电压的极性与幅度,超想-3000TC 综合实验仪上的 DA0832 的第 8 引脚(VREF)的 电压已接为-5V,所以输出电压值的幅度为 0-5V。 七、实验步骤:1、设定仿真模式为程序空间在仿真器上,数据空间在用户板上。把 DA0832 的片选 CS32 孔接 至 YC3(0B000H-0BFFFH)孔。 2、编写程序、编译程序:用单步、断点、连续方式调试程序,排除软件错误。运行程序,8155 键显区数 码管上显示不断加大或减小的数字量,用万用表测量 D/A 输出孔 AOUT,应能测出不断加大或减小的电压值。 八、思考问题: 修改程序,使能产生锯齿波。 九、实验程序: OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) IN equ 0e103h ; 键盘读入口 LEDBuf equ 40h ; 显示缓冲 org 0000h mov sp,#60h mov dptr,#0e100h ;8155 初始化 mov a,#03h movx @dptr,a mov 40h,#00h ;显示缓冲区置值 mov 41h,#08h mov 42h,#03h mov 43h,#02h loop1: mov r5,#00h loop2: mov dptr,#0B000h ;0832DA 从小到大转换 mov a,r5 movx @dptr,a mov r0,#45h mov 45h,a ;拆字后送显示缓冲区 acall ptds mov r6,#15h dir10: acall display ;调用显示子程序 djnz r6,dir10
?40?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 inc r5 cjne r5,#00h,loop2 loop3: mov dptr,#0B000h dec r5 mov a,r5 movx @dptr,a mov r0,#45h acall ptds mov r6,#15h dir11: acall display djnz r6,dir11 cjne r5,#00h,loop3 sjmp loop1 Delay: mov r7, #00 mov r3,#00 DelayLoop: djnz r3, DelayLoop djnz r7, DelayLoop djnz r6, DelayLoop ret DISPLAY: setb 0d3h mov r0, #LEDBuf mov r1, #6 mov r2, #00100000b Loop: mov dptr, #OUTBIT mov a, #00h movx @dptr, a mov a, @r0 mov dptr,#LEDmap movc a,@a+dptr mov B, #8 DLP: rlc a mov r3, a mov acc.0, c anl a,#0fdh mov dptr, #DAT164 movx @dptr, a mov dptr, #CLK164 orl a,#03h movx @dptr, a anl a,#0fDh movx @dptr, a mov a, r3 djnz B, DLP mov dptr, #OUTBIT mov a, r2 movx @dptr, a mov r6, #01 call Delay mov a, r2 rr a mov r2, a inc r0

;0832DA 从大到小转换

; 延时子程序

; 共 6 个八段管 ; 从左边开始显示

; 关所有八段管

; 送 164

; 显示一位八段管

; 显示下一位

?41?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 djnz mov mov movx clr ret r1, Loop dptr, #OUTBIT a, #0 @dptr, a 0d3h

; 关所有八段管

LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h ptds: mov r1,a acall ptds1 mov a,r1 swap a ptds1: anl a,#0fh mov @r0,a dec r0 ret Delay1: mov r7,#03h sjmp DelayLoop END

实验六

电 子 琴 实 验

一、实验目的:了解发出不同音调声音的编程方法。 二、实验内容:利用实验仪上提供的键盘,使数字键 1、2、3、4、5、6、7 作为电子琴按键,按下即发出相应 的音调。用 P1.0 口发出音频脉冲,驱动喇叭.。 三、实验原理:我们知道,声音是由振动产生的,每个音符都对应了一个频率如下表所示。利用定时/计数器 T0 工 作在 16 位定时方式,通过改变 TH0 和 TL0 的值,就可以产生不同频率的脉冲,例如想产生 523Hz(音符 1 的发音) 的脉冲,其周期为 1/523=1912μ S,因此只要让 T0 定时 956μ S 后,使 P1.0 取反,就可以在 P1.0 引脚上输出一个 频率为 523Hz 的脉冲。 若晶振的频率为 6MHz, 则计数值为 956/2=478, 而计数器的初值为 65536-478=65058=OFF22H, 即 THO=OFFH,TLO=22H。这样每个音符都对应了一个 T 值,6M 晶振时各音符的 T 值如下表: 音符频率以及 6M 晶体时对应的 T 值表 音符 1 . 2 . 3 . 4 . 5 . 6 . 频率 262 294 330 349 392 440 T值 64582 64685 64778 64819 64898 64968 音符 1 2 3 4 5 6 频率 523 578 659 698 784 880 T值 65058 65110 65156 65178 65217 65252

7 494 65030 7 988 65283 . 另一方面是每个音符的发音长度,各调节拍与时间的设定如下表所示: 调值与节拍延时时间关系表 曲调值 调 4/4 调 3/4 调 2/4 1/4 拍时间 125ms 187ms 250ms 1/8 拍时间 62ms 94ms 125ms 2、KEIL 仿真器 4、计算机 1台 1 台

四、实验器材:1、超想-3000TC 综合实验仪 1台 3、连线 若干 根 五、接线图案:
?42?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

六、实验步骤: 把 P1.0 用连线连至“音响与合成”框 LM386 的 VIN1 插孔上。 七、实验程序: ;连线 P1.0---VIN1 OUTBIT equ 0e101h IN equ 0e103h Pulse equ 0 PulseCNT equ 50h ToneHigh equ 51h ToneLow equ 52h LJMP STAR ;========================================================================== MIAN: DB 00H, 00H, 00H, 00H, 00H, 00H, 00H, 00H ;........ MIAN1: DB 02H, 00H,0D0H ;... ;========================================================================== INTS1: MOV DPTR,#0E100H MOV A,#03H MOVX @DPTR,A MOV TMOD,#01H MOV IE,#82H INTS2: MOV A,#0FFH JZ INTS2 LCALL KEY1 MOV R4,07H MOV A,R4 CLR C SUBB A,#01H JC INTS2 MOV A,R4 SETB C SUBB A,#07H JNC INTS2 MOV A,R4 ADD A,ACC ADD A,#0C0H MOV DPL,A CLR A ADDC A,#00H MOV DPH,A CLR A MOVC A,@A+DPTR MOV R2,A MOV A,#01H MOVC A,@A+DPTR MOV R3,A MOV A,R2 MOV 09H,A MOV 08H,#00H MOV 0AH,#00H MOV 0BH,R3 MOV TH0,A MOV TL0,0BH SETB TR0
?43?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 MOV 0CH,#0C8H MOV A,0CH JNZ KEY CLR TR0 SJMP INTS2 KEY1: MOV R7,#06H MOV R6,#20H KEY2: MOV A,R6 CPL A MOV DPTR,#0E101H MOVX @DPTR,A MOV A,R6 CLR C RRC A MOV R6,A MOV DPTR,#0E103H MOVX A,@DPTR CPL A ANL A,#0FH MOV R5,A DEC R7 MOV A,R7 JZ KEY3 MOV A,R5 JZ KEY2 KEY3: MOV A,R5 JZ TONE3 MOV A,R7 ADD A,ACC ADD A,ACC MOV R7,A MOV A,R5 JNB ACC.1,TONE INC R7 SJMP TONE2 ;========================== TONE: MOV A,R5 JNB ACC.2,TONE1 INC R7 INC R7 SJMP TONE2 TONE1: MOV A,R5 JNB ACC.3,TONE2 INC R7 INC R7 INC R7 TONE2: MOV DPTR,#0E101H CLR A MOVX @DPTR,A MOV A,R7 MOV DPTR,#00AAH MOVC A,@A+DPTR MOV R7,A RET ;========================================================================== TONE3: MOV R7,#0FFH RET KEY:
?44?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 ;========================================================================== Q00AA: DB 00H, 01H, 04H, 07H, 0FH, 02H, 05H, 08H Q00B2: DB 0EH, 03H, 06H, 09H, 0DH, 0CH, 0BH, 0AH Q00BA: DB 10H, 10H, 10H, 10H, 10H, 10H, 10H, 10H Q00C2: DB 0FCH, 42H,0FCH,0AEH,0FDH, 0AH,0FDH, 35H Q00CA: DB 0FDH, 82H,0FDH,0C8H,0FEH, 05H,0C0H,0D0H Q00D2: DB 0C2H, 8CH, 85H, 09H, 8CH, 85H, 0BH, 8AH Q00DA: DB 0D2H, 8CH,0A2H, 00H, 92H, 90H,0B2H, 00H Q00E2: DB 15H, 0CH,0D0H,0D0H, 32H, 90H,0E1H, 01H Q00EA: DB 0E4H,0F0H, 90H,0E1H, 03H,0E0H,0F4H, 54H Q00F2: DB 0FH,0FFH, 22H ;.." ;========================================================================== STAR: MOV R0,#7FH CLR A STAR1: MOV @R0,A DJNZ R0,STAR1 MOV SP,#20H LJMP INTS1 ;========================================================================== END

实验七

步进电机控制实验

一、实验目的: 了解步进电机工作原理,掌握用单片机的步进电机控制系统的硬件设计方法,熟悉步进电机 驱动程序的设计与调试,提高单片机应用系统设计和调试水平。 二、实验内容: 编写并调试出一个实验程序按下图所示控制步进电机旋转:

三、工作原理:步进电机是工业过程控制及仪表中常用的控制元件之一,例如在机械装置中可以用丝杠把角度 变为直线位移,也可以用步进电机带螺旋电位器,调节电压或电流,从而实现对执行机构的控制。步进电机可 以直接接收数字信号,不必进行数模转换,用起来非常方便。步进电机还具有快速启停、精确步进和定位等特 点,因而在数控机床、绘图仪、打印机以及光学仪器中得到广泛的应用。 步进电机实际上是一个数字/角度转换器,三相步进电机的结构原理如图所示。从图中可以看出,电机的定 o 子上有六个等分磁极,A、A′、B、B′、C、C ′,相邻的两个磁极之间夹角为 60 ,相对的两个磁极组成一相 (A-A′,B-B′,C-C′) ,当某一绕组有电流通过时,该绕组相应的两个磁极形成 N 极和 S 极,每个磁极上各 有五个均匀分布矩形小齿,电机的转子上有 40 个矩形小齿均匀地分布的圆周上,相邻两个齿之间夹角为 9°。 当某一相绕组通电时,对应的磁极就产生磁场,并与转子形成磁路,如果这时定子的小齿和转子的小齿没 有对齐,则在磁场的作用下,转子将转动一定的角度,使转子和定子的齿相互对齐。由此可见,错齿是促使步 进电机旋转的原因。

三相步进电机结构示意图
?45?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 例如在三相三拍控制方式中, 若 A 相通电, B、 C 相都不通电, 在磁场作用下使转子齿和 A 相的定子齿对齐, 我们以此作为初始状态。设与 A 相磁极中心线对齐的转子的齿为 0 号齿,由于 B 相磁极与 A 相磁极相差 120°, 不是 9°的整数倍(120÷9=40/3) ,所以此时转子齿没有与 B 相定子的齿对应,只是第 13 号小齿靠近 B 相磁极 的中心线,与中心线相差 3°,如果此时突然变为 B 相通电,A、C 相不通电,则 B 相磁极迫使 13 号转子齿与 之对齐,转子就转动 3°,这样使电机转了一步。如果按照 A→B→C 的顺序轮流通电一周,则转子将动 9°。 步进电机的运转是由脉冲信号控制的,传统方法是采用数字逻辑电路——环形脉冲分配器控制步进电机的 步进。 下图为环形脉搏冲分配器的简化框图。

三相六拍环形脉搏冲分配器 1、运转方向控制。如图所示,步进电机以三相六拍方式工作,若按 A→AB→B→BC→C→CA→A 次序通电为 正转,则当按 A→AC→C→CB→B→BA→A 次序通电为反转。 2、运转速度的控制。图中可以看出,当改变 CP 脉冲的周期时,ABC 三相绕组高低电平的宽度将发生变化,这 就导致通电和断电时速率发生了变化,使电机转速改变,所以调节 CP 脉冲的周期就可以控制步进电机的运转速度。 3、旋转的角度控制。因为每输入一个 CP 脉冲使步进电机三相绕组状态变化一次,并相应地旋转一个角度, 所以步进电机旋转的角度由输入的 CP 脉冲数确定。 超想-3000TC 实验仪选用的是 20BY-0 型 4 相步进电机, 其工作电压为 4.5V,在双四拍运行方式时,其步距角 O 为 18 ,相直流电阻为 55Ω ,最大静电流为 80Ma。采用 8031 单片机控制步进电机的运转,按四相四拍方式在 P1 口输出控制代码,令其正转或反转。因此 P1 口输出代码的变化周期 T 控制了电机的运转速度:n=60/T.N 式中:n —— 步进电机的转速(转/分) ;N —— 步进电机旋转一周需输出的字节数; T —— 代码字节的输出变化周期。 设 N=360°/ 18°=20,T=1.43ms,则步进电机的转速为 2100 转/分。 控制 P1 口输出的代码字节个数即控制了步进电机的旋转角度。 正方向: A B C D 反方向: 四、接线图案: A D C B

根据步进电机工作原理,使用 8031 的 P1.0-P1.3 分别驱动步进电机 A、B、C、D 相,用软件控制 P1 口输
?46?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 出一脉冲序列,控制步进电机转速、方向、步距。同时为能观察步进电机旋转状态,在 A、B、C、D 相输出到状 态指示灯。 五、实验步骤: 1、 “系统资源”区的 P1.0-P1.3 孔接步进电机的 BA-BD 孔,“发光二极管组”的 L0-L3 孔接步进电机 A、B、 C、D 孔 。P1.7 孔连 L7。 2、编写程序、编译程序。用单步、全速断点、连续方式调试程序,观察数码管上数字变化,检查程序运行 结果,观察步进电机的转动状态,连续运行时用示波器测试 P1 口的输出波形,排除软件错误,直至达到本实验 的设计要求。 六、程序框图: 开 始 清状态寄存器 置正转 A 相通电 步计数器 R7 置 100 步 延时计数器 42H 置 200

(42)→ R6

调用延时 1ms 子程序 N (R6) -1=0? Y (32H)-1→32H 调用步进电机子程序 N (R7) -1=0? Y 步计数器 R7 置 100 步 N (42)→ R6 步计数器 R7 置 100 步

(42)→ R6 调用延时 1ms 子程序

(R6) -1=0? Y

调用延时 1ms 子程序 N (R6) -1=0? Y 调用步进电机子程序 N (R7) -1=0? Y
?47?

调用步进电机子程序

(42H)+1 →42H

N

(R7) -1=0? Y

步进电机控制主程序框图

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 开 始

(40H)+1→40H Y (40H) 〉3

0→40H N Y 根据(40H)查 CTAB→A 正转? N 根据(40H)查 FTAB→ A

(A)0∽3 →(20H)0∽3

(20H)→P1 口 返回 正反转步进子程序框图 七、思考问题:若将步进电机 A、B、C、D 相分别接到 P1.4--P1.7,软件功能与本实验要求一致,需要修改那 几处程序? 八、实验程序: ORG 0000H STRT: MOV SP,#6FH ;初始化 MOV 20H,#0 ;状态寄存器清零 MOV P1,#0F1H ;正转 A 相通电 MLP: MOV R7,#64H ;R7 为步计数器,正转 100 步 MOV 42H,#0C8H ;42H 为延时计数器 MLP0: MOV R6,42H ;调用延时 200MS 子程序 MLP9: LCALL DEL DJNZ R6,MLP9 DEC 42H LCALL STEPS ;调用步进子程序 DJNZ R7,MLP0 ;以上为加速程序 MOV R7,#64H ;以下为恒速程序 MLP1: MOV R6,42H MLPX: LCALL DEL DJNZ R6,MLPX LCALL STEPS DJNZ R7,MLP1 MOV R7,#64H ;以下为减速程序 MLP2: MOV R6,42H MLPY: LCALL DEL DJNZ R6,MLPY
?48?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 LCALL STEPS INC 42H DJNZ R7,MLP2 CPL 7 LJMP MLP STEPS:INC 20H ;正反转步进子程序 ANL 20H,#83H MOV A,20H ANL A,#3 JB 7,STPSC MOV DPTR,#FTAB SJMP STPW STPSC:MOV DPTR,#CTAB STPW: MOVC A,@A+DPTR MOV P1,A RET FTAB: DB 0F3H,0F6H,0FCH,0F9H CTAB: DB 79H,7cH,76H,73H DEL: MOV R5,#0 ;延时子程序 DEL0: DJNZ R5,DEL0 RET END ; “验证式” 实验七* * 步进电控制机 ORG 0000H STRT: MOV SP,#6FH ;初始化 MOV 20H,#0 ;状态寄存器清零 MOV P1,#0F1H ;正转 A 相通电 MLP: MOV R7,#64H ;R7 为步计数器,正转 100 步 MOV 42H,#0C8H ;42H 为延时计数器 MLP0: MOV R6,42H ;调用延时 200MS 子程序 MLP9: LCALL DEL DJNZ R6,MLP9 DEC 42H LCALL STEPS ;调用步进子程序 DJNZ R7,MLP0 ;以上为加速程序 MOV R7,#64H ;以下为恒速程序 MLP1: MOV R6,42H MLPX: LCALL DEL DJNZ R6,MLPX LCALL STEPS DJNZ R7,MLP1 MOV R7,#64H ;以下为减速程序 MLP2: MOV R6,42H MLPY: LCALL DEL DJNZ R6,MLPY LCALL STEPS INC 42H DJNZ R7,MLP2 CPL 7
?49?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 LJMP MLP STEPS:INC 20H ;正反转步进子程序 ANL 20H,#83H MOV A,20H ANL A,#3 JB 7,STPSC MOV DPTR,#FTAB SJMP STPW STPSC:MOV DPTR,#CTAB STPW: MOVC A,@A+DPTR MOV P1,A RET FTAB: DB 0F3H,0F6H,0FCH,0F9H CTAB: DB 79H,7cH,76H,73H DEL: MOV R5,#0 ;延时子程序 DEL0: DJNZ R5,DEL0 RET END

实验八

RAM 扩展实验

一、实验目的:学习 RAM6264 的扩展 二、实验内容:往 RAM 中写入一串数据,然后读出,进行比较。 三、程序框图: 往 RAM 中写入一串数据 读出 进行比较,相同显示 0,不同显示 E 四、接线图案:

五、实验步骤:设计程序,运行并观察结果。 六、实验程序: OUTBIT equ 0e101h
?50?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 CLK164 DAT164 LEDBuf IN equ 0e102h ; 段控制口(接 164 时钟位) equ 0e102h ; 段控制口(接 164 数据位) equ 40h equ 0e103h ORG 0000H MOV sp,#60h MOV DPTR,#0e100H ;8155 初始化 MOV A,#03H MOVX @DPTR,A START: MOV DPTR,#8000H ;往 6264 的 8000H-9FFFH 单元送入#55H MOV A,#55H DD: MOVX @DPTR,A INC DPTR mov r0,dph CJNe r0,#0A0H,DD MOV DPTR,#8000h DD1: MOVX A,@DPTR ;读出数据进行比较 CJNE A,#55H,ERR INC DPTR MOV R0,DPH CJNE R0,#0A0H,DD1 mov 40h,#06h ;显示缓冲器初始化 mov 41h,#05h mov 42h,#06h mov 43h,#04h mov 44h,#10h mov 45h,#00h START1: LCALL DISPLAY ;正确的显示“6464-0” SJMP START1 ERR: mov 40h,#06h mov 41h,#05h mov 42h,#06h mov 43h,#04h mov 44h,#10h mov 45h,#0Eh ;不正确的显示“6264-E。 ” START2: LCALL DISPLAY SJMP START2 DISPLAY:setb 0d3h mov r0, #LEDBuf mov r1, #6 ; 共 6 个八段管 mov r2, #00100000b ; 从左边开始显示 Loop: mov dptr, #OUTBIT mov a, #00h movx @dptr, a ; 关所有八段管 mov a, @r0 mov dptr,#LEDmap movc a,@a+dptr mov B, #8 ; 送 164 DLP: rlc a mov r3, a ?51?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov acc.0, c anl a,#0fdh mov dptr, #DAT164 movx @dptr, a mov dptr, #CLK164 orl a,#02h movx @dptr, a anl a,#0fDh movx @dptr, a mov a, r3 djnz B, DLP mov dptr, #OUTBIT mov a, r2 movx @dptr, a mov r6, #01 call Delay mov a, r2 rR a mov r2, a inc r0 djnz r1, Loop mov dptr, #OUTBIT mov a, #0 movx @dptr, a clr 0d3h ret LEDMAP: db db DB Delay: mov DelayLoop: djnz djnz ret end

; 显示一位八段管

; 显示下一位

; 关所有八段管

; 八段管显示码 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h 40H r7, #00H r7, DelayLoop r6, DelayLoop ; 延时子程序

实验九

工业顺序控制(INTO、INTI)综合实验

一、实验目的:掌握工业顺序控制程序的简单编程,中断的使用。 二、实验内容: 8031 P1.0-P1.6 控制注塑机七道工序,现模拟控制七只发光二极管的点亮,高电平点亮。设定每道工序时 间转换为延时,P3.4 为开工启动开关,高电平启动。P3.3 为外部故障输入模拟开关,低电平报警,P1.7 为报 警声音输出。设定 7 道工序只有一位输出。 三、实验器材: 1、超想 3000TC 综合实验仪 1 台 2、KEIL 仿真器 1 台 3、计算机 1 台 4、连线 若干根 四、程序框图:
?52?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 开 始 关输出

开中断,P1、P3 口初始化

保护现场

等开工

报 警 N

工序 1 延时 工序 2 延时

故障清除了吗?

恢复现场

工序 7 延时 主程序流程图 五、接线图案:

返 回 中断服务子程序

六、实验步骤: 按图接好连线。执行程序,把 K1 和 K0 接到高电平,观察发光二极管点亮情况,确定工序执行是否正常, 然后把 K0 置为低电平,看是否有声音报警。恢复中断 1,报警停,又从刚才报警时一道程序执行下去。 七、思考问题:修改程序,使每道工序中有多位输出。 八、实验程序: ;掌握工业顺序控制的简单编程,中断的使用 ORG 0000H SJMP MAIN ORG 0013H LJMP INTO MAIN: MOV P1,#00H ORL P3,#00H PO11: JNB P3.4,PO11 ;开工吗? ORL IE,#84H ORL IP,#04H MOV PSW,#00H ;初始化 MOV SP,#53H PO12: MOV P1,#01H ;第一道工序
?53?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 ACALL PO1BH MOV P1,#02H ;第二道工序 ACALL PO1BH MOV P1,#04H ;第三道工序 ACALL PO1BH MOV P1,#08H ;第四道工序 ACALL PO1BH MOV P1,#10H ;第五道工序 ACALL PO1BH MOV P1,#20H ;第六道工序 ACALL PO1BH MOV P1,#40H ;第七道工序 ACALL PO1BH SJMP PO12 MOV B,R2 ;保护现场 MOV P1,#00H ;关输出 MOV 20H,#0A0H ;振荡次数 SETB P1.7 ;振荡 ACALL PO1A ;延时 CLR P1.7 ;停止 ACALL PO1A ;延时 DJNZ 20H,PO18 ;不为零转 CLR P1.7 ACALL PO1A JNB P3.3,PO17 ;故障消除吗? MOV R2,B ;恢复现场 RETI MOV R2,#10H ;延时 1 ACALL DELY RET MOV R2,#06H ;延时 2 ACALL DELY RET MOV R2,#30H ;延时 3 ACALL DELY RET PUSH 02H ;延时子程序 PUSH 02H PUSH 02H DJNZ R2,DEL4 POP 02H DJNZ R2,DEL3 POP 02H DJNZ R2,DEL2 POP 02H DJNZ R2,DELY RET END

INTO: PO17: PO18:

PO19:

PO1A:

PO1BH:

DELY: DEL2: DEL3: DEL4:

?54?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

实验十

扩展时钟系统实验(DS12887)

一、实验目的:掌握 MCS51 单片机扩展时钟电路的设计方法;了解 DS12887 的工作原理。 二、实验内容:编程实现下列功能:程序第一次运行后,初始化时间显示为 00:00:00,即 6 位数码管显示为 00.00.00。通过键盘[MON]设定小时为 07,通过键盘[LAST]设定分钟为 08,通过键盘[NEXT]设定秒为 09,两分 钟后即在 7.10.09 时关掉电源,等待 2 分钟后再打开电源,这时时间应为 7.12.09,即停电后 DS12887 中的时 钟不会停止运行。 三、实验器材:1、超想-3000TC 综合实验仪 1 台 2、KEIL 仿真器 1 台 3、连线 若干 根 4、计算机 1 台 四、实验原理: 在很多应用场合要求单片机系统不仅能够准确地采集数据,而且还需要了解产生这些数据的时刻,为单片 机系统增加日历时钟是一项非常有用的技术, 掌握这项技术便是本实验的目的。 实验中使用 DALLAS 公司生产的 日历、时钟加 RAM 芯片 DS12887。它具有接口简单,使用方便等特点,曾被用在 586 计算机中。其引脚分布如 图所示,内部有 128 字节的非易失 SRAM,具体分配也如图所示。 14 BYTE 00 0D 00 01 02 03 04 05 06 114 引脚分布图 BYTE 07 08 09 0A 0B FF 0C 0D SECONDS SECODES ALARM MINUTES MINUTES ALARM HOURS HOURS ALARM DAY OF THE WEEK DAY OF THE MONTH MONTH YEAR REGISTER A REGISTER B REGISTER C REGISTER D

存储器分布图 通过对寄存器 A、B、C、D 的编程可以控制 DS12887 的工作方式。 寄存器 A D7 D6 D5 D4 D3 D2 D1 D0 UIP DV2 DV1 DV0 RS3 RS2 RS1 RS0 UIP 位当其为 0 时指示更新在 244μ S 内不会发生;DV2 DV1 DV0 当其为 010 时,打开晶振,并允许时钟开 始计时;RS3 RS2 RS1 RS0 用于选择周期中断或输出方波频率,当其分别为 0111、1000、1001、1011、1101、 1110、1111 时,对应频率为 512Hz、256Hz、128Hz、64Hz、32Hz、16Hz、8Hz、4Hz、2Hz。 寄存器 B D7 D6 D5 D4 D3 D2 D1 D0 SET PIE AIE UIE SQW DM 12/24 DSE SET 位为 0 时,每秒计数一次,置 1 后,更新转换被禁止;PIE、AIE、UIE 位当它们为 1 时,分别允许周期中 断、报警中断和时钟数据更新结束中断,为 0 时,禁止中断产生;SQWE 位当其为 1 时,按以寄存器 A 中由 RS3 RS2 RS1 RS0 设定的频率从 SQW 引脚输出方波,当其为 0 时,SQW 为低电平;当 DM 为 1 时选用二进制数据格式,反之为 BCD 数据格式;12/24 位为 1 时,指定 24 小时时间格式,否则为 12 小时时间格式;DSE 为 1 时允许夏时制发生。 寄存器 C D7 D6 D5 D4 D3 D2 D1 D0 IRQF PF AF UF 0 0 0 0 寄存器 C 的内容是周期中断标志位 PF、 报警中断标志位 AF、 更新结束中断标志位 UF 和中断请求标志位 IRQF, ?55?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 它们之间的关系为 IRQF=PF*PIE+AF*AIE+UF*UIE,只要 IRQF 为 1,/IRQ 引脚输出就保持低电平,读寄存器 C 将 清除所有标志。 寄存器 D D7 D6 D5 D4 D3 D2 D1 D0 VRT 0 0 0 0 0 0 0 寄存器 D 中仅 D7 有定义,读时应总为 1,若为 0 则说明内部锂电池已耗尽。为防止锂电池在芯片装入系统 前被耗尽,DS12887 在出厂时先关掉了其内部的晶振,编程时必须首先给寄存器 A 的 DV2 DV1 DV0 位写入 010 以打开晶振,然后读寄存器 D 以检查内部锂电池是否有效;接着根据需要对寄存器 A、B 进行设置。当需要修改 日历时钟时,需要先使 SET 位置 1,当需要读日历时钟数据时,必须先查询寄存器 A 中的 UIP 位,只有当其为 0 时,才能进行读取数据。 五、接线图案:

74LS138YS7

六、程序框图:

开 始 8155 初始化 DS12887 初始化

读秒、分、时 拆字后送显示缓冲器 调用显示子程序 调用键扫子程序 N 有键按下吗? Y 调整秒位 调整分位 调整时位 N Y N Y N Y 是 NEXT 键? N N 是 LAST 键? N N 是 MON 键? N N
?56?

N

N

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 七、实验步骤: 1、设定仿真模式程序空间在仿真器上,数据空间在用户板上。 2、从“接线图案”中看出,DS12887 的/CS 脚已连接 U17 译码器的 YS7 脚,于是可知 DS12887 的地址空间 为 0FE00H-0FFFFH。 3、硬件调试:因为 DS12887 内部有 114 个内部 RAM,在系统中的地址空间为:0FE0EH-0FE7FH,所以,可 通过查看这一区域的数据读写来判断硬件是否有故障。 超想-3000TC+KEIL 仿真器,在 WINDOWS 调试环境下打开数据存贮器区,在 0FE10H 开始的地址上写入一串 55H,然后按右键,弹出一窗口,点击“刷新” ,如写入的的一串 55H 未被修改,则硬件无故障。 4、设计程序并进行调试。 八、实验程序: ;按“NEXT”键,调整秒位;按“LAST”键,调整分位;按"MON"键,调整时位; OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) IN equ 0e103h ; 键盘读入口 LEDBuf: equ 60h ; 显示缓冲 ljmp Start LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h db 00H Delay: ; 延时子程序 mov r7, #00 DelayLoop: djnz r7, DelayLoop djnz r6, Delay ret DisplayLED: mov r0, #LEDBuf mov r1, #6 ; 共 6 个八段管 mov r2, #00000001b ; 从左边开始显示 Loop: mov dptr, #OUTBIT mov a, #0 movx @dptr, a ; 关所有八段管 mov a, @r0 mov B, #8 ; 送 164 DLP: rlc a mov r3, a mov acc.0, c mov dptr, #DAT164 anl a,#0fdh movx @dptr, a mov dptr, #CLK164 orl a,#02h movx @dptr, a anl a,#0fdh movx @dptr, a mov a, r3 djnz B, DLP mov dptr, #OUTBIT ?57?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov movx mov call mov rl mov inc djnz ret TestKey: mov mov movx mov movx cpl anl ret KeyTable: db db db db db db GetKey: Key2: a, r2 @dptr, a r6, #1 Delay a, r2 a r2, a r0 r1, Loop ; 显示一位八段管

; 显示下一位

dptr, #OUTBIT a, #0 @dptr, a dptr, #IN a, @dptr a a, #0fh

; 输出线置为 0 ; 读入键状态 ; 高四位不用

; 数字键码定义 00h, 01h, 04h, 07h 0fh, 02h, 05h, 08h 0eh, 03h, 06h, 09h 0dh, 0ch, 0bh, 0ah 10H,11H,12H,13H,14H 15H,16H,10H,10H,10H MOV 13H,#06H MOV 12H,#20H MOV A,12H CPL A MOV R7,A MOV DPTR,#0E101H MOV A,R7 MOVX @DPTR,A MOV A,12H CLR C RRC A MOV 12H,A MOV DPTR,#0E103H MOVX A,@DPTR MOV R7,A MOV A,R7 CPL A MOV R7,A MOV A,R7 ANL A,#0FH MOV 14H,A DEC 13H MOV R7,13H MOV A,R7 JZ Key1 MOV A,14H
?58?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 Key1 : JZ Key2 MOV A,14H JZ GetKey6 MOV A,13H ADD A,ACC ADD A,ACC MOV 13H,A MOV A,14H JNB ACC.1,GetKey1 INC 13H SJMP GetKey3 MOV A,14H JNB ACC.2,GetKey2 INC 13H INC 13H SJMP GetKey3 MOV A,14H JNB ACC.3,GetKey3 MOV A,#03H ADD A,13H MOV 13H,A MOV DPTR,#0E101H CLR A MOVX @DPTR,A MOV R7,#0AH LCALL Delay LCALL TestKey MOV A,R7 JNZ GetKey4 MOV R7,13H MOV A,R7 MOV DPTR,#KeyTable MOVC A,@A+DPTR MOV R2,A RET MOV R2,#0FFH RET mov clr movx mov call call jnz mov ret Start: mov r6,#02h call delay mov 20h,#00h mov 21h,#00h
?59?

GetKey1:

GetKey2:

GetKey3:

GetKey4:

GetKey6: WaitRelease:

dptr, #OUTBIT ; 等键释放 a @dptr, a r6, #10 Delay TestKey WaitRelease a, r2

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov 22h,#00h mov sp, #40h mov dptr,#0e100h mov a,#03h movx @dptr,a Start1: mov dptr,#0fe0ah movx a,@dptr anl a,#70h cjne a,#20h,start2 ;判断晶振打开否? sjmp start3 start2: mov dptr,#0fe0bh ;设置 SET=0,芯片正常工作.24/12=1,选 24 小时制. mov a,#82h movx @dptr,a mov r0,#06h mov dptr,#0fe00h ;;时分秒清零 mov a,#00h retun0: movx @dptr,a inc dptr djnz r0,retun0 mov dptr,#0fe0ah mov a,#27h movx @dptr,a ;打开晶振,SQW输出512HZ方波。 inc dptr mov a,#5ah movx @dptr,a start3: mov dptr,#0fe0ah movx a,@dptr jnb acc.7,loop12 mov r5,#4dh djnz r5,$ loop12: mov dptr,#0fe0bh mov a,#5ah movx @dptr,a loop13: mov dptr,#0fe00h ;读秒,分,时 mov r1,#60h mov r0,#03h loop11: movx a,@dptr lcall Ptreg ;读取的值,进行拆字后送显示缓冲器 60H-65H inc dptr inc dptr djnz r0,loop11 mov dptr,#0fe0bh call DisplayLED ; 调用显示子程序 call TestKey ; 有键入? jz loop12 ; 无键入, 继续显示 call GetKey ; 有键入,读入键码 cjne a,#14h,keep0 sjmp keep1 ;是 NEXT 键,调整秒位 keep0: cjne a,#15h,keep2 sjmp keep3 ;是 LAST 键,调整分位 ?60?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 keep2: cjne a,#16h,start1 sjmp keep5 ;是 MON 键,调整时位 keep1: mov dptr,#0fe0bh mov a,#0dah movx @dptr,a mov a,20h lcall Hbcd cjne a,#60h,loop20 ;秒位不能超过 60 秒 mov 20h,#00h sjmp loop13 loop20:mov dptr,#0fe00h movx @dptr,a inc 20h sjmp loop13 keep3: mov dptr,#0fe0bh mov a,#0dah movx @dptr,a mov a,21h lcall Hbcd cjne a,#60h,loop21 ;分位不能超过 60 分 mov 21h,#00h sjmp loop13 loop21:mov dptr,#0fe02h movx @dptr,a inc 21h sjmp loop13 keep5: mov dptr,#0fe0bh mov a,#0dah movx @dptr,a mov a,22h lcall Hbcd cjne a,#24h,loop22 ;时位不能超过 24 小时 mov 22h,#00h sjmp loop13 loop22:mov dptr,#0fe04h movx @dptr,a inc 22h sjmp loop13 Ptreg: push dph ;拆字子程序 push dpl push acc push b mov b,a anl a,#0fh mov dptr,#LEDMAP movc a,@a+dptr orl a,#80h mov @r1,a inc r1 mov a,b swap a anl a,#0fh ?61?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov dptr,#LEDMAP movc a,@a+dptr mov @r1,a inc r1 pop b pop acc pop dpl pop dph ret Hbcd: mov b,#100 ;单字节十六进制整数转换成单字节 BCD 码子程序 div ab mov r3,a mov a,b mov b,#10 div ab swap a orl a,b ret END

实验十一

V/F 压频转换实验

一、实验目的:了解 LM331 电压转换为频率的基本工作原理,熟悉 8031 内部定时/计数器的使用方法。 二、实验内容:把电压转换成脉冲,用计数器进行测频并在超想-3000TC 综合实验仪上的数码管上显示出来, 实现频率计功能。 三、工作原理:把模拟信号送 LM331 进行压频转换,然后将 8031 定时器 T0 设为定时状态,T1 设为计数状态, 对脉冲信号进行计数。定时读取 T1 计数值,经“二 — 十”转换后送显示。本实验 8031 定时器 T0 为定时,T1 为计数,方式字 51H。 四、实验器材:1、超想-3000TC 综合实验仪 1 台; 2、KEIL 仿真器 1台 3、连线 若干 根; 4、计算机 1台 五、接线方案:

?62?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 六、程序框图: 堆栈、定时器/计数器、中断初始化 开定时器中断 取出 TH1、TL1 内容,调数据转换子程序 显示 主程序流程图 定时器中断

恢复初值

1 秒到吗? Y 清 0.1 秒单元

N

0.1 秒单元加 1

TH1、TL1 内容送出

返回 中断处理子程序 七、实验步骤: 1、把“模拟信号发生器”的 VIN 孔连 V/F 转换电路 LM331 的 V2 孔,V/F 转换电路 LM331 的 FOUT 孔连“分 频器”的 F 孔, “分频器”的 F/2 孔连“系统资源区”的 P3.5(定时器 T1)孔。 2、设定仿真模式为程序空间在仿真器上,数据空间在用户板上。 3、硬件调试:超想-3000TC 综合实验仪加电以后,用示波器在 V/F 转换电路的 FOUT 孔 即可观察到一脉冲 波形,转动“模拟信号发生器”的电位器,输出脉冲频率会发生变化。 4、编辑程序、编译程序。首先将断点设在中断服务程序入口地址上,运行程序 ,如果响应断点,则表明 中断初始化程序正确,如果碰不到断点则应检查本实验初始化程序部分软件是否有错。将断点设在中断服务程 序体中,检查 T1 计数是否与输入信号作相应变化。再调试二进制翻十进制子程序。调试程序,排除软件错误, 观察 6 位显示器显示数字与输入信号是否对应变化,不断修改程序,直至达到设计要求。 八、实验程序: ;定时器 0 作定时器,定时器 1 对外部输入脉冲进行计数并把计数值显示于数码管上. OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) IN equ 0e103h ; 键盘读入口 LEDBuf equ 40h ; 显示缓冲 ORG 0000h SJMP MAIN ORG 000BH ;定时器 0 中断入口地址 LJMP INTER0 org 0030h
?63?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 MAIN: mov sp,#60h mov dptr,#0e100h ;8155 初始化 mov a,#03h movx @dptr,a MOV TMOD,#51H ;定时器初始化 MOV TH0,#3CH MOV TL0,#0B7H MOV TL1,#00H MOV TH1,#00H MOV 23H,#00H ORL IE,#82H MOV TCON,#50H MOV 50H,#00H MOV 51H,#00H LOOP0: MOV R2,50H MOV R3,51H LCALL LOOP1 ;调用二进制转十进制子程序 MOV R0,#40H ;转换结果送显示缓冲器 MOV A,R6 LCALL PTDS MOV A,R5 LCALL PTDS MOV A,R4 LCALL PTDS LCALL DISPLAY ;调用显示子程序 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 ?64?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 RET PTDS: MOV R1,A ACALL PTDS1 MOV A,R1 SWAP A PTDS1: ANL A,#0FH MOV @R0,A INC R0 RET Delay: mov r7, #0 ; 延时子程序 DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop ret DISPLAY: setb 0d3h mov r0, #LEDBuf mov r1, #6 ; 共 6 个八段管 mov r2, #00000001b ; 从左边开始显示 Loop: mov dptr, #OUTBIT mov a, #00h movx @dptr, a ; 关所有八段管 mov a, @r0 mov dptr,#LEDmap movc a,@a+dptr mov B, #8 ; 送 164 DLP: rlc a mov r3, a mov acc.0, c anl a,#0fdh mov dptr, #DAT164 movx @dptr, a mov dptr, #CLK164 orl a,#03h movx @dptr, a anl a,#0fDh movx @dptr, a mov a, r3 djnz B, DLP mov dptr, #OUTBIT mov a, r2 movx @dptr, a ; 显示一位八段管 mov r6, #1 call Delay mov a, r2 ; 显示下一位 rl a mov r2, a inc r0 djnz r1, Loop mov dptr, #OUTBIT
?65?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov a, #0 movx @dptr, a clr 0d3h ; 关所有八段管 ret LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h INTER0: CLR TR0 ;定时器 0 中断处理子程序 MOV TL0,#0B7H MOV TH0,#3CH INC 23H MOV A,23H CJNE A,#0AH,ZOO1 MOV 23H,#00H MOV 50H,TH1 MOV 51H,TL1 MOV TL1,#00H MOV TH1,#00H ZOO1: SETB TR0 RETI END

实验十二

力测量实验

一、实验目的: 了解力-电信号转换的基本工作原理,掌握 ADC0809 的使用方法,提高数据处理程序的设计和调试能力。 二、实验内容: 编写并调试出一个实验程序,其功能将一力施加于压力传感器金属弹性元件表面,超想-3000TC 综合实验 仪上数码管显示力的数据,并随力的大小而变化。 三、实验器材:1、超想-3000TC 综合实验仪 1台 2、KEIL 仿真器 1 台 3、连线 若干 根 4、计算机 1 台 四、实验线路:

CS09

09IN1 09IN0

1、当在应变片上施加一力时,引起电桥不平衡,压力信号转换为微弱的电压信号,经 LM324 运算放大器,
?66?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 把信号放大至 0-5V,作为 ADC0809 输入信号。 2、ADC0809 能与 CPU 直接接口,其输入电压为 0 - 5V,本实验中以 A2、A1、A0 作为通道地址线,CPU 对 0809 执行写操作时锁存通道地址。 3、从实验原理图可以看出“译码器”的 YC2 作为 0809 片选信号,所以 0809 地址为:0A000H。 五、程序框图: 程序入口

设 SP 初始化显示缓冲区

调用显示子程序

选 0809 通道 0 并启动 A/D

延时

读 A/D 结果

送显示缓冲区 六、工作原理: 将金属丝电阻应变片粘附在弹簧片的表面,弹簧片在力的作用下发生形变,而电阻应变片也随着弹簧片一 起变形,这将导致电阻应变片电阻的变化。弹簧片受的力越大,形变也越大,电阻应变片电阻的变化也越大, 测量出电阻应变片电阻的变化,就可以计算出弹簧片受力的大小。 图为应变片电桥测量电路,由应变片的电阻 R1 和另外三个电阻 R2、R3、R4 构成桥路,当电桥平衡时(即 电阻应变片未受力作用时) ,R1=R2=R3=R4=R,此时电桥的输出 U0=0,当应变受力后,R1 发生变化,使 R1、R3 ≠R2、R4,电桥输出 U0≠0,并有:

应变片电桥测量电路 七、实验步骤: 1、设定仿真模式为程序空间在仿真器上,数据空间在用户板上。 2、 “译码器” 的 YC2 孔连数模转换 AD0809 的 CS09 孔, “脉冲源” 的 0.5MHZ 孔连 AD0809 的 CLOCK 孔, 09IN0 孔(AD0809 的 0 通道)连 AN0 孔(压力传感器的输出孔) 。 3、硬件调试:在弹性元件表面施加一力。 4、输入程序,编译。在读取 AD 转换指令后设置断点,在弹性元件施加一力,全速运行,如果碰到断点,
?67?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 再检查读出 A/D 转换结果,数据是否与 09VINO 相对应,否则应查程序或硬件。再全速运行程序,修改程序错误 使超想-3000TC 综合实验仪显示值随力的大小而变化,直至达到本实验的要求。 5、可通过“压力传感器”框中的电位器,对电桥进行零点平衡调节。 八、实验程序: OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) IN equ 0e103h ; 键盘读入口 LEDBuf equ 40h ; 显示缓冲 org 0000h mov sp,#60h mov dptr,#0e100h ;8155 初始化 mov a,#03h movx @dptr,a mov 40h,#10h ;显示缓冲器初始化 mov 41h,#11h mov 42h,#11h mov 43h,#11h mov 44h,#00h mov 45h,#00h LOOP1: mov r7,#40 vip: lcall DISPLAY djnz r7,vip mov a,#00h mov dptr,#0a000h ;0809AD 的通道开始转换吗? movx @dptr,a mov r7,#02h loop2: djnz r7,loop2 movx a,@dptr mov r0,#45h ;拆字 lcall ptds sjmp loop1 ptds: mov r1,a lcall ptds1 mov a,r1 swap a ptds1: anl a,#0fh mov @r0,a dec r0 ret Delay: mov r7, #0 ; 延时子程序 DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop ret DISPLAY:setb 0d3h mov r0, #LEDBuf mov r1, #6 ; 共 6 个八段管 mov r2, #00100000b ; 从左边开始显示 Loop: mov dptr, #OUTBIT mov a, #00h movx @dptr, a ; 关所有八段管
?68?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov a, @r0 mov dptr,#LEDmap movc a,@a+dptr mov B, #8 DLP: rlc a mov r3, a mov acc.0, c anl a,#0fdh mov dptr, #DAT164 movx @dptr, a mov dptr, #CLK164 orl a,#02h movx @dptr, a anl a,#0fDh movx @dptr, a mov a, r3 djnz B, DLP 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, #0 movx @dptr, a clr 0d3h ; 关所有八段管 ret LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h db 0B8H,40H END

; 送 164

实验十三

温度测量实验

一、实验目的:了解热敏电阻测温基本工作原理及小信号放大器工作原理和零点、增益的调整方法。 二、 实验内容: 使用电桥将热敏电阻阻值变化转换为电压信号放大以后经 A/D 转换为数字量由 CPU 处理, 在 LED 上显示出来。 三、实验器材:1、超想 3000TC 综合实验仪 1 台 2、KEIL 仿真器 1台 3、连线 若干根 4、计算机 1台 四、工作原理: 温度测量采用热敏元件作为传感器,常用的温度传感器有热敏电阻、热电偶、集成温度传感器等。其中热 敏电阻价格便宜且方便耐用。根据电阻和温度关系有负温度系数,正温度系数和临界温度热敏电阻。
?69?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 五、接线方案:

CS09

09IN1 09IN0

图中使用的热敏电阻为负温度系数热敏电阻,温度愈高,电阻愈小,运放输出的电压愈高。该电压信号输 入到 AD0809 的第 0 号通道进行转换。读 AD0809 即可得到环境温度值。 六、程序框图: 设 SP 初始化显示缓冲区

调用显示子程序

选 0809 通道 0 并启动 A/D

读 A/D 结果

延时

送显示缓冲区

七、实验步骤: 1、系统连接:把“温度传感器”框中的 ANZ 孔连 AD0809 的 0 通道 09IN0; “脉冲源”框中的 0.5MHZ 孔连 AD0809 的 CL0OK 孔;“译码器”的 YC2(0A000H)孔连 AD0809 的 CS09 孔。 2、设定仿真模式为程序空间在仿真器上,数据空间在用户板上。 3、硬件调试:在热敏电阻表面加温。 4、输入程序,编译。全速运行程序,修改程序错误使超想-3000TC 显示值随 W 温度的高低而变化,直至 达到本实验的要求。 5、可通过“温度传感器”框中的电位器,对电桥进行零点平衡调节。
?70?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 八、思考问题:请把 16 进制数转换成十进制数在数码管上显示出来。 九、实验程序: OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) IN equ 0e103h ; 键盘读入口 LEDBuf equ 40h ; 显示缓冲 org 0000h mov sp,#60h mov dptr,#0e100h ;8155 初始化 mov a,#03h movx @dptr,a mov 40h,#10h ;显示缓冲器初始化 mov 41h,#11h mov 42h,#11h mov 43h,#11h mov 44h,#00h mov 45h,#00h LOOP1: mov r4,#2 vip: lcall DISPLAY djnz r4,vip mov a,#00h mov dptr,#0a000h ;0809AD 的通道开始转换吗? movx @dptr,a mov r7,#02h loop2: djnz r7,loop2 movx a,@dptr mov r0,#45h ;拆字 lcall ptds sjmp loop1 ptds: mov r1,a lcall ptds1 mov a,r1 swap a ptds1: anl a,#0fh mov @r0,a dec r0 ret Delay: mov r7, #0 ; 延时子程序 DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop ret DISPLAY: setb 0d3h mov r0, #LEDBuf mov r1, #6 ; 共 6 个八段管 mov r2, #00100000b ; 从左边开始显示 Loop: mov dptr, #OUTBIT mov a, #00h movx @dptr, a ; 关所有八段管 mov a, @r0 mov dptr,#LEDmap movc a,@a+dptr mov B, #8 ; 送 164
?71?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 DLP: rlc a mov r3, a mov acc.0, c anl a,#0fdh mov dptr, #DAT164 movx @dptr, a mov dptr, #CLK164 orl a,#02h movx @dptr, a anl a,#0fDh movx @dptr, a mov a, r3 djnz B, DLP 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, #0 movx @dptr, a clr 0d3h ; 关所有八段管 ret LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h db 0f6H,40H end

实验十四

直流电机转速测量与控制实验

一、实验目的: 了解霍尔器件工作原理及转速测量与控制的基本原理、基本方法,掌握 DAC0832 电路的接口技术和应用方 法,提高实时控制系统的设计和调试能力。 二、实验内容: 设计并调试一个程序其功能为测量电机的转速,并在超想-3000TC 综合实验仪显示器上显示出来,采用比 例调节器方法,使电机转速稳定在某一设定值。此设定值可由超想-3000TC 综合实验仪上的键盘输入。 三、工作原理: 转速是工程上一个常用参数。旋转体的转速常以每秒钟或每分钟转数来表示,因此其单位为转/秒、转/分, 也有时用角速度表示瞬时转速,这时的单位相应为孤度/秒。 转速的测量方法很多,由于转速是以单位时间内转数来衡量,在变换过程中多数是有规律的重复运动。霍 尔开关传感器正由于其体积小,无触点,动态特性好,使用寿命长等特点,故在测量转动物体旋转速度领域得 到了广泛应用。 霍尔器件是由半导体材料制成的一种薄片,在垂直于平面方向上施加外磁场 B,在沿平面方向两端加外电 场,则使电子在磁场中运动,结果在器件的两个侧面之间产生霍尔电势。其大小和外磁场及电流大小成比例。 本实验选用美国史普拉格公司(SPRAGUE)生产的 3000 系列霍尔开关传感器 3020,它是一种硅单片集成电
?72?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 路,器件的内部含有稳压电路、霍尔电势发生器、放大器、史密特触发器和集电极开路输出电路,具有工作电 压范围宽、可靠性高、外电路简单、输出电平可与各种数字电路兼容等特点。器件采用三端平塑封装。引出端 功能符号如下: 引出端序号 1 2 3 功能 符号 电源 VC1 地 GND 输出 OUT

我们根据霍尔效应原理,将一块永久磁钢固定在电机转轴上的转盘边沿,转盘随测轴旋转,磁钢也将跟着 同步旋转,在转盘附近安装一个霍尔器件 3020,转盘随轴旋转时,受磁钢所产生的磁场的影响,霍尔器件输出 脉冲信号,其频率和转速成正比,测出脉冲的周期或频率即可计算出转速。 直流电机的转速与施加于电机两端的电压大小有关。本实验用 DAC0832 控制输出到直流电机的电压,控制 DAC0832 的模拟输出信号量来控制电机的转速。当电机转速小于设定值时增大 D/A 输出电压,大于设定值时则 减小 D/A 输出电压, 从而使电机以某一速度恒速旋转。 我们采用简单的比例调节器算法 (简单的加一、 减一法) 。 比例调节器(P)的输出系统式为: Y=Kpe(t) 式中:Y——调节器的输出 e(t)——调节器的输入,一般为偏差值 KP——比例系数 从上式可以看出,调节器的输出 Y 与输入偏差值 e(t )成正比。因此,只要偏差 e(t)一出现就产生与之成 比例的调节作用,具有调节及时的特点,这是一种最基本的调节规律。比例调节作用的大小除了与偏差 e(t)有 关外,主要取决于比例系数 Kp,比例调节系数愈大,调节作用越强,动态特性也越大。反之,比例系数越小, 调节作用越弱。对于大多数的惯性环节,Kp 太大时将会引起自激振荡。比例调节的主要缺点是存在静差,对于 扰动的惯性环节,Kp 太大时将会引起自激振荡。对于扰动较大,惯性也比较大的系统,若采用单纯的比例调节 器就难于兼顾动态和静态特性,需采用调节规律比较复杂的 PI(比例积分调节器)或 PID(比例、积分、微分 调节器)算法。 四、实验器材:1、超想-3000TC 综合实验仪 1 台 2、KEIL 仿真器 1 台 3、连线 若干 根 4、计算机 1 台 五、实验线路:

定时器 T1,工作于外部事件计数方式,对转速脉冲计数;T0 工作于定时器方式,均工作于方式 1。“译码 器”的 YC2 孔作为 DAC0832 的片选端,故 DAC0832 地址为 0A000H-0AFFFH。
?73?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

六、程序框图:
开 始

开 始 保护现场,恢复 T0 初值

栈指针初始化 显示缓冲器 3C-39H 清零

N

(40H) -1=0? Y 200→40H

暗码 1AH→3EH-39H (42H)/10→BCD 码→显示缓冲器 200→40H,7EH→41H,0→42H 定时器 T0 初始化,50ms 定时, 中断初始化,允许 T0、INT0 中断 Y 转速大于设定值 N

(40H)-1→0832 Y 转速等于设定值 N (40H)+1→0832

调用显示子程序 DIR 转速测量与控制实验主程序框图 开 始 (42H)+1→42H 返 回

0→42H 恢复现场

INT1 中断程序 T0 中断程序框图 返 回 七、实验步骤: 1、设定仿真器仿真模式为程序空间在仿真器上,数据空间在用户板上。把数模转换 DAC0832 输出 AOUT 孔连 直流电机 DCIN 孔,数模转换 DAC0832 的 CS32 孔连“译码器”的 YC2 孔,CKM 孔(霍尔器件输出孔)连 P3.2 孔。 2、编程并编译。首先将断点设在中断服务程序入口,运行程序 ,如果程序进入中断处理程序入口,则表 明中断初始化程序正确,如果碰不到断点则首先应检查初始化程序是否有错。把断点设在中断程序结束,检查 在单位定时内, T1 计数值是否与电机转速符合。 再调试二翻十子程序, 最后调试整个实验程序, 排除软件错误, 连续运行时,通过键盘输入 0-9 之间的任意两位数,显示在数码管左边的两位即为设定值,右边两位为电机当 前转速。观察电机旋转工作状态与数码管上显示是否正确,修改程序直至达到本实验设计要求。注:本实验电 机转速范围一般应为 35-50 转/分。 八、思考问题: 试编写一转速测量软件,测试电机转动周期 T,然后计算瞬时转速,并用 PID 调节使转速恒定在 25 转/分。 九、实验程序: DAOT EQU 50H;中断次数计数单元 SCNT EQU 51H;为送到 0832 的值 CKCH EQU 52H;存放转速 CKCN EQU 53H SETP EQU 54H TEMP EQU 55H cs equ 90h times equ 46h
?74?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 temp1 equ 47h OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) IN equ 0e103h ; 键盘读入口 LEDBuf equ 39h ; 显示缓冲 ORG 0000H STRT: LJMP MAIN ORG 0003H ; LJMP PINT0 ORG 000BH ; LJMP PTF0 ORG 0030H ; PTF0: MOV TH0,#0D0H PUSH ACC PUSH PSW SETB PSW.3 inc times mov a,times cjne a,#40,ptfj mov times,#0 mov a,ckcn mov temp1,a mov ckcn,#0 subb a,setp jnc tt3 mov a,scnt add a,#2 mov scnt,a ljmp tt4 tt3: mov a,scnt subb a,#2 mov scnt,a tt4: ; mov a,scnt ; mov b,#100 ; div ab ; mov 3eh,a ; mov a,b ; mov b,#10 ; div ab ; mov 3dh,a ; mov a,b ; mov 3ch,a mov a,temp1 ;speed mov b,#10 div ab mov 3ah,a mov a,b mov 39h,a PTFJ: NOP POP PSW POP ACC RETI MAIN: mov sp,#60h
?75?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov dptr,#0e100h mov a,#03h movx @dptr,a MOV R0,#39H MOV R7,#06H MLP0: MOV @R0,#10H INC R0 DJNZ R7,MLP0 LCALL DIR MOV DAOT,#40H MOV SCNT,#01H MOV CKCH,#00H MOV CKCN,#00H clr EA NOP SETB EX1 NOP CLR IT1 NOP MLP1: call TestKey jz MLp1 call GetKey ANL A,#0FH CJNE A,#0AH,tt JNC MLP1 tt: MOV 3EH,A LCALL DIR MLP2: call TestKey jz MLP2 call GetKey ANL A,#0FH CJNE A,#0AH,tt1 JNC MLP2 tt1: MOV 3DH,A MOV A,3EH MOV B,#0AH MUL AB ADD A,3DH MOV SETP,A mov dptr,#0a000h mov scnt,#7fh mov a,scnt MOVX @DPTR,A MOV A,#1 ORL A,TMOD MOV TMOD,A MOV TH0,#0D0H MOV TL0,#00H mov times,#0h SETB TR0 SETB EA SETB ET0 SETB EX0 SETB IT0 ;8155 初始化

;调显示

; 有键入? ; 无键入, 继续显示 ; 读入键码

; 有键入? ; 无键入, 继续显示 ; 读入键码

?76?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 SETB EX1 CLR IT1 NOP MOV IP,#04H mov scnt ,#7fh ML00P4: MOV DPTR,#0a000H mov a,scnt MOVX @DPTR,A mov r7,#50 djnz r7,$ LCALL DIR LJMP ML00P4 PINT0: INC CKCN PIPI: RETI TestKey: mov dptr, #OUTBIT mov a, #0 movx @dptr, a ; 输出线置为 0 mov dptr, #IN movx a, @dptr ; 读入键状态 cpl a anl a, #0fh ; 高四位不用 ret KeyTable: ; 数字键码定义 db 00h, 01h, 04h, 07h db 0fh, 02h, 05h, 08h db 0eh, 03h, 06h, 09h db 0dh, 0ch, 0bh, 0ah db 10H,10H,10H,10H,10H db 10H,10H,10H,10H,10H GetKey: MOV 13H,#06H MOV 12H,#20H Key2: MOV A,12H CPL A MOV R7,A MOV DPTR,#0E101H MOV A,R7 MOVX @DPTR,A MOV A,12H CLR C RRC A MOV 12H,A MOV DPTR,#0E103H MOVX A,@DPTR MOV R7,A MOV A,R7 CPL A MOV R7,A MOV A,R7 ANL A,#0FH MOV 14H,A DEC 13H MOV R7,13H MOV A,R7
?77?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 JZ Key1 MOV A,14H JZ Key2 MOV A,14H JZ GetKey6 MOV A,13H ADD A,ACC ADD A,ACC MOV 13H,A MOV A,14H JNB ACC.1,GetKey1 INC 13H SJMP GetKey3 MOV A,14H JNB ACC.2,GetKey2 INC 13H INC 13H SJMP GetKey3 MOV A,14H JNB ACC.3,GetKey3 MOV A,#03H ADD A,13H MOV 13H,A MOV DPTR,#0E101H CLR A MOVX @DPTR,A MOV R7,#0AH LCALL Delay LCALL TestKey MOV A,R7 JNZ GetKey4 MOV R7,13H MOV A,R7 MOV DPTR,#KeyTable MOVC A,@A+DPTR MOV R2,A RET MOV R2,#0FFH RET mov dptr, #OUTBIT ; 等键释放 clr a movx @dptr, a mov r6, #10 call Delay call TestKey jnz WaitRelease mov a, r2 ret 0d3h r0, #LEDBuf r1, #6 ; 共 6 个八段管 r2, #00000001b ; 从左边开始显示 dptr, #0e101h
?78?

Key1 :

GetKey1:

GetKey2:

GetKey3:

GetKey4:

GetKey6: WaitRelease:

DIR:

setb mov mov mov mov

Loop:

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov a, #00h movx @dptr, a mov dptr,#0a000h mov a,scnt movx @dptr,a mov a, @r0 mov dptr,#LEDmap movc a,@a+dptr mov B, #8 DLP: rlc a mov r3, a mov acc.0, c anl a,#0fdh mov dptr, #0e102h movx @dptr, a mov dptr, #0e102h orl a,#02h movx @dptr, a anl a,#0fDh movx @dptr, a mov a, r3 djnz B, DLP mov dptr, #0e101h mov a, r2 movx @dptr, a ; 显示一位八段管 mov r6, #1 mov dptr,#0a000h mov a,scnt movx @dptr,a call Delay mov a, r2 ; 显示下一位 rL a mov r2, a inc r0 djnz r1, Loop mov dptr, #0e101h mov a, #0 movx @dptr, a clr 0d3h ; 关所有八段管 ret LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h DB 00H Delay: ; 延时子程序 mov r7, #0 DelayLoop: djnz r7, DelayLoop djnz r6, DelayLoop ret END ; 关所有八段管

; 送 164

?79?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

实验十五

点阵 LCD 液晶显示屏实验

一、实验目的:学习获取字模的方法;学习 122X32A 液晶 LCD 的原理及编程方法; 二、实验内容:在 LCD 上显示“武汉恒科电子教仪,欢迎您使用该产品”字样。 三、实验器材:1、超想-3000TC 综合实验仪 1 台 2、KEIL 仿真器 1 台 3、连线 若干 根 4、计算机 1 台 四、工作原理: 1、我们选用的 122X32A 点阵式液晶 LCD,是内置 SED1520 液晶显示控制器的屏,它集行、列 驱动器和控制器于一体,被广泛应用于小规模液晶显示模块中。SED1520 内置 2560 位显示 RAM 区,RAM 中的 1 位数据控制液晶屏上一个象素的亮、暗, “1”为亮, “0”为暗。它具有 16 个行驱动输出和 61 个列驱动输出, 可以直接与 80 系列或 68 系列的 CPU 相连,驱动占空比为 1/32,显示内容:122X32 点。 2、122X32A 点阵式液晶 LCD 电路图: LCD
COM1-16

PANEL 122X32 SED1520 SEG62-122

COM17-32

SED1520 SEG1-61
E1 E2 A0 R/W DB0-DB7 /RES

122X16 122X16
引 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 3、极限参数: 名称 电源电压 LCD 驱动电压 输入电压 符号 VDD-VCC VDD-V0 Vi 脚 符 号 VDD GND V0 /RES E1 E2 R/W A0 DB0 DB1 DB2 DB3 DB4 DB5 DB6 DB7

DOTS DOTS
电 平 5.0V 0V 可调 H/L H,H→L H,H→L H/L H/L H/L H/L H/L H/L H/L H/L H/L H/L

2

1

16

15

说 明 电源电压 接地(GND) LCD 驱动电压(对比度调节) 复位信号 片使能信号 1 片使能信号 2 H:读;L:写 H:数据;L:指令 数据位 0 数据位 1 数据位 2 数据位 3 数据位 4 数据位 5 数据位 6 数据位 7 标准值 最小值 最大值 0 6.5 0 12.0 0 VDD

测试条件 Ta=25℃

单位 V V V

?80?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 4、电参数: 名称 电压 电流 逻辑 LCD 逻辑 LCD 符号 VDD-VSS VDD-V0 IDD IEE VDD-V0 VIH VIL 测试条件 0℃ 25℃ 40℃ 高电平 低电平 最小值 4.75 4.5 0.7VDD 0 标准值 典型值 5.0 5.5 2.5 2.0 6.2 5.5 4.8 最大值 5.25 6.5 VDD 0.3VDD 单位 V V mA mA V V V V V

LCD 工作电压 (推荐值) 高电平 输入 低电平 电压

5、Read/Write Timing for the 80-port MPU(Ta=0 to 75℃,VSS=.0V 0℅) tAH8 A0,/CS tAW8 /WR,/RD tDS8 D0 - D7 (WRITE) tACC8 D0 - D7 (READ) Parameter Address hold time Address set-up time System cycle time Control pulse width Data Set-up time Data hold time RD access time Output disable time Signal A0, /CS /WR, /RD D0-D7 Symbol tAH8 tAW8 tcyc8 tcc tDS8 tDH8 tACC8 tOH8 Condition Rating Type Unit ns ns ns ns ns ns ns ns tOH8 tDH8 tCYC8 tCC

CL=100PF

Min 10 20 1000 200 80 10 10

Max -90 60

★The ratings when VSS=.0V are approximately 100℅ higher than when VSS=.0V. 6、Control timimg for 80 - port/68 - port display(Ta = 0 to 75℃, VSS = .0V 0℅) CL tWHCL tWLCL FR Rating Type tDFR tF tR

Parameter LOW pulse width HIGH pulse width

Signal CL

Symbol tWLCL tWHCL

Condition

Min 35 35

Max -

Unit ns ns

?81?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 Rising time Falling time FR delay time FR tR tF tDFR Input timing Ouput timing Cl=100pf -2.0 30 30 0.2 0.2 150 150 2.0 0.4 ns ns ns ns

7、指令功能:SED1520 有 13 条指令,从作用上可分为两大类:一类为显示方式的设置指令,前 6 条指令 为这一类指令, 它们只需在初始化程序中写入一次即可。 另一类为显示数据读/写操作的指令, 从第 7 条往下 (包 括读状态字)都是这类指令。 Command RD WR A0 D7 D6 D5 D4 D3 D2 D1 D0 1 Display ON/OFF 1 0 0 1 0 1 0 1 1 1 0/1 2 Display START Line 1 0 0 1 1 0 Display START address(0-31) 3 Page Address Set 1 0 0 1 0 1 1 1 0 Page(0-3) Column(Segment) 4 1 0 0 0 Column address (0-79) Address Set 5 Status Read 0 1 0 BUSY ACC ON/OFF RET 0 0 0 0 6 Write Display Data 1 0 1 Write Data 7 Read Display Data 0 1 1 Read Data 8 ADC Select 1 0 0 1 0 1 0 0 0 0 0/1 9 Static Drive ON/OFF 1 0 0 1 0 1 0 0 1 0 0/1 10 Duty Select 1 0 0 1 0 1 0 1 0 0 0/1 11 Read Modify Write 1 0 0 1 1 1 0 0 0 0 0 12 End 1 0 0 1 1 1 0 1 1 1 0 13 Reset 1 0 0 1 1 1 0 0 0 1 0 COM1:Switches the entire display ON or OFF,regardless of the Display RAM data or the internal ★★ status COM2:Determines the line of RAM data to be displayed at the display top line COM3:Sets the page of the Display RAM in the page address register COM4:Sets the column address of the Display RAM in the column address register COM5:Reads the status BUSY 1: Busy(internal processing) 0: READY status ADC 1: Rightward(forward)output 0: leftward(reverse)output ON/OFF 1: Display OFF 0: Display ON RET 1: Resetting 0: Normal COM6:Writes the data on the data bus to RAM COM7:Reads data from the Display RAM onto the data bus COM8:Used to reverse the correspondence between the Display RAM column address and segment driver output ports 0: Rightward(forward)output 1: leftward(reverse)output COM9:Selects normal display operation or static all-lit drive display operation. ★★ 1: Static drive(Power Save) 0: Normal display operation COM10:Selects the duty factor for driving LCD cells 1: 1/32 duty 0: 1/16 duty COM11:Increments the column address counter by one only when display data written but not when it is read. COM12: Cancels the Ready Modify Write Mode COM13:Resets the Display START line to the 1st line in the register.Resets the column address counter to 0 and page address register to 3

?82?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 五、接线方案:

六、程序框图:LCD 液晶显示主程: 调用 LCD 初始化子程序 调用 LCD 清屏子程序 设置页地址=02H,列地址=0H,字符代码寄存器 00H 调用显示“武”字子程序 设置页地址=02H,列地址=0FH,字符代码寄存器 01H 调用显示“汉”字子程序 设置页地址=00H,列地址=5BH,字符代码寄存器 0EH 调用显示“产”字子程序 设置页地址=00H,列地址=6AH,字符代码寄存器 0FH 调用显示“品”字子程序 LCD 液晶显示清屏子程序 开 始

LCD 液晶显示初始化子程序:

开 始 分别置 COM=0E2H,复位 COM=0A4H,关闭休闲状态 COM=0A9H,设置占空比 COM=0A0H,正向排序 COM=0C0H,设置显示起始行 COM=0AFH,开显示设置 调用 E1 写指令代码子程序 调用 E2 写指令代码子程序

LCD 显示子程序
开 始

页面地址置 0,列地址置 0 显示数据为“0” N 一页清满 80 个字节吗?
Y

确定字符字模块首地址 取代码 计算字符字模块首地址 取间址寄存器值 取汉字字模数据 写数据
?83?

页面地址加 1 N 满 4 页吗? Y 结束

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 七、实验步骤: 1、设定仿真模式为程序空间在仿真器上,数据空间在用户板上。 2、系统分配给 LCD 的地址为:0FA00H-0FBFFH,0F800H-0F9FFH 3、设计称序并执行,观察结果。 八、思考问题:1、显示“思考问题”字样。2、修改程序,使其上、下、左、右移动。 九、实验程序: ;中文 LCD,参阅书.显示"武汉恒科电子教仪感谢您使用该产品" PD1 EQU 60 ; ;模块参数 COLUMN EQU 30H PAGE1 EQU 31H ;;页地址寄存器 CODE1 EQU 32H ;;字符代码寄存器 COUNT EQU 33H ;;计数器 COM EQU 20H ;;指令寄存器 DAT EQU 21H ;;数据寄存器 CWADD1 EQU 0fa00H ;;写指令代码地址(E1) CRADD1 EQU 0fa80H ;;读状态字地址(E1) DWADD1 EQU 0fa40H ;;写显示数据地址(E1) DRADD1 EQU 0fac0H ;;读显示数据地址(E1) CWADD2 EQU 0f800H ;;写指令代码地址(E2) CRADD2 EQU 0f880H ;;读状态字地址(E2) DWADD2 EQU 0f840H ;;写显示数据地址(E2) DRADD2 EQU 0f8c0H ;;读显示数据地址(E2) ORG 0000H MOV SP,#60H LCALL INT ;;调用初始化子程序 LCALL CLEAR ;;调用清屏子程序 MOV PD1,#3DH ;; MOV PAGE1,#02H ;;页地址寄存器置初值 MOV COLUMN,#0H ;;列地址寄存器置初值 MOV CODE1,#00H ;;字符代码寄存器置初值 LCALL CCW_PR ;;显示“武” MOV PAGE1,#02H MOV COLUMN,#0fH MOV CODE1,#01H LCALL CCW_PR ;;显示“汉” MOV PAGE1,#02H MOV COLUMN,#1eH MOV CODE1,#02H LCALL CCW_PR ;;显示“恒” MOV PAGE1,#2H MOV COLUMN,#2dH MOV CODE1,#03H LCALL CCW_PR ;;显示“科” MOV PAGE1,#2H MOV COLUMN,#61 MOV CODE1,#04H LCALL CCW_PR ;;显示“电” MOV PAGE1,#2H MOV COLUMN,#76 MOV CODE1,#05H LCALL CCW_PR ;;显示“子” MOV PAGE1,#2H MOV COLUMN,#91 MOV CODE1,#06H ?84?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 LCALL CCW_PR MOV PAGE1,#2H MOV COLUMN,#106 MOV CODE1,#07H LCALL CCW_PR MOV PD1,#3DH MOV PAGE1,#00H MOV COLUMN,#0H MOV CODE1,#08H LCALL CCW_PR MOV PAGE1,#00H MOV COLUMN,#0fH MOV CODE1,#09H LCALL CCW_PR MOV PAGE1,#0H MOV COLUMN,#1eH MOV CODE1,#0aH LCALL CCW_PR MOV PAGE1,#0H MOV COLUMN,#2dH MOV CODE1,#0bH LCALL CCW_PR MOV PAGE1,#0H MOV COLUMN,#61 MOV CODE1,#0cH LCALL CCW_PR MOV PAGE1,#0H MOV COLUMN,#76 MOV CODE1,#0dH LCALL CCW_PR MOV PAGE1,#0H MOV COLUMN,#91 MOV CODE1,#0eH LCALL CCW_PR MOV PAGE1,#0H MOV COLUMN,#106 MOV CODE1,#0fH LCALL CCW_PR SJMP $ CCW_PR: MOV DPTR,#CCATB MOV A,CODE1 MOV B,#20H MUL AB ADD A,DPL MOV DPL,A MOV A,B ADDC A,DPH MOV DPH,A PUSH COLUMN PUSH COLUMN MOV CODE1,#00H CCW_1: MOV COUNT,#10H MOV A,PAGE1 ANL A,#03H ;;显示“教"

;;显示“仪" ;; ;;页地址寄存器置初值 ;;列地址寄存器置初值 ;;字符代码寄存器置初值 ;;显示“感”

;;显示“谢”

;;显示“您”

;;显示“使”

;;显示“用”

;;显示“该”

;;显示“产"

;;显示“品" ;;确定字符字模块首地址 ;;取代码 ;;字模块宽度为 32 个字节 ;;代码 X32 ;;字符字模块首地址=字模库首地址+代码 X32

;;列地址入栈 ;;列地址入栈 ;;代码寄存器借用为间址寄存器 ;;计数器设定为 16 ;;读页地址寄存器

?85?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 ORL A,#0B8H ;; “或” 页地址设置代码 MOV COM,A ;;写页地址设置指令 LCALL PR0 LCALL PR3 POP COLUMN ;;取列地址值 MOV A,COLUMN ;;读列地址寄存器 CLR C SUBB A,#PD1 ;;列地址-模块参数 JC CCW_2 ;;<0 为左半屏显示区域(E1) MOV COLUMN,A ;;≥0 为右半屏显示区域(E2) MOV A,PAGE1 SETB ACC.3 ;;设置区域标志位 MOV PAGE1,A ;; “0”为 E1, “1”为 E2 MOV COM,COLUMN ;;设置列地址值 MOV A,PAGE1 ;;判区域标志以确定设置哪个控制器 JNB ACC.3,CCW_3 LCALL PR3 ;;区域 E2 LJMP CCW_4 LCALL PR0 ;;区域 E1 MOV A,CODE1 ;;取间址寄存器值 MOVC A,@A+DPTR ;;取汉字字模数据 MOV DAT,A ;;写数据 MOV A,PAGE1 JNB ACC.3,CCW_5 LCALL PR4 ;;区域 E2 LJMP CCW_6 LCALL PR1 ;;区域 E1 INC CODE1 ;;间址寄存器加 1 INC COLUMN ;;列地址寄存器加 1 MOV A,COLUMN ;;判列地址是否超出区域范围 CJNE A,#PD1,CCW_7 JC CCW_8 ;;未超出则继续 MOV A,PAGE1 ;;超出则判是否在区域 E2 JB ACC.3,CCW_8 ;;在区域 E2 则退出 SETB ACC.3 ;;在区域 E1 则修改成区域 E2 MOV PAGE1,A MOV COM,#00H ;;设置区域 E2 列地址为“0” LCALL PR3 DJNZ COUNT,CCW_4 ;;当页循环 MOV A,PAGE1 ;;读页地址寄存器 JB ACC.7,CCW_9 ;;判完成标志 D7 位, “1”则完成退出 INC A ;;否则页地址加“1” SETB ACC.7 CLR ACC.3 MOV PAGE1,A MOV CODE1,#10H ;;间接寄存器设置为 16 LJMP CCW_1 ;;大循环 RET DB 20H,20H,24H,24H,24H,0E4H,26H,24H ;“武” DB 20H,0FFH,20H,22H,2CH,20H,20H,00H DB 20H,60H,3FH,20H,20H,1FH,11H,11H DB 10H,03H,1CH,20H,40H,80H,0E0H,00H DB 10H,22H,64H,0CH,80H,04H,74H,84H ; “汉” DB 04H,04H,04H,0C4H,3EH,04H,00H,00H
?86?

CCW_2:

CCW_3: CCW_4:

CCW_5: CCW_6:

CCW_7:

CCW_8:

CCW_9: ccAtB:

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 DB DB DB DB DB DB DB DB DB DB db db db db db db db db db db db db db db db db DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB DB 04H,04H,7EH,01H,80H,40H,20H,11H 0AH,04H,0BH,10H,60H,0C0H,40H,00H 80H,70H,00H,0FFH,10H,22H,0F2H,92H ; 92H,92H,92H,92H,0FBH,12H,00H,00H 00H,00H,00H,0FFH,20H,20H,27H,24H 24H,24H,24H,24H,27H,30H,20H,00H 24H,24H,24H,0A4H,0FEH,0A3H,22H,00H ; 24H,48H,00H,0FFH,00H,80H,00H,00H 10H,08H,06H,01H,0FFH,00H,01H,02H 02H,02H,02H,0FFH,01H,01H,01H,00H 00h,0F8h,48h,48h,48h,48h,0FFh,48h 48h,48h,48h,0FCh,08h,00h,00h,00h 00h,07h,02h,02h, 02h,02h,3Fh,42h 42h,42h,42h,47h, 40h,70h,00h,00h 80h,80h,82h,82h,82h,82h,82h,0E2h 0A2h,92h,8Ah,86h,80h,0C0h,80h,00h 00h,00h, 00h,00h,00h,40h,80h,7Fh 00h,00h, 00h,00h,00h,00h,00h,00h 20h,24h,24h,0A4h,0FFh,0A4h,0B4h,0ACh 20h,09Fh,10h,10h,0F0h,18h,10h,00h 02h,12h,51h,90h,7Eh,0Ah,89h,40h 20h,1Bh,04h,1Bh,60h,0C0h,40h,00h 80h,40h,20h,0F8h,07h,00h,38h,0C0h 02h,04h,0Ch,80h,60h,1Ch,00h,00h 00,00,00,0FFh,80h,40h,20h,10h 0Bh,04h,0Ah,11h,60h,0C0h,40h,00h 00H,0FCH,14H,0D4H,54H,54H,54H,0D4H 14H,0FFH,04H,85H,66H,04H,00H,00H 04H,43H,30H,07H,72H,82H,8AH,93H 0B4H,82H,0E1H,12H,24H,64H,07H,00H 40H,42H,0CCH,00H,0FCH,56H,55H,54H 0FEH,24H,20H,20H,0FFH,20H,20H,00H 00H,00H,3FH,52H,2BH,12H,4AH,86H 7FH,01H,46H,80H,7FH,00H,00H,00H 40H,20H,10H,0FCH,23H,10H,8CH,67H 04H,0F4H,04H,44H,94H,8CH,00H,00H 40H,30H,00H,77H,80H,81H,88H,92H 0B4H,83H,80H,0E0H,00H,11H,60H,00H 40H,20H,0F8H,07H,04H,0F4H,14H,14H 14H,0FFH,14H,14H,14H,0F6H,04H,00H 00H,00H,0FFH,00H,80H,43H,45H,29H 19H,17H,21H,21H,41H,0C3H,40H,00H 00H,00H,0FEH,22H,22H,22H,22H,0FEH 22H,22H,22H,22H,0FFH,02H,00H,00H 80H,60H,1FH,02H,02H,02H,02H,7FH 02H,02H,42H,82H,7FH,00H,00H,00H 40H,42H,0C4H,00H,04H,84H,0C4H,0B5H 8EH,84H,84H,64H,04H,06H,04H,00H 00H,00H,7FH,20H,90H,88H,50H,48H 24H,13H,08H,14H,23H,0C0H,00H,00H 00H,08H,08H,88H,98H,0E8H,89H,8EH 88H,0C8H,0A8H,98H,0CCH,88H,00H,00H 80H,40H,30H,0FH,00H,00H,00H,00H 00H,00H,00H,00H,00H,00H,00H,00H

“恒”

“科”

; "电"

;

"子"

; "教"

; "仪"

; "感"

;

"谢"

;

"您"

; "使"

;

"用"

;

"该"

;

"产"

?87?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 DB 00H,00H,00H,7EH,22H,22H,0A2H,22H ; "品" DB 22H,22H,22H,7FH,02H,80H,00H,00H DB 00H,0FFH,41H,41H,41H,41H,0FFH,01H DB 0FFH,41H,41H,41H,41H,0FFH,01H,00H INT: MOV COM,#0E2H ;;初始化子程序,复位 LCALL PR0 LCALL PR3 MOV COM,#0A4H ;;关闭休闲状态 LCALL PR0 LCALL PR3 MOV COM,#0A9H ;;设置 1/32 占空比 LCALL PR0 LCALL PR3 MOV COM,#0A0H ;;正向排序设置 LCALL PR0 LCALL PR3 MOV COM,#0C0H ;;设置显示起始行为第一行 LCALL PR0 LCALL PR3 MOV COM,#0AFH ;;开显示设置 LCALL PR0 LCALL PR3 RET CLEAR: MOV R4,#00H ;;清屏子程序,页面地址暂存器设置 CLEAR1: MOV A,R4 ;;取页地址值 ORL A,#0B8H ;; “或” 页面地址设置代码 MOV COM,A ;;页面地址设置 LCALL PR0 LCALL PR3 MOV COM,#00H ;;列地址设置为“0” LCALL PR0 LCALL PR3 MOV R3,#50H ;;一页清 80 个字节 CLEAD2: MOV DAT,#00H ;;显示数据为“0” LCALL PR1 LCALL PR4 DJNZ R3,CLEAD2 ;;页内字节清零循环 INC R4 ;;页地址暂存器加 1 CJNE R4,#04H,CLEAR1 ;;RAM 区清零循环 RET PR0: PUSH DPL ;;写指令代码子程序(E1) PUSH DPH MOV DPTR,#CRADD1 PR01: MOVX A,@DPTR JB ACC.7,PR01 MOV DPTR,#CWADD1 MOV A,COM MOVX @DPTR,A POP DPH POP DPL RET PR1: PUSH DPL ;;写显示数据子程序(E1) PUSH DPH MOV DPTR,#CRADD1
?88?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 PR11: MOVX A,@DPTR JB ACC.7,PR11 MOV DPTR,#DWADD1 MOV A,DAT MOVX @DPTR,A POP DPH POP DPL RET PUSH DPL ;;读显示数据子程序(E1) PUSH DPH MOV DPTR,#CRADD1 MOVX A,@DPTR JB ACC.7,PR21 MOV DPTR,#DRADD1 MOVX A,@DPTR MOV DAT,A POP DPH POP DPL RET PUSH DPL ;;写指令代码子程序(E2) PUSH DPH MOV DPTR,#CRADD2 MOVX A,@DPTR JB ACC.7,PR31 MOV DPTR,#CWADD2 MOV A,COM MOVX @DPTR,A POP DPH POP DPL RET PUSH DPL ;;写显示数据子程序(E2) PUSH DPH MOV DPTR,#CRADD2 MOVX A,@DPTR JB ACC.7,PR41 MOV DPTR,#DWADD2 MOV A,DAT MOVX @DPTR,A POP DPH POP DPL RET PUSH DPL ;;读显示数据子程序(E2) PUSH DPH MOV DPTR,#CRADD2 MOVX A,@DPTR JB ACC.7,PR21 MOV DPTR,#DRADD2 MOVX A,@DPTR MOV DAT,A POP DPH POP DPL RET end

PR2:

PR21:

PR3:

PR31:

PR4:

PR41:

PR5:

PR51:

?89?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

实验十六

点阵 LED 广告屏实验

一、实验目的:掌握点阵 LED 的原理和程序设计方法;掌握 74LS164 扩展并口的方法。 二、实验内容:在点阵 LED 上显示“5” 三、实验器材:1、超想-3000TC 综合实验仪 1 台 2、连线 若干根 3、KEIL 仿真器 四、接线方案:

1 台

五、程序框图:
六、实验步骤: 1、设定仿真模式为程序空间在仿真器上,数据空间在用户板上。 2、 “译码器”YC2(0A000H)孔连“点阵 LED”左侧 CS0 孔,“系统资源区”中 P1.1 孔连 SIN 孔,P1.0 孔连 CIN 孔。 3、设计程序,调试并通过。 七、实验程序: (51asm\Bled.ASM) ;实验连线:P1.0------CIN ; P1.1-----SIN;CS0-----YC2 开 始 CLK EQU P1.0 DINA EQU P1.1 MIAN: MOV SP,#60H 设数据工作方式 CLR C SEND1: MOV R0,#080H 设置显示行指针 MOV DPTR,#CODEd1 SEND: CLR A MOVC A,@A+DPTR 设置代码指针 push dph push dpl 取代码 mov dptr,#0a000h MOVX @dptr,a MOV A,R0 从 P1.0 口发送 ACALL sendto pop dpl 代码指针加 1 pop dph INC DPTR N Y MOV A,R0 显示行指针加 1=0? RRC A
?90?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 MOV R0,A LCALL DELAY JB ACC.0, SEND1 SJMP SEND MOV R7,#01 MOV R4,#40 MOV R3,#28 DJNZ R3,$ DJNZ R4,DELAY1 DJNZ R7,DELAY0 RET DB 03eh,063h,003h,07Eh,060h,060h,07fh,000H ;"5

DELAY: DELAY0: DELAY1:

CODEd1: sendto:

PUSH ACC CLR CLK SENDTIME: MOV R3,#08H MOV A,R0 clr c SENDCY: RLC A MOV DINA,C SETB CLK CLR CLK DJNZ R3,SENDCY POP A CC RET end

实验十七

红外线遥控实验

一、实验目的:1、了解红外遥控电路的原理,及编码方法。 2、了解远程控制的一般原理和方法。 3、学习如何编写红外发射和接收程序。 4、了解单片机控制外部设备的常用电路。 二、实验内容:利用超想-3000TC 综合实验仪上的红外线接收、发送器件,编写程序发送和接红外信号,实现 近距离的无线通信。 三、实验器材:1、超想-3000TC 综合实验仪 2 台 3、KEIL 仿真器 四、实验说明: 红外遥控为现在最常用的近距离无线通信方式,它是将数字信号用红外线发送出去。为了让受控设备能识 别信号,要将数字信号编码,现今红外有很多编码标准,常见有 PHILIPS 的 RC5 格式和 NEC 格式。本实验为了 简化,采用我们自己设计的一种编码方式。下面将详细说明。 在普通场合,有很多红外发射源,有白炽灯、日光、发热体,这些都会干扰红外信号,所以在发射时,还 要将数字脉冲信号调制在 30K-40K 的载波上,以抑制这些红外干扰。本实验采用最常用的 38K 载波。为了抗干 扰,还可以在接收处适当地加一些隔离。本实验接收部分采用的是一体化接收头,将信号解调和放大全部做在
?91?

2、连线

若干



2 台

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 一起,提高了可靠性。这样,接收头送到单片机的就是编码的数据信号,而不是调制信号,数据的解码通过单 片机来完成。 本实验使用的编码包括四部分:引导码,4 位数据码,4 位数据反码和数据间隔。引导码用于标识一个数据 的开始,数据码为有效数据,数据反码是将有效数据取反后编码,用于提高数据的识别率。 引导码由 5ms 低电平和 5ms 的高电平组成,数字位‘0’由 1ms 低电平和 1ms 高电平组成,数字位‘1’由 1ms 低电平和 3ms 高电平组成。数据间隔为 20ms。 引导码 4 位数据码 4 位数据反码 数据间隔

编码格式 1ms 1ms 1ms 3ms

位‘0’ 引导码 1 4 位数据码 0 0 1 0

位‘1’ 4 位数据反码 1 1 0

数据‘9’的实际编码波形

38K 载波

数据‘9’带载波发送时波形

在用脉冲控制红外发射管时,是低电平有效,即当输出低电平时,红外管导通发光。单片机输出的脉冲信 号被反向驱动后,驱动红外管产生脉冲信号。 接收红外编码信号时,判断信号变化时间长短,就可以对信号进行译码,得到对方发过来的数据。 五、接线方案:

?92?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 六、程序框图:这里只给出红外发送和接收的子程序框图,有关键盘和显示的程序框图请参见相关部分。 红外接收子程序 发送子程序 等待低电平 发 5ms 载波信号 否 测低电平宽度 是否有效? 是 测高电平宽度 否 是否有效? 是 是 设接收数据状态 设时间 1ms

发 5ms 无载波信号

发 1ms 载波信号 数据移位

数据位为 0 否 设时间 3ms

测低电平宽度 否 否 是否有效?
已收到 8 位?

发无载波信号 否 8 位发完? 是 发 1ms 载波信号



测高电平宽度 是

状态加 1

是位‘0’? 否

保存数据位 是 否
数据校验正确?

发 20ms 无载波信号 信号 返回 红外发射子程序框图

是位 ‘1’ ? 否 设出错标记

是 保存数据 返回

七、实验步骤: 1、本实验需要两台实验系统:一台发送,另一台接收。 2、设定工作模式为程序空间在仿真器上,数据空间在用户板上。 3、P1.5 孔经反向器后接 H/S 孔 , P1.6 孔接 H/R 孔。 4、设计程序,调试并通过。 八、实验程序: OUTBIT equ 0e101h ; 位控制口 CLK164 equ 0e102h ; 段控制口(接 164 时钟位) DAT164 equ 0e102h ; 段控制口(接 164 数据位) IN equ 0e103h ; 键盘读入口 ; 脉冲宽度下限 ldhmin equ 0cbh ldlmin equ 0cbh p0hmin equ 0f3h
?93?

红外接收子程序框图

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 p0lmin equ 0f3h p1hmin equ 0deh ; 脉冲宽度上限 ldhmax equ 0d0h ldlmax equ 0d0h p0hmax equ 0f9h p0lmax equ 0f9h p1hmax equ 0e3h ; 发送信号时载波信号宽度 send5 equ 192 send1 equ 38 send3 equ 115 LEDBuf equ 60h ; 显示缓冲 status equ 70h rcvdat equ 71h snddat equ 72h vldmin equ 73h vldmax equ 74h hasdat equ 75h org 0000h ljmp Start LEDMAP: ; 八段管显示码 db 3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 07h db 7fh, 6fh, 77h, 7ch, 39h, 5eh, 79h, 71h Delay: ; 延时子程序 mov r7, #10h DelayLoop: djnz r7, DelayLoop call ir_receive djnz r6, DelayLoop ret DisplayLED: mov r0, #LEDBuf mov r1, #6 ; 共 6 个八段管 mov r2, #00100000b ; 从左边开始显示 Loop: mov dptr, #OUTBIT mov a, #0 movx @dptr, a ; 关所有八段管 mov a, @r0 mov B, #8 ; 送 164 DLP: rlc a mov r3, a mov acc.0, c mov dptr, #DAT164 anl a,#0fdh movx @dptr, a mov dptr, #CLK164 orl a,#02h movx @dptr, a anl a,#0fdh movx @dptr, a mov a, r3 djnz B, DLP mov dptr, #OUTBIT ?94?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov a, r2 movx @dptr, a ; 显示一位八段管 mov r6, #1 call Delay mov a, r2 ; 显示下一位 rr a mov r2, a inc r0 djnz r1, Loop ret TestKey: mov dptr, #OUTBIT mov a, #0 movx @dptr, a ; 输出线置为 0 mov dptr, #IN movx a, @dptr ; 读入键状态 cpl a anl a, #0fh ; 高四位不用 ret KeyTable: ; 键码定义 db 00h, 01h, 04h, 07h db 0fh, 02h, 05h, 08h db 0eh, 03h, 06h, 09h db 0dh, 0ch, 0bh, 0ah db 10H,10H,10H,10H,10H db 10H,10H,10H,10H,10H GetKey: MOV 13H,#06H MOV 12H,#20H Key2: MOV A,12H CPL A MOV R7,A MOV DPTR,#0E101H MOV A,R7 MOVX @DPTR,A MOV A,12H CLR C RRC A MOV 12H,A MOV DPTR,#0E103H MOVX A,@DPTR MOV R7,A MOV A,R7 CPL A MOV R7,A MOV A,R7 ANL A,#0FH MOV 14H,A DEC 13H MOV R7,13H MOV A,R7 JZ Key1 MOV A,14H JZ Key2 Key1 : MOV A,14H JZ GetKey6 MOV A,13H
?95?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 ADD A,ACC ADD A,ACC MOV 13H,A MOV A,14H JNB ACC.1,GetKey1 INC 13H SJMP GetKey3 MOV A,14H JNB ACC.2,GetKey2 INC 13H INC 13H SJMP GetKey3 MOV A,14H JNB ACC.3,GetKey3 MOV A,#03H ADD A,13H MOV 13H,A MOV DPTR,#0E101H CLR A MOVX @DPTR,A MOV R7,#0AH LCALL Delay LCALL TestKey MOV A,R7 JNZ GetKey4 MOV R7,13H MOV A,R7 MOV DPTR,#KeyTable MOVC A,@A+DPTR MOV R2,A RET MOV R2,#0FFH RET mov clr movx mov call call jnz mov ret dptr, #OUTBIT ; 等键释放 a @dptr, a r6, #10 Delay TestKey WaitRelease a, r2

GetKey1:

GetKey2:

GetKey3:

GetKey4:

GetKey6: WaitRelease:

TestLow: ; 检测低电平宽度 mov r7,#0 waithigh0: mov r6,#0bh waithigh: jb p1.6, lowwidth djnz r6,waithigh djnz r7,waithigh0 mov r7,#0 ; 出错 lowwidth: mov a,r7 ret TestHigh: ; 检测高电平宽度
?96?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov r7,#0 waitlow0: mov r6,#0bh waitlow1: ;movx a, @dptr jnb p1.6, highwidth djnz r6, waitlow1 djnz r7, waitlow0 mov r7,#0 highwidth: mov a,r7 ret TestValid: cjne a,vldmin,vt01 jmp valid vt01: jnc vt02 jmp invalid vt02: cjne a,vldmax,vt03 jmp valid vt03: jnc invalid jmp valid invalid: setb c ret valid: clr c ret ir_receive: push psw setb rs0 jnb p1.6, lead_l pop psw ret lead_l: call TestLow mov vldmin,#ldlmin mov vldmax,#ldlmax call TestValid jnc lead_h jmp error lead_h: call TestHigh mov vldmin,#ldhmin mov vldmax,#ldhmax call TestValid jnc pulse_l jmp error pulse_l: mov status,#1 pulse_t: call TestLow mov vldmin,#p0lmin mov vldmax,#p0lmax

; 出错

; 脉冲是否在有效范围内 ; A = #min ; A > #min ; A < #min

; A = #max ; A > #max ; A < #max

; 红外接收

; 是否有红外信号? ; 无,则退出

; 引导码低电平

; 引导码高电平

; 开始接收数据码 ; 数据码低电平

?97?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 call TestValid jnc Its0L jmp error Its0L: call mov mov call jnc jmp Its0H: mov rrc mov inc mov cjne jmp next5: mov mov call jnc jmp Its1H: setb c jmp Its0H process: ; 对收到的数据进行校验 push b mov a,rcvdat mov b,a anl b,#0fh anl a,#0f0h swap a xrl a,b pop b cjne a,#0fh,error mov a,rcvdat anl a,#0fh mov hasdat,#1 pop psw ret error: ; 出错退出 pop psw ret carrier0: setb p1.5 ;发送载波信号 ,p1.5 = 发送脚 nop nop nop nop nop clr p1.5 ret carrier1: clr p1.5 ;发送载波信号 ,p1.5 = 发送脚 ?98? vldmin,#p1hmin vldmax,#p1hmax TestValid Its1H error a,rcvdat a rcvdat,a status a,status a,#9, pulse_t process ; 数据码移位到缓冲 TestHigh vldmin,#p0hmin vldmax,#p0hmax TestValid Its0H next5 ; 数据码高电平

; '0'数据位的高电平?

; 是否已收到 8 位数据

; '1'数据位的高电平?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 nop nop nop nop nop clr p1.5 ret ir_send: mov r0,#send5 leaderh: call carrier0 djnz r0,leaderh mov r0,#send5 leaderl: call carrier1 djnz r0,leaderl mov status,#0 sendp: mov r0, #send1 sp0: call carrier0 djnz r0, sp0 mov a, snddat mov r0, #send1 rrc a mov snddat,a jnc sp2 mov r0, #send3 sp2: call carrier1 djnz r0, sp2 inc status mov a, status cjne a,#8, sendp mov r0, #send1 sp3: call carrier0 djnz r0, sp3 mov r0,#0 mov r1,#3 sp4: call carrier1 djnz r0, sp4 djnz r1, sp4 ret Start: mov sp, #40h mov dptr,#0e100h mov a,#03h movx @dptr,a mov LEDBuf, #0ffh mov LEDBuf+1, #0ffh mov LEDBuf+2, #0ffh mov LEDBuf+3, #0ffh mov LEDBuf+4, #0 mov LEDBuf+5, #0 ; 引导码低电平 ; 发载波信号 ; 引导码高电平 ; 无载波信号 ; 准备发数据位 ; 数据码低电平 ; 发载波信号

; '0'数据位高电平

; '1'数据位高电平 ; 无载波信号

; 8 位数据已发完 ; 发停止位

; 数据间的间隔

; 显示 8.8.8.8.

?99?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 mov MLoop: mov jnz call call jz call anl mov cpl anl swap orl mov call ljmp show_dat: mov mov mov anl mov movc mov ljmp end a,hasdat show_dat DisplayLED TestKey MLoop GetKey a, #0fh b, a a a,#0fh a a,b snddat,a ir_send MLoop hasdat,#0 LEDBuf+4,#0 a, rcvdat a,#0fh dptr, #LEDMap a, @a+dptr LEDBuf+5, a MLoop hasdat, #0

; ; ; ; ; ;

显示 有键入? 无键入, 继续显示 读入键码 显示键码 将键码编码

; 红外发送

实验十八

PWM 实验

一、实验内容:固定周期内,改变脉宽(即修改其占空间比) ,再经外部积分电路形成直流电压,从而实现对 电机的速度控制。 二、实现连线:PIN 接 P1.1;POUT 接 DCIN;CKM 接 P3.2。 三、实现框图: 四、实验程序: ORG 0000H SJMP INI INI: NOP MOV TMOD,#02H MOV TH0,#0FEH MOV TL0,#0FEH MOV IE,#02H SETB TR0 SETB P1.1 SETB 00H MOV R4,#0FEH MOV R1,#80H SJMP MAIN MAIN: MOV A,R4
?100?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 CLR P1.1 MOV R6,A DJNZ R6,$ SETB P1.1 MOV A,R4 CPL A MOV R6,A DJNZ R6,$ DJNZ R1,MAIN DEC R4 MOV R1,#80H AJMP MAIN END

实验十九

继电器控制实验

一、实验目的:掌握用继电器的基本方法和编程。 二、实验内容:利用 P1 口输出高低电平,控制继电器的开合,以实现对外部装置的控制。 三、实验预备知识 现代自动化控制设备中都存在一个电子与电气电路的互相联结问题,一方面要使电子电路的控制信号能够 控制电气电路的执行元件(电动机,电磁铁,电灯等),一方面又要为电子电路的电气电路提供良好的电隔离, 以保护电子电路和人身的安全,电子继电器便起到这一桥梁作用。 本实验采用 JQU-3F 型继电器,其控制电压为+5V。 四、实验步骤 “系统资源区”的 P1.0 接 Con 端,继电器的 In 接 VCC,编制程序,使 P1.0 电平变化,高电平时继电器吸合, 常开触点接上,双色灯亮绿灯,低电平时继电器不工作,常闭触点闭合,亮红灯。 五、实验程序: AA:clr p1.0 mov r0,#10h call DELY call DELY NOP setb p1.0 call DELY call DELY SJMP AA DELY: MOV R5,#02H ;延时 DELY1: MOV R7,#00H DELY2: DJNZ R7,DELY2 DJNZ R6,DELY2 djnz r5,DELY2 RET END

?101?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

第?节
“扩展性”实验(选配)
实验一 数字温度计实验
将扩展板插在实验箱上,具体实验步骤: 一、实验连线: 1、将扩展板上的 S1 管脚接实验箱 P1.0 即可; 2、输入程序,编译,全速运行; 3、在热敏元件表面加温。 二、实验内容:通过温度传感器,改变热敏电阻,使当前温度通过数码管显示。 三、实验程序: /* 实验 DS18b20 温度传感器 p1.0 作为数据传输口,晶振:11.0592M */ #include<absacc.h> #include<reg51.H> #define LEDLen 6 #define mode 0x03; #define CAddr XBYTE[0xe100]/* 控制字地址 */ #define OUTBIT XBYTE[0xe101]/* 位控制口 */ #define CLK164 XBYTE[0xe102]/* 段控制口(接 164 时钟位) */ #define DAT164 XBYTE[0xe102] /* 段控制口(接 164 数据位) */ #define IN XBYTE[0xe103] /* 键盘读入口 */ unsigned char disp0, disp1, disp2, disp3; unsigned char LEDBuf[LEDLen]; /* 显示缓冲 */ code unsigned char LEDMAP[] = { /* 八段管显示码 */ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71}; sbit DQ = P1^0; void Delay_Led(unsigned char CNT) { unsigned char i; while (CNT-- !=0) for (i=100; i !=0; i--); } void DisplayLED() { unsigned char i, j; unsigned char Pos; unsigned char LED; Pos = 0x20; /* 从左边开始显示 */ for (i = 0; i < LEDLen; i++) { OUTBIT = 0; /* 关所有八段管 */ LED = LEDBuf[i]; for (j = 0; j < 8; j++) /*送 164*/ { if (LED & 0x80) DAT164 = 1; else DAT164 = 0; CLK164 = CLK164|0x02; CLK164 = CLK164&0xfd; LED <<= 1; } OUTBIT = Pos; /* 显示一位八段管 */ Delay_Led(1); ?102?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 Pos >>= 1; } OUTBIT = 0; /* 显示下一位 */ /* 关所有八段管 */

} /*DS18b20 温度传感器读写程序(c51 版)*/ void delay(int us) { int s; for ( s=0; s<us; s++); } void rst(void) { DQ = 1; delay(2); DQ = 0; delay(30); //精确延时 480~960us DQ = 1; delay(8); } unsigned int read(void) { int i=0; unsigned int u=0; for (i=0;i<16;i++) { DQ = 0; u >>= 1; DQ = 1; if(DQ) u|= 0x8000; delay(4); } return(u); } void write(unsigned char ku) { int i = 0; for (i=0;i<8;i++) { DQ = 0; DQ = ku&0x01; delay(3); DQ = 1; ku >>= 1; } } void read0(void) { int t0,t1,t2; unsigned int tp; unsigned int lsb; rst(); write(0xCC); write(0x44); rst(); write(0xCC); write(0xBE); tp = read(); lsb = (unsigned int)(tp*6.25);
?103?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 t0 = lsb/1000; disp0 = LEDMAP[t0]; //第 1 位,最高位 if(!t0) disp0 = 0xff; t2 = lsb%1000; t1 = t2/100; disp1 = LEDMAP[t1]&0x7f; //第 2 位 t1 = t2%100; t2 = t1/10; disp2 = LEDMAP[t2]; //第 3 位,最低位 disp3 = LEDMAP[t1%10]; //第 4 位,最低位 } void main() { unsigned char j; CAddr = mode; while(1) { read0(); LEDBuf[0] = 0; LEDBuf[1] = 0; LEDBuf[2] = disp0; LEDBuf[3] = disp1 + 0x80;//'.' LEDBuf[4] = disp2; LEDBuf[5] = disp3; for(j=0; j<30; j++) DisplayLED(); /* 延时 */ for(j=0; j<30; j++) DisplayLED(); /* 延时 */ for(j=0; j<30; j++) DisplayLED(); /* 延时 */ } }

实验二 数字语音录放实验
一、实验目的:掌握最新的 ISD4000 系列语音芯片和 MCS-51 单片机 AT89S51 的结合,可供学生开发各种最新 的智能型数码语音产品。 二、实验内容:利用 P1 口输出高低电平,控制 ISD4000 系列语音芯片的开发,以实现录音和放音控制实验。 三、实验原理:ISD4002 系列单片语音录放电路 1、简述 1)单片 2 至 4 分钟语音录放 2)内置微控制器串行通信接口 3)3V 单电源工作 4)多段信息处理 5)工作电流 25-30mA,维持电流 1μ A 6)不耗电信息保存 100 年(典型值) 7)高质量、自然的语音还原技术 8)10 万次录音周期(典型值) 9)自动静噪功能 10)片内免调整时钟,可选用外部时钟 Winbond 公司的 ISD 系列语音芯片采用了“直接模拟量存储”(DAST)专利技术,信号无需经过 D/A,A/D 转换,数字压缩和语音合成等复杂的数字信号处理过程,减少了失真,使其声音存贮效果较以前产品有大幅提 高,实际试听主观评价可以达到磁带录音机的水平,是目前市场上录放效果最好的语音电路之一。 ISD4004 系列工作电压 3V,单片录放时间 8 至 16 分钟,音质好,适用于移动电话及其他便携式电子产品 中。芯片采用 CMOS 技术,内含振荡器、防混淆滤波器、平滑滤波器、音频放大器、自动静噪及高密度多电平 闪烁存贮陈列 。 芯片设计是基于所有操作必须由微控制器控制, 操作命令可通过串行通信接口(SPI 或 Microwire) 送入。芯片采用多电平直接模拟量存储技术, 每个采样值直接存贮在片内闪烁存贮器中,因此能够非常真实、 自然地再现语音、音乐、音调和效果声,避免了一般固体录音电路因量化和压缩造成的量化噪声和"金属声"。
?104?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 采样频率可为 4.0,5.3,6.4,8.0kHz,频率越低,录放时间越长,而音质则有所下降,片内信息存于闪烁存贮 器中,可在断电情况下保存 100 年(典型值),反复录音 10 万次。 2、引脚描述 电源:(VCCA,VCCD) 为使噪声最小,芯片的模拟和数字电路使用不同的电源总线,并且分别引到外封装 的不同管脚上,模拟和数字电源端最好分别走线,尽可能在靠近供电端处相连,而去耦电容应尽量靠近器件。 地线:(VSSA,VSSD) 芯片内部的模拟和数字电路也使用不同的地线。 同相模拟输入(ANA IN+) 这是录音信号的同相输入端。输入放大器可用单端或差分驱动。单端输入时,信 号由耦合电容输入,最大幅度为峰峰值 32mV,耦合电容和本端的 3KΩ 电阻输入阻抗决定了芯片频带的低端截 止频率。差分驱动时,信号最大幅度为峰峰值 16mV,为 ISD33000 系列相同。 反相模拟输入(ANA IN-) 差分驱动时,这是录音信号的反相输入端。信号通过耦合电容输入,最大幅度为 峰峰值 16mV, 音频输出(AUD OUT) 提供音频输出, 可驱动 5KΩ 的负载。片选(SS) 此端为低, 即向该 ISD4004 芯片发送指令,两条指令之间为高电平。 串行输入(MOSI) 此端为串行输入端,主控制器应在串行时钟上升沿之前半个周期将数据放到本端, 供 ISD 输入。 串行输出(MISO) ISD 的串行输出端。ISD 未选中时,本端呈高阻态。 串行时钟(SCLK) ISD 的时钟输入端, 由主控制器产生, 用于同步 MOSI 和 MISO 的数据传输 。 数据在 SCLK 上升沿锁存到 ISD,在下降沿移出 ISD。 中断(/INT) 本端为漏极开路输出。ISD 在任何操作(包括快进)中检测到 EOM 或 OVF 时, 本端变低并保持。 中断状态在下一个 SPI 周期开始时清除。中断状态也可用 RINT 指令读取。OVF 标志----指示 ISD 的录、放操作 已到达存储器的未尾。EOM 标志----只在放音中检测到内部的 EOM 标志时,此状态位才置 1。 行地址时钟(RAC) 漏极开路输出。每个 RAC 周期表示 ISD 存储器的操作进行了一行(ISD4004 系列中的存 贮器共 2400 行)。该信号 175ms 保持高电平,低电平为 25ms。快进模式下,RAC 的 218.75μ s 是高电平,31.25 μ s 为低电平。该端可用于存储管理技术。 外部时钟(XCLK) 本端内部有下拉元件。芯片内部的采样时钟在出厂前已调校,误差在 +1%内。商业级芯 片在整个温度和电压范围内, 频率变化在+2.25%内。工业级芯片在整个温度和电压范围内, 频率变化在-6/+4% 内,此时建议使用稳压电源。若要求更高精度,可从本端输入外部时钟(如前表所列)。由于内部的防混淆及平 滑滤波器已设定,故上述推荐的时钟频率不应改变。输入时钟的占空比无关紧要,因内部首先进行了分频。在 不外接地时钟时,此端必须接地。 自动静噪(AMCAP) 当录音信号电平下降到内部设定的某一阈值以下时,自动静噪功能使信号衰弱,这样 有助于养活无信号(静音)时的噪声。通常本端对地接 1mF 的电容,构成内部信号电平峰值检测电路的一部分。 检出的峰值电平与内部设定的阈值作比较,决定自动静噪功能的翻转点。大信号时,自动静噪电路不衰减,静 音时衰减 6dB。1mF 的电容也影响自动静噪电路对信号幅度的响应速度。本端接 VCCA 则禁止自动静噪。 3、SPI(串行外设接口) ISD4004 工作于 SPI 串行接口。SPI 协议是一个同步串行数据传输协议, 协议假定微控制器的 SPI 移位寄存 器在 SCLK 的下降沿动作,因此对 ISD4004 而言,在时钟止升沿锁存 MOSI 引脚的数据,在下降沿将数据送至 MISO 引脚。协议的具体内容为: 1)所有串行数据传输开始于 SS 下降沿。 2)SS 在传输期间必须保持为低电平,在两条指令之间则保持为高电平。 3)数据在时钟上升沿移入,在下降沿移出。 4)SS 变低,输入指令和地址后,ISD 才能开始录放操作。 5)指令格式是(8 位控制码)加(16 位地址码)。 6)ISD 的任何操作(含快进)如果遇到 EOM 或 OVF,则产生一个中断,该中断状态在下一个 SPI 周期开始 时被清除。 7)使用"读"指令使中断状态位移出 ISD 的 MISO 引脚时,控制及地址数据也应同步从 MOSI 端移入。因此 要注意移入的数据是否与器件当前进行的操作兼容。当然,也允许在一个 SPI 周期里,同时执行读状态和开始 新的操作(即新移入的数据与器件当前的操作可以不兼容)。 8)所有操作在运行位(RUN)置 1 时开始,置 0 时结束。 9)所有指令都在 SS 端上升沿开始执行。
?105?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 ①信息快进 用户不必知道信息的确切地址, 就能快进跳过一条信息 。 信息快进只用于放音模式 。 放音速度是正常的 1600 倍,遇到 EOM 后停止,然后内部地址计数器加 1,指向下条信息的开始处。 ②上电顺序 器件延时 TPUD(8kHz 采样时, 约为 25 毫秒)后才能开始操作 。 因此, 用户发完上电指令后, 必须等待 TPUD, 才能发出一条操作指令。 例如,从 00 从处发音,应遵循如下时序: 1.发 POWERUP 命令; 2.等待 TPUD(上电延时); 3.发地址值为 00 的 SETPLAY 命令; 4.发 PLAY 命令。 器件会从此 00 地址开始放音,当出现 EOM 时,立即中断,停止放音。 如果从 00 处录音,则按以下时序: 1.发 POWER UP 命令; 2.等待 TPUD(上电延时); 3.发 POWER UP 命令 4.等待 2 倍 TPUD; 5.发地址值为 00 的 SETREC 命令; 6.发 REC 命令。 器件便从 00 地址开始录音,一直到出现 OVF(存贮器末尾)时,录音停止。指令表
指令 8 位控制码<16 位地址> POWERUP 00100XXX<XXXXXXXXXXXXXXXX> SET PLAY 11100XXX< A15-A0> PLAY 11110XXX< XXXXXXXXXXXXXXXX > SET REC 10100XXX<A15 -A0> REC 10110XXX< XXXXXXXXXXXXXXXX > SET MC 11101XXX<A15 -A0> MC 11111XXX< XXXXXXXXXXXXXXXX > STOP 0X110XXX< XXXXXXXXXXXXXXXX > STOP WRDN 0X01XXXX< XXXXXXXXXXXXXXXX > RINT 0X110XXX< XXXXXXXXXXXXXXXX > 操作摘要 上电:等待 TPUD 后器件可以工作 从指定地址开始放音。后跟 PLAY 指令可使放音继续进行下去 从当前地址开始放音(直至 EOM 或 OVF) 从指定地址开始录音。后跟 REC 指令可使录音继续进行下去 从当前地址开始录音(直至 OVF 或停止) 从指定地址开始快进。后跟 MC 指令可使快进继续进行下去 执行快进,直到 EOM.若再无信息,则进入 OVF 状态 停止当前操作 停止当前操作并掉电 读状态:OVF 和 EOM

注:快进只能在放音操作开始时选择。 (三)SPI 端口的控制位 MISO
OVF EOM C2 C2 P0 C1 P1 C0 P2 0 P3 P4 A9 P5 A8 P6 A7 P7 A6 P8 A5 P9 A4 X A3 0 A2 0 A1 0 A0

MOSI
C4

C0——信息指示位 C1——忽视地址位 C2——电源上电位 C3——放音/录音位 C4——运行位 (四)SPI 控制寄存器 SPI 控制寄存器控制器件的每个功能,如录放、录音、信息检索(快进)、上电/掉电、开始和停止操作、忽 略地址指针等。详见下表:
位 RUN = = P/-R = = = MC = = 值 1 0 1 0 1 0 功 能 允许/禁止操作 开始 停止 录/放模式 放音 录音 快进模式 允许快进 禁止 位 PU = = IAB = = P15-P0 A15-A0 ?106? 值 1 0 1 0 功 能 电源控制 上电 掉电 操作是否使用指令地址 忽略输入地址寄存的内容 使用输入地址寄存的内容 行指针寄存器输出 输入地址寄存器

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 注:IAB 置 0 时,录、放操作从 A9-A0 地址开始。为了能连贯地录、放到后续的存储空间,在操作到达该 行末之前,应发出第二个 SPI 指令将 IAB 置 1,否则器件在同一地址上反复循环。这个特点对语音提示功能很 有用。RAC 脚和 IAB 位可用于信息管理。SPI 端口简单框图如下: 4、时序 SPI 时序参数
Symbol TSSS TSSH TDIS TDIH TPD TDF TSSmin TSCKhi TSCKlow F0 Parameters /SS Setup Time /SS Hold Time Data in Setup Time Data in Hold Time Output Delay Output Delay to Hiz /SS HIGH SCLK High Time SCLK Low Time CLK(Frequency) Min 500 500 200 200 Typ Max Units nsec nsec nsec nsec nsec nsec μsec nsec nsec kHz

500 500 1 400 400 1000

注意一:国内用户多习惯使用 8031 系列芯片,与 ISD33000、4000 系列均可以方便地连接,ISD 芯片需要 3V 稳压电源,信号线可直接使用 5V 电平。 注意二:ISD4004 的控制方式与 ISD33000 系列完全相同,可相互参阅。 ISD4002/4003/4004 芯片参数表
型号 存储时间(秒) 可分段数 信息分辨率 (毫秒) 采样频率(HZ) 滤波器带宽(HZ) ISD4002-120 120 600 200 8.0K 3.4K ISD4002-180 180 600 300 5.3k 2.3k ISD4002-240 240 600 400 4.0k 1.7k ISD4003-04 240 1200 200 8.0K 3.4K ISD4003-06 360 1200 300 5.3K 2.3K ISD4003-08 480 1200 400 4.0K 1.7K ISD4004-08 480 2400 200 8.0K 3.4K ISD4004-16 960 2400 400 4.0K 1.7K 以上芯片由 ISD3340K 编程拷贝机编程、拷贝 控制码+地址位 5+11 5+11 5+11 5+11 5+11 5+11 8+16 8+16

四、实验步骤 1、录音操作:将语音模块板插入用户板的扩展槽中,连接好仿真器,打开实验箱电源把源程序运行起了,将 语音实验区的开关上拨,这时系统是录音状态,按住 AN 键,指示灯亮即可对板上的话筒讲话录音,松键时录音停 止并形成一段,在按则录音下一段, 按 STOP 键为复位,在录音时又从第一段开始。 2、放音操作:将开关拨到下方是放音状态,按一下 AN 键即可播放一段录音,一段结束后自动停止放音,在 按 AN 则播放下一段,按 STOP 键为复位,在放音时又从第一段开始 五、实验程序: SS EQU P1.0 ;片选 SCLK EQU P1.1 ;ISD4003 时钟 MOSI EQU P1.2 ;数据输入 MISO EQU P1.3 ;数据输出 LED EQU P1.7 ;指示灯 INT EQU INT0 ;中断 AN EQU P1.6 ;执行 STOP EQU P1.5 ;复位 PR EQU P1.4 ;PR=1 录营 PR=0 放音 ORG 0000H ; AJMP MAIN ; MAIN: MOV SP,#10H ; MOV P1,#0FFH ; MOV P2,#0FFH ; MOV P3,#0FFH ; MOV P0,#0FFH ; CLR EA ; MAII : SETB LED ;关指示灯 CALL DSTOP ;ISD 掉电 MASO: MOV 3AH,#200 ;等待 AN 键 MAS1: JB AN,MASO ;
?107?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 DJNZ 3AH,MAS1 ; ACALL UP ;ISD 上电 MOV 20H,#00H ;ISD 低位地址 MOV 21H,#00H ;ISD 高位地址 JB PR,REC ;PR=1 录音 AJMP PLAY ;PR=0 放音 ;SETREC 16 位 ; 从指定地址录音 10100《X A9 A8 A7 A6 A5 A4 A3 A2 A2 A1 A0》 REC: MOV A,20H ;发地址 A7-A0 ACALL ISDX ; MOV A,21H ;发地址 A9-A8 SETB ACC.7 ; CLR ACC.6 ; SETB ACC.5 ; CLR ACC.4 ; CLR ACC.3 ; ACALL ISDX ; SETB SS ;关片选 ;从当前地址录音 10110《X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0》 REC1: MOV 36H,#10 ; REC2: ACALL YS50 ;延时录音 DJNZ 36H,REC2 ; CLR LED ;开指示灯 MOV A,#0B0H ;发 1011 0XXX ACALL ISDX ; SETB SS ;关片选 REC3: MOV 35H,#200 ; REC4: JNB INT,REC7 ; OVF=0 芯片益出 JNB AN,REC3 ; DJNZ 35H,REC4 ; SETB LED ;关指示灯 ACALL STOPP ;停止当前操作 REC5: JNB STOP,REC6 ;中断 RESET JB AN,REC5 ;等待 AN=0 ACALL STOPP ;停止当前操作 AJMP REC1 ; REC6: CLR SCLK ;时钟 SCLK=0 SETB SS ;关片选 ACALL STOPP ;停止当前操作 AJMP MAII ; REC7: SETB LED ;关指示灯 MOV 36H,#15 ; REC8: ACALL YS50 ;延时录音 JB AN,REC6 ;等待 AN=1 DJNZ 36H,REC8 ; CLR LED ; MOV 36H,#15 ; REC9: ACALL YS50 ;延时录音 JB AN,REC6 ;等待 AN=1 DJNZ 36H,REC9 ; AJMP REC7 ; ;SETPALY 16 位 ;从指定地址放音 11100《X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0》 PLAY: JNB AN,PLAY ;等待 AN=1 MOV A,20H ;发地址 A7-A0 ACALL ISDX ; MOV A,21H ;发地址 A9-A8 SETB ACC.7 ; SETB ACC.6 ; SETB ACC.5 ;
?108?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 CLR ACC.4 ; CLR ACC.3 ; ACALL ISDX ; SETB SS ; ;PLAY 8 位 ;从当前指定地址放音 11110 《X A9 A8 A7 A6 A5 A4 A3 A2 A1 A0》 PLAY1:CLR LED ;LED 开指示灯 MOV A,#0F0H ;发 11110 XXXXXXXX ACALL ISDX ;发《SETPLAY》 SETB SS ;关片选 PLAY2:JNB STOP, REC6 ;STOP=0 停止放音 JB INT,PLAY2 ;无 OVF EON 继续放音 SETB LED ;关指示灯 ACALL STOPP ;停止当前的操作 ;检测 OVF CLR SS ;开片选 CLR SCLK ;时钟 SCLK=0 SETB SCLK ;时钟 SCLK=1 JB MISO,REC6;; ;芯片到末 CLR SCLK ;时钟 SCLK=0 SETB SS ;关片选 ACALL STOPP ;停止当前操作 PLAY3:JNB STOP,REC6 ;中断放音 JB AN,PLAY3 ;等待 AN=0 AJMP PLAY1 ;顺序发音 ;ISD 上电《POWERUP》 8 位 UP : MOV A, #20H ;发 00100 XXXXXXXXXX ACALL ISDX ;关片选 SETB SS ACALL YS50 ;延时 50mS ACALL YS50 ;延时 50mS RET ;停止当前操作《STOP》 8位 STOPP:MOV A,#30H ;发 0X11 0XXX ACALL ISDX SETB SS ;关片选 ACALL YS50 ;延时 50mS ACALL YS50 ;延时 50mS RET ;停止当前操作掉电《STOPPWRDN》 8 位 DSTOP:MOV A,#10H ;发 0X010 XXXXXXXXX ACALL ISDX ; SETB SS ;关片选 ACALL YS50 ;延时 50mS ACALL YS50 ;延时 50mS RET ;ISD3300,4003 SPI 写入程序 8 位 数据在 A ISDX: CLR SS ;开片选 MOV R6,#8 ; CLR SCLK ;时钟 SCLK=0 ISD1: MOV C,ACC.0 ;数据写入 MOSI MOV MOSI,C ;时钟 SCLK=1 SETB SCLK ; RR A ; CLR SCLK ;时钟 SCLK=0 DJNZ R6,ISD1 ; RET ; ;*****10mS 延时***** YS1: MOV TMOD,#01H ;12/12=1 MOV TH0,#0D8H ;10mS 延时初植置入
?109?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 MOV TL0,#0F0H SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 RET ;*****50mS 延时***** YS50: MOV TMOD,#01H MOV TH0,#3CH MOV TL0,#0B0H SETB TR0 JNB TF0,$ CLR TF0 CLR TR0 RET END ;(56536-X)*1=10MS ;65536-(10000/1)=D8F0H

;12/12=1 ;50mS 延时初植置入 ;(56536-X)*1=50MS ;65536-(50000/1)=3CB0H

实验三 IC 卡实验
一、实验连线: 1、将扩展板 IC 卡实验区一框中 S23、S22、S20、S18 分别与实验箱中 P1.3、P1.2、P1.1、P1.0 孔相连接; 2、输入程序、编译、全速运行; 3、当全速运行以后,数码管显示“----”字样,此时插入 IC 卡; 4、按键盘 1 号键开始写卡,输入任意两位数字,按键盘 2 号键开始读卡,按任意键复位。 二、实验内容:键盘输入任意两个数字,通过 IC 卡读出,显示在数码管中。 三、实验程序: // test IC Card #include <reg51.h> #include <intrins.h> #include <math.h> #include <string.h> #include <stdio.h> #include <absacc.h> #include <ctype.h> #define uchar unsigned char #define uint unsigned int #define LEDLen 6 #define mode 0x03; #define CAddr XBYTE[0xe100]/* 控制字地址 */ #define OUTBIT XBYTE[0xe101]/* 位控制口 */ #define CLK164 XBYTE[0xe102]/* 段控制口(接 164 时钟位) */ #define DAT164 XBYTE[0xe102] /* 段控制口(接 164 数据位) */ #define IN XBYTE[0xe103] /* 键盘读入口 */ /***** IC card define *******/ sbit IC_CS = P1^0; sbit ICSCL = P1^1; sbit ICSDA = P1^2; sbit IC_SW = P1^3; uchar E24_State, IC_Flag; bit Key_Flag = 0; uchar data Key; uchar idata buf[9]; unsigned char LEDBuf[LEDLen]; /* 显示缓冲 */ code unsigned char LEDMAP[] = { /* 八段管显示码 */ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71, 0xd0, 0xf3, 0x40 //r,P,};
?110?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 void Delay(unsigned char CNT) { unsigned char i; while (CNT-- !=0) for (i=100; i !=0; i--); } void DisplayLED() { unsigned char i, j; unsigned char Pos; unsigned char LED; Pos = 0x20; /* 从左边开始显示 */ for (i = 0; i < LEDLen; i++) { OUTBIT = 0; /* 关所有八段管 */ LED = LEDBuf[i]; for (j = 0; j < 8; j++) { /* 送 164 */ if (LED & 0x80) DAT164 = 1; else DAT164 = 0; CLK164 = CLK164|0x02; CLK164 = CLK164&0xfd; LED <<= 1; } OUTBIT = Pos; /* 显示一位八段管 */ Delay(1); Pos >>= 1; /* 显示下一位 */ } } code unsigned char KeyTable[] = { /* 键码定义 */ 0x00, 0x01, 0x04, 0x07 , 0x0f, 0x02, 0x05, 0x08, 0x0e, 0x03, 0x06, 0x09 , 0x0d, 0x0c, 0x0b, 0x0a , 0x10,0x11,0x12,0x13,0x14, 0x15,0x16, }; unsigned char TestKey() { OUTBIT = 0; /* 输出线置为 0 */ return (~IN & 0x0f); /* 读入键状态 (高四位不用) */ } unsigned char GetKey() { unsigned char Pos; unsigned char i; unsigned char k; i = 6; Pos = 0x20; /* 找出键所在列 */ do { OUTBIT = ~ Pos; Pos >>= 1; k = ~IN & 0x0f; } while ((--i != 0) && (k == 0)); /* 键值 = 列 X 4 + 行 */ if (k != 0) { i *= 4; if (k & 2) i += 1; else if (k & 4) i += 2;
?111?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 else if (k & 8) i += 3; OUTBIT = 0; do Delay(10); while (TestKey()); /* 等键释放 */ return(KeyTable[i]); /* 取出键码 */ } else return(0xff); } /***********************************/ void time10ms(char num) { uint lp; uchar i; for(i=0;i<=num;i++) { lp=910; while(--lp); } } void start() { ICSCL=0;ICSDA=1; ICSCL=1; ICSDA=0; ICSCL=0; } void endd() { ICSCL=0; ICSDA=0; ICSCL=1; ICSDA=1;} char rbyte(uchar ask_flag) { uchar x,lp; for (lp=0;lp<8;lp++) { x=x<<1; ICSCL=0; ICSDA=1; /* set ICSDA input */ ICSCL=1; if(ICSDA) x|=1; } ICSCL=0; if(ask_flag) ICSDA=0; /* master ask */ else ICSDA=1; /* master no ask */ ICSCL=1;; return(x); } void wbyte(uchar p) { uchar i; for(i=0;i<8;i++) { ICSCL=0; if(p&0x80) ICSDA=1; else ICSDA=0; p=p<<1; ICSCL=1; } ICSCL=0; /* extra 9th pulse */ ICSDA=1; /* set ICSDA input */ ICSCL=1; i=255; while(ICSDA && --i); /* wait for slave ack */ if(!i) E24_State|=0x1; // slave error ICSCL=0; } char read_byte(uchar adr) { uchar x; start(); wbyte(0xa0); wbyte(adr); start(); wbyte(0xa1);
?112?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 x=rbyte(0); endd(); return(x); } void write_byte(uchar adr,uchar num) { start(); wbyte(0xa0); wbyte(adr); wbyte(num); endd(); time10ms(0); } char write_int(uchar adr,uint dat) { uchar i; start(); wbyte(0xa0); wbyte(adr); i=(char)((dat&0xff00)>>8); wbyte(i); i=(char)(dat&0xff); wbyte(i); endd(); time10ms(1); } int read_int(uchar adr) { uchar x; uint z; start(); wbyte(0xa0); wbyte(adr); start(); wbyte(0xa1); x=rbyte(1); z=x; z=z<<8; x=rbyte(0); endd(); z|=x; return(z); } void delay0() { uint x; x=0x4000; while(--x); } void main() { unsigned char j=0,x=0,y=0; CAddr = mode; // PSW = 0; // SP = 0x60; IC_SW = 1; IC_CS = 0; //IC 卡加电 delay0(); while (1) { while(IC_SW) //无卡提示 { LEDBuf[0] = 0x00;
?113?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 LEDBuf[1] = LEDMAP[0x12];//'-' LEDBuf[2] = LEDMAP[0x12];//'-' LEDBuf[3] = LEDMAP[0x12];//'-' LEDBuf[4] = LEDMAP[0x12];//'-' LEDBuf[5] = 0x00; DisplayLED(); } LEDBuf[0] = LEDMAP[0x01]; LEDBuf[1] = LEDMAP[0x10];//'r' LEDBuf[2] = 0x00; LEDBuf[3] = 0x00; LEDBuf[4] = LEDMAP[0x02]; LEDBuf[5] = LEDMAP[0x11];//'P' DisplayLED(); switch(GetKey()) { case 1: { LEDBuf[0] = LEDMAP[0x01]; LEDBuf[1] = LEDMAP[0x10];//'r' LEDBuf[2] = 0x00; LEDBuf[3] = 0x00; LEDBuf[4] = 0x00; LEDBuf[5] = 0x00; DisplayLED(); while (!TestKey()) {DisplayLED();} /* 等按键 */ x = GetKey() & 0x0f; LEDBuf[4] = LEDMAP[x]; while (!TestKey()) {DisplayLED();} /* 等按键 */ y = GetKey() & 0x0f; LEDBuf[5] = LEDMAP[y]; for(j=0; j<255; j++) DisplayLED(); /* 延时 */ write_byte(0x00, x*16+y); //write_byte(0x00,0x55); } break; case 2: { j = read_byte(0x00); LEDBuf[0] = LEDMAP[0x02]; LEDBuf[1] = LEDMAP[0x11];//'P' LEDBuf[2] = 0x00; LEDBuf[3] = 0x00; LEDBuf[4] = LEDMAP[j / 16]; LEDBuf[5] = LEDMAP[j % 16]; while (!TestKey()) {DisplayLED();} /* 等按键 */ } break; default:; } } }

?114?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

实验四 LED16×16 图形点阵实验
一、实验目的:利用 MCS-51 技术实现 16?16 LED 点阵屏的的扫描和动态显示。 二、实验内容:利用 P1 口输出高低电平,控制 LED 点阵的片选信号,以实现对 LED 点阵的行控制,用数据总 线来传送要显示汉字的数据信息,以实现对 LED 点阵的列控制,在实验模块上显示“恒”字。 三、实验原理:LED 点阵的行为扫描选通信号、列为数据输入。显示采用逐行扫描式,数据端不断输入数据, 行扫描按一定顺序逐行选通,扫描一个周期(16 次)产生一帧画面。图 2.5.1 以 4?4 共阴 LED 阵列为例,给 出了 LED 阵列的组合方式,行选通低有效,数据高有效;数据端输入数据,选通行根据相应数据亮灯,接着送 入第二行数据,选通第二行,依次完成一屏的扫描。

图 3.1 LED 阵列结构 四、实验步骤:将 LCD 模块板插入用户板的扩展槽中,连接好仿真器,打开实验箱电源,将系统资源区的数据总 线 D0 到 D7 分别接扩展板的数据总线 D0 到 D7, Y0 接 P1.0, Y1 接 P1.1, Y2 接 P1.2, Y3 接 P1.3, E1 接 P1.4,E2 接 P1.5。 五、实验程序: #include"reg51.h" #define BYTE unsigned char sbit CS1=P1^0; //|||||1 sbit CS2=P1^2; //-----1 sbit CS3=P1^4; //|||||2 sbit CS4=P1^6; //-----2 unsigned char code HK_HZ[32]= { 0x7f,0x8f,0xff,0x00,0xef,0xdd,0x0d,0x6d, 0x6d,0x6d,0x6d,0x6d,0x04,0xed,0xff,0xff, 0xff,0xff,0xff,0x00,0xfb,0xfb,0x1b,0xdb, //‘恒’ 字模 0xdb,0xdb,0xdb,0xdb,0x1b,0xf3,0xfb,0xff, }; unsigned char code dispbit[16]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe}; void delay_L(BYTE time) { int i; for(i=0;i<=((time)*1);i++) {; }; } void delay_Long(BYTE time) { int k,j; for(k=0;k<time;k++) for(j=0;j<5000;j++); } void Int_LED() { CS1=CS2=CS3=CS4=0; CS1=CS3=0; P0=0xff; CS1=CS3=1;
?115?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 CS2=CS4=0; P0=0xff; CS2=CS4=1; } void Senddisp(BYTE disp_col) { BYTE j; j=disp_col; if(j<8) { CS4=0; P0=0xff; CS4=1; CS2=0; P0=dispbit[j]; CS2=1; delay_L(40); } if(j==8) { CS1=1; CS3=1; CS4=1; CS2=0; P0=0xff; delay_L(2); CS2=1; P0=0xff; CS4=0; P0=dispbit[8]; CS4=1; } if(j>8) { CS1=1; CS3=1; CS2=1; CS4=0; P0=dispbit[j]; CS4=1; delay_L(40); } } void WR_HZ() { BYTE i; for(i=0;i<=15;i++) { CS1=0; delay_L(1); P0=HK_HZ[i]; delay_L(1); CS1=1; CS3=0; delay_L(1); P0=HK_HZ[i+16]; delay_L(1); CS3=1; Senddisp(i); delay_L(40); Int_LED();
?116?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 } } void Int_LED_all_on() { CS1=CS2=CS3=CS4=0; CS1=CS3=0; P0=0x00; delay_L(5); CS1=CS3=1; delay_L(5); CS2=CS4=0; P0=0x00; delay_L(5); CS2=CS4=1; } void main() { Int_LED_all_on(); delay_Long(2000); Int_LED(); while(1) { WR_HZ(); } }

实验五 128×64 点阵式 LCD 显示屏实验
一、实验目的:学习汉字字模的建立的方法,学习 128x64 液晶的原理及编程方法。 二、实验内容:利用 P1 口输出高低电平,实现 128*64 液晶片选、复位、及指令和数据的读写控制,利用 P0 口的输入和输出来实现指令和数据的传送,编程在 LCD 实验扩展板上显示“武汉恒科”等字样。 三、 实验原理:128*64 图形液晶显示器的内部结果图如图 11.1 所示,其引脚功能如表 11.1。

图 11.1 引脚符号 CS1 CS2 E R/W D/I DB0-DB7 RST 状态 输入 输入 输入 输入 三态 输入 引脚名称 芯片片选端 读写使能信号 读写选择信号 数据指令选择信号 数据总线 复位信号 功能 CS1 和CS2 高电平选通 在E降沿数据被销存写入及其兼容控制驱动器在E 高电平期间数据 被读出 R/W=1 为读选通R/W=0 为写选通 D/I=1 为数据操作D/I=0 为写指令或读状态 复位信号有效时关闭液晶显示使显示起始行为0 RST 可跟MPU 相连 由MPU 控制也可直接接VCC 使之不起作用 表 11.1

常用的基本指令介绍如下:
?117?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 1.显示开/关指令

当DB0=1 时LCD 显示RAM 中的内容;DB0=0 时关闭显示 2.起始行ROW 设置指令

3.页PAGE 设置指令

4.列地址Y ADDRESS 设置指令

设置了页地址和列地址就唯一确定了显示RAM 中的一个单元这样MPU 就可以用读写指令读出该单元中的内 容或向该单元写进一个字节数据。 5.写数据指令

6. 读状态指令

7. 读数据指令

读写数据指令每执行完一次读写操作列地址就自动增一必须注意的是进行读操作之前必须有一次空读操作 紧接着再读才会读出所要读的单元中的数据。 在本实验中利用 FPGAEPM1K30TC144 生成一个 LCD 显示控制器模块 (模块名为 LCD) , 并将需要显示的 数据存放在两个 ROM 中 (模块名为 LCD_ROM,ROM_LCD) , 利用状态机产生上述的控制指令操作, 并从 ROM 中取出待显示的数据送到 128*64 的图形点阵液晶中,从而在液晶中观察到显示的字符。 四、实验步骤:将 LCD 模块板插入用户板的扩展槽中,连接好仿真器,打开实验箱电源,将系统资源区的数据总 线 D0 到 D7 分别接扩展板的数据总线 D0 到 D7, RST 接 P1.6, CS2 接 P1.1, CS1 接 P1.2, EN 接 P1.3, RW 接 P1.4, DI 接 P1.5。

五、实验程序:
/* 武汉恒科电子教学仪器有限公司 LCD12864 测试程序代码 编制 :CFQHUST.163.com 时间 :2006 年 1 月 实验连线: RST=====>P1.6 CS2=====>P1.1 CS1=====>P1.2 EN =====>P1.3 RW =====>P1.4 DI =====>P1.5 */ #include <reg51.h> #include <string.h> #include <stdio.h> typedef unsigned char BYTE; /* Define the register command code */ #define Disp_On 0x3f #define Disp_Off 0x3e #define Col_Add 0x40 #define Page_Add 0xb8
?118?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 #define Start_Line 0xc0 #define Lcd_Bus P0 //MCU P1<------> LCM unsigned char code HK_HZ[16][32]; sbit Mcs=P1^2; //Master chip enable sbit Scs=P1^1; //Slave chip enable sbit Enable=P1^3; //6800 mode Enable single sbit Di=P1^5; //Data or Instrument Select sbit RW=P1^4; //Write or Read sbit Lcd_Rst=P1^6; //Lcm reset /*------------------延时子程序-----------------------------*/ void delay(unsigned int t) { unsigned int i,j; for(i=0;i<t;i++) for(j=0;j<10;j++); } /*------------------写命令到 LCD------------------------------*/ void write_com(unsigned char cmdcode) { Di=0;RW=0;Lcd_Bus=cmdcode; delay(0);Enable=1;delay(0);Enable=0; } /*-------------------写数据到 LCD----------------------------*/ void write_data(unsigned char Dispdata) { Di=1;RW=0;Lcd_Bus=Dispdata; delay(0);Enable=1;delay(0);Enable=0; } /*-------------------读 LCD 数据------------------------unsigned char read_data() { unsigned char tmpin; Di=1;RW=1;delay(0);Enable=1; delay(0);Enable=0;tmpin=Lcd_Bus; return tmpin; } /*------------------显示边框-------------------------------*/ void frame() { unsigned char i;Mcs=1;Scs=1; write_com(Page_Add+0); write_com(Col_Add+0); for(i=0;i<64;i++) write_data(0x01); write_com(Page_Add+7); write_com(Col_Add+0); for(i=0;i<64;i++) write_data(0x80); for(i=0;i<8;i++) {Mcs=0;Scs=1;write_com(Page_Add+i); write_com(Col_Add+63);write_data(0xff);Mcs=1;Scs=0; write_com(Page_Add+i);write_com(Col_Add+0); write_data(0xff); } } /*------------------清除内存---------------*/ void Clr_Scr() { unsigned char j,k;Mcs=1;Scs=1; write_com(Page_Add+0); write_com(Col_Add+0); for(k=0;k<8;k++)
?119?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 { write_com(Page_Add+k); for(j=0;j<64;j++)write_data(0x00); } } /*------------------显示横---------------------------*/ void Disp_H_Line() { unsigned char i,j;Mcs=1;Scs=1;write_com(Disp_On);write_com(Page_Add); write_com(Start_Line); write_com(Col_Add); for(j=0;j<8;j++) {write_com(Page_Add+j); write_com(Col_Add+0);// write_com(Start_Line+0); for(i=0;i<64;i++)write_data(0x55); } } /*------------------显示列-----------------------------*/ void Disp_V_Line() { unsigned char i,j; write_com(Disp_On); write_com(Page_Add); write_com(Start_Line); write_com(Col_Add); for(j=0;j<8;j++) {write_com(Page_Add+j);write_com(Col_Add+0);write_com(Start_Line+0); for(i=0;i<32;i++) {write_data(0x00); write_data(0xff); } } } /*---------------------指定位置显示汉字 16*16-----------------------*/ void hz_disp16(unsigned char pag,unsigned char col, unsigned char code *hzk) { unsigned char j=0,i=0; for(j=0;j<2;j++){write_com(Page_Add+pag+j); write_com(Col_Add+col); for(i=0;i<16;i++) write_data(hzk[16*j+i]); } } /*------------------初始化 LCD 屏--------------------------*/ void init_lcd() {Lcd_Rst=0; delay(100);Lcd_Rst=1;delay(100); Mcs=1;Scs=1;delay(100); write_com(Disp_Off); write_com(Page_Add+0); write_com(Start_Line+0); write_com(Col_Add+0); write_com(Disp_On); } /*------------------------------信息显示------------------------*/ void Msg() { Clr_Scr();frame(); { //显示"武汉恒科电子教仪" Mcs=1;Scs=0; hz_disp16(2,0,(BYTE *)&HK_HZ[0][0]);
?120?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 delay(2000); hz_disp16(2,16,(BYTE *)&HK_HZ[1][0]); delay(2000); hz_disp16(2,32,(BYTE *)&HK_HZ[2][0]); delay(2000); hz_disp16(2,48,(BYTE *)&HK_HZ[3][0]); delay(2000); Mcs=0;Scs=1; hz_disp16(2,0,(BYTE *)&HK_HZ[4][0]); delay(2000); hz_disp16(2,16,(BYTE *)&HK_HZ[5][0]); delay(2000); hz_disp16(2,32,(BYTE *)&HK_HZ[6][0]); delay(2000); hz_disp16(2,48,(BYTE *)&HK_HZ[7][0]); delay(2000); Mcs=0;Scs=1;Mcs=1;Scs=0; //显示"感谢您使用该产品" hz_disp16(4,0,(BYTE *)&HK_HZ[8][0]); delay(2000); hz_disp16(4,16,(BYTE *)&HK_HZ[9][0]); delay(2000); hz_disp16(4,32,(BYTE *)&HK_HZ[10][0]); delay(2000); hz_disp16(4,48,(BYTE *)&HK_HZ[11][0]); delay(2000); Mcs=0;Scs=1; hz_disp16(4,0,(BYTE *)&HK_HZ[12][0]); delay(2000); hz_disp16(4,16,(BYTE *)&HK_HZ[13][0]); delay(2000); hz_disp16(4,32,(BYTE *)&HK_HZ[14][0]); delay(2000); hz_disp16(4,48,(BYTE *)&HK_HZ[15][0]); delay(2000); } } /*--------------------主程序---------------------------------*/ main() {unsigned char i=0;//Clr_Scr(); while(1){ init_lcd(); delay(1000);Msg(); delay(1000); Disp_H_Line(); delay(1000); Disp_V_Line(); delay(1000); } } unsigned char code HK_HZ[16][32]={ 0x20,0x20,0x24,0x24,0x24,0xE4,0x26,0x24, 0x20,0xFF,0x20,0x22,0x2C,0x20,0x20,0x00, 0x20,0x60,0x3F,0x20,0x20,0x1F,0x11,0x11, 0x10,0x03,0x1C,0x20,0x40,0x80,0xE0,0x00, //武 0 0x10,0x22,0x64,0x0C,0x80,0x04,0x74,0x84, 0x04,0x04,0x04,0xC4,0x3E,0x04,0x00,0x00, 0x04,0x04,0x7E,0x01,0x80,0x40,0x20,0x11, 0x0A,0x04,0x0B,0x10,0x60,0xC0,0x40,0x00, //汉 1 0x80,0x70,0x00,0xFF,0x10,0x22,0xF2,0x92, 0x92,0x92,0x92,0x92,0xFB,0x12,0x00,0x00,
?121?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 0x00,0x00,0x00,0xFF,0x20,0x20,0x27,0x24, 0x24,0x24,0x24,0x24,0x27,0x30,0x20,0x00, //恒 2 0x24,0x24,0x24,0xA4,0xFE,0xA3,0x22,0x00, 0x24,0x48,0x00,0xFF,0x00,0x80,0x00,0x00, 0x10,0x08,0x06,0x01,0xFF,0x00,0x01,0x02, 0x02,0x02,0x02,0xFF,0x01,0x01,0x01,0x00, //科 3 0x00,0xF8,0x48,0x48,0x48,0x48,0xFF,0x48, 0x48,0x48,0x48,0xFC,0x08,0x00,0x00,0x00, 0x00,0x07,0x02,0x02,0x02,0x02,0x3F,0x42, 0x42,0x42,0x42,0x47,0x40,0x70,0x00,0x00, //电 4 0x80,0x80,0x82,0x82,0x82,0x82,0x82,0xE2, 0xA2,0x92,0x8A,0x86,0x80,0xC0,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x40,0x80,0x7F, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //子 5 0x20,0x24,0x24,0xA4,0xFF,0xA4,0xB4,0xAC 0x20,0x9F,0x10,0x10,0xF0,0x18,0x10,0x00, 0x02,0x12,0x51,0x90,0x7E,0x0A,0x89,0x40, 0x20,0x1B,0x04,0x1B,0x60,0xC0,0x40,0x00, //教 6 0x80,0x40,0x20,0xF8,0x07,0x00,0x38,0xC0, 0x02,0x04,0x0C,0x80,0x60,0x1C,0x00,0x00, 0x00,0x00,0x00,0xFF,0x80,0x40,0x20,0x10, 0x0B,0x04,0x0A,0x11,0x60,0xC0,0x40,0x00, //学 7 0x00,0xFC,0x14,0xD4,0x54,0x54,0x54,0xD4, 0x14,0xFF,0x04,0x85,0x66,0x04,0x00,0x00, 0x04,0x43,0x30,0x07,0x72,0x82,0x8A,0x93, 0xB4,0x82,0xE1,0x12,0x24,0x64,0x07,0x00, 0x40,0x42,0xCC,0x00,0xFC,0x56,0x55,0x54, 0xFE,0x24,0x20,0x20,0xFF,0x20,0x20,0x00, 0x00,0x00,0x3F,0x52,0x2B,0x12,0x4A,0x86, 0x7F,0x01,0x46,0x80,0x7F,0x00,0x00,0x00, 0x40,0x20,0x10,0xFC,0x23,0x10,0x8C,0x67, 0x04,0xF4,0x04,0x44,0x94,0x8C,0x00,0x00, 0x40,0x30,0x00,0x77,0x80,0x81,0x88,0x92, 0xB4,0x83,0x80,0xE0,0x00,0x11,0x60,0x00, 0x40,0x20,0xF8,0x07,0x04,0xF4,0x14,0x14, 0x14,0xFF,0x14,0x14,0x14,0xF6,0x04,0x00, 0x00,0x00,0xFF,0x00,0x80,0x43,0x45,0x29, 0x19,0x17,0x21,0x21,0x41,0xC3,0x40,0x00, 0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE, 0x22,0x22,0x22,0x22,0xFF,0x02,0x00,0x00, 0x80,0x60,0x1F,0x02,0x02,0x02,0x02,0x7F, 0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00, 0x40,0x42,0xC4,0x00,0x04,0x84,0xC4,0xB5, 0x8E,0x84,0x84,0x64,0x04,0x06,0x04,0x00, 0x00,0x00,0x7F,0x20,0x90,0x88,0x50,0x48, 0x24,0x13,0x08,0x14,0x23,0xC0,0x00,0x00, 0x00,0x08,0x08,0x88,0x98,0xE8,0x89,0x8E, 0x88,0xC8,0xA8,0x98,0xCC,0x88,0x00,0x00, 0x80,0x40,0x30,0x0F,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x7E,0x22,0x22,0xA2,0x22, 0x22,0x22,0x22,0x7F,0x02,0x80,0x00,0x00, 0x00,0xFF,0x41,0x41,0x41,0x41,0xFF,0x01, 0xFF,0x41,0x41,0x41,0x41,0xFF,0x01,0x00 };
?122?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书

实验六 无线 MODEM 发送接收实验
将扩展板插在实验箱上,具体实验步骤: 一、实验连线: 1、实验板 P1.0 接扩展实验板 RXD; 2、实验板 P1.1 接扩展实验板 TXD; 3、输入程序,编译,全速运行; 二、实验内容:通过全速运行程序,可以拨通对应的电话号码, (02787660866) 。 三、实验程序: (拨电话程序) /********************************************** IO 口模拟 232 通讯程序 使用两种方式的 C 程序 占用定时器 0 实验连线: P1.0-----RXD P1.1-----TXD **********************************************/ #include<reg52.h> #include<stdio.h> sbit BT_SND =P1^0; sbit BT_REC =P1^1; #define MODE_QUICK #define F_TM F0 #define TIMER0_ENABLE TL0=TH0; TR0=1; #define TIMER0_DISABLE TR0=0; sbit ACC0= ACC^0; sbit ACC1= ACC^1; sbit ACC2= ACC^2; sbit ACC3= ACC^3; sbit ACC4= ACC^4; sbit ACC5= ACC^5; sbit ACC6= ACC^6; sbit ACC7= ACC^7; void IntTimer0() interrupt 1 { F_TM=1; } //发送一个字符 void PSendChar(unsigned char inch) { #ifdef MODE_QUICK ACC=inch; F_TM=0; BT_SND=0; //start bit TIMER0_ENABLE; //启动 while(!F_TM); BT_SND=ACC0; //先送出低位 F_TM=0; while(!F_TM);
?123?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 BT_SND=ACC1; F_TM=0; while(!F_TM); BT_SND=ACC2; F_TM=0; while(!F_TM); BT_SND=ACC3; F_TM=0; while(!F_TM); BT_SND=ACC4; F_TM=0; while(!F_TM); BT_SND=ACC5; F_TM=0; while(!F_TM); BT_SND=ACC6; F_TM=0; while(!F_TM); BT_SND=ACC7; F_TM=0; while(!F_TM); BT_SND=1; F_TM=0; while(!F_TM); TIMER0_DISABLE; //停止 timer #else unsigned char ii; ii=0; F_TM=0; BT_SND=0; //start bit TIMER0_ENABLE; //启动 while(!F_TM); while(ii<8) { if(inch&1) { BT_SND=1; } else { BT_SND=0; } F_TM=0; while(!F_TM); ii++; inch>>=1;
?124?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 } BT_SND=1; F_TM=0; while(!F_TM); #endif TIMER0_DISABLE; //停止 timer } //接收一个字符 void PGetChar(unsigned char getdata[2]) { unsigned char rch,ii; unsigned int i,j=0; for (i=0;i<2;i++) { TIMER0_ENABLE; F_TM=0; ii=0; rch=0; while(!F_TM); //等过起始位 while(ii<8) { rch>>=1; if(BT_REC) { rch|=0x80; } ii++; F_TM=0; while(!F_TM); } F_TM=0; while(!F_TM) { if(BT_REC) { break; } } TIMER0_DISABLE; //停止 timer getdata[j++]=rch; } } //检查是不是有起始位 bit StartBitOn() { return (BT_REC==0);
?125?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 } void delay(unsigned int z)//1S 延时子程序 { unsigned int x,y;//定义循环用变量 for(x=z;x>0;x--)//for 循环嵌套 for(y=110;y>0;y--); } void main() { unsigned char i=2; TMOD=0x22; /*定时器 1 为工作模式 2(8 位自动重装),0 为模式 2(8 位 自动重装) */ PCON=00; TR0=0; //在发送或接收才开始使用 TF0=0; TH0=(256-96); //9600bps 就是 1000000/9600=104.167 微秒 执行的 timer 是 //104.167*11.0592/12= 96 TL0=TH0; ET0=1; EA=1; // 定时器 1 为 9600bit/s 的波特率发生器 TL1=0xfd; TH1=0xfd; SCON=0x50; PCON=0x80; while(1) { while(i) { i--; PSendChar(97); //send A PSendChar(116); //send T PSendChar(13);//send 回车 PSendChar(10);//send 换行 delay(5000); //延时 1s // PSendChar(97); //send A; PSendChar(116); //send T; PSendChar(100); //send D; PSendChar(48); PSendChar(50); PSendChar(55); PSendChar(56); PSendChar(55); PSendChar(54); PSendChar(54); //0digital number; //2 //7 //8 //7 //6 //6
?126?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 PSendChar(48); PSendChar(56); PSendChar(54); PSendChar(54); PSendChar(59); PSendChar(13);//send 回车 PSendChar(10);//send 换行 delay(5000); //延时 1s } } } /* ASCII 代码 0 1 2 3 4 5 6 7 8 9 //0 //8 //6 //6 //send ;

48 49 50 51 52 53 54 55 56 57*/

四、无线 MODEM 接收实验 1、 (挂电话程序) (实验板 P1.2 接实验板 K0,开关 K0 为高电平挂断电话,K1 为低电平接电话,自动应答) #include<reg52.h> #include<stdio.h> sbit BT_SND =P1^0; sbit BT_REC =P1^1; sbit call_on=P1^2; /********************************************** IO 口 232 通讯程序 使用两种方式的 C 程序 占用定时器 0 实验连线: P1.0-----RXD P1.1-----TXD **********************************************/ #define MODE_QUICK #define F_TM F0 #define TIMER0_ENABLE TL0=TH0; TR0=1; #define TIMER0_DISABLE TR0=0; sbit ACC0= ACC^0; sbit ACC1= ACC^1; sbit ACC2= ACC^2; sbit ACC3= ACC^3;
?127?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 sbit ACC4= ACC^4; sbit ACC5= ACC^5; sbit ACC6= ACC^6; sbit ACC7= ACC^7; void IntTimer0() interrupt 1 { F_TM=1; } //发送一个字符 void PSendChar(unsigned char inch) { #ifdef MODE_QUICK ACC=inch; F_TM=0; BT_SND=0; //start bit TIMER0_ENABLE; //启动 while(!F_TM); BT_SND=ACC0; //先送出低位 F_TM=0; while(!F_TM); BT_SND=ACC1; F_TM=0; while(!F_TM); BT_SND=ACC2; F_TM=0; while(!F_TM); BT_SND=ACC3; F_TM=0; while(!F_TM); BT_SND=ACC4; F_TM=0; while(!F_TM); BT_SND=ACC5; F_TM=0; while(!F_TM); BT_SND=ACC6; F_TM=0; while(!F_TM); BT_SND=ACC7; F_TM=0; while(!F_TM); BT_SND=1; F_TM=0; while(!F_TM); TIMER0_DISABLE; //停止 timer #else
?128?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 unsigned char ii; ii=0; F_TM=0; BT_SND=0; //start bit TIMER0_ENABLE; //启动 while(!F_TM); while(ii<8) { if(inch&1) { BT_SND=1; } else { BT_SND=0; } F_TM=0; while(!F_TM); ii++; inch>>=1; } BT_SND=1; F_TM=0; while(!F_TM); #endif TIMER0_DISABLE; //停止 timer } /* //接收一个字符 void PGetChar(unsigned char getdata[2]) { unsigned char rch,ii; unsigned int i,j=0; for (i=0;i<2;i++) { TIMER0_ENABLE; F_TM=0; ii=0; rch=0; while(!F_TM); //等过起始位 while(ii<8) { rch>>=1; if(BT_REC) {
?129?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 rch|=0x80; } ii++; F_TM=0; while(!F_TM); } F_TM=0; while(!F_TM) { if(BT_REC) { break; } } TIMER0_DISABLE; //停止 timer getdata[j++]=rch; } // #endif } //检查是不是有起始位 bit StartBitOn() { return (BT_REC==0); } */ void delay(unsigned int z)//1S 延时子程序 { unsigned int x,y;//定义循环用变量 for(x=z;x>0;x--)//for 循环嵌套 for(y=110;y>0;y--); } void main() { // unsigned char gch1[2];//gch2[2]; unsigned char i=2; TMOD=0x22; /*定时器 1 为工作模式 2(8 位自动重装),0 为模式 2(8 位 自动重装) */ PCON=00; TR0=0; //在发送或接收才开始使用 TF0=0; TH0=(256-96); //9600bps 就是 1000000/9600=104.167 微秒 执行的 timer 是 //104.167*11.0592/12= 96 TL0=TH0; ET0=1; EA=1;
?130?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 // 定时器 1 为 9600bit/s 的波特率发生器 TL1=0xfd; TH1=0xfd; SCON=0x50; PCON=0x80; while(1) { if(call_on) { PSendChar(97); //send A PSendChar(116); //send T PSendChar(104) ;//send h PSendChar(49) ;//send 0 PSendChar(13);//send 回车 PSendChar(10);//send 换行 delay(5000); } else { PSendChar(97); //send A PSendChar(116); //send T PSendChar(97) ;//send A PSendChar(13);//send 回车 PSendChar(10);//send 换行 delay(5000); } } } /* ASCII 代码 1 49 2 50 3 51 4 52 5 53 6 54 7 55 8 56 9 57*/

实验七 无线遥控实验
将扩展板插在实验箱上,具体实验步骤: 一、实验连线: 1、实验板 P1.0 接扩展实验板 D0; 2、实验板 P1.1 接扩展实验板 D1; 3、实验板 P1.2 接扩展实验板 D2; 4、实验板 P1.3 接扩展实验板 D3;
?131?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 5、实验板 P1.4 接扩展实验板 D4; 6、实验板 P1.5 接扩展实验板 D5; 7、输入程序,编译,全速运行; 二、实验内容:通过按遥控器上的按键,对应的键值通过数码管显示。 三、实验程序: /* “扩展实验 --红外遥控 */ /* 实验连线说明 P1.0-----D0 P1.1-----D1 P1.2-----D2 P1.3-----D3 P1.4-----D4 P1.5-----D5 */ #include<reg51.h> #include<absacc.h> #define LEDLen 6 #define mode 0x03; #define CAddr XBYTE[0xe100]/* 控制字地址 */ #define OUTBIT XBYTE[0xe101]/* 位控制口 */ #define CLK164 XBYTE[0xe102]/* 段控制口(接 164 时钟位) */ #define DAT164 XBYTE[0xe102] /* 段控制口(接 164 数据位) */ #define IN XBYTE[0xe103] /* 键盘读入口 */ unsigned char LEDBuf[LEDLen]; /* 显示缓冲 */ sbit IRDout = P1^0; sbit IRDout1 = P1^1; sbit IRDout2 = P1^2; sbit IRDout3 = P1^3; sbit IRDout4 = P1^4; sbit IRDout5 = P1^5; sbit IRDout6 = P1^6; sbit IRDoute = P1; code unsigned char LEDMAP[] = { /* 八段管显示码 */ 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71 }; unsigned char IRDread() { unsigned int getnumber=0; unsigned int number; P1=P1&0x00; getnumber=P1; switch (getnumber) { case 0x01:number=1;break; case 0x02:number=2;break;
?132?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 case 0x04:number=3;break; case 0x08:number=4;break; case 0x10:number=5;break; case 0x20:number=6;break; default:number=0;break; } return number; } void Delay(unsigned char CNT) { unsigned char i; while (CNT-- !=0) for (i=100; i !=0; i--); } void DisplayLED() { unsigned char i, j; unsigned char Pos; unsigned char LED; Pos = 0x20; /* 从左边开始显示 */ for (i = 0; i < LEDLen; i++) { OUTBIT = 0; /* 关所有八段管 */ LED = LEDBuf[i]; for (j = 0; j < 8; j++) { /*送 164*/ if (LED & 0x80) DAT164 = 1; else DAT164 = 0; CLK164 = CLK164|0x02; CLK164 = CLK164&0xfd; LED <<= 1; } OUTBIT = Pos; /* 显示一位八段管 */ Delay(1); Pos >>= 1; /* 显示下一位 */ } OUTBIT = 0; /* 关所有八段管 */ } void main() { unsigned char i = 0; unsigned char j; CAddr = mode; while(1) { i=IRDread(); LEDBuf[0] = LEDMAP[i]; LEDBuf[1] = LEDMAP[i]; LEDBuf[2] = LEDMAP[i]; LEDBuf[3] = LEDMAP[i];
?133?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 LEDBuf[4] = LEDMAP[i]; LEDBuf[5] = LEDMAP[i]; for(j=0; j<30; j++) DisplayLED(); /* 延时 */ } }

实验八 红外感应实验
将扩展板插在实验箱上,具体实验步骤: 一、实验连线: 1、实验板上音响及合成模块 VIN1 接实验板 P1.0; 2、实验板上发光二级管模块 L0 接实验板 P1.2; 3、将扩展板上的红外感应模块 J213 管脚接实验箱常用门电路模块 G0,反相器输出 G1 接 P1.1 即可; 4、输入程序,编译,全速运行; 二、实验内容:完成红外报警功能,当红外感应器检测到有人时候,L0 灯亮,蜂鸣器响,反之则 L0 灭,蜂鸣 器不响。 三、实验程序: /* “扩展证式” 实验 红外感应 实验连线 P1.0-----VIN1 音响及合成模块 P1.1-----G1 常用门电路模块(G1) G0-------J213 红外感应模块(J213)和常用门电路模块 (G0) P1.2-----L0 发光二级管模块 */ #include <reg51.h> #include <absacc.h> #define MODE 0x03 code unsigned int ToneTable[7] = { 64578, 64686, 64778, 64821, 64898, 64968, 65029 }; unsigned char PulseCNT; bit Pulse; sbit Speaker = P1^0; sbit IRDout = P1^1; sbit IRDout1 = P1^2; unsigned ToneHigh, ToneLow; void Timer() interrupt 1 { TR0 = 0; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; Speaker = Pulse; Pulse = !Pulse; PulseCNT--; } void main() { TMOD = 0x01; /* 方式 1 , 记时器 */ IE = 0x82; /* EA=1, IT0 = 1 */ if(IRDout) { IRDout1=1; }
?134?

超想-3000TC 综合实验/仿真系统 Keil C 实验指导书 else { ToneHigh = ToneTable[0x07-1] >> 8; ToneLow = ToneTable[0x07-1] & 0xff; TH0 = ToneHigh; TL0 = ToneLow; TR0 = 1; PulseCNT = 1000; while (PulseCNT != 0) ; /* 发 1000 个脉冲 */ TR0 = 0; IRDout1=0; } }

第?节
“自检式”演示实验
使用 34 芯扁平电缆,把“自检接口 A”和“自检接口 B”连接起来,在综合实验仪的键盘上输入各模块“代 号” ,即可进行自检演示实验。 用 途: (1)可适用于初学者以“提高对单片机感性认识”为目的的实验要求。 (2)实验过程中可迅速分辨是软件故障还是硬件故障。 (3)可极大地降低管理员检测或维护系统时的工作量。 方 法: (1)把 51CPU 板插入超想-3000TC 综合实验仪的右下角的 J1、J2、J3 插座中。 (2)将检测芯片插入 51CPU 板上,缺口向上。 (3)使用 34 芯扁平电缆,把“自检接口 A”和“自检接口 B”连接起来。 (4)打开电源,数码管应显示“P” ,按[MON]键后,进入检测监控状态,显示“ ’ ” 。分别输入“0~F”键, 即可进行自检演示实验。 (5)例:按[0]键,为“LCD 液晶显示器实验” ;按[1]键,为“V/F 压力频率转换实验” —— LCD 液晶显示器实验 0 显示“蓬勃远大” 。 参阅: 实验十五 点阵式 LCD 液晶显示屏实验 —— V/F 压力频率转换实验 1 调节“模拟量发生器”的电位器,数码管显示值随之变化。 参阅: 实验十一 V/F 压力频率转换实验 —— 脉冲计数实验 2 按动“脉冲源”区的带锁按钮,数码管显示值随之加 1 参阅: 实验三 脉冲计数(定时/计数器计数功能实验) —— DA0832 转换实验 3 直流电机转速随着数码管显示值加大而加大,减小而减小。 参阅: 实验五 DA0832 转换实验 —— AD0809 转换实验 4 调节“模拟量发生器”的电位器,数码管显示值随之变化。范围:00-FF。 参阅: 实验

阜阳市超想服装有限公司分析报告(2018版).doc

阜阳市超想服装有限公司分析报告(2018版) - www.chinaiic.cn 阜阳市超想服装有限公司分析报告 报告包含阜阳市超想服装有限公司基本情况、企业行业发展环境、企业...

2010夏日超想_论文.pdf

2010夏日超想 - 俗话说“时髦有型从脚开始”,鞋子整体造型的重要性毋庸置疑。

10个你超想知道英语怎么说的中文句子.doc

10个你超想知道英语怎么说的中文句子_英语学习_外语学习_教育专区。1.请保持低

超真实_拟真与内爆_后期鲍德里亚思想中的三个重要概念.pdf

超真 实 、拟真 与内爆 超真实、拟真与内爆 后期鲍德里亚思想中的三个...如

生存的超越性与尼采的超人学说.doc

上帝作为人类的超越理 想本是人类超越性的标志,却被关于上帝的说教当作人类失败..

营超想看的销策划.doc

超想看的销策划 - 质量越好的产品越好卖?NO! 价格最低的产品最好卖?NO!

利用Delphi编写IE扩展 - 超想软件.txt

利用Delphi编写IE扩展 - 超想软件_计算机软件及应用_IT/计算机_专业资料。利用Delphi编写IE扩展 - 超想软件 关于超想本站导航 加入收藏夹 邮件列表留言 首页|本...

超觉冥想.doc

超觉冥想 - 超觉冥想(静坐) 超觉冥想是改善生活、使人生活安康顺遂的最佳途径。

10个你超想知道英语怎么说的中文句子.doc

10个你超想知道英语怎么说的中文句子 - 10 个你超想知道英语怎么说的中文句子

你超想知道的日常口语神翻译马上学起来_图文.pdf

超想知道的日常口语神翻译马上学起来 - 你超想知道的日常口语神翻译马上学起来

女人变身男人后最想做的10件事.doc

女人变身男人后最想做的10件事 - 女人变身男人后最想做的 10 件事:打赤膊

你的能量超乎你想象.doc

方可 认识到你克服多少意想不到的逆境,方可认识到自己怎样超乎想象的强大。 10.

超乎想象.doc

龙源期刊网 http://www.qikan.com.cn 超乎想象 作者:Ni

超级幻想.doc

人“想”多快就多快,所以思维可以比光速快。人类思维在几十年的时间就观 测...如

超出想象_图文.ppt

超出想象_设计/艺术_人文社科_专业资料。绝对超出的想象的精彩摄影作品。 超出想

超有个性的yy家族马甲.doc

超有个性的yy家族马甲 - 超有个性的 yy 家族马甲 超想有个家? 用心爱着那

超想像艺术图片.doc

超想像艺术图片 - “弗雷泽螺旋”是最有影响的幻觉图形之一。 你所看到的好像是个

超出想象的古怪.txt

要想再次实验,可以将其重新加热变成液体,然后再冷却。 4 另一种做法是,买一..

黑洞到底有多可怕? 霍金的回答是超乎想象!_图文.pdf

黑洞视界周围存在一睹能量墙,它阻隔了事件视界内外的两个“世界”,这时候如果 你想

超乎想象的人体艺术.ppt_图文.ppt

化妆品http://www.vkua.com/ 超乎想象的人体艺术 在过去的20