找回密码
 注册
关于网站域名变更的通知
查看: 247|回复: 4
打印 上一主题 下一主题

51单片机输出PWM波形程序

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-12-29 14:23 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
单片机是可以输出PWM的,比较的麻烦。此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。, ~# P: s4 P4 ]5 f, f
用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。
( g% E9 V. t" F" Z$ b* W* V
下面重点介绍用一个定时器的实现PWM的方法。以周期为1ms(1kHZ)为例,要产生其它频率的PWM波,程序中只需作简单修改即可。用一个定时器时(如定时器T0),首先要确定PWM的周期T和占空比D,确定了这些以后,就可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n。  H* T( ^) m& P( e4 {
因为这里我们是产生周期为1ms(1kHZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:
: A9 L+ n8 D& n1 G; S4 ~, o
* `4 g* `8 X) g  u) d
1、当time>=100时,time清零(此语句保证频率为1kHZ);
3 u) [' q9 C+ i) \) v7 u% v0 q9 g, L. }1 j; ~
$ L) W: [( a+ S" z( q$ ]+ x. N
2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出低电平;
$ h. u7 s* I; M7 v8 P) F6 z) c
6 ~& H0 X! K! I1 @6 k

' R2 ?# q9 ]4 U3 O: l* M3、当time<=n时,让单片相应的I/O口输出高电平,此时占空比就为%n。
8 Q3 s2 x8 u, F! t
9 s. j+ X1 q. q" U: x' k
5 O4 k8 E5 p0 L
下面程序产生30%占空比的pwm:6 B* p! V" S0 B4 q
* B) K6 g7 f# W2 G. Y5 x* R* W* ~
* d7 \: B/ i' r
( f/ S. q/ r8 p8 x8 j
  • #include<reg51.h>  
  • #define uint unsigned int  
  • #define uchar unsigned char  
  •   
  • sbit PWM=P2^0;//  P2.0输出pwm  
  • uchar time;  // 定义占空比的变量  
  •   
  • void main()  
  • {  
  •     TMOD=0x01;//定时器0工作方式1  
  •     TH0=0xff;//(65536-10)/256;//赋初值定时  
  •     TL0=0xf7;//(65536-10)%256;//0.01ms  
  •     EA=1;//开总中断  
  •     ET0=1;//开定时器0中断  
  •     TR0=1;//启动定时器0   
  •     while(1)  
  •     {            
  •     }            
  • }  
  •   
  • void tim0() interrupt 1  
  • {  
  •     TR0=0;//赋初值时,关闭定时器  
  •     TH0=0xff;//(65536-10)/256;//赋初值定时  
  •     TL0=0xf7;//(65536-10)%256;//0.01ms  
  •     TR0=1;//打开定时器  
  •   
  •     time++;  
  •     if(time>=100)   //1khz
  •       time=0;     
  •     if(time<=30)    //占空比%30,可改
  •       PWM=1;   
  •     else PWM=0;  
  • }  0 D( k: u: w. G  d

/ _7 k. a# ^, R2 ^, y[color=rgb(51, 102, 153) !important]复制代码

+ `, g2 T5 P! S6 d5 T: T: G+ m[color=rgb(51, 102, 153) !important]
: p( j7 l. A! @$ \: c
0 e6 q  d" k, O  r, m- S& _7 Y
2 `) s  r* v2 k- t# O9 J& P

该用户从未签到

2#
发表于 2021-12-29 14:56 | 只看该作者
改变定时器T1的初值就可以改变占空比
  • TA的每日心情
    开心
    2022-12-27 15:07
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2021-12-29 16:29 | 只看该作者
    可以用定时器中断产生

    该用户从未签到

    4#
    发表于 2021-12-29 17:14 | 只看该作者
    可以用定时器产生一个时间基准t,然后计算

    该用户从未签到

    5#
    发表于 2021-12-31 17:58 | 只看该作者
      谢谢分享
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-7-19 20:49 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表