CHƯƠNG II. THIẾT KẾ VÀ THI CÔNG MẠCH

Một phần của tài liệu THIẾT KẾ, CHẾ TẠO LỊCH VẠN NIÊN ĐIỆN TỬ (Trang 26 - 50)

KHỐI CẢM BIẾN NHIỆT LM35

KHỐI CHUYỂN ĐỔI TƯƠNG TỰ

SANG SỐ

KHỐI CPU 1 KHỐI HIỂN THỊ KHỐI NGUỒN

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

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

Cảm biến LM35 biến đổi nhiệt độ môi trường thành giá trị điện áp xuất ra tại chân 2 đưa vào ADC. Thao tác chuyển đổi nhiệt độ đo được thành điện áp cấp vào chân IN của ADC, từ điện áp cấp vào ADC lại được chuyển qua các chân BD để truyền sang cổng P2 của Vi diều khiển dưới dạng các bít 0 và 1

Điều khiển các chân WR, RD, INT0 của vi mạch biến đổi tương tự – số ADC0804 để ADC biến đổi điện áp được lấy từ chân 2 của IC cảm biến nhiệt độ LM35:

- WR=0: cho phép ADC biến đổi. - WR=1:không cho phép ADC biến đổi.

- Chân RD và INT0 luôn = 0: luôn cho phép ADC xuất ra giá trị ra cổng và VDK luôn nhận được.

Đợi sau khi đã biến đổi xong thực hiện đọc dữ liệu từ ADC vào Port 2 của vi điều khiển, gán giá trị đọc được cho biến x. Qua chương trình chuyển đổi lại chuyển đổi ngược lại từ dạng bít nhận được sang dạng điện áp và rồi chuyển từ điện áp sang nhiệt độ rồi được hiển thị trên Led 7 thanh.

1.4.Sơ đồ board.

1.5.Lưu đồ thuật toán

Start

Khởi tạo giá trị

Truy nhập ADC Kích hoạt ADC Chờ quá trình biến đổi intr = 0 Đọc dữ liệu từ ADC Hiển thị END Gán dữ liệu vào x

Hiển thị

Thiết lập giá trị lấy mẫu Gán X =P2 V =X*2,5/250 K =V*100 CH =k/10 DV =k%10 CH = LED 1 DV =LED 2 RET

1.6.Chương trình nhiệt độ. #include<stdio.h> #include<reg52.h> #include<math.h> sbit INTR_ADC=P3^6; sbit WR_ADC=P3^7; sbit T=P1^6;//nut bam Tang sbit G=P1^7;//nut bam Giam long int x,k,ch,dv;

float v;

unsigned long int i; unsigned char

M[10]={0XC0,0XF9,0XA4,0XB0,0X99,0X92,0X82,0XF8,0X80,0X90}; void tre (unsigned long int t)

{ for(i=0;i<=t;i++); } void hienthi() { P1=1;P0=M[ch];tre(20); P1=2;P0=M[dv];tre(20); P1=4;P0=0X9C ;tre(20); P1=0;//cac Led sang dong deu }

void main() {

{

WR_ADC=0;//cho phep ADC bien doi

tre(300);//thoi gian tre cho ADC bien doi xong WR_ADC=1;//khong cho ADC bien doi x=P2;//gan gia tri bien doi vao x

v=x*2.5/190; k=v*100;//nhiet do thuc ch=k/10; dv=k%10; } hienthi(); }

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

2.1.Sơ đồ khối.

KHỐI CPU 2 KHỐI NGUỒN

KHỐI DS1307 KHỐI HIỂN

THỊ KHỐI HIỆU

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ì ta 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.

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.4.Sơ đồ board.

2.5.Thuật toán điều khiển.

BẮT ĐẦU GHI VÀ LẤY DỮ LIỆU TỪ DS HIỂN THỊ KẾT THÚC QUÉT PHÍM

QUÉT PHÍM KIỂM TRA P0.0==0 HÀM XỬ LÝ PHÍM KEY ==1 TĂNG MODE (CHỌN ĐỐI TƯỢNG) KIỂM TRA KEY ==2 CHỈNH THỨ, NGÀY THÁNG, NĂM, GIỜ, PHÚT HIỂN THỊ GHI VÀO DS THOÁT

GHI DỊCH 74HC595 IC 2 QUÉT LED CHỌN IC IC 1 DỊCH DỮ LIỆU K ẾT THÚC

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; QU ÉT LED XU ẤT D Ữ LI ỆU For(0<=i < 11) K ẾT THÚC

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

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

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;

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;

}\

III. KHỐI HIỂN THỊ

3.1. Sơ đồ nguyên lý

CHƯƠNG IV: KẾT LUẬN

Một phần của tài liệu THIẾT KẾ, CHẾ TẠO LỊCH VẠN NIÊN ĐIỆN TỬ (Trang 26 - 50)

Tải bản đầy đủ (DOC)

(53 trang)
w