Code Vi Điều Khiển:
#include<16f877a.h>            //thu vien cho pic
#FUSES NOWDT                    // No Watch Dog Timer
#FUSES HS                       // High speed Osc (> 4mhz)
#use delay(clock=20M)         //su dung tre
int8 const LED7[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
                              //mang hien thi cac so tu 0 den 9
long i,L1,L2,ng,x,y,vao,ra,DATA_INFR;   //khai bao cac bien
// Ham check xung START
/* Xung START là xung co:
- tin hieu o muc thap (0) có do dai 9ms
- tin hieu o muc cao (1) có do dai 4ms
Chi kiem tra tin hieu o muc thap dung 9ms la dung xung START
*/
unsigned char check_start()
{
    unsigned char i;
    if(DATA_INFR==0)              // Neu co canh xuong cua tin hieu
    {
          delay_us(500);          // Delay de chong nhieu
          if(DATA_INFR==0)        // Neu dung la co canh xuong cua tin hieu
          {
              for(i=0;i<40;i++)  // Chia nho xung START thanh 40 doan, moi doan dai 200us
              {
                    delay_us(200);
                    if(DATA_INFR==1) return 0;    // Neu tin hieu len muc cao (1) --> khong phai xung START
              }
              while(DATA_INFR==1);  
              return 1;          // Dung la xung start
          }

    }
}
// ===============================================================
//  Ham doc ma cua cac kenh
unsigned long int infr_sensor()
{
    unsigned char i;
    unsigned int Data_Infr;
    Data_Infr=0;
    if(check_start())                  // Neu dung xung START
    {
          while(DATA_INFR==1);          // Cho het bit 1 tiep theo
          while(DATA_INFR==0);          // Cho het bit 0 tiep theo
          for(i=0;i<24;i++)            // Lay 24 bit du lieu (bao gom 8 bit 0 va 8 bit 1 dau tien sau xung start)
          {
              //while(DATA_INFR==0);
              delay_us(750);          // Delay 750us de kiem tra bit
              if(DATA_INFR==0) Data_Infr=Data_Infr*2 + 1;
              if(DATA_INFR==1) Data_Infr=Data_Infr*2;
              while(DATA_INFR==1);    // cho canh len
              while(DATA_INFR==0);    // cho canh len
          }
          delay_ms(600);                // Cho het tin hieu (chong nhieu)
    }
    return Data_Infr;                  // Gia tri ma kenh tra ve
}
//============================================//

void den(ng){
      if (ng==0) output_a(0); //xuat ra cong a gia tri 0
      else output_a(1);       //xuat ra cong a gia tri 1
}

//============================================//

void led(ng){
         L1=(ng/ 1) % 10;      // Lay so hang don vi
         L2=(ng/ 10) % 10;     // Lay so hang chuc
    for(i=0;i<100;i++){
         output_c(LED7[L2]); output_d(1); delay_ms(1); output_d(0);
           // dua ma so hang chuc ra cong C, bat LED 1, tre 1ms roi tat
         output_c(LED7[L1]); output_d(2); delay_ms(1); output_d(0);
           // dua ma so hang don vi ra cong C, bat LED 2, tre 1ms roi tat
        }
}

//============================================//

int dauvao(){                  //ctr con dau vao
   if ((x==0)&&(y==0)){        //neu bat dau di vao thi thuc hien
      x=1;                     //ghi nhan da qua senso 1
      if (ng!=99) ng++;        //neu so nguoi con nho hon 99 thi dem tang
   }
   else if ((x==0)&&(y==1)){  //neu la cuoi cua qua trinh di ra
   x=1;                       //ghi nhan da qua senso 1
   }
}

//============================================//

int daura(){                //ctr con dau ra
   if ((x==0)&&(y==0)){     //neu bat dau di ra va con nguoi trong phong
      y=1;                  //ghi nhan da qua senso 2
      if (ng!=0) ng--;      //neu so nguoi con lon hon 0 thi dem giam
   }
   else if((x==1)&&(y==0)){ //neu la cuoi cua qua trinh vao
   y=1;                     //ghi nhan da qua senso 2
   }  
}

//============================================//

#INT_rb                     //khai bao ngat thay doi trang thai cong B

long vaora(){               //ctr ngat cong B
      vao=input(pin_b4);    //gan bien vao doc du lieu vao chan B4 tu senso 1
      ra=input(pin_b5);     //gan bien vao doc du lieu vao chan B5 tu senso 2
   if (vao==0) dauvao();    //neu co tin hieu vao thi cho chay ctr con dau vao
   else if (ra==0) daura(); //neu co tin hieu ra thi cho chay ctr con dau ra
   if ((x==1)&&(y==1)&&(vao==1)&&(ra==1)){
                            //khi ca 2 sense deu da co tin hieu thi cai dat lai
      x=0;
      y=0;
    }
   return ng;
}              

//============================================//

void main(){
      x=y=0; ng=0;         //Gan cac gia tri ban dau
      set_tris_a(0);       //Cong A la cong ra
      set_tris_b(0xff);    //Cong B la cong vao
      set_tris_c(0);       //Cong C la cong ra
      set_tris_d(0);       //Cong D la cong ra

      enable_interrupts(INT_rb);  //cho phep ngat ngoai dem vach
      enable_interrupts(GLOBAL);  //cho phep ngat toan cuc
   
     while (true)
     {            //lien tuc kiem tra senso va dieu khien den
      led(ng);             //goi ham hien thi den led
      den(ng); //goi ham bat tat den
   
      }
}
( Mô Phỏng + Code)
Khi nhấn nút "Tải Về Máy", bạn sẽ vào trang quảng cáo, vui lòng chờ 5 giây. Nút  hiện ra ở góc phải phía trên, nhấn vào để đến trang download
Nguồn : Echipkool - Chia sẻ kiến thức - Kết nối đam mê điện tử

Hệ thống bật tắt đèn thông minh - PIC

Đăng nhận xét

Đăng nhận xét

Author Name



Tôi là Ngọc Anh. Tôi đến từ Nghệ An. Tôi tốt nghiệp một trường đại học tại Sài Gòn. Hiện tôi đang phát triển công ty riêng. Liên lạc với tôi qua:






Biểu mẫu liên hệ

Tên

Email *

Thông báo *

Được tạo bởi Blogger.