![]() |
|
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 |
|
|
|
| Ðiều Chỉnh | |
| Xếp Bài | |
|
|