Code chương trình

Một phần của tài liệu MẠCH ĐIỀU KHIỂN BẬT TẮT ĐIỀU HÒA (Trang 25 - 35)

Code cho 89C51 được viết và biên dịch bằng KeilC51.

#include <REGX51.H> #include <LCD.h> #include <intrins.h>

#define WR P2_0 // Dinh nghia cac chan #define INTR P2_1 #define RD P2_2 #define ADCvalue P0 #define k_mode P1_0 #define k_time P1_1 #define k_giam P1_2 #define k_tang P1_3 #define k_on_off P1_4 #define out P1_5 #define scl P2_3 #define sda P2_4

unsigned char mode,nhietdo,tmin,tmax; // Khai bao cac bien dung trong ct unsigned char cnt=0; bit bat,anphim,update; bit nhapnhay=1; bit kt=1; bit controphutgio=0; bit doigio=0;

unsigned char *dec[]={"0","1","2","3","4","5","6","7","8","9"}; unsigned char giatri_rtc[13]; // Mang luu 13 gia tri can ghi vao rtc

// Bao gom 7 gia tri thoi gian (giay, phut,...thang, nam); gia tri thanh ghi dieu khien; // gia tri o ram dau tien de luu trang thai co cai day (Flag);

// 4 o ram tiep theo de luu phut+gio bat, phut+gio tat. void delay_ms(unsigned int ms) // Ham tao tre ms {

unsigned int i,j; for(i=0;i<ms;i++) for(j=0;j<125;j++) {} }

void hienthisoBCD(unsigned char x) {

unsigned char temp; temp = x/16;

stringwrt(dec[temp]); }

void hienthi2digit(unsigned char x) { charwrt(x/10+48); charwrt(x%10+48); } void hienthi3digit(unsigned char x)

{ unsigned char t; unsigned char t; if(x<10) charwrt(x+48); else if(x<100) { charwrt(x/10+48); charwrt(x%10+48); } else { t=x/10; charwrt(t/10+48); charwrt(t%10+48); charwrt(x%10+48); } }

unsigned char bcd_dec(unsigned char bcd) // Chuyen tu bcd sang decima { return((bcd/16)*10+(bcd%16)); }

unsigned char dec_bcd(unsigned char dec) // Chuyen tu decima sang bcd { return((dec/10)*16+(dec%10)); }

void start_rtc(void) //dk start: 1 su cdoi tthai tu cao xuong thap tren duong sda trong khi

