标签:定时器 函数 C51 void bi 单片机 TMOD 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信号。
作者是个小白还需要学习有错误的地方,勿喷请给予建议。
上图红线60便是比较值,红线和蓝线两个交点的中间是高电平的脉宽,对应下面一个数轴。
标签:定时器,函数,C51,void,bi,单片机,TMOD,pwm 来源: https://blog.csdn.net/weixin_45530687/article/details/122759216
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。