定时器产生PWM

2023-05-16

1 用两个定时器/计数器产生矩形波

这种方法的基本原理就是用T0作为矩形波的周期的定时器,每一周期产生一次中断,用T1作为矩形波的高电平的计时器,每到T0的定时中断,输出矩形波的引脚输出高电平,而到T1中断产生时,将该引脚置为低电平,这样就得到了所需要的矩形波。通过改变T0的计数值可以改变周期,而改变T1的计数值可以改变占空比。

下面通过一个例子说明这种方法。在例子中,矩形波频率为10Hz(即周期为100ms),占空比为25%(即高电平周期为25ms),通过单片机引脚P2.0输出矩形波。程序流程如图13.4所示。程序如例13-2所示,所用晶振频率为12.0MHz。

【例13-2】用MCS-51单片机的T0和T1产生矩形波。

#include <reg51.h>

typedef unsigned char uchar;

sbit signal=P2^0;

uchar counter;

void main(void)

{

    TR0=0;                   //禁止T0

    TMOD=0x11;               //T0和T1均选择工作方式1,16位定时器

    TH0=-1000/256;           //定时时间为50ms

    TL0=-1000%256;          

    signal=0;                //开始时输出为低电平

    counter=0;               //初始化T1的中断次数为0

    EA=1;                    //使能CPU中断

    ET0=1;                   //使能T0溢出中断

    ET1=1;                   //使能T1溢出中断

    TR0=1;                   //T0开始运行,注意,T1不能现在运行

    while(1)                 //无限循环

    {}

}

void isr_t0(void) interrupt 1   //T0中断服务函数

{  

    TH0=-50000/256;          //定时时间为50ms

    TL0=-50000%256;

    counter++;               //中断次数

    if(counter==2)           //若已中断两次,说明已经过去100ms

    {

        counter=0;           //中断次数归零

        signal=1;            //产生矩形波中的高电平

        TR1=1;               //唤醒T1,T1开始计数

    }

}

void isr_t1(void) interrupt 3   //T1中断服务函数

{  

    signal=0;                //矩形波中的低电平

    TR1=0;                   //禁止T1计数,等待T0将其唤醒

    TH1=-25000/256;          //25ms中断初值

    TL1=-25000%256;

}

 

2.用一个定时器/计数器产生矩形波

在使用定时器、计数器完成其他功能的场合,用两个定时器/计数器产生矩形波的方法是不合适的,因为某些MCS-51单片机内部只有两个定时器/计数器。这时候通常使用第二种方法,即只使用一个定时器/计数器产生矩形波。

这种方法的基本原理是使引脚产生一个低电平,对T1或T0设置计数初始值并运行,使之经过时间t1后产生定时中断;在中断服务函数中将引脚设置为高电平,对定时器/计数器设置另一个计数初始值,经过时间t2后产生中断,在中断服务函数中将引脚设置为低电平,对定时器/计数器设置低电平维持所需的计数初始值,如此循环往复,就产生一个高电平时间为t2、周期为(t1+t2)的矩形波。

仍以产生一个从单片机引脚P2.0输出的、输出频率为10Hz、占空比为25%的矩形波为例。程序流程如图13.5所示。程序的关键是从高电平转变到低电平以及从低电平转变到高电平,因此在程序中使用一个位变量来标志中断产生前输出的是低电平还是高电平。程序如例13-3所示:

【例13-3】用一个定时器/计数器产生输出频率为10Hz、占空比为25%矩形波。

#include <reg51.h>

typedef unsigned char uchar;

sbit signal=P2^0;

bit level;                      //用来存储产生T0中断之前输出何种电平

uchar counter;

void main(void)

{

    TMOD=0x01;                   //T0选择工作方式1,16位定时器

    TH0=-25000/256;              //定时时间为25ms

    TL0=-25000%256;         

    counter=0;signal=1;level=1;  //初始化全局变量

    EA=1;                        //使能CPU中断

    ET0=1;                       //使能T0溢出中断

    TR0=1;                       //T0开始运行    

    while(1)                     //无限循环

    {}

}

void isr_t0(void) interrupt 1   //T0中断服务函数

{  

    if(level==1)                 //如果中断产生之前输出的是高电平

    {

        signal=0;                //输出低电平

        TH0=-25000/256;          //定时时间为25ms时的初值

        TL0=-25000%256; 

        level=0;                 //保存当前输出的电平(低电平)

    }

   else                         //如果中断产生之前输出的是低电平

   {

        counter++;               //中断次数计数加1

        if(counter==3)           //如果已经输出低电平75ms

        {

            counter=0;            //中断次数计数归零

            signal=1;             //输出高电平

            TH0=-25000/256;

            TL0=-25000%256;  

            level=1;              //保存当前输出的电平(高电平)

        }

   }

}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

定时器产生PWM 的相关文章

