![]() |
|
Tài trợ cho PIC Vietnam |
Cơ bản về vi điều khiển và PIC Những bài hướng dẫn cơ bản nhất để làm quen với vi điều khiển PIC |
|
Ðiều Chỉnh | Xếp Bài |
![]() |
#21 |
Đệ tử 5 túi
Tham gia ngày: Jan 2008
Bài gửi: 96
: |
![]() 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(); } } 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 thay đổi nội dung bởi: minhsondaklak, 19-09-2008 lúc 04:07 PM. Lý do: Khung code |
![]() |
![]() |
|
|