Showing posts with label PIC16F877A CCS. Show all posts
Showing posts with label PIC16F877A CCS. Show all posts

GIAO TIẾP MÁY TÍNH - VB6 - PIC16F877A

6:17:00 AM Add Comment
Chào các bạn hôm nay mình sẽ hướng dẫn các bạn lập trình PIC 16F877A giao tiếp máy tính sử dụng phần mềm visual basic 6 để truyền về nhần dữ liệu. Dưới đây là hình giao diện của visual basic 6 và protues.
giao tiếp máy tính pic16f877a
Để mô phỏng bài này các bạn cần có phần mềm protues và visual basic 6 các bạn có thể tình ở mục download của blog hoặc tải ở link dưới đây bao gồm các phần mềm cần thiết và toàn bộ project của bài này :
- Link download phần mềm protues : Phần mềm protues 8.1 full crack
- Link download phần mềm visual basic 6 : Visual Basic 6
- Link download project : Click here

BÀI 46 : CẢM BIẾN NHIỆT ĐỘ ĐỘ ẨM PIC16F877A CCS

1:28:00 AM Add Comment

1. Module cảm biến độ ẩm và nhiệt độ DHT11

Module cảm biến độ ẩm và nhiệt độ DHT11 là module cảm biến dùng để đo nhiệt độ, độ ẩm và các ứng dụng đo nhiệt độ, độ ẩm khác rất thông dụng hiện nay vì chi phí rẻ và rất dễ lấy dữ liệu thông qua giao tiếp 1 wire (giao tiếp digital 1 dây truyền dữ liệu duy nhất). Bộ tiền xử lý tín hiệu tích hợp trong cảm biến giúp bạn có được dữ liệu chính xác mà không phải qua bất kỳ tính toán nào.

2. Thông số kỹ thuật:

Ø  Nguồn: 3 -> 5 VDC.

Ø  Chuẩn giao tiếp: TTL, 1 wire

Ø  Dòng sử dụng: 2.5mA max (khi truyền dữ liệu).

Ø  Đo tốt ở độ ẩm 20-80%RH với sai số 5%.

Ø  Đo tốt ở nhiệt độ 0 to 50°C sai số ±2°C.

Ø  Tần số lấy mẫu tối đa 1Hz (1 giây 1 lần)

Ø  Kích thước 15mm x 12mm x 5.5mm.

Ø  chân, khoảng cách chân 0.1''.

Hình ảnh DHT11 ngoài thực tế

- Đây là ảnh mô phỏng protues.

dht11 pic16f877a ccs

-
Link download project :  Click here

BÀI 45 : GIAO TIẾP VỚI GLCD PIC16F877A CCS

4:02:00 PM Add Comment
Chào các bạn trong bài đăng này mình sẽ hướng dẫn các bạn giao tiếp với GLCD. Trước tiên mình tìm hiểu về lý thuyết trước.

Graphic LCD được sử dụng trên mạch BKIT PIC là loại LCD chấm, không màu, có độ phân giải 128x64 tức 8192 chấm.

14.1 Giới thiệu GLCD 128x64 Graphic LCD được sử dụng trên mạch BKIT PIC là loại LCD chấm, không màu, có độ phân giải 128x64 tức 8192 chấm. GLCD được thiết kế để điều khiển được từng chấm, nên có thể dùng để hiển thị bất kỳ ký tự hay hình ảnh nào. Với mỗi chấm tương ứng một bit dữ liệu, GLCD 128x64 cần 8192 bits RAM hay 1024 bytes RAM để hiển thị toàn màn hình.
Loại GLCD YM12864J sử dụng 2 chip điều khiển KS0108 rất phổ biến của Samsung, mỗi chip có 512 bytes RAM. Do đó, nó tương tự như 2 LCD 64x64 ghép lại với nhau.

Hình 15.1 GLCD 128x64

14.1.1 Chức năng các chân của GLCD 128x64 Chức năng các chân:

