Giáo trình Kỹ thuật vi điều khiển với mục tiêu giúp các bạn có thể mô tả được cấu trúc bên trong, chức năng các chân của họ vi điều khiển PIC 18F4520; Trình bày được các lệnh lập trình C của họ vi điều khiển PIC 18F4520; Trình bày được một số ứng dụng của họ vi điều khiển. Mời các bạn cùng tham khảo!
BỘ CÔNG THƯƠNG TRƯỜNG CAO ĐẲNG CÔNG NGHIỆP VÀ THƯƠNG MẠI GIÁO TRÌNH Tên mơ đun: Kỹ thuật Vi điều khiển NGHỀ: ĐIỆN TỬ CƠNG NGHIỆP TRÌNH ĐỘ TRUNG CẤP/CAO ĐẲNG NGHỀ Ban hành kèm theo Quyết định số: /QĐ-CĐCNPY, ngày tháng năm 2018 Hiệu trưởng trường Cao đẳng Công nghiệp Thương mại Vĩnh Phúc, năm 2018 MỤC LỤC ĐỀ MỤC TRANG MỤC LỤC CHƯƠNG TRÌNH MÔ ĐUN Bài ĐIỀU KHIỂN PIC 18f4520: ĐẶC TÍNH, CẤU TRÚC, CHỨC NĂNG CÁC PORT 1.1 Giới thiệu 1.1.1 Cấu tạo vi điều khiển 1.1.2 Nguyên lý hoạt động Vi điều khiển 1.1.3 Lĩnh vực ứng dụng 11 1.1.4 Sản phẩm dân dụng 12 1.2 Khảo sát vi điều khiển Microchip 12 1.2.1 Cấu hình vi điều khiển PIC 18f4520 12 1.2.2 Cấu trúc vi điều khiển PIC 18f4520 13 1.2.3 Khảo sát sơ đồ chân vi điều khiển PIC 18f4520 15 Bài TỔ CHỨC BỘ NHỚ THANH GHI 22 2.1 Giới thiệu 22 2.2 Kiến trúc nhớ 22 2.3 Tổ chức nhớ vi điều khiển PIC 18f4520 23 2.3.1 Tổ chức nhớ chương trình 23 2.3.2 Khối tạo dao động 24 2.3.3 Khảo sát nhớ liệu ghi trạng thái 26 Bài 3: LẬP TRÌNH ĐIỀU KHIỂN VỚI VĐK PIC 18F4520 30 3.1 Các thành phần ngơn ngữ lập trình C 30 3.1.1 Các kiểu liệu biến 30 3.1.2 Các toán tử 31 3.1.3 Các lệnh C 33 3.2 Trình biên dịch C 36 3.2.1 Các thành phần mở rộng trình biên dịch C 36 3.2.2 Khai báo biến số 37 3.2.3 Khai báo biến truy xuất bit 38 3.2.4 Khai báo trỏ, mảng 39 3.2.5 Khai báo sử dụng hàm 39 3.2.6 Khai báo chương trình phục vụ ngắt 40 3.2.7 Cấu trúc chương trình C cho vi điều khiển PIC 56 3.2.8 File thư viện vi điều khiển PIC 57 3.3 Phần mềm MPLAB_IDE_v8_70 60 Bài 4: PORT XUẤT NHẬP, TIMER – COUNTER 68 4.1 Cấu hình, thơng số điện áp, dịng port 68 4.2 Các ứng dụng dùng port điều khiển vi điều khiển bit 70 4.2.1 Các ứng dụng điều khiển led đơn 70 4.2.2 Các ứng dụng điều khiển led đoạn trực tiếp 73 4.2.3 Các ứng dụng điều khiển led đoạn quét 74 4.2.4 Giao tiếp vi điều khiển bit với LCD 76 4.3 Timer/counter vi điều khiển PIC 18f4520 79 4.3.1 Khảo sát timer vi điều khiển PIC 18f4520 79 4.3.2 Cách truy xuất thành phần timer ngôn ngữ lập trình C 91 4.3.3 Ứng dụng timer/counter vi điều khiển PIC 18f4520 93 a Giao tiếp DS1307 93 b Ứng dụng 1………………………………………………………………………….…98 c Ứng dụng 2………………………………………………………………………… 101 CHƯƠNG TRÌNH MƠ ĐUN Tên mơ đun: KỸ THUẬT VI ĐIỀU KHIỂN Mã mô đun: MĐTC14020040 Thời gian thực mô đun: 75 (Lý thuyết: 15 giờ; Thực hành, thí nghiệm, thảo luận, tập 57 giờ; Kiểm tra : giờ) I Vị trí, tính chất mơ đun - Vị trí: Đây mơ đun chun ngành cho học sinh ngành điện tử, viễn thông Mô đun phải học sau học xong mô đun: Kỹ thuật vi xử lý - Tính chất: Bắt buộc II Mục tiêu mô đun - Kiến thức: + Mô tả cấu trúc bên trong, chức chân họ vi điều khiển PIC 18F4520 + Trình bày lệnh lập trình C họ vi điều khiển PIC 18F4520 + Trình bày số ứng dụng họ vi điều khiển - Kỹ năng: + Lập lưu đồ thuật toán số ứng dụng + Lập trình ngơn ngữ lập trình C nạp vào chip số tập ứng dụng vi điều khiển PIC 18F4520 - Về lực tự chủ trách nhiệm: + Dự lớp đầy đủ theo quy định, rèn luyện tác phong công nghiệp, biết cách làm việc nhóm III Nội dung mơ đun Nội dung tổng quát phân bổ thời gian Thời gian (giờ) Thực hành, Số thí Tên mô đun Kiểm Tổng Lý TT nghiệm, tra số thuyết thảo luận, tập Bài VI ĐIỀU KHIỂN PIC 18f4520: ĐẶC TÍNH, CẤU TRÚC, CHỨC NĂNG CÁC PORT 1.1 Giới thiệu 1.2 Khảo sát vi điều khiển Microchip 12 Bài TỔ CHỨC BỘ NHỚ 16 THANH GHI 2.1 Giới thiệu 4 2.2 Kiến trúc nhớ 2.3 Tổ chức nhớ vi điều khiển PIC 18f4520 Bài LẬP TRÌNH ĐIỀU KHIỂN VỚI VĐK PIC 18F4520, 3.1 Các thành phần ngôn ngữ lập trình C 3.2 Trình biên dịch C 3.3 Phần mềm MPLAB_IDE_v8_70 Bài PORT XUẤT NHẬP, TIMER – COUNTER 4.1 Cấu hình, thơng số điện áp, dịng port 4.2 Các ứng dụng dùng port điều khiển vi điều khiển bit 4.3 Timer/counter vi điều khiển PIC 18f4520 Cộng 20 16 30 23 75 15 27+30 Nội dung chi tiết Bài ĐIỀU KHIỂN PIC 18f4520: ĐẶC TÍNH, CẤU TRÚC, CHỨC NĂNG CÁC PORT (Thời gian: giờ) * Mục tiêu bài: Sau học xong học này, sinh viên - Trình bày sơ đồ câu trúc điều khiển ngoại vi tích hợp vi điều khiển PIC 18f4520 - Phân tích sơ đồ chân vi điều khiển PIC 18f4520 - Cẩn thận, sáng tạo đảm bảo an toàn thiết bị dụng cụ - Nghiêm túc, khoa học, tỉ mỷ * Nội dung bài: 1.1 Giới thiệu 1.2 Khảo sát vi điều khiển Microchip 1.2.1 Cấu hình vi điều khiển PIC 18f4520 1.2.2 Sơ đồ cấu trúc vi điều khiển PIC 18f4520 1.2.3 Khảo sát sơ đồ chân vi điều khiển PIC 18f4520 Bài TỔ CHỨC BỘ NHỚ THANH GHI (Thời gian: 16 giờ) * Mục tiêu bài: Sau học xong học này, sinh viên có thể: - Trình bày kiến trúc nhớ, tổ chức nhớ vi điều khiển PIC 18f4520 - Vẽ tổ chức nhớ vi điều khiển PIC 18f4520 - Khảo sát việc kết nối với linh kiện led đơn, nút nhấn, led đoạn, LCD - Cẩn thận, sáng tạo đảm bảo an toàn thiết bị dụng cụ - Nghiêm túc, khoa học, tỉ mỷ * Nội dung bài: 2.1.Giới thiệu 2.2.Kiến trúc nhớ 2.3.Tổ chức nhớ vi điều khiển PIC 18f4520 2.3.1 Tổ chức nhớ chương trình 2.3.2 Mã lệnh 14 bit 2.3.3 Khảo sát nhớ liệu ghi trạng thái 2.3.4 Bộ nhớ liệu EEPROM Bài 3: LẬP TRÌNH ĐIỀU KHIỂN VỚI VĐK PIC 18F4520 (Thời gian: 20 giờ) * Mục tiêu bài: Sau học xong học này, sinh viên có thể: - Trình bày lệnh vi điêu khiên PIC 18f4520 - Lập trình điều khiển dùng ngơn ngữ C cho hệ thống điều khiển dùng vi điều khiển PIC 18f4520 - Phân tích thư viện vi điều khiển PIC 18f4520 - Cẩn thận, sáng tạo đảm bảo an toàn thiết bị dụng cụ - Nghiêm túc, khoa học, tỉ mỷ * Nội dung bài: 3.1 Các thành phần ngôn ngữ lập trình C 3.1.1 Các kiêu liệu biến 3.1.2 Các toán tử 3.1.3 Các lệnh C 3.2 Trình biên dịch C 3.2.1 Các thành phần mở rộng trình biên dịch C 3.2.2 Khai báo biến số 3.2.3 Khai báo biến truy xuất bit 3.2.4 Khai báo trỏ, mảng 3.2.5 Khai báo sử dụng hàm 3.2.6 Khai báo chương trình phục vụ ngắt 3.2.7 Cấu trúc chương trình C cho vi điêu khiển PIC 3.2.8 File thư viện vi điều khiển PIC 3.3 Phần mềm MPLAB_IDE_v8_70 Bài 4: PORT XUẤT NHẬP, TIMER – COUNTER (Thời gian: 30 giờ) * Mục tiêu bài: Sau học xong học này, sinh viên - Trình bày cấu hình, thơng số điện áp, dịng port vi điều khiển PIC 18f4520 - Trình bày cách truy xuất port điều khiển PIC 18f4520 - Lập trình ứng dụng truy xuất port ngôn ngữ C với LED đơn, thanh, LCD - Lập trình ứng dụng Timer/counter vi điều khiển PIC 18f4520 - Cẩn thận, sáng tạo đảm bảo an toàn thiết bị dụng cụ - Nghiêm túc, khoa học, tỉ mỷ * Nội dung bài: 4.1 Cấu hình, thơng số điện áp, dịng port 4.1.1 Truy xuất port điều khiển vi điều khiển bit 4.1.2 Định cấu hình cho port 4.1.3 Lập trình truy xuất port ngơn ngữ C 4.2 Các ứng dụng dùng port điều khiển vi điều khiển bit 4.2.1 Các ứng dụng điều khiển led đơn 4.2.2 Các ứng dụng điều khiển led đoạn trực tiếp 4.2.3 Các ứng dụng điều khiển led đoạn quét 4.2.4 Giao tiếp vi điều khiển bit với LCD 4.3 Timer/counter vi điều khiển PIC 18f4520 4.3.1 Khảo sát timer vi điều khiển PIC 18f4520 4.3.2 Cách truy xuất thành phần timer ngơn ngữ lập trình C 4.3.3 Ứng dụng timer/counter vi điều khiển PIC 18f4520 Bài ĐIỀU KHIỂN PIC 18f4520: ĐẶC TÍNH, CẤU TRÚC, CHỨC NĂNG CÁC PORT * Mục tiêu - Trình bày sơ đồ cấu trúc điều khiển ngoại vi tích hợp vi điều khiển PIC 18f4520 - Phân tích sơ đồ chân vi điều khiển PIC 18F4520 - Cẩn thận, sáng tạo đảm bảo an toàn thiết bị dụng cụ - Nghiêm túc, khoa học, tỉ mỷ * Nội dung bài: 1.1 Giới thiệu 1.1.1 Cấu tạo vi điều khiển - Vi điều khiển máy tính tích hợp chíp, thường sử dụng để điều khiển thiết bị điện tử Vi điều khiển thực chất gồm vi xử lý có hiệu suất đủ cao giá thành thấp (so với vi xử lý đa dùng máy tính) kết hợp với thiết bị ngoại vi nhớ, mô đun vào/ra, mô đun biến đổi từ số sang tương tự từ tương tự sang số, mô đun điều chế độ rộng xung (PWM) - Vi điều khiển thường dùng để xây dựng hệ thống nhúng Nó xuất nhiều dụng cụ điện tử, thiết bị điện, máy giặt, lị vi sóng, điện thoại, dây truyền tự động - Hầu hết loại vi điều khiển có cấu trúc Harvard loại cấu trúc mà nhớ chương trình nhớ liệu phân biệt riêng - Cấu trúc vi điều khiển gồm CPU, nhớ chương trình (thường nhớ ROM nhớ Flash), nhớ liệu (RAM), định thời, cổng vào/ra để giao tiếp với thiết bị bên ngoài, tất khối tích hợp vi mạch Các loại vi điều khiển thị trường nay: - VDK MCS-51: 8031, 8032, 8051, 8052, - VDK ATMEL: 89Cxx, AT89Cxx51 - VDK AVR AT90Sxxxx - VDK PIC 16C5x, 17C43, 18F4520, 1.1.2 Nguyên lý hoạt động Vi điều khiển Mặc dù có nhiều họ vi điều khiển phát triển nhiều chương trình điều khiển tạo cho chúng, tất chúng có số điểm chung Do ta hiểu cặn kẽ họ việc tìm hiểu thêm họ vi điều khiển hoàn toàn đơn giản Một kịch chung cho hoạt động vi điều khiển sau: - Khi nguồn điện cung cấp, vi điều khiển chip có chương trình nạp sẵn vào khơng có hoạt động xảy - Khi có nguồn điện, hoạt động bắt đầu xảy với tốc độ cao Đơn vị điều khiển logic có nhiệm vụ điều khiển tất hoạt động Nó khóa tất mạch khác, trừ mạch giao động thạch anh Sau vài mili giây tất sẵn sàng hoạt động - Điện áp nguồn nuôi đạt đến giá trị tối đa tần số giao động trở nên ổn định Các bit ghi SFR cho biết trạng thái tất mạch vi điều khiển Toàn vi điều khiển hoạt động theo chu kỳ chuỗi xung - Thanh ghi đếm chương trình (Program Counter) xóa Câu lệnh từ địa gửi tới giải mã lệnh sau thực thi - Giá trị ghi PC tăng lên tồn q trình lặp lại vài … triệu lần giây Hình 1.1 Cấu trúc bên vi điều khiển - Memory (bộ nhớ): ROM/RAM lưu trữ chương trình hay kết trung gian + Read Only Memory (ROM): Read Only Memory (ROM) loại nhớ sử dụng để lưu vĩnh viễn chương trình thực thi Kích cỡ chương trình viết phụ thuộc vào kích cỡ nhớ ROM tích hợp vi điều khiển hay thêm vào chip gắn bên ngoài, tùy thuộc vào loại vi điều khiển Cả hai tùy chọn có số nhược điểm Nếu ROM thêm vào chip bên ngoài, vi điều khiển rẻ chương trình tồn lâu đáng kể Đồng thời, làm giảm số lượng chân vào/ra để vi điều khiển sử dụng với mục đích khác ROM nội thường nhỏ đắt tiền hơn, có thêm ghim sẵn để kết nối với mơi trường ngoại vi Kích thước dãy ROM từ 512B đến 64KB + Random Access Memory (RAM): Random Access Memory (RAM) loại nhớ sử dụng cho liệu lưu trữ tạm thời kết trung gian tạo sử dụng trình hoạt động vi điều khiển Nội dung nhớ bị xóa nguồn cung cấp bị tắt - Electrically Erasable Programmable ROM (EEPROM) (hình 1.2) EEPROM kiểu đặc biệt nhớ có số loại vi điều khiển Nội dung thay đổi trình thực chương trình (tương tự RAM), lưu giữ vĩnh viễn, sau điện (tương tự ROM) Nó thường dùng để lưu trữ giá trị tạo sử dụng trình hoạt động (như giá trị hiệu chuẩn, mã, giá trị để đếm, v.v ), mà cần phải lưu sau nguồn cung cấp ngắt Một bất lợi nhớ trình ghi vào tương đối chậm Hình 1.2 Giao tiếp nhớ - Bộ đếm chương trình (PC:Program Counter): Bộ đếm chương trình chứa địa chỉ đến ô nhớ chứa câu lệnh kích hoạt Sau thực lệnh, giá trị đếm tăng lên Chức CPU tiến hành thao tác tính tốn xử lý, đưa tín hiệu địa chỉ, liệu điều khiển nhằm thực nhiệm vụ người lập trình đưa thơng qua lệnh (Instructions) - CPU-Central Processing Unit(Đơn vị xử lý trung tâm): Chức CPU tiến hành thao tác tính tốn xử lý, đưa tín hiệu địa chỉ, liệu điều khiển nhằm thực nhiệm vụ người lập trình đưa thông qua lệnh (Instructions) + Bộ giải mã lệnh có nhiệm vụ nhận dạng câu lệnh điều khiển mạch khác theo lệnh giải mã Việc giải mã thực nhờ có tập lệnh “instruction set” Mỗi họ vi điều khiển thường có tập lệnh khác 10 Ø Chế độ ghi/đọc lần 16bit Hình 4.7 Timer1 hoạt động chế độ ghi/đọc lần 16bit Trong chế độ ghi/đọc 16 bit lần, byte thấp Timer1 ghi TMR1L, ghi TMR1H trở thành đệm byte cao Khi đọc TMR1L, giá trị byte cao tự động chuyển vào TMR1H, ghi TMR1L, giá trị TMR1H tự động chuyển vào byte cao Hai hoạt động ghi/đọc TMR1L chuyển giá trị byte cao Timer1 với TMR1H diễn thời điểm Điều khiển hoạt động Timer1 nguồn xung cấp cho Timer1 chế độ hoàn toàn giống chế độ ghi/đọc lần bit · Ngắt Timer1 Ngắt Timer1 cho phép bit TMR1IE (thanh ghi PIE1), đặt mức ưu tiên cao/thấp bit TMR1IP (thanh ghi IPR1) Ngắt Timer1 xảy Timer1 tràn, cờ ngắt tràn TMR1IF (thanh ghi PIR1) đặt 88 Ví dụ ứng dụng Timer1 Sử dụng Timer1 chế độ ghi/đọc lần 8bit tạo tần số 50Hz chân RE0 #include #include #include #pragma config OSC = HS #pragma config WDT = OFF #pragma config MCLRE = ON #define xung PORTEbits.RE0 void main() { TRISE=0x00; ADCON1 = 0x0f; //vao so //Khoi che cho Timer1 T1CON = 0b00110000; /*nguon xung noi,doc ghi lan bit, he so chia truoc bang 8*/ xung = 0; while(1) { xung=~xung; TMR1H = (65536-1250)/256; TMR1L = (65536-1250)%256; T1CONbits.TMR1ON = 1; while(!PIR1bits.TMR1IF); //50uS PIR1bits.TMR1IF = 0; T1CONbits.TMR1ON = 0; } } · Lập trình với timer Ví dụ 1: Sử dụng Timer0 chế độ 8bit tạo xung có tần số 1KHz, Ton=Toff chân RA5, sử dụng dao động chế độ HS Các bước thực : Bước 1: Viết chương trình: Lựa chọn nguồn xung hệ thống từ thạch anh chế độ HS Đặt Timer0 chế độ 8bit (T08BIT = 1), hệ số chia tần nguồn xung từ thạch anh Căn vào thạch anh 8MHhz, hệ số chia tần thời gian cần tạo trễ 500 uS để tính giá trị khởi tạo cho đếm -250 (256-250) Ở chế độ bit ghi chứa giá trị đếm TMR0L Sau đếm tràn cần xóa cờ tràn để phát thời điểm tràn lần tràn sau Đảo mức tín hiệu chân RA5 sau 500 uS Dưới chương trình tham khảo: #include #include 89 #include #pragma config OSC = HS // xung he thong o che HS #pragma config WDT = OFF // tat watchdog timer #pragma config MCLRE = ON // cho phep Reset tren chan MCLR #define xung PORTAbits.RA5 void main() { T0CONbits.T08BIT=1; //Timer che bit T0CONbits.PSA=0; //su dung bo chia tan (Prescaler) T0CONbits.T0PS2=0; //He so chia bang T0CONbits.T0PS1=0; T0CONbits.T0PS0=1; T0CONbits.T0CS=0; //Su dung xung tu Fosc/4 ADCON1=0x0f; TRISA = 0x00; xung=1; while(1) { TMR0L = -250; // khoi tao timer (sau 250 xung= 250*2uS timer tran) T0CONbits.TMR0ON=1;// cho phep Timer hoat động while(!INTCONbits.TMR0IF); // cho co tran T0CONbits.TMR0ON = 0; // dung Timer INTCONbits.TMR0IF=0; // xoa co tran xung=~xung } } Bước 2: Kiểm tra Sử dụng máy sóng đo kiểm tra tín hiệu phát từ chân RA5 Testpoint Ví dụ 2: Sử dụng Timer0 chế độ 16 bit, tạo xung có tần số 1Hz (Ton=Toff) chân RC2 Gợi ý thực hiện: Các bước thực ví dụ Một số điểm cần lưu ý: + Đặt Timer0 chế độ 16bit (T08BIT = 0), chọn hệ số chia tần 32 + Ở chế độ 16 bit byte cao nạp sẵn, khởi tạo lại không cần nạp giá trị cho byte cao mà cần nạp cho byte thấp, byte cao tự động nạp lại byte thấp + Sử dụng LED để quan sát máy sóng để kiểm tra Dưới chương trình tham khảo: #include #include #include #pragma config OSC = HS #pragma config WDT = OFF #pragma config MCLRE = ON 90 #define xung PORTCbits.RC2 void main(void) { T0CON = 0b00000100; // Time0 16bit,he so chia tan:32 PORTC = 0x00; TRISC = 0x00; TMR0H=(65536-31250)/256; while(1) { TMR0L=(65536-31250)%256; T0CONbits.TMR0ON=1; // cho phep Timer0 hoat dong while(!INTCONbits.TMR0IF); // cho co tran T0CONbits.TMR0ON=0; // dung Timer0 INTCONbits.TMR0IF=0; // xoa co tran xung=~xung; }; · Bài tập timer Bài tập 1: Viết chương trình tạo xung 50 Hz sử dụng Timer0 Bài tập 2: Viết chương trình tạo xung 5Hz sử dụng Timer0 Bài tập 3: Viết chương trình tạo xung KHz sử dụng ngắt Timer1 Bài tập 4: Viết chương trình tạo xung 1KHz sử dụng Timer0, tạo xung 2KHz sử dụng ngắt từ Timer1 4.3.2 Cách truy xuất thành phần timer ngơn ngữ lập trình C Ứng dụng 1: Sử dụng ngắt Timer0 tạo xung theo yêu cầu sau: Sử dụng Timer0 chế độ 16 bit, tạo xung có tần số 1Hz (Ton=Toff) chân RC2 Gợi ý thực hiện: Các bước thực ví dụ Một số điểm cần lưu ý: + Khởi tạo ngắt Timer0 + Mỗi lần xảy ngắt cần: Xóa cờ ngắt; Dừng Timer; Khởi tạo lại TMR0L; Đảo mức logic RC2 Dưới chương trình tham khảo: #include #include #include #pragma config OSC = HS #pragma config WDT = OFF #pragma config MCLRE = ON #define xung PORTCbits.RC2 void ngat_timer0(void); void ngat_cao(void); #pragma code abc =0x08 void ngat_cao(void) { _asm goto ngat_timer0 _endasm } 91 #pragma code #pragma interrupt ngat_timer0 void ngat_timer0(void) { T0CONbits.TMR0ON=0; // dung Timer0 INTCONbits.TMR0IF=0; // xoa co tran TMR0L=(6553631250)%256; T0CONbits.TMR0ON=1; // cho phep Timer0 hoat dong xung=~xung; } void main(void) { T0CON = 0b00000100; PORTC = 0x00; TRISC = 0x00; INTCONbits.GIE=1; INTCONbits.TMR0IE=1; //cho phep ngat timer0 INTCON2bits.TMR0IP=1; //muc uu tien cao TMR0H=(65536-31250)/256; INTCONbits.TMR0IF=1; //buoc ngat timer0 while(1); } Ứng dụng 2: Sử dụng dây nối hai chân RC0 với RA4 (hình 4.8) Liên tục đọc trạng thái chân RB0 ghi giá trị đọc RA4 Sử dụng Timer1 chế độ đếm kiện, đếm số lần nhấn nút nhấn Key1 hiển thị giá trị đếm dạng số nhị phân LED1÷LED4 Hình 4.8 Sơ đồ mạch điện thực yêu cầu ứng dụng 92 Gợi ý thực hiện: Chọn chiều cho chân RA4, RB4 đến RB7 Chọn chiều vào cho chân RB0 RC0 Chọn đầu vào/ra số cho tất chân Timer1 khởi tạo chế độ đọc/ghi lần 16 bit, nguồn xung từ chân RC0/T1OSO Lặp lại liên tục thao tác: + Đọc từ RB0 xuất RA4 + Đọc giá trị từ đếm, dịch trái bit xuất PORB để thi LED Dưới chương trình tham khảo: #include #include #include #pragma config OSC = HS #pragma config WDT = OFF #pragma config MCLRE = ON void main() { TRISA=0x00; PORTA=0x00; TRISB=0x0f; TRISC=0x01; ADCON1 = 0x0f; //vao so //Khoi che cho Timer1: //TMR1CS=1: chon nguon xung ngoai tu T1OSO/T13CKI //T1CKPS1:T1CKPS0=00: He so chia bang //T1SYNC=1: Khong dong bo //RD16=0: ghi doc lan T1CON = 0b00000110; TMR1H = 0; TMR1L = 0; T1CONbits.TMR1ON = 1; while(1) { PORTAbits.RA4=PORTBbits.RB0; PORTB=TMR1L4)&0x0f)*10)+(x&0x0f); } Chuyển từ số nguyên sang BCD: int int_bcd(int x) { char N[10]={0X00,0X01,0X02,0X3,0X4,0X05,0X06,0X07,0X08,0X09}; int a,b; a=x/10; b=x%10; return ((N[a]4)&0x0f)*10)+(x&0x0f); } int int_bcd(int x) { char N[10]={0X00,0X01,0X02,0X3,0X4,0X05,0X06,0X07,0X08,0X09}; int a,b; a=x/10; b=x%10; return ((N[a]