THIẾT KẾ MẠCH ĐỒNG HỒ THỜI GIAN THỰC

Một phần của tài liệu ĐỒ án môn học LỊCH vạn NIÊN điều KHIỂN từ XA (Trang 39 - 51)

2.1.Sơ đồ khối. KHỐI CPU 2 KHỐI NGUỒN

KHỐI DS1307 KHỐI HIỂN

THỊ KHỐI GHI

DỊCH

KHỐI HIỆU CHỈNH

2.1.Sơ đồ nguyên lý và nguyên lý hoạt động.

2.3.Nguyên lý hoạt động.

Khi hệ thống được cấp nguồn chip AT89C51 (CPU_2) bắt đầu đọc thời gian thực RTC. Khi thời gian đã được đọc, CPU_2 tiến hành xử lý thời gian vừa đọc và hiển thị ra led 7 thanh. Nếu không trùng thì với thời giam thực thì t tiến hành chỉnh cho đúng với thời gian thực. Khi thực hiện xong quá trình xử lý kết quả, CPU_2 xuất dữ liệu ra led 7 đoạn qua IC 74HC595.

IC 74HC595 là IC dữ liệu vào nối tiếp ra song song, dữ liệu được đưa vào chân DS của IC cùng với sự tác động sườn dương vài chân SH của IC (từ thấp lên cao) và mỗi lần được lưu vào thanh ghi nhờ chân ST của IC với tích cực ở dương( từ thấp lên cao) .Sau đó CPU_2 quay về thực hiện quá trình như ban đầu. Trong trường hợp CPU_2 nhận được tín hiệu từ nút bấm, CPU_2 tạm ngưng hoạt động tất cả các chương trình để phục vụ

chương trình ngắt để hiệu chỉnh thời gian, ngày tháng năm... Đồng thời ghi vào DS1307 và khi hết quá trình hiệu chỉnh thì CPU_2 hoát động bình thường.

2.6.Chương trình đồng hồ thời gian thực.

#define clk1 P2_0_bit #define lat1 P2_2_bit #define sdo1 P2_1_bit #define clk2 P2_3_bit #define lat2 P2_5_bit #define sdo2 P2_4_bit // CAU HINH GIAO TIEP I2C sbit Soft_I2C_Scl at P1_6_bit; sbit Soft_I2C_Sda at P1_5_bit; //sbit Soft_I2C_Scl at P2_6_bit; //sbit Soft_I2C_Sda at P2_7_bit; //KHAI BAO BIEN TOAN CUC

char seconds, minutes, hours, ampm, day, date, month, year, pm, pr, flag, oldpm, count, mode, j; signed char i;

char

seven_seg_code[]={0X3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F,0XBF,0X86, 0XDB,0XCF,0XE6,0XED,0XFD,0X87,0XFF,0XEF,0x37,0X39, 0XB7, 0XB9};

char dat[13]; //CHUA DU LIEU CUA TUNG LED char out[13];

//HAM DOC DS1307

char DS1307_Read_Byte(char addr){ // ADDR LA DIA CHI THANH GHI CAN DOC char temp; Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(addr); Soft_I2C_Start(); Soft_I2C_Write(0xD1); temp=Soft_I2C_Read(0); Soft_I2C_Stop();

return temp; //HAM TRA VE NOI DUNG CUA THANH GHI }

//HAM GHI DS1307

void DS1307_Write_Byte(char addr, char dat){ // ADDR LA DIA CHI THANH GHI CAN DOC, DATA LA DU LIEU CAN GHI

Soft_I2C_Start(); Soft_I2C_Write(0xD0); Soft_I2C_Write(addr); Soft_I2C_Write(dat); Soft_I2C_Stop();

}

// HAM DOC THONG TIN DS1307 void RTC_Read(){ seconds = DS1307_Read_Byte(0x00); minutes = DS1307_Read_Byte(0x01); hours = DS1307_Read_Byte(0x02); ampm = hours&0x40; day = DS1307_Read_Byte(0x03); day = day&0x07; date = DS1307_Read_Byte(0x04); month = DS1307_Read_Byte(0x05); year = DS1307_Read_Byte(0x06); //XU LY HIEN THI

if(day==1) {dat[1]=20; dat[0]=21; } else{ dat[0]=0; dat[1]=day; } dat[3]=date&0x0F; dat[2]=(date & 0x30) >> 4; dat[5]=month & 0x0F; dat[4]=(month & 0x10) >> 4; dat[7]=(year & 0x0F);

dat[6]= (year & 0xF0) >> 4; dat[9]= minutes & 0x0F; dat[8]= (minutes & 0x70) >> 4; if(ampm){

dat[11]= hours & 0x0F; dat[10]= (hours & 0x10) >> 4; pm = hours&0x20;

}

if(ampm==0){

dat[11]= hours & 0x0F; dat[10]= (hours & 0x30) >> 4; }

//CHUYEN DOI BCD SANG DEC CO CHON LOC

seconds = ((seconds & 0x70) >> 4)*10 + (seconds & 0x0F); //LAY 3 BIT CAO 4BIT THAP

minutes = ((minutes & 0x70) >> 4)*10 + (minutes & 0x0F); //LAY 3 BIT CAO 4BIT THAP

if(ampm){

hours =((hours & 0x10) >> 4)*10+ (hours & 0x0F); //LAY 1 BIT CAO 4BIT THAP

}

if(ampm==0) {

hours = ((hours & 0x30) >> 4)*10 + (hours & 0x0F); //LAY 2 BIT CAO 4BIT THAP

if(hours>=12) pm =0x20; }

year = ((year & 0xF0) >> 4)*10 + (year & 0x0F); //LAY 3 BIT CAO 4BIT THAP date = ((date & 0x30) >> 4)*10 + (date & 0x0F); //LAY 3 BIT CAO 4BIT THAP month = ((month & 0x10) >> 4)*10 + (month & 0x0F); //LAY 3 BIT CAO 4BIT THAP

}

