Báo cáo Bài Tập Lớn Hệ thống nhúng đại học Giao Thông Vận TảiVới quá trình công nghiệp hóa hiện đại hóa như hiện nay thì việc áp dụng các công nghệ vi xử lý là một vấn đề khá là quan trọng. Ở học kỳ trước chúng ta đã có học qua môn Vi Xử Lý và ở kỳ này là môn Điều Khiển Nhúng. Với mức độ tiếp cận sâu hơn và tính thực tế cao hơn thì đây là một trong những môn rất quan trọng với các sinh viên của ngành Tự Động Hóa. Với mỗi dòng chip khác nhau thì datasheet của nó lại khác nhau hoàn toàn vì vậy khi chúng ta có thể tìm hiểu vài ba dòng chip rồi thì chúng ta không còn gặp phải khó khăn khi tiếp cận với một dòng chip nào mới cả. Sau một thời gian khá dài học về dòng điều khiển PIC16877A và các bài toán lập trình nhúng thì hôm nay nhóm chúng em đã tổng hợp được những bài lập trình có liên quan để viết nên bài báo cáo này. Trong quá trình làm gặp phải khá nhiều khó khăn nhưng với sự giúp đỡ nhiệt tình của thầy thì chúng em cũng đã hoàn thành được bản báo cáo này. Tuy vậy nhưng trong bản báo cáo này không thể không có sai sót do kiến thức của chúng em còn hạn chế. Rất mong được sự đóng góp của quý thầy cô để bản báo cáo tốt hơn.
TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI KHOA ĐIỆN ĐIỆN TỬ BỘ MÔN ĐIỀU KHIỂN HỌC *********** BÁO CÁO MÔN: HỆ THỐNG ĐIỀU KHIỂN NHÚNG NHÓM Giáo viên hướng dẫn :TS Nguyễn Văn Tiềm Nhóm thực : Đỗ Vương Anh Chu Văn Tưởng : Đinh Đức Lượng Nguyễn Kim Trường : Nguyễn Văn Toàn Cao Văn Hiếu : Ưng Sỹ Sang Nguyễn Anh Tuấn : Trần Văn Thế Nguyễn Xuân Tiến : Tạ Quang Vinh Đỗ Ngọc Hiệp : Trần Ngọc Tuấn Nguyễn Xuân Thao Hà Nội – 27/3/2017 LỜI NĨI ĐẦU Với q trình cơng nghiệp hóa đại hóa việc áp dụng công nghệ vi xử lý vấn đề quan trọng Ở học kỳ trước có học qua mơn Vi Xử Lý kỳ môn Điều Khiển Nhúng Với mức độ tiếp cận sâu tính thực tế cao mơn quan trọng với sinh viên ngành Tự Động Hóa Với dịng chip khác datasheet lại khác hồn tồn tìm hiểu vài ba dịng chip khơng cịn gặp phải khó khăn tiếp cận với dòng chip Sau thời gian dài học dòng điều khiển PIC16877A tốn lập trình nhúng hơm nhóm chúng em tổng hợp lập trình có liên quan để viết nên báo cáo Trong q trình làm gặp phải nhiều khó khăn với giúp đỡ nhiệt tình thầy Tiềm chúng em hồn thành báo cáo Tuy báo cáo khơng thể khơng có sai sót kiến thức chúng em cịn hạn chế Rất mong đóng góp q thầy để báo cáo tốt Chúng em xin chân thành cảm ơn! Mục lục Lời nói đầu Phần I: Khái quát VXL PIC16F877A a Giới thiệu b Sơ đồ khối c Sơ đồ chân chức chân .6 Phần II:CODE- Mơ lập trình nhúng 10 Bài 1: Ngắt – chạy hiệu ứng led 10 Bài 2: Đồng hồ thời gian thực sử dụng Timer 15 Bài 3: Counter – Đếm hiển thị lên LCD 21 Bài 4: Ngắt Timer 1- Chớp tắt led 28 Bài 5: Đèn giao thông sử dụng Timer 32 Bài 6: ADC – Đo nhiệt độ LM35 38 Bài 7: PWM – Điều khiển động DC 44 Bài 8: UART – Truyền thông vi điều khiển máy tính .51 Bài 9: Đo tốc độ điều khiển động Encoder 57 Bài 10: Truyền thông I2C – Master Slave .65 Bài 11: Truyền thông SPI 72 Bài 12: Giao tiếp với Led Matrix 8x8 79 Bài 13: Giao tiếp với Keypad – Máy tính bỏ túi 87 Phần I: Khái quát VXL PIC16F877A a Giới thiệu PIC16F877A có 40/44 chân với cấu trúc sau: • Có PORT xuất/ nhập • Có kênh chuyển đổi A/D • Được bổ sung port tử song song • Có nhớ gap nối so với PIC16F873A/PIC16F874A Tóm tắt đặc điểm PIC16F877A b Sơ đồ khối Sơ đồ khối PIC gồm khối • Khối ALU • Khối nhớ chứa chương trình • Khối nhớ chứa liệu EPROM • Khối nhớ file ghi RAM • Khối giải mã lệnh điều khiển • Khối ghi đặc biệt • Khối ngoại vi timer • Khối giao tiếp nối tiếp • Khối chuyển đổi tín hiệu tương tự sang tín hiệu số • Khối PORT xuất nhập c Sơ đồ chân chức chân • Chân OSC1/CLKI (13): ngõ vào kết nối với mạch dao động thạch anh ngõ vào nhận xung clock bên OSC1: ngõ vào dao động thạch anh ngõ vào nguồn xung bên Ngõ có mạch Schmitt Trigger sử dụng dao động RC CLKI: ngõ vào nguồn xung bên ngồi • Chân OSC2/CLKO (14): ngõ dao động thạch anh ngõ cấp xung clock OSC2: ngõ dao động thạch anh Kết nối với thạch anh cộng hưởng CLKO: chế độ RC, ngõ OSC2 ¼ tần số OSC1 tốc độ chu kỳ lệnh • Chân MCLR/ Vpp (1): có chức MCLR: ngõ vào reset tích cực mức thấp Vpp: lập trình cho PIC đóng vai trị ngõ vào nhận điện áp lập trình • Chân RA0/AN0 (2): có chức RA0: xuất nhập số AN0: ngõ vào tương tự kênh thứ • Chân RA1/AN1 (3): có chức RA1: xuất nhập số AN1: ngõ vào tương tự kênh thứ • Chân RA2/AN2/VREF-/CVREF (4): RA2: xuất nhập số AN2: ngõ vào tương tự kênh thứ VREF- :ngõ vào điện áp chuẩn (thấp) A/D CVREF: Điện áp tham chiếu VREF ngõ so sánh • Chân RA3/AN3/VREF+ (5): RA3: xuất nhập số AN3: ngõ vào tương tự kênh thứ VREF+: ngõ vào điện áp chuẩn (cao) A/D • Chân RA4/TOCKI/C1OUT (6): RA4: xuất nhập số TOCKI: ngõ vào xung clock bên cho timer C1OUT: ngõ so sánh • Chân RA5/AN4/SS/C2OUT (7): RA5: xuất nhập số AN4: ngõ vào tương tự kênh thứ SS: ngõ vào chọn lựa SPI phụ C2OUT: ngõ so sánh • Chân RB0/INT (33): RB0: xuất nhập số INT: ngõ vào nhận tín hiệu ngắt ngồi • Chân RB1 (34): xuất nhập số • Chân RB2 (35): xuất nhập số • Chân RB3/PGC (36): Chân RB3: xuất nhập số PGC: mạch gỡ rối xung clock lập trình ICSP • Chân RB4 (37): xuất nhập số • Chân RB5 (38): xuất nhập số • Chân RB6/PGC (39): RB6: xuất nhập số PGC: mạch gỡ rối xung clock lập trình ICSP • Chân RB7/PGD (40): RB7: xuất nhập số PGD: mạch gỡ rối liệu lập trình ICSP • Chân RC0/T1OCO/T1CKI (15): RC0: xuất nhập số T1OCO: ngõ vào dao động timer1 T1CKI: ngõ vào xung clock bên timer1 • Chân RC1/T1OSI/CCP2 (16): RC1: xuất nhập số T1OSI: ngõ vào dao động timer CCP2: ngõ vào Capture2, ngõ Compare2, ngõ PWM2 • Chân RC2/CCP1 (17): RC2: xuất nhập số CCP1: ngõ vào Capture1, ngõ Compare1, ngõ PWM1 • Chân RC3/SCK/SCL (18): RC3: xuất nhập số SCK: ngõ vào xung clock nối tiếp đồng bộ/ ngõ chế độ SPI SCL: ngõ vào xung clock nối tiếp đồng bộ/ ngõ chế độ I2C • Chân RC4/SDI/SDA (23): RC4: xuất nhập số SDI: liệu vào SPI SDA: xuất/nhập liệu I2C • Chân RC5/SDO (24): RC5: xuất nhập số SDO: liệu SPI • Chân RC6/TX/CK (25): RC6: xuất nhập số TX: truyền bất đồng USART CK: xung đồng USART • Chân RC7/RX/DT (26): RC7: xuất nhập số RX: nhận bất đồng USART DT: liệu đồng USART • Chân RD0/PSP0 (19): RD0: xuất nhập số PSP0: liệu port tớ song song • Chân RD1/PSP1 (20): RD1: xuất nhập số PSP1: liệu port tớ song song • Chân RD2/PSP2 (21): RD2: xuất nhập số PSP2: liệu port tớ song song • Chân RD3/PSP3 (22): RD3: xuất nhập số PSP3: liệu port tớ song song • Chân RD4/PSP4 (27): RD4: xuất nhập số PSP4: liệu port tớ song song • Chân RD5/PSP5 (28): RD5: xuất nhập số PSP5: liệu port tớ song song • Chân RD6/PSP6 (29): RD6: xuất nhập số PSP6: liệu port tớ song song • Chân RD7/PSP7 (30): RD7: xuất nhập số PSP7: liệu port tớ song song • Chân RE0/RD/AN5 (8): RE0: xuất nhập số RD: điều khiển đọc port tớ song song AN5: ngõ vào tương tự kênh thứ • Chân RE1/WR/AN6 (9): RE1: xuất nhập số WR: điều khiển ghi port tớ song song AN6: ngõ vào tương tự kênh thứ • Chân RE2/CS/AN7 (10): RE2: xuất nhập số CS: chip chọn lựa điều khiển port tớ song song AN7: ngõ vào tương tự kênh thứ • Chân VDD (11,32) VSS (12,31): chân nguồn PIC { vaodulieu(hang[i+k+8]); vaodulieu(hang[i+k]); STR=0; //Cấp xung xuất liệu STR=1; DATA=cot[k]; //Bật tắt led delay_ms(5); DATA=0x00; } } } } // -CHẠY CHỮ TỪ TRÁI SANG PHẢI if(LTR==0) //Tương tự { delay_ms(50); while (LTR ==0); for(i=24;i>0;i ) { for(j=0;j