Các chân từ 4 đến 17 được kết nối trực tiếp đến vi điều khiển. Các chân còn lại được kết nối tùy theo chức năng tương ứng của nó.

Chân EN Khi thực hiện một quá trình giao tiếp với GLCD, ban đầu, chân EN được kéo xuống thấp. Trong khi đó, các chân điều khiển khác được thiết lập. Sau khi thiết lập xong, chân EN được kích lên mức cao để cho phép tín hiệu. Sau khoảng thời gian cần thiết cho quá trình hoàn tất, chân EN lại được kéo xuống thấp để sẵn sàng cho một quá trình khác. Chân RS và RW Hai chân này được kết hợp để thiết lập cho các thanh ghi của GLCD theo bảng sau:

Chân CS1 và CS2 Chọn chip điều khiển GLCD – KS0108 để giao tiếp, tích cực mức cao. 14.1.2 Tổ chức bộ nhớ RAM Chip điều khiển GLCD KS0108 chỉ có một loại bộ nhớ là RAM, không có bộ nhớ chứa bộ font CGROM hay chứa mã font tự tạo CGRAM như của Text LCD. Dữ liệu ghi vào RAM sẽ được hiển thị trực tiếp trên GLCD. Mỗi chip KS0108 có 512 bytes RAM tương ứng với 4096 chấm trên một nửa (64x64) LCD. RAM của KS0108 được truy cập theo từng byte, nghĩa là mỗi lần viết một giá trị vào một byte nào đó trên RAM của GLCD, sẽ có 8 chấm bị tác động, 8 chấm này nằm trên cùng 1 cột. Do đó, 64 dòng GLCD được chia thành 8 pages, mỗi page có độ cao 8 bit và rộng 128 cột (tính cả 2 chip).
Sơ đồ bố trí RAM:


Hình 15 2 Sơ đồ bố trí RAM của GLCD 128x64
Với mỗi chip KS0108, RAM chia thành 8 page, mỗi page bao gồm 64 cột, mỗi cột bao gồm 8 chấm. Các page được gọi là địa chỉ X, mang giá trị từ 0 đến 7, X = 0 tương ứng với page 0 và tương tự. Các cột được gọi là địa chỉ Y, cột đầu tiên có giá trị Y = 0 và cột cuối cùng có giá trị Y = 63. Mỗi cột là một byte RAM, D0 đến D7, với D0 tương ứng điểm trên cao và D7 tương ứng điểm bên dưới. Các lệnh di chuyển được hỗ trợ theo cặp địa chỉ X, Y.
Minh họa hiển thị ký tự “a” trên GLCD:


Hình 15.3 Ký tự "a" trên GLCD
Như hình trên, ký tự “a” được xác định bằng cách ghi dữ liệu vào X = 0 và Y = 0...7 theo bảng sau:

Hình 15.4 Dữ liệu RAM cho ký tự "a"
Giá trị Data là các giá trị cần nạp cho vùng RAM tương ứng. 14.1.3 Các lệnh của GLCD 128x64Bảng lệnh
1. Lệnh hiển thị ON/OFF Dữ liệu được hiển thị lên màn hình khi bit D (DB0) bằng 1 và ngược lại khi D bằng 0. Khi D bằng 0, dữ liệu vẫn tồn tại trong DDRAM.
Lập trình:
• RW = 0
• RS = 0
• Opcode = 0x3E + D (D = 0:1) 2. Hiển thị Start Line Chọn một dòng nào đó của RAM để làm dòng đầu tiên được hiển thị lên, nghĩa là “cuộn” hình ảnh trong RAM lên một khoảng LOffset, với LOffset có giá trị từ 0 đến 63. Phần bị che khuất khi cuộn sẽ được hiển thị tiếp ngay bên dưới. Ví dụ với LOffset = 20:

