HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNGKHOA KỸ THUẬT ĐIỆN – ĐIỆN TỬ ---Báo cáo Đồ án hệ thống nhúng MẠCH CHUÔNG BÁO TIẾT HỌC Nhóm sinh viên thực hiện: Lưu Thị Tuyết Nhung Nguyễn Minh P
Trang 1HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA KỸ THUẬT ĐIỆN – ĐIỆN TỬ
-Báo cáo
Đồ án hệ thống nhúng
MẠCH CHUÔNG BÁO TIẾT HỌC
Nhóm sinh viên thực hiện:
Lưu Thị Tuyết Nhung Nguyễn Minh Phú Nguyễn Anh Tú
1
Trang 2CƠ SỞ LÝ THUYẾT
Nguyên lý hoạt động:
Bộ RTC nếu có xung nhịp đầu vào là 32.768 thì giá trị sẽ tăng một đơn vị sau mỗi một giây Giá tị này được lưu vào biến đếm TimeVar Dựa vào biến đếm
và các công thức tính thời gian ta có thể tính toán và hiện thị lên màn hình LCD
Khởi động mạch bằng nút nguồn, đợi LCD hiển thị sau đó cài đặt giá trị thời gian tương ứng.Phím bấm PA0 dùng cài đặt giá trị Phím bấm PC13 chuyển sang giá trị cài đặt tiếp theo.Sau khi các giá trị được cài đặt xong, LCD sẽ hiển thị ngày
và giờ Thời gian báo chuông được cố định sẵn trong code.Tín hiệu xuất ra chân PA7
Các thành phần mạch :
Vi điều khiển Thành phần chính
Vai trò là khối xử lý trung tâm
Cấu hình RTC, điều khiển tín hiệu ra cho bộ hiển thị và Pin báo chuông
LCD 16x2 Khối hiển thị
Thông tin : Giờ : Ngày:
Biến trở Điều chỉnh độ tương phản của LCD
Nút bấm Cài đặt thời gian
Bộ Báo chuông Báo chuông
Trang 3Sơ đồ khối
RTC và các thanh ghi backup:
3
VĐK (Hỗ trợ RTC)
Bộ báo chuông (Demo sử dụng sang Led)
Trang 4Ngắt ngoại (EXTI)
Trang 6Giao tiếp tương tự như mode 8 bit, chỉ cần chú ý một số khác biệt so với mode 8 bit như sau:
* Chỉ dùng 4 đường dữ liệu ( D4, D5, D6, D7), 4 đường kia bỏ trống 4 bit cao
được xử lý trước, sau đó đến 4 bit thấp
Trang 7Trước khi đưa LCD vào mode 4 bit cần tạo một lệnh giả lập để cho LCD hiểu ta đang muốn giao tiếp với nó ở Mode 4 bit Nghĩa là trước khi gửi lệnh 0x28 thì cần gửi lệnh với giá trị 0x2- (- :tùy định) Và điều này còn tùy vào loại LCD cũng như thời gian hiển thị chữ
Phần 2 Một số cấu hình code cần lưu ý
Công thức Giờ, Phút, Giây:
TimerVar = biến đếm thời gian đơn vị “s”
THH = TimeVar / 3600; //Công thức tính giờ:
TMM = (TimeVar % 3600) / 60; // Công thức tính phút:
TSS = (TimeVar % 3600) % 60; // Công thức tính giây
if(THH==24) THH=00; // khi THH=24 thì đặt về 00
Nguyên lý đếm ngày tháng
1.Với những tháng 31 ngày 1,3,5,7,8,10,12 thì biến ngày
“date_s.day” chạy đến ngày 31 thì biến tháng “date_s.month”
Sẽ tăng 1 đơn vị Với các tháng còn lại trừ tháng 2 ,
“date_s.day” chỉ chạy đến 30.
7
Trang 82.Tháng 2 của năm không nhuận thì “date_s.day” chạy đến 28
thì chuyển tháng Năm nhuận thì chạy đến 29.
/*Hàm thiết lập đếm ngày tháng năm*/
void Calendar_DateUpdate(void)
{
if (date_s.month == 1 || date_s.month == 3 || date_s.month == 5
|| date_s.month == 7 ||
date_s.month == 8 || date_s.month == 10 || date_s.month == 12)
{
if (date_s.day < 31)
{
date_s.day++;
}
/* Date structure member: date_s.day = 31 */
else
{
if (date_s.month != 12)
Trang 9date_s.month++;
date_s.day = 1;
}
/* Date structure member: date_s.day = 31 & date_s.month
=12 */
else
{
date_s.month = 1;
date_s.day = 1;
date_s.year++;
}
}
}
else if (date_s.month == 4 || date_s.month == 6 || date_s.month
== 9 ||
date_s.month == 11)
{
if (date_s.day < 30)
{
date_s.day++;
9
Trang 10}
/* Date structure member: date_s.day = 30 */
else
{
date_s.month++;
date_s.day = 1;
}
}
else if (date_s.month == 2)
{
if (date_s.day < 28)
{
date_s.day++;
}
else if (date_s.day == 28)
{
/* Leap year */
if (((date_s.year)%4)==0)
{
Trang 11date_s.day++;
}
else
{
date_s.month++;
date_s.day = 1;
}
}
else if (date_s.day == 29)
{
date_s.month++;
date_s.day = 1;
}
}
}
11