View Single Post
Old 04-08-2008, 07:25 AM   #24
minhsondaklak
Đệ tử 5 túi
 
Tham gia ngày: Jan 2008
Bài gửi: 96
:
Talking Ứng dụng nhỏ với Pic _ Chỉ sử dụng Timer0

Theo gợi ý của anh Namqn, mình làm lại mạch điều khiển cho cái bơm nước hồ cá, dùng Pic 18 chân, chỉ dùng timer0 - vừa rẻ vừa gọn, rất cạnh tranh (he he).



A. Hoat dong:
- Dieu khien : Ban dem OFF. Ban ngay ON 10 phut, OFF 10 phut (PORTA.F3)
- Moi phut bao gio 1 lan, duoi dang ma nhi phan BCD, xuat tren cong B.
- Chinh gio: Dung 19 gio, nhan vao nut SET_19h de lay 19h cho dong ho, thay vi dung LCD
B.Cau hinh phan cung: Pic 16F84A (hoặc Pic 16f88/16f628A với CMCON = 0x07), Thach anh 4Mhz
- Su dung Timer0 lam dong ho, bo tri mach nguon du phong cho Pic = 3v.
- PORTA.F0 la ngo vao noi voi nut nhan SET_19h, cho dong ho ve dung 19 h
- PORTA.F1 noi voi den bao giay
- PORTA.F2 noi voi den bao phut
- PORTA.F3 la ngo ra dieu khien Relays, dong mo thiet bi may bom (ON = 0, OFF = 1)
- PORTB ngo ra 8 bit bao gio, phut dang ma nhi phan BCD
- Ngat Time0: Cung cap xung 65,5 ms cho dong ho.
Sau moi giay nhay den giay, 1 phut cho nhay led phut va xem xet ON_OFF chan PORTA.F3

C. Giai thich cac bien:
- gio, phut : cac bien luu thoi gio
- flag: co bao theo chu ky phut, dung de xu ly cong viec ngoai ham ngat mikroC
- delay1s, delay1p: bien dem ngat tran, tinh chu ky giay, phut
Trình dịch MikroC:

Code:
unsigned short tem1, tem2, phut, gio, flag, delay1s = 0, delay1p = 0; 

void INIT_MAIN() // Khoi tao cac PORT, NGAT, I2C
{
/* Khoi tao cong B -----------------------------------------------------------*/
  TRISB = 0x00;             
  PORTB = 0x00;
/* Khoi tao cong A ----------------------------------------------------*/
  TRISA = 0x01;          
  PORTA = 0x08;          
/* Khoi tao Timer0 ---------------------------------------------*/
  INTCON = 0b10100000; 
  OPTION_REG = 0b10000111;  
  TMR0 = 0x00;       //Xoa thanh dem Timer0 (cho dem tu 0 den 256 -> 256 chu ky may)
  //Voi Fta=4Mhz -> Chukymay =4/4Mhz=1 us, hesochia = 256 -> T =1x256x256=65536 us =~ 65,5 ms
  //Vay ta can: 1000 / 65,5 =` 15 lan tran de co 1 s, 15 x 60 = 900 lan tran de co 1 phut
}

void HIEN_THI()     //Dung hien thi gio hien hanh, dang ma nhi phan BCD
{   
        PORTB = Dec2Bcd(gio); Delay_ms(5000); PORTB = 0; Delay_ms(1000);   
        PORTB = Dec2Bcd(phut); Delay_ms(5000); PORTB = 0; Delay_ms(1000);   
}

void SET_19h()  //Set dong ho ve 19 gio 00 phut, khi co nguoi bam SET_19h
{
     gio = 19; phut = 0;
     HIEN_THI();
}

void ON_OFF()   // cho ON, OFF chan dieu khien PORTA.F3:
  //Neu ban ngay (tu 6h den 20h) dong thoi so hang chuc cua phut la so chan (Mod 2 bang 0)thi ON, la so le (Mod 2 bang 1) thi OFF (ON 10 phut, OFF 10 phut)
  //Neu ban dem (21h den 5h)thi OFF
{
        if (6 <= gio && gio <= 21)      // An dinh thoi gian ON trong ngay
              {
              if ((phut / 10) % 2 == 0) 
                                        
                        {if (PORTA.F3 == 1) PORTA.F3 = 0;}   
              else
                        {if (PORTA.F3 == 0) PORTA.F3 = 1;}   
              }
        else                                             
             {if (PORTA.F3 == 0) PORTA.F3 = 1;}     
}

void SET_PHUT()    //Xu ly moi chu ky 1 phut
{
      PORTA.F2 = 1; Delay_ms(2000);  PORTA.F2 = 0;  //Lam den nhay theo nhip 1 phut
      phut++ ;
      if (phut == 60) 
      {
                gio++;
                if (gio == 24) gio = 0;
                phut = 0;
      }
}

void interrupt()      //Chuong trinh NGAT
{
     if (INTCON.T0IF)              
     {
          delay1s++;               
          if (delay1s == 15)
          {
                 delay1p++;
                 PORTA.F1 = ~PORTA.F1;  //Lam den nhay theo nhip 1 giay
                 delay1s = 0;
          }
          if (delay1p == 60)      //Neu du 900 lan tran = (60 x 15) x 65,5ms ~ 1 phut
          {
                 flag = 1;          //Tin hieu: Da du 1 phut -> SET_PHUT()
                 delay1p = 0;     //Sau khi bat co, xoa ve 0,  dem lai tu dau
          }
          INTCON.T0IF = 0;         //Xoa co ngat time0
      }
}                                //Het interrup

void MAIN() //CHUONG TRINH CHINH
{
  INIT_MAIN();                    //khoi tao cac PORT, NGAT, I2C
  Delay_ms(100);
  SET_19h();
  while (1)
        {
        if (flag == 1) {SET_PHUT(); HIEN_THI();ON_OFF(); flag = 0;} 
        if (PORTA.F0 == 0) SET_19h(); 
        }
}
Kèm theo file mô phỏng trên Proteus.
Nếu kiếm được ds1307, thì có thể khai thác thêm I2C bằng phần mềm cho em Pic 18 chân, coi như xài hết công suất (hết chân Pic) rồi nhé !
I2C mềm với MikroC đây: http://www.picvietnam.com/forum/showthread.php?t=2671
File Kèm Theo
File Type: rar Ung dung nho voi PIC _ Timer0.rar (67.7 KB, 195 lần tải)

thay đổi nội dung bởi: minhsondaklak, 19-09-2008 lúc 04:07 PM. Lý do: Khung code
minhsondaklak vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn