51单片机理通定时器输出PWM例程

发布者:Wanderlust123最新更新时间:2020-01-21 来源: 51hei关键字:51单片机  定时器  输出PWM 手机看文章 扫描二维码
随时随地手机看文章

开门第一话,授人以鱼不如授人以渔。简单介绍一下原理及程序过程。

通过定时中断翻转IO口电平。PWM波一个周期需要两次电平翻转,因为高电平时间与低电平时间可能不相对,所以定时器需要根据该电平状态的持续时间来负初值,也就是说,不能用常量。赋初值后启动定时器,中断时翻转IO口电平,实现PWM波的输出。


开门第二话,直接上代码。

IO口及变量定义

//定义IO口以及高低电平持续时间对应定时器初值的暂存变量


sbit PWM=P2^6;

uint PWM_H=0;        //高电平定时器初值

uint PWM_L=0;        //低电平定时器初值


初始化部分,提供“周期+脉宽”和“频率+占空比”两种方式的初始化函数

////////////////////////////////////////////////////////////////////////

//        名称 : PWM_Init_Cycle(uint cycle,uint width)

//        功能 : 通过周期和脉宽调制PWM波

//        参数 : 

//                        uint cycle                周期                单位:微秒                范围:20-65535

//                        uint width                脉宽                单位:微秒                范围:20-65535

//        返回 : 无

////////////////////////////////////////////////////////////////////////

void PWM_Init_Cycle(uint cycle,uint width)

{

        TMOD=0x01;//定时器0工作方式1

        EA=1;                        //开总中断

        ET0=1;                //开定时器0中断

TH0=TL0=0;

        PWM_H=0xFFFF-width;

        PWM_L=0xFFFF-(cycle-width);

TR0=1;                //启动定时器0

}

////////////////////////////////////////////////////////////////////////

//        名称 : PWM_Init_Fre(uint fre,uchr duty)

//        功能 : 通过频率和占空比调制PWM波

//        参数 : 

//                        uint fre                        频率                        单位:赫兹                        范围:20-50000

//                        uchr duty                        占空比                单位:百分比                范围:1-100

//        返回 : 无

////////////////////////////////////////////////////////////////////////

void PWM_Init_Fre(uint fre,uchr duty)

{

        int cycle=1000000/fre;

        TR0=0;                //停止定时器0

        TMOD=0x01;//定时器0工作方式1

        TH0=TL0=0;

        EA=1;                        //开总中断

        ET0=1;                //开定时器0中断

PWM_H=cycle/100*duty;  //算出持续时间

        PWM_L=cycle-PWM_H;

        PWM_H=0xFFFF - PWM_H;/持续时间转换为初值

        PWM_L=0xFFFF - PWM_L;

TR0=1;                //启动定时器0

}


PWM调制定时器中断处理

////////////////////////////////////////////////////////////////////////

//        名称 : interrupt_timer0(void)

//        功能 : 定时器0溢出终端处理函数

//        参数 : 无

//        返回 : 无

////////////////////////////////////////////////////////////////////////

void interrupt_timer0(void) interrupt 1

{

        PWM=!PWM;                //翻转IO电平

        if(PWM)                        //高电平,把高电平对应的初值搬入定时器

        {

                TH0=(uchr)(PWM_H>>8);

                TL0=(uchr)(PWM_H>>0);

        }

        else                        //低电平,把低电平对应的初值搬入定时器

        {

                TH0=(uchr)(PWM_L>>8);

                TL0=(uchr)(PWM_L>>0);

        }

}


是不是觉得特别简单。放心,我没有偷懒代码都在。


总结一下,由于是通过定时器中断调制的脉宽,所以,高低电平持续时间都不能大于65535个机器周期。同事,由于中断处理函数也需要时间,高低电平持续时间也都不能太短,最好在10个机器周期以上,如果太短,CPU就没时间干其他事了。这算是一个缺点把,但这个范围应该也够用了。


关键字:51单片机  定时器  输出PWM 引用地址:51单片机理通定时器输出PWM例程

上一篇:基于STC15单片机芯片的直流电机PID控制转速源码
下一篇:基于状态机的51单片机独立按键检测与消抖思路

推荐阅读最新更新时间:2024-10-23 16:33

