本人初學者,有一問題請教大家.
我用STC89C52,三個定時器一起用,T0是計外脈沖的,T1是輸出方波,T2用來采樣和控制T1輸出相應頻率的方波,
問題是T1輸出的方波不太穩定,波型上橫向有過沖現象,表現在步進電機上就是轉速不大穩,但是不用T2,把T2關掉,直接打開T1就好多了,
但這樣又實現不了我想要的功能,這是怎么回事,該怎樣修改,或是哪位大神有更好的方法,請幫我解惑.
- #include<STC89C5xRC.h>
- typedef unsigned char u8;
- typedef unsigned int u16;
- u8 t0,t1,i,bb=100;
- u16 t2;
- u8 code tab[]={0x3f,0x06,0x5b,0x4f,0x66,
- 0x6d,0x7d,0x07,0x7f,0x6f};
- unsigned char Dis_Shiwei;//定義十位
- unsigned char Dis_Gewei; //定義個位
- unsigned char Dis_Baiwei; //定義百位
- sbit sucu=P1^0; //方波輸出
- sbit deng1=P1^1; //高轉速指示
- sbit deng2=P1^2; //低轉速指示
- sbit led0= P1^6; //這3個調試用,沒什么實際意義
- sbit led1=P1^7;
- sbit led2=P1^5;
- bit kong;
- delay(u16 a)
- {
- while(a--);
- }
- timor()
- {
- TMOD |= 0x10;
- T2MOD |= 0; //初始化模式寄存器
- T2CON = 0; //初始化控制寄存器
- TL2 = 0x18; //設置定時初值
- TH2 = 0xfC; //設置定時初值
- RCAP2L = 0x18; //設置定時重載值
- RCAP2H = 0xfC; //設置定時重載值
-
- ET2=1; //打開定時2器中斷
- EA=1; //打開總中斷
- TR2=1; //定時器2啟動
-
- EX0=1; //外部中斷0打開;
- IT0=1; //外部中斷0選擇下降沿觸發
- TH1 = 0xfe; //定時器1賦初值
- TL1 = bb; //由bb的值決定轉速
- ET1 = 1; //打開定時1器中斷
- //TR1 = 1; //定時器1啟動
-
-
-
- }
- xianshi()
- {
-
- P0=Dis_Baiwei; //顯示百位
- P2=5; //P2口控制位選端,數5表示選中的第六位數碼管 下同
- delay(300);
- P0=Dis_Shiwei;//顯示十位
- P2=6;
- delay(300); //短暫延時
- P0=Dis_Gewei; //顯示個位
- P2=7;
- delay(300);
-
-
- }
- main()
- {
- timor();
- while(1)
- {
- xianshi();
- }
- }
- void InitTimer0(void) interrupt 0 //using 1//外中斷0入口
- {
- t0++; //用來計INT0輸入的脈沖數
- led0=~led0;
- }
- void InitTimer1(void) interrupt 3 using 1//定時器1中斷入口
- {
-
- TH1 = 0xfe; //賦初值
- TL1 = bb; //bb決定轉速
- t1++;
- //led1=~led1;
- if(t1==2) //二分頻
- {
- t1=0;
- sucu=~sucu;
- }
-
-
- }
- void InitTimer2(void) interrupt 5 //定時器2中斷入口 1ms定時
- {
-
- TF2=0; //定時器2溢出位清零
- t2++;
- if(t2==50)
- {
- EX0=0; //外中斷0關閉
- TR2=0; //定時器2關閉
- t2=0; //t2清零
-
- Dis_Baiwei=tab[t0/100%10]; //百位顯示值處理
- Dis_Shiwei=tab[t0/10%10]; //十位顯示值處理
- Dis_Gewei=tab[t0%10]; //個位顯示處理
-
- if(t0>=9 && t0<=10) //如果i大于9而小于10,執行
- { //花括號內的函數 下同
-
- deng1=0;
- deng2=1;
- kong=1;
- //bb=190;
- //TR1=1; //定時器1啟動
-
- }
- else if(t0>=6 && t0<=7)
- {
-
- deng2=0;
- deng1=1;
- bb=70;
- TR1=1;
- }
-
- else //如果上述值都不等于
- {
- deng1=1; //指示燈關閉
- deng2=1;
- kong=0;
- TR1=0; //定時器1關閉,電機停轉
- bb=100;
- sucu=1;
- }
-
- TR2=1; //定時器2啟動
- EX0=1; //外中斷0打開
- t0=0; //外中斷0計數值清0
-
-
- }
-
-
- if(kong==1) //步進電機軟啟動
- {
-
- if(bb<190)
- {
- bb++;
- TR1=1; //定時器1啟動
- led1=~led1;
- }
-
-
-
- }
-
復制代碼
|