{ //duong scl dang o muc cao

scl=1; sda=1; _nop_(); _nop_(); sda=0;

scl=0; //du lieu(sda) thay doi khi scl muc thap }

void stop_rtc(void) // dk stop: 1 su cdoi trang thai tu muc thap len cao tren duong sda trong khi duong

{ // scl dang o muc cao

scl=1; sda=0; _nop_(); _nop_(); sda=1; }

void sendbyte_rtc(unsigned char x) {

for(i=0;i<8;i++) {

sda=(x&0x80)? 1:0; //dua bit du lieu ra chan SDA

scl=1; //lay mau du lieu khi scl o muc cao

_nop_(); _nop_();

scl=0; //du lieu(sda) thay doi khi scl muc thap x<<=1; //bit co trong so lon hon dc truyen truoc }

scl=1; //nhan bit ACK tu SLAVER bao hieu ket thuc mot byte du lieu _nop_();

_nop_(); scl=0; }

unsigned char readbyte_rtc(void) {

unsigned char value,i;

for(i=0;i<8;i++) // nhan vao 8 bit

{ scl=1; value<<=1; value=value|sda; scl=0; }

sda=1; // trong qua trinh doc mot chuoi byte tu slaver master gui bit ACK=> sda=1 scl=1; // master nhan/gui bit du lieu(sda) khi scl o muc cao

_nop_(); _nop_(); scl=0;

return value; //tra gia tri cho ham }

char docdulieu_rtc(unsigned char diachi) {

unsigned char value;

start_rtc(); // Start I2C

sendbyte_rtc(0xd0); // 0xd0 la dia chi cua ds107 va che do ghi du lieu sendbyte_rtc(diachi); // gui dia chi con tro

start_rtc();

sendbyte_rtc(0xd1); //0xd1 la dia chi cua ds107 va che do doc du lieu value=readbyte_rtc();

stop_rtc(); // Stop I2C return value;

}

unsigned char i;

for(i=x;i<=y;i++) // Ghi du lieu vao RTC bat dau tu thanh ghi (va ram) x den y { start_rtc(); sendbyte_rtc(0xd0); sendbyte_rtc(i); sendbyte_rtc(giatri_rtc[i]); stop_rtc(); } } void doccacdulieu_rtc(void) { unsigned char i; for(i=0;i<=12;i++) giatri_rtc[i]=docdulieu_rtc(i); }

void readkb() // Ham phat hien phim bam {

anphim=0;

if(k_mode==0) // Neu phim 1 duoc an (phim chon mode) {

delay_ms(100); // Ham delay chong rung phim while(k_mode==0); // Cho den khi nut duoc tha ra

mode++; // Tang mode len 1 de chuyen sang mode ke tiep if(mode==4) { caidat_rtc(9,10); }

if(mode==5) { caidat_rtc(11,12);

giatri_rtc[1]=bcd_dec(docdulieu_rtc(1));

giatri_rtc[2]=bcd_dec(docdulieu_rtc(2)&0x3f); } if(mode==6) { if(doigio==1) { giatri_rtc[0]=0;

giatri_rtc[1] = dec_bcd(giatri_rtc[1]); giatri_rtc[2] = dec_bcd(giatri_rtc[2]); caidat_rtc(0,2); doigio=0; } mode=0; } anphim=1; controphutgio=0; } if(k_time==0) { delay_ms(100); while(k_time==0); if(mode==3||mode==4||mode==5)

{ controphutgio=~controphutgio; anphim=1; } }

if(k_giam==0) // Neu phim 2 duoc an (phim giam) {

delay_ms(100); // Chong rung phim (cho phim duoc an trong 1 luc) if(k_giam==0)

{

if(mode!=0) anphim=1;

if(mode==1) { if(tmin>0) tmin--; } // Giam nguong tuy theo mode if(mode==2) { if(tmax>tmin+1) tmax--; }

if(mode==3) { if(controphutgio==0) { giatri_rtc[9]--; if(giatri_rtc[9]==0xff) giatri_rtc[9]=59; }

if(controphutgio==1) { giatri_rtc[10]--; if(giatri_rtc[10]==0xff) giatri_rtc[10]=23; } }

if(mode==4) { if(controphutgio==0) { giatri_rtc[11]--; if(giatri_rtc[11]==0xff) giatri_rtc[11]=59; }

if(controphutgio==1) { giatri_rtc[12]--; if(giatri_rtc[12]==0xff) giatri_rtc[12]=23; } }

if(mode==5) { if(controphutgio==0) { giatri_rtc[1]--; if(giatri_rtc[1]==0xff) giatri_rtc[1]=59; }

if(controphutgio==1) { giatri_rtc[2]--; if(giatri_rtc[2]==0xff)

giatri_rtc[2]=23; }

doigio=1; } }

}

if(k_tang==0) // Neu phim 3 duoc an (phim tang) {

delay_ms(100); // Cho phim duoc an trong 1 luc if(k_tang==0)

{

if(mode!=0) anphim=1;

if(mode==1) { if(tmin<tmax-1) tmin++; } // Tang nguong tuy theo mode if(mode==2) { if(tmax<150) tmax++; }

if(mode==3) { if(controphutgio==0) { giatri_rtc[9]++; if(giatri_rtc[9]==60) giatri_rtc[9]=0; }

if(controphutgio==1) { giatri_rtc[10]++; if(giatri_rtc[10]==24) giatri_rtc[10]=0; } }

if(mode==4) { if(controphutgio==0) { giatri_rtc[11]++; if(giatri_rtc[11]==60) giatri_rtc[11]=0; }

if(controphutgio==1) { giatri_rtc[12]++; if(giatri_rtc[12]==24) giatri_rtc[12]=0; } }

if(mode==5) { if(controphutgio==0) { giatri_rtc[1]++; if(giatri_rtc[1]==60) giatri_rtc[1]=0; }

if(controphutgio==1) { giatri_rtc[2]++; if(giatri_rtc[2]==24) giatri_rtc[2]=0; }

}} }

