標(biāo)題:
stc15f2k60s2單片機(jī)PWM呼吸燈代碼(帶詳細(xì)注釋)
[打印本頁]
作者:
qiqi81965
時(shí)間:
2018-10-10 15:55
標(biāo)題:
stc15f2k60s2單片機(jī)PWM呼吸燈代碼(帶詳細(xì)注釋)
單片機(jī)源程序如下:
#include <stc15f2k60s2.h>
sbit ADDR0 = P1^0; //如果是自己搭的電路,可以無視下面這幾行
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit PWMOUTLED = P0^0;//用于PWM控制輸出
unsigned char heighHR0, heighLR0;//PWM一個(gè)周期中高電平高字節(jié)和低字節(jié)重載值
unsigned char lowHR0, lowLR0;//PWM一個(gè)機(jī)器周期中低電平時(shí)高字節(jié)和低字節(jié)重載值
void Initial();
void ConfigPWM(unsigned int fr, unsigned char dc);
void ClosePWM();
void main(void)
{
unsigned int i;
Initial();
while (1) //呼吸燈效果
{
//LED亮->暗
ConfigPWM(60, 10);//配置PWM頻率為100HZ,占空比為10%
for (i = 0; i < 30; i++); //軟件測(cè)試延時(shí)大約76ms
ConfigPWM(60, 20);//配置PWM頻率為100HZ,占空比為20%
for (i = 0; i < 30; i++);
ConfigPWM(60, 30);//配置PWM頻率為100HZ,占空比為30%
for (i = 0; i < 30; i++);
ConfigPWM(60, 40);//配置PWM頻率為100HZ,占空比為40%
for (i = 0; i < 30; i++);
ConfigPWM(60, 50);//配置PWM頻率為100HZ,占空比為50%
for (i = 0; i < 30; i++);
ConfigPWM(60, 60);//配置PWM頻率為100HZ,占空比為60%
for (i = 0; i < 30; i++);
ConfigPWM(60, 70);//配置PWM頻率為100HZ,占空比為70%
for (i = 0; i < 30; i++);
ConfigPWM(60, 80);//配置PWM頻率為100HZ,占空比為80%
for (i = 0; i < 30; i++);
ConfigPWM(60, 90);//配置PWM頻率為100HZ,占空比為90%
for (i = 0; i < 30; i++);
ConfigPWM(60, 95);//配置PWM頻率為100HZ,占空比為95%
for (i = 0; i < 60000; i++);
//LED暗->亮
ConfigPWM(60, 90);//配置PWM頻率為100HZ,占空比為10%
for (i = 0; i < 60000; i++);
ConfigPWM(60, 80);//配置PWM頻率為100HZ,占空比為20%
for (i = 0; i < 60000; i++);
ConfigPWM(60, 70);//配置PWM頻率為100HZ,占空比為30%
for (i = 0; i < 60000; i++);
ConfigPWM(60, 60);//配置PWM頻率為100HZ,占空比為40%
for (i = 0; i < 60000; i++);
ConfigPWM(60, 50);//配置PWM頻率為100HZ,占空比為50%
for (i = 0; i < 60000; i++);
ConfigPWM(60, 40);//配置PWM頻率為100HZ,占空比為60%
for (i = 0; i < 60000; i++);
ConfigPWM(60, 30);//配置PWM頻率為100HZ,占空比為70%
for (i = 0; i < 60000; i++);
ConfigPWM(60, 20);//配置PWM頻率為100HZ,占空比為80%
for (i = 0; i < 60000; i++);
ConfigPWM(60, 10);//配置PWM頻率為100HZ,占空比為90%
for (i = 0; i < 60000; i++);
ClosePWM();
}
}
/*初始化*/
void Initial()
{
ADDR3 = 1;
ENLED = 0;//選擇U3,即LED
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;//LEDS6=0
}
/*使用T0配置PWM高低電平的頻率*/
void ConfigPWM(unsigned int fr, unsigned char dc) //fr為PWM的頻率,100HZ無閃爍,dc是PWM的占空比(高電平占的百分比)
{
unsigned long tmp;
unsigned int heigh, low;
tmp = 12000000/12;//一個(gè)機(jī)器周期頻率
tmp = tmp / fr; //一個(gè)機(jī)器周期中fr的頻率所需計(jì)數(shù)值(包括高電平和低電平)
heigh = (tmp * dc) / 100;//高電平占dc%,所需計(jì)數(shù)值
low = tmp - heigh;//低電平所需計(jì)數(shù)值
heigh = 65536-heigh;//高電平計(jì)數(shù)初值
low = 65536-low;//低電平計(jì)數(shù)初值
heighHR0 = (unsigned char)(heigh >> 8);//高電平裝入初值的高字節(jié)
heighLR0 = (unsigned char)heigh; //高電平裝入初值的低字節(jié)
lowHR0 = (unsigned char)(low >> 8); //低電平裝入初值的高字節(jié)
lowLR0 = (unsigned char)low; //低電平裝入初值的低字節(jié)
TMOD &= 0xF0;//清零T0控制位
TMOD |= 0x01;//設(shè)定T0工作方式1,16位可設(shè)定時(shí)器
TH0 = heighHR0;
TL0 = heighLR0;//裝入高電平計(jì)數(shù)初值
PWMOUTLED = 1;//開始時(shí)PWM輸出高電平
TR0 = 1;
ET0 = 1;
EA = 1;
}
/*關(guān)閉PWM*/
void ClosePWM()
{
TR0 = 0;//關(guān)閉Timer0
ET0 = 0;//關(guān)閉T0中斷
PWMOUTLED = 1;//PWM輸出高電平
}
/*定時(shí)器T0中斷服務(wù)*/
void Timer0_ISP() interrupt 1
{
//判斷PWM現(xiàn)在輸出的是高電平還是低電平
if (PWMOUTLED)
{
TH0 = lowHR0;
TL0 = lowLR0;//裝載低電平計(jì)數(shù)初值
PWMOUTLED = 0;//PWM輸出低電平
}
else
{
TH0 = heighHR0;
TL0 = heighLR0;//重裝裝載高電平計(jì)數(shù)初值
PWMOUTLED = 1;//PWM輸出高電平
}
}
復(fù)制代碼
作者:
冰冰潔潔
時(shí)間:
2018-11-27 22:52
幫你上個(gè)源代碼工程文件
STC15F2K60S2的PWM小燈.zip
2018-11-27 22:52 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
37.6 KB, 下載次數(shù): 78, 下載積分: 黑幣 -5
作者:
馬濤
時(shí)間:
2021-2-18 16:14
heighHR0 = (unsigned char)(heigh >> 8);//高電平裝入初值的高字節(jié)
heighLR0 = (unsigned char)heigh; //高電平裝入初值的低字節(jié)
想問一下這個(gè)過程是怎么實(shí)現(xiàn)的就像裝入初值的低字節(jié)
作者:
啤酒瓶子老大
時(shí)間:
2021-2-19 13:55
這是適合金沙灘宋師傅的開發(fā)板開發(fā)的程序。
歡迎光臨 (http://www.torrancerestoration.com/bbs/)
Powered by Discuz! X3.1