51单片机两个io口同时输出两个占空比不同的方波?以下程序希望给点灵感。

voidpwmqianjin(ucharx1,ucharx2,uinty){uchara,b,c,d,j;uinti;for(i=y;i>0;i--){for(j=7;j... void pwmqianjin(uchar x1,uchar x2,uint y)
{
uchar a,b,c,d,j;
uint i;
for(i=y;i>0;i--)
{
for(j=7;j>0;j--)
{
for(a=x1;a>0;a--)
in2=1;
for(b=100-x1;b>0;b--)
in1=0;
for(c=x2;c>0;c--)
in3=1;
for(d=100-x2;d>0;d--)
in4=0;
}
}
}
展开
 我来答
还是呼唤
2011-05-15 · TA获得超过265个赞
知道答主
回答量:104
采纳率:100%
帮助的人:48.4万
展开全部
首先89C52内部没有硬件PWM发生器,只能通过定时器模拟!你可以通过两个定时器,T0控制周期,T1控制占空比。
例如:实现周期为1000us,占空比为20%的PWM,用P1.0实现
首先你设置T0为65536-1000 (12M晶振)
T1为65536-200
首先初始化P1.0=1,两个定时器同时打开,在定时器T1中断时拉低P1.0,在定时器T0中断时在拉高P1.0,同时将两定时器初始值初始化T0为65536-1000 ,T1为65536-200
希望对你有用,呵呵!!!

用1个定时器的话也是可以的,但是这就要用一个变量count1 来控制周期和占空比了,比如说你设置1周期为10ms,占空比还是为20%的PWM,你可以设置定时器为每10us产生一次中断,没中断一次使count加1,一开始设置P1.0为高电平,当count1加到200的时候拉低P1.0,等count1到1000了在拉高P1.0,同时复位count1=0,不过这样做的缺点是精度不高,要是PWM所需周期段,精度高的话我还是建议用两个定时器来实现 ,我在这里没有给你具体的代码,我觉得把原理讲清楚猜是最重要的,什么都是才来就上代码,这个对你学习不利,希望对你有用,呵呵!!!!
如果两路同时输出的话只要你设置两个变量,同时进行判断就行了,和一路的原理是一样的。
uhuay
2011-05-15 · TA获得超过263个赞
知道小有建树答主
回答量:155
采纳率:0%
帮助的人:118万
展开全部
用一个定时器,再设定两个计数单元,定时器的定时时间是一个对与占空比比较好算的值,当做基准时间,中断里面只要对计数单元计数,即每产生一次中断计数值加1,然后判断计数值,再分别对两个口取反就行。
追问
那同时输出的问题怎么解决?我是想让他们之间的时间更少一点。
追答
这样写程序的话,最多就相差几个机器周期,假设机器周期是1us的话,也就几个us,其实这种编写方法用的就是I/O口的保持功能,即你对某个口写了1,如果没有对该口操作的话,他就一直保持1,
假设我下面一段中断里面的程序:
DJNZ R1,ML01 ;假设R1里面存放的是P1.0的中断计数值
CPL P1.0
ML01:DJNZ R2,ML02 ;假设R2中存放的是P1.1的中断计数值
CPL P1.1
ML02:...
上段程序可以看出,由CPL p1.0到CPL P1.1就多出来三个机器周期而已
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
tangnaner
2011-05-15 · 超过26用户采纳过TA的回答
知道答主
回答量:59
采纳率:0%
帮助的人:80.9万
展开全部
用定时器啊
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式