虫虫首页| 资源下载| 资源专辑| 精品软件
登录| 注册

1ms

  • 一阶RC电路的暂态过程

      一、实验目的   1.观察RC电路充放电过程,掌握时间常数的测量方法。   2.研究RC积分电路和微分电路的特点。   二、实验任务   1.观察记录图示电路的放电过程。求出时间常数τ。   2.设计时间常数τ为1ms的RC积分电路和微分电路,用示波器观察在脉冲信号源周期不同(与时间常数相比,即输入脉冲宽度T<<τ、T=τ、T>>τ)时的电路输出,记录输入、输出波形。

    标签: RC电路 暂态过程

    上传时间: 2013-10-25

    上传用户:baitouyu

  • MCS-51单片机应用设计

    本书从应用的角度,详细地介绍了MCS-51单片机的硬件结构、指令系统、各种硬件接口设计、各种常用的数据运算和处理程序及接口驱动程序的设计以及MCS-51单片机应用系统的设计,并对MCS-51单片机应用系统设计中的抗干扰技术以及各种新器件也作了详细的介绍。本书突出了选取内容的实用性、典型性。书中的应用实例,大多来自科研工作及教学实践,且经过检验,内容丰富、翔实。   本书可作为工科院校的本科生、研究生、专科生学习MCS-51单片机课程的教材,也可供从事自动控制、智能仪器仪表、测试、机电一体化以及各类从事MCS-51单片机应用的工程技术人员参考。 第一章 单片微型计等机概述   1.1 单片机的历史及发展概况   1.2 单片机的发展趋势   1.3 单片机的应用   1.3.1 单片机的特点   1.3.2 单片机的应用范围   1.4 8位单片机的主要生产厂家和机型   1.5 MCS-51系列单片机 第二章 MCS-51单片机的硬件结构   2.1 MCS-51单片机的硬件结构   2.2 MCS-51的引脚   2.2.1 电源及时钟引脚   2.2.2 控制引脚   2.2.3 I/O口引脚   2.3 MCS-51单片机的中央处理器(CPU)   2.3.1 运算部件   2.3.2 控制部件   2.4 MCS-51存储器的结构   2.4.1 程序存储器   2.4.2 内部数据存储器   2.4.3 特殊功能寄存器(SFR)   2.4.4 位地址空间   2.4.5 外部数据存储器   2.5 I/O端口   2.5.1 I/O口的内部结构   2.5.2 I/O口的读操作   2.5.3 I/O口的写操作及负载能力   2.6 复位电路   2.6.1 复位时各寄存器的状态   2.6.2 复位电路   2.7 时钟电路   2.7.1 内部时钟方式   2.7.2 外部时钟方式   2.7.3 时钟信号的输出 第三章 MCS-51的指令系统   3.1 MCS-51指令系统的寻址方式   3.1.1 寄存器寻址   3.1.2 直接寻址   3.1.3 寄存器间接寻址   3.1.4 立即寻址   3.1.5 基址寄存器加变址寄存器间址寻址   3.2 MCS-51指令系统及一般说明   3.2.1 数据传送类指令   3.2.2 算术操作类指令   3.2.3 逻辑运算指令   3.2.4 控制转移类指令   3.2.5 位操作类指令 第四章 MCS-51的定时器/计数器   4.1 定时器/计数器的结构   4.1.1 工作方式控制寄存器TMOD   4.1.2 定时器/计数器控制寄存器TCON   4.2 定时器/计数器的四种工作方式   4.2.1 方式0   4.2.2 方式1   4.2.3 方式2   4.2.4 方式3   4.3 定时器/计数器对输入信号的要求   4.4 定时器/计数器编程和应用   4.4.1 方式o应用(1ms定时)   4.4.2 方式1应用   4.4.3 方式2计数方式   4.4.4 方式3的应用   4.4.5 定时器溢出同步问题   4.4.6 运行中读定时器/计数器   4.4.7 门控制位GATE的功能和使用方法(以T1为例) 第五章 MCS-51的串行口   5.1 串行口的结构   5.1.1 串行口控制寄存器SCON   5.1.2 特殊功能寄存器PCON   5.2 串行口的工作方式   5.2.1 方式0   5.2.2 方式1   5.2.3 方式2   5.2.4 方式3   5.3 多机通讯   5.4 波特率的制定方法   5.4.1 波特率的定义   5.4.2 定时器T1产生波特率的计算   5.5 串行口的编程和应用   5.5.1 串行口方式1应用编程(双机通讯)   5.5.2 串行口方式2应用编程   5.5.3 串行口方式3应用编程(双机通讯) 第六章 MCS-51的中断系统   6.1 中断请求源   6.2 中断控制   6.2.1 中断屏蔽   6.2.2 中断优先级优   6.3 中断的响应过程   6.4 外部中断的响应时间   6.5 外部中断的方式选择   6.5.1 电平触发方式   6.5.2 边沿触发方式   6.6 多外部中断源系统设计   6.6.1 定时器作为外部中断源的使用方法   6.6.2 中断和查询结合的方法   6.6.3 用优先权编码器扩展外部中断源 第七章 MCS-51单片机扩展存储器的设计   7.1 概述   7.1.1 只读存储器   7.1.2 可读写存储器   7.1.3 不挥发性读写存储器   7.1.4 特殊存储器   7.2 存储器扩展的基本方法   7.2.1 MCS-51单片机对存储器的控制   7.2.2 外扩存储器时应注意的问题   7.3 程序存储器EPROM的扩展   7.3.1 程序存储器的操作时序   7.3.2 常用的EPROM芯片   7.3.3 外部地址锁存器和地址译码器   7.3.4 典型EPROM扩展电路   7.4 静态数据存储的器扩展   7.4.1 外扩数据存储器的操作时序   7.4.2 常用的SRAM芯片   7.4.3 64K字节以内SRAM的扩展   7.4.4 超过64K字节SRAM扩展   7.5 不挥发性读写存储器扩展   7.5.1 EPROM扩展   7.5.2 SRAM掉电保护电路   7.6 特殊存储器扩展   7.6.1 双口RAMIDT7132的扩展   7.6.2 快擦写存储器的扩展   7.6.3 先进先出双端口RAM的扩展 第八章 MCS-51扩展I/O接口的设计   8.1 扩展概述   8.2 MCS-51单片机与可编程并行I/O芯片8255A的接口   8.2.1 8255A芯片介绍   8.2.2 8031单片机同8255A的接口   8.2.3 接口应用举例   8.3 MCS-51与可编程RAM/IO芯片8155H的接口   8.3.1 8155H芯片介绍   8.3.2 8031单片机与8155H的接口及应用   8.4 用MCS-51的串行口扩展并行口   8.4.1 扩展并行输入口   8.4.2 扩展并行输出口   8.5 用74LSTTL电路扩展并行I/O口   8.5.1 用74LS377扩展一个8位并行输出口   8.5.2 用74LS373扩展一个8位并行输入口   8.5.3 MCS-51单片机与总线驱动器的接口   8.6 MCS-51与8253的接口   8.6.1 逻辑结构与操作编址   8.6.2 8253工作方式和控制字定义   8.6.3 8253的工作方式与操作时序   8.6.4 8253的接口和编程实例 第九章 MCS-51与键盘、打印机的接口   9.1 LED显示器接口原理   9.1.1 LED显示器结构   9.1.2 显示器工作原理   9.2 键盘接口原理   9.2.1 键盘工作原理   9.2.2 单片机对非编码键盘的控制方式   9.3 键盘/显示器接口实例   9.3.1 利用8155H芯片实现键盘/显示器接口   9.3.2 利用8031的串行口实现键盘/显示器接口   9.3.3 利用专用键盘/显示器接口芯片8279实现键盘/显示器接口   9.4 MCS-51与液晶显示器(LCD)的接口   9.4.1 LCD的基本结构及工作原理   9.4.2 点阵式液晶显示控制器HD61830介绍   9.5 MCS-51与微型打印机的接口   9.5.1 MCS-51与TPμp-40A/16A微型打印机的接口   9.5.2 MCS-51与GP16微型打印机的接口   9.5.3 MCS-51与PP40绘图打印机的接口   9.6 MCS-51单片机与BCD码拨盘的接口设计   9.6.1 BCD码拨盘   9.6.2 BCD码拨盘与单片机的接口   9.6.3 拨盘输出程序   9.7 MCS-51单片机与CRT的接口   9.7.1 SCIBCRT接口板的主要特点及技术参数   9.7.2 SCIB接口板的工作原理   9.7.3 SCIB与MCS-51单片机的接口   9.7.4 SCIB的CRT显示软件设计方法 第十章 MCS-51与D/A、A/D的接口   10.1 有关DAC及ADC的性能指标和选择要点   10.1.1 性能指标   10.1.2 选择ABC和DAC的要点   10.2 MCS-51与DAC的接口   10.2.1 MCS-51与DAC0832的接口   10.2.2 MCS-51同DAC1020及DAC1220的接口   10.2.3 MCS-51同串行输入的DAC芯片AD7543的接口   10.3 MCS-51与ADC的接口   10.3.1 MCS-51与5G14433(双积分型)的接口   10.3.2 MCS-51与ICL7135(双积分型)的接口   10.3.3 MCS-51与ICL7109(双积分型)的接口   10.3.4 MCS-51与ADC0809(逐次逼近型)的接口   10.3.5 8031AD574(逐次逼近型)的接口   10.4 V/F转换器接口技术   10.4.1 V/F转换器实现A/D转换的方法   10.4.2 常用V/F转换器LMX31简介   10.4.3 V/F转换器与MCS-51单片机接口   10.4.4 LM331应用举例 第十一章 标准串行接口及应用   11.1 概述   11.2 串行通讯的接口标准   11.2.1 RS-232C接口   11.2.2 RS-422A接口   11.2.3 RS-485接口   11.2.4 各种串行接口性能比较   11.3 双机串行通讯技术   11.3.1 单片机双机通讯技术   11.3.2 PC机与8031单片机双机通讯技术   11.4 多机串行通讯技术   11.4.1 单片机多机通讯技术   11.4.2 IBM-PC机与单片机多机通讯技术   11.5 串行通讯中的波特率设置技术   11.5.1 IBM-PC/XT系统中波特率的产生   11.5.2 MCS-51单片机串行通讯波特率的确定   11.5.3 波特率相对误差范围的确定方法   11.5.4 SMOD位对波特率的影响 第十二章 MCS-51的功率接口   12.1 常用功率器件   12.1.1 晶闸管   12.1.2 固态继电器   12.1.3 功率晶体管   12.1.4 功率场效应晶体管   12.2 开关型功率接口   12.2.1 光电耦合器驱动接口   12.2.2 继电器型驱动接口   12.2.3 晶闸管及脉冲变压器驱动接口 第十三章 MCS-51单片机与日历的接口设计   13.1 概述   13.2 MCS-51单片机与实时日历时钟芯片MSM5832的接口设计   13.2.1 MSM5832性能及引脚说明   13.2.2 MSM5832时序分析   13.2.3 8031单片机与MSM5832的接口设计   13.3 MCS-51单片机与实时日历时钟芯片MC146818的接口设计   13.3.1 MC146818性能及引脚说明   13.3.2 MC146818芯片地址分配及各单元的编程   13.3.3 MC146818的中断   13.3.4 8031单片机与MC146818的接口电路设计   13.3.5 8031单片机与MC146818的接口软件设计 第十四章 MCS-51程序设计及实用子程序   14.1 查表程序设计   14.2 散转程序设计   14.2.1 使用转移指令表的散转程序   14.2.2 使用地地址偏移量表的散转程序   14.2.3 使用转向地址表的散转程序   14.2.4 利用RET指令实现的散转程序   14.3 循环程序设计   14.3.1 单循环   14.3.2 多重循环   14.4 定点数运算程序设计   14.4.1 定点数的表示方法   14.4.2 定点数加减运算   14.4.3 定点数乘法运算   14.4.4 定点数除法   14.5 浮点数运算程序设计   14.5.1 浮点数的表示   14.5.2 浮点数的加减法运算   14.5.3 浮点数乘除法运算   14.5.4 定点数与浮点数的转换   14.6 码制转换   ……    

    标签: MCS 51 单片机 应用设计

    上传时间: 2013-11-06

    上传用户:xuanjie

  • 单片机延时1ms程序

    关于单片机延时函数

    标签: 1ms 单片机 延时 程序

    上传时间: 2013-11-01

    上传用户:二驱蚊器

  • LS4051技术资料

    为防止在上下电时电压/电流的波动对芯片的冲击,特别郑重要求本芯片供电电压的上升/下降时间必须大于1ms,否则可能会导致本芯片不能正常工作。 为避免此问题,强烈建议用户采用如下图所示的RC电路为芯片供电,其中R约为100Ω左右,电解电容C约为10uF左右,以确保时间常数τ≈1ms左右。值得说明的是τ大一些更好,可以增加电解电容C的容量,但不建议R大于300Ω。

    标签: 4051 LS 技术资料

    上传时间: 2014-12-27

    上传用户:fredguo

  • 电子密码锁的设计与实现

    电子密码锁的设计与实现一、实验目的 1.进一步掌握键盘扫描和LED显示的程序设计。 2.了解按键消抖的方法。 3.综合运用微机原理的软硬件知识。 二、实验内容与要求 1.基本要求 (1)具有密码输入功能,密码最多为6位;(2)设置退格键,以便删除输入错误的密码;(3)在输入的密码时数码管上只显示8,并根据输入位数依次横移;(4)设置确认键,当确认键按下后,判断输入密码是否正确;(5)当输入密码正确时,点亮发光二极管;当输入密码不正确时,发光二极管不亮并且蜂鸣器报警,重新输入,当三次密码输入不正确时,系统应锁定键盘10s。2.提高要求 将用户分为管理者和使用者,管理者拥有超级密码,可以修改其他人的密码。使用者不能修改密码。 三、实验报告要求 1.设计目的和内容 2.总体设计 3.硬件设计:原理图(接线图)及简要说明 4.软件设计框图及程序清单5.设计结果和体会(包括遇到的问题及解决的方法) 四、总体设计 电子密码锁的原理是:从键盘输入一组密码,CPU把该密码和设置密码比较,对则将锁打开(不同锁的控制方式不一样,比如加电控制电磁铁抽回,从而打开),错则要求重新输入,并记录错误次数,如果三次错误,则被强制锁定并报警,除非超级密码或者其他的手段打开,比如延时一段时间。 初步设计思路如下: 1.输入密码用矩形键盘,包括数字键和功能键,功能键包括退格键和确认键。 2.LED数码管显示输入密码,但是只是输出显示符号8 。采用动态扫描输出。 3.用发光二极管模拟锁的情况,锁关时发光二极管灭,打开时发光二极管亮。 4.输入密码错误时报警,3次输入错误时键盘锁定10s,键盘无法接收数据。 软件的设计主要包括矩形键盘键值的读取、LED动态扫描输出程序、密码判断程序和报警程序。   五、硬件设计 根据设计思路,硬件电路可通过实验平台上的一些功能模块电路组成,由于实验平台上的各个功能模块已经设计好,用户在使用时只要设计模块间电路的连接,因此,硬件电路的设计及实现相对简单。完整系统的硬件连接如图1所示。硬件电路由LED数码管显示模块、按键模块、发光二极管电路和蜂鸣器模块组成。各个模块的详细说明:1.LED数码管模块实验平台上提供一组六个LED数码管。插孔CS1用于数码管段选的输出选通,插孔CS2用于数码管位选信号的输出选通。本设计用6个数码管来动态显示时分秒,动态显示的定时时间由8253定时/计数器来实现。8253主要是实现每位显示时间1ms,由8253的计数器0来实现。Clk0接实验平台分频电路输出Q6,f=46875hz。GATE0接8255的PA0,由8255的PA0输出来控制计数器的起停。OUT0接8259的IRQ2,定时完成请求中断,进入中断服务程序。软件在中断服务程序中LED数码管显示。

    标签: 电子密码锁

    上传时间: 2013-10-16

    上传用户:15070202241

  • 数字电子技术基础第五版答案_康华光

    因为图题所示为周期性数字波,所以两个相邻的上升沿之间持续的时间为周期,T=10ms频率为周期的倒数,f=1/T=1/0.01s=100HZ,占空比为高电平脉冲宽度与周期的百分比,q=1ms/10ms*100%=10%.

    标签: 数字电子 技术基础

    上传时间: 2013-10-31

    上传用户:angle

  • Arduino学习笔记4_Arduino软件模拟PWM

    注:1.这篇文章断断续续写了很久,画图技术也不精,难免错漏,大家凑合看.有问题可以留言.      2.论坛排版把我的代码缩进全弄没了,大家将代码粘贴到arduino编译器,然后按ctrl+T重新格式化代码格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脉宽调制波,通过调整输出信号占空比,从而达到改 变输出平均电压的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 个8 位精度PWM 引脚,分别是3, 5, 6, 9, 10, 11 脚。我们可以使用analogWrite()控 制PWM 脚输出频率大概在500Hz 的左右的PWM 调制波。分辨率8 位即2 的8 次方等于 256 级精度。但是有时候我们会觉得6 个PWM 引脚不够用。比如我们做一个10 路灯调光, 就需要有10 个PWM 脚。Arduino Duemilanove 2009 有13 个数字输出脚,如果它们都可以 PWM 的话,就能满足条件了。于是本文介绍用软件模拟PWM。 二、Arduino 软件模拟PWM Arduino PWM 调压原理:PWM 有好几种方法。而Arduino 因为电源和实现难度限制,一般 使用周期恒定,占空比变化的单极性PWM。 通过调整一个周期里面输出脚高/低电平的时间比(即是占空比)去获得给一个用电器不同 的平均功率。 如图所示,假设PWM 波形周期1ms(即1kHz),分辨率1000 级。那么需要一个信号时间 精度1ms/1000=1us 的信号源,即1MHz。所以说,PWM 的实现难点在于需要使用很高频的 信号源,才能获得快速与高精度。下面先由一个简单的PWM 程序开始: const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { if((bright++) == 255) bright = 0; for(int i = 0; i < 255; i++) { if(i < bright) { digitalWrite(PWMPin, HIGH); delayMicroseconds(30); } else { digitalWrite(PWMPin, LOW); delayMicroseconds(30); } } } 这是一个软件PWM 控制Arduino D13 引脚的例子。只需要一块Arduino 即可测试此代码。 程序解析:由for 循环可以看出,完成一个PWM 周期,共循环255 次。 假设bright=100 时候,在第0~100 次循环中,i 等于1 到99 均小于bright,于是输出PWMPin 高电平; 然后第100 到255 次循环里面,i 等于100~255 大于bright,于是输出PWMPin 低电平。无 论输出高低电平都保持30us。 那么说,如果bright=100 的话,就有100 次循环是高电平,155 次循环是低电平。 如果忽略指令执行时间的话,这次的PWM 波形占空比为100/255,如果调整bright 的值, 就能改变接在D13 的LED 的亮度。 这里设置了每次for 循环之后,将bright 加一,并且当bright 加到255 时归0。所以,我们 看到的最终效果就是LED 慢慢变亮,到顶之后然后突然暗回去重新变亮。 这是最基本的PWM 方法,也应该是大家想的比较多的想法。 然后介绍一个简单一点的。思维风格完全不同。不过对于驱动一个LED 来说,效果与上面 的程序一样。 const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { digitalWrite(PWMPin, HIGH); delayMicroseconds(bright*30); digitalWrite(PWMPin, LOW); delayMicroseconds((255 - bright)*30); if((bright++) == 255) bright = 0; } 可以看出,这段代码少了一个For 循环。它先输出一个高电平,然后维持(bright*30)us。然 后输出一个低电平,维持时间((255-bright)*30)us。这样两次高低就能完成一个PWM 周期。 分辨率也是255。 三、多引脚PWM Arduino 本身已有PWM 引脚并且运行起来不占CPU 时间,所以软件模拟一个引脚的PWM 完全没有实用意义。我们软件模拟的价值在于:他能将任意的数字IO 口变成PWM 引脚。 当一片Arduino 要同时控制多个PWM,并且没有其他重任务的时候,就要用软件PWM 了。 多引脚PWM 有一种下面的方式: int brights[14] = {0}; //定义14个引脚的初始亮度,可以随意设置 int StartPWMPin = 0, EndPWMPin = 13; //设置D0~D13为PWM 引脚 int PWMResolution = 255; //设置PWM 占空比分辨率 void setup() { //定义所有IO 端输出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //随便定义个初始亮度,便于观察 brights[ i ] = random(0, 255); } } void loop() { //这for 循环是为14盏灯做渐亮的。每次Arduino loop()循环, //brights 自增一次。直到brights=255时候,将brights 置零重新计数。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是计数一个PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每个PWM 周期均遍历所有引脚 { if(i < brights[j])\   所以我们要更改PWM 周期的话,我们将精度(代码里面的变量:PWMResolution)降低就行,比如一般调整LED 亮度的话,我们用64 级精度就行。这样速度就是2x32x64=4ms。就不会闪了。

    标签: Arduino PWM 软件模拟

    上传时间: 2013-10-08

    上传用户:dingdingcandy

  • LPC1300用户手册 Flash存储器编程固件

    引导装载程序(boot loader)控制复位后的初始化操作,并提供对Flash存储器进行编程的方法。这可以对空片进行初始编程、对事先已编程的芯片进行擦除和再编程或者是在系统运行时通过系统中的应用程序对Flash存储器进行编程。19.3特性在系统编程:在系统编程(ISP)是通过使用引导装载程序软件和UART0串口对片内Falsh存储器进行编程/再编程的方法。这种方法也可以在芯片位于终端用户板时使用;在应用编程:在应用编程(IAP)是通过终端用户的应用代码对片内Flash存储器进行擦除/写操作的方法;只有LPC134x系列Cortex-M3微控制器支持从USB端口引导,通过将其枚举为大容量存储器等级(MSC)设备来连接到USB主机接口(仅适用于Windows操作系统);Flash访问时间可通过Flash控制器模块中的寄存器来配置;每个扇区的擦除时间为100ms±5%;而每个256字节的模块,其编程时间为1ms±5%。

    标签: Flash 1300 LPC 用户手册

    上传时间: 2013-11-04

    上传用户:weixiao99

  • Arduino学习笔记4_Arduino软件模拟PWM

    注:1.这篇文章断断续续写了很久,画图技术也不精,难免错漏,大家凑合看.有问题可以留言.      2.论坛排版把我的代码缩进全弄没了,大家将代码粘贴到arduino编译器,然后按ctrl+T重新格式化代码格式即可看的舒服. 一、什么是PWM PWM 即Pulse Wavelength Modulation 脉宽调制波,通过调整输出信号占空比,从而达到改 变输出平均电压的目的。相信Arduino 的PWM 大家都不陌生,在Arduino Duemilanove 2009 中,有6 个8 位精度PWM 引脚,分别是3, 5, 6, 9, 10, 11 脚。我们可以使用analogWrite()控 制PWM 脚输出频率大概在500Hz 的左右的PWM 调制波。分辨率8 位即2 的8 次方等于 256 级精度。但是有时候我们会觉得6 个PWM 引脚不够用。比如我们做一个10 路灯调光, 就需要有10 个PWM 脚。Arduino Duemilanove 2009 有13 个数字输出脚,如果它们都可以 PWM 的话,就能满足条件了。于是本文介绍用软件模拟PWM。 二、Arduino 软件模拟PWM Arduino PWM 调压原理:PWM 有好几种方法。而Arduino 因为电源和实现难度限制,一般 使用周期恒定,占空比变化的单极性PWM。 通过调整一个周期里面输出脚高/低电平的时间比(即是占空比)去获得给一个用电器不同 的平均功率。 如图所示,假设PWM 波形周期1ms(即1kHz),分辨率1000 级。那么需要一个信号时间 精度1ms/1000=1us 的信号源,即1MHz。所以说,PWM 的实现难点在于需要使用很高频的 信号源,才能获得快速与高精度。下面先由一个简单的PWM 程序开始: const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { if((bright++) == 255) bright = 0; for(int i = 0; i < 255; i++) { if(i < bright) { digitalWrite(PWMPin, HIGH); delayMicroseconds(30); } else { digitalWrite(PWMPin, LOW); delayMicroseconds(30); } } } 这是一个软件PWM 控制Arduino D13 引脚的例子。只需要一块Arduino 即可测试此代码。 程序解析:由for 循环可以看出,完成一个PWM 周期,共循环255 次。 假设bright=100 时候,在第0~100 次循环中,i 等于1 到99 均小于bright,于是输出PWMPin 高电平; 然后第100 到255 次循环里面,i 等于100~255 大于bright,于是输出PWMPin 低电平。无 论输出高低电平都保持30us。 那么说,如果bright=100 的话,就有100 次循环是高电平,155 次循环是低电平。 如果忽略指令执行时间的话,这次的PWM 波形占空比为100/255,如果调整bright 的值, 就能改变接在D13 的LED 的亮度。 这里设置了每次for 循环之后,将bright 加一,并且当bright 加到255 时归0。所以,我们 看到的最终效果就是LED 慢慢变亮,到顶之后然后突然暗回去重新变亮。 这是最基本的PWM 方法,也应该是大家想的比较多的想法。 然后介绍一个简单一点的。思维风格完全不同。不过对于驱动一个LED 来说,效果与上面 的程序一样。 const int PWMPin = 13; int bright = 0; void setup() { pinMode(PWMPin, OUTPUT); } void loop() { digitalWrite(PWMPin, HIGH); delayMicroseconds(bright*30); digitalWrite(PWMPin, LOW); delayMicroseconds((255 - bright)*30); if((bright++) == 255) bright = 0; } 可以看出,这段代码少了一个For 循环。它先输出一个高电平,然后维持(bright*30)us。然 后输出一个低电平,维持时间((255-bright)*30)us。这样两次高低就能完成一个PWM 周期。 分辨率也是255。 三、多引脚PWM Arduino 本身已有PWM 引脚并且运行起来不占CPU 时间,所以软件模拟一个引脚的PWM 完全没有实用意义。我们软件模拟的价值在于:他能将任意的数字IO 口变成PWM 引脚。 当一片Arduino 要同时控制多个PWM,并且没有其他重任务的时候,就要用软件PWM 了。 多引脚PWM 有一种下面的方式: int brights[14] = {0}; //定义14个引脚的初始亮度,可以随意设置 int StartPWMPin = 0, EndPWMPin = 13; //设置D0~D13为PWM 引脚 int PWMResolution = 255; //设置PWM 占空比分辨率 void setup() { //定义所有IO 端输出 for(int i = StartPWMPin; i <= EndPWMPin; i++) { pinMode(i, OUTPUT); //随便定义个初始亮度,便于观察 brights[ i ] = random(0, 255); } } void loop() { //这for 循环是为14盏灯做渐亮的。每次Arduino loop()循环, //brights 自增一次。直到brights=255时候,将brights 置零重新计数。 for(int i = StartPWMPin; i <= EndPWMPin; i++) { if((brights[i]++) == PWMResolution) brights[i] = 0; } for(int i = 0; i <= PWMResolution; i++) //i 是计数一个PWM 周期 { for(int j = StartPWMPin; j <= EndPWMPin; j++) //每个PWM 周期均遍历所有引脚 { if(i < brights[j])\   所以我们要更改PWM 周期的话,我们将精度(代码里面的变量:PWMResolution)降低就行,比如一般调整LED 亮度的话,我们用64 级精度就行。这样速度就是2x32x64=4ms。就不会闪了。

    标签: Arduino PWM 软件模拟

    上传时间: 2013-10-23

    上传用户:mqien

  • 一个任务显示LED

    一个任务显示LED,一个扫描键盘,一个任务将键值转化为显示格式(无时间要求) 键盘模块完全参照巨人老师例程; 显示很简单:1、判是否到2ms 2、送显示 键值处理:1、有无有效信息 2、弹出有效信息处理队列 3、将信息处理;键值处理不随1ms动作

    标签: LED

    上传时间: 2015-04-20

    上传用户:亚亚娟娟123