1. Trang chủ
  2. » Kỹ Thuật - Công Nghệ

Tai lieu thuc hanh VXL

15 505 7
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Tài liệu thực hành VXL
Trường học Đại học Công nghiệp Thực phẩm TP. Hồ Chí Minh
Chuyên ngành Điện tử và Tự động hóa
Thể loại Tài liệu hướng dẫn thực hành
Năm xuất bản 2023
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 15
Dung lượng 322,62 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

thuc hanh vxl

Trang 1

1

Bài 1 : LED đơn trang 2

Bài 2 : ĐÈN GIAO THÔNG HIỂN THỊ THỜI GIAN trang 3 Bài 3 : ĐẾM TỪ 1 SỐ XXXX à 1 SỐ XXXX .trang 5

Bài 4 : HIỂN THỊ 1 SỐ XXXX LÊN LED 7 trang 7

Bài 5 : HIỂN THỊ MATRIX 8x16 ( nối trực tiếp ) trang 8 Bài 6 : HIỂN THỊ LCD 20x4 trang 13

Trang 2

Bài 1 : LED đơn

(LED SÁNG MỨC ‘ 0 ‘)

#include <16f877a.h>

#use delay (clock=4000000) //khai báo thông s ố của thạch anh

#fuses xt // khai báo dùng th ạch anh

#use fast_io(b) //khai báo dùng portb ( quan tr ọng : khi dùng port nào thì khai báo tên port đó )

#use fast_io(c) //khai báo dùng portc

#byte portb=0x06 // địa chỉ của portb trong PIC ( xem datasheet)

#byte portc=0x07 // địa chỉ của portc trong PIC

int8 i; //khai báo bi ến i là biến 8bit

int8 effect01[17]={0b11111111,0b01111111,0b00111111,0b00011111,0b00001111,

0b00000111,0b00000011,0b00000001,0b00000000,0b10000000,

0b11000000,0b11100000,0b11110000,0b11111000,0b11111100,

0b11111110,0b11111111}; //hi ệu ứng chạy đèn sáng dần à tắt dần

int8 effect02[17]={0b11111111,0b01111111,0b00111111,0b00011111,0b00001111,

0b00000111,0b00000011,0b00000001,0b00000000,0b11111110,

0b11111100,0b11111000,0b11110000,0b11100000,0b11000000,

0b10000000,0b00000000}; //hi ệu ứng sáng đèn từ dưới lên à từ trên xuống

void main() // hàm chính ( dùng th ực thi các lệnh chính )

{

set_tris_b(0x00); //khai báo portb xu ất (0) hay nhập (1) , tại đây tất cả portb đều xuất nên tất cả = 0

set_tris_c(0x00); //khai báo portc xu ất (0) hay nhập (1) , tại đây tất cả portc đều xuất nên tất cả = 0

while (true) //hàm l ặp vô hạn các lệnh trong ngoặc { }

{

for(i=0;i<17;i++) //hàm FOR là hàm lặp theo số lần quy định , ở đây hàm for dùng làm để thay đổi thứ tự

{ //hiển thị đèn ứng với các effect bên trên , i lần lượt đếm từ 0à16 ứng với 17 giá trị trong effect

output_b(effect01[i]); //sau khi i chọn giá trị nào trong effect được hiển thị thì lệnh này sẽ xuất ra đèn theo

output_c(effect02[i]); //port mình chọn , tại đây dùng port b&c nên ghi lệnh vậy , nếu đổi port thì sửa lại delay_ms(200); //th ời gian trễ để thực hiện lệnh tiếp theo

}

}

}

Trang 3

3

Bài 2 : ĐÈN GIAO THÔNG HIỂN THỊ THỜI GIAN

Thứ tự cắm chân

B0 à chân G C0 à chân chọn LED 4 cắm LED giao thông theo port d ,

B6 à chân A C3 à chân chọn LED 1 cắm chiều nào cũng OK