//HAM GHI DU LIEU VAO 74595 void Ic74595_Write(int dat, char ic){ signed char func_count; //BIEN DEM

if(ic==1){ //CHON GHI VAO IC THU 4 DO RONG 4 BYTE for(func_count=7;func_count>=0;func_count--){

sdo1=(dat>>func_count)&0x01; // L?Y T?NG BIT clk1=1; //TAO XUNG DICH DU LIEU

clk1=0; }

lat1=1; //TAO XUNG CHOT DU LIEU lat1=0;

}

if(ic==2){ // CHON GHI VAO IC THU 2 DO RONG 2 BYTE for(func_count=15;func_count>=0;func_count--){

sdo2=(dat>>func_count)&0x01; // LAY TUNG BIT clk2=1; //TAO XUNG DICH DU LIEU

clk2=0; }

lat2=1; //TAO XUNG CHOT DU LIEU lat2=0;

} }

//HAM DOC PHIM - TRA VE VI TRI PHIM DUOC AN - MUC TAC DONG PHIM LA THAP char Button_Read(){

if(P0_0_bit==0)return 1; if(P0_1_bit==0)return 2;

if(P0_2_bit==0)return 3; return 0;

}

//HAM DOC PHIM VA CHONG DOI char Button_Read_Debounce(){ char temp;

temp=Button_Read();

if(temp==0){ //NEU TEMP =0 THI KO CO PHIM DC NHAN

if(pr==1){ //NEU PR =1 THI TRUOC DO CO PHIM NHAN => CO CANH LEN

pr=0; //DAT LAI TRANG THAI - LAN XET NAY KHONG CO PHIM NHAN => DANG O TRANG THAI CHO

return; } else {

flag=1; //BAO HIEU DANG O TRANG THAI CHO => PR TRUOC DO =0

return; //TRO VE }

}

else{ //CO PHIM DUOC NHAN

delay_ms(20); // CHO 1 KHOANG 50MS DE CHONG DOI temp=Button_Read(); //DOC LAI GIA TRI LAN NUA

if(temp==0) return; //NEU TEMP = 0 THI XUNG DOC DUOC KHI NAY LA DO RUNG PHIM

else{ //NEU TEMP !=0 THI BAT DAU XU LY

pr=1; // BAO HIEU LA PHIM DANG DUOC NHAN, YEU CAU XU LY XONG PH

return temp; //TRA VE DU LIEU DOC DUOC }

} }

//TAO THONG TIN CHO BIET DANG O CHE DO DIEU CHINH NGAY GIO VA DOI TUONG DANG DUOC CHON

void Mode_Maker(){ if(mode==1){ if(day==1){ out[0]+=2; out[1]+=2;

} else{ out[0]+=10; out[1]+=10; } } if(mode==2){ out[2]+=10; out[3]+=10; } if(mode==3){ out[4]+=10; out[5]+=10; } if(mode==4){ out[6]+=10; out[7]+=10; } if(mode==5){ out[10]+=10; out[11]+=10; } if(mode==6) { out[8]+=10; out[9]+=10; } return ; }

//HAM KHOI TAO CAC THIET BI void Init(){

Soft_I2C_Init(); P0=0XFF;

// CAU HINH TIMER 0

GATE0_bit=0; // HOAT DONG BINH THUONG C_T0_bit=0; // DUNG DAO DONG NOI

M00_bit=1; // CHE DO 8 BIT TU DONG NAP LAI M01_bit=0;

ET0_bit=1; EA_bit=1; TR0_bit=1;

//KIEM TRA DS1307 - CHO PHEP DAO DONG

if(Ds1307_Read_Byte(0x00)>>7==1) DS1307_Write_Byte(0x00,0x00); DS1307_Write_Byte(0x07,0x10);

mode=0; }

//HAM XU LY PHIM NHAN void Button_Process(){

char key; //KHAI BAO BIEN CUC BO LUU TRU THONG TIN PHIM

key=Button_Read_Debounce();//DOC PHIM - PHIM NHAN UU TIEN CAC PHIM CO TRI SO THAP

