PIC Vietnam

PIC Vietnam (http://www.picvietnam.com/forum/index.php)
-   Cơ bản về vi điều khiển và PIC (http://www.picvietnam.com/forum/forumdisplay.php?f=8)
-   -   Mạch đồng hồ đếm lùi (http://www.picvietnam.com/forum/showthread.php?t=7126)

zmaxtil 06-10-2010 06:49 PM

Mạch đồng hồ đếm lùi
 
1 Attachment(s)
Em đang làm một mạch đếm lùi thời gian,dùng 6 Led 7 đoạn A chung,Khi giờ phút giây đều là 0 thì sẽ set cho một chân RC6 lên mức 1 để kích gì đó,dùng ngắt ngoài để vào mode chỉnh time,ngắt timer để cứ 1s thì cho giảm một đơn vị giây.Nhưng sao nó chạy táng lạng luôn,các cao thủ chỉ giúp em .em gửi code và file mô phỏng lên để các bác xem nó chạy.em chỉ mới làm phần cho nó đếm về 0 ,chưa xong nên em chưa làm phần kích chân Rc6,nhờ các bác chỉ giáo.

Code:

#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(d)
#use fast_io(c)
#use fast_io(a)
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#bit rb1 = portb.1
#bit rb2 = portb.2
#bit rb3 = portb.3
int mode_= 0;
int i,j,k,x,y,z;
int s_chuc,s_dv,m_chuc,m_dv,h_chuc,h_dv;
#int_ext
void mode()
{disable_interrupts(INT_TIMER2);
if (mode_ == 0) disable_interrupts(INT_TIMER2);
mode_ +=1;
if (mode_ > 3)
  mode_  = 1;
}
#int_timer2
void update()
{
 setup_timer_2(t2_div_by_16,6,10);  // na.p la.i cho timer 2
 k++ ; // ta(ng bie^'n ?e^'m
 if ( k == 250 ) /// 250 x 4.000 = 10.000.000 us
 {if (x==0)  {x=59;y--;} else x=x-1;k==0;
 if (y==0)  {y=59;z--;} else y=y-1;
 }
}

 //******************Hien thi***********************
 void hienthi()
 {
  s_chuc=x/10;
  s_dv=x%10;
  m_chuc=y/10;
  m_dv=y%10;
  h_chuc=z/10;
  h_dv=z%10;
 
  for(j=0;j<=50;j++)
    { portc=0b00100000;
      i=s_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00010000;
      i=s_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00001000;
      i=m_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000100;
      i=m_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00000010;
      i=h_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000001;
      i=h_chuc;
      portd=i;
      delay_us(500);
    }
 }

 // ********************Chuong trinh chinh*************************

 void main()
 {
 x=y=z=10;
 enable_interrupts(GLOBAL);
 enable_interrupts(INT_EXT);
 portc=0;
 portd=0;
 set_tris_c(0);
 set_tris_d(0);
while(1)
 {
 while(!mode_)
 {
  if(rb3)
        {               
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10);
          hienthi();       
        }
  hienthi();
 }
 while(mode_>0)
 {
 if(rb1) {
        while(rb1) { hienthi();}
        if (x==59) x = 0; else
        x +=(mode_==1)?1:0;
        if (y==59) y = 0; else
        y +=(mode_==2)?1:0;
        if (z==99) z = 0; else
        z +=(mode_==3)?1:0;
       
        }
 if(rb2) {
        while(rb2) { hienthi();}
        if (x==0) x = 59; else
        x -= (mode_==1)?1:0;
        if (y==0) y = 59; else
        y -= (mode_==2)?1:0;
        if (z==0) z = 99; else
        z -= (mode_==3)?1:0;
        }
 if(rb3)
        {
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10); // (4/20M)*4*C0*2         
        }
hienthi();
 }
 }
 }


zmaxtil 07-10-2010 04:36 AM

Các cao thủ xem giúp dùm.

tdm 07-10-2010 02:54 PM

Trích:

Nguyên văn bởi zmaxtil (Post 39128)
Em đang làm một mạch đếm lùi thời gian,dùng 6 Led 7 đoạn A chung,Khi giờ phút giây đều là 0 thì sẽ set cho một chân RC6 lên mức 1 để kích gì đó,dùng ngắt ngoài để vào mode chỉnh time,ngắt timer để cứ 1s thì cho giảm một đơn vị giây.Nhưng sao nó chạy táng lạng luôn,các cao thủ chỉ giúp em .em gửi code và file mô phỏng lên để các bác xem nó chạy.em chỉ mới làm phần cho nó đếm về 0 ,chưa xong nên em chưa làm phần kích chân Rc6,nhờ các bác chỉ giáo.

Code:

#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(d)
#use fast_io(c)
#use fast_io(a)
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#bit rb1 = portb.1
#bit rb2 = portb.2
#bit rb3 = portb.3
int mode_= 0;
int i,j,k,x,y,z;
int s_chuc,s_dv,m_chuc,m_dv,h_chuc,h_dv;
#int_ext
void mode()
{disable_interrupts(INT_TIMER2);
if (mode_ == 0) disable_interrupts(INT_TIMER2);
mode_ +=1;
if (mode_ > 3)
  mode_  = 1;
}
#int_timer2
void update()
{
 setup_timer_2(t2_div_by_16,6,10);  // na.p la.i cho timer 2
 k++ ; // ta(ng bie^'n ?e^'m
 if ( k == 250 ) /// 250 x 4.000 = 10.000.000 us
 {if (x==0)  {x=59;y--;} else x=x-1;k==0;
 if (y==0)  {y=59;z--;} else y=y-1;
 }
}

 //******************Hien thi***********************
 void hienthi()
 {
  s_chuc=x/10;
  s_dv=x%10;
  m_chuc=y/10;
  m_dv=y%10;
  h_chuc=z/10;
  h_dv=z%10;
 
  for(j=0;j<=50;j++)
    { portc=0b00100000;
      i=s_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00010000;
      i=s_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00001000;
      i=m_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000100;
      i=m_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00000010;
      i=h_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000001;
      i=h_chuc;
      portd=i;
      delay_us(500);
    }
 }

 // ********************Chuong trinh chinh*************************

 void main()
 {
 x=y=z=10;
 enable_interrupts(GLOBAL);
 enable_interrupts(INT_EXT);
 portc=0;
 portd=0;
 set_tris_c(0);
 set_tris_d(0);
while(1)
 {
 while(!mode_)
 {
  if(rb3)
        {               
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10);
          hienthi();       
        }
  hienthi();
 }
 while(mode_>0)
 {
 if(rb1) {
        while(rb1) { hienthi();}
        if (x==59) x = 0; else
        x +=(mode_==1)?1:0;
        if (y==59) y = 0; else
        y +=(mode_==2)?1:0;
        if (z==99) z = 0; else
        z +=(mode_==3)?1:0;
       
        }
 if(rb2) {
        while(rb2) { hienthi();}
        if (x==0) x = 59; else
        x -= (mode_==1)?1:0;
        if (y==0) y = 59; else
        y -= (mode_==2)?1:0;
        if (z==0) z = 99; else
        z -= (mode_==3)?1:0;
        }
 if(rb3)
        {
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10); // (4/20M)*4*C0*2         
        }
hienthi();
 }
 }
 }