(P/S: B0 , C0 là ký hiệu tên của các port VD : B0 là portb.0 ; C0 là portc.0 )

P/S: Để ý chiều của 2 port b và port c , nếu thấy chữ sáng ngược thứ tự thì đổi chiều cắm chân chọn LED , nếu đèn sáng theo thứ tự chọn LED nhưng sáng ko ra số thì thử đổi chiều port b điều khiển LED

Còn phần LED giao thông của port d thì cắm sao cũng dc , nếu cắm ngược trên hình thì chỉ thay đổi thứ thứ tự của 2 hệ thống đèn giao thông

NẾU DÙNG CODE NÀY TRONG PROTEUS THÌ GẮN THÊM CỔNG LOGIC NOT TRƯỚC KHI GẮN DÂY VÀO LED GIAO THÔNG GIỐNG NHƯ GẮN Ở CÁC CHÂN ABCDEFG ( DO ĐÈN GIAO THÔNG TRONG PROTEUS SÁNG MỨC ‘ 1 ‘ )

Có thể thay đổi thời gian tùy ý nhưng phải theo công thức nếu ko sẽ hiển thị sai

ĐỎ 1 = XANH 2 + VÀNG 2

ĐỎ 2 = XANH 1 + VÀNG 1

CODE

#include <16f877a.h>

#use delay(clock=4000000)

#fuses xt

#use fast_io(b) //dùng port b cho 7 chân LED 7 đoạn

#use fast_io(c) //dùng port c cho phần chọn LED 7

#use fast_io(d) //dùng port d cho ph ần hiển thị đèn LED giao thông

#byte portb=0x06 //địa chỉ của 3 port trong PIC ( datasheet )

#byte portc=0x07

Trang 4

#byte portd=0x08

int8 so[10]={0b00000001,0b11001111,0b10010010,0b10000110,0b11001100,

0b10100100,0b10100000,0b10001111,0b10000000,0b10000100}; // mức ‘ 0 ‘ thì LED 7 sáng

int8 i,j,k,chuci,chucj,dvi,dvj; //các biến 8 bit dùng trong code

Void doibcd(); //khai báo hàm con

Void hienthi(); //khai báo hàm con

void main() //hàm chính

{

set_tris_b(0x00); //cực kỳ quan trọng , xem phần này kỹ , lệnh này dùng để khai báo xem port đó dùng để

Set_tris_c(0x00); //xuất hay nhập , ở đây 3 port đều xuất cho nên khai báo tất cả đều ‘ 0 ‘

Set_tris_d(0x00); //không có phần này thì mạch sẽ ko chạy

While(true)

{

for(i=33,j=30;j>0;j ,i ) // ĐỎ 1 = 33s , XANH 2 = 30s // hàm for đếm xuống dùng để cấp giá trị cho hàm // doibcd làm việc // thay đổi thời gian hiển thị đèn giao thông ở đây

// quy ước : i là của hệ thống đèn giao thông 1 , j là của hệ thống đèn giao thông 2

{

output_d(0b00110111); //theo hình thì chân nào = 0 thì chân đó làm đèn sáng

doibcd(); //c ăn cứ theo giá trị i , j để đổi ra giá trị cần hiển thị cho LED 7

For(k=0;k<50;k++) //lenh này làm cho LED 7 đếm nhanh hay chậm ( tăng k lên thì chậm )

Hienthi(); //hiển thị ra LED 7 đoạn các giá trị tương ứng

}

for(i=3,j=3;j>0,i>0;j ,i ) // ĐỎ 1 = 3s , VÀNG 2 = 3s // thay đổi thời gian hiển thị đèn giao thông ở đây

{

output_d(0b01010111);

doibcd();

For(k=0;k<50;k++)

Hienthi();

}

for(i=25,j=28;i>0;j ,i ) // XANH 1 = 25s , ĐỎ 2 = 28 // thay đổi thời gian hiển thị đèn giao thông ở đây

{

output_d(0b11101100);

doibcd();

For(k=0;k<50;k++)

Hienthi();

}

for(i=3,j=3;j>0,i>0;j ,i ) // VÀNG 1 = 3s , ĐỎ 2 = 28 // thay đổi thời gian hiển thị đèn giao thông ở đây

{

output_d(0b11101010);

doibcd();

For(k=0;k<50;k++)

Hienthi();

}

}

}

