一、PWM

PWM ,英文名 Pulse Width Modulation ,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进 行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通 过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的 时间占据整个信号周期的百分比,例如方波的占空比就是50%.

占空比 : 一个周期内,高电平占据时长的百分比

STC89C52没有集成PWM功能,可以通过IO口软件模拟,相对硬件PWM来说精准度略差

二、关于舵机控制原理

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。

以180度角度伺服为例,那么对应的控制关系是这样的:

定时器需要定时20ms, 单位为0.5ms,初值0.5ms,cnt++,通过计数cnt=40个的0.5ms即为20ms

三、编程实现

初始化定时器0

void Timer0Init(void)        //500微秒@11.0592MHz
{//AUXR &= 0x7F;       TMOD &= 0xF0;      //设置定时器模式16位TMOD |= 0x01;      //设置定时器模式TL0 = 0x33;       //设置定时初始值0.5msTH0 = 0xFE;      //设置定时初始值TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时ET0 = 1;     //打开定时器0中断EA  = 1;     //打开总中断EA
}

定时器0中断服务函数

void Time0Handler() interrupt 1
{cnt++;                   //统计溢出的次数//重新给初值TL0 = 0x33;TH0 = 0xFE;//控制PWM波if(cnt < angle){sg90_con = 1;}else{sg90_con = 0;}if(cnt == 40){              //当溢出40次,经过了20mscnt = 0;                sg90_con = 1;}
}

整体代码

#include "reg52.h"
#include "intrins.h"sbit sg90_con = P1^1;
int angle;
int cnt = 0;void Delay2000ms()     //@11.0592MHz
{unsigned char i, j, k;_nop_();i = 15;j = 2;k = 235;do{do{while (--k);} while (--j);} while (--i);
}void Delay300ms()      //@11.0592MHz
{unsigned char i, j, k;i = 3;j = 26;k = 223;do{do{while (--k);} while (--j);} while (--i);
}void Timer0Init(void)      //500微秒@11.0592MHz
{//AUXR &= 0x7F;       TMOD &= 0xF0;      //设置定时器模式16位TMOD |= 0x01;      //设置定时器模式TL0 = 0x33;       //设置定时初始值0.5msTH0 = 0xFE;      //设置定时初始值TF0 = 0;      //清除TF0标志TR0 = 1;      //定时器0开始计时ET0 = 1;     //打开定时器0中断EA  = 1;     //打开总中断EA
}void main()
{Delay300ms();//让硬件稳定一下Timer0Init(); //初始化定时器angle = 1;      //初始角度是0度,0.5ms,溢出1就是0.5,高电平cnt = 0;sg90_con = 1;//一开始从高电平开始//每隔两秒切换一次角度while(1){angle = 3; //90度 1.5ms高电平cnt = 0;Delay2000ms();angle = 1; //0度cnt = 0;Delay2000ms();}
}void Time0Handler() interrupt 1
{cnt++;                   //统计溢出的次数//重新给初值TL0 = 0x33;TH0 = 0xFE;//控制PWM波if(cnt < angle){sg90_con = 1;}else{sg90_con = 0;}if(cnt == 40){              //当溢出40次,经过了20mscnt = 0;                sg90_con = 1;}
}

更多舵机控制请点击【51单片机STC89C52】舵机控制综合篇