if(k_on_off==0) // Neu phim 4 duoc an (phim bat/tat) {

delay_ms(100);

while(k_on_off==0); // Cho den khi nut duoc tha ra if (nhietdo>=tmin&&nhietdo<=tmax)

{ bat=~bat; bat=~bat;

if(bat==0) out=0; else out=1; kt=1;

}else else

{ bat=~bat; bat=~bat;

if(bat==0) out=0; else out=1; kt=0; } } } void check_rtc(void) {

unsigned char temp; start_rtc();

sendbyte_rtc(0xd0);

sendbyte_rtc(0x08); //doc du lieu tu thanh ghi co dia chi 0x08 (vi tri ram dau tien) start_rtc();

sendbyte_rtc(0xd1);

temp=readbyte_rtc();//con tro dang tro toi dia chi 0x08 chua du lieu Flag xem da cai dat hay chua

stop_rtc();

//if(temp!='c') // neu gia tri Flag khac voi "c" tuc la lan dau khoi tao RTC, chua cai dat gio

// ta cai dat gio vao RTC theo y muon giatri_rtc[0]=0x00; giatri_rtc[1]=0x00;

giatri_rtc[2]=0x00; giatri_rtc[3]=0x03; giatri_rtc[4]=0x01; giatri_rtc[5]=0x01;

giatri_rtc[6]=0x13; // Cai mac dinh ban dau

00:00:00 Thu 3, 1/1/xx13

giatri_rtc[7]=0x00; giatri_rtc[8]='c'; // Thanh ghi dk khong dung, ghi co cai dat vao o ram dau tien

giatri_rtc[9]=0; giatri_rtc[10]=0; // Ghi thoi gian hen tu dong bat 00:00 giatri_rtc[11]=0; giatri_rtc[12]=0; // Ghi thoi gian hen tu dong tat 00:00 caidat_rtc(0,12);

}

void hienthithoigian(void) // Ham hien thi thoi gian Gio:Phut {

cmdwrt(0x0C); setcursor(0,0);

stringwrt("THOI GIAN: ");

hienthisoBCD(docdulieu_rtc(2)); // hien thi gio, du lieu doc ra la ma bcd nhung ham hienthisoBCD da chuyen sang thap phan

nhapnhay? stringwrt(":"):stringwrt(" "); nhapnhay=~nhapnhay;

hienthisoBCD(docdulieu_rtc(1)); // hien thi phut }

void caithoigian() {

setcursor(0,0);

stringwrt("CHINH THOI GIAN:"); setcursor(0,1); stringwrt(" "); setcursor(4,1); hienthi2digit(giatri_rtc[2]); stringwrt(":"); hienthi2digit(giatri_rtc[1]); stringwrt(" "); controphutgio? setcursor(5,1):setcursor(8,1);

// Neu con tro =0 thi chi vi tri phut, =1 thi chi vi tri gio cmdwrt(0x0E); // Nhap nhay tai vi tri con tro phut hoac gio delay_ms(50);

}