Void doibcd() // lấy các giá trị i , j phía trên để đổi ra giá trị cho phần hàm hienthi() hoạt động

{

dvi=i%10; // làm tròn các giá trị i

chuci=i/10;

Trang 5

5

dvj=j%10; // làm tròn các giá tr ị j

Chucj=j/10;

}

Void hienthi() lấy giá trị từ phần đổi bcd để hiển thị ra LED 7

{

output_c(0b11111101); // chon LED 7 thứ 2 à ứng với hàng chục của hệ thống đèn giao thông 1

Output_b(so[chuci]); // xuất giá trị hiển thị ra LED 7 ứng với giá trị chuci do hàm doibcd() cung cấp

Delay_ms(2);

output_c(0b11111110); // chon LED 7 th ứ 1 à ứng với hàng đơn vị của hệ thống đèn giao thông 1

Output_b(so[dvi]); // xu ất giá trị hiển thị ra LED 7 ứng với giá trị dvi do hàm doibcd() cung cấp

Delay_ms(2);

output_c(0b11110111); // chon LED 7 th ứ 4 à ứng với hàng chục của hệ thống đèn giao thông 2

Output_b(so[chucj]); // xu ất giá trị hiển thị ra LED 7 ứng với giá trị chucj do hàm doibcd() cung cấp

Delay_ms(2);

output_c(0b11111011); // chon LED 7 th ứ 3 à ứng với hàng đơn vị của hệ thống đèn giao thông 2

Output_b(so[dvj]); // xu ất giá trị hiển thị ra LED 7 ứng với giá trị dvj do hàm doibcd() cung cấp

Delay_ms(2);

}

Bài 3 : ĐẾM TỪ 1 SỐ XXXX à 1 SỐ XXXX

Phần nối dây và lưu ý tương tự phần LED 7 đoạn của ĐÈN GIAO THÔNG

CODE

#include <16f877a.h>

Trang 6

#use delay(clock=4000000)

#fuses xt

#use fast_io(b)

#use fast_io(c)

#byte portb=0x06

#byte portc=0x07

int8 so[10]={0b00000001,0b11001111,0b10010010,0b10000110,0b11001100,0b10100100,

0b10100000,0b10001111,0b10000000,0b10000100}; // LED 7 sáng m ức ‘ 0 ‘

int8 donvi,chuc,tram,ngan; //các bi ến 8 bit dùng trong code

int16 sodem; // vì sodem có giá trị =1000 , nên phải khai báo bằng int16

// nếu <= 255 thì khai báo là int8

// nếu <=65535 thì khai báo là int16

Void Main()

{

Set_tris_b(0x00); //quan tr ọng

Set_tris_c(0x00);

While(true)

{

For(sodem=0;sodem<10000;sodem++) // ĐẾM LÊN // xem P/S bên dưới // cần thay đổi chỉ cần sửa dòng này

{

Donvi=sodem%10; // t ương tự như phần doibcd() của đèn giao thông , dùng cung cấp giá trị cho LED 7

Chuc=(sodem/10)%10; // làm vi ệc

Tram=(sodem/100)%10;

Ngan=(sodem/1000)%10;

output_c(0b11111110);;//chon led don vi

Output_b(so[donvi]);

Delay_ms(10); //thay đổi giá trị để đếm nhanh hay chậm ( càng lớn càng chậm )

output_c(0b11111101);;//chon led chuc

Output_b(so[chuc]);

Delay_ms(10); //thay đổi giá trị để đếm nhanh hay chậm ( càng lớn càng chậm )

output_c(0b11111011);;//chon led tram

Output_b(so[tram]);

Delay_ms(10); //thay đổi giá trị để đếm nhanh hay chậm ( càng lớn càng chậm )

output_c(0b11110111);//chon led ngan

Output_b(so[ngan]);

Delay_ms(10); //thay đổi giá trị để đếm nhanh hay chậm ( càng lớn càng chậm )

}

}

}

