PDA

View Full Version : động cơ bước


lehongviet
24-10-2009, 12:41 PM
Các bạn xem giúp mình đoạn code và mô phỏng sau, và làm sao để led xuất liên tục chứ không nhấp nháy.Xin chỉ giúp
chưong trình:

/*******BAT DAU CHUONG TRINH************/
#INCLUDE <16F877A.H>
#INCLUDE <DEF_877A.H>
#DEFINE STOP PIN_B4
#DEFINE DKTH PIN_B5
#DEFINE DKNG PIN_B6
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000) //SU DUNG THACH ANH 20MHZ
#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(D)
INT8 I,BCHUC,BDVI,VDVI,VCHUC;
INT8 SBUOC=0,A,SVONG=0;
INT8 R_KEY=0;
CONST UNSIGNED CHAR
DIG[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
CONST UNSIGNED CHAR ROTATE[]={14,12,13,9,11,3,7,6};
/************************************************** *******
CHUONG TRINH DIEU KHIEN LED QUAY THUAN
SU DUNG LOAI DONG CO BUOC 48 RANG
DIEU KHIEN NUA BUOC
*/
//CHUONG TRINH NGAT RB
#INT_RB
VOID NGAT_RB()
{
IF(RBIF==1)
{
IF(INPUT(STOP)==0){A=0;}
IF(INPUT(DKTH)==0){A=1;}
IF(INPUT(DKNG)==0){A=2;}
}
RBIF=0;
}
//CHUONG TRINH DOI SO BUOC, SO VONG RA SO BCD
void HEX_BCD()
{
VCHUC=SVONG/10;
VDVI=SVONG%10;
BCHUC=SBUOC/10;
BDVI=SBUOC%10;
}
void HIENTHI1()
{
PORTC=DIG[BDVI]; //HIEN THI SO BUOC DON VI
PORTD=0X0F;
DELAY_US(100);
PORTD=0; //CHONG LEM
PORTC=DIG[BCHUC]; //HIEN THI SO BUOC CHUC
PORTD=0X17;
DELAY_US(100);
PORTD=0;
PORTC=0XBF; //HIEN THI DAU GACH PHAN CACH
PORTD=0X1B;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VDVI]; //HIEN THI SO VONG DON VI
PORTD=0X1D;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VCHUC]; //HIEN THI SO VONG CHUC
PORTD=0X1E;
DELAY_US(100);
PORTD=0;
}
void HIENTHI()
{
I=0;
SBUOC++;
IF(SBUOC>95){
SBUOC=0;
SVONG++;
IF(SVONG>99){SVONG=0;}
}
HEX_BCD();
WHILE(I<10)
{
HIENTHI1();
I++;
}
}
void QUAYTHUAN()
{
PORTA=ROTATE[R_KEY];
HIENTHI();
IF (R_KEY < 7){R_KEY++;}
ELSE R_KEY=0;
}
void QUAYNGICH()
{
PORTA=ROTATE[R_KEY];
HIENTHI();
IF (R_KEY > 0){R_KEY--;}
ELSE R_KEY=7;
}
void STP()
{
OUTPUT_A(0XFF);
HEX_BCD();
HIENTHI1();
}
VOID MAIN ()
{
SET_TRIS_A(0); // PORTA DIEU KHIEN DONG CO BUOC
SET_TRIS_B(0XFF); // PORTB LA PORT NHAP DU LIEU
SET_TRIS_C(0); // PORTC XUAT MA HIEN THI
SET_TRIS_D(0); // PORTD QUET LED
ENABLE_INTERRUPTS(GLOBAL); //CHO PHEP NGAT TOAN CUC
ENABLE_INTERRUPTS(INT_RB); //CHO PHEP NGAT RB
EXT_INT_EDGE(H_TO_L); //CHO PHEP NGAT CANH XUONG
A=0;
WHILE(true)
{
SWITCH(A)
{
CASE 0 : STP(); //NEU A=0 THI STOP
BREAK;
CASE 1 : QUAYTHUAN(); //NEU A=1 THI QUAY THUAN
BREAK;
CASE 2 : QUAYNGICH(); //NEU A=2 THI QUAY NGHICH
BREAK;
}
}
}


Em không gửi được file đính kèm hình ảnh,xin thông cảm

phamminhtuan
04-12-2009, 08:28 AM
Các bạn xem giúp mình đoạn code và mô phỏng sau, và làm sao để led xuất liên tục chứ không nhấp nháy.Xin chỉ giúp
chưong trình:

