Xây dựng hệ thống báo giờ tự động bằng loa sử dụng PIC16F877A HỆ THỐNG NHÚNG( bao gồm code pic+ mô phỏng proteus)Xây dựng hệ thống báo giờ tự động bằng loa sử dụng PIC16F877A HỆ THỐNG NHÚNG( bao gồm code pic+ mô phỏng proteus)
GIỚI THIỆU TỔNG QUÁT
Thiết kế sơ đồ nguyên lý
LCD được sử dụng trong hệ thống là loại LCD 16x2 có 2 hàng và 16 cột
Màn hình LCD được sử dụng vô cùng rộng rãi trong công nghiệp cũng như các lĩnh vực đời sống Nó có chức năng hiển thị chữ, số
Dưới đây là hình ảnh thể hiện các chân của màn hình LCD
Hình 1.3: Định nghĩa các chân của LCD
Một số lệnh của LCD dùng trong pic 16f877a: Định nghĩa các chân LCD:
#define LCD_RS_PIN PIN_A0
#define LCD_RW_PIN PIN_C7
#define LCD_ENABLE_PIN PIN_C6
Khai báo thư viện LCD: #include
Khởi tạo LCD: LCD_init();
Để hiển thị ký tự trên LCD, sử dụng lệnh lcd_gotoxy(2,1) để đưa con trỏ đến cột 2, dòng 1, sau đó dùng lcd_putc("sy_viet") để hiển thị chữ "sy_viet" tại vị trí đó Bên cạnh đó, khối hiển thị Led matrix cũng là một phần quan trọng trong việc trình bày thông tin.
Led Matrix bao gồm 8 đèn LED đơn, với 8 chân kết nối đến cột và 8 chân kết nối đến hàng Để hoạt động, cần sử dụng 8 chân từ vi điều khiển để kết nối với hàng và 8 chân khác để kết nối với cột.
- Để 1 Led sáng: cấp điện áp VCC và GND vào 2 chân của Led đó
- Trong 1 thời điểm chỉ điều khiển được 8 Led
Hình 1.4: Cấu trúc led matrix 8x8
Cách test hàng và cột:
Để xác định chân HÀNG và chân CỘT trong Led Matrix, bạn cần nối một chân với nguồn (+) và một chân với nguồn (-) Nếu đèn sáng lên, điều đó có nghĩa là bạn đã xác định đúng vị trí của HÀNG và CỘT.
Khi đèn sáng thì chân với với nguồn (+) sẽ là chân hàng, và chân nối với nguồn (-) sẽ là chân cột
Hình 1.5 Cách xác định hàng và cột
Nguyên tắc gán HÀNG và CỘT như sau:
Hình 1.6 Nguyên tắc gán nhãn hàng và cột
Nguyên lý quét Led matrix:
• Chốt tín hiệu vào từng hàng và từng cột
• Duy trì trạng thái trong 1 khoảng thời gian đủ để mắt người cảm nhận được (khoảng 1ms)
• Chốt tín hiệu vào các hàng và các cột tiếp theo c) Khối DS1307
DS1307 là một chip thời gian thực (RTC - Real Time Clock) cung cấp thông tin chính xác về thời gian, bao gồm thứ, ngày, tháng, năm, giờ, phút và giây Thời gian được lưu trữ trong DS1307 có độ chính xác cao và có thể duy trì đến năm 2100.
DS1307 được chế tạo bởi Dallas Semiconductor, chip có cấu tạo bên ngoại khá đơn giản
Chip DS1307 có 8 chân và chúng ta hay dùng là dạng Dip và thứ tự các chân nó được mô tả như hình dưới đây:
X1,X2: nối với thạch anh 32,768 kHz
Vbat: đầu vào pin khoảng 3V
SQW/OUT: xung vuông/ đầu ra driver
Cấu tạo bên trong DS1307:
DS1307 được cấu tạo từ nhiều thành phần quan trọng, bao gồm mạch nguồn, mạch dao động, mạch điều khiển logic, mạch giao tiếp I2C, con trỏ địa chỉ và các thanh ghi (RAM).
DS1307 là một chip thời gian thực với các thành phần chủ yếu là "cứng", do đó việc sử dụng nó khá đơn giản, tập trung vào việc ghi và đọc các thanh ghi Để sử dụng DS1307 hiệu quả, người dùng cần nắm rõ cấu trúc của các thanh ghi và cách truy xuất chúng qua giao diện I2C.
Hình 1.8 Cấu trúc bên trong DS1307
Như đã trình bày, bộ nhớ DS1307 có tất cả 64 thanh ghi 8−bit được đánh địa chỉ từ 0 đến
Trong hệ thống 63 thanh ghi (từ 0x00h đến 0x3Fh), chỉ có 8 thanh ghi đầu tiên được sử dụng cho chức năng “đồng hồ” Phần còn lại, gồm 56 thanh ghi, để trống và có thể được sử dụng để chứa biến tạm, tương tự như RAM.
Bảy thanh ghi đầu tiên trong đồng hồ thực (RTC) chứa thông tin về thời gian, bao gồm giây, phút, giờ, thứ, ngày, tháng và năm Ghi giá trị vào các thanh ghi này tương đương với việc cài đặt thời gian khởi động cho RTC, trong khi việc đọc giá từ các thanh ghi này cho phép chúng ta truy cập thời gian thực mà RTC cung cấp.
Hình 1.9 Cấu trúc thanh ghi DS1307
Tổ chức bộ nhớ trong DS1307:
Vì 8 thanh ghi đầu tiên là quan trọng nhất trong hoạt động của DS1307, chúng ta sẽ khảo sát các thanh ghi này một cách chi tiết Trước hết hãy quan sát tổ chức theo từng bit của các thanh ghi này trong hình sau:
Hình 2.0 chức năng các thanh ghi trong DS 1307
Thanh ghi giây (SECONDS): thanh ghi này là thanh ghi đầu tiên trong bộ nhớ của
DS1307, địa chỉ của nó là 0x00 Bốn bit thấp của thanh ghi này chứa mã BCD 4-bit của
Chữ số hàng đơn vị của giá trị giây chỉ cần 3 do giá trị cao nhất của chữ số hàng chục là 5 Bit cao nhất (bit thứ 7) trong thanh ghi này là bit điều khiển CH (Clock halt), có chức năng vô hiệu hóa bộ dao động trong chip khi được set bằng 1, dẫn đến đồng hồ không hoạt động Do đó, cần thiết phải reset bit này xuống 0 ngay từ đầu để đảm bảo đồng hồ hoạt động bình thường.
Thanh ghi phút (MINUTES) có địa chỉ 0x01h và lưu trữ giá trị phút của đồng hồ Chỉ 7 bit của thanh ghi này được sử dụng để lưu mã BCD của phút, trong khi bit thứ 7 luôn được đặt bằng 0.
Thanh ghi giờ (HOURS): có thể nói đây là thanh ghi phức tạp nhất trong chip DS1307
Thanh ghi có địa chỉ 0x02h sử dụng 4 bit thấp để biểu thị chữ số hàng đơn vị của giờ DS1307 hỗ trợ hai hệ thống hiển thị giờ: 12h và 24h Bit thứ 6 xác định hệ thống giờ; nếu bit này = 0, hệ thống 24h được chọn, với 2 bit thứ 5 và thứ 4 mã hóa chữ số hàng chục của giờ, tối đa là 2 Nếu bit thứ 6 = 1, hệ thống 12h được sử dụng, chỉ cần 1 bit thứ 4 để mã hóa chữ số hàng chục, trong khi bit thứ 5 chỉ định buổi trong ngày (AM hoặc PM), với bit thứ 5 = 0 cho buổi sáng.
AM và bit thứ 5 = 1 là PM Bit thứ 7 luôn bằng 0
Thanh ghi thứ (DAY – ngày trong tuần) nằm tại địa chỉ 0x03h và chỉ nhận giá trị từ 1 đến 7, tương ứng với các ngày từ Chủ nhật đến thứ 7 trong tuần Do đó, chỉ có 3 bit thấp trong thanh ghi này có ý nghĩa, trong khi các bit còn lại luôn được đặt bằng 0.
Thanh ghi DATE (ngày trong tháng) nằm tại địa chỉ 0x04h và có giá trị từ 1 đến 31 Chỉ có 5 bit đầu tiên của thanh ghi này là có ý nghĩa, trong khi các bit còn lại luôn bằng 0.
Thanh ghi tháng (MONTH): nằm ở địa chỉ 0x05h Thanh ghi MONTH mang giá trị từ 1 đến 12, chỉ có 4 bit đầu tiên là có nghĩa Các bit còn lại bằng 0
Thanh ghi năm (YEAR): nằm ở địa chỉ 0x06h Thanh ghi YEAR mang giá trị từ 0 đến 99
Chip DS1307 chỉ dùng cho 100 năm, nên giá trị năm chỉ có 2 chữ số, phần đầu của năm do người dùng tự thêm vào
Thanh ghi điều khiển (0x07): Đây là thanh ghi điều khiển quá trình ghi của DS1307 và
Quá trình ghi phải được kết thúc bằng địa chỉ 0x93 d) Khối nguồn:
Nguồn cấp cho LCD: 2.5-6V DC e) Khối nút nhấn
Hệ thống sử dụng bốn nút nhấn:
UP: Tăng thời gian cài đặt
DOWN: Giảm thời gian cài đặt
MODE: Cài đặt thời gian chuông kêu/ SET
RESET: reset giá trị đặt f) Khối điều khiển
Khối điều khiển được sử dụng là PIC16f877a g) Khối chuông báo:
Sử dụng chuông báo kết hợp với loa giúp tăng cường khả năng thông báo Bài viết của chúng em còn tích hợp thêm đèn báo, tạo sự chú ý hơn Khi thời gian được cài đặt chính xác, chuông báo sẽ phát ra âm thanh và đèn báo sẽ sáng lên, đảm bảo thông tin được truyền tải hiệu quả.
13 h) Sơ đồ nguyên lý cho toàn mạch
Sử dụng Proteus để thiết kế sơ đồ:
Hình 2.1 Xây dựng sơ đồ nguyên lý bằng Proteus
Trong sơ đồ nguyên lý hình 2.1 thể hiện các chân của LCD, LED matrix và các thiết bị được đấu nối với PIC16f877a
Xin mời thầy cô xem Video giải thích mạch để thấy rõ hơn về cách đấu nối các chân thiết bị
Một số thông số kỹ thuật của DS1307:
• Điện áp cung cấp là 5V chuẩn
• X1 và X2cần dao động thạch anh 32.768Khz
• Nguồn nuôi cho chip Nguồn này từ ( 2V- 3.5V)
• Dải nhiệt độ hoạt động: -40 o C ~ 85 o C
LẬP TRÌNH ĐIỀU KHIỂN CHO HỆ THỐNG
Giới thiệu Yêu cầu điều khiển
Từ yêu cầu điều khiển: Xây dựng hệ thống báo giờ tự động bằng loa sử dụng PIC16F877A theo các yêu cầu sau:
• Sử dụng các nút nhấn để chọn thời gian báo chuông
• Hiển thị lên Led Matrix thời gian hiện thời
• Khi đến thời gian đã được đặt thì báo chuông
• Sử dụng IC thời gian thực DS1307
Ta tiến hành điều khiển như sau: Ấn cài đặt thời gian chuông báo bằng hệ thống nút bấm như sau:
• Bấm nút Mode được kết nối tới chân A3 của Pic lần thứ nhất thì ta sẽ bắt đầu chế độ set thời gian báo chuông
• Sau lần bấm nút Mode đầu tiên ta sẽ tiến hành ấn tiếp 3 lần tiếp theo cho nút
Mode để cài đặt giờ, phút, giây chuông báo sẽ kêu
• Bấm nút Up được kết nối tới chân A1 để tăng thời gian- giờ, phút, giây
• Bấm nút Down được kết nối tới chân A2 để tiến hành giảm thời gian- giờ, phút, giây
• Nút bấm reset được kết nối tới chân A4 có nhiệm vụ reset thời gian đã đặt
Thời gian thực đọc từ DS1307 sẽ hiển thị Lên 3 LED matrix
LCD có nhiệm vụ hiển thị các thông số cài đặt thời gian
Xây dựng lưu đồ điều khiển
Trình tự hoạt động của lưu đồ điều khiển được hoạt động như sau:
Khi khởi động chương trình, chúng ta sẽ nhập thời gian hiện tại bao gồm giờ, phút và giây để hiển thị thời gian này từ màn hình LCD lên LED MATRIX.
Để cài đặt thời gian báo chuông, sử dụng các nút nhấn MODE, UP và DOWN như đã nêu trong mục 1.1 chương II Nút reset sẽ giúp khôi phục lại toàn bộ thời gian đã được cài đặt ban đầu.
Thời gian cài đặt được hiển thị màn hình LCD
Kiểm tra thời gian cài đặt: Nếu thời gian này trùng khớp với thời gian hiển thị trên LED MATRIX, chuông báo sẽ được kích hoạt.
Nếu thời gian chưa được cài đặt thì sẽ tiến hành cài đặt thời gian
Nhập thời gian thực cho DS1307
Hiển thị thời gian thực lên LED MATRIX
Hiển thị chế độ cài đặt lên
CHUÔNG BÁO HOẠT ĐỘNG Đ ÚN G
Hình 2.2 Lưu đồ điều khiển
#define LCD_RS_PIN PIN_A0
#define LCD_RW_PIN PIN_C7
#define LCD_ENABLE_PIN PIN_C6
#include // khai báo thư viện LCD unsigned int8
Ma_Hang[8]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe }; const int vFLASH[60][8]{{0x42,0xa5,0xa5,0xa5,0xa5,0xa5,0xa5,0x42}
{0x41,0xa3,0xa5,0xa1,0xa1,0xa1,0xa1,0x41}
{0x46,0xa9,0xa1,0xa1,0xa1,0xa2,0xa4,0x4f}
{0x46,0xa9,0xa1,0xa6,0xa1,0xa1,0xa9,0x46}
{0x49,0xa9,0xa9,0xaf,0xa1,0xa1,0xa1,0x41}
{0x4f,0xa8,0xa8,0xae,0xa1,0xa1,0xa9,0x46}
{0x47,0xa8,0xa8,0xae,0xa9,0xa9,0xa9,0x46}
{0x4f,0xa1,0xa1,0xaf,0xa1,0xa1,0xa1,0x41}
{0x46,0xa9,0xa9,0xa6,0xa9,0xa9,0xa9,0x46}
{0x46,0xa9,0xa9,0xa7,0xa1,0xa1,0xa9,0x46}
I'm sorry, but the content provided appears to be a series of hexadecimal values rather than a coherent article Please provide a clear text article for me to help you rewrite.
The article discusses various elements represented by hexadecimal values, emphasizing their significance in a broader context It highlights the importance of understanding these codes and their implications in technology and data processing Additionally, it touches on how these values interact within specific frameworks, providing insights into their functionality and relevance The content encourages further exploration of these hexadecimal representations to grasp their full potential and application in modern computing.
19 int8 a=0; int8 b=0; int8 c=0; void reset(){ if(!input(pin_a4)){ while(!input(pin_a4)){ k=0; d=0; e=0; f=0; i=0;
OUTPUT_low(pin_a5); lcd_putc('\f'); lcd_gotoxy(2,1); lcd_putc("Reset"); delay_ms(2000); lcd_gotoxy(2,2); lcd_putc("It is done!"); delay_ms(2000);
OUTPUT_high(pin_a5); delay_ms(1000);
}} void hthi(){ lcd_gotoxy(2,1); lcd_putc("thietlapgio"); lcd_gotoxy(1,2); lcd_putc((i/10)+0x30); lcd_gotoxy(2,2); lcd_putc((i%10)+0x30); lcd_gotoxy(4,2); lcd_putc("gio"); lcd_gotoxy(8,2); lcd_putc("Next=MODE");
} void hthi1(){ lcd_gotoxy(2,1); lcd_putc("thietlapphut"); lcd_gotoxy(1,2); lcd_putc((i/10)+0x30); lcd_gotoxy(2,2);
21 lcd_putc((i%10)+0x30); lcd_gotoxy(4,2); lcd_putc("phut"); lcd_gotoxy(8,2); lcd_putc("Next=MODE");
} void hthi2(){ lcd_gotoxy(2,1); lcd_putc("thietlapgiay"); lcd_gotoxy(1,2); lcd_putc((i/10)+0x30); lcd_gotoxy(2,2); lcd_putc((i%10)+0x30); lcd_gotoxy(4,2); lcd_putc("giay"); lcd_gotoxy(8,2); lcd_putc("Next=MODE");
LCD_init();// khoi tao LCD OUTPUT_low(pin_a4);
BYTE dow; int8 chuc1,donvi1,chuc2,donvi2,chuc3,donvi3,chuc,donvi; ds1307_init(); while(true)
{lcd_gotoxy(0,1); lcd_putc(" SETUP=MODE"); lcd_gotoxy(2,2); lcd_putc("SY _VIET"); if(!input(pin_a3)){ while(!input(pin_a3)){
23 lcd_gotoxy(2,1); lcd_putc("CLICK_UP_DOWN"); delay_ms(2000); k=1; lcd_putc('\f'); }}
} while(k==1){ reset(); if(!input(pin_a1))
} else if(!input(pin_a2)) {while(!input(pin_a2)); { if(i>0)
} else if(!input(pin_a3)){ while(!input(pin_a3)){ d=i; lcd_putc('\f');
25 lcd_gotoxy(2,1); lcd_putc("Da xac nhan"); lcd_gotoxy(1,2); lcd_putc("thietlapgio"); delay_ms(1000); lcd_putc('\f');
}} while(k==2){ reset(); hthi1(); if(!input(pin_a1))
} else if(!input(pin_a2)) {while(!input(pin_a2)); { if(i>0)
} else if(!input(pin_a3)){ while(!input(pin_a3)){ e=i; lcd_putc('\f');
27 lcd_gotoxy(2,1); lcd_putc("Da xac nhan"); lcd_gotoxy(1,2); lcd_putc("thietlapphut"); delay_ms(1000); lcd_putc('\f');
} while(k==3){ reset(); hthi2(); if(!input(pin_a1))
} else if(!input(pin_a2)) {while(!input(pin_a2)); { if(i>0)
29 while(!input(pin_a3)){ f=i; lcd_putc('\f'); lcd_gotoxy(2,1); lcd_putc("Da xac nhan"); lcd_gotoxy(1,2); lcd_putc("thietlapgiay"); delay_ms(1000); lcd_putc('\f');
}} ds1307_get_date(day,month,yr,dow); ds1307_get_time(hrs,min,sec); a=hrs; b=min; c=sec; dkien(); donvi1=hrs%10; chuc1=hrs/10; donvi2=min%10; chuc2=min/10; donvi3=sec%10;
30 chuc3=sec/10; for(j=0; j