欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
請大家幫我 單片機定時器的問題
[打印本頁]
作者:
lwhmgp
時間:
2017-11-24 11:10
標題:
請大家幫我 單片機定時器的問題
本人初學者,有一問題請教大家.
我用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;
}
}
復制代碼
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1