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信号。
作者是个小白还需要学习有错误的地方,勿喷请给予建议。
上图红线60便是比较值,红线和蓝线两个交点的中间是高电平的脉宽,对应下面一个数轴。