欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
一種基于51單片機的PWM程序
[打印本頁]
作者:
heicad
時間:
2014-10-21 01:28
標題:
一種基于51單片機的PWM程序
51單片機沒有PWM波產(chǎn)生模塊,有時候需要用到PWM功能,想用51單片機實現(xiàn),這真是令人傷腦筋。先貼出我寫的一個比較簡單的產(chǎn)生PWM的程序,該程序使用了一個定時器和一個IO端口就實現(xiàn)了。
#include<reg52.h> //51單片機頭文件
#define uint unsigned int //宏定義
#define uchar unsigned char //宏定義
uint i,m=4; //m調(diào)整占空比,i 控制周期
sbit PWM=P1^0; //P1.0口輸出PWM波
sbit key=P2^0; //P2.0口按鍵調(diào)整占空比
void delay(uint x) //延時函數(shù),約1ms
{
uint a,b;
for(a=x;a>0;a--)
for(b=110;b>0;b--);
}
void main()
{
PWM=1; //初始化給P1.0口高電平
TMOD = 0X01; //定時器0工作方式1
TH0 = (65536-500)/256; //裝初值,0.5ms
TL0 = (65536-500)%256;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動定時器T0
EA=1; //開啟全局中斷
while(1)
{
if(key==0) //檢測按鍵
delay(5);
if(key==0)
{
m++;
if(m==5)
m=0;
}
while(!key); //按鍵松手檢測
}
}
void timer0() interrupt 1 //T0中斷函數(shù)
{
TH0 = (65536-500)/256; //重裝定時器初值
TL0 = (65536-500)%256;
i++;
if(i==m)
{
PWM=0;
}
if(i==40)
{
i=0;
PWM=1;
}
}
到這里大家應(yīng)該可以弄明白這個程序是怎么實現(xiàn)的了吧?
這個程序只用一個按鍵控制占空比,調(diào)占空比時不是很方便,大家在設(shè)計此類程序的時候可以用兩個按鍵。
作者:
單片笨嬰
時間:
2014-10-21 10:55
有沒有8只流水燈漸變的程序啊
作者:
老菜鳥
時間:
2014-10-21 11:16
不錯,收下,謝謝!!!
作者:
runlin1
時間:
2015-12-9 18:43
謝謝樓主
作者:
小蜜蜂o
時間:
2015-12-10 21:29
我的好像也沒錯,但是萬用表測不出來,只有占空比在0.5附近才能明顯測到電壓約等于2.4v,其他時候都有4v多,但是接個led上去會亮。
//pwm的頻率f、占空比d,單片機定時器+1要是1us才準確
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
#define f 1000//輸出頻率f,Hz
#define d 0.5//占空比,H時的
sbit pwm=P2^7;//pwm輸出口
float t;
uchar temp1h,temp1l,temp2h,temp2l;//temp1為要H時定時器初值,temp2為要L時的初值
bit flag;//頻率一個周期中的標志位,當pwm輸出h為1,輸出l為0
void init_pwm()
{
EA=1;
TMOD=0X20;
ET1=1;
TH1=temp1h;
TL1=temp1l;
flag=1;
TR1=0;
}//初始化設(shè)置定時器1,但沒有啟動
void main()
{
// float f,d;
uint a1,a2;
t=1000000/f;//一個周期的時間t
a1=65536-d*t;
a2=65536-(1-d)*t;//因為%不能對小數(shù),多加入了a1,a2取整
temp1h=(65536-d*t)/256;
temp1l=a1%256;
temp2h=(65536-(1-d)*t)/256;
temp2l=a2%256;
init_pwm();
TR1=1;
while(1);
}
void t1() interrupt 3
{
if(flag==0)//要h輸出時的t1初值
{
TH1=temp1h;
TL1=temp1l;
pwm=1;
flag=1;
}
else if(flag==1)//要L輸出時的t1初值
{
TH1=temp2h;
TL1=temp2l;
flag=0;
pwm=0;
}
}
歡迎光臨 (http://www.raoushi.com/bbs/)
Powered by Discuz! X3.1