sytn.net
当前位置:首页 >> 利用51单片机定时器产生PWM波的C语言程序,要求如下 >>

利用51单片机定时器产生PWM波的C语言程序,要求如下

#include#define uchar unsigned charuchar pwm=50,cnt;sbit pluse=p1^0;sbit keyu=p1^4;sbit keyd=p1^5;void t0isr() interrupt 1{th0=(65536-100)/256;tl0=(65536-100)%256;cnt++;if(pwm>0){if(cnt>100)cnt=0;if(cnt100)pwm=100;}if(keyd==0){while(keyd==0);if(pwm>0)pwm--;}}}

用定时器 根据方波周期来算 假设周期100ms 那么定时器用最小的时间间隔(建议能被周期整出最好) 假设定时器是1ms的间隔 那么你取数字100 作为一个周期技术的表示 假定是高电平跟低电平比是 6:4 那么 前60个计数 输出高 后面输出低级 这样还可以通过按键来修改占空比

#include // sbit P1_0 = P1^0; // 8路PWM输出sbit P1_1 = P1^1;sbit P1_2 = P1^2;sbit P1_3 = P1^3;sbit P1_4 = P1^4;sbit P1_5 = P1^5;sbit P1_6 = P1^6;sbit P1_7 = P1^7;unsigned char PWM0 = 1; // 占空比调整unsigned char PWM1 = 3;

/******************************************************************* 模块名称:PWM.c 功 能:可调PWM波 说 明:按键AN1增加占空比,按键AN2减小占空比,P0^2口输出PWM波 *********************************************************************/#include <

根据你自己的需要,PWM分级,PWM周期10ms,分100级,那么定时器中断100us,另外一个寄存器中断里计数,和你要的占空比寄存器比较,如果当前占空比50%,那么计数器比较是否大于5ms,大于则PWMP1.0输出高,小于则PWMP1.0输出低,最后判断计数是否到10ms,然后清零,从新开始!就可以了啊,很简单,如需改变占空比那么在一个PWM周期完成后改变即可,如果是调速,那么直接增加或者减少占空比,不需要等下个周期

让蜂鸣器发出两种不同的声调很容易,只要给蜂鸣器的控制信号发送不同频率的脉冲就可以实现了,以下以延时方式来做.#include#defineucharunsignedchar#defineuintunsignedintsbitspk=p1^0;sbitk1=p1^7;//发声函数voidalarm(uchart){uchari,j;for(i=0;i<200;i++){spk=~spk;for(j=0;j

不知道你在汇编中用的什么办法,用的是定时器吗.在C语言中也用定时器.定义好定时器,定义一个unsigned char 变量,在定时器函数中自加.不用做任何处理加到255再加会自动回0.然后判断这个数如果小于多少出0,大于多少出1.就可以了.

#include<reg51.h> #define uchar unsigned char uchar pwm=50,cnt=0; sbit pluse=p1^0; sbit keyu=p1^4; sbit keyd=p1^5; void t0isr() interrupt 1 { cnt++; if(cnt>100)cnt=0; if(cnt<pwm)pluse=1; else pluse=0; } main() { tmod=0x02; th0=256-246; //改变

这个可以实现的,具体的程序可以根据思路来1:通过计算,把这几个波形统一起来成一个周期,比如开始0.5ms到了,让定的值取反,再加19.5再取反,再加1.3Ms再取反,再加18.7ms再取反然后一直这样把几个都写完.2:改变第一个pwm的设定值.比如放数组里一共5个设定值,分别代表你设定的高电平时间,依次替换第一个定时器里面的中端时间即可. 3::是用两个定时器,然后按照时间去匹配修改建议用用带epwm模块的mcu,直接调用epwm和epwm中断,节省cpu资源,可以多写很多程序.参考《吴鉴鹰单片机项目实战精讲》,吴鉴鹰单片机开发板教程

确实PWM频率够低的,定时器时间可短一些,如100us或1ms,但不能太低,如10us,中断就 太频繁了调 节占空比:void X0_INT() interrupt 0{b++;if(b > 19) b = 19; //占空比等级最大为19}//------------------------------------------void X1_INT() interrupt 2{b--;if(b <1) b = 1; //占空比等级最小 为1}另外 unsigned int a, b浪费内存应写为 unsigned char a, b

网站首页 | 网站地图
All rights reserved Powered by www.sytn.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com