P/S: hàm for có nhiệm vụ cung cấp giá trị cho phần đổi ra đơn vị , chục , trăm , ngàn làm việc

Với hàm trên là hàm đếm lên từ 0 à 9999 , để thay đổi giá trị đếm theo ý thích thì làm khai báo theo hàm tổng quát như sau :

Nếu đếm lên

Trang 7

7

For(sodem=xxxx;sodem<yyyy;sodem+ +)

Với xxxx: số lúc đầu

yyyy: số cần đếm đếm + 1

VD:

1) Đếm từ 0 à 1234 ( tương ứng xxxx=0 ; yyyy=1235 )

For(sodem=0;sodem<1235;sodem+ +)

2)Đếm từ 542 à 2145 ( tương ứng xxxx=542 ; yyyy=2146 )

For(sodem=542;sodem<2146;sodem+ +)

Nếu đếm xuống

For(sodem=xxxx;sodem>yyyy;sodem- -)

Với xxxx: số lúc đầu

yyyy: số cần đếm đến - 1

VD:

1)Đếm từ 999 à 0 ( tương ứng xxxx=999 ; yyyy=0 )

For(sodem=999;sodem>0;sodem- -)

2)Đếm từ 4512 à 123 ( tương ứng xxxx= 4512; yyyy=122)

For(sodem=4512;sodem>122;sodem- -)

Bài 4 : HIỂN THỊ 1 SỐ XXXX LÊN LED 7

Hình & nối dây & mức sáng đèn như của bài 3

CODE:

#include <16f877a.h>

#use delay(clock=4000000)

#fuses xt

#use fast_io(b)

#use fast_io(c)

#byte portb=0x06

#byte portc=0x07

int8 so[10]={0b00000001,0b11001111,0b10010010,0b10000110,0b11001100,

0b10100100,0b10100000,0b10001111,0b10000000,0b10000100};

void main()

{

set_tris_b(0);

Set_tris_c(0);

While(true)

{

output_c(0b11110111); // hàng ngàn

Output_b(so[4]); // thay đổi giá trị hiển thị hàng ngàn thì thay đổi số ‘4’ thành số theo ý thích

delay_ms(4);

output_c(0b11111011); // hàng tr ăm

Output_b(so[3]); // thay đổi giá trị hiển thị hàng trăm thì thay đổi số ‘3’ thành số theo ý thích

delay_ms(4);

output_c(0b11111101); // hàng ch ục

Output_b(so[2]); // thay đổi giá trị hiển thị hàng chục thì thay đổi số ‘2’ thành số theo ý thích

delay_ms(4);

Trang 8

output_c(0b11111110); // hàng đơn vị

Output_b(so[1]); // thay đổi giá trị hiển thị hàng đơn vị thì thay đổi số ‘1’ thành số theo ý thích

delay_ms(4);

}

}

Bài 5 : HIỂN THỊ MATRIX 8x16 ( nối trực tiếp )

Phần nối dây cũng tương tự các phần trước , nếu khi nối thấy hiệu ứng đèn ngược với khi test trên protues thì đổi chiều dây cắm

Để ý phần port sữ dụng , đặc biệt là port hàng ( port b ) , vì nếu sai port này thì đèn matrix sẽ ko hoạt động

Sau đây là 1 vài hiệu ứng cơ bản , tuy nhiên các hiệu ứng này là hiệu ứng tĩnh , cho nên chỉ duy trỉ duy nhất 1 trạng thái nhất định và ko thay đổi

Trang 9

9

EFFECT 01

output_b(hang[1]);

output_c(0b01010101);

output_d(0b01010101);

delay_ms(1);

output_b(hang[2]);

output_c(0b10101010);

output_d(0b10101010);

delay_ms(1);

output_b(hang[3]);

output_c(0b01010101);

output_d(0b01010101);

delay_ms(1);

output_b(hang[4]);

output_c(0b10101010);

output_d(0b10101010);

delay_ms(1);

output_b(hang[5]);

output_c(0b01010101);

output_d(0b01010101);

delay_ms(1);

output_b(hang[6]);

output_c(0b10101010);

output_d(0b10101010);

delay_ms(1);

output_b(hang[7]);

output_c(0b01010101);

output_d(0b01010101);

delay_ms(1);

output_b(hang[8]);

output_c(0b10101010);

output_d(0b10101010);

delay_ms(1);

EFFECT 02

output_b(hang[1]);

output_c(0b10101111);

output_d(0b11110101);

delay_ms(1);

output_b(hang[2]);

output_c(0b10101000);

output_d(0b00010101);

delay_ms(1);

output_b(hang[3]);

output_c(0b10101011);

output_d(0b11010101);

delay_ms(1);

output_b(hang[4]);

output_c(0b10101010);

output_d(0b01010101);

delay_ms(1);

output_b(hang[5]);

output_c(0b10101010);

output_d(0b01010101);

delay_ms(1);

output_b(hang[6]);

output_c(0b10101011);

output_d(0b11010101);

delay_ms(1);

output_b(hang[7]);

output_c(0b10101000);

output_d(0b00010101);

delay_ms(1);

output_b(hang[8]);

output_c(0b10101111);

output_d(0b11110101);

delay_ms(1);

EFFECT 03

output_b(hang[1]);

output_c(0b00011011); output_d(0b11101110); delay_ms(1);

output_b(hang[2]);

output_c(0b10111011); output_d(0b11101110); delay_ms(1);

output_b(hang[3]);

output_c(0b10111011); output_d(0b11101110); delay_ms(1);

output_b(hang[4]);

output_c(0b10111011); output_d(0b11101110); delay_ms(1);

output_b(hang[5]);

output_c(0b10111011); output_d(0b11101110); delay_ms(1);

output_b(hang[6]);

output_c(0b10111011); output_d(0b11101110); delay_ms(1);

output_b(hang[7]);

output_c(0b10111011); output_d(0b11101110); delay_ms(1);

output_b(hang[8]);

output_c(0b00011000); output_d(0b01100000); delay_ms(1);

Trang 10

EFFECT 01 ( ‘ 0 ‘ là đèn sáng ) Hiệu ứng sáng xen kẽ

EFFECT 02

EFFECT 03

Trang 11

11

CODE

#include <16f877a.h>

#use delay(clock=4000000)

#fuses xt

#use fast_io(b) //dùng điều khiển hàng chung của 2 matrix 8x8

#use fast_io(c) //dùng cho matrix thứ 1

#use fast_io(d) //dùng cho matrix th ứ 2

#byte portb=0x06

#byte portc=0x07

#byte portd=0x08

int8 hang[9]={0b11111111,0b01111111,0b10111111,0b11011111,0b11101111,

0b11110111,0b11111011,0b11111101,0b11111110}; //phần này dùng để chọn hàng thay

vì ta ghi lệnh [ output_b(0b01111111) ] để chọn hàng 1 thì ta ghi [ output_b(hang[1]) ] , 2 lệnh này tương tự nhau làm cái nào cũng được , trong bài thì dùng cái thứ 2 )

void main()

{

set_tris_b(0x00);

set_tris_c(0x00);

set_tris_d(0x00);

while (true)

{

// ghi vào phần code của EFFECT 01 hay EFFECT 02 hay EFFECT 03 vào đây thì sẽ ra xuất ra matrix 8x16 hiệu ứng tương tự //

}

}

Nguyên tắc hoạt động của code hiệu ứng

Vì cách chọn data theo từng hàng như nhau cho nên ta chỉ phân tích 1 hàng còn các hàng còn lại như nhau:

output_b(hang[1]); //cái này là chọn hàng tương ứng từ 1 đến 8, ta muốn hàng nào sáng thì thay 1 bằng // số hàng tương ứng

output_c(0b01010101); // giá trị hiển thị của đèn , port nào có giá trị = o , thì cột led nối với chân port đó // sẽ sáng ( vì đang chọn hàng 1 nên các đèn thuộc hàng 1 sẽ sáng )

output_d(0b01010101); //tương tự port c

delay_ms(1); thời gian trễ để thực hiện lệnh kế tiếp

Vậy nếu muốn có code chạy hiệu ứng EFFECT 01 thì ta sẽ có code như sau :

#include <16f877a.h>

#use delay(clock=4000000)

#fuses xt

#use fast_io(b)

#use fast_io(c)

#use fast_io(d)

Trang 12

#byte portb=0x06

#byte portc=0x07

#byte portd=0x08

int8 hang[9]={0b11111111,0b01111111,0b10111111,0b11011111,0b11101111,

0b11110111,0b11111011,0b11111101,0b11111110};

void main()

{

set_tris_b(0x00);

set_tris_c(0x00);

set_tris_d(0x00);

while (true)

{

output_b(hang[1]);

output_c(0b01010101);

output_d(0b01010101);

delay_ms(1);

output_b(hang[2]);

output_c(0b10101010);

output_d(0b10101010);

delay_ms(1);

output_b(hang[3]);

output_c(0b01010101);

output_d(0b01010101);

delay_ms(1);

output_b(hang[4]);

output_c(0b10101010);

output_d(0b10101010);

delay_ms(1);

output_b(hang[5]);

output_c(0b01010101);

output_d(0b01010101);

delay_ms(1);

output_b(hang[6]);

output_c(0b10101010);

output_d(0b10101010);

delay_ms(1);

output_b(hang[7]);

output_c(0b01010101);

output_d(0b01010101);

delay_ms(1);

output_b(hang[8]);

output_c(0b10101010);

output_d(0b10101010);

delay_ms(1);

}

}

Trang 13

13

Bài 6 : HIỂN THỊ LCD 20x4

Phần nối dây đặc biệt cẩn thận , bởi vì trong mạch dùng 2 port để sử dụng , bất cứ port nào nối dây sai hay sai chiều đều làm cho LCD ko thể hiển thị đúng hay thậm chí ko thể hiển thị được

Sau khi kiểm tra dây đúng và nạp code nếu bắm reset mà vẫn ko hiển thị đúng thì tắt nguồn của KIT thí

nghiệm và mở lên lại

Nếu ko thấy rõ thì chỉnh tương phản của LCD , đó là cái biến trở đặt dưới LCD

Vị trí trong LCD:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

80 81 82 83 84 85 86 87 88 89 8A 8B 8C 8D 8E 8F 90 91 92 93 C0 C1 C2 C3 C4 C5 C6 C7 C8 C9 CA CB CC CD CE CF D0 D1 D2 D3

94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 D4 D5 D6 D7 D8 D9 DA DB DC DD DE DF E0 E1 E2 E3 E4 E5 E6 E7

Ngày đăng: 14/07/2013, 03:03

HÌNH ẢNH LIÊN QUAN

Còn phần LED giao thông của portd thì cắm sao cũng d c, nếu cắm ngược trên hình thì chỉ thay đổi thứ thứ tự của 2 hệ thống đèn giao thông - Tai lieu thuc hanh VXL
n phần LED giao thông của portd thì cắm sao cũng d c, nếu cắm ngược trên hình thì chỉ thay đổi thứ thứ tự của 2 hệ thống đèn giao thông (Trang 3)

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w