đồ án vi xử lý 8051 LCD
Trang 1M c l c ục lục ục lục
Lời nói đầu 3
Chương 1: CƠ SỞ LÝ THUYẾT 4
I Vi điều khiển 89C51: 4
1 Cấu tạo: 4
2 Cấu trúc bộ nhớ: 4
3 Cấu trúc các Port: 4
4 Các ngõ tín hiệu: 5
5 Lập trình xử lý ngắt: 6
a Ngắt timer/couter: 6
b Ngắt của bộ định thời: 7
II LCD: 8
1 Ghép nối vi điều khiển với LCD 16x2: 8
2 Nguyên lí hoạt động của LCD: 9
3 Bảng mã lệnh LCD: 9
Chương 2:THIẾT KẾ MẠCH VÀ THUẬT TOÁN 11
I Danh sách biến: 11
II Các chương trình con: 14
1 Hàm running(): 14
2 Menu: 17
3 Hẹn giờ: 20
4 Cài đặt: 23
Trang 2Chương 4: KẾT LUẬN VÀ HƯỚNG PHÁT TRIỂN 77
I Ưu nhược điểm của chương trình 77
II Hướng phát triển 77
Trang 3Lời nói đầu
Ngày nay, các bộ vi điều khiển đang có những ứng dụng rộng rãi và thâm nhập ngày càng nhiều trong các lĩnh vực đời sống và xã hội Hầu hết, các thiết bị kỹ thuật từ phức tạp cho đến đơn giản như thiết bị điều khiển tự động, thiết bị văn phòng cho đến các thiết bị trong gia đình đều có dùng các bộ vi điều khiển
Xuất phát từ thực tế đó, môn học kỹ thuật vi điều khiển là môn học khôngthể thiếu đối với bất kỳ sinh viên trường kỹ thuật nào nhất là các sinh viên cáckhoa Điện tử viễn thông, Công nghệ thông tin… Không chỉ cung cấp cho sinhviên kiến thức về vi điều khiển để xây dựng nên những hệ thống thiết bị kỹ thuậthiện đại Mà nó còn là môn học căn bản để chúng ta hiểu rõ bản chất của việc xử
lý các số liệu tính toán đang tồn tại từng giây, từng phút trong hàng triệu triệu con
vi xử lý, vi điều khiển trên khắp thế giới này Đem đến cái nhìn sâu sắc và hiểubiết sâu rộng về thế giới tin học, góp phần tạo nên sự say mê sáng tạo cho mỗi sinhviên yêu thích bộ môn khoa học kỹ thuật này
Đồ án môn học Kỹ thuật vi xử lý dựa trên việc sử dụng vi điều khiển 8051cũng không nằm ngoài mục đích nâng cao sự hiểu biết, củng cố lý thuyết cho mỗisinh viên Tạo cho sinh viên tinh thần làm việc nhóm để đạt được một mục đíchchung: Làm một đồ án hiệu quả, chất lượng!
Nhóm thực hiện
Trần Anh TuấnLương Văn BìnhDương Hữu Đức
Trang 4Chương 1: CƠ SỞ LÝ THUYẾT.
o Có 128 byte RAM nôi
o 4 Port xuất/ nhập 8 bit
o Có khả năng giao tiếp truyền dữ liệu nối tiếp
o Có khả năng giao tiếp truyền dữ liệu nối tiếp
o Có thể giao tiếp 64Kb bộ nhớ bên ngoài dùng để lưu chương trình điều khiển
o Có thể giao tiếp với 64KB bộ nhớ bên ngoài dùng để lưu trữ dữ liệu
o Có 210bit có thể truy xuất từng bit Có các lệnh xử lý bit
3 Cấu trúc các Port:
o Port 0:
Port 0 là port có 2 chứ năng với số thứ tự chân 32-39
Trong các hệ thống điều khiển đơn giản sử dụng bộ nhớ bên trongkhông dùng bộ nhớ mở rộng bên ngoài thì port 0 được dùng làm cácđiều khiển IO(Input-Output)
Trang 5 Trong các hệ thống điều khiển lớn sử dụng bộ nhớ mở rộng bênngoài thì port 0 có chứ năng địa chỉ và bú dữ liệu AD7- AD0(Addresss: địa chỉ, Data: dữ liệu).
o Port 1:
Port 1 với số thứ tụ chân 1-8 Port 1 chỉ có chức năng dùng làmđường điều khiển xuất nhập IO, port 1 kkhoong chỉ có chứ năngkhác
o Port 2:
Port là port có 2 chức năng với số thứ tự chân 21-28
Trong các hệ thống điệu khiển đơn giản sử dụng bộ nhớ bên trongkhông dùng bộ nhớ mở rộng bên ngoài thì port 2 được dùng làm cácđiều khiển IO Trong các hệ thông điều khiển lớn sử dụng bộ nhớ
mở rộng bên ngoài thì port 2 chứ năng là địa chỉ cao A8-A15
o Port3:
Port 3 là port có 2 chú năng với số thứ tự 10-17 Các chân của port này có nhiều chức năng , các công dụng chuyển đổi có lien hệ với các đặc tính đặc biệt của 89C51
Ngõ vào nhận dữ liệu nối tiếp
Ngõ xuất dữ liệu nối tiếp
Ngõ vào ngắt cứng thứ 0
Ngõ vào ngắt cứng thứ 1
Ngõ vào của timer/counter thứ 0
Ngõ vào của timer/counter thứ 1
4 Các ngõ tín hiệu:
o PSEN ngõ tín hiệu(Program store enable):
PSEN là tín hiệu ngõ ra ở chân 29 có tác dụng cho phép đọc bộ nhớchương trình mở rộng thường nối ñến chân OE (output enable hoặc RD)của Eprom cho phép ñọc các byte mã lệnh
Khi có giao tiếp với bộ nhớ chương trình bên ngoài thì mới dùng đếnPSEN, nếu không có giao tiếp thì chân PSEN bỏ trống
o Ngõ tín hiệu điều khiển ALE(Address Latch Enable):
Khi vi điều khiển 89C51 truy xuất bộ nhớ bên ngoài, port 0 có chứcnăng là bus tải ñịa chỉ và bus dữ liệu [AD7 – AD0] do đó phải tách cácđường dữ liệu và ñịa chỉ Tín hiệu ra ALE ở chân thứ 30 dùng làm tínhiệu điều khiển để giải đa hợp các đường địa chỉ và dữ liệu khi kết nốichúng với IC chốt
o Ngõ tín hiệu EA(External Access):
Tín hiệu vào EA ở chân 31 thường nói lên mức 1 hoặc mức 0
Trang 6Nếu nối EA lên mức logic 1 (+5v) thì vi ñiều khiển sẽ thi hànhchương trình từ bộ nhớ nội.
Nếu nối EA với mức logic 0(0V) thì vi điều khiển sẽ thi hànhchương trình từ bộ nhớ ngoại
o Ngõ tín hiệu RST(Reset):
Ngõ vào RST ở chân 9 là ngõ vào Reset của 89C51 Khi cấp điệncho hệ thống hoặc khi nhấn nút reset vi điều khiển Khi reset thì tínhiệu reset phải ở mức cao ít nhất là 2 chu kỳ máy, khi đó các thanhghi bên trong được nạp những giá trị thích hợp để khởi động hệthống
Sau khi TH, TL được nạp giá trị ban đầu 16 bit thì bộ định thời phảiđược khởi động với lệnh TR0=1 với timer0 và TR1=1 với timer1,khi này bộ định thời bắt đầu đếm tăng theo xung clock từ giá trị banđầu cho tới giá trị đỉnh là FFFF Khi đó bộ định thời sẽ quay vòng từFFFF về 0000 và bật cờ báo tràn TF0 với timer0 và TF1 với timer1(ban đầu TFx=0) khi đó cần phải có thao tác xoá cờ để lần sau cònbiết được khi nào bộ đếm tràn
Khi bộ đếm tràn thì TH voà TL của bộ định thời sẽ mang giá trị 0 do
đó phải có thao tác nạp lại giá trị ban đầu cho chúng và xoá cờ TF để
bộ đếm được lặp lại
Như vạy khoảng thời gian mà bộ định thời toạ trễ chính là khoảngthời gian nó đếm tăng từ giá trị ban đầu được nạp cho tới giá trị đỉnhFFFF
Tính toán giá trị nạp vào thanh ghi chứa của bộ định thời từ thời gianmuốn tạo trễ (t): gọi N =65536-t/chu kì máy Sau khi chuyển sang
mã HEX được 1 số có 4 chữ số có dạng : x1x2y1y2 Khi đó giá trịnạo cho thanh ghi chứa như sau: TH=x1x2, TL=y1y2
- Các bướclập trình cho bộ định thời để tạo thời để tạo trể ở chế độ 1:
B1: chọn chế độ 1 cho bộ định thời cần dùng, từ đó xác định giá trịnạp cho thanh ghi TMOD
B2: tính toán giá trị ban đầu cần nạp cho TH và TL từ thời gian trễmong muốn
B3: khởi động bộ định thời
B4 : kiểm tra trạng thái bật của cờ TF
Trang 7 B5:dung bộ định thời.
B6 : xoá cờ TF cho vòng lặp kế tiếp
B7:quay trở về B2 để nạp lại giá trị cho TH và TL
o Chế độ 2:
Ở chế độ này bộ định thời là 8bit, do vậy chỉ cho phép các giá trị từ
00 đến FF được nạp vào thanh ghi TH của bộ định thời Sau khi nạpgiá trị 8 bit thì vi điều khiển sẽ sao nội dung của TH sang TL và bộđịnh thời được khởi động bằng lệnh TRx=1
Sau khi được khởi động thì bộ đinh thời bắt đầu đếm tăng trongthanh ghi TL từ giá trị ban đầu đến giá trị đỉnh FF và khi quay vòngtừ FF về 00 thì cờ TFx được bật lên 1, khi này thanh ghi TL manggiá trị 0 nhưng TL sẽ ngay lậ tức được tự động nạp lại với giá trị banđầu được lưu trong thanh ghi Th
Như vậy trong chế độ này mỗi khi bộ đếm tràn thì thanh ghi chứa sẽđược vi điều khiển nạp lại giá trị ban đầu, do đó chế độ này được gọi
là chế độ tự động nạp lại
Tính giá trị nạp vào thanh ghi chứa của bộ định thời từ thời giantrễ(t):
Gọi N = 256-t/chu kì máy Sau khi chuyển sang mã HEX được 1 số,
ta nạp số này vào thanh ghi TH và cả TL(nạp vào TL giá trị đếm lần
1 và nạp vào TH cho những lần sau để khi bộ đếm tràn thì phần cứngcủa vi điều khiển sẽ tự động sao Th sang TL)
- Các bước lập trình cho bộ định thời để tạo trể ở chế độ 2
B1: nạp giá trị cho thanh ghi thiêt lập chế độ TMOD vớitimer muốn sử dụng
B2: nạp vào TH giá trị đếm ban đầu
B3: khởi động bộ định thời
B4: kiểm tra cờ báo tràn TFx
B5: xoá cờ tràn TFx, quay về B4
2 chế dộ khác của bộ định thời là chế độ 0(chế độ bộ định thời 13 bit, bộđịnh thời/bộ đếm 8 bit, định tỷ lệ truớc 5 bit ) và chế độ 3(chế độ bộ địnhthời chia tách)
b Ngắt của bộ định thời:
o Nguyên tắc sử dụng bộ định thời ở chế độ ngắt:
khai báo ngắt của bộ định thời muốn sử dụng
Nguồn gây ngắt
Chương trình chính và chương trình phục vụ ngắt
o Với ngắt định thời việc khai báo nguồn ngắt bao gồm việc khai báo ngắttoàn cục là EA = 1 và khai báo ngắt cho từng bộ định thời muốn dùngET0= 1 (timer0) và ET1 = 1(timer1)
o Nguồn báo ngắt định thời(với cả 2 chế độ) đều là khi bộ đếm tràn(khi cờ
Trang 8chươnng trình chính và chuyển vào chương trình phục vụ ngắt căn cứ theođịa chỉ của chương trình phục vụ ngắt Khi thực hiện xong chương trìnhphục vụ ngắt vi điều khiển quay trở về chương trình tại nơi bị gián đoạn khitruớc.
o Tóm lại ngắt định thời là việc ta sử dụng bộ định thời tạo trễ một khoảngthời gian được tính toán trước, sau khoảng thời gian này 1 công việc tamong muốn sẽ được thực hiện ở chương trình phục vụ ngắt công việc đó
có thể coi là độc lập với công việc ở chương trình chính
o Các công việc lập trình sử dụng ngắt định thời :
Tính toán thời gian trễ mong muốn và công việc muốn thực hiện saukhoảng thời gian đó
Khai báo ngắt định thời trong chương trình chính (EA=1, ETX=1)
Lựa chọn bộ định thời và chế độ của nó trong thanh ghi TMOD
Khởi động bộ định thời
Xây dựng chương trình chính và các chương trình con cần thiết
Xây dựng chương trình phục vụ ngắt thực hiện 1 công việc mongmuốn (xác định rõ địa chỉ ngắt theo thứ tự ngắt trong bảng vectorngắt)
II LCD:
1 Ghép nối vi điều khiển với LCD 16x2:
Trang 9Màn hình LCD
2 Nguyên lí hoạt động của LCD:
Chân VCC, Vss, và VEE: các chân VCC và VSS cáp dương nguồn 5v và masstương ứng Chân VEE được dùng để điều khiển độ tương phản
Chân chọn thanh ghi RS(Register Select): có 2 thanh ghi trong LCD chân
RS được dùng để chọn thanh ghi nếu RS=0 thì thanh ghi mã lệnh đượcchọn để cho phép người dùng gửi 1 lệnh lên chẳng hạn như xoá màn hình,đưa con trỏ về đầu dòng… Nếu RS=1 thì thanh ghi dữ liệu được chọn chophép người dùng gửi dữ liệu cần hiển thị lên LCD
Chân đọc/ghi (R/W): đầu vào đọc/ghi cho phép người dùng đọc thông tin từLCD khi R/W=1 hoặc ghi thông tin lên LCD
Chân cho phép E(Enable): chân cho phép được sử dụng bởi LCD để chốt dữliệu của nó Khi dữ liệu được cấp đế chân dữ liệu thì 1 xung mức cao xuốngthấp phải được áp đến chân này để LCD chốt dữ liệu trên các chân dữ liệu.Xung này có độ rộng tối thiểu 450ms
Chân DB0-DB7: đây là đường dữ liệu 8bit, dùng để gửi thông tin lên LCD
3 Bảng mã lệnh LCD:
04 Giảm con trỏ(dịch con trỏ sang trái )
06 Tăng con trỏ(dịch con trỏ sang phải)
Trang 1014 Dịch vị trí con trỏ sang phải
Trang 11Chương 2:THIẾT KẾ MẠCH VÀ THUẬT TOÁN.
I Danh sách biến:
DANH SÁCH CÁC BIẾN
1 unsigned char startclock = 1 Biến kiểm tra ( = 1 ) bật giao diện chính đồng hồ
nghĩa là hiện thị ngày giờ hệ thống trên LCD ( =
0 ) tắt nó đi Mặc định nó được bật
Ngoài ra nó còn ràng buộc các chức năng củaphím bấm khi đc bật
2 unsigned char startmenu = 0 Biến kiểm tra ( = 1 ) bật giao hiện Menu ( = 0 )
tắt nó đi Ngoài ra nó cũng có ràng buộc khi được bật
3 unsigned char starthengio=0 Biến kiểm tra ( = 1 ) bật giao hiện hẹn giờ ( = 0 )
tắt nó đi Ngoài ra nó còn ràng buộc các chức năng của phím bấm khi đc bật
4 unsigned char startcaidat = 0 Biến kiểm tra ( = 1 ) bật giao hiện Cài đặt ngày
giờ ( = 0 ) tắt nó đi Ngoài ra nó còn ràng buộc các chức năng của phím bấm khi đc bật
5 unsigned char startSport=0 Biến kiểm tra ( = 1 ) bật giao hiện Đồng hồ thể
thao ( = 0 ) tắt nó đi Ngoài ra nó còn ràng buộc các chức năng của phím bấm khi đc bật
6 unsigned char startDialog=0 Biến kiểm tra ( = 1 ) bật giao hiện Thông báo
( = 0 ) tắt nó đi Ngoài ra nó còn ràng buộc các chức năng của phím bấm khi đc bật
7 unsigned char typetime = 0 Biến để quy định hiện thị kiểu giờ 24 hoặc 12
Trang 128 unsigned char hengio = 0 Biến để kiểm tra có hoặc chưa hẹn giờ Nếu có thì
11 unsigned int day , month ,
year Biến ngày tháng năm.
12 unsigned char data thu = 2 Biến để xác định thứ ( mặc định nó là thứ 2 khi
Mảng chứa số ngày tối đa của tháng
15 unsigned char data cursor = 0 Biến con trỏ Là chỉ số của mảng tọa độ Tại vị trí
toado[ cursor ] , mục đích cho nhấp nháy chổ đó
16 unsigned char data k=7; Chỉ số tối đa của mảng Time[8], và mảng D[7]
Mục đích để thay đổi và điều chỉnh Time[k] và D[k]
17 unsigned char data
Time [ 8 ] Lưu giá trị giờ, phút, giây hiện tại và dùng để xuấtra LCD
18 unsigned char data T [ 8 ] Lưu giá trị thời gian cần hẹn
19 unsigned char data Tsport
[ 6 ] Lưu giá trị thời gian thể thao
20 unsigned char toadoTime[] =
{ 5 , 6 , 8 , 9 }
Cùng với hàm di chuyển con trỏ để cài giờ hẹn
00 : 00 Dùng khi hẹn giờ để trỏ đến mún trỏ đến vị trí hẹn giờ trong LCD
toadoSetTime[] = { 4 , 5 , 7 ,
Cùng với hàm di chuyển con trỏ để cài đặt giờ và ngày cho đồng hồ điện tử Dùng khi cài đặt để trỏ
Trang 138 , 10 , 11 ,2 , 5 , 6 , 7 , 8 , 10
, 11 , 13 , 14 } đến vị trí cần cài đặt sửa lại
22 unsigned char data hour ,
minute , second
Biến giờ phút giây
23 unsigned char data count = 0 Biến dùng để đếm trong timer để định giá trị la
Trang 14II Các chương trình con:
1 Hàm running():
Trang 15//=================== Ham de tao thoi gian ================// sau 0.01 giay thi duoc goi lai trong ham ngat
Time[1]=0;
if(Time[2]==9){
Time[2]=0;
if(Time[3]==5){
Time[3]=0;
if(Time[4]==9){
Time[4]=0;
if(Time[5]==5){
Trang 16if(Time[6]==9&&Time[7]<2){
Trang 18if(phimnhan==4) //doc exit chuyen doi kieu gio he thong 24 <-> 12
// - Trong giao dien man hình menu -// -if(startmenu)
// -{
if(phimnhan==1) //thoat ra{
reset();
startclock=1;
}if(phimnhan==2) // nham phim tang de chon hen gio{
cursor=0;
k=7;
reset();
Trang 19Viewhengio();
}if(phimnhan==3) // nham phim giam de chon cai dat{
Trang 20ViewSport();
}}
3 Hẹn giờ:
void baothuc()
{
if(phimnhan==1)
Trang 21// nhan phim menu de dich chuyen con tro nhap nhay
{
cursor++; k ;// moi lan bam thi dich con tro qua phai 1 don vi dong thoi T[k]->T[k-1]
if(cursor==4){
{
settime_tang(T);
Viewhengio();
}if(phimnhan==3) // nhan phim giam de giam don vi trong hen gio
{
settime_giam(T);
Viewhengio();
}
Trang 22if(phimnhan==4) // nhan exit de thoat va hien thong bao{
Trang 234 Cài đặt:
Trang 27cursor=0;
k=7;
}}
f(phimnhan==2)// nhan phim tang de tang
Trang 29D[3]=0;
month= D[2]+D[3]*10;
}IsLeapYear(year);
Trang 31month= D[2]+D[3]*10;
if ((month>12)||(month==0)){
D[2]=1;
D[3]=0;
month= D[2]+D[3]*10;
}// - Ngay
Trang 32D[0]=ngay[month]%10;D[1]=ngay[month]/10;
}reset();
startclock=1;
}}
Trang 33Chương 3: CODE HOÀN CHỈNH .
/*================THU VIEN KHAI_BAO.H ================*/
unsigned char data D[8];
unsigned int day, month,year;
unsigned char data thu=2;
unsigned char hengio=0;
Trang 34unsigned char run=0;
unsigned char data ngay[]
={0,31,28,31,30,31,30,31,31,30,31,30,31};
unsigned char data cursor=0;
unsigned char data k=7;
unsigned char phimnhan=0;
unsigned char startclock=1;
unsigned char startmenu=0;
unsigned char starthengio=0;
unsigned char startcaidat=0;
unsigned char startDialog=0;
unsigned char startSport=0 ;
unsigned char data Time[8]; //Time he thong
unsigned char data T[8]; //Time Hen gio
unsigned char data Tsport[6]; //Time Hen gio
unsigned char typetime=0;
unsigned char data toadoTime[]={5,6,8,9,11,12};
unsigned char data toadoSetTime[]={4,5,7,8,10,11,2,5,6,7,8,10,11 ,13, 14};
unsigned char data hour,minute,second;
unsigned char data count=0; // Bien dung de dem cho loa keuunsigned char nhayled[20]
Trang 35LCDdata=0xff; //gia tri 0xff
while(BF) //kiem tra co ban
{
EN=0; //dua xung cao xuong thap de chot
EN=1; //dua chan cho phep len cao
}
}
//=======================================================
Trang 36//================== Cac lenh dieu khien LCD=================void LCDcontrol(unsigned char x)
{
RS=0;//chon thanh ghi lenh
RW=0;//ghi len LCD
LCDdata=x ;// gia tri x
EN=1;//cho phep muc cao
EN=0;//xung cao xuong thap
wait();//doi LCD san sang
}
//=======================================================
//==================== Khoi dong LCD=======================void LCDinit(void)
{
LCDcontrol(0x38);//2 dong va ma tran 5x7
LCDcontrol(0x0e);//bat man hinh, bat con tro
LCDcontrol(0x01);//xoa man hinh
}
//=======================================================
Trang 37//================== Hien thi 1 ky tu len LCD ==================void LCDwrite(unsigned char c)
{
RS=1;//ghi du lieu
RW=0;//ghi du lieu len LCD
LCDdata=c;//gia tri C
EN=1;//cho phep muc cao
EN=0;//xung cao xuong thap
Trang 38LCDcontrol(0x80);//ep con tro ve dau dong
}
//======================================================
//======================= Xuat 2 dong ======================void LCD_2line(unsigned char *x1,unsigned char *x2)
unsigned char cursor;
cursor = 64*(line-1) + col-1;