欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
關于51單片機PWM輸出程序問題?
[打印本頁]
作者:
。。jj
時間:
2020-2-19 09:20
標題:
關于51單片機PWM輸出程序問題?
剛學的PWM,看了一下參考的程序,有一些地方不是很明白,代碼如下。后面還有我自己改編后寫的代碼,但是不好使,請大家幫我分析一下。
問題:
PWM的周期timer1是自己設定的還是單片機內部定的
value代表的是占空比,當count==100的時候才加1,為什么value要等于1000而不是等于10(我認為應該是分成10份啊)
關于判斷PWM是否為1為什么是用timer1和value的大小做對比。
參考代碼,沒有問題
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit PWM=P2^2;
bit DIR;
u16 count,value,timer1;
void Timer1Init()
{
TMOD|=0X10
TH1 = 0xFF;
TL1 = 0xff;
ET1=1
EA=1;
TR1=1;
}
void main()
{
Timer1Init();
while(1)
{
if(count>100)
{
count=0;
if(DIR==1)
{
value++;
}
if(DIR==0)
{
value--;
}
}
if(value==1000)
{
DIR=0;
}
if(value==0)
{
DIR=1;
}
if(timer1>1000)
{
timer1=0;
}
if(timer1 <value)
{
PWM=1;
}
else
{
PWM=0;
}
}
}
void Time1(void) interrupt 3
{
TH1 = 0xFF;
TL1 = 0xff; //1us
timer1++;
count++;
}
我自己根據上面代碼自己改編了一下,只有這些變了,其他和上面程序一樣,但無法呈現呼吸狀態,led一直在閃爍。
if(value==10)
{
DIR=0;
}
if(value==0)
{
DIR=1;
}
for(i=0;i<=value;i++)
{
PWM=1;
}
for(i=value+1;i<=10;i++)
{
PWM=0;
}
作者:
xuyaqi
時間:
2020-2-19 14:17
給你個參考程序,timer1只是給了定時中斷, PWM的周期是程序給定的,在參考程序里zhouqi計數值是周期,gaodianpin計數值是周期內的高電平值,具體看程序。
呼吸燈.rar
(18.41 KB, 下載次數: 10)
2020-2-19 14:16 上傳
點擊文件名下載附件
作者:
。。jj
時間:
2020-2-19 19:05
xuyaqi 發表于 2020-2-19 14:17
給你個參考程序,timer1只是給了定時中斷, PWM的周期是程序給定的,在參考程序里zhouqi計數值是周期,gaod ...
我看了你發的程序,我在開發板上用了一下,但是發現這個程序的呼吸燈效果不是很明顯。
我還有幾個問題,可能是我沒有學好,希望你為我講解一下。
對于這個程序來說,我不知道你對P0的設定有什么用,我把他刪了還是和之前的效果一樣。
這個程序的周期是60000*1us嗎,我還是不明白為什么要等zhouqi>60000后才改變gaodianping的值,
而且開始是DIR為0,那gaodianping就在減,等到DIR為1時,高電平再加,那這么變化gaodianping的值不應該是-60000~0嗎,怎么能大于60000呢。
#include "reg52.h"
typedef unsigned int u16;
typedef unsigned char u8;
sbit PWM=P2^2;
bit DIR;
u16 zhouqi;
u16 gaodianpin;
void Timer1Init()
{
TMOD|=0X10;
TH1 = 0xFF;
TL1 = 0xff;
ET1=1;
EA=1;
TR1=1;
}
void main()
{
Timer1Init();
while(1)
{
if(zhouqi>60000)
{
zhouqi=0;
DIR=!DIR;
}
if(gaodianpin>60000)
{
gaodianpin=60000;
}
if(gaodianpin<10000)
{
gaodianpin=10000;
}
if((gaodianpin>10000)&&(gaodianpin<60000))
{
PWM=1;
}
else
{
PWM=0;
}
}
}
void Time1(void) interrupt 3
{
TH1 = 0xFF;
TL1 = 0xff; //1us
zhouqi++;
if(DIR==1){gaodianpin++;}
else{gaodianpin--;}
}
作者:
lovexulu
時間:
2020-2-19 19:36
#include<reg52.h>
#define uint unsigned int
#define led1 P1//P1口全接發光管,驗證程序請自行修改
/**********占空比太小會熄滅,故一開始有3.3%,最大占空比也看不出變化了,故最大為80%**********/
void delay (uint yc) //延遲函數,定時器中斷更好,這里就偷懶了
{
uint i,j;
for (i=yc;i>0;i--)
for (j=10;j>0;j--);
}
void main()
{
uint i=5,n=0; //此處初始化i不得小于最小占空比
while(1)
{
if(i==120) //調節最大占空比
n=1;
if(i==4) //最小占空比
n=0;
led1=0x00;//此處自行修改
delay(i);
led1=0xff;//此處自行修改
delay(150-i);//半周期時間
if(n==0)
i++;
if(n==1)
i--;
}
}
呼吸燈,建議樓主仔細理解一下PWM的含義,簡單說PWM是固定時間長度的周期內,高低電平占時間比的變化量。
作者:
xuyaqi
時間:
2020-2-19 21:17
我這個程序只是仿真了一下沒在開發板上試,因此要想效果好得在理解的基礎上修改程序。
P0那部分那是我為了調試仿真臨時加的,刪了并不影響PWM運行。
是不是1us我沒有測,這和定時器設置有關,總之周期是60000個定時周期。
if(gaodianpin>60000){gaodianpin=60000;}//怕意外加的限制,具體高電平數在中斷里根據DIR ++,--。
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1