if((pr!=0)&&(flag==1)){ flag=0;

if(key==1){ //CHON CHE DO HIEU CHINH

if(mode==7) mode=0; //TANG MODE XOAY VONG KHI CO PHIM DUOC NHAN mode++;

} if(key==2){

//TANG GIA TRI DOI TUONG LEN 1 DON VI, NEU AN DE THI TU DONG TANG VI FLAG =1

RTC_Read(); //DOC GIAI TRI DOI TUONG TRUOC KHI XU LY flag=1; //CHO PHEP DE PHIM

delay_ms(20); //DELAY DE KHI DE PHIM, GIA TRI TANG KHONG QUA NHANH

switch(mode){ //CHON DOI TUONG XU LY

case 1: //XU LY NGAY TRONG TUAN if(day==7) day=0; // NHU TREN

++day; day=dec2bcd(day); DS1307_Write_Byte(0x03,day); break; case 2: //XU LY NGAY

if(date==31) date=0; //NGAY 1<=DATE<=31

++date; //TANG BIEN DATE VUA DOC DUOC date=dec2bcd(date); //DOI SANG BCD

DS1307_Write_Byte(0x04,date); //GHI VAO DS1307 break;

case 3: //XU LY THANG

if(month==12) month=0; //THANG 1<=MONTH<=12 ++month;

month=dec2bcd(month); //NHU TREN DS1307_Write_Byte(0x05,month);

break;

case 4: //XU LY NAM ++year; //NHU TREN if(year==100) year=0;

year=dec2bcd(year);

DS1307_Write_Byte(0x06,year); break;

case 5: // XU LY GIO

++hours; // TANG BIEN GIO VUA DOC DUOC if(ampm){ // THEO CHE DO 12H

if(hours>=13){ //1<=HOURS<=12 hours=1;

}

if(hours>=12){ // QUA 1 CHU KY THI DOI BUOI if(pm!=0) pm=0;

else pm=0x20; }

hours=dec2bcd(hours); //CHUYEN SANG BCD

oldpm=pm; //LUU BUOI HIEN TAI TRUOC KHI CHUYEN DOI HE DON VI 12=>24 VI O NHO PM SE BI GHE DE

DS1307_Write_Byte(0x02,pm|hours|ampm); //GHI VAO DS1307 VOI GIA TRI GIO, BUOI VA CHE DO GIO

}

else { if(hours==24) hours=0; //THEO CHE DO 24H hours=dec2bcd(hours); // 0<=HOURS<=24

DS1307_Write_Byte(0x02,hours|ampm); //GHI VAO DS1307 VOI GIA TRI GIO VA CHE DO GIO

} break;

case 6: //XU LY PHUT

if(minutes==59) minutes=0; // PHUT 0<=MINUTES<=59 ++minutes; minutes=dec2bcd(minutes); DS1307_Write_Byte(0x01,minutes); //XOA GIAY seconds=0; // GIAY DS1307_Write_Byte(0x00,0); break; } }

if(key==3){ //CHON HE THONG GIO 12<=>24 RTC_Read();

if(ampm){ // DANG O CHE DO 12H oldpm=pm;

if((pm!=0)&&(hours!=12)) hours=hours+12; // NEU LA BUOI CHIEU VA KHAC 12H THI +12 VAO GIO HIEN TAI

if((pm==0)&&(hours==12)) hours=hours-12; // NEU LA BUOI SANG VA DANG LA 12 H (KHUYA) THI GIU NGUYEN

hours=dec2bcd(hours); // DOI GIO SANG BCD

hours=hours&0xBF; //CHO BIT 6 =0, CHON CHE DO 24H DS1307_Write_Byte(0x02,hours);

}

else{ //DANG O CHE DO 24H

if(hours==0) hours=12; //DANG O 0H THI CHUYEN THANH 12H if(hours>12) hours=hours-12; //DANG O BUOI CHIEU THI TRU DI 12H hours=dec2bcd(hours); // DOI GIO SANG BCD

hours=hours|0x40|pm; //CHO BIT 6=1, CHON CHE DO 12H VA KHOI PHUC BIT5(AM/PM)(TRA LAI BUOI TRUOC KHI CHUYEN DOI)

DS1307_Write_Byte(0x02,hours); } Init(); } return; } }

// HAM QUET LED 7 DOAN void Seven_Seg_Scan(){

if(i++>=11)i=0; // MOI LAN GHI DU LIEU 1 CON LED // GHI DU LIEU RA CAC LED

Ic74595_Write(0xFFFF,2);//XOA DU LIEU CHON LED Ic74595_Write(seven_seg_code[out[i]],1);

// GHI DU LIEU CHON LED Ic74595_Write(~(0x0001<<i),2); }

//CHUONG TRINH CHINH void main() {

Init(); while(1){

Button_Process();

Mode_Maker();//DANH DAU MODE O CHE DO NAO RTC_Read(); for(j=0;j<=11;j++){ out[j]=dat[j]; } } }

//TRINH PHUC VU NGAT TIMER 0

void Timer0ISR(void) org 0x000B ilevel 2 { Seven_Seg_Scan();

TH0=-5; }

Một phần của tài liệu ĐỒ án môn học LỊCH vạn NIÊN điều KHIỂN từ XA (Trang 39 - 51)