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

THIẾT KẾ ĐỒNG HỒ ĐIỆN TỬ HIỂN THỊ BẰNG MÀN HÌNH TINH THỂ LỎNG (LCD)

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 (367.33 KB, 25 trang )

BỘ GIÁO DỤC ĐÀO TẠO
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI

ĐỒ ÁN MÔN HỌC
THIẾT KẾ ĐỒNG HỒ ĐIỆN TỬ HIỂN THỊ BẰNG
MÀN HÌNH TINH THỂ LỎNG (LCD)

GIÁO VIÊN HƯỚNG DẪN
NGUYỄN ANH DŨNG
SINH VIÊN THỰC HIỆN
NGUYỄN MINH ANH

HÀ NỘI-2014
1


A.GIỚI THIỆU TỔNG QUAN VỀ HỌ 8051
Vi điều khiển 8051 – Mô tả phần cứng
Vi điều khiển 8051 là một trong những họ vi điều khiển 8bit thông dụng
nhất trên thế giới. Vi điều khiển này được chế tạo lần đầu tiên bởi hãng Intel,
sau đó được các hãng khác chế tạo dưới dạng các dẫn xuất khác nhau. Các
dẫn xuất này đều có chung một kiến trúc giống với vi điều khiển 8051 kinh
điển. Thêm vào đo, tùy theo từng loại mà các chip dẫn xuất được tích hợp
thêm các ngoại vi khác nhau (như ADC, SPI, EEPROM, capture/compare
channels…), tính năng cũng được nâng cao để phù hợp với các ứng dụng
ngày càng phức tạp.
Trước hết xin giới thiệu một số tính năng của họ vi điều khiển 8051
(lưu ý là những tính năng này là của vi điều khiển 8051 kinh điển):
- CPU 8bit được thiết kế tối ưu cho các ứng dụng điều khiển.
- Co cac khả năng xử lý bit logic.
- Không gian bộ nhớ chương trình 64Kbyte.


- Khơng gian bộ nhớ dữ liệu 64 Kbyte.
- Tích hợp 4Kbyte bộ nhớ chương trình trên chip.
- Tích hợp 128byte bộ nhớ RAM trên chip.
- Có 32 đường vàoo/ra 2 chiều cố thể định địa chỉ đến từng bit.
- Tích hợp 02 timer 16bit.
- Tích hợp UART song song.
- Cấu trúc ngắt với 06 nguồn/05 vector ở 02 mức ưu tiên khác nhau.
- Tích hợp mạch bộ dao động trên chip.
Vi điều khiển được giới thiệu ở đây được sản xuất theo công nghệ CMOS.
Một số loại vi điều khiển thơng dụng thuộc họ 8051 có thể kể ra như:
AT89C2051( 20 chân), AT89C4051( 20 chân), AT89C51( 40 chân),

2


AT89C52( 40 chân), AT89S51( 40 chân), AT89S52( 40 chân),
AT89S53( 40 chân)
Sau đây là sơ đồ khối tổng quan của 8051

3


I-Cấu trúc phần cứng họ 8051( AT 89S52)

Sơ đồ chân AT 89S52
Bộ vi điều khiển AT89S52 gồm các khối chức năng chính sau đây:
CPU( Central Processing Unit) bao gồm:
- Thanh ghi tích luỹ A
- Thanh ghi tích luỹ phụ B, dùng cho phép nhân và phép chia
- Đơn vị logic học( ALU: Arithmetic Logical Unit)


4


- Từ trạng thái chương trình( PSW: Progam Status Word)
- Bốn băng thanh ghi
- Con trỏ ngăn xếp
Bộ nhớ chương trình( Bộ nhớ ROM) gồm 8Kb Flash.
Bộ nhớ dữ liệu( Bô nhớ RAM) gồm 256 bytes.
Bộ UART( Universal Ansynchronous Receiver and Tranmitter) làm chức
năng truyền nhận nối tiếp, nhờ khối này, AT89S52 có thể giao tiếp với máy
tính qua cổng COM.
3 bộ Timer /Counter 16 bít thực hiện các chức năng định thời và đếm sự
kiện.
WDM( Watch Dog Timer) được dùng để phục hồi lại hoạt động của
CPU khi nó bị treo bởi một nguyên nhân nào đó. WDM ở AT89S52 gồm
một bộ Timer 14 bít, một bộ Timer 7 bít, thanh ghi WDTPRG( WDT
programable) điều khiển Timer 7 bit và một thanh ghi chớc năng WDTRST(
WDM register). Bình thường WDT không hoạt động( bị cấm), để cho phép
WDT, các giá trị 1EH và E1H cần phải được ghi liên tiếp vào thanh ghi
WDTRST. Timer 14 bit của WDT sẽ đếm tăng dần sau mỗi chu kỳ đồng hồ
cho đến giá trị 16383 thì xảy ra tràn. Khi xảy ra tràn, chân RTS sẽ được đặt
ở mức cao trong thời gian 96.Tosc (Tossc=1/Fosc) và AT89S52 sẽ được
reset. Khi WDT hoạt động, ngoại trừ reset phần cứng và reset do WDT tràn
thì khơng có cách nào cấm được WDT, vì vậy khi sử dụng WDT thì các
đoạn mã chương trình phải được đặt trong các khe thời gian từ khi giữa các
lần WDT được khởi tạo lại