Không có văn bản thay thế tự động nào.
Hình 15.5 Cuộn lên 20 dòng
Lập trình:
• RS = 0
• RW = 0
• Opcode = 0xC0 + LOffset 3. Thiết lập trang (địa chỉ X) Thiết lập địa chỉ X để truy xuất RAM.
Lập trình:
• RS = 0
• RW = 0
• Opcode = 0xB8 + X 4. Thiết lập địa chỉ Y Thiết lập địa chỉ Y để truy xuất RAM.
Lập trình:
• RS = 0
• RW = 0
• Opcode = 0x40 + Y 5. Đọc trạng thái Đọc trạng thái của GLCD, chủ yếu kiểm tra bit BUSY (bit 7).
Lập trình:
• RS = 0
• RW = 1 6. Ghi dữ liệu hiển thị Ghi dữ liệu vào RAM tại địa chỉ X, Y. Sau khi ghi xong, giá trị Y sẽ tự động được tăng lên 1 đơn vị, chuyển sang cột tiếp theo hoặc trở về cột đầu tiên, tức Y = 0.
Lập trình:
• RS = 1
• RW = 0 7. Đọc dữ liệu hiển thị Đọc dữ liệu từ RAM tại địa chỉ X, Y. Sau khi đọc xong, giá trị Y sẽ tự động được tăng lên 1 đơn vị, chuyển sang cột tiếp theo hoặc trở về cột đầu tiên, tức Y = 0.
Lập trình:
• RS = 1
• RW = 1
14.2 Xây dựng chương trình14.2.1 Khởi tạo graphic LCD Quá trình khởi tạo được thực hiện như sau:

  • Khởi tạo các chân liên kết với glcd(thiết lập input/output).
  • Chọn chip điều khiển thứ nhất.
  • Thiết lập chân RS ở chế độ ghi lệnh.
  • Gửi lệnh bât màn hình (0x3F).
  • Gửi lệnh để thiết lập địa chỉ Y (0x40 + Y).
  • Gửi lệnh để thiết lập địa chỉ X (địa chỉ trang) (0xB8 + X).
  • Gửi lênh chọn dòng nào trong RAM để hiển thị lên.
  • Làm tương từ bước thứ 2 cho chip thứ 2.
Tương ứng với từng lệnh trên trong chương trình như sau:
Code:
glcd_write_byte(GLCD_ON_DISPLAY); glcd_write_byte(GLCD_SET_Y_ADDR); glcd_write_byte(GLCD_SET_PAGE); glcd_write_byte(GLCD_START_LINE);
Với các tham số truyền vào có giá trị như sau:
Code:
#define GLCD_ON_DISPLAY 0x3F // DB0: turn display on #define GLCD_START_LINE 0xC0 // 11XXXXXX: set lcd start line #define GLCD_SET_PAGE 0xB8 // 10111XXX: set lcd page (X) address #define GLCD_SET_Y_ADDR 0x40 // 01YYYYYY: set lcd Y address
14.2.2 Ghi dữ liêu lên GLCDHàm ghi dữ liêu(một byte) có thể viết như sau:
Code:
GLCD_CTRL_PORTbits.GLCD_CTRL_RW = 0;// chế độ ghi GLCD_DATA_PORT = abyte; // ghi dữ liệu GLCD_CTRL_PORTbits.GLCD_CTRL_E = 1;// sau khi ghi bật chân EN lên 1 để cho phép tín hiệu _nop();_nop();_nop(); GLCD_CTRL_PORTbits.GLCD_CTRL_E = 0;// cho chân EN xuống 0 lại để chuẩn bị cho lần thiết lập tiếp theo _nop();_nop();_nop();
Các bạn download code mẫu và file mô phỏng ở trên theo link này : Click here

CHIA SẼ CÁCH TÍNH TOÁN TẠO XUNG TIMER

11:41:00 PM Add Comment
Chào các bạn hôm nay mình sẽ chia sẽ cho các bạn cách tính toán tạo xung cho timer 0, 1, 2 để giúp các bạn tiết kiệm thời gian trong việc tính toán và chia sẽ thêm cho các bạn 1 phần mềm cũng rất hữu ích đó là phần mềm đọc giá trị điện trở.
Link download phần mềm và tài liệu : Click here

