Tải bản đầy đủ (.docx) (25 trang)

Báo Cáo Lập Trình led trái tim

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (546.76 KB, 25 trang )

HỌC VIỆN CÔNG NGHỆ BƯU CHÍNH VIỄN THÔNG
KHOA VIỄN THÔNG I

Báo Cáo Tiểu Luận
Môn : Kỹ Thuật Vi Xử Lý
Đề Tài : Lập trình điều khiển cho led trái tim
Giảng Viên : Phạm Văn Cường
Nhóm 12 (D11VT8): Nguyễn Thị Nga
Nguyễn Văn Quyết
Lê Đình Thủy
Trần Tuấn Anh
Đậu Xuân Tú
Lời Nói Đầu
Với sự ra đời của chip 8051 vào năm 1980 do INTEL sản xuất,nó đã tạo ra bước
tiến quoan trọng trong lĩnh vưc vi điều khiển.vói sự ra đó đã giúp cho viêc thiết kế
các hệ thống như đo lường,điều khiển tự động,truyền thông ngày càng đơn giản
gọn nhẹ và chính xác hơn.ngày nay các chíp thế hệ sau của 8051 ngay càng được
tăng cường thêm cá tính năng cũng như rung lượng,đã giúp cho họ vi điều khiển
8051 trở thành 1 trong những bộ vi điều khiển 8bit mạnh và linh hoạt nhất trong
những năm gần đây.
Đó là việc nghiên cứu và tìm hiểu về vi điều khiển,trong đó đặc biệt là họ vi điều
khiển 8051 la điều cần thiết với sinh viên khoa điện tử chúng em nói chung cũng
như sinh viên các khoa khác co liên quoan tới môn học.nhưng do thời gian tìm
hiểu và kiến thức về môn học còn có nhiều hạn chế,cho nên trong đề tài nghiên
cứu về vi điều khiển của chúng em còn gì thiếu sót và hạn chế mong thầy chỉ bảo
giúp cho chúng em hiểu sâu hơn về môn học này,chúng em xin chân thành cảm
ơn.
Nội dung báo cáo gồm 3 phần:
I – Cơ sở lý thuyết
II – Nội dung thiết kế
III – MÔ PHỎNG – SẢN PHẨM


Lập trình điều khiển cho led trái tim
I – Cơ sở lý thuyết
1-Giới thiệu chung về bộ vi điều khiển:
Bộ vi điều khiển viết tắt là Micro-contronller, là mạch tích hợp trên một chíp có
thể lập trình được, dùng để điều khiển hoạt động của hệ thống. Theo các tập lệnh
của người lập trình, bộ vi điều khiển tiến hành đọc, lưu trữ thông tin, xử lý thông
tin, đo lường thời gian và tiến hành đọc mở một cơ cấu nào đó.
Trong các thiết bị điện và điện tử dân dụng, thiết bị tự động hoá… các bộ
vi điều khiển, điều khiển hoạt động của các thiết bị này Trong hệ thống sản xuất
tự động, bộ vi điều khiển được sử dụng trong điều khiển robot, dây chuyền tự
động… Các hệ thống càng thông minh thì vai trò của vi điều khiển càng quan
trọng.
2- Giới thiệu tổng quan về họ Vi điều khiển 8051 (AT89C51)
AT89C51 là một vi điều khiển 8 bit, chế tạo theo công nghệ CMOS chất
lượng cao, công suất thấp với 4 KB PEROM (Flash Programeable and erasable read
only memory).
Các đặc điểm của 8951 được tóm tắt như sau:
- 4KB bộ nhớ, có thể lập trình lại nhanh, có khả năng ghi xóa tới 1000
chu kỳ
- Tần số hoat động từ 0 Hz đến 24 MHz
- 3 mức khóa bộ nhớ lập trình
- 2 bộ Timer/Counter 16 bit
- 128 Byte RAM nội
- 4 Port xuất/nhập (I/O) 8 bit
- Giao tiếp nối tiếp
- 64 KB vùng nhớ mã ngoài
- 64 KB vùng nhớ dữ liệu ngoài
- Xử lý Boolean (hoạt động trên bit đơn)
- 210 vị trí nhớ có thể định vị bit
- 4μs cho hoạt động nhân hoặc chia

