|
單片機(jī)源碼:
- #include <STC15.h>
- #include <INTRINS.h>
- sbit PWMOUT = P3^7;
- sbit CHFWD = P3^6;
- unsigned char HighRH = 0; //高電平重載值的高字節(jié)
- unsigned char HighRL = 0; //高電平重載值的低字節(jié)
- unsigned char LowRH = 0; //低電平重載值的高字節(jié)
- unsigned char LowRL = 0; //低電平重載值的低字節(jié)
- void Delay500ms();
- void ConfigPWM(unsigned int fr, unsigned char dc);
- void ClosePWM();
- void Delay20ms(); //@6.000MHz
- void DigDisplay();
- unsigned int i;
- typedef unsigned int u16;
- typedef unsigned char u8;
- unsigned int cou;
- u8 code smgduan[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共陽
- void delay(u16 i)
- {
- while(i--);
- }
- void main(){
- AUXR &= 0X7f;//12T
- P3M1 &= 0x00;
- P3M0 |= 0xc0;//強(qiáng)推挽
- cou = 1260;
- IT0 = 1;
- EX0 = 1;
- IT1 = 1;
- EX1 = 1;
- EA = 1; //開總中斷
- while (1){
- ConfigPWM(15, 50); //頻率 15Hz,占空比 50%
- while(i <= 45){DigDisplay();};
- i = 0;
- ClosePWM();
- ConfigPWM(20, 50); //頻率 20Hz,占空比 50%
- while(i <= 60){DigDisplay();};
- i = 0;
- ClosePWM();
- ConfigPWM(36, 50); //頻率 55Hz,占空比 50%
- while(i <= cou){DigDisplay();};
- i = 0;
- ClosePWM(); //關(guān)閉 PWM
- ConfigPWM(20, 50); //頻率 20Hz,占空比 50%
- while(i <= 60){DigDisplay();};
- i = 0;
- ClosePWM();
- ConfigPWM(15, 50); //頻率 15Hz,占空比50%
- while(i <= 45){DigDisplay();};
- i = 0;
- ClosePWM(); //關(guān)閉 PWM,相當(dāng)于占空比 100%
- CHFWD = ~CHFWD;
- Delay500ms();
- }
- }
- /* 數(shù)碼管顯示*/
- void DigDisplay()
- {
- u16 s;
- for(s=0;s<4;s++)
- {
- switch(s)
- {
- case(0):
- P2 = 0xfe;P0 = smgduan[0]; break;
- case(1):
- P2 = 0xfd;P0 = smgduan[(cou/10)%10]; break;
- case(2):
- P2 = 0xfb;P0 = smgduan[(cou/100)%10]; break;
- case(3):
- P2 = 0xf7;P0 = smgduan[(cou/1000)]; break;
- }
- delay(3);
- P0=0xFF;
- }
- }
- void Delay27ms() //@6.000MHz
- {
- unsigned char i, j, k;
- _nop_();
- _nop_();
- i = 1;
- j = 158;
- k = 145;
- do
- {
- do
- {
- while (--k);
- } while (--j);
- } while (--i);
- }
- void Delay500ms() //@6.000MHz
- {
- unsigned char i, j, k;
-
- _nop_();
- _nop_();
- i = 12;
- j = 103;
- k = 57;
- PWMOUT = 0;
- do
- {
- do
- { DigDisplay();
- while (--k);
- } while (--j);
- } while (--i);
- }
- /* 配置并啟動 PWM,fr-頻率,dc-占空比 */
- void ConfigPWM(unsigned int fr, unsigned char dc){
- unsigned int high, low;
- unsigned long tmp;
- tmp = (6000000/12) / fr; //計(jì)算一個(gè)周期所需的計(jì)數(shù)值
- high = (tmp*dc) / 100; //計(jì)算高電平所需的計(jì)數(shù)值
- low = tmp - high; //計(jì)算低電平所需的計(jì)數(shù)值
- high = 65536 - high + 12; //計(jì)算高電平的重載值并補(bǔ)償中斷延時(shí)
- low = 65536 - low + 12;//計(jì)算低電平的重載值并補(bǔ)償中斷延時(shí)
- HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節(jié)
- HighRL = (unsigned char)high;
- LowRH = (unsigned char)(low>>8); //低電平重載值拆分為高低字節(jié)
- LowRL = (unsigned char)low;
- TMOD &= 0x0F; //清零 T1 的控制位
- TMOD |= 0x10; //配置 T1 為模式 1
- TH1 = HighRH; //加載 T1 重載值
- TL1 = HighRL;
- ET1 = 1; //使能 T1 中斷
- TR1 = 1; //啟動 T1
- PWMOUT = 1; //輸出高電平
- }
- /* 關(guān)閉 PWM */
- void ClosePWM(){
- TR1 = 0; //停止定時(shí)器
- ET1 = 0; //禁止中斷
- PWMOUT = 1; //輸出高電平
- }
- void Add() interrupt 0
- {
- EX0 = 0;
- Delay27ms();
- if(P3^2 == 0){
- cou = cou + 10;
- }
- //while(!P3^2);
- EX0 = 1;
- }
- void Sub() interrupt 2
- {
- EX1 = 0;
- Delay27ms();
- if(P3^3 == 0){
- cou = cou - 10;
- }
- //while(!P3^3);
- EX1 = 1;
- }
- /* T0 中斷服務(wù)函數(shù),產(chǎn)生 PWM 輸出 */
- void InterruptTimer1() interrupt 3{
- if (PWMOUT == 1){ //當(dāng)前輸出為高電平時(shí),裝載低電平值并輸出低電平
- TH1 = LowRH;
- TL1 = LowRL;
- i++;
- PWMOUT = 0;
- //DigDisplay();
- }else{ //當(dāng)前輸出為低電平時(shí),裝載高電平值并輸出高電平
- TH1 = HighRH;
- TL1 = HighRL;
- PWMOUT = 1;
- //DigDisplay();
- }
- }
復(fù)制代碼 |
-
-
huasheng_3jieh.rar
2019-3-21 21:23 上傳
點(diǎn)擊文件名下載附件
下載積分: 黑幣 -5
33.87 KB, 下載次數(shù): 39, 下載積分: 黑幣 -5
評分
-
查看全部評分
|