BÀI 44 : ĐÈN GIAO THÔNG NGÃ TƯ PIC16F877A CCS FULL

1:59:00 AM 18 Comments
Chào các bạn trong bài đăng trước mình đã hướng dẫn các bạn về đèn giao thông ngã tư nhưng là chạy 1 cách tư động nên trong bài này hướng dẫn các bạn điều khiển bằng nút nhấn nha !
Ảnh mô phỏng protues.
đèn giao thông ngã tư pic16f877a
Đây là code chương trình.
#include <16f877a.h>
#use delay (clock=4000000)
#use fast_io(d)
#use fast_io(b)
#use fast_io(c)
#use fast_io(a)
#byte portd=0x08
#bit ra0=0x05.0 // Binh thuong
#bit ra1=0x05.1 // Gio cao diem
#bit ra2=0x05.2 // Ban dem
#bit ra3=0x05.3 // Nut chuyen che do
#bit rb0=0x06.0 // led1
#bit rb1=0x06.1 // led2
#bit rb2=0x06.2 // led3
#bit rb3=0x06.3 // led4
#bit rc0=0x07.0 // x1
#bit rc1=0x07.1 // v1
#bit rc2=0x07.2 // d1
#bit rc3=0x07.3 // x2
#bit rc4=0x07.4 // v2
#bit rc5=0x07.5 // d2
#define bat 1
#define tat 0
//--------------------------------
int m[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int num1,donvi1,chuc1;
int num2,donvi2,chuc2;
//---------------------delay-------------
void delay(int ms)
 {
  int a,b;
  for(a=0;a<ms;a++)
   for(b=0;b<50;b++)
    {
    }
 }
//-------------hien thi---------------------
void ht1(void)
 {
  int c;
  for(c=0;c<50;c++)
   {
   chuc1=num1/10;
   donvi1=num1%10;
   output_d(m[chuc1]);
   rb2=bat;
   delay(10);
   rb2=tat;
   output_d(m[donvi1]);
   rb3=bat;
   delay(10);
   rb3=tat;
   chuc2=num2/10;
   donvi2=num2%10;
   output_d(m[chuc2]);
   rb0=bat;
   delay(10);
   rb0=tat;
   output_d(m[donvi2]);
   rb1=bat;
   delay(10);
   rb1=tat;
   }
 }

void main(void)

 {
 set_tris_d(0x00);
 set_tris_b(0xff);
 set_tris_c(0x00);
 set_tris_a(0xff);
 output_d(0xFF);
 rc0=tat;
 rc5=tat;
 rc1=tat;
 rc2=tat;
 rc3=tat;
 rc4=tat;
  while(true)
   {
///--------------che do binh thuong -----------------   
   if(!ra0)
   {
   delay_ms(100);
   while(!ra0)
   {
   binhthuong:
    num1=35;
    num2=30;
    do
    { 
     set_tris_b(0x00);
     rc0=bat;
     rc5=bat;
     rc1=tat;
     rc2=tat;
     rc3=tat;
     rc4=tat;
     ht1();
     num1--;
     num2--;
    }
                  while(num2!=0);
                  num2=num1=5;
                  do
                   {
                   set_tris_b(0x00);
                   rc1=bat;
                   rc5=bat;
                   rc0=tat;
                   rc2=tat;
                   rc3=tat;
                   rc4=tat;
                   ht1();
                   num1--;
                   num2--;
                   }
     while(num2!=0);
     num1=30;
     num2=35;
     do
     {
     set_tris_b(0x00);
     rc2=bat; 
     rc3=bat;
     rc0=tat;
     rc1=tat;
     rc4=tat;
     rc5=tat;
     ht1();
     num1--;
     num2--;
     }
                   while(num1!=0);
                   num1=num2=5;
                    do
                     {
                   set_tris_b(0x00);
                   rc2=bat;
                   rc4=bat;
                   rc0=tat;
                   rc1=tat;
                   rc3=tat;
                   rc5=tat;
                   ht1();
                   num1--;
                   num2--;
                      }
                  while(num1!=0);
                  goto binhthuong;
    }
    }
//---------------gio cao diem--------------------------    
   if(!ra1)
   {
   delay_ms(100);
   while(!ra1)
   {
    caodiem:
    num1=60;
    num2=55;
    do
    { 
     set_tris_b(0x00);
     rc0=bat;
     rc5=bat;
     rc1=tat;
     rc2=tat;
     rc3=tat;
     rc4=tat;
     ht1();
     num1--;
     num2--;
    }
                  while(num2!=0);
                  num2=num1=5;
                  do
                   {
                   set_tris_b(0x00);
                   rc1=bat;
                   rc5=bat;
                   rc0=tat;
                   rc2=tat;
                   rc3=tat;
                   rc4=tat;
                   ht1();
                   num1--;
                   num2--;
                   }
     while(num2!=0);
     num1=55;
     num2=60;
     do
     {
     set_tris_b(0x00);
     rc2=bat; 
     rc3=bat;
     rc0=tat;
     rc1=tat;
     rc4=tat;
     rc5=tat;
     ht1();
     num1--;
     num2--;
     }
                   while(num1!=0);
                   num1=num2=5;
                    do
                     {
                   set_tris_b(0x00);
                   rc2=bat;
                   rc4=bat;
                   rc0=tat;
                   rc1=tat;
                   rc3=tat;
                   rc5=tat;
                   ht1();
                   num1--;
                   num2--;
                      }
                  while(num1!=0);
                  goto caodiem;
    }
    }
    
//-------------------ban dem---------------
   if(!ra2)
   {
   delay_ms(100);
   while(!ra2)
   {
                   dem:
                   rc4=bat;
                   rc1=bat;
                   delay_ms(1000);
                   rc4=tat;
                   rc1=tat;
                   goto dem;
   }
   }
//---------------------- ket thuc chuong trinh ----------------------
   }
 }  
Link download project : Click here

BÀI 43 : ĐÈN GIAO THÔNG NGÃ TƯ PIC17F877A CCS P1

1:54:00 AM 6 Comments
Chào các bạn trong bài đăng này mihf sẽ hướng dẫn các bạn làm 1 ứng dụng nhỏ sử dụng PIC16F877A đó là đèn giao thông ngã tư.
Đây là ảnh mô phỏng protues.
đèn giao thông ngã 4 pic16f877a ccs
Đây là code chương trình.
#include <16f877a.h>
#use delay (clock=4000000)
#use fast_io(d)
#use fast_io(b)
#use fast_io(c)
#byte portd=0x08
#bit rb0=0x06.0 // led1
#bit rb1=0x06.1 // led2
#bit rb2=0x06.2 // led3
#bit rb3=0x06.3 // led4
#bit rc0=0x07.0 // x1
#bit rc1=0x07.1 // v1
#bit rc2=0x07.2 // d1
#bit rc3=0x07.3 // x2
#bit rc4=0x07.4 // v2
#bit rc5=0x07.5 // d2
#define bat 1
#define tat 0
//=================
int m[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
int num1,donvi1,chuc1;
int num2,donvi2,chuc2;
//============delay=====
void delay(int ms)
 {
  int a,b;
  for(a=0;a<ms;a++)
   for(b=0;b<120;b++)
    {
   }
 }
//=========hien thi=============
void ht1(void)
 {
  int c;
  for(c=0;c<40;c++)
   {
   chuc1=num1/10;
   donvi1=num1%10;
   output_d(m[chuc1]);
   rb2=bat;
   delay(10);
   rb2=tat;
   output_d(m[donvi1]);
   rb3=bat;
   delay(10);
   rb3=tat;
   chuc2=num2/10;
   donvi2=num2%10;
   output_d(m[chuc2]);
   rb0=bat;
   delay(10);
   rb0=tat;
   output_d(m[donvi2]);
   rb1=bat;
   delay(10);
   rb1=tat;
   }
 }
//=========ham chinh==========
void main(void)
 {
 set_tris_d(0x00);
 set_tris_b(0xff);
 set_tris_c(0x00);
  while(true)
   { 
    num1=30;
    num2=35;
    do
    { 
     set_tris_b(0x00);
     rc0=bat;
     rc5=bat;
     rc1=tat;
     rc2=tat;
     rc3=tat;
     rc4=tat;
     ht1();
     num1--;
     num2--;
    }
                  while(num1!=0);
                  num1=num2=5;
                  do
                   {
                   set_tris_b(0x00);
                   rc1=bat;
                   rc5=bat;
                   rc0=tat;
                   rc2=tat;
                   rc3=tat;
                   rc4=tat;
                   ht1();
                   num1--;
                   num2--;
                   }
     while(num1!=0);
     num1=35;
     num2=30;
     do
     {
     set_tris_b(0x00);
     rc2=bat; 
     rc3=bat;
     rc0=tat;
     rc1=tat;
     rc4=tat;
     rc5=tat;
     ht1();
     num1--;
     num2--;
     }
                   while(num2!=0);
                   num1=num2=5;
                    do
                     {
                   set_tris_b(0x00);
                   rc2=bat;
                   rc4=bat;
                   rc0=tat;
                   rc1=tat;
                   rc3=tat;
                   rc5=tat;
                   ht1();
                   num1--;
                   num2--;
                      }
                  while(num1!=0);
   }
}  
Link download project : Click here

BÀI 42 : DS1307 PIC16F877A CCS

8:47:00 PM Add Comment
Trong file download bên dưới có nhiều project về DS1307 và I2C với PIC16F877A VÀ 8051 các bạn download về tham khảo nha !
(Nguồn lý thuyết : ytuongnhanh.vn)
1. Giới thiệu:
IC thời gian thực (RTC) DS1307 có thể đếm giờ, phút, giây, thứ, ngày tháng, năm. Giao tiếp với vi điều khiển thông qua chuẩn I2C, và đóng vai trò là slave khi kết nối đến Bus I2C này. Có thể đếm thời gian theo định dạng 24 giờ hoặc 12 giờ với chỉ thị AM/PM. Ngoài ra bên trong chíp có bộ dò phát hiện mất nguồn và tự động chuyển sang sử dụng nguồn Pin dự phòng.

2. Sơ đồ chân:
Trong đó:
ChânTênChức năng
1X1Kết nối đến thạch anh  32.768Khz làm nguồn dao động cho chip
2X2
3VBatKết nối đến cực dương của Pin dự phòng, có điện áp tiêu chuẩn khoảng 3V
4GNDKết nối đến mass
5SDAChân dữ liệu khi kết nối đến bus I2C
6SCLChân nhận xung clock đồng bộ khi kết nối bus I2C
7SQW/OUTNgõ xuất xung vuông, tần số có thể lập trình để thay đổi từ 1Hz, 4Khz, 8 Khz, 32 Khz
8VCCNguồn cấp chính, khoảng 5VDC
 3. Lấy thông tin về thời gian và lịch
Bảng 1 là địa chỉ của các thanh ghi RAM và thanh ghi RTC của DS 1307. Thanh ghi RTC có địa chỉ từ 00-07h. các thanh ghi RAM chiếm địa chỉ từ 08h - 3Fh
Các thông tin về thời gian và lịch thu được bằng cách đọc các byte trong thanh ghi tương ứng. Thời gian và lịch được thiết lập hoặc khởi tạo bằng cách viết các byte thanh ghi thích hợp. Lưu ý dữ liệu lưu thời gian chứa trong thanh ghi đều theo định dạng BCD. Thứ trong tuần thay đổi tại lúc nữa đêm, lưu dưới dạng con số (Ví dụ 1 là Chủ Nhật, 2 là Thứ hai, 3 là thứ 3 ...). Khi lần đầu tiên IC được cấp nguồn các thanh ghi thời gian và lịch reset về 01/01/00 01 00:00:00. (MM/DD/YY DOW HH:MM:SS)
- Ảnh mô phỏng protues.
ds1307 8051
- Link download project Click here