Skip to main content

Posts

Bài 3: Dùng vi điều khiển 16F887 kết nối với 1 led 7 đoạn anode chung và viết chương trình đếm từ 0 đến 9 với thời gian trễ tuỳ chọn mô phỏng trên Proteus

Sơ đồ mạch: dùng portD kết nối với 1 led 7 đoạn anode chung. Mức logic 1 làm led tắt, mức logic 0 làm led sáng, điện trở hạn dòng cho led là 330Ω. Hình 1. Sơ đồ mạch đếm từ 0 đến 9 dùng led 7 đoạn anode chung Chương trình: #INCLUDE <16F887.H> #FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP #USE DELAY(CLOCK=20M) CONST UNSIGNED CHAR MA7DOAN [10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; SIGNED INT DEM; UNSIGNED INT MA_DEM; VOID MAIN() {     SET_TRIS_D(0x00);    WHILE(TRUE)    {        FOR (DEM=0;DEM<10;DEM++)       {          MA_DEM = MA7DOAN[DEM];          OUTPUT_D(MA_DEM);          DELAY_MS(1000);       }    } } Giải thích chương trình: Sau các lệnh khai báo thư viện, cấu hình và khai báo tần số sử dụng là khai báo mảng chứa mã 7 đoạn và các biến đếm, biến chứa mã. Chương trình chính khởi tạo các portB là xuất, cho vòng lặp for với biến “DEM” chạy từ 0 đến 9, tiến hành giải mã và gởi mã led 7 đoạn tương ứng với biến DEM ra port để hiển thị, delay và lặp lại. Tài liệu tham khảo:

Bài 2: Dùng vi điều khiển 16F887 điều khiển 8 led đơn sáng dần tắt dần từ phải sang trái mô phỏng trên Proteus

Sơ đồ mạch:   Hình 1.  Sơ đồ mạch  điều khiển 8 led đơn sáng dần tắt dần từ phải sang trái Chương trình: #INCLUDE <16F887.H> #FUSES NOWDT,PUT,HS,NOPROTECT,NOLVP #USE DELAY(CLOCK=20M) UNSIGNED INT8 I, X; VOID MAIN() {      SET_TRIS_D(0x00); X=0X00; OUTPUT_D(X); DELAY_MS(500);      WHILE(TRUE)      {            FOR (I=0;I<8;I++)           {                 X = (X<<1)+0X01; OUTPUT_D(X); DELAY_MS(500);           }           FOR (I=0;I<8;I++)           {                 X = (X<<1); OUTPUT_D(X); DELAY_MS(500);           }      } } Giải thích chương trình: Khởi tạo portD là xuất dữ liệu, gán biến X bằng 0x00, xuất giá trị của X ra portD làm 8 led tắt, delay. Vòng lặp for thứ nhất thực hiện 8 lần: tiến hành xoay trái dữ liệu của X và cộng với 0x01. Khi xoay trái dữ liệu thì số 0 được đẩy vào, cộng với 0x01 là để đẩy số 1 vào X. Dữ liệu biến X được xuất ra portD điều khiển led sáng dần, sau 8 lần thì X sẽ bằng 1111_1111 – 8 led sáng hết. Vòng lặp for thứ hai thực hiện

Bài 1: Dùng vi điều khiển 16F887 điều khiển 8 led đơn sáng tắt mô phỏng trên Proteus

Sơ đồ mạch: Hình 1. Sơ đồ điểu khiển led đơn mô phỏng trên Proteus Mạch dùng portD kết nối với 8 led đơn. Mức logic 0 làm led tắt, mức logic 1 làm led sáng.  Chương trình: #INCLUDE <16F887.H> #FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP #USE DELAY(CLOCK=20M) VOID MAIN() {    SET_TRIS_D(0x00);    WHILE(TRUE)    {         OUTPUT_D(0xFF);   DELAY_MS(1000);       OUTPUT_D(0x00); DELAY_MS(1000);    } } Giải thích ý nghĩa chương trình: Hàng thứ nhất “ #INCLUDE <16F887.H> ” là khai báo thư viện đang sử dụng là PIC 16F887. Hàng thứ hai “ #FUSES NOWDT, PUT, HS, NOPROTECT, NOLVP ” là khai báo cấu hình cho PIC. Hàng thứ ba “ #USE DELAY(CLOCK=20M) ” khai báo tần số tụ thạch anh mà vi điều khiển sử dụng, với khai báo trên thì tần số sử dụng là 20MHz. Các hàm định thời là: o DELAY_MS(VALUE) - Thời gian định thời là mili giây. o DELAY_US(VALUE) - Thời gian định thời là µS. Chương trình chính gồm:  Lệnh “ SET_TRIS_D(0x00); ” có chức năng khởi tạo portD là port xuất. Lệnh “ OUTPUT_D(0xFF); ” c