C51单片机输出pwm信号

C51单片机输出pwm信号

 C51单片机,内部并没有输出pwm信号的模块只能通过,把软件写到硬件里面,实现输出pwm信号。

Pwm信号的产生方法很简单

任意引脚 

 

  • void main(1)
  • {     
  •      while(1)       
  •     {           P0_0 =1;       
  •                  P0_0 =0;        
  •      }
  • }

这样就产生了一个占空比为50%的Pwm信号(占空比 .  高电平时间/低电平时间)

这样写在主函数里面这样的话我们的单片机就干不了别的事情了。

我们就得用别的方法我就不废话,直接上定时器模块程序。

  • void ding_shi_qi()
    {
          TMOD&=0xF0;    
          TMOD|=0x01;        
           TL0=0x9C;        //@1
           TH0=0xFF;        //@2
           TF0=0;        
           TR0=1;
           ET0=1;
           EA=1;
          PT0=0;
    }
  • 定时器相当于一个自动的沙漏根据单片机的主频单位时间加一

@1@2这两个是时间@1和@2这两个组合在一起最大数值是65536微秒设置超过这个数会溢出来,而我们只需要100微秒也就是0.1毫秒,所以我们直接给值65436(16进制是 9CFF),他就只剩100了,自己需要多少时间,根据这个来算。

本人是个小白,所以函数名都写的是拼音。

  • #include <REGX52.H>
  • #include <INTRINS.H>
  • unsigned short bi,pwm;
  • sbit yin = P1^0;
  • void ding_shi_qi()//定时器模块函数
  • {      
  •     TMOD&=0xF0;   
  •     TMOD|=0x01;   
  •      TL0=0x9C;         
  •      TH0=0xFF;      
  •       TF0=0;      
  •       TR0=1;  
  •       ET0=1;    
  •       EA=1;    
  •      PT0=0;
  • }
  • void main()//主函数
  • {    
  •   ding_shi_qi();   
  •   pwm = 5; //改变数值改变占空比
  • }
  • //定时器应用函数后缀一定要加interrupt 1
  • void zhong_duan() interrupt 1
  • {
  •       TL1 = 0x9C;    // @3
  •       TH1 = 0xFF;  //@3
  •        bi++;  
  •       bi %= 20;
  •           if(bi<pwm)   //  占空比bi/pwm
  •         {      
  •           yin = 0;   0输出低电平 
  •           }     
  •        else   
  •            {        
  •           yin =1 ;  1输出高电平
  •             }
  • }

@3当这个时间超出65536,会重新变为0

在这里面重新赋值。

 

​​​​​​​有头文件的那一串代码直接可以拿来用

没有的,可以当函数模块使用。

我是用来控制舵机的,

变量bi=20;

20×100微秒=2毫秒

所以我的Pwm周期是两毫秒

通过以上代码主函数什么事情也没做,但通过定时器产生了pwm信号。

作者是个小白还需要学习有错误的地方,勿喷请给予建议。

C51单片机输出pwm信号

上图红线60便是比较值,红线和蓝线两个交点的中间是高电平的脉宽,对应下面一个数轴。

 

 

 

上一篇:十、PWM脉宽调制信号的发生与控制


下一篇:PWM模块同步 时基时钟同步和时机计数器同步的区别