【51单片机STC89C52】IO口模拟PWM控制SG90舵机相关推荐

  1. 使用IO口模拟PWM设计呼吸灯

    <<<<<正文>>>>> <硬件设计> 控制灯的IO口接芯片即可: <软件架构> <软件设计> 我的呼吸 ...

  2. 51单片机扩展io口实验c语言,【51单片机】普通I/O口模拟SPI口C语言程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 89C51系列单片机都不带SPI口,所在在这种情况下,我们可以模拟SPI口来现实我们要的功能,程序如下: //---------------------- ...

  3. 51单片机的io口可不可以接gnd_纯干货!简析单片机中的高阻态

    在我们刚一开始接触到51单片机的时候对P0口必须加上上拉电阻,否则P0就是高阻态. 对这个问题可能感到疑惑,为什么是高阻态?加上拉电阻?今天针对这一概念进行简单讲解.高阻态 高阻态这是一个数字电路里常 ...

  4. 51单片机之IO口扩展——74HC165芯片并行转串行实验

    我们都知道通信从大的方面有两种:串行和并行.串行的最大优点是占用总线少,但是传输速率低:并行恰恰相反,占用总线多,传输速率高.市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来 ...

  5. 51单片机之IO口扩展——74HC595芯片串行转并行实验

    我们都知道通信从大的方面有两种:串行和并行.串行的最大优点是占用总线少,但是传输速率低:并行恰恰相反,占用总线多,传输速率高.市面上有很多这样的芯片,有串入并出的(通俗讲就是 一个一个进,最后一块出来 ...

  6. 基于51单片机STC89C52RC的直流电机软件PWM控制的基本原理

    电机驱动芯片L293D介绍: 在这里直流电机的控制采用L293D芯片.L293D是一款单片集成的高电压.高电流.4通道电机驱动,设计用于连接标准DTL或TTL逻辑电平,驱动电感负载(诸如继电线圈.DC ...

  7. 51单片机的IO口和寄存器

    当我们拿到一块单片机时,我们首先看到的是他的外观,就像下边这样的: 当然对于51单片机来说,最常用的还是第一种样式的,这种叫做PDIP封装.在单片机上有很多小针(管脚),这些就是单片机用来输出数据,控 ...

  8. 基于51单片机的超声波避障小车(HC-SR04,SG90舵机)

    + 一.HC-SR04超声波模块 二.SG90舵机 三.总程序编写 一.HC-SR04超声波模块 HC-SR04时序图 触发信号输入端(Trig)输入一个10微秒以上的高电平信号,超声发送口收到信号自 ...

  9. 51单片机扩展io口C语言编写,51单片机扩展IO口后扩展口的地址如何确定

    1. 然后它说8255的A口.B口.C口.控制寄存器的地址分别为7FFCH.7FFDH.7FFEH.7FFFH.这个是怎么算出来的? 高八位7F是因为p2.7为0是选通8255的cs片选端,第八位是F ...

最新文章

  1. Brocade NOS学习笔记(第一章——第三章)
  2. 音频放大电路_低音升压功率放大器电子电路的完整设计
  3. 手里有200万,如何理财?
  4. python使用级数pi的近似值_JavaScript与Python计算pi的近似值运行时间对比
  5. 自己动手写CPU之第五阶段(1)——流水线数据相关问题
  6. 端口 0-65536 TCP和UDP端口的区别
  7. c语言数组用户注册登入管理系统_[内附完整源码和文档] 基于JAVA的干部档案管理系统...
  8. c语言大地坐标转空间直角坐标,大地坐标转换直角坐标的C++代码(高斯克吕格投影)...
  9. 数字通信技术知识点一
  10. linux系统下用python写入数据到excel行数限制解决方案(限制1048576行)
  11. 计算机中的数学【费马大定理】 数学史上最著名的定理: x^n + y^n = z^n(n 2时,没有正整数解)...
  12. 【翻译】MED 3D: TRANSFER LEARNING FOR 3D MEDICAL I MAGE ANALYSIS
  13. Python爬虫:js的btoa和atob和pythonBase64编码解码比对分析
  14. MPFC++ wrapper by Pavel
  15. 试题 算法训练 藏匿的刺客
  16. 如何改变alert的默认样式
  17. Python3 通过 suds 访问 webservice
  18. 播放视频出现错误代码0xc00d36c4如何修复?
  19. 时间片(time-slicing)轮循调度(round-robin scheduling)
  20. 小鸟云:浅谈5 种典型的云原生架构反模式

热门文章

  1. 关于在simulink中使用s-function后出现State derivatives returned by S-function during flag=1 call must be a rea
  2. 大数据早报:Google向化学家开放量子计算机 科学家将机器学习技术用于地震预测(10.25)
  3. Python学习:魔法函数
  4. 腾讯企业邮箱 python 发送邮件样例(一)
  5. 计算机论文答辩难不难,计算机专业毕业论文答辩的几个问题
  6. excel数据分类汇总
  7. BGL自定义权重,求dijkstra
  8. 【微信小程序教程】点击按钮修改文字大小
  9. 支付宝当面付扫码支付接口开发
  10. 给儿童使用护眼台灯怎么样选择更好?专家建议孩子买台灯