void hengiobat() {

setcursor(0,0);

stringwrt("HEN GIO BAT: "); setcursor(0,1); stringwrt(" "); setcursor(4,1); hienthi2digit(giatri_rtc[10]); stringwrt(":"); hienthi2digit(giatri_rtc[9]); stringwrt(" "); controphutgio? setcursor(5,1):setcursor(8,1);

// Neu con tro =0 thi chi vi tri phut, =1 thi chi vi tri gio cmdwrt(0x0E); // Nhap nhay tai vi tri con tro phut hoac gio delay_ms(50);

void hengiotat() {

setcursor(0,0);

stringwrt("HEN GIO TAT: "); setcursor(0,1); stringwrt(" "); setcursor(4,1); hienthi2digit(giatri_rtc[12]); stringwrt(":"); hienthi2digit(giatri_rtc[11]); stringwrt(" "); controphutgio? setcursor(5,1):setcursor(8,1);

// Neu con tro =0 thi chi vi tri phut, =1 thi chi vi tri gio cmdwrt(0x0E); // Nhap nhay tai vi tri con tro phut hoac gio delay_ms(50);

}

void readADC() // Ham doc gia tri nhiet do tu ADC {

WR=0; // Bat dau chuyen doi gia tri tu ADC

WR=1;while(!INTR); while(!INTR);

RD=1; // Doc du lieu da duoc chuyen doi

RD=0;

nhietdo=ADCvalue; }

void ktnhietdo() {

if(nhietdo<tmin) { out=0; bat=0; } if(nhietdo>tmax) { out=1; bat=1; } }

void check() // Ham kiem tra nguong {

unsigned int timeon,timeoff,curtime; unsigned char giay;

giay=bcd_dec(docdulieu_rtc(0)); if(giay==0) { timeon=giatri_rtc[9]+giatri_rtc[10]*60; timeoff=giatri_rtc[11]+giatri_rtc[12]*60; if(timeon!=timeoff) { curtime=bcd_dec(docdulieu_rtc(1))+bcd_dec(docdulieu_rtc(2))*60; if (curtime==timeon) { out=1; bat=1; kt=1; }

}} } if(kt==1) ktnhietdo(); } void hienthinhietdo() { setcursor(0,1); stringwrt("NHIET DO: "); hienthi3digit(nhietdo); stringwrt("*C"); stringwrt(" "); }

void settmin() // Ham cai dat nguong nhiet do min {

setcursor(0,0);

stringwrt("-TU DONG TAT- "); setcursor(0,1); stringwrt("NEU DUOI: "); hienthi3digit(tmin); stringwrt("*C"); stringwrt(" "); delay_ms(50); }

void settmax() // Ham cai dat nguong nhiet do max {

setcursor(0,0);

stringwrt("-TU DONG BAT- "); setcursor(0,1); stringwrt("NEU TREN: "); hienthi3digit(tmax); stringwrt("*C"); stringwrt(" "); delay_ms(50); } void hienthi() { hienthithoigian(); hienthinhietdo(); }

void selectmode() // Ham lua chon mode hien thi {

case 0: hienthi(); break; case 1: settmin(); break; case 2: settmax(); break; case 3: hengiobat(); break; case 4: hengiotat(); break; case 5: caithoigian(); break; }

}

void ngat_T0() interrupt 1 // Chuong trinh con phuc vu ngat Timer0 {

TR0=0;cnt++; cnt++;

if(cnt==10) // khi cnt=10 thi da dem duoc 10 lan tuong ung voi 0.5s {

readADC(); // Doc nhiet do update=1;

check(); // Kiem tra nguong cnt=0; } else update=0; TH0=0x3c; TL0=0xb0; TR0=1; }

void main (void) {

out=0; // Chan out o che do ra

mode = 0; // Khoi tao ban dau voi tmin=20*C va tmax=27*C tmin = 20; tmax = 27; // va chon mode hien thi dau tien readADC(); //Lay mau nhiet do dau tien

check_rtc();

doccacdulieu_rtc(); startlcd();

EA=1; ET0=1; // Cho phep ngat Timer0 TMOD=0x01; // Timer0 che do 16bit

TH0=0x3c; TL0=0xb0; // Nap gia tri ban dau cho Timer0=15536 (3CB0h) TR0=1; // Khoi dong Timer0

while(1) // Vong lap vo han {

selectmode();

do { if(update==1&&mode==0) { hienthi(); update=0; } // Hien thi nhiet do neu dang o Mode hien thi

readkb(); } // va lien tuc kiem tra phim bam while(anphim==0);

} } }

Một phần của tài liệu MẠCH ĐIỀU KHIỂN BẬT TẮT ĐIỀU HÒA (Trang 25 - 35)