thiếu dòng lệnh này:
set_tris_b(0xff);//portb làm port nhập
chưa có phần chống dội phím.

zmaxtil 07-10-2010 07:55 PM

- Em có đưa vào,mà tại chỉnh sửa nên lỡ xóa mất.dù có nó vẫn trục trặc bác ạ.
- Nó trục trặc ở cái chỗ biến đếm ,cho x-- khi k=250 thì ok,nhưng khi cho thêm biến y-- khi x==0 thì nó chạy loạn lên luôn,chả hiểu sao nữa.
- Phần chống dội phím em dùng một tụ 104 mắc // với nút nhấn.

tdm 08-10-2010 03:12 PM

Trích:

Nguyên văn bởi zmaxtil (Post 39128)
Em đang làm một mạch đếm lùi thời gian,dùng 6 Led 7 đoạn A chung,Khi giờ phút giây đều là 0 thì sẽ set cho một chân RC6 lên mức 1 để kích gì đó,dùng ngắt ngoài để vào mode chỉnh time,ngắt timer để cứ 1s thì cho giảm một đơn vị giây.Nhưng sao nó chạy táng lạng luôn,các cao thủ chỉ giúp em .em gửi code và file mô phỏng lên để các bác xem nó chạy.em chỉ mới làm phần cho nó đếm về 0 ,chưa xong nên em chưa làm phần kích chân Rc6,nhờ các bác chỉ giáo.

Code:

