永发信息网

求51单片机PWM程序(一个定时器产生三路PWM 可独立运作) 简单来说就是用三路独立的pwm控制三个LED

答案:3  悬赏:10  手机版
解决时间 2021-03-12 10:23
求51单片机PWM程序(一个定时器产生三路PWM 可独立运作) 简单来说就是用三路独立的pwm控制三个LED
最佳答案
怎么可能搞不了三路独立的呢?楼下那位是被STC12C5A60S2的硬件蒙蔽了视线,他认为,STC12C只有两路PWM,无法实现3路,你却忘记了最原始的办法,不要说STC12有PWM功能,即使是传统的AT89S52这类没有PWM功能的单片机也一样能够实现楼主的要求.
下面我简单的分析一下我的思路,楼主尝试编程,如果不懂,再追问:
你是用三路独立的PWM调光用的,PWM调光,为了保证不让人眼产生闪烁,理论上PWM的频率要大于20Hz,而在实际的测试用,一般PWM要大于25Hz才能保证不闪烁.为了保险起见,我们将PWM的频率设定在30Hz左右,那么,周期就是33.333333ms,假设,我们实现10级调光,那个 每级的时间是3.33333ms
然后设置三个变量和一个计数器,我描述不太清楚,你看一下程序:

sbit P1_0 = P1^0; //---P1.0,P1.1,P1.2是三路PWM输出
unsigned char Set_PWM0 = 0; //--Set_PWM0 Set_PWM1 Set_PWM2
//--分别是低电平占整个脉冲的百分比
//--他们最小取0,最大取9
unsigned char counter = 0;//--用于计数的
void ISR_Timer0(void) interrupt 1 //---我们就用定时器0来做,不用PWM硬件
{ //----3.3333ms中断一次
counter++;

if(counter >= 10) counter = 0;
if(counter >= Set_PWM0) P1_0 = 0; else P1_0 = 1;
if(counter >= Set_PWM1) P1_1 = 0; else P1_1 = 1;
if(counter >= Set_PWM2) P1_2 = 0; else P1_2 = 1;

}

这样,定时器0用于决定PWM的反占空比,你只要设置 Set_PWM0等三个参数就可以了.
怎么会实现不了呢?追问谢谢您的指教
我的理解首先是

三路PWM输出
sbit P1_0 = P1^0;

sbit P1_1 = P1^1;
sbit P1_2 = P1^2;

(我在用unsigned char PWM =0x7f; 是否三个参数都是0x7f)
unsigned char Set_PWM0 = 0;
unsigned char Set_PWM1 = 0;
unsigned char Set_PWM2 = 0;

但下面的部分就不懂了
//--分别是低电平占整个脉冲的百分比
//--他们最小取0,最大取9
....
在上面的问题补充了 我现在的程序 有什么部分可以使用?追答你的程序很乱,而且语法虽然没有错误,但是很多地方不规范.
比如:
sbit LED = P2^3;你后面却又是 LED = 0xFF,LED = 0x00...LED只是一个位,你用0xFF,0x00来赋值反而影响效率
再比如:
if(PWM<0xFE)
{
PWM; //---你这句是什么意思呢?

delay(10);
}

这样吧,你想要做什么功能呢?把硬件接口说一下,我看看帮你写一个,你参考一下

看明白你的程序了,你的程序效率用两个定时器来做一个PWM,虽然你的PWM能够实现占空比的变化,但是同时,频率也变了,你的PWM低电平恒定是258个定时器周期,高电平从2--254个定时器周期
之间变化的.

但是你这个是实现不了的,下面是我给你修改后的程序,你看看能明白不?

#include

sbit LED=P2^3; //---LED灯
sbit k1=P2^0; //---按键1
sbit k2=P2^1; //---按键2
unsigned char PWM =220;
void delay(unsigned int ms)
{
unsigned char i;
while(ms--)
{
for(i=0;i<114;i++);
}
}
void main()
{
LED= 1 ;
TMOD=0x22;//--两个定时器都工作于方式2
//--自动重载
TH0=255-PWM;//--定时器0
EA=1; //----允许中断
ET0=1;
ET1=1;
TR0 = 1;//---启动定时器0
while(1)
{
do
{
if(PWM < 230) //---占空比最大230个定时器周期
{ //---占空比为90.2%
PWM++;
delay(10);
}
} while(k1==0);
do
{
if(PWM > 25) //---占空比最大25个定时器周期
{ //---占空比为9.8%
PWM--;
delay(10);
}

} while(k2==0);
}
}
void timer0() interrupt 1
{
LED=0;
TR0=0;
TH1=PWM;
TR1 = 1;
}
void timer1() interrupt 3
{
LED = 1;
TR1 = 0;
TH0 = 255-PWM;
TR0 = 1;
}追问大致上看得明白,所以我想问的问题就回到原本的