a – Sơ đồ khối và sơ đồ chân của AT89C51
OTHER REGISTER
128 byte RAM
128 byte RAM
8032\8052
ROM
0K:
8031\8032
4K:8951
8K:8052
INTERRUPT CONTROL
INT1\ INT0\
SERIAL PORT TEMER0
TEMER1
TEMER2 8032\8052
CPU
OSCILATOR
BUS CONTROL
I/O PORT
SERIAL PORT
EA\ RST
ALE\ PSEN\
P
0
P
1
P
2
P
3

Address\Data
TXD RXD
TEMER2 8032\8052
TEMER1
TEMER1
Hình 1 – Sơ đồ khối của AT89C51
Hình 2 – Sơ đồ chân của AT89C51
b – Chức năng các chân của AT89C51
+ Port 0 (P0.0 – P0.7 hay chân 32 – 39): Ngoài chức năng xuất nhập ra, port
0 còn là bus đa hợp dữ liệu và địa chỉ (AD0 – AD7), chức năng này sẽ được sử
dụng khi AT89C51 giao tiếp với thiết bị ngoài có kiến trúc bus.
Hình 3 – Port 0
+ Port 1 (P1.0 – P1.7 hay chân 1 – 8): có chức năng xuất nhập theo bit và
byte. Ngoài ra, 3 chân P1.5, P1.6, P1.7 được dùng để nạp ROM theo chuẩn ISP, 2
chân P1.0 và P1.1 được dùng cho bộ Timer 2.
Hình 4 – Port 1
+ Port 2 (P2.0 – P2.7 hay chân 21 – 28): là một port có công dụng kép. Là
đường xuất nhập hoặc là byte cao của bus địa chỉ đối với các thiết kế dùng bộ nhớ
mở rộng.
Hình 5 – Port 2
+ Port 3 (P3.0 – P3.7 hay chân 10 – 17): mỗi chân trên port 3 ngoài chức
năng xuất nhập ra còn có một số chức năng đặc biệt sau:
Bit Tên Chức năng chuyển đổi
P3.0 RXD Dữ liệu nhận cho port nối tiếp
P3.1 TXD Dữ liệu truyền cho port nối tiếp
P3.2 INT0 Ngắt bên ngoài 0
P3.3 INT1 Ngắt bên ngoài 1
P3.4 T0 Ngõ vào của Timer/Counter 0
P3.5 T1 Ngõ vào của Timer/Counter 1
P3.6 WR Xung ghi bộ nhớ dữ liệu ngoài