5



Sơ đồ khối của bộ vi điều khiển 89S52

6


II- Sơ đồ các chân và chức năng

1. Port 0(P0.0-P0.7 hay từ chân 32 đến chân 39): Gồm 8 chân, ngồ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 AT89S52 giao tiếp với thiết bị ngồi có
kiến trúc Bus

7


2. Port 1( P1.0-P1,7 hay từ chân 1 đến chân 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

3. Port 2( P2.0- P2.7 hay từ chân 21 đến chân 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.

4. Port 3( P3.0- P3.7 hay từ chân 10 đến chân 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 chức năng riêng:

8



Bit

Tên

Chức năng

P3.0

RXD

Dữ liệu nhận cho port nối tiếp

P3.1

TXD

Dữ liệu phát cho port nối tiếp

P3.2

INT0

Ngắt 0 bên ngoài

P3.3

INT1

Ngắt 1 bên ngoài


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 bên ngoài

P3.7

RD

Xung đọc bộ nhớ dữ liệu bên ngồi

5. 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 2uS đối với
thạch anh 12MHz.
Trạng thái của các thanh ghi khi reset, khi reset thì trạng thái của các
thanh ghi không thay đổi


9


6.

Cỏc ngừ vào bộ dao động Xtal1, Xtal2:
Bộ tạo dao động được tích hợp bờn trong 89S52. Khi sử dụng 89S52,

người ta chỉ cần nối thêm tụ thạch anh và các tụ. Tần số tụ thạch anh thường
là 12 Mhz-24Mhz.

.

.

7 . 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 trinh chỉ được thi hành từ bộ nhớ mở rộng.
8 .ALE( Address Latch Enable):

10


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ớ.
9 .PSEN( Program Store Enable):
PSEN là điều khiển để cho phép bộ nhớ chương trình mở rộng và

trường được nố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)
10 . Vcc, GND:
AT89S52 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(+) và chân 20(-).

11


B : NỘI DUNG
I.CODE
#include <REGX52.H>
#include <lcd_driver.h>
#define change

P3_3

#define ok

P3_4

#define up

P3_5

#define down


P3_6

unsigned char mode = 0;
unsigned char hrs,min,sec,date,month,year;
unsigned int i;
void setting(void);
void display(void);
void ngat_hien_thi_thoi_gian_timer_0 (void);
void setting(void)
{
P0=0xFF;
hrs=12; min=0; sec=0;
date = 27; month = 2; year = 9;
TMOD= 0x21;
TH1 = 55;
IE = 0x8A;
TR1 = 1;
TR0 = 1;
}
12


void display()
{
lenh(ve_dau_dong_thu_nhat);
lenh(tat_con_tro);
lcd_gotoxy(2,4);
write_num(hrs);
write(":");

write_num(min);
write(":");
write_num(sec);
lcd_gotoxy(1,3);
write_num(date);
write("/");
write_num(month);
write("/20");
write_num(year);
}
void main(void)
{
setting();
khoi_tao_lcd();
lenh(xoa_man_hinh);
display();
while(1)
{
if(!change)
13


{
while(!change);
TR0 = 0;
TR1=0;
mode++;
while(mode != 0 || mode >= 7)
{
if(!change) //

{
while(!change);
mode++;
}
if(mode > 7)mode=0;
switch(mode)
{
case 1:
if (up==0)
{
hrs++;
if(hrs==24) hrs=0;
while(!up);
display();
}
else if (down==0)
{
hrs--;
if(hrs == 0)hrs=23;
14


while(!down);
display();
}
display();
if(ok==0 || mode==0) goto escape;
break;
case 2://change minutes
if (up==0)

{
min++;
if(min==60)min=0;
while(!up);
display();
}
else if (down==0)
{
if(min==0)min=60;
min--;
while(!down);
display();
}
if(ok==0 || mode==0) goto escape;
break;
case 3:

//change seconds

if (up==0 || down==0)
{
15


sec=0;
}
display();
if(ok==0 || mode==0) goto escape;
break;
case 4:


// chinh ngay

if (!up)
{
date ++;
if (month == 2 && date > 28 ) date = 1;
if ((month == 1 || month == 3 || month == 5 ||
month == 7 || month == 8 || month == 10 || month == 12) && date > 31)
date = 1;
if ((month == 4 || month == 6 || month == 9 ||
month == 11 ) && date > 30) date = 1;
while(!up);
display();
}
else if (!down)
{
date --;
if (date == 0 && month == 2 ) date = 28;
if ((month == 1 || month == 3 || month == 5 ||
month == 7 || month == 8 || month == 10 || month == 12) && date == 0)
date = 31;
if ((month == 4 || month == 6 || month == 9 ||
16


month == 11 ) && date == 0) date = 30;
while(!down);
display();
}

if(ok == 0 || mode == 0) goto escape;
break;
case 5://chinh thang
if (up==0)
{
month ++;
if(month > 12) month =1;
while(!up);
display();
}
else if (down==0)
{
min--;
if(month == 0)

month = 12;

while(!down);
display();
}
if(ok==0 || mode == 0) goto escape;
break;

17


case 6://chinh nam
if (up==0)
{
year++;

if(year == 100 ) year = 1;
while(!up);
display();
}
else if (down==0)
{
year --;
if(year == 0)year = 99;
while(!down);
display();
}
if(ok==0 || mode == 0) goto escape;
break;
if(mode == 0)
{
display();
break;
}
}
escape:
TR1=1;
18


TR0 = 1;
mode = 0;
}
}
}
void ngat_timer_1(void)interrupt 3

{
i++;
if(i==5000)
{
i=0;
sec++;
if(sec==60)
{
sec=0;
min++;
if(min==60)
{
min=0;
hrs++;
if(hrs==24)
{
hrs=0;
date ++;
if (month == 2 && date >= 29)
{
19


date = 1;
month ++;
}
if ((month == 1 || month == 3 || month == 5 || month == 7
|| month == 8 || month == 10 || month == 12) && date >31)
{
date = 1;

month ++;
if(month > 12)
{
month = 1;
year ++;
if(year == 100) year = 0;
}
}
if ((month == 2 || month == 4 || month == 6 || month == 9
|| month == 11 ) && date >30)
{
date = 1;
month ++;
}
}
}
}
}
}

20


void ngat_hien_thi_thoi_gian_timer_0 (void)

interrupt 1

{
TF0 = 0;
display();

}
#define xoa_man_hinh

0x01

#define tat_con_tro

0x0c

#define ve_dau_dong_thu_nhat 0x80
#define

lcd_rs

P0_5

#define

lcd_rw

P0_6

#define

lcd_en

P0_7

#define


port_data

P2

char x;
void delay(unsigned int ms);
void busy_flag(void);
void lenh(unsigned char LCDcmd);
void write_data(unsigned LCD_data);
void write(char *s);
void khoi_tao_LCD(void);
void write_num(unsigned int number);
void lcd_gotoxy(unsigned char row,unsigned char column);
void delay(unsigned int ms)
{
unsigned int i;
for(i=0;i}
21


void busy_flag(void)
{
port_data = 0xff;
lcd_rs=0;
lcd_rw=1;
do
{
lcd_en=1;
delay(1);

x= (port_data & 0x80);
lcd_en=0;
}
while(x!=0);
}
void lenh(unsigned char LCDcmd)
{
busy_flag();
port_data = LCDcmd;
lcd_rs=0;
lcd_rw=0;
lcd_en=1;
delay(5);
lcd_en=0;
delay(5);
}

22


void write_data(unsigned LCD_data)
{
busy_flag();
port_data = LCD_data;
lcd_rs = 1;
lcd_rw = 0;
lcd_en = 1;
delay(5);
lcd_en = 0;
delay(5);

}
void write(char *s)
{
while (*s)
{
write_data(*s);
s++;
}
}
void khoi_tao_lcd(void)
{
lenh(0x38);
lenh(0x0e);
lenh(0x0d);
lenh(tat_con_tro);
}
23


void write_num(unsigned int number)
{
char ch,dv;
ch = number / 10;
dv = number % 10;
write_data(0x30 + ch);
write_data(0x30 + dv);
}
void lcd_gotoxy(unsigned char row,unsigned char column)
{
switch(row)

{
case 1:
lenh(0x80+column);
break;
case 2:
lenh(0x80+0x40+column);
break;
default:
break;
}
}

24


II. Sơ Đồ Nguyên Lý và Mạch In
III.Nguyên Lý hoạt Động
Dùng timer đếm xung để định thời gian,dùng thạch anh 12MHz tức là
trong 1 giây nó sẽ tạo ra 12 triệu xung.con 89 thực hiện lệnh sau mỗi 12
xung thạch anh. tức là timer đếm đc 1 triệu xung thỡ sẽ được 1 giây cứ thế ta
sẽ có được thời gian cần tính trong con này có tất cả 3 timer, ta dùng 1 timer
để đếm thời gian dùng 1 timer để hiển thị. timer này sẽ ngắt liên tục để đọc
thời gian mà bộ timer kia làm được
C.ĐÁNH GIÁ
Ưu Điểm: Chi phí sản xuất thấp
Dể sử dụng
Tuy nhiên trong quá trinh thực hiện chúng em vẫn còn gặp nhiều những
sai sót. Mong q thầy(cơ) tham gia đóng góp ý kiến để chúng em hoàn
thiện hơn.
Chúng em xin chân thành cảm ơn!


25


×