C51单片机 定时器模拟单路输出PWM
前言 本博文基于STC89C52RC和Keil5 C51环境开发; 如有不足之处还请多多指教; 需要的东西 定时器0; 管脚P1.0; 代码如下: #include STC89C5xRC.H #define ENABLE 1 #define DISENABLE 0 typedef unsigned char uchar8; sbit P1_0 = P1^0; bit Flag = 0; /* 占空比的时间计算: 占空比 = 高电平时间 /(高电平时间+低电平时间); */ //高电平时间(初始值为:0x02EE,即十进制750) uchar8 Timer0_TH0_High_Level_Time = 0
[单片机]
C51单片机 通过定时器模拟输出多路PWM
前言 本博文基于STC89C52RC和keil5 C51开发; 如有不做之处还请多多指教; 需要用到的东西 利用定时器0完成(定时器1也一样); 利用P1.0~P1.3完成4路PWM的输出(不同的占空比); 代码如下: #include STC89C5xRC.H #define ENABLE 1 #define DISENABLE 0 typedef unsigned int uint16; typedef unsigned char uchar8; sbit P1_0 = P1^0; sbit P1_1 = P1^1; sbit P1_2 = P1^2; sbit P1_3 = P1^3; /* 占空比的时间
[单片机]
51单片机理通定时器输出PWM例程
开门第一话,授人以鱼不如授人以渔。简单介绍一下原理及程序过程。 通过定时中断翻转IO口电平。PWM波一个周期需要两次电平翻转,因为高电平时间与低电平时间可能不相对,所以定时器需要根据该电平状态的持续时间来负初值,也就是说,不能用常量。赋初值后启动定时器,中断时翻转IO口电平,实现PWM波的输出。 开门第二话,直接上代码。 IO口及变量定义 //定义IO口以及高低电平持续时间对应定时器初值的暂存变量 sbit PWM=P2^6; uint PWM_H=0; //高电平定时器初值 uint PWM_L=0; //低电平定时器初值 初始化部分,提供“周期+脉宽”和“频率+占空比”两种方式的初始化函数 //////
[单片机]
51单片机产生PWM软件延时和定时器产生两种方法
89C51芯片没有自带PWM发生器,如果要用51来产生PWM波就必须要用软件编程的方法来模拟。方法大概可以分为软件延时和定时器产生两种方法。下面将逐一介绍。 1 软件延时法 利用软件延时函数,控制电平持续的时间,达到模拟pwm的效果。 程序如下: #include sbit pwm=P1^0; main() { while(1) { pwm=1; delayus(60);//置高电平后延时60us,占空比60% pwm=0; delayus(40); } } void delayus(uint x) { while(x--); } proteus软件仿真结果如下: 可见,用这种延时函数的方法就能简单地模拟出pwm输出。但是
[单片机]
<font color='red'>51单片机</font>产生<font color='red'>PWM</font>软件延时和<font color='red'>定时器</font>产生两种方法
51单片机定时器计数器原理以及应用(方波、pwm、脉冲计数、高电平脉宽测量)
1.TMOD定时器/计数器工作方式 寄存器 GATE=1时,定时器由INT和TR共同控制,用于测量脉宽; 2.TCON定时器/计数器控制寄存器 3. 2.应用示例: 2.1T0/T1控制外部引脚输出方波 1.设计思路:设置定时计数器工作在定时工作方式,在中断服务子程序中将需要输出方波信号的I/O引脚上的电平翻转即可。 2.仿真电路: 3.代码 2.2PWM波形输出 1.设计思路:51 单片机 可以使用一个定时计数器来控制产生波形的频率,用另外一个定时计数器来控制波形的占空波。 2.仿真原理图同1. 3.具体代码: 3.脉冲计数 1.设计思路:使用T0/T1进行计数时,当外部引脚上检查到一个脉冲
[单片机]
<font color='red'>51单片机</font><font color='red'>定时器</font>计数器原理以及应用(方波、<font color='red'>pwm</font>、脉冲计数、高电平脉宽测量)
51单片机定时器实现PWM
51单片机是可以实现PWM波输出的,原理其实都是一样的。说白了,PWM波就是让某一个引脚输出周期性连续高低电平变化的信号。 那么如何用51单片机实现周期性的高低电平呢? 答案就是用定时器。首先我们需要配置一下定时器,这里不做过多阐述,资料到处都有。然后设置一个计数周期,比如说让定时器计一百个数产生溢出,那么这一百个数的时间就是一个周期。接下来我们就以这一百个数的时间为基准。比如设置前五十个数的时间某引脚为高电平,后五十个数为低电平。那么这个引脚就会输出一个占空比为50%的高低电平变化。这就是所谓的PWM波。 基本代码实现如下: sbitPWM=P2^0;//P2.0输出pwm int time;//定义占空比
[单片机]
51单片机使用定时器中断模拟PWM控制端口电压
最近应实验室需求写一篇51单片机产生PWM的文章供参考. 单片机芯片STC89C52,晶振12MHz,编译环境Keil5. 分析:若使单片机端口为高电平, 则单片机输出电压为恒值5V. 反之低电平输出电压为0V. 但是我们如果在周期为T的时间内使单片机高电平出现t1秒, 低电平出现t2秒, 那么在周期内, 高电平出现的时间为 , 低电平时间为 . 由于周期T的时间极短, 那么在连续的时间t内, 相应端口输出电压为 . 实验使用定时器0, 定时器0由两个寄存器进行控制,分别为定时器/计数器工作方式寄存器TMOD, 定时器/计数器控制寄存器TCON. TMOD是一个八位寄存器,如下: TMOD寄存器高4位控
[单片机]
<font color='red'>51单片机</font>使用<font color='red'>定时器</font>中断模拟<font color='red'>PWM</font>控制端口电压
51单片机学习笔记:定时器产生PWM可调方波,控制led灯亮度
使用定时器T0产生PWM方波, 用按键调整占空比,20级可调 控制led灯的亮度等级. C代码 #include my51.h #include timer0.h #define grading 20 //亮度20级变化 sbit keyS3=P3^5; //按键调整占空比,PWM_keyChange++ sbit keyS4=P3^6; // PWM_keyChange-- u8 PWM_keyChange=10; //初值,按键调整在1~20之间变化 //占空比 PWM_key
[单片机]
<font color='red'>51单片机</font>学习笔记:<font color='red'>定时器</font>产生<font color='red'>PWM</font>可调方波,控制led灯亮度
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved