基于AT89C51的PWM信号发生器设计报告课程设计

申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。

文档介绍

基于AT89C51的PWM信号发生器设计报告课程设计

基于 AT89C51 的 PWM 信号发生器设 计报告课程设计 基于 AT89C51 的 PWM 信号发生器设计 摘 要 单片机集成度高, 功能强,可靠性高,体积小,功耗低,使用方便,价格低廉等一系 列优点,目前已经渗入到人们工作和生活的方方面面,几乎无处不 在,无所不为。单片机的应用领域已经从面向工业控制,通讯,交 通,智能仪表等迅速发展到家用消费产品,办公自动化,汽车电子, PC 机外围以及网络通讯等广大领域。 单片机有两种基本结构形式:一种是在通用微型计算机中广泛 采用的,将程序存储器和数据存储器合用一个存储器空间的结构, 成为普林斯机构。另一种是将程序存储器和数据存储器截然分开, 分别寻址的结构,一般需要较大的程序存储器,目前单片机以采用 程序存储器截然分开的结构多。本课题讨论的占空比与周期可调的 信号发生器的核心是目前应用极为广泛的 51 系列单片机。 基于单片机的信号发生器的设计,该课题的设计目的是充分运 用大学期间所学的专业知识,考察现在正在使用的信号发生器的基 本功能,完成一个基本的实际系统的设计全过程。关键是这个实际 系统设计的过程,在整个过程中我可以充分发挥自动化的专业知识。 特别是这个信号发生器的设计中涉及到一个典型的控制过程。通过 单片机控制一个有特殊功能的信号发生芯片,可以产生一系列有规 律的周期和占空比可调的波形。这样一个信号发生器装置在控制领 域有相当广泛的应用范围。因为产生一系列的可调波形可以作为其 他一些设备的数值输入,还可以应用与设备检测,仪器调试等场合。 高频稳定的波形信号也可以用于无线电波的调频,解调。这些都是 现代生活中必不可少的一些应用。 关键词:PWM 信号发生器 目 录 1.简介 - 3 - 1.1 proteus - 3 - 1.2 Keil - 4 - 1.3 PWM - 5 - 1.4 AT89C51 - 6 - 2.设计原 理和方法 - 9 - 2.1 单片机的基本组成 - 9 - 2.2 方案的设计与选 择 - 9 - 2.3 定时器、的工作原理 - 10 - 2.3.1 工作方式寄存器 TMOD - 11 - 2.3.2 定时/计数器控制寄存器 TCON - 12 - 2.4 定时 /计数器的工作方式 - 12 - 2.5 设计方法 - 13 - 3.系统硬件电路 设计图 - 14 - 4.程序框图 - 16 - 4.1 主程序框图: - 16 - 4.2 系统初始化: - 16 - 4.3 定时器中断程序框图: - 16 - 4.4 键盘扫描程序框图: - 17 - 5.性能分析 - 18 - 5.1 定时器中断分析 - 18 - 5.2 系统 性能分析 - 18 - 6.源程序 - 18 - 7. 仿真效果图 - 22 - 总 结 - 24 - 致 谢 - 25 - 参考文献 - 25 - 1.简介 1.1 proteus Proteus ISIS 是英国 Labcenter 公司开发的电路分析与实物仿真软 件。它运行于 Windows 操作系统上,可以仿真、分析(SPICE)各种模 拟器件和集成电路,该软件的特点是: (1)实现了单片机仿真和 SPICE 电路仿真相结合。具有模拟电路仿 真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS232 动态仿真、I2C 调试器、SPI 调试器、键盘和 LCD 系统仿真的功能; 有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。 (2)支持主流单片机系统的仿真。目前支持的单片机类型有: 68000 系列、8051 系列、AVR 系列、PIC12 系列、PIC16 系列、 PIC18 系列、Z80 系列、HC11 系列以及各种外围芯片。 (3) 提供软件调试功能。在硬件仿真系统中具有全速、单步、 设置断点等调试功能,同时可以观察各个变量、寄存器等的当前状 态,因此在该软件仿真系统中,也必须具有这些功能; 同时支持第三方的软件编译和调试环境,如 Keil C51 uVision2 等 软件。 (4) 具有强大的原理图绘制功能。总之,该软件是一款集单片 机和 SPICE 分析于一身的仿真软件,功能极其强大。本章介绍 Proteus ISIS 软件的工作环境和一些基本操作。 特点:支持 ARM7,PIC ,AVR,HC11 以及 8051 系列的微处理器 CPU 模型,更多模型正在开发中: 交互外设模型有 LCD 显示、RS232 终端、通用键盘、开关、按钮、 LED 等; 强大的调试功能,如访问寄存器与内存,设置断点和单步运行模式; 支持如 IAR、Keil 和 Hitech 等开发工具的源码 C 和汇编的调试; 一键“make”特性:一个键完成编译与仿真操作; 内置超过 6000 标准 SPICE 模型,完全兼容制造商提供的 SPICE 模型; DLL 界面为应用提供特定的模式; 基于工业标准的 SPICE3F5 混合模型电路仿真器 14 种虚拟仪器:示 波器、逻辑分析仪、信号发生器、规程分析仪等; 高级仿真包含强大的基于图形的分析功能:模拟、数字和混合瞬时 图形; 频率; 转 换; 噪声; 失真; 付立叶; 交流、直流和音频曲线; 模拟信号发生器包括直流、正旋、脉冲、分段线性、音频、指数、 单频 FM; 数字信号发生器包括尖脉冲、脉冲、时钟和码流; 集成 PROTEUS PCB 设计形成完整的电子设计系统。 1.2 Keil Keil C51 是美国 Keil Software 公司出品的 51 系列 兼容单片机 C 语言软件开发系统,与汇编相比,C 语言在功能上、 结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil 提供了包括 C 编译器、宏汇编、连接器、库管理和一个功能强大的 仿真调试器等在内的完整开发方案,通过一个集成开发环境 (uVision)将这些部分组合在一起。运行 Keil 软件需要 WIN98、 NT、WIN2000、WINXP 等操作系统。如果你使用 C 语言编程,那么 Keil 几乎就是你的不二之选,即使不使用 C 语言而仅用汇编语言编 程,其方便易用的集成环境、强大的软件仿真调试工具也会令你事 半功倍。 (1)系统概述 Keil C51 软件提供丰富的库函数和 功能强大的集成开发调试工具,全 Windows 界面。另外重要的一点, 只要看一下编译后生成的汇编代码,就能体会到 Keil C51 生成的目 标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。 在开发大型软件时更能体现高级语言的优势。下面详细介绍 Keil C51 开发系统各部分功能和使用。 (2)Keil C51 单片机软件开发系统的整体结构 C51 工具包的整体结构,uVision 与 Ishell 分别是 C51 for Windows 和 for Dos 的集成开发环境(IDE),可以完成编辑、编译、连接、调试、 仿真等整个开发流程。开发人员可用 IDE 本身或其它编辑器编辑 C 或汇编源文件。然后分别由 C51 及 C51 编译器编译生成目标文件 (.OBJ)。目标文件可由 LIB51 创建生成库文件,也可以与库文件一 起经 L51 连接定位生成绝对目标文件(.ABS)。ABS 文件由 OH51 转换 成标准的 Hex 文件,以供调试器 dScope51 或 tScope51 使用进行源 代码级调试,也可由仿真器使用直接对目标板进行调试,也可以直 接写入程序存贮器如 EPROM 中。 1.3 PWM (1)简介 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是一种模拟控制方式, 其根据相应载荷的变化来调制晶体管栅极或基极的偏置,来实现开 关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电 源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字 信号对模拟电路进行控制的一种非常有效的技术。 PWM 控制技术以其控制简单,灵活和动态响应好的优点而成为电 力电子技术最广泛应用的控制方式,也是人们研究的热点。由于当 今科学技术的发展已经没有了学科之间的界限,结合现代控制理论 思想或实现无谐振软开关技术将会成为 PWM 控制技术发展的主要方 向之一。 (2)基本原理 随着电子技术的发展,出现了多种 PWM 技术, 其中包括:相电压控制 PWM、脉宽 PWM 法、随机 PWM、SPWM 法、线 电压控制 PWM 等,而在镍氢电池智能充电器中采用的脉宽 PWM 法, 它是把每一脉冲宽度均相等的脉冲列作为 PWM 波形,通过改变脉冲 列的周期可以调频,改变脉冲的宽度或占空比可以调压,采用适当 控制方法即可使电压与频率协调变化。可以通过调整 PWM 的周期、 PWM 的占空比而达到控制充电电流的目的。 尽管模拟控制看起来可能直观而简单,但它并 不总是非常经济或可行的。其中一点就是,模拟电路容易随时间漂 移,因而难以调节。能够解决这个问题的精密模拟电路可能非常庞 大、笨重(如老式的家庭立体声设备)和昂贵。模拟电路还有可能 严重发热,其功耗相对于工作元件两端电压与电流的乘积成正比。 模拟电路还可能对噪声很敏感,任何扰动或噪声都肯定会改变电流 值的大小。 通过以数字方式控制模拟电路,可以大幅度降低系统的成 本和功耗。此外,许多微控制器和 DSP 已经在芯片上包含了 PWM 控 制器,这使数字控制的实现变得更加容易了。 (3)脉冲宽度调制优点 PWM 的一个优点是从处理器到被控系统 信号都是数字形式的,无需进行数模转换。让信号保持为数字形式 可将噪声影响降到最小。噪声只有在强到足以将逻辑 1 改变为逻辑 0 或将逻辑 0 改变为逻辑 1 时,也才能对数字信号产生影响。 对噪声抵抗能力的增强是 PWM 相对于模拟控制的另外一个 优点,而且这也是在某些时候将 PWM 用于通信的主要原因。从模拟 信号转向 PWM 可以极大地延长通信距离。在接收端,通过适当的 RC 或 LC 网络可以滤除调制高频方波并将信号还原为模拟形式。 总之,PWM 既经济、节约空间、抗噪性能强,是一种值得 广大工程师在许多设计应用中使用的有效技术。 1.4 AT89C51 AT89C51 是一种带 4K 字节 FLASH 存储器 (FPEROM—Flash Programmable and Erasable Read Only Memory) 的低电压高性能 CMOS 8 位微处理器,俗称单片机。 (1)主要特性: ² 全静态工作:0Hz-24MHz ² 三级程序存储器锁定 ² 128×8 位内 部 RAM ² 32 可编程 I/O 线 ² 两个 16 位定时器/计数器 ² 5 个中断 源 ² 可编程串行通道 ² 低功耗的闲置和掉电模式 ² 片内振荡器和 时钟电路 (2)管脚说明: VCC:供电电压。 GND:接地。 P0 口:P0 口为一个 8 位漏级开路双向 I/O 口,每脚可吸 收 8TTL 门电流。当 P0 口的管脚第一次写 1 时,被定义为高阻输入。 P0 能够用于外部程序数 据存储器,它可以被定义为数据/地址的低 八位。在 FIASH 编程时,P0 口作 为原码输入口,当 FIASH 进行校 验时,P0 输出原码,此时 P0 外部必须接上 拉电阻。 P1 口:P1 口是一个内部提供上拉电阻的 8 位双向 I/O 口, P1 口缓冲器能接收输出 4TTL 门电流。P1 口管脚写入 1 后,被内部 上拉为高, 可用作输入,P1 口被外部下拉为低电平时,将输出电 流,这是由于内部上 拉的缘故。在 FLASH 编程和校验时,P1 口作 为低八位地址接收。 P2 口:P2 口为一个内部上拉电阻的 8 位双向 I/O 口,P2 口缓冲器可接收,输 出 4 个 TTL 门电流,当 P2 口被写“1”时,其 管脚被内部上拉电阻拉高,且 作为输入。并因此作为输入时,P2 口的管脚被外部拉低,将输出电流。这 是由于内部上拉的缘故。P2 口当用于外部程序存储器或 16 位地址外部数据 存储器进行存取时, P2 口输出地址的高八位。在给出地址“1”时,它利用 内部上拉优 势,当对外部八位地址数据存储器进行读写时,P2 口输出其特 殊 功能寄存器的内容。P2 口在 FLASH 编程和校验时接收高八位地址信 号和 控制信号。 P3 口:P3 口管脚是 8 个带内部上拉电阻的双向 I/O 口, 可接收输出 4 个 TTL 门电流。当 P3 口写入“1”后,它们被内部上 拉为高电平,并用作输入。作 为输入,由于外部下拉为低电平,P3 口将输出电流(ILL)这是由于上拉的 缘故。 P3 口也可作为 AT89C51 的一些特殊功能口,如下表所示: 口管脚 备选功能 P3.0 RXD(串行输入口) P3.1 TXD(串行输出口) P3.2 /INT0(外部中断 0) P3.3 /INT1(外部中断 1) P3.4 T0(记时器 0 外部输入) P3.5 T1(记时器 1 外部输入) P3.6 /WR(外部数据存储器写 选通) P3.7 /RD(外部数据存储器读选通) P3 口同时 为闪烁编程和编程校验接收一些控制信号。 RST:复位输入。当振荡器复位器件时,要保持 RST 脚两 个机器周期的高电平 时间。 ALE/PROG:当访问外部存储器时,地址锁存允许的输出电 平用于锁存地址的低 位字节。 在 FLASH 编程期间,此引脚用于输入编程脉冲。在平时,ALE 端 以不变的频率周期输出正脉冲信号,此频率为振荡器频率的 1/6。 因此它可 用作对外部输出的脉冲或用于定时目的。然而要注意的是: 每当用作外部数 据存储器时,将跳过一个 ALE 脉冲。如想禁止 ALE 的输出可在 SFR8EH 地址 上置 0。此时, ALE 只有在执行 MOVX, MOVC 指令是 ALE 才起作用。另外, 该引脚被略微拉高。如果微处 理器在外部执行状态 ALE 禁止,置位无效。 /PSEN:外部程序存储器的选通信号。在由外部程序存储 器取指期间,每个机 器周期两次/PSEN 有效。但在访问外部数据存 储器时,这两次有效的/PSEN 信号将不出现。 /EA/VPP:当/EA 保持低电平时,则在此期间外部程序存储 器(0000H-FFFFH), 不管是否有内部程序存储器。注意加密方式 1 时,/EA 将内部锁定为 RESET; 当/EA 端保持高电平时,此间内部程序存储器。在 FLASH 编程期间, 此引脚 也用于施加 12V 编程电源(VPP)。 XTAL1:反向振荡放大器的输入及内部时钟工作电路的输 入。 XTAL2:来自反向振荡器的输出。 (3)振荡器特性: XTAL1 和 XTAL2 分别为反向放大 器的输入和输出。该反向放大器可以配置 为片内振荡器。石晶振荡 和陶瓷振荡均可采用。如采用外部时钟源驱动器件, XTAL2 应不接。 有余输入至内部时钟信号要通过一个二分频触发器,因此对外 部时 钟信号的脉宽无任何要求,但必须保证脉冲的高低电平要求的宽度。 2.设计原理和方法 2.1 单片机的基本组成 图 1 51 单片机框图 2.2 方案的设计与选择 在电子技术领域中,实现函数信号发生器的 方法有很多种,可以采用不同的原理及器件构成不同的电路,但是 可以实现相同的功能。 (1)方案的比较: 方案一:采用单片函数发生器如 8038,8038 可同时产生正弦波,方 波等,而且方法简单易行。用 D/A 转换器的输出来改变调制电压, 也可以实现数控的调频进而改变周期,但是产生的频率稳定度不高。 方案二:采用锁相式频率合成器,利用锁相环,降压控振荡器 (VOC)的输出,频率锁定在所需的频率上,该方案性能良好,但是 难以达到输出频率覆盖系数的要求,其电路复杂。 方案三:采用单片机编程的方法实现。该方法可以通过编程, 来控制方波信号输出的周期和占空比,并且只要改变程序的相关参 数,便可以改变输出波形的周期和占空比。由于编程的方法产生的 是数字信号,所以信号的精度可以做到很高。并且电路简单。 鉴于方案一的信号频率不够稳定和方案二的电路复杂,频率覆 盖系数难以达标等缺点,所以决定采用方案三的设计方法。方案三 不仅仅是软硬件结合,而且它使用的元器件,容易得到,且价格便 宜,使得硬件的开销达到最省。 在此次设计中,利用 AT89C51 单片机,软硬件结合,实现占空 比和周期可调。案件的操作是通过数字电路跟外部中断 0 来控制的。 可以输出占空比在 1%到 99%可调,精度为 1%,周期在 5ms 到 60ms 可调,精度为 5ms 的方波。 本设计用到一个 AT89C51 微处理器,4 个按键,一个四输入与门。 AT89C51 用到两个定时器,定时器 0 和定时器 1。其中定时器 0 工作 在方式 1 下,决定输出信号的周期,定时器 1 工作在方式 1 下,决 定输出信号的占空比。按键 PERIOD+和 PERIOD-改变信号的周期,按 键 PERIOD+用于增大信号的周期,按一下就增大 5ms,当增大到 60ms 后,就归为 5ms。按键 PERIOD-用于减小输出信号的周期,按 一次键,输出信号的周期增大 5ms,当增大到 60ms 后,周期就归于 5ms。按键 ZKB+和 ZKB-改变信号的占空比,按键 ZKB+用于增加信号 的占空比,按下一次键,占空比就增加 1,上限值为 99,当再次按 键时,就让占空比归 1。按键 ZKB-用于减小信号的占空比,按下一 次键,占空比就减 1,下限值为 1,当再次按键时,就让占空比回归 到 99。通过上面的步骤,可以实现占空比和周期的可调。 同时,设计中采用了上电或开关复位电路用以应对其他可能事 件。开关闭合复位后回复初值:占空比 50%,周期 35ms。 2.3 定时器、的工作原理 定时/计数器实质上是一个加 1 计数器, 它可以工作于定时方式,也可以工作于计数方式,两种工作方式实 际是对脉冲计数,只不过是所计脉冲来源不同。定时/计数器的内部 结构和控制信号如下图 2 所示: 当其工作于定时方式时, =0,开关 S 打向上,计数器,的计数脉冲 来自振荡器的 12 分频后的脉冲(即 fosc/12),即对系统的机器周 期计数。档开关 K 受控合上时,每过一个周期,计数器,加 1; 当记满了预设的个数,回零,置位定时/计数器溢出中断标志位,产 生溢出中断。 图 2 定时器/计数器内部结构和控制信号 2.3.1 工作方式寄存 器 TMOD 工作方式寄存器 TMOD(地址:89H)为 8 位寄存器,8 位分 为两组,高四位控制 T1,低四位控制 T0。用于设置定时/计数器的 工作方式。其格式如下表 2.3.1 所示。 表 2.3.1 定时/计数器方式控制寄存器 TMOD D7 D6 D5 D4 D3 D2 D1 D0 GATE M1 M0 GATE M1 M0 | ← T1 方式字段 → | ← T0 方式字段 →| 下面对 TMOD 的各位作以说明: (1)GATE:门控位。 GATE=0 时,仅有运行控制位 TR0(或 TR1)=1,就可以启动定 时/计数器工作; GATA=1 时,由 TR0(或 TR1)=1 和外部中断引脚(INT0 或 INT1) 上的高电平共 同启动定时/计数器工作。 (2) ——定时/计数模式选择位。 =0 为定时模式; =1 为计数模式。 (3)M1,M0—工作方式选择位。 定时/计数器工作方式选择如下表 2.3.2 所示。 表 2.3.2 定时/计数器工作方式设置表 M1 M0 工作方式 说明 0 0 方式 0 13 位定时/计数器 0 1 方式 1 16 位定时/计数器 1 0 方 式 2 8 位初值自动重装入的 8 位定时/计数器 1 1 方式 3 仅适用于 T0,分成两个 8 位定时/计数器; T1 停止计数 2.3.2 定时/计数器控制寄存器 TCON TCON 的字节地址 为 88H,可进行位寻址,位地址为 88H—8Fh。 格式如下表 2.3.3 所示。 表 2.3.3 定时/计数器控制寄存器 TCON D7 D6 D5 D4 D3 D2 D1 D0 TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0 在 TCON 寄存器中,定时/计 数器的控制仅用了其中的高四位。 (1)TF1,TF0——T1,T0 溢出中断请求标志位。 当计数溢出时该位由硬件自动置为 1。CPU 响应中断后由硬件自 动清 0。工作时,CPU 可随时查询 TF 的状态。所以,可用作查询测 试的标志。也可以用软件置 1 或清 0,同硬件置 1 或清 0 的效果一 样。 (2)TR1,TR0——运行控制位。 置 1 时,启动定时/计数器工作; 还与 GATE 位的状态有关。 置 0 时,停止定时/计数器工作。 由软件置 1 或清 0。所以,用软件可控制定时/计数器的启动与 停止。 2.4 定时/计数器的工作方式 (1)方式 0 为 13 位计数,由 TL0 的低 5 位(高 3 位未用)和 TH0 的 8 位组成,最大计数值为(8192 个脉冲)。启动后计数器加 1 计数。TL0 的低 5 位计数满回零后向 进位,当 13 位计数满回零时,中断溢出位置 1,产生中断请求。 定时器模式时有:N=t/ Tcy (Tcy 指令周期) 计数初值计算的 公式为: (X 计数初值,N 计数个数) 定时器的初值还可以采用计数个数直 接取补法获得。 (2)方式 1 和方式 0 基本相同,唯一的区别是方式 1 的计数位 数是 16 位,由 TL1 作为低 8 位、TH1 作为高 8 位,组成了 16 位加 1 计数器 。其最大计数值为(65536 个脉冲),是几种方式中计数值 最大的方式。 计数个数(N)与计数初值(X)的关系为: (3)方式 2 为自动重装初值的 8 位计数方式。在这种方式下,在和 两个寄存器中,专用于寄存 8 位计数初值并保持不变,进行 8 位加 1 计数,当计数溢出时,除产生溢出中断请求外,还自动将中不变 的初值重新装载到。 计数个数与计数初值的关系为: (4)方式 3 只适用于 T0 定时/计数器,T0 定时器处于方式 3 时, T1 只能工作在 0,1,2 方式。TL0 和 TH0 被分成为两个独立的 8 位定 时/计数器。其中 TL0 可作为 8 位定时/计数器,TH0 只能作为 8 位 定时器。 2.5 设计方法 (1)方波的产生 在本设计方案中,采用的定时 器产生周期和占空比可调的方波。对比于工作方式 0,工作方式 1 具有 16 位的寄存器,定时时间更长,产生的频率范围更宽。对比于 工作方式 2,虽然方式 2 的自动重载功能使定时更加准确,但对于 产生低频来说,方式 2 的只有 256us 的定时时间,产生的中断多, 误差更大,因此选择设置在工作方式 1 下,GATE=0。 设定定时器设置初始值,即给高低电平分别分配定时时间。当 程序启动,由输入给定高电平,定时器开始加 1 计数,当高电平 16 位计数满回零时,TF 置 1,产生中断,高电平转为低电平,当低电 平 16 位计数满回零时,TF 置 1,产生中断,低电平再转为高电平, 得出方波。 (2)高电平时间的测量 本设计方案中,采用定时器测量高电 平的时间。将定时器设置在工作方式 1 下,并设置 GATE=1,此时要 用软件使 TR1=1,同时外部中断 1(INT1)引脚也为高电平时,才能 启动定时/计数器工作。所以将控制输出的方波接在外部中断 1 的输 入引脚上,当输入高电平,定时器开始启动,在下降沿的时候,读 T1 的值,即可算出高电平时间 T1_high。 3.系统硬件电路设计图 对于系统的软件仿真采用了 proteus 软 件设计仿真。 四个独立按键分别与单片机的 P1.0,P1.1,P1.2,P1.3 相连接, 并且通过一个四输入的与非门,将与非门的输出当做单片机外部中 断 0 的触发信号。当有按键按下时,就会进入外部中断程序。 P1.4 口输出信号连接到示波器,检测输出波形。 RST 复位引脚接入上电或开关复位,电源接通后,单片机自动复 位,并且在单片机运行期间,用开关操作也能使单片机复位。 系统硬件仿真电路原理图如下图所示: 4.程序框图 4.1 主程序框图: 图 4 主程序流程图 4.2 系统初始化: 初始化程序主要是给计数器 0 和 1 赋初值,初始化占空比为 50%, 信号周期为 35ms,设置定时器 0 和定时器 1 的工作方式,并开启计 数器 0 和计数器 1,设置外部中断的触发方式,开启总中断。 4.3 定时器中断程序框图: 定时器 0 用于控制输出信号的周期,定时器 1 用于控制输出信号的 占空比。 开始 赋初始值 结束 图 5 定时器中断程序框图 4.4 键盘扫描 程序框图: 当有按键按下时,进入到外部中断,然后暂时关闭外部中断,启动 延时程序,以消除抖动。然后检测是哪个按键被按下,然后对频率 或占空比的变量做出相应的赋值,并且将占空比的值送到数码管显 示。并且对定时器 0 和定时器 1 分别赋新的初值,开启外部中断, 定时器 0 和 1 中断,中断程序结束。 开始 关中断 延时消抖 是否有键按下 N N 判断按键号 Y 按键 处理 计算定时器初值 送入初值 关中断 结束 图 6 键盘扫描程序 框图 5.性能分析 5.1 定时器中断分析 本次周期占空比可调的信号 发生器的设计采用了定时器 0 和定时器 1 中断,定时器 0 中断用于 控制信号的周期,定时器 1 用于控制信号的占空比。当调节输出信 号的占空比时,信号的频率就不变; 如果调节信号的频率,占空比就不变。设 period 表示输出的周期, zkb 表示输出的占空比,TX 为定时器 0 的计数次数,TZ 为定时器 1 的计数次数。给 TX 装入初值为:TX=(65536-N);给 TZ 装入初值为 TZ=(65536-N); 当定时器 0 计数到时,开启定时器 1,定时器 1 开始计数,并且 P1.4 口输出高电平。当经过一个周期中高电平持续的时间后,定时 器 1 计数时间就到了,程序进入到定时器 1 中断执行,然后关掉定 时器 1,并且输出低电平。因为定时器 0 中断是一直开着的,当经 过一个周期中低电平持续的时间后,定时器 0 计数又到了,进入定 时器 0 中断执行,如此循环。当改变 period 或者 zkb 的时候,就可 以相应改变输出信号的周期跟占空比。 5.2 系统性能分析 该系统实现占空比跟周期可调的信号发生器。 占空比的调节范围是 1%到 99%,精度是 1%,当达到上限值时,再次 增加时,占空比归于 1%,达到下限时,再次减少,占空比自动归于 99%。周期的调节范围是 5ms 到 60ms,精度是 5ms,当达到上限值时, 再次增加时,周期自动归于 5ms,当达到下限值时,再次减少时, 周期自动归于 60ms)。 总之,这次设计达到了设计要求,输出的信号稳定度高,误差 小,并且方便调节,硬件电路简单。 6.源程序 #include #define uchar unsigned char #define uint unsigned int //float fosc=12000000; //系统时钟 频率 sbit key1=P1^0; //控制周期的增加 sbit key2=P1^1; //控 制周期的减少 sbit key3=P1^2; //控制占空比的增加 sbit key4=P1^3; //控制占空比的减少 sbit clk=P1^4; //信号输出端口 uint zkb=50; //占空比初值,取值范围为 1 到 99 uint period=35; //周期初值,取值范围为 5ms 到 60ms uint time0_H,time0_L,time1_H,time1_L; //延时程序 void delayms(uint z) { uint i,j; for(i=z;i--;i>0) for(j=110;j-- ;j>0); } //系统初始化 void init() { TMOD=0x11; //定时器 0 和 1 都工作在方式 1 time0_H=(65536-35000)/256; time0_L=(65536- 35000)%256; time1_H=(65536-17500)/256; time1_L=(65536- 17500)%256; TH0=time0_H; //定时器 0 装入初值,计数器计数 35000 次,35ms TL0=time0_L; TH1=time1_H; //定时器 1 装入初值, 计数器计数 17500 次,17.5ms TL1=time1_L; IT0=1; //外部中断 0 为下降沿触发 EX0=1; //开外部中断 0 允许位 ET0=1; //定时器 T0 中断允许 ET1=1; //定时器 T1 中断允许 EA=1; //开启总中断 TR0=1; //开启定时器 0 } //主程序 void main() { init( ); while(1); } //TO 中断程序 void T0_time() interrupt 1 { TR1=1; //开定时器 1 TH0=time0_H; TL0=time0_L; clk=1; } //T1 中断程序 void T1_time() interrupt 3 { TR1=0; //关定时 器 1 TH1=time1_H; TL1=time1_L; clk=0; } //键盘扫描程序 void keyscan() interrupt 0 //外部中断 0 { float TX,TZ; EX0=0; // 关中断 delayms(10); //延时消抖 if(P1!=0x0F) if(key1==0) { period=period+5; if(period>60) period=5; } if(key2==0) { period=period-5; if(period<5) period=60; } if(key3==0) { zkb=zkb+1; if(zkb>99) zkb=1; } if(key4==0) { zkb=zkb-1; if(zkb<1) zkb=99; } TX=(65536-(period)*1000); TZ=(65536- (period/2)*1000+(50-zkb)*period*10); time0_H=(uint)TX/256; time0_L=(uint)TX%256; time1_H=(uint)TZ/256; time1_L=(uint)TZ%256; P1=0x0f; EX0=1; TR0=1; TR1=1; } 7. 仿 真效果图 1. 电路通电仿真初始状态 初始值:周期 35ms,占空比 50% 2. 按 PERIOD 键改变周期 3.按 ZKB+或 ZKB-键改变占空比 总 结 此次课程设计真的让我着实收获颇多。 大三上学期了,就快要进入大四,此次课设也是大学仅剩的几 个课设之一了,我想通过自己的努力,好好做一下,好好锻炼自己 的专业能力。 接到这个题目,第一感觉还是蛮简单的。因为以前自己也自学 过一段时间的单片机,我的题目是占空比和周期可调的信号发生器, 我感觉蛮简单。但是当我真正的去做的时候,事情并不是我想象中 的那样。 刚开始没有怎么弄懂原理,只是脑袋里面有一个很模糊的概念, 要慢慢的把它实现出来。在网上找了点参考资料,自己设计了一个 电路图,弄了一个汇编程序,在 protues 里面仿真的时候,没有达 到自己想要的结果,我调试了很久,不断地改程序,但是结果总是 差强人意,频率的变化很大,没有规律。由于汇编程序的跳转指令 比较多,我纠结了半天都没弄出来。 然后我就开始该用 C 语言写程序,以前用 C 语言写过,对 C 语 言有一定的基础。我还在网上找了一点资料,对我的原理图也做了 改进,我认为最经典的地方是把四个按键通过一个四输入与非门连 接到外部中断 0 的入口,这样就可以很方便的检测按键,为写程序 提供了方便。通过这一点我了解到,好的硬件电路是软件的基础啊。 电路设计好了之后,写程序就方便多了,很快程序写出来了,在 Protues 里面仿真成功了,当时感觉好开心。 这次课程设计,我花了好几天的时间,前期是查资料,从上个 星期六开始,我就在寝室研究,不断地调试程序,从刚开始的毫无 进展,到做出课设要求的波形,心里还是很开心的。我感觉想做点 东西,自己必须沉下心来,查阅资料,自己思考,要有耐心,只要 你能坚持,你肯定能做出你想要做的东西的。 这次的设计到最后基本达到了设计的要求,最重要的是,在本 次设计过程中我学到了很多平时没有学到的或者说是很欠缺的东西, 在一定程度上也提升了自己的能力,受益匪浅。 致 谢 首先,在本课题的设计过程中,我的指导老师李文方老 师倾注了大量的心血,从选题到开题报告,从写作提纲,到一遍又 一遍地指出每稿中的具体问题,严格把关,循循善诱,在此我表示 衷心感谢。 其次,我还要感谢在我学习期间给我极大关心和支持的各位老 师以及关心我的同学和朋友。是他们为我提供了良好的学习工作环 境,让我从中获得了很多很多。 最后,在这课程设计结束之际,我还要感谢默默奉献的科技教 育技术人员,他们为我们提供了很好的学习平台。在他们这些“伟 人”的肩膀上我们可以看的更远,进步更快,学的更精。
查看更多

相关文章

您可能关注的文档