#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(d)
#use fast_io(c)
#use fast_io(a)
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#bit rb1 = portb.1
#bit rb2 = portb.2
#bit rb3 = portb.3
int mode_= 0;
int i,j,k,x,y,z;
int s_chuc,s_dv,m_chuc,m_dv,h_chuc,h_dv;
#int_ext
void mode()
{disable_interrupts(INT_TIMER2);
if (mode_ == 0) disable_interrupts(INT_TIMER2);
mode_ +=1;
if (mode_ > 3)
  mode_  = 1;
}
#int_timer2
void update()
{
 setup_timer_2(t2_div_by_16,6,10);  // na.p la.i cho timer 2
 k++ ; // ta(ng bie^'n ?e^'m
 if ( k == 250 ) /// 250 x 4.000 = 10.000.000 us
 {if (x==0)  {x=59;y--;} else x=x-1;k==0;
 if (y==0)  {y=59;z--;} else y=y-1;
 }
}

 //******************Hien thi***********************
 void hienthi()
 {
  s_chuc=x/10;
  s_dv=x%10;
  m_chuc=y/10;
  m_dv=y%10;
  h_chuc=z/10;
  h_dv=z%10;
 
  for(j=0;j<=50;j++)
    { portc=0b00100000;
      i=s_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00010000;
      i=s_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00001000;
      i=m_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000100;
      i=m_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00000010;
      i=h_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000001;
      i=h_chuc;
      portd=i;
      delay_us(500);
    }
 }

 // ********************Chuong trinh chinh*************************

 void main()
 {
 x=y=z=10;
 enable_interrupts(GLOBAL);
 enable_interrupts(INT_EXT);
 portc=0;
 portd=0;
 set_tris_c(0);
 set_tris_d(0);
while(1)
 {
 while(!mode_)
 {
  if(rb3)
        {               
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10);
          hienthi();       
        }
  hienthi();
 }
 while(mode_>0)
 {
 if(rb1) {
        while(rb1) { hienthi();}
        if (x==59) x = 0; else
        x +=(mode_==1)?1:0;
        if (y==59) y = 0; else
        y +=(mode_==2)?1:0;
        if (z==99) z = 0; else
        z +=(mode_==3)?1:0;
       
        }
 if(rb2) {
        while(rb2) { hienthi();}
        if (x==0) x = 59; else
        x -= (mode_==1)?1:0;
        if (y==0) y = 59; else
        y -= (mode_==2)?1:0;
        if (z==0) z = 99; else
        z -= (mode_==3)?1:0;
        }
 if(rb3)
        {
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10); // (4/20M)*4*C0*2         
        }
hienthi();
 }
 }
 }


không kích được rc6(xem hàm hiển thi sẽ rõ)
tôi đã sửa lại code cho ban chạy mô phỏng OK.
Code:

#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(d)
#use fast_io(c)
#use fast_io(a)
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#bit rb1 = portb.1
#bit rb2 = portb.2
#bit rb3 = portb.3
#bit led = portb.7
int mode_= 0;
int i,j,k,x,y,z;
int s_chuc,s_dv,m_chuc,m_dv,h_chuc,h_dv;
#int_ext
void mode()
{disable_interrupts(INT_TIMER2);
if (mode_ == 0) disable_interrupts(INT_TIMER2);
mode_ +=1;
if (mode_ > 3)
  mode_  = 1;
}
#int_timer2
void update()
{
 setup_timer_2(t2_div_by_16,6,10);  // na.p la.i cho timer 2
 k++ ; // ta(ng bie^'n ?e^'m
 if ( k == 250 ) /// 250 x 4.000 = 10.000.000 us
 {
 k=0;
 if(x==0&y==0&z==0)//sửa tại đây
 {
 led=1;
 }
 else
 {
 if (z==0)  {z=99;y--;}
  z=z-1;
  if (y==0)
  {
    if(x>0)
    {
    y=59;
    x--;
    }
    if(y>0)
    {
      y--;
    }
  }
  }
 }
}

 //******************Hien thi***********************
 void hienthi()
 {
  s_chuc=z/10;//sửa tại đây
  s_dv=z%10;
  m_chuc=y/10;
  m_dv=y%10;
  h_chuc=x/10;
  h_dv=x%10;//sửa tại đây
 
  for(j=0;j<=50;j++)
    { portc=0b00100000;
      i=s_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00010000;
      i=s_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00001000;
      i=m_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000100;
      i=m_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00000010;
      i=h_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000001;
      i=h_chuc;
      portd=i;
      delay_us(500);
    }
 }

 // ********************Chuong trinh chinh*************************

 void main()
 {
 x=0;
 y=2;
 z=99;
 led=0;
 enable_interrupts(GLOBAL);
 enable_interrupts(INT_EXT);
 portc=0;
 portd=0;
 set_tris_c(0);
 set_tris_d(0);
 set_tris_b(0x0f);
while(1)
 {
 while(!mode_)
 {
  if(rb3)
        {               
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10);
          hienthi();       
        }
  hienthi();
 }
 while(mode_>0)
 {
 if(rb1) {
        while(rb1) { hienthi();}
        if (x>=59) x = 0; else
        x +=(mode_==1)?1:0;
        if (y>=59) y = 0; else
        y +=(mode_==2)?1:0;
        if (z>=99) z = 0; else
        z +=(mode_==3)?1:0;
       
        }
 if(rb2) {
        while(rb2) { hienthi();}
        if (x==0) x = 59; else
        x -= (mode_==1)?1:0;
        if (y==0) y = 59; else
        y -= (mode_==2)?1:0;
        if (z==0) z = 99; else
        z -= (mode_==3)?1:0;
        }
 if(rb3)
        {
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10); // (4/20M)*4*C0*2         
        }
hienthi();
 }
 }
 }

