CHƯƠNG 3. XÂY DỰNG HỆ THỐNG
3.2. Thiết kế phần mềm
Phần mềm cần thực hiện các chức năng chính như sau :
Hiển thị thời gian bình thường: khi khởi tạo, vi điều khiển kiểm tra xem trong IC thời gian thực đã có thời gian hay chưa, nếu chưa có thời gian cài đặt trước đó thì hiển thị giá trị thời gian mặc định mà ta thiết lập sẵn;
còn bình thường đã có thời gian cài đặt trước đó vi điều khiển đọc dữ liệu thời gian từ IC thời gian thực, xử lý và hiển thị kết quả lên màn hình LCD.
Cài đặt thời gian: khi xuất hiện ngắt ngoài 0, vi điều khiển bắt đầu thực hiện cài đặt ngày giờ. Trên LCD, theo lần xuất hiện ngắt ngoài 0 mà lần lượt vị trí con trỏ của nó sẽ nhảy tới giá trị thời gian lần lượt là giờ, phút, giây, ngày, tháng, năm; tùy vào yêu cầu cài đặt mà tăng giảm giá trị thời gian sau đó ghi dữ liệu vào IC thời gian thực; kèm theo một cờ vào thanh ghi ram đầu tiên để nhận biết là đã được cài đặt thời gian.
Chương trình
#include <AT89X51.H>
#include <intrins.h>
// DINH NGHIA 1 SO CONG
#define sda P1_1
#define scl P1_0
#define rs P3_7
#define rw P3_6
#define en P3_5
#define menu P3_2
#define tang P3_1
#define giam P3_0
#define congLCD P2
#define D7 P2_7
unsigned char *rtc[]={"0","1","2","3","4","5","6","7","8","9"}
unsigned char *day[]={"CNhat","Thu 2","Thu 3","Thu 4","Thu 5","Thu 6","Thu 7"};
unsigned char giatrikhoitao_rtc[8];
/******************************************************/
// CAC CHUONG TRINH CON GIAO TIEP VOI LCD //
void busy() { D7=1;
rs=0; rw=1;
while(D7!=0) {en=0; en=1;
}
Đồ án Hệ Thống Nhúng Trang
Nghiệp }
void ghilenhLCD(unsigned char x) { busy();
congLCD=x; // gia tri x
rs=0; // chon thanh ghi lenh rw=0; // ghi len lcd
en=1; // cho phep muc cao en=0; //xung cao xuong thap }
void khoitaoLCD(void)
{ ghilenhLCD(0X38); // hai dong va ma tran 5x7 ghilenhLCD(0X0C); //bat man hinh , bat con tro ghilenhLCD(0X01); //xoa man hinh
ghilenhLCD(0X06);//dich hien thi sang phai(tang con tro sang phai) }
void ghi_kytu(unsigned char value) { busy();
congLCD=value;
rs=1; rw=0;
en=1; en=0; }
void ghi_chuoi(unsigned char *string) { unsigned char i;
for(i=0;string[i]!='\0';i++) ghi_kytu(string[i]); } void ghiso(unsigned char a) { unsigned char i;
i=a/10; ghi_chuoi(rtc[i]);
i=a%10; ghi_chuoi(rtc[i]); } void hienthi_dulieu_rtc(unsigned char x) { unsigned char temp;
temp = x/16; //chuyen luon so sang decima ghi_chuoi(rtc[temp]);
temp = x%16;
ghi_chuoi(rtc[temp]); }
/***********************************************************
// CAC CHUONG TRINH CON GIAO TIEP VOI RTC
Nghiệp
// ca 2 dk start va stop dc tao ra boi thiet bi chu
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; }
void stop_rtc(void) //dk stop: 1 su cdoi trang thai tu muc thap len cao tren duong sda trong khi duong slc dang o muc cao { sda=0; scl=1;
_nop_();_nop_();
sda=1; }
void gui_rtc(unsigned char x) { unsigned char i;
for(i=0;i<8;i++){
sda=(x&0x80)? 1:0; //dua bit du lieu ra chan SDA
scl=1;
_nop_();_nop_();
scl=0;
x<<=1; //bit co trong so lon hon dc truyen truoc }
scl=1;//nhan bit ACK tu SLAVER _nop_();_nop_();
scl=0; }
unsigned char nhan_rtc(void) { unsigned char Data,i;
for(i=0;i<8;i++) // nhan vao 8 bit { scl=1;
Data<<=1;
Data=Data|sda;
scl=0; } sda=1;
scl=1; //master nhan/gui bit du lieu(sda) khi scl o muc cao _nop_();
scl=0;
_nop_(); //du lieu(sda) thay doi khi scl muc thap return Data; //tra gia tri cho ham
}
unsigned char docdulieu(unsigned char diachi) { unsigned char Data;
Đồ án Hệ Thống Nhúng Trang
Nghiệp
start_rtc();
gui_rtc(0xd0);
gui_rtc(diachi); //bat dau doc du lieu tu thanh ghi co dia chi 0x00
start_rtc();
gui_rtc(0xd1);
Data=nhan_rtc();
stop_rtc();//Stop I2C return Data; }
void ghidulieu(void) { unsigned char t;
for(t=0;t<9;t++){start_rtc();
gui_rtc(0xd0);
gui_rtc(t);
gui_rtc(giatrikhoitao_rtc[t]);
stop_rtc();}
} /
**************************************************************
*/
// HIEN THI GIO , NGAY THANG TREN LCD //
void hienthi_rtc(void)
{ ghilenhLCD(0xca);// ep con tro den vi tri thu 11 dong thu 2 hienthi_dulieu_rtc(docdulieu(0)); //hien thi giay
ghilenhLCD(0xc7); // ep con tro den vi tri thu 8 dong thu 2 hienthi_dulieu_rtc(docdulieu(1)); // hien thi phut
ghi_kytu(':');
ghilenhLCD(0xc4); // ep con tro den vi tri thu 5 dong thu 2 hienthi_dulieu_rtc(docdulieu(2)); //hien thi gio
ghi_kytu(':');
ghilenhLCD(0x80); //ep con tro den dau dong thu 1
ghi_chuoi(day[docdulieu(3)-1]); ghi_kytu(','); //hien thi thu ghilenhLCD(0x86); //ep con tro den vi tri thu 7 dong thu 1
hienthi_dulieu_rtc(docdulieu(4));//hien thi ngay
ghi_kytu('-'); hienthi_dulieu_rtc(docdulieu(5));//hien thi thang ghi_chuoi("-20"); hienthi_dulieu_rtc(docdulieu(6)); //nam }
/
**************************************************************/
// TAO THOI GIAN TRE DUNG TIMER 0 //
void delay(long time)//tre time ms { while(time--){
Nghiệp
TMOD=0x01;// che do 16 bit khong tu nap lai TH0=0xFC;TL0=0x67;
//6*(65536- FC67+1)*(1/12000)=1000us =1ms TR0=1;
while(TF0!=1){};
TF0=0; TR0=0;}
} /
**************************************************************
*/
// CHUONG TRINH CON THUC HIEN VIEC CAI DAT NGAY GIO, THANG NAM //
unsigned char bcd_dec(unsigned char bcd)
{return((bcd/16)*10+(bcd%16)); //vd bcd=66 -> dec =42}
unsigned char dec_bcd(unsigned char dec) {return((dec/10)*16+(dec%10)); }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
void caidat_rtc()
{ unsigned char giay,phut,gio,thu,ngay,thang,nam;
giay = bcd_dec(docdulieu(0)&0x7f); // de bit 7 (bit clock halt) cua thanh ghi giay = 0 => ko bi treo) phut = bcd_dec(docdulieu(1));
gio = bcd_dec(docdulieu(2)& 0x3f); //che do 24 h thu = bcd_dec(docdulieu(3));
ngay = bcd_dec(docdulieu(4));
thang = bcd_dec(docdulieu(5));
nam = bcd_dec(docdulieu(6));
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// CAI DAT GIO ghilenhLCD(1);
ghi_chuoi("CHINH GIO:");
ghilenhLCD(0x0e);
ghilenhLCD(0xc4);
ghiso(gio); ghi_kytu(':');ghiso(phut);ghi_kytu(':'); ghiso(giay);
/////////////////////////////////////////
ghilenhLCD(0xC5);
while(menu==0);
caidatgio:while(tang!=0 && giam!=0 && menu!=0);
if(tang==0) {gio++;
if(gio==24) gio=0;
ghilenhLCD(0xC4);
ghiso(gio);
Đồ án Hệ Thống Nhúng Trang
Nghiệp
ghilenhLCD(0xC5);
delay(300);
goto caidatgio; } if(giam==0) {gio--;
if(gio==0xff)gio=23;
ghilenhLCD(0xC4);
ghiso(gio);
ghilenhLCD(0xC5);
delay(300);
goto caidatgio;}
///////////////////////////////////////////////////
while(menu==0);
ghilenhLCD(0xC8);
caidatphut: while(tang!=0 && giam!=0 && menu!=0);
if(tang==0) {phut++;
if(phut==60) phut=0;
ghilenhLCD(0xC7);
ghiso(phut);
ghilenhLCD(0x10);
delay(300);
goto caidatphut;}
if(giam==0){phut--;
if(phut==0xff)phut=59;
ghilenhLCD(0xC7);
ghiso(phut);
ghilenhLCD(0x10);
delay(300);
goto caidatphut; } ///////////////////////////////////////////////////
while(menu==0);
ghilenhLCD(0xCB);
caidatgiay: while(tang!=0 && giam!=0 && menu!=0);
if(tang==0) {giay++;
if(giay==60) giay=0;
ghilenhLCD(0xCA);
ghiso(giay);
ghilenhLCD(0xCB);
delay(100);
goto caidatgiay; } if(giam==0) {giay--;
if(giay==0xff) giay=59;
ghilenhLCD(0xCA);
ghiso(giay);
Nghiệp
ghilenhLCD(0xCB);
delay(100);
goto caidatgiay; }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// CAI DAT NGAY - THANG - NAM while(menu==0);
ghilenhLCD(1);
ghi_chuoi("CHINH NGAY :");
ghilenhLCD(0xc4);
ghiso(ngay); ghi_kytu('-'); ghiso(thang);
ghi_chuoi("-20"); ghiso(nam);
///////////////////////////////////////////////////
ghilenhLCD(0xc5);
caidatngay:while (tang!=0 && giam!=0 && menu!=0);
if(tang==0){ ngay++;
if(ngay==32) ngay=1;
ghilenhLCD(0xC4);
ghiso(ngay);
ghilenhLCD(0x10);
delay(300);
goto caidatngay; } if(giam==0) {ngay--;
if(ngay==0) ngay=31;
ghilenhLCD(0xC4);
ghiso(ngay);
ghilenhLCD(0x10);
delay(300);
goto caidatngay; } ////////////////////////////////////////////////////
while(menu==0);
ghilenhLCD(0xC8);
caidatthang:while(tang!=0 && giam!=0 && menu!=0);
if(tang==0) { thang++;
if(thang==13) thang=1;
ghilenhLCD(0xC7);
ghiso(thang);
ghilenhLCD(0x10);
delay(300);
goto caidatthang; } if(giam==0){ thang--;
if(thang==0) thang=12;
ghilenhLCD(0xC7);
ghiso(thang);
Đồ án Hệ Thống Nhúng Trang
Nghiệp
ghilenhLCD(0x10);
delay(300);
goto caidatthang; } ////////////////////////////////////////////////////////
while(menu==0);
ghilenhLCD(0xCD);
caidatnam:while(tang!=0 && giam!=0 && menu!=0);
if(tang==0)
{ nam++;
if(nam==100) nam=0;
ghilenhLCD(0xCC);
ghiso(nam);
ghilenhLCD(0xCE);
delay(300);
goto caidatnam; } if(giam==0)
{ nam--;
if(nam==0) nam=99;
ghilenhLCD(0xCC);
ghiso(nam);
ghilenhLCD(0xCE);
delay(300);
goto caidatnam; }
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// CAI DAT THU while(menu==0);
ghilenhLCD(1);
ghi_chuoi("CHINH THU :");
ghilenhLCD(0xc4);
ghi_chuoi(day[thu-1]);
caidatthu:while(tang!=0 && giam!=0 && menu!=0);
if(tang==0) { thu++;
if(thu==8) thu=1;
ghilenhLCD(0xC4);
ghi_chuoi(day[thu-1]);
delay(300);
goto caidatthu; } if(giam==0)
{ thu--;
if(thu==0) thu=7;
ghilenhLCD(0xC4);
ghi_chuoi(day[thu-1]);
Nghiệp
delay(300);
goto caidatthu; }
while(menu==0); // ket thuc cai dat
ghilenhLCD(1); //thi thuc hien xoa man hinh ghilenhLCD(0x0C); //bat hien thi tat con tro //CAP NHAT THOI GIAN VAO RTC
giatrikhoitao_rtc[0] = dec_bcd(giay);
giatrikhoitao_rtc[1] = dec_bcd(phut);
giatrikhoitao_rtc[2] = dec_bcd(gio);
giatrikhoitao_rtc[3] = dec_bcd(thu);
giatrikhoitao_rtc[4] = dec_bcd(ngay);
giatrikhoitao_rtc[5] = dec_bcd(thang);
giatrikhoitao_rtc[6] = dec_bcd(nam);
giatrikhoitao_rtc[7] = 0x00;
giatrikhoitao_rtc[8] = 'c'; //ghi vao vi tri dau tien cua ram1 co flag ghidulieu();
ghilenhLCD(1);
}
/**********************************************************/
// CHUONG TRINH CON KIEM TRA DU LIEU TU DS1307 KHI KHOI DONG //
void kiemtra_rtc(void) {
unsigned char temp;
start_rtc(); gui_rtc(0xd0);
gui_rtc(0x08); //doc du lieu tu vi tri ram dau tien start_rtc(); gui_rtc(0xd1);
temp=nhan_rtc() ; //con tro dang tro toi dia chi 0x08 chua du lieu flag (co?`) xem da cai dat hay chua stop_rtc();
if(temp!='c')// neu gia tri thu 8 nhan duoc khac voi co 'c' cap nhat khi cai dat gio thi tuc la lan dau duoc khoi tao, ta se chon gia tri ghi vao ban dau theo y minh { giatrikhoitao_rtc[0]=0x50;
giatrikhoitao_rtc[1]=0x59;
giatrikhoitao_rtc[2]=0x09;
giatrikhoitao_rtc[3]=0x04;
giatrikhoitao_rtc[4]=0x04;
giatrikhoitao_rtc[5]=0x05;
giatrikhoitao_rtc[6]=0x11;
Đồ án Hệ Thống Nhúng Trang
Nghiệp
giatrikhoitao_rtc[7]=0x00;
giatrikhoitao_rtc[8]='c';
ghidulieu();}
}
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
void doccacdulieu(void){ int i;
for(i=0;i<=6;i++){docdulieu(i);} } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
// CHUONG TRINH CHINH //
bit co=0;
void caidatco() interrupt 0 //ngat ngoai 0 thi co =1 {co=1; }
void main()
{ khoitaoLCD();
ghilenhLCD(1);
ghilenhLCD(0x80);
ghi_chuoi("GVHD: THAY HUY");
ghilenhLCD(0xc0);
ghi_chuoi("SV:HOP-HIEN-HONG");
ghilenhLCD(1);
kiemtra_rtc();
IE=0x81;// EA_ET2.ES.ET1.EX1.ET0.EX0 cho phep ngat ngoai 0
doccacdulieu();
while(1)
{ doccacdulieu();
hienthi_rtc();
if(co==1) //co =1 ngat 0 xay ra => cai dat gio { caidat_rtc();
co=0; } }
}
Nghiệp