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