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; }