新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 讓沒(méi)有PWM功能的單片機(jī)實(shí)現(xiàn)PWM功能

讓沒(méi)有PWM功能的單片機(jī)實(shí)現(xiàn)PWM功能

作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
AT89S51本身沒(méi)有PWM接口,程序采用軟件模擬PWM,P1口控制LED亮度,模擬PWM輸出控制燈的10個(gè)亮度級(jí)。

#include
#define uInt unsigned int
#define uchar unsigned char
uchar PWM_T = 0; //占空比控制變量
//////////////////主程序入口//////////////////////
void main(void)
{
bit flag = 1; //控制燈漸亮漸熄方式
uInt n;
TMOD=0x02; //定時(shí)器0,工作模式2,8位定時(shí)模式
TH0=241; //寫(xiě)入預(yù)置初值241到定時(shí)器0,使15微秒溢出一次(11.0592MHz)
TL0=241; //寫(xiě)入預(yù)置值
TR0=1; //啟動(dòng)定時(shí)器
ET0=1; //允許定時(shí)器0中斷
EA=1; //允許總中斷
P1=0xff; //初始化P1
while(1)
{
for(n=0;n<300;n++); //延時(shí),將響應(yīng)定時(shí)器中斷,燈會(huì)自動(dòng)加/減一個(gè)檔次的亮度
if(flag==1) //燈漸亮
PWM_T++;
else //燈漸熄
PWM_T--;
if(PWM_T>=10) //設(shè)置燈亮度級(jí)別為10
flag=0;
if(PWM_T==0) //限定最低亮度級(jí)別為0
flag= 1;
}
}
///////////////////定時(shí)器0中斷模擬PWM////////////////////
timer0() interrupt 1 using 2
{
static uchar t ; //t用來(lái)保存當(dāng)前時(shí)間在一秒中的比例位置
t++; //每15微秒增加1
if(t==10) //1.5毫秒的時(shí)鐘周期
{
t=0; //使t=0,開(kāi)始新的PWM周期
P1=0x00; //使LED燈亮
}
if(PWM_T==t) //按照當(dāng)前占空比切換輸出為高電平
P1=0xff; //使LED燈滅
}

本文引用地址:http://butianyuan.cn/article/201611/324024.htm


關(guān)鍵詞: PWM功能單片

評(píng)論


技術(shù)專(zhuān)區(qū)

關(guān)閉