|
單片機(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一個周期中高電平高字節(jié)和低字節(jié)重載值
- unsigned char lowHR0, lowLR0;//PWM一個機(jī)器周期中低電平時高字節(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++); //軟件測試延時大約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;//一個機(jī)器周期頻率
- tmp = tmp / fr; //一個機(jī)器周期中fr的頻率所需計數(shù)值(包括高電平和低電平)
- heigh = (tmp * dc) / 100;//高電平占dc%,所需計數(shù)值
- low = tmp - heigh;//低電平所需計數(shù)值
- heigh = 65536-heigh;//高電平計數(shù)初值
- low = 65536-low;//低電平計數(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è)定時器
- TH0 = heighHR0;
- TL0 = heighLR0;//裝入高電平計數(shù)初值
- PWMOUTLED = 1;//開始時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輸出高電平
- }
- /*定時器T0中斷服務(wù)*/
- void Timer0_ISP() interrupt 1
- {
- //判斷PWM現(xiàn)在輸出的是高電平還是低電平
- if (PWMOUTLED)
- {
- TH0 = lowHR0;
- TL0 = lowLR0;//裝載低電平計數(shù)初值
- PWMOUTLED = 0;//PWM輸出低電平
- }
- else
- {
- TH0 = heighHR0;
- TL0 = heighLR0;//重裝裝載高電平計數(shù)初值
- PWMOUTLED = 1;//PWM輸出高電平
- }
- }
復(fù)制代碼
|
|