THIẾT kế MẠCH ĐỒNG hồ số DÙNG PIC kết hợp đo NHIỆT độ (có code và sơ đồ mạch) THIẾT kế MẠCH ĐỒNG hồ số DÙNG PIC kết hợp đo NHIỆT độ (có code và sơ đồ mạch) THIẾT kế MẠCH ĐỒNG hồ số DÙNG PIC kết hợp đo NHIỆT độ (có code và sơ đồ mạch) THIẾT kế MẠCH ĐỒNG hồ số DÙNG PIC kết hợp đo NHIỆT độ (có code và sơ đồ mạch)
Trang 1PIC KẾT HỢP ĐO NHIỆT ĐỘ
Trang 2DANH MỤC CÁC BẢNG BIỂU VIII DANH MỤC CÁC TỪ VIẾT TẮT IX
CHƯƠNG 1 GIỚI THIỆU ĐỀ TÀI 1
1.1 Mục đích đề tài 1
1.2 Ứng dụng đề tài 1
1.3 Yêu cầu đề tài 1
CHƯƠNG 2 THIẾT KẾ HỆ THỐNG 2
2.1 Sơ đồ khối của mạch 2
2.2 Lưu đồ giải thuật 3
CHƯƠNG 3 GIỚI THIỆU LINH KIỆN VÀ CÁC CHUẨN GIAO TIẾP 4
3.1 Vi điều khiển PIC16F877A 4
3.2 IC thời gian thực DS1307 5
3.3 LCD 162 7
3.4 Cảm biến nhiệt độ LM35 9
3.5 Module SIM900A mini 9
3.6 Chuẩn giao tiếp I2C 10
3.7 Chuẩn giao tiếp USART 11
CHƯƠNG 4 NGUYÊN LÝ HOẠT ĐỘNG CỦA MẠCH 12
4.1 Sơ đồ nguyên lý của mạch 12
4.2 Nguyên lý hoạt động của mạch 13
4.3 Sơ đồ mạch in 13
4.4 Hình ảnh mạch trong thực tế 14
4.5 Kết quả giao tiếp module SIM900A mini 14
CHƯƠNG 5 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 15
Trang 3PHỤ LỤC 17
DANH MỤC CÁC HÌNH VẼ
Trang 4Hình 3-1: Kiến trúc Harvard của PIC16F877A 4
Hình 3-2: Sơ đồ chân vi điều khiển PIC16F877A 4
Hình 3-3: Sơ đồ chân IC DS1307 5
Hình 3-4: Hình ảnh thực tế IC DS1307 6
Hình 3-5: Tổ chức thanh ghi của IC DS1307 6
Hình 3-6: Sơ đồ chân của LCD 162 7
Hình 3-7: Hình ảnh thực tế và sơ đồ chân của LM35 9
Hình 3-8: Sơ đồ chân của module SIM900A mini 10
Hình 4-1: Sơ đồ nguyên lý của mạch 12
Hình 4-2: Mạch mô phỏng đồng hồ kết hợp đo nhiệt độ 12
Hình 4-3: Sơ đồ mạch in 13
Hình 4-4: Hình ảnh mạch trong thực tế 14
Hình 4-5: Kết quả nhiệt độ được gửi về điện thoại 14
Trang 5Bảng 2: Bảng chi tiết các thanh ghi của IC DS1307 7
Bảng 3: Chức năng các chân của LCD 8
Bảng 4: Chức năng các chân của LM35 9
Bảng 5: Chức năng các chân của module SIM900A mini 10
Trang 6
ARM Advanced RISC Machine.
CPU Central Processing Unit
I2C InterIntergrated Circuit
IC Intergrated Circuit
LCD Liquid Crystal Display
LSB Least Significant Bit
MCU Multipoint Control Unit
MSB Most Significant Bit
PIC Programmable Intelligent Computer
PWM Pulse Width Modulation
RAM Random Access Memory
RTC Real–Time Clock
SIM Subscriber Identity Module
SMS Short Massage Services
Trang 7CHƯƠNG 1 GIỚI THIỆU ĐỀ TÀI
em chọn đề tài đồng hồ số kết hợp đo nhiệt độ hiển thị trên LCD và gửi kếtquả đo nhiệt độ về điện thoại qua module SIM
1.3 Yêu cầu đề tài
Sử dụng vi điều khiển PIC16F877A để điều khiển
Hiển thị thời gian và nhiệt độ trên LCD
Gửi kết quả đo nhiệt độ về điện thoại qua module SIM
CHƯƠNG 2 THIẾT KẾ HỆ THỐNG1.4 Sơ đồ khối của mạch
Trang 8Hình 2-1: Sơ đồ khối của mạch.
Chức năng từng khối:
Khối nguồn: sử dụng nguồn một chiều 5VDC làm nhiệm cung cấp nguồncho các mạch hoạt động
Khối điều khiển: sử dụng các nút nhấn để điều chỉnh thời gian
Khối RTC: sử dụng IC DS1307 để ghi và đọc thời gian
Khối vi xử lý: sử dụng PIC16F877A làm trung tâm xử lý, lấy dữ liệu từ cáckhối khác để xử lý sau đó hiển thị lên LCD 162
Khối cảm biến: sử dụng cảm biến nhiệt độ LM35 để đo nhiệt độ môi trường
Khối hiển thị: sử dụng LCD 162 để hiển thị thời gian và nhiệt độ
Khối giao tiếp: sử dụng Module SIM900A mini để gửi kết quả đo nhiệt độ vềđiện thoại
Khởi tạo PIC, LCD,LM35, DS1307 và SIM
Trang 9Hình 2-2: Lưu đồ giải thuật.
CHƯƠNG 3 GIỚI THIỆU LINH KIỆN VÀ CÁC CHUẨN GIAO TIẾP
1.6 Vi điều khiển PIC16F877A[1]
Vi điều khiển PIC16F877A có tổ chức phần cứng theo kiến trúc Harvard
Sai
Vi xử lí
Thu thập dữ liệu từLM35 và DS1307
Module SIM gửi SMS
về điện thoại
Cập nhật và hiển thịthời gian và nhiệt độ
Kết thúc
Trang 10Hình 3-1: Kiến trúc Harvard của vi điều khiển [1]
Vi điều khiển PIC16F877A là vi điều khiển thuộc họ PIC16Fxxx có tập lệnh gồm 35 lệnh, độ dài 14 bit
Vi điều khiển PIC16F877A gồm có 40 chân và có các chức năng sau:
5 port xuất nhập (A, B, C, D, E) với tổng cộng 33 chân xuất nhập: dùng
để xuất/nhập dữ liệu
3 bộ timer/counter: dùng để định thời hoặc đếm
Timer 0: 8 bit
Trang 11 Timer 1: 16 bit.
Timer 2: 8 bit
2 bộ input capture/output compare/PWM (CCP1 và CCP2):
Input capture: đo tần số của một tín hiệu
Output compare: tạo xung dao động
PWM: điều chế độ rộng xung
Các chuẩn giao tiếp nối tiếp của vi điều khiển PIC16F877A: USART, PSP, I2C, SPI
ADC: bộ chuyển đổi tín hiệu giữa hai dạng tín hiệu analog và số,
PIC16F877A có 8 ngõ vào analog ( RA4:RA0, RE2:RE0)
1.7 IC thời gian thực DS1307[3]
Có thể đếm thời gian theo định dạng 24h hoặc 12h
Có 7 thanh ghi 8 bit chứa thời gian, 1 thanh ghi điều khiển ngõ ra phụ
và 56 thanh ghi trống có chức năng như RAM
Được đọc và ghi bằng giao diện nối tiếp I2C
Trang 123 VBAT Chân kết nối với nguồn Pin 3V làm nguồn nuôi chip DS1307
5 SDA Chân vào dữ liệu của chip khi kết nối đến bus I2C
6 SCL Chân vào của xung Clock đồng bộ khi kết nối đến bus I2C
Tổ chức các thanh ghi của IC DS1307:
Trang 13Bảng 2: Bảng chi tiết các thanh ghi của DS1307 [5]
1.8 LCD 162[3]
Trang 14 Chân cho phép LCD hoạt động khi có một tín hiệu vào.
Chế độ đọc: dữ liệu được xuất ra khi có 1 xung L_to_H
Chế độ ghi: dữ liệu được nhận vào khi có 1 xung H_to_ L
1.9 Cảm biến nhiệt độ LM35[2]
Đơn vị đo nhiệt độ: C
Nhiệt độ thay đổi tuyến tính: 10mV/C
Trang 15 Dải nhiệt độ đo được của LM35 từ -55C đến 150C tùy thuộc vào điện ápngõ ra.
1 Vcc Chân nối với nguồn cung cấp có thể từ 4V đến 20V
2 Out Chân Vout cho giá trị ra thay đổi theo nhiệt độ môi trường
1.10 Module SIM900A mini[8]
Module này sử dụng giao diện TTL, có thể được kết nối trực tiếp với MCU, ARM, mà không cần thiết bị chuyển đổi, và không sử dụng các liên kết máy tính như cổng USB, RS232, RS485 và liên kết nối tiếp khác, module sẽ bị hỏng
Trang 16Hình 3-8: Sơ đồ chân của module SIM900A mini [6]
6 Mircophone Chận nhận âm thanh (phải gắn thêm Micro từ GND vào
chân này mới thu được tiếng)
1.11 Chuẩn giao tiếp I2C[2]
Giao thức I2C là một giao thức gồm 2 chế độ: Master và Slave Mỗi I2C bus có
2 tín hiệu là: SCL (tín hiệu tạo xung clock) và SDA (tín hiệu dữ liệu)
Với vi điều khiển PIC16F877A, I2C sử dụng 2 chân:
Chân 18 (RC3/SCK/SCL): để truyền dẫn xung clock
Chân 23 (RC4/SDI/SDA): để truyền dẫn dữ liệu
Địa chỉ truyền đi sẽ gồm các bit địa chỉ và 1 bit R/W (đọc hoặc ghi) đối tượng cần truy xuất dữ liệu
I2C có nhiều chế độ hoạt động, gồm:
Master mode và Firmware Control Master mode
Trang 17 Slave mode 7 bit địa chỉ và slave mode 7 bit địa chỉ ngắt khi phát hiện bit Start và bit Stop.
Slave mode 10 bit địa chỉ và slave mode 10 bit địa chỉ ngắt khi phát hiện bit Start và bit Stop
SDL và SDA luôn được kéo lên lên nguồn bằng một điện trở kéo lên, tùy vào khoảng cách truyền nhận và thường khoảng cách này là nhỏ hơn 1m nên ta chọngiá trị điện trở kéo lên là 4.7kΩ, khoảng cách càng xa thì giá trị điện trở kéo lêncàng nhỏ
1.12 Chuẩn giao tiếp USART[2]
USART là chuẩn giao tiếp nối tiếp, thường là một tích hợp được sử dụng trong việc truyền dẫn dữ liệu Để bắt đầu cho việc truyền dữ liệu bằng USART, một Start bit được gửi đi, sau đó là các bit dữ liệu và kết thúc quá trình truyền là Stop bit
Các thông số cơ bản trong truyền nhận USART:
Baund rate: khoảng thời gian dành cho 1 bit truyền
Frame: khung truyền quy định về số bit trong mỗi lần truyền
Start bit: là bit đầu tiên được truyền trong 1 Frame
Data: dữ liệu cần truyền Bit LSB được truyền trước sau đó đến bit MSB
Parity bit: kiểm tra dữ liệu truyền có đúng không
Stop bit: là 1 hoặc các bit báo cho thiết bị rằng các bit đã được gửi xong
CHƯƠNG 4 NGUYÊN LÝ HOẠT ĐỘNG CỦA MẠCH
1.13 Sơ đồ nguyên lý của mạch
Trang 18Hình 4-1 Sơ đồ nguyên lý của mạch.
Hình 4-2: Mạch mô phỏng đồng hồ kết hợp đo nhiệt độ.
1.14 Nguyên lý hoạt động của mạch
Mạch sử dụng vi xử lý PIC16F877A làm trung tâm xử lý Khi cấp nguồn5VDC vào mạch các linh kiện sẽ được khởi tạo, sau đó vi xử lí PIC sẽ đọcthời gian từ IC DS1307 và cảm biến nhiệt độ LM35 sẽ đo nhiệt độ môi
Trang 19trường, vi xử lý sẽ đọc nhiệt độ qua bộ ADC sau đó sẽ hiển thị ra màn hìnhLCD 162
Đồng thời khi vi xử lý PIC và các linh kiện được khởi tạo module SIM sẽ gởimột SMS về điện thoại với nội dụng “Xin Chao!” để xác nhận module SIM
đã kết nối với điện thoại Nếu muốn kiểm tra nhiệt độ ta phải gửi một SMSvới nội dung “KT” đến module SIM sau đó module SIM sẽ trả về điện thoạikết quả nhiệt độ Nếu gửi SMS với nội dung khác nội dung “KT” moduleSIM sẽ không trả về kết quả nhiệt độ mà sẽ nhận được một SMS với nộidung “SAI CU PHAP”
Để điều chỉnh thời gian:
Nhấn nút K1 để chọn vị trí (giờ, phút, giây) cần chỉnh thời gian
Nhấn nút K2 để tăng giá trị thời gian
Nhấn nút K3 để giảm giá trị thời gian
Nhấn nút K4 để trở về màn hình LCD hiển thị thời gian đã chỉnh.1.15 Sơ đồ mạch in
Hình 4-3: Sơ đồ mạch in.
1.16 Hình ảnh mạch trong thực tế
Trang 20Hình 4-4: Hình ảnh mạch trong thực tế.
1.17 Kết quả giao tiếp module SIM900A mini
Hình 4-5: Kết quả nhiệt độ gửi về điện thoại.
CHƯƠNG 5 KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN.
Trang 211.18 Kết luận.
Mạch hiển thị được giờ, phút, giây đúng thời gian thực theo định dang hh:mm:ss ởchế độ 24h Mạch đã đo và hiển thị được nhiệt độ môi trường và gửi đúng kết quảnhiệt độ về điện thoại khi có yêu câu kiểm tra
Mạch nhỏ gọn có cấu tạo đơn giản
Mạch dễ dàng sử dụng có thể điều chỉnh thời gian theo ý muốn
Thời gian và nhiệt độ trên LCD nên dễ dàng quan sát
Có thể kiểm tra nhiệt độ khi có nhu cầu
Cảm biến nhiệt độ dễ bị ảnh hưởng bởi nhiễu
Gia công còn chưa chắn chắc nên dễ hỏng
1.19 Ứng dụng và hướng phát triển
Có thể làm đồng hồ treo tường cho các gia đình
Thiết bị giám sát nhiệt độ trong môi trường
Có thể tích hợp thêm nhiều chức năng ngoài chức năng đo nhiệt độvào mạch đồng hồ như đo bước chân, đo nhịp tim, đo độ ẩm,… ngoài
ra có thể hiển thị thêm ngày tháng năm vào đồng hồ
Ngoài giao tiếp module SIM có thể sử dụng các giao tiếp khác để gửikết qua đo nhiệt độ về điện thoại như WiFi, Bluetooth,… Với các tínhnăng như trên, có thể tạo ra một chiếc đồng hồ thông minh nhỏ gọn cóthể đeo tay giúp ta quan sát thời gian và thâm chí là sức khỏe
TÀI LIỆU THAM KHẢOTiếng Việt:
[1] Giáo trình vi điều khiển PIC16F877A
[2] codientu.org
[3] hshop.vn
Trang 23#use i2c(master,fast,sda = pin_c4,scl = pin_c3)
#include <lcd_lib_4bit.c> // file giao tiep LCD
Trang 24void convert_bcd_lcd(int8 g,int8 p, int8 h, int8 th);
void convert_so_lcd(int8 x);
void ReadRTC(unsigned char * buff);
void WriteRTC(unsigned char * buff);
if(ch==10 && index ==0) is=1; //bat dau cho phep nhan chuoi
if(ch==10 && index>0) {idex=index; ngat=1; isti = 2; } //KHI KET THUC MOT CHUOI
if(ch!=10 && ch!=13 && is == 1) { str[index] = ch; index++; }
}
if(isti==2) //cho phep nhan khi da khoi tao thanh cong
{
if(ch==10 && index1 ==0) is=1; //bat dau cho phep nhan chuoi
if(ch==10 && index1>0) {idex1=index1; ngat=2; isti = 0; } //KHI KET THUC MOT CHUOI
if(ch!=10 && ch!=13 && is == 1) { str1[index1] = ch; index1++; }
}
}
/*==========================================*/
void send_sms()
Trang 26{
LCD_putcmd(0x80);
Printf(LCD_putchar,"Time: ");
Trang 27//printf(LCD_putchar," ");
LCD_putchar(c_h + 0x30); LCD_putchar(dv_h + 0x30);printf(LCD_putchar,":"); LCD_putchar(c_p + 0x30); LCD_putchar(dv_p + 0x30);printf(LCD_putchar,":"); LCD_putchar(c_g + 0x30); LCD_putchar(dv_g + 0x30);
Trang 28trisd = 0x00;
trise = 0x00;
c_g=0,dv_g=1,c_p=2,dv_p=3,c_h=4,dv_h=5,thu=6,c_d=7,dv_d=8,c_t=9,dv_t=0, c_n=1,dv_n=2;
setup_adc_ports(AN0);//chon kenh ADC
puts("AT+IPR=9600"); putc(13); delay_ms(500);
puts("ATE1"); putc(13); delay_ms(500);
puts("AT+CMGF=1"); putc(13); delay_ms(500);
puts("AT+CMGD=1,4"); putc(13); delay_ms(500);
break;
}
}
Trang 29isti = 0; delay_ms(500);
strcpy(str3,"Xin Chao!"); send_sms();
idex = 0; index = 0; ngat = 0; is = 0; isti = 1;
while(true)
{
ReadRTC(&RTC_ARR[0]);
convert_bcd_lcd(RTC_ARR[0],RTC_ARR[1],RTC_ARR[2],RTC_ARR[3]); hienthi();
Trang 30puts("AT+CMGD=1"); putc(13); delay_ms(500);
puts("AT+CMGD=1"); putc(13); delay_ms(500);
Trang 31c_g=(g&240)>>4; //chia lay phan du, so hang don vi
dv_g=g&15; //tach hang tram va hang chuc
c_p=(p%240)>>4; //chia lay phan du, so hang don vi
dv_p=p&15; //tach hang tram va hang chuc
c_h=(h&240)>>4; //chia lay phan du, so hang don vi
dv_h=h&15; //tach hang tram va hang chuc
thu = th;
}
void convert_so_lcd(int8 x)
{
low=x%10; //chia lay phan du, so hang don vi
high=x/10; //tach hang tram va hang chuc
low = low + 0x30;
high = high + 0x30;
Trang 32case 2:
{ t = c_p*10+dv_p; if(t<59) t++; else t = 0; c_p = t/10; dv_p = t%10; break;}
case 3:
{ t = c_g*10+dv_g; if(t<59) t++; else t = 0; c_g = t/10; dv_g = t%10; break;}
case 4:
{ t = thu; if(t<7) t++; else t = 1; thu = t;
Trang 33break;}
case 5:
{ t = c_d*10+dv_d; if(t<31) t++; else t = 1; c_d = t/10; dv_d = t%10; break;}
case 6:
{ t = c_t*10+dv_t; if(t<12) t++; else t = 1; c_t = t/10; dv_t = t%10; break;}
case 7:
{ t = c_n*10+dv_n; if(t<99) t++; else t = 0; c_n = t/10; dv_n = t%10; break;}
case 2:
{ t = c_p*10+dv_p; if(t>0) t ; else t = 59; c_p = t/10; dv_p = t%10; break;}
case 3:
{ t = c_g*10+dv_g; if(t>0) t ; else t = 59; c_g = t/10; dv_g = t%10; break;}
case 4:
Trang 34{ t = thu; if(t>1) t ; else t = 7; thu = t;
break;}
case 5:
{ t = c_d*10+dv_d; if(t>1) t ; else t = 31; c_d = t/10; dv_d = t%10; break;}
case 6:
{ t = c_t*10+dv_t; if(t>1) t ; else t = 12; c_t = t/10; dv_t = t%10; break;}
case 7:
{ t = c_n*10+dv_n; if(t>0) t ; else t = 99; c_n = t/10; dv_n = t%10; break;}
}
}
if(k1==0) { while(k1==0){} mode++; if(mode>4) break;}
if(k4==0) { while(k4==0){} break;}
Trang 35RTC_ARR[6] = (c_n<<4) | dv_n; // year = 10 WriteRTC(&RTC_ARR[0]); // Set RTC
Trang 36// -void WriteRTC(unsigned char *buff)