Professional Documents
Culture Documents
IO, đối với thiết kế lớn có bộ nhớ mở rộng nó được kết hợp giữa bus địa chỉ với
bus dữ liệu.
Port 1: từ chân 1 đến chân 9 (P1.0 _ P1.7). Port 1 là port I/O dùng cho giao
tiếp với thiết bị ngoài nếu cần.
Port 2: từ chân 21 đến chân 28 (P2.0 _P2.7). Port 2 là một port có tác dụng
kép, được dùng như các đường xuất nhập hoặc l byte cao của bus địa chỉ đối với
các thiết bị dùng bộ nhớ mở rộng.
Port 3: từ chân 10 đến chân 17 (P3.0 _ P3.7). Port 3 là port có tác dụng
kép. Các chân của port này có nhiều chức năng, có công dụng chuyển đổi có liên
hệ đến các đặc tính đặc biệt của 8051 như ở bảng sau :
thứ 30 dùng làm tín hiệu điều khiển để giải đa hợp các đường địa chỉ và dữ
liệu khi kết nối chúng với IC chốt.
Tín hiệu ở chân ALE là một xung trong khoảng thời gian port 0 đóng vai
trò là địa chỉ thấp nên chốt địa chỉ hoàn toàn tự động.
EA\ (External Access): Tín hiệu vào EA\ ở chân 31 thường được mắc lên
mức 1 hoặc mức 0. Nếu ở mức 1, 8051 thi hành chương trình từ ROM nội. Nếu
ở mức 0, 8051 thi hành chương trình từ bộ nhớ mở rộng. Chân EA\ được lấy làm
chân cấp nguồn 21V khi lập trình cho Eprom trong 8051.
RST (Reset): Khi ngõ vào tín hiệu này đưa lên mức cao ít nhất 2 chu kỳ
máy, các thanh ghi bên trong được nạp những gi trị thích hợp để khởi động hệ
thống. Khi cấp điện mạch phải tự động reset.
Các ngõ vào bộ dao động X1, X2:
Bộ tạo dao động được tích hợp bên trong 8051. Khi sử dụng 8051, người
ta chỉ cần nối thêm các thạch anh và các tụ. Tần số tụ thạch anh thường l 12 Mh.
2.1.2. Cấu trúc bên trong của 8051
2.1.2.1. Sơ đồ khối bên trong
#include <REGX51.H>
Khi reset 8051, SP sẽ mang giá trị mặc định là 07H và dữ liệu đầu tiên sẽ
được cất vào ô nhớ ngăn xếp có địa chỉ là 08 H.
Con trỏ dữ liệu:
Con trỏ dữ liệu DPTR được dùng để truy xuất bộ nhớ ngòai là một thanh
ghi 16 bit ở địa chỉ 82H (DPL: byte thấp) và 83H (DPH: byte cao).
Các thanh ghi port xuất nhập:
Các port của 8051 bao gồm port 0 ở địa chỉ 80H, port 1 ở địa chỉ 90H, port 2 ở
địa chỉ A0H, v port3 ở địa chỉ B0H. tất cả các port này đều có thể truy xuất từng
bit nên rất thuận tiện trong khả năng giao tiếp.
Các thanh ghi timer:
8051 có chứa 2 bộ định thời/ đếm 16 bit được dùng cho việc định thời
hoặc đếm sự kiện. Timer 0 ở địa chỉ 8AH (TL0: byte thấp) và 8CH (TH0: byte
cao). Timer 1 ở địa chỉ 8BH (TL1: byte thấp) v 8DH (TH1: byte cao). Việc khởi
động timer được Set bởi Timer Mode (TMOD) ở địa chỉ 89H và thanh ghi điều
khiển timer (TCON) ở địa chỉ 88H, chỉ có TCON được địa chỉ hóa từng bit.
Các thanh ghi port nối tiếp:
8051 chứa một port nối tiếp dành cho việc trao đổi thông tin với các thiết
bị nối tiếp như máy tính, modem hoặc giao tiếp nối tiếp với các IC khác.
Các thanh ghi ngắt:
8051 có cấu trúc 5 nguồn ngắt, 2 mức ưu tin. Các ngắt bị cấm sau khi
reset hệ thống và sẽ được cho phép bằng việc ghi thanh ghi cho phép ngắt (IE) ở
địa chỉ A8H, cả 2 thanh ghi được địa chỉ hóa từng bit.
Thanh ghi điều khiển công suất:
Thanh ghi điều khiển công suất (PCON) ở địa chỉ 87H chứa các bit điều
khiển.
Tín hiệu Reset:
8051 có ngõ vào reset RST tác động ở mức cao trong khoảng thời gian 2
chu kỳ, sau đó xuống mức thấp để 8051 bắt đầu làm việc. RST có thể kích bằng
tay bằng một phím nhấn thường mở.
Thanh ghi quan trọng nhất là thanh ghi bộ đếm chương trình PC được Reset tại
địa chỉ 0000H. Khi ngõ vào RST xuống mức thấp, chương trình luôn bắt đầu tại
địa chỉ 0000H của bộ nhớ chương trình. Nội dung của Ram trong chip không bị
hay đổi bởi tác động của ngõ vào Reset.
Timer 2 002BH
Bảng 2.2 Các cờ ngắt
Reset hệ
RST 0000H
thống
Timer 2 002BH
void kieu3()
{
unsigned char n;
unsigned char ma[4]={0x18,0x24,0x42,0x81};
for(n=0;n<4;n++)
{ if(TANG==0)break;
P3=~ma[n];
delay(3000);}
}
void kieu4()
{
unsigned char n;
unsigned char ma[4]={0x81,0x42,0x24,0x18};
for(n=0;n<4;n++)
{if(TANG==0)break;
P3=~ma[n];
delay(3000);}
}
void kieu5()
{
unsigned char n;
unsigned char ma[4]={0xff,0x00};
for(n=0;n<4;n++)
{if(TANG==0)break;
P3=~ma[n];
delay(3000);}
}
void kieu6()
{
unsigned char n;
unsigned char ma[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
for(n=0;n<8;n++)
{if(TANG==0)break;
P3=~ma[n];
delay(3000);}
}
void kieu7()
{
unsigned char n;
unsigned char ma[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
for(n=7;n>0;n--)
{if(TANG==0)break;
P3=~ma[n];
delay(3000);}
}
void main()
{
while(1)
{
TANG0=TANG1;TANG1=TANG;
if((TANG0==1)&&(TANG1==0))
{
l=l+1;
if(l>2)l=0; }
if(l==0) {P3=0xff;}
if(l==1) {kieu3();}
if(l==2) {kieu4();}
}
}
end
KẾT LUẬN
Qua một thời gian thực hiện đề tài.Đề tài này chúng em đã cố gắng nghiên
cứu thực hiện một cách nghiêm túc. Nhưng do thời gian có hạn, kiến thức nhiều
nên đề tài chỉ mang tính chất tìm hiểu chứ không đi sâu nghiên cứu chi tiết. Do
đó rất mong được sự đóng góp y kiến của quí thầy cô và các bạn để đề tài được
hoàn thiện hơn.
Từ những kiến thức và kinh nghiệm đã thu được trong quá trình thực hiện
đồ án này sẽ giúp em nâng cao vốn hiểu biết về lập trình bằng vi điều khiền có
thêm kinh nghiệm để tìm hiểu sâu về các mạch điều khiển phức tạp hơn và có
ứng dụng thực tế nhiều hơn.
Cuối cùng một lần nữa em xin chân thành cảm ơn KS. Hồ Sỹ Phương đã
tận tình hướng dẫn giúp em hoàn thành đồ án này.