/*******BAT DAU CHUONG TRINH************/
#INCLUDE <16F877A.H>
#INCLUDE <DEF_877A.H>
#DEFINE STOP PIN_B4
#DEFINE DKTH PIN_B5
#DEFINE DKNG PIN_B6
#FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP
#USE DELAY(CLOCK=20000000) //SU DUNG THACH ANH 20MHZ
#USE FAST_IO(A)
#USE FAST_IO(B)
#USE FAST_IO(D)
INT8 I,BCHUC,BDVI,VDVI,VCHUC;
INT8 SBUOC=0,A,SVONG=0;
INT8 R_KEY=0;
CONST UNSIGNED CHAR
DIG[]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X9 0};
CONST UNSIGNED CHAR ROTATE[]={14,12,13,9,11,3,7,6};
/************************************************** *******
CHUONG TRINH DIEU KHIEN LED QUAY THUAN
SU DUNG LOAI DONG CO BUOC 48 RANG
DIEU KHIEN NUA BUOC
*/
//CHUONG TRINH NGAT RB
#INT_RB
VOID NGAT_RB()
{
IF(RBIF==1)
{
IF(INPUT(STOP)==0){A=0;}
IF(INPUT(DKTH)==0){A=1;}
IF(INPUT(DKNG)==0){A=2;}
}
RBIF=0;
}
//CHUONG TRINH DOI SO BUOC, SO VONG RA SO BCD
void HEX_BCD()
{
VCHUC=SVONG/10;
VDVI=SVONG%10;
BCHUC=SBUOC/10;
BDVI=SBUOC%10;
}
void HIENTHI1()
{
PORTC=DIG[BDVI]; //HIEN THI SO BUOC DON VI
PORTD=0X0F;
DELAY_US(100);
PORTD=0; //CHONG LEM
PORTC=DIG[BCHUC]; //HIEN THI SO BUOC CHUC
PORTD=0X17;
DELAY_US(100);
PORTD=0;
PORTC=0XBF; //HIEN THI DAU GACH PHAN CACH
PORTD=0X1B;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VDVI]; //HIEN THI SO VONG DON VI
PORTD=0X1D;
DELAY_US(100);
PORTD=0;
PORTC=DIG[VCHUC]; //HIEN THI SO VONG CHUC
PORTD=0X1E;
DELAY_US(100);
PORTD=0;
}
void HIENTHI()
{
I=0;
SBUOC++;
IF(SBUOC>95){
SBUOC=0;
SVONG++;
IF(SVONG>99){SVONG=0;}
}
HEX_BCD();
WHILE(I<10)
{
HIENTHI1();
I++;
}
}
void QUAYTHUAN()
{
PORTA=ROTATE[R_KEY];
HIENTHI();
IF (R_KEY < 7){R_KEY++;}
ELSE R_KEY=0;
}
void QUAYNGICH()
{
PORTA=ROTATE[R_KEY];
HIENTHI();
IF (R_KEY > 0){R_KEY--;}
ELSE R_KEY=7;
}
void STP()
{
OUTPUT_A(0XFF);
HEX_BCD();
HIENTHI1();
}
VOID MAIN ()
{
SET_TRIS_A(0); // PORTA DIEU KHIEN DONG CO BUOC
SET_TRIS_B(0XFF); // PORTB LA PORT NHAP DU LIEU
SET_TRIS_C(0); // PORTC XUAT MA HIEN THI
SET_TRIS_D(0); // PORTD QUET LED
ENABLE_INTERRUPTS(GLOBAL); //CHO PHEP NGAT TOAN CUC
ENABLE_INTERRUPTS(INT_RB); //CHO PHEP NGAT RB
EXT_INT_EDGE(H_TO_L); //CHO PHEP NGAT CANH XUONG
A=0;
WHILE(true)
{
SWITCH(A)
{
CASE 0 : STP(); //NEU A=0 THI STOP
BREAK;
CASE 1 : QUAYTHUAN(); //NEU A=1 THI QUAY THUAN
BREAK;
CASE 2 : QUAYNGICH(); //NEU A=2 THI QUAY NGHICH
BREAK;
}
}
}
Em không gửi được file đính kèm hình ảnh,xin thông cảm

Nếu bạn mô phỏng là chạy được mà chỉ nhấp nháy thôi thì bạn nên dùng mạch thật, vì khả năng mô phỏng animation tốc độ cao của một số trình mô phỏng còn hạn chế