LỜI CẢM ƠN Lời đầu tiên nhóm 13 xin được chân thành gửi lời cảm ơn đến thầy Nguyễn Duy Khanh vì những trang bị kiến thức bổ ích và liên quan thiết thực để tạo nền tảng cho chúng em có t
Trang 1TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP THÀNH PHỐ HỒ CHÍ MINH KHOA: CÔNG NGHỆ ĐIỆN TỬ
oOo BÁO CÁO THỰC HÀNH
KỸ THUẬT VI XỬ LÝ
NHÓM 13 THÀNH VIÊN
Lớp học phần: 420300086903 GVHD: Thầy Nguyễn Duy Khanh
Thành phố Hồ Chí MinhNgày 11 tháng 8 năm 2023
Trang 2LỜI CẢM ƠN
Lời đầu tiên nhóm 13 xin được chân thành gửi lời cảm ơn đến thầy Nguyễn Duy Khanh vì những trang bị kiến thức bổ ích và liên quan thiết thực để tạo nền tảng cho chúng em có thể hoàn thành được đồ án của môn học này
Cảm ơn thầy vì luôn tận tình hướng dẫn và đưa ra những góp ý cho đồ án môn họccủa chúng em trong suốt quá trình thực hiện vừa qua Nhờ những kiến thức, kinh nghiệm
và trải nghiệm từ thầy truyền lại, đã giúp cho chúng em có vững nền tảng, từ đó có cơ hội học hỏi và phát triển cả về kiến thức cơ bản đến những kỹ năng mở rộng đủ để hoàn thành đồ án này
Để thực hiện thành công đồ án môn học này, chúng em đã dành ra nhiều thời gian,
nỗ lực và cả tinh thần cố gắng, với mong muốn tạo ra được một sản phẩm mang lại lợi ích cho cuộc sống Nhưng không vì vậy mà trong quá trình thực hiện không thể tránh khỏi những thiếu sót, chúng em mong thầy có thể thông cảm và đưa ra những ý kiến nhận xét, đóng góp từ thầy để đồ án môn học của nhóm trở nên hoàn thiện hơn, từ đó mỗi thành viên cũng sẽ có thể tự mình rút ra những bài học kinh nghiệm quý báu cho saunày
Sau cùng, chúng em kính chúc thầy sức khỏe, thành công và luôn may mắn trong công việc và cuộc sống
Chúng em xin chân thành cảm ơn!
Tp Hồ Chí Minh, tháng 11, năm 2023Nhóm sinh viên thực hiện
Nhóm 13
Trang 3AN529 ĐIỀU KHIỂN LED 7 ĐOẠN BẰNG PHƯƠNG PHÉP
QUÉT MA TRẬN BÀN PHÍM
Giới thiệu đề tài
Rất nhiều ứng dụng ngày nay yêu cầu
đèn led điều khiển với giao diện từ
bàn phím Việc triển khai các thiết kế
như vậy thường sử dụng một lượng
đáng kể các dòng I/O của bộ xử lý
Ghi chú ứng dụng này mô tả một
phương pháp chỉ sử dụng 16 chân I/O
của bộ vi điều khiển PIC16F887 để
lấy mẫu ma trận bàn phím 4x4 và điều
khiển trực tiếp bốn đèn LED 7 thanh
(Hình 1) Việc điều khiển trực tiếp các
đèn LED là có khả năng, do khả năng
“sink and source” cao của bộ vi điềukhiển PIC16C5X, do đó có thể loại bỏbóng bán dẫn điều khiển bên ngoài,dẫn đến giảm cả chi phí và độ phức tạpcủa mạch tổng thể
Thông thường, các ứng dụng có đènLED và bàn phím cũng theo dõi thờigian thực để đồng bộ hóa một số sựviệc liên quan Một ví dụ về đồnghồ/bộ hẹn giờ, đó là tính năng ghi chúcủa các ứng dụng, như 1 cách minhhọa các chức năng này Và “chi phíphần mềm” để theo dõi thời gian thực
là rất nhỏ và người dùng có thể sửađổi mã để mở rộng đáng kể chức năngcủa mạch này
.
Hình 1: Giao diện pic16f887 với màn hình đoạn và bàn phím 4x4
Tác giả: Stan D’Souza
Microchip Technology Inc.
Trang 4Phần A: QUÉT MA TRẬN 4x4
Thực hiện
Ma trận khóa 4x4 được kết nối với
PORTB của PIC16F887 (Hình 2) Bốn
cột được kết nối với RB0-RB3 và bốn
hàng được kết nối với RB4-RB7 Mỗi
chữ số được làm mới sau mỗi 20 ms
với xung 5 ms Bàn phím được lấy mẫu
cứ sau 20 ms với bốn xung 3 μs (Hình
4)
Việc quét bàn phím như sau:
a) Các cột được kết nối với các chân
đầu ra và các hàng được kết nối với
các chân đầu vào
b) Mỗi cột được điều khiển liên tục
bởi điện áp thấp, trong khi đó bốn
hàng được lấy mẫu Vì tất cả các
hàng đều được giữ ở mức cao vớicác điện trở kéo lên, nên cả bốnđầu vào thường sẽ ở mức cao Nếumột phím được nhấn trong một cột
ở mức thấp, thì mức thấp đó sẽđược dẫn đến chân đầu vào thôngqua khóa đóng và hàng tương ứng
sẽ được cảm nhận là mức thấp.c) Trước khi một cột mới được hạthấp, cần chú ý xả các chốt đầu vào(xem phần mã để biết chi tiết).d) Kỹ thuật gỡ lỗi phím (50 ms)
đã được triển khai trong phầnmềm, để loại bỏ nhiều lần nhấnphím không mong muốn ( kẹtphím )
Trang 6Phần B: ĐỒNG HỒ CÔNG NGHIỆP K/TIMER
Lựa chọn đồng hồ
Bộ tạo dao động “crystal oscillator”
4,096 MHz là cơ sở thời
gian.PIC16F887 chia xung nhịp ra
thành 4 để tạo ra xung nhịp bên trong
là 1,024 MHz.Đồng hồ này được chia
thêm cho 32 (bởi bộ chia trước trong
thanh ghi tùy chọn) để có xung nhịp
32 kHz được sử dụng để tăng TMR0
trong PIC16F887.Nếu TMR0 được
khởi tạo thành 96, nó sẽ tràn về 0 sau
lỡ phần tràn trong TMR0
Trang 7Hình 4: Thời gian chọn chữ số led và quét phím
ĐẶC TÍNH
Biểu đồ cột (Hình 5) hiển thị sự liên tiếp của sự kiện trong phần mềm clock/timer.Đồng hồ có các tính năng sau:
12 giờ đồng hồ với a.m./p.m
12 giờ báo thức với a.m./p.m
Đầy đủ chức năng của bàn phím (Hình 5)
Báo thức bằng tiếng bip trong 1 phút
Báo thức vào 10 phút sau
CÀI ĐẶT CHỨC NĂNG ĐỒNG HỒ/HẸN GIỜ
Chức năng Chuỗi phím để kích hoạt chức năng
Đặt thời gian thực Set Hours (tens) Hours Minutes (tens) Minutes ➔ ➔ ➔ ➔ ➔
AM/PM Set➔Xem thời gian báo
Đặt thời gian báo
5 ms Digit 2 20
ms Digit 3
Digit 4
Trang 8Tắt tiếng bip, tắt
báo thức Clear Alarm (tắt tiếng bip và tắt chế độ báo thức)
Xóa đầu vào Clear Entry (xóa đầu vào khi đang cài đặt thời gian)
Chú ý 1: Các lần nhấn phím hợp lệ sẽ được xác nhận bằng một tiếng bíp Chú ý 2: Giờ và phút sử dụng ở trên tương ứng với các chữ số 0 - 9 trên bàn phím.
Hình 5: Biểu đồ thời gian/đồng hồ
Trang 10#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config MCLRE = ON // RE3/MCLR pin function select bit (RE3/MCLR pin function is MCLR)
#pragma config CP = OFF // Code Protection bit (Program memory code protection
is disabled)
#pragma config CPD = OFF // Data Code Protection bit (Data memory code protection is disabled)
#pragma config BOREN = OFF // Brown Out Reset Selection bits (BOR disabled)
#pragma config IESO = OFF // Internal External Switchover bit (Internal/External Switchover mode is disabled)
#pragma config FCMEN = OFF // Fail-Safe Clock Monitor Enabled bit (Fail-Safe Clock Monitor is disabled)
#pragma config LVP = OFF // Low Voltage Programming Enable bit (RB3 pin has digital I/O, HV on MCLR must be used for programming)
#pragma config BOR4V = BOR40V // Brown-out Reset Selection bit (Brown-out Resetset to 4.0V)
#pragma config WRT = OFF // Flash Program Memory Self Write Enable bits (Write protection off)
#include <xc.h>
#define _XTAL_FREQ 4000000
unsigned char display_data[4] = {10, 0, 11, 11};
unsigned char alarm_time[4] = {0, 11, 11, 10};
volatile unsigned char button_state = 0;
unsigned char test=0;
unsigned char col=-1,row=-1;
unsigned char set_am_pm=0,alarm_am_pm=0;
volatile unsigned char set_ap=-1,alarm_ap=-1;
unsigned char led_7doan[12] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92,0x82, 0xF8, 0x80, 0x90, 0xBF,0x8E};
Trang 11while(row != 0xF0); do
{
do
{
delay_ms(5); row=PORTB & 0xF0; }
while(row== 0xF0); delay_ms(10); row=PORTB & 0xF0; }
while(row==0xF0); PORTB=0xFE;
Trang 12if (row!=0xF0) {
col=2;
break;
}
PORTB=0xF7; row=PORTB & 0xF0;
if (row!=0xF0) {
return keypad[0][col]; }
if(row==0xD0) {
return keypad[1][col]; }
if(row==0xB0) {
return keypad[2][col]; }
if(row==0x70) {
return keypad[3][col]; }
}
}
char read_interrupt(){
row=-1,col=-1;
row=PORTB & 0xF0; PORTB=0xFE;
Trang 16if(button_state!=1)
break;
count+=1;
if(count==200)
{
countx+=1; count=0; }
if(x>58) x=58; if(countx==(58-x)) {
x=0; count=0; countx=0; display_data[3]+=1; if(display_data[3]>9) {
display_data[3]=0; display_data[2]+=1; if(display_data[2]>5) {
display_data[2]=0; display_data[1]+=1; if((display_data[1]==2)&&(display_data[0]==1)) {
display_data[1]=0; display_data[0]=0; set_am_pm+=1; if(set_am_pm%2==0) set_ap=0; else set_ap=1; }
else if(display_data[1]>9) {
display_data[1]=0; display_data[0]+=1; }
}
}
}
if(RE2==1)
Trang 18if(x==60)
{
x=0; display_data[3]+=1; if(display_data[3]>9) {
display_data[3]=0; display_data[2]+=1; if(display_data[2]>5) {
display_data[2]=0; display_data[1]+=1; if((display_data[1]==2)&&(display_data[0]==1)) {
display_data[1]=0; display_data[0]=0; set_am_pm+=1; if(set_am_pm%2==0) set_ap=0; else set_ap=1; }
else if(display_data[1]>9) {
display_data[1]=0; display_data[0]+=1; }
}
}
RE2=0; break; }
}
}
}
}
}
}
}
}
}
// ALARM TIME //
if(button_state==2) goto alarm_abc;
Trang 21}
Trang 22if(h==11)
{
j=-1;
PORTD=0xff; }
{
RA4=1;
delay_ms(50); RA4=0;
PORTD=0xff;
set_am_pm+=1; if(set_am_pm>0) {
if((set_am_pm%2)==0) {
Trang 24RE0=0;
RE1=1;
alarm_ap=0;
test=0;
Trang 26(display_data[1]==alarm_time[1])&&
(display_data[2]==alarm_time[2])&&
(display_data[3]==alarm_time[3])&&(set_ap==alarm_ap)) {
unsigned char plus_10=alarm_time[2]*10+alarm_time[3]; plus_10=plus_10+10;
test=0;