就是现在只有一个LED灯控制位
(sbit LED=P2^3; //---LED灯 )
可以用按键1 , 按键2控制

如何可以增加LED灯控制位至两或三个
同时又可以独立工作 不会互相影响追答这个,在你写的程序的基础上,做不到,因为你写的PWM程序,只用一个PWM控制,最重要的是,你的PWM占用了两个定时器,也就是说,你的PWM把两个硬件资源占用光了,所以无法再加独立的控制了.

而用我的思路,就是我的第一次回答的思路,则可以解决问题,因为我用了三个PWM变量,共享一个硬件资源,三个PWM相互不影响.

另外,我想问一下,我的思路你没看明白吗?追问看了GUEL86 前辈的proteus仿真实例,在此再次感谢GUEL86

开始可以明白你的思路, 但都是有一些疑问(我基础不好不好意思)
unsigned char Set_PWM0 = 0; <---参数的不同有什么影响
PWM的频率设定在30Hz左右<---是否要修改TH0; TL0
如果是30Hz又要如何计算TH0 和TL0 是多少

不知是否因为实例是if(counter >= 16) 16级调光的问题
出现了一个奇怪现状,就是增加光量到达某一个情度 再按加制 led 就变成无光
有什么方法改善追答没事.
Set_PWM0参数不同,导致占空比不同,PWM主要参数是占空比.
用Set_PWM0调节占空比.

我举个例子,假设我还是10级调光,即counter的范围是0--9,包括0,也包括9.
Set_PWM0的值我设定为1,Set_PWM0的值我设定为5,Set_PWM2的值我设定为7
根据我的程序:
if(counter >= Set_PWM0) P1_0 = 0; else P1_0 = 1;
if(counter >= Set_PWM1) P1_1 = 0; else P1_1 = 1;
if(counter >= Set_PWM2) P1_2 = 0; else P1_2 = 1;

看下面的表格:我用H代表高电平,用L代表低电平,注意我上面的程序与下面表格对应关系

Count: 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4
LED0 H L L L L L L L L L H L L L L L L L L L H L L L L
LED1 H H H H H L L L L L H H H H H L L L L L H H H H H
LED2 H H H H H H H H L L H H H H H H H H L L H H H H H

通过以上程序和表格,你看出为什么一定要三个变量了吗?三个变量设置不同的数值,就得到不同的占空比,而且相互之间独立不影响.

第二,频率是30Hz,那么30Hz的周期是就33.3333ms,你要怎么设置定时器TH0和TL0,就要看你几级调光,
如果你是10级调光,那么,你就设置定时器0,让它每3.3333ms中断一次
如果你要20级调光,那么,你就设置定时器0,让它每1.66666ms中断一次
如果你要100级调光,那么,就设置定时器0,让它每 0.33333ms中断一次.

具体怎么设置,设置为多少,是要看你的调光级别和你的单片机的时钟周期的.

你不管多少级调光,假设你是N级调光,那么,counter,Set_PWM0,Set_PWM1,Set_PWM2这四个参数,都永远不能大于等于counter.就是说,上面四个参数,都要小于counter.
全部回答
STC 12C5A60S2搞不了三路独立的,里面只有独立的两路追问如果是这样, 可否做到按键转换当前控制的灯再加以控制
例如 两按键K1、K2 控制亮度
按键K3 就转换控制pwm的输出位追答楼上的说的有道理,但是软件实现,始终纯在失效的时候,所以硬件比较靠谱点,或者说比较简单点,用别的单片机吧,c8051f因该有三路独立的,或者pic吧
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
老海面馆这个地址在什么地方,我要处理点事
客厅小没吊顶电视背景墙怎么做好看吗
女朋友去参加她的同学聚会,我应该陪同去吗?
1603年,以为旅居西班牙的法国人说:“我在这
有谁懂吗?
豆豆杂货铺怎么去啊,有知道地址的么
为什么女人总想当姐??
如何知道六帝铜钱和五帝铜钱哪个辟邪?
吉林省艺邦玻璃有限公司地址有知道的么?有点
成语后面两字是同心
李五行属性
专升本有什么要求吗?升上去是二本吗?谢谢了
【校运会新闻稿】校运会的新闻稿怎么写?
执业医师证退休后不审核以后还好使吗
高中音乐会考要考唱歌,该唱什么歌呢?
推荐资讯
广恒源海产品干货店地址在什么地方,想过去办
山阳区焦作为民综合商店哪位知道具体地址啊
DDS128型单相电子式载波电能表是否有记录芯片
板凳郎重庆小面(东贸店)这个地址在什么地方,
Lambda是什么意思
丸五笔怎么打
高中生物颜色反应共有一些什么反应
东旭商贸有限公司这个地址在什么地方,我要处
悠闲自在的反义词
怎么查看武书连2015年中国大学排名100强以后
千百惠和千百丽鞋哪个好?
为什么电脑会突然卡
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?