P3.7 RD Xung đọc bộ nhớ dữ liệu ngoài
Hình 6 – Port 3
+ RST (Reset – chân 9): mức tích cực của chân này là mức 1, để reset ta
phải đưa mức 1 (5V) đến chân này với thời gian tối thiểu 2 chu kỳ máy (tương
đương 2µs đối với thạch anh 12MHz.
+ XTAL 1, XTAL 2: AT89C51 có một bộ dao động trên chip, nó thường được
nối với một bộ dao động thạch anh có tần số lớn nhất là 33MHz, thông thường là
12MHz.
+ EA (External Access): EA thường được mắc lên mức cao (+5V) hoặc mức
thấp (GND). Nếu ở mức cao, bộ vi điều khiển thi hành chương trình từ ROM nội.
Nếu ở mức thấp, chương trình chỉ được thi hành từ bộ nhớ mở rộng.
+ ALE (Address Latch Enable): ALE là tín hiệu để chốt địa chỉ vào một thanh
ghi bên ngoài trong nửa đầu của chu kỳ bộ nhớ. Sau đó các đường port 0 dùng để
xuất hoặc nhập dữ liệu trong nửa chu kỳ sau của bộ nhớ.
+ PSEN (Program Store Enable): PSEN là điều khiển để cho phép bộ nhớ
chương trình mở rộng và thường được nối với đến chân /OE (Output Enable) của
một EPROM để cho phép đọc các bytes mã lệnh. PSEN sẽ ở mức thấp trong thời
gian đọc lệnh. Các mã nhị phân của chương trình được đọc từ EPROM qua Bus và
được chốt vào thanh ghi lệnh của bộ vi điều khiển để giải mã lệnh. Khi thi hành
chương trình trong ROM nội, PSEN sẽ ở mức thụ động (mức cao).
+ Vcc, GND: AT89C51 dùng nguồn một chiều có dải điện áp từ 4V – 5.5V
được cấp qua chân 40 (Vcc) và chân 20 (GND).
3- Tổng quan và tính toán cho LED phát quang
a- Hoạt động và phân cực cho LED
LED phát quang được phát sáng khi chúng ta cấp nguồn cho nó thì nó sẽ phát
sáng. Có rất nhiều LED phát quang với mầu sắc, kích thước chủng loại khác nhau.
Và được ứng dụng trong thắp sáng, trang trí
Bản chất của LED chính là một diode có khả năng phát sáng khi phân cực thuận.
Khi Led sáng thi điện áp rơi trên LED có giá trị nhỏ nhất là 0.7V và lớn nhất gần 2V
tùy từng loại LED. Tùy vào từng loại LED mà có giá trị dòng qua LED khác nhau để

LED sáng bình thường. Thông thường thì nguồn cấp cho LED 3V thì chúng ta
không cần điện trở hạn dòng nhưng đối với nhiều mạch người ta không thể dùng
thêm một nguồn nữa nên người ta dùng nguồn cho LED chung với nguồn điều
khiển (5V) và lắp thêm con điện trở nối tiếp cho LED. Mục đích là để hạn dòng cho
LED không cho dòng qua LED lớn hơn giá trị định mức. Nếu mà quá dòng thì LED
sẽ cháy. Tính toán điện trở đó như thế nào?
b- Cách tính toán điện trở hạn dòng cho LED
Nếu chúng ta sử dụng nguồn 3V thì không cần phải điện trở mà có thể lắp trực
tiếp được nhưng nếu mà cho nguồn lớn hơn 3V thì cần phải có thêm một con
điện trở hạn dòng cho LED
Chúng ta áp dụng lý thuyết mạch điện vào tính toán điện trở này như sau:
R = (Vcc - Uled)/Iled
với Uled là điện áp rơi trên LED phát quang. Nằm trong 0.7 ~ 2V tùy từng loại LED
Iled là dòng điện định mức qua LED.
Dựa vào công thức đó chúng ta sẽ tính được giá trị điện trở cho vào cho từng loại
LED.
Lấy ví dụ : Mua LED có Uled = 1V, Iled = 10mA với điện áp nguồn là 5V. Áp dụng
công thức trên ta sẽ tính được R = 400 ôm.
c- Điều khiển LED với 8501
LED phát quang chúng ta chỉ cần phân cực thuận là nó sẽ sáng.Trong 8501 chỉ
điều khiển được mức 1 (5V) và mức 0 (0V) nên do đó LED khi mắc vào chân của
8501 sẽ được điều khiển tắt hoặc mở tùy thuộc vào trạng thái của chân 8501
được điều khiển như thế nào? Có hai cách mắc LED và chân 8501
+ Mắc ở chế độ xả dòng
Với mắc ở chế độ này thì LED sẽ sáng rất tối vì công suất của chân 8501 rất yếu.
Không đủ cấp dòng cho LED sáng với chế độ định mức. Nên phương pháp này sẽ
làm LED sáng tối nên không hiểu quả. Chân 8501 ở mức 1 thì LED sáng và mức 0
thì tắt
+ Mắc ở chế độ hút dòng
Mắc kiểu này thì LED sáng hết công suất. Đây là phương pháp ghép trực tiếp

nhưng vi xử lý nó chỉ chịu được một giá trị dòng nhất định qua nó. Nếu mà quá
nhiều LED ghép nối thế này thì tất cả dòng sẽ qua vi xử lý gây ra quá dòng trên vi
xử lý gây nên cháy chíp và chíp nóng không hoạt động được lâu. Phương pháp này
chỉ mang tính lắp ít LED và điều khiển không đồng thời. Giải pháp là gắn thêm một
transitor đệm. Đối với mắc kiểu này thì mức 1 thì LED tắt và mức 0 thì LED tắt.
Điều khiển LED đơn này cũng rất là đơn giản. Nó dựa vào cách ghép nối với vi xử
lý và đưa mức cần thiết ra chân vi xử lý thì LED sẽ sáng và tắt theo ý muốn của
chúng ta.
II- NỘI DUNG THIẾT KẾ
Mạch trái tim với 32 LED ghép nối với 8501
1- Mạch nguyên lý
Mỗi PORT của 89C52 có độ dài 8 bit, do vậy không thể truy xuất lên từng PORT
một lúc được. Ta chỉ có thể làm lần lượt với từng Port của 89C52. Nhưng với điều
khiển LED, Thời gian thực hiên rất nhanh, và coi như thực hiện gần như cùng một
lúc. Sau đây mình sẽ điều khiển 32 LED được xếp thành một hình trái tim.
Mạch nguyên lý trên là ghép trực tiếp không dùng đệm. Theo nguyên tắc vẫn chạy
được nhưng không đảm bảo cho con 8501 hoạt động tốt và không bị quá dòng.
Nhưng với bài toán này chúng ta có thể ghép trực tiếp với LED thường và điều
khiển không đồng thời. Mạch vẫn chạy ổn định.
2- Thuật toán điều khiển
Việc điều khiển 32 LED đơn này cũng không khó. Ta cứ cho LED này bật rồi LED kia
tắt theo hiệu ứng của chúng ta. Các thời điểm được tính là rất nhanh. Việc chuyển
từ thời điểm này sang thời điểm kia được qua một thời gian trễ nếu cần thiết. Ta
chỉ cần xuất mức 0 ra chân 8501 là LED sáng và mức 1 ra chân của 8501 là LED tắt
Phần lập trình
#include<reg52.h>
#include<stdio.h>
#include<intrins.h>
unsigned int i,j;

//###### ham delay tôi thoi gian tre 0.5s ######
void delay(unsigned int ms)
{
unsigned int a;
unsigned char b;
for(a=0;a<ms;a++)
{
for(b=0;b<125;b++)
{
}
}
}
void hieuung1(void)
{
P0=P1=P2=P3=0xff;
delay(300);
P0=P1=P2=P3=0x00;
delay(300);
}
//##### tat dan het cac led theo chieu tu trai sang phai ############
void hieuung2(void)
{
unsigned char M[]={0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
P0=P1=P2=P3=0x00;
for(i=0;i<8;i++)
{
P0=M[i];
delay(300);
}
for(i=0;i<8;i++)

{
P1=M[i];
delay(300);
}for(i=0;i<8;i++)
{
P2=M[i];
delay(300);
}for(i=0;i<8;i++)
{
P3=M[i];
delay(300);
}
}
//##### tat dan het cac led theo chieu tu phai sang trai ############
void hieuung3(void)
{
unsigned char N[]={0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff};
P0=P1=P2=P3=0x00;
for(i=0;i<8;i++)
{
P3=N[i];
delay(300);
}
for(i=0;i<8;i++)
{
P2=N[i];
delay(300);
}for(i=0;i<8;i++)
{
P1=N[i];

delay(300);
}for(i=0;i<8;i++)
{
P0=N[i];
delay(300);
}
}
void hieuung4(void)//sang day 2 ben roi tat nguoc lai
{
unsigned char M[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
unsigned char N[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00} ;
for(i=0;i<8;i++)
{
P0=N[i];
P3=M[i] ;
delay(300);
}
for(i=0;i<8;i++)
{
P1=N[i];
P2=M[i] ;
delay(300);
}
for(i=0;i<8;i++)
{
P1=N[7-i];
P2=M[7-i];
delay(300);
}
P2=P1=0xff;

for(i=0;i<8;i++)
{
P0=N[7-i];
P3=M[7-i];
delay(300);
}
}
void hieuung5(void)//=============================day ca
4port============================
{
unsigned char A[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char
a[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};
unsigned char B[]={0x7e,0x7d,0x7b,0x77,0x6f,0x5f,0x3f}; unsigned char
b[]={0x7e,0xbe,0xde,0xee,0xf6,0xfa,0xfc};
unsigned char C[]={0x3e,0x3d,0x3b,0x37,0x2f,0x1f}; unsigned char
c[]={0x7c,0xbc,0xdc,0xec,0xf4,0xf8};
unsigned char D[]={0x1e,0x1d,0x1b,0x17,0x0f}; unsigned char
d[]={0x78,0xb8,0xd8,0xe8,0xf0};
unsigned char E[]={0x0e,0x0d,0x0b,0x07}; unsigned char
e[]={0x70,0xb0,0xd0,0xe0};
unsigned char F[]={0x06,0x05,0x03}; unsigned char f[]={0x60,0x50,0xc0};
unsigned char G[]={0x02,0x01}; unsigned char g[]={0x40,0x80};
for(i=0;i<8;i++)
{
P0=P1=A[i];
delay(300);
P2=P3=a[i];
delay(300);
}
for(i=0;i<7;i++)

{
P0=P1=B[i];
delay(300);
P2=P3=b[i];
delay(300);
}
for(i=0;i<6;i++)
{
P0=P1=C[i];
delay(300);
P3=P2=c[i];
delay(300);
}
for(i=0;i<5;i++)
{
P0=P1=D[i];
delay(300);
P2=P3=d[i];
delay(300);
}
for(i=0;i<4;i++)
{
P0=P1=E[i];
delay(300);
P3=P2=e[i];
delay(300);
}
for(i=0;i<3;i++)
{
P0=P1=F[i];

delay(300);
P3=P2=f[i];
delay(300);
}
for(i=0;i<2;i++)
{
P0=P1=G[i];
delay(300);
P1=P2=g[i];
delay(300);
}
P1=P2=P3=P0=0x00;
}
//##### hieu ung led nhay so le 1 ##############
void hieuung6(void)
{
for(i=0;i<8;i++)
{
P0=P1=P2=P3=0x55;
delay(300);
P0=P1=P2=P3=0xaa;
delay(300);
P0=P1=P2=P3=0xaa;
delay(300);
P0=P1=P2=P3=0x55;
delay(300);
}
}
void hieuung7(void)//===========chop 2 nua trai
tim=====================

{
P0=P1=P2=P3=0xff;
P0=P1=0x00;
delay(500);
P0=P1=0xff;
delay(500);
P0=P1=0x00;
delay(500);
P0=P1=0xff;
delay(500);
P2=P3=0xff;
delay(500);
P2=P3=0x00;
delay(500);
P2=P3=0xff;
delay(500);
P2=P3=0x00;
delay(500);
}
void hieuung8(void)// day dan ra giua va tat nguoc
lai===============================
{
unsigned char M[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
unsigned char N[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00} ;
for(j=0;j<2;j++)
{
for(i=0;i<8;i++)
{
P3=M[i];
P0=N[i];

P1=M[i];
P2=N[i];
delay(700);
}
for(i=0;i<8;i++)
{
P3=M[7-i];
P0=N[7-i];
P1=M[7-i];
P2=N[7-i];
delay(700);
}
}
}
void hieuung9(void)//========================= xep tung
port==============
{
Unsigned char M[]={0x7f,0x3f,0x1f,0x0f,0x07,0x03,0x01,0x00};
unsigned char N[]={0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00};
P0=P1=P2=P3=0xff;
for(i=0;i<8;i++)
{
P0=N[i];
delay(300);
}
for(i=0;i<8;i++)
{
P1=M[i];
delay(300);
}

for(i=0;i<8;i++)
{
P2=N[i];
delay(300);
}
for(i=0;i<8;i++)
{
P3=M[i];
delay(300);
}
}
void hieuung10(void)//===========cung tat cung
sang=====================
{
for(i=0;i<5;i++)
{
P0=P1=P2=P3=0xff;
delay(500);
P0=P1=P2=P3=0x00;
delay(500);
P0=P1=P2=P3=0xff;
delay(500);
P0=P1=P2=P3=0x00;
delay(500);
}
}
void main(void)
{
while(1)
{

hieuung1();
delay(500);
hieuung2();
delay(500);
hieuung3();
delay(500);
hieuung4();
delay(500);
hieuung5();
delay(500);
hieuung6();
delay(500);
hieuung7();
delay(500);
hieuung8();
delay(500);
hieuung9();
delay(500);
hieuung10();
delay(500);
}
}
III- MÔ PHỎNG – SẢN PHẨM
1- Mạch in
Trang web tham khảo phần cơ sở lý thuyết : hoiquandientu.com

×