随机推荐

  • Linux C语言网络编程(学习笔记一):socket实现本地通信

    目录 1 网络编程常识 2 简单的本地通信 2 1 socket实现本地通信 2 2 相关API讲解 2 3 服务端和客户端代码演示 Linux的网络连接是通过内核完成的 xff0c 其支持多种网络协议 xff0c 如TCP IP IPX
  • 基于Jetson TX1的 YOLO: Real-Time Object Detection

    Data 2017 1 4 Author cjh Theme YOLO Real Time Object Detection 最近导师给我发了一篇文章YOLO9000Better Faster Stronger xff0c 让我把里面的源代
  • Linux C语言POSIX线程(学习笔记一)

    进程在Linux中是资源管理的最小单位 xff0c 而线程是进程执行的最小单位 在操作系统的发展过程中 xff0c 从进程演化到线程 xff0c 其最主要的目的就是更好地支持SMP 多核编程以及减少进程调度中的上下文切换开销 相比之下 xf
  • 网线八根线作用及水晶头网线制作流程

    网线八根线作用 xff1a 首先要知道的是八根铜导线的整体作用 xff0c 八根铜导线是为了削减电磁信号的彼此搅扰 xff0c 每两根按必定的密度缠绞在一起 这样 xff0c 在传输电信号时彼此之间辐射的电波就会彼此抵消 xff0c 最大程
  • C++中常用的容器String、vector、list、map(学习笔记)

    目录 一 String容器 初始化 string对象上的操作 二 vector容器 初始化 区分是列表初始化还是值初始化 xff1a 其他操作 三 list容器 四 map容器 这里主要讲C 43 43 中经常用到的一些保存数据的容器 xf
  • Linux C++使用TCP通信实现同一局域网下电脑客户端与工控机服务端传输文件数据(亲测可用)

    使用平台说明 xff1a 电脑 xff08 客户端 xff09 ubuntu18 43 vscode 工控机 xff08 服务端 xff09 ubuntu16 43 vscode 实现功能说明 xff1a 电脑和工控机连在同一wifi局域网
  • Ubuntu18终端显示内容太少的解决办法

    1 在终端的空白处点击鼠标右键 xff0c 选择配置文件首选项 2 点击配置 gt 点击滚动 gt 选择无限回滚
  • Docker ——给我们的应用映射端口号

    一 概念 Docker 端口映射即映射容器内应用的服务端口到本机宿主机器 二 实现 当容器中运行一些网络应用 xff0c 要让外部访问这些应用时 xff0c 可以通过 P 或 p 参数两种方式来指定端口映射 1 随机映射 使用 P 参数时
  • HI3516DV300/HI3519AV100/HI3559AV100 实现RTSP/RTMP视频流实时识别YOLOV3 识别速度14帧/S

    本教程是基于yolov3在硬件实现硬件的实时视频处理 xff01 不是SAMPLE中的处理单张图片照片 xff01 未采用opencv库 xff0c 数据处理全部采用硬件加速 xff01 直接对摄像头数据直接进行图像识别 xff01 HI3
  • 海思3559平台MCP2515 SPI转CAN驱动配置

    1 转载前言 由于海思平台需要接入CAN设备 xff0c 而3559平台的CAN接口没有驱动支持 xff1b 但是标准Linux是支持mcp2515驱动 xff0c 作为CAN设备接入的 2 需要修改内容 SPI pinmux复用配置内核开
  • vscode 修改C/C++的代码格式化风格

    默认的样式真的太丑了 xff0c 预定义样式 Ctrl 43 Shift 43 P输入user settings xff0c 进入Settings界面 xff1b 或者菜单栏File Preferences Settings 搜索clang
  • linux 下 pthread_cond_t 详解

    一览 本文目的为何需要条件变量三个问题 传入前锁mutex传入后解锁mutex返回前再次锁mutex pthread cond signal的两种写法尾语 本文目的 首先说明 xff0c 本文重点不在怎么用条件变量 这里我先列出 apue
  • 基于Jetson TX1的caffe环境搭建

    Data 2017 03 13 Author cjh Theme Set up the Caffe environment 步骤1 xff1a 安装caffe所需的安装包 sudo add apt repository universe s
  • 服务器BMC与IPMI基础知识

    初识BMC与IPMI 什么是BMC xff1f BMC全名Baseboard management controller 是一种嵌入式管理微控制器 BMC全称为基板管理控制器 xff08 Baseboard Manager Controll
  • 外企常用邮件回复

    Ways to Say Thank You xff08 如何表达感谢 xff09 1 Thanks Thank you xff08 谢谢 xff09 2 Thanks a lot xff08 多谢 xff09 3 Thank you so
  • 光模块SFP基础接口标准入门

    说到光模块 xff0c 相信大家一定不会觉得陌生 随着光通信的高速发展 xff0c 现在我们工作和生活中很多场景都已经实现了 光进铜退 也就是说 xff0c 以同轴电缆 网线为代表的金属介质通信 xff0c 逐渐被光纤介质所取代 而光模块
  • 7.PCIE配置空间读写软件

    软件 7 PCIE配置空间读写 软件 7 PCIE配置空间读写 软件 7 PCIE配置空间读写 软件读写配置空间 驱动层接口原理分析 驱动层代码接口驱动层接口与原理 相关参考基础知识raw pci ops 得初始化raw pci ext o
  • SFF-8436 QSFP + 4X 10 Gb / s可插拔收发器规范 Rev 4.9文档翻译

    之前利用闲暇时间依次翻译了SFP MSA SFF 8024 SFF 8472的相关文档 xff0c 原由是在交换机端口开发中有参考到相关的信息 xff0c 虽然用到的字段不多 xff0c 但是本着学习的心态 xff0c 对其内容作了大部分的
  • MDIO:读数据下冲不满足spec

    PHY C827 MDC PHY C827 MDIO Measured at U CPU AD53 AE52 Description MDIO 读数据下冲不满足spec xff08 Spec要求 xff1a Min 0 5V xff09 测
  • 定时器产生PWM

    1 用两个定时器 计数器产生矩形波 这种方法的基本原理就是用T0作为矩形波的周期的定时器 xff0c 每一周期产生一次中断 xff0c 用T1作为矩形波的高电平的计时器 xff0c 每到T0的定时中断 xff0c 输出矩形波的引脚输出高电平