code đã sửa lại chạy mô phỏng OK:
Code:

#include <16f877a.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#use fast_io(d)
#use fast_io(c)
#use fast_io(a)
#byte portb = 0x06
#byte portc = 0x07
#byte portd = 0x08
#bit rb1 = portb.1
#bit rb2 = portb.2
#bit rb3 = portb.3
#bit led = portb.7
int mode_= 0;
int i,j,k,x,y,z;
int s_chuc,s_dv,m_chuc,m_dv,h_chuc,h_dv;
#int_ext
void mode()
{disable_interrupts(INT_TIMER2);
if (mode_ == 0) disable_interrupts(INT_TIMER2);
mode_ +=1;
if (mode_ > 3)
  mode_  = 1;
}
#int_timer2
void update()
{
 setup_timer_2(t2_div_by_16,6,10);  // na.p la.i cho timer 2
 k++ ; // ta(ng bie^'n ?e^'m
 if ( k == 250 ) /// 250 x 4.000 = 10.000.000 us
 {
 k=0;
 if(x==0&y==0&z==0)//sửa tại đây
 {
 led=1;
 }
 else
 {
 if (z==0)  {z=99;y--;}
  z=z-1;k==0;
  if (y==0)
  {
    if(x>0)
    {
    y=59;
    x--;
    }
    if(y>0)
    {
      y--;
    }
  }
  }
 }
}

 //******************Hien thi***********************
 void hienthi()
 {
  s_chuc=z/10;//sửa tại đây
  s_dv=z%10;//sửa tại đây
  m_chuc=y/10;
  m_dv=y%10;
  h_chuc=x/10;//sửa tại đây
  h_dv=x%10;//sửa tại đây
 
  for(j=0;j<=50;j++)
    { portc=0b00100000;
      i=s_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00010000;
      i=s_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00001000;
      i=m_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000100;
      i=m_chuc;
      portd=i;
      delay_us(500);
     
      portc=0b00000010;
      i=h_dv;
      portd=i;
      delay_us(500);
     
      portc=0b00000001;
      i=h_chuc;
      portd=i;
      delay_us(500);
    }
 }

 // ********************Chuong trinh chinh*************************

 void main()
 {
 x=0;
 y=2;
 z=99;
 led=0;
 enable_interrupts(GLOBAL);
 enable_interrupts(INT_EXT);
 portc=0;
 portd=0;
 set_tris_c(0);
 set_tris_d(0);
 set_tris_b(0x0f);
while(1)
 {
 while(!mode_)
 {
  if(rb3)
        {               
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10);
          hienthi();       
        }
  hienthi();
 }
 while(mode_>0)
 {
 if(rb1) {
        while(rb1) { hienthi();}
        if (x>=59) x = 0; else
        x +=(mode_==1)?1:0;
        if (y>=59) y = 0; else
        y +=(mode_==2)?1:0;
        if (z>=99) z = 0; else
        z +=(mode_==3)?1:0;
       
        }
 if(rb2) {
        while(rb2) { hienthi();}
        if (x==0) x = 59; else
        x -= (mode_==1)?1:0;
        if (y==0) y = 59; else
        y -= (mode_==2)?1:0;
        if (z==0) z = 99; else
        z -= (mode_==3)?1:0;
        }
 if(rb3)
        {
          enable_interrupts(INT_TIMER2);
          setup_timer_2(t2_div_by_16,6,10); // (4/20M)*4*C0*2         
        }
hienthi();
 }
 }
 }


zmaxtil 09-10-2010 12:21 AM

Cám ơn anh TDM,em cũng có chỉnh được ròi.Thanks anh đã giúp đỡ và đóng góp.


Múi giờ GMT. Hiện tại là 05:58 PM.

Tên diễn đàn: vBulletin Version 3.8.11
Được sáng lập bởi Đoàn Hiệp.
Copyright © PIC Vietnam