Nhóm 1– Đ3dtvt TRƯỜNG ĐẠI HỌC ĐIỆN LỰC
KHOA ĐIỆN TỬ - VIỄN THÔNG
BÁO CÁO
THỰC TẬP MÔN VI XỬ LÝ
Đề tài : Led Cube 8x8x8
Giáo viên hướng dẫn: Hoàng Văn Đông
Sinh viên : NHÓM 1
Đinh Việt An
Phạm Văn Đông
Vũ Chung Kiên
Lớp : D3_DTVT
Nhóm 1– Đ3dtvt Giới Thiệu Chung
1. Sự khác nhau giữa vi xử lý và vi điều khiển
Vi xử lý, ví dụ như con chip intel hay ADM trong các máy tính thông thường,nó
không có RAM,ROM,cổng IO và các thiết bị ngoại vi on chip. Còn vi điều khiển chứa
một bộ vi xử lý,RAM,ROM,cổng IO và có thể chứa các thiết bị ngoại vi. Trong bài thực
hành này chúng ta chỉ nghiên cứu về vi điều khiển.
2. Giới thiệu về dòng AT89C51
P2 từ chân 21 - 28 tương ứng là các chân P2_0 - P2_7
P3 từ chân 10 - 17 tương ứng là các chân P3_0 - P3_7
Riêng công 3 có 2 chức năng ở mỗi chân như hình vẽ:
P3.0 – RxD : chân nhận dữ liệu nối tiếp khi giao tiếp RS232(Cổng COM ).
P3.1 _ TxD : phân truyền dữ liệu nối tiếp khi giao tiếp RS232.
P3.2 _ INTO : interrupt 0 , ngắt ngoài 0.
P3.3 _ INT1: interrupt 1, ngắt ngoài 1.
P3.4 _T0 : Timer0 , đầu vào timer0.
P3.5_T1 : Timer1, đầu vào timer 1.
P3.6_ WR: Write, điều khiển ghi dữ liệu.
Nhóm 1– Đ3dtvt
P3.7 _RD: Read , điều khiển đọc dữ liệu.
Chân 18,19 nối với thạch anh tạo thành mạch dao động cho vi điều khiển. Nhóm 1– Đ3dtvt
BÀI 1 : ĐIỀU KHIỂN IO VỚI LED ĐƠN
1. Lắp mạch
2. Nguyên lý hoạt động
Led nối từ chân vi điều khiển xuống đất vậy nếu chân vi điều khiển là 5V đèn sẽ
sáng,0V đèn tắt.
3. Lập trình
Trước hết điều khiển 1 LED,để điều khiển 1 LED ta chỉ việc gán chân nối đất của
LED đó với 0 hoặc 1 thì điện áp ở chân đó sẽ là 0V hoặc 5V tương ứng với điện áp đèn
sẽ sang hoặc tắt.Làm tương tự với các chân còn lại của vi điều khiển ta sẽ có một dãy các
đèn LED sang theo ý muốn. Ở đây ta sẽ điều khiển 8 LED.
CODE:
tre(1000);
led2=tat;
tre(1000);
led3=bat;
tre(1000);
led3=tat;
tre(1000);
led4=bat;
tre(1000);
led4=tat;
tre(1000);
led5=bat;
tre(1000);
led5=tat;
tre(1000);
led6=bat;
tre(1000);
led6=tat;
tre(1000);
led7=bat;
tre(1000);
led7=tat;
tre(1000);
led8=bat;
tre(1000);
led6=bat;
tre(1000);
led6=tat;
tre(1000);
led5=bat;
tre(1000);
led5=tat;
tre(1000);
led4=bat;
tre(1000);
led4=tat;
tre(1000);
Nhóm 1– Đ3dtvt
led3=bat;
tre(1000);
led3=tat;
tre(1000);
led2=bat;
tre(1000);
led2=tat;
tre(1000);
led1=bat;
tre(1000);
}
/*******************************************/
void main()
{
while(1)
{
P2=0xFF;tre(5000);
P2=0xFE;tre(5000);
P2=0xFD;tre(5000);
P2=0xFB;tre(5000);
P2=0xF7;tre(5000);
P2=0xEF;tre(5000);
P2=0xDF;tre(5000);
P2=0xBF;tre(5000);
P2=0x7F;tre(5000);
P2=0x7f;tre(10000);
P2=0xBF;tre(10000);
P2=0xDF;tre(10000);
P2=0xEF;tre(10000);
P2=0xF7;tre(10000);
P2=0xFB;tre(10000);
P2=0xFD;tre(10000);
P2=0xFE;tre(10000);
P2=0x7e;tre(5000);
P2=0xBD;tre(5000);
P2=0xDB;tre(5000);
3. Lập trình
- Cách 1 : giống như bài thứ nhất, lập trình dễ hiểu không cần tính toán nhưng phải
viết copy,past và chỉnh sửa nhiều
- Cách 2 : cũng giống như ở bài trên chúng ta điều khiển từng cổng không theo từng
chân như ở cách 1,tuy nhiên phải tính toán nhiều.
Ở đây chúng ta sẽ làm theo cách 2,ta có code sau:
#include <REG2051.H>// dinh nghia
//khai bao bien toan cuc
unsigned char i;
unsigned char so_dem[] =
{0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};
//so 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
unsigned char so_dem2[] = {0x00
,0x10,0x20,0x30,0x40,0x50,0x60,0x70,0x80,0x90};
//so 0, 1, 2, 3, 4, 5, 6, 7, 8, 9
//chuong trinh con
void taotre(long time )
{
int n;
for(n=0;n<time;n++);
}
//chuong trinh chinh
void main(void)
{
unsigned char j=0; //khai bao bien
P1 = 0x00;
while(1) //tao vong lap 99
{
for(i=0;i<10;i++) //chay dem
điều khiển cũng có thể điều khiển được 16 phím bấm
- Có hai cách quét phím theo cột và theo hàng. Ở đây, chúng ta chọn cách quét phím
theo hàng.
- Bước 1: Ta đưa chân P3.0 nối hàng 1 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 1 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 2 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 3 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 4 được bấm thì cột 4_P3.7 sẽ có
giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
- Bước 2: Ta đưa chân P3.1 nối hàng 2 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 5 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 6 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 7 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 8 được bấm thì cột 4_P3.7 sẽ có
giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
Nhóm 1– Đ3dtvt
- Bước 3: Ta đưa chân P3.2 nối hàng 3 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 8 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 9 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 10 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 11 được bấm thì cột 4_P3.7 sẽ
có giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
- Bước 4: Ta đưa chân P3.3 nối hàng 4 xuống 0V. Rồi ta kiểm tra giá trị logic của các
chân P3.4,P3.5,P3.6.P3.7. Nếu phím 12 được bấm thì cột 1_P3.4 sẽ có giá trị bằng
0V.Nếu phím 13 được bấm thì cột 2_P3.5 sẽ có giá trị bằng 0V.Nếu phím 14 được
bấm thì cột 3_P3.6 sẽ có giá trị bằng 0V. Nếu phím 15 được bấm thì cột 4_P3.7 sẽ
có giá trị bằng 0V. Ta căn cứ vào đó để xác định xem phím nào được bấm.
- Ta sẽ dung câu lệnh IF để kiểm tra.
4. Lập trình
CODE :
#include <regx51.h>
unsigned char Ma[] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x8
Nhóm 1– Đ3dtvt
if (!H_1)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_1 = 0;
if(!C_1) stt = 1;
else if (!C_2) stt = 2;
else if (!C_3) stt = 3;
else if (!C_4) stt = 4;
}
if (!H_2)
{
C_1 = 1;
C_2 = 1;
C_3 = 1;
C_4 = 1;
H_2 = 0;
if(!C_1) stt = 5;
else if (!C_2) stt = 6;
else if (!C_3) stt = 7;
else if (!C_4) stt = 8;
}
if(!H_3)
{
C_1 = 1;
C_2 = 1;
P0=Ma[a];
}
}
Sau khi chạy và kiểm tra lỗi ta có mạch chạy mô phỏng sau :
Nhóm 1– Đ3dtvt
BÀI 4 : ĐIỀU KHIỂN LCD 16X2
1. Nhiệm vụ : Điều khiển hiển thị LCD 16x2 dòng chữ : “Nhom 18-d3dtvt” và hiển thị thời
gian
2. Giới thiệu về LCD:
LCD 16x2 hiển thị được hai hàng mỗi hàng hiển thị được 16 ký tự.(LCD có 14 chân
được hiển thị như hình vẽ :
Thông số của LCD :
+Kích thước hiển thị : 16 ký tự x 2 dòng
+Màu hiển thị: đen/trắng
+Chế độ giao tiếp : 8 bít và 4 bít
+Cỡ chữ hiển thị : 5x7 hoặc 5x10
Cấu trúc của LCD :
LCD có tổng số 14 chân chia làm 3 nhóm:
Nhóm 1: (3 chân) Cấp nguồn VDD, VSS : cấp 5V, 0V
VEE: thay đổi điện áp để thay đổi độ tương phản
Nhãm 2: (8 chân) Vào ra thông tin với VĐK : Từ chân D0-D7
Nhãm 3 : (3 chân) Điều khiển việc vào ra thông tin : E,RS,R/W
E :(bật /tắt ) (cho phép/ không cho phép trao đổi thông tin với VĐK )
RS :(loại thông tin trao đổi)Thông tin trao đổi là lệnh điều khiển hay là
dữ liệu để hiển thị
R/W : (hướng truyền của thông tin) đọc trạng thái từ LCD hay thông tin cho VĐK để
Nhóm 1– Đ3dtvt
LCD hiển thị.
Data bus 0-7
8 chân này được nối với
VĐK để vào/ra thông tin 8 D1 9 D2
10 D3
11 D4 12 D5 13 D6
14 D7
Nhóm 1– Đ3dtvt
Từ những đặc điểm và chức năng đã được đề cập ở trên ta có sơ đồ VDK sau :
3. Nguyên tắc hoạt động
Các chân V
cc
V
ee
V
ss
: cấp dương nguồn -5V và đất tương ứng thì V
4 Tăng con trỏ (dịch con trỏ sang bên phải)
5 Dịch hiển thị sang phải
6 Dịch hiển thị sang trái
7 Tắt con trỏ,tắt hiển thị
8 Tắt hiển thị,bật con trỏ
A Bật hiển thị,tắt con trỏ
C Bật hiển thị,nhấp nháy con trỏ
E Tắt con trỏ,nhấp nháy con trỏ
F Dịch vị trí con trỏ sang trái
10 Dịch vi trí con trỏ sang phải
14
18 Dịch toàn bộ hiển thị sang trái
1C Dịch toàn bộ hiển thị sang phải
80 Ép con trỏ về đầu dòng thứ nhất
C0 Ép con trỏ về đầu dòng thứ 2
38 Hai dòng và ma trận 5x7
Điều khiển LCD qua các bước sau:
- Bước 0: chẩn bị phần cứng.dùng tuốc vít xoay biến trở 5k điều chỉnh độ tương phản của
LCD.Xoay cho đến khi các ô vuông (các điểm ảnh)của LCD hiện lên thì xoay ngược biến trở lại
1 chút.
-Bước 1: Khởi tạo cho LCD.
-Bước 2: Gán giá trị cho các bit điều khiển các chân RS,R/W,EN cho phù hợp với các chế
độ.Hiển thị ký tự lên LCD hay thực hiện 1 lệnh của LCD.
-Bước 3: Xuất byte dữ liệu ra cổng điều khiển 8 bit dữ liệu của LCD.
-Bước 4: Kiểm tra cờ bận xem LCD sẵn sàng nhận dữ liệu mới chưa
-Bước 5: Quay vòng lại bước 1.
4. Lập trình
Nhóm 1– Đ3dtvt
Code :
#include <REGX52.H>
{
hour=0;
}
}
}
}
}
}
// Ham tre khoang thoi gian rat ngan phuc vu viec kiem tr co ban //
void delay()
{
unsigned int i;
for(i=0;i<125;i++);
Nhóm 1– Đ3dtvt
}
// Ham kiem tra co ban (busy_flag) ??
void kt_ban()
{
unsigned char x;
P0 = 0xff;
RS_LCD = 0;
RW_LCD = 1;
do
{
E_LCD = 1;
delay();
E_LCD = 0;
x=P0;
x=x&0x80;
{
Nhóm 1– Đ3dtvt
// delay(50);
ghi_kytu(*str);
str++;
}
}
// Ham khoi tao LCD //
void setting_LCD()
{
ghi_lenh(0x38);
ghi_lenh(0x01); // Xoa man hinh
ghi_lenh(0x0f); // Co dich hien thi
}
/*CHUONG TRINH CHINH */
void main()
{
TMOD = 0x02; //Bit chon che do thu nhat cho timer0
TH0 = 155; //155-255 100 lan dem thi ngat
IE = 0x82; //cho phep ngat tu ben ngoai (ngat ngoai 0)
TR0 = 1; //Cho phep timer0 chay
setting_LCD();
while(1)
{
ghi_lenh(0x80);
ghi_lenh(0x0c);
ghi_chuoi ("Nhom 18-d3dtvt");
ghi_lenh(0xc0);
ghi_lenh(0x0c);
nhận ra được sự thay đổi nhỏ của đèn mà sẽ thấy được toàn bộ hình ảnh cần hiển thị.