Bộ UART Universal Ansynchronous Receiver and Transmitter 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 cổng COM của máy tính.. Gồm có một bộ Timer 14 bit
Trang 1PHẦN I: Mở đầu
I Đặt vấn đề
- Thiết kế mạch hiển thị thời gian theo thời gian hệ thống của máy tính.
II Mục đích thiết kế
- Phát huy, ứng dụng được kiến thức đã học vào môi trường thực tế
- Qua đây có thêm nhiều kinh nghiệm giúp ích sau khi ra trường có thể hòa nhập với công nghệ tiên tiến trên xã hội
III Nội dung đề tài
1 Đề tài
2.Chức năng của hệ thống
- Cập nhật giờ hệ thống của máy tính
- Thay đổi được ngày, giờ hệ thống
+ Giờ/Phút
+ Tháng/Ngày
+ Năm/Tháng
- Cập nhật lên tục cho mạch
- Mạch hiển thị các nội dung yêu cầu
PHẦN II : CƠ SỞ LÝ THUYẾT
Trang 2I Sơ đồ khối và chức năng các khối của AT89S52:
Bộ vi điều khiển AT89S52 gồm các khối:
1.1 CPU ( Central Processing Unit):
- Thanh ghi tích lũy A
- Thanh ghi tích lũy phụ B, dùng cho phép nhân và phép chia
- Đơn vị logic học ( ALU: Arithmetic Logical Unit)
- Từ trạng thái chương trình (PSW: Program Status Word)
- Bốn băng thanh ghi
- Con trỏ ngăn xếp
1.2 Bộ nhớ chương trình (Bộ nhớ ROM) gồm 8Kb Flash.
1.3 Bộ nhớ dữ liệu (Bộ nhớ RAM) gồm 256 bytes.
1.4 Bộ UART (Universal Ansynchronous Receiver and Transmitter)
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 cổng COM của máy tính
1.5 3 bộ Timer/Counter 16 bit thực hiện các chức năng định thời và
đếm sự kiện
1.6 WDT (Watch Dog Timer): được dùng để hồi phục lại hoạt động
của CPU khi nó bị treo bởi 1 nguyên nhân nào đó Gồm có một bộ Timer 14 bit, một bộ Timer 7 bit, thanh g hi WDTPRG (WDT programable) điều khiển Timer 7 bit và một thanh ghi chức năng WDTRST (WDT resister)
Trang 32.1 Port 0 (P0.0 – P0.7)
Port 0 gồm 8 chân, 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 AT89S52 giao tiếp với các thiết bị ngoài có kiến trúc Bus
2.2 Port 1 (P1.0 – P1.7)
Đối với 8051, chức năng duy nhất của Port 1 là chức năng xuất nhập, cũng như các Port khác, Port 1 có thể xuất nhập theo bit và theo byte
2.3 Port 2 (P2.0 – P2.7)
Port 2 là một Port công dụng kép: là các đườ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
2.4 Port 3 (P3.0 – P3.7)
Mỗi chân trên Port 3 ngoài các chức năng xuất nhập thì còn một chức năng riêng cụ thể như sau:
2.5 PSEN (Program Store Enable) : điều khiển đọc bộ nhớ ngoài.
2.6 ALE (Address Latch Enable) : dùng để cho phép mạch chốt bên
ngoài
2.7 EA (External Access) : chọn bộ nhớ chương trình Khi ở mức cao
thì chọn ROM trong, ngược lại ở mức thấp chọn ROM ngoài
3 Các thiết kế sử dụng ngắt
AT89s52 có 6 nguồn ngắt:
Trang 4 Ngắt do bộ timer 0.
6 nguồn ngắt này được xoá khi Reset và được đặt riêng bằng phần mềm bởi các bit trong các thanh ghi cho phép ngắt(IE), thanh ghi ưu tiên ngắt (IP)
Thanh ghi cho phép ngắt IE
Bit Ký hiệu Mô tả( 1cho phép , o cấm)
IE.7 EA Cho phép hoặc cấm toàn bộ.
IE.6 - Không được địng nghĩa.
IE.5 ET5 Cho phép ngắt từ timer 2.
IE.4 ES Cho phép ngắt từ port nối tiếp.
IE.3 ET1 Cho phép ngắt từ timer 1.
IE.2 EX1 Cho phép ngắt ngoài 1.
IE.1 ET0 Cho phép ngắt từ timer 0.
IE.0 EX0 Cho phép ngắt ngoài 0.
Thanh ghi ưu tiên ngắt IP.
II.IC MAX232
Trang 5Bảng so sánh điện áp của các mức logic giữa RS232 va TTL
TƯƠNG ỨNG Cổng Com
(Mức RS232)
Vi điều khiển
(Mức TTL)
Khắc phục vấn đề này, người ta sử dụng vi mạch MAX232 để chuyển đổi mức điện áp giữa hai chuẩn Vi mạch này có chứa hai bộ chuyển đổi mức logic từ TTL sang RS232 va ngược lại
III.CÔNG NỐI TIẾP
Cổng nối tiếp là một giao diện rất phổ biến trên máy tính, cổng này còn có một số tên gọi thông dụng như Com, RS232
Sự trao đổi của các đường dẫn tín hiệu
Trên máy tính có 1 vi mach UART (Universal Asynchronous Receiver/ Transmitter) đảm trách việc truyền nhận dữ liệu thông qua cổng nối tiếp UART phổ biến nhất là vi mạch 8250cuar hãng Intel và các phiên bản cao hơn của vi mạch này như 16450,16660,16750…Vi mạch này thường được hàn cố định trên main gần giao diện cổng nối tiếp Việc trao đổi dữ
U 5
M A X 2 3 2
1
3
4
5
2
6
1 2 9
1 1
1 0
1 3
8
1 4 7
C 1 +
C 1
-C 2 +
C 2
-V +
V
-R 1 O U T
R 2 O U T
T 1 I N
T 2 I N
R 1 I N
R 2 I N
T 1 O U T
T 2 O U T
Trang 6liệu qua cổng nối tiếp thực chất là việc truy xuất các thanh ghi của vi mach này Và điều đầu tiên khi lập trình với cổng Com là phải tìm hiểu các thanh ghi của bộ UART tương ứng trên máy tính
Thanh ghi điều khiển đường truyền 3F8 +3
Thanh ghi trang thái đương truyền 3F8 + 5
Thanh ghi chứa số chia tốc độ baud (byte thấp) 3F8
Thanh ghi chứa số chia tốc độ baud (byte cao) 3F8+1
Trang 7T2/P1.0 1 T2 EX/P1.1 2 P1.2 3 P1.3 4 P1.4 5 MOSI/P1.5 6 MISO/P1.6 7 SCK/P1.7 8 RESET 9 RXD/P3.0 10 TXD/P3.1 11 INT0/P3.2 12 INT1/P3.3 13 T0/P3.4 14 T1/P3.5 15 WR/P3.6 16 RD/P3.7 17 XTAL1 18 XTAL2
19 P2.0/A8P2.1/A9 2122
P2.2/A10 23 P2.3/A11 24 P2.4/A12 25 P2.5/A13 26 P2.6/A14 27 P2.7/A15PSEN 28 29 ALE/PROGEA/VPP 30 31
P0.0/AD0 39 P0.1/AD1 38 P0.2/AD2 37 P0.3/AD3 36 P0.4/AD4 35 P0.5/AD5 34 P0.6/AD6 33 P0.7/AD7 32
IC1 AT89S52
R16 10k
C1 10uF
VCC
X1
GND
C2 104
1
HD1
VCC
470 R17 D1
VCC
VCC
L4
L1
220 R5 220 R6 220 R7 220 R8 220 R9 220 R10 220 R14 220 R15
a c e f g
b c d e f g h
a a b c d e f g h
Q4 A1015 Q3 A1015 Q2 A1015
R4 1k R3 R2
VCC
L3
b c d e f g h
L2
b c d e f g h
Q1 A1015
R1
C1+ 1
VS+
C2+
4
C2-5
VS- 6
T2OUTR2IN 7
8 R2OUT
9
T2IN
10
T1IN
11 R1OUT
T1OUT 14
IC2 MAX232
C4
10uF
C3 10uF C5
10uF
C6
10uF
VCC
1 2 3 4 5
6 7 8 9
11 10
COM1
RXD
VCC
RXD
2 1
SW1
9
10
11
12
13
14
15
16
8
7
6
5
4
3
2
1
2
1
8
6 2
7 3 4
9
2 1
2 1
2
1
2
1
1 2
2 1
1 2
1
2
1 2
1 2
1 2
11
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
20 19 18 17 16 15 14 13 9
8 7
6 5
3 2
2
1
1
2 2 1
2 1
2
1
5
6 8 9
6 8 9
5
6 8 9
6 8 9
3 2 1
3 2 1
3 2 1
3
2
1
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
1 2
PHẦN III : MẠCH VÀ CODE.
1 Sơ đồ mạch nguyên lý.
2 Mạch PCB
Trang 83 Thiết kế giao diện
3.1 Code VB6
Option Explicit
Dim x1, x2, x3, x4 As String
Dim X, dd4, dd3, dd2, dd1 As Integer
Private Sub Command1_Click()
' thoat khoi chuong trinh
End
End Sub
Private Sub Command2_Click() ' thay doi ngay he thong
Date = DTPicker1.Value
' thay doi gio he thong
Time = DTPicker2.Value
Trang 9End Sub
Private Sub Form_Load()
' - COM1
With MSComm1
.Settings = "9600,N,8,1"
.CommPort = 1
.RThreshold = 1
.SThreshold = 0
.InputMode = 0
.InputLen = 0
.Handshaking = comNone
.InBufferSize = 1024
.OutBufferSize = 1024
If PortOpen = False Then
PortOpen = True
End If
End With
End Sub
Private Sub Timer1_Timer()
'lay ngay gio he thong
Text5 = Format(Now, "ddd dd/mm/yy" & " ^ " & "hh:nn:ss")
'chon che do phut/giay
If (Option1.Value = True) Then
Text6 = (Format(Now, "nn") \ 10)
Text7 = (Format(Now, "nn") Mod 10)
Text8 = (Format(Now, "ss") \ 10)
Text9 = (Format(Now, "ss") Mod 10)
End If
'chon che do gio/phut
If (Option2.Value = True) Then
Text6 = (Format(Now, "hh") \ 10)
Text7 = (Format(Now, "hh") Mod 10)
Text8 = (Format(Now, "nn") \ 10)
Trang 10Text9 = (Format(Now, "nn") Mod 10)
End If
'chon che do thang/ngay
If (Option3.Value = True) Then
Text6 = (Format(Now, "mm") \ 10)
Text7 = (Format(Now, "mm") Mod 10)
Text8 = (Format(Now, "dd") \ 10)
Text9 = (Format(Now, "dd") Mod 10)
End If
'chon che do nam/thang
If (Option4.Value = True) Then
Text6 = (Format(Now, "yy") \ 10)
Text7 = (Format(Now, "yy") Mod 10)
Text8 = (Format(Now, "mm") \ 10)
Text9 = (Format(Now, "mm") Mod 10)
End If
End Sub
Private Sub Timer2_Timer()
'bien doi cac text co so can truyen ve kieu so nguyen
dd1 = Val(Text6.Text)
dd2 = Val(Text7.Text)
dd3 = Val(Text8.Text)
dd4 = Val(Text9.Text)
'bien doi cac so nguyen ve kieu ky tu
x1 = Chr(dd1)
x2 = Chr(dd2)
x3 = Chr(dd3)
x4 = Chr(dd4)
'truyen xuong mach
MSComm1.Output = "@"
MSComm1.Output = x1
MSComm1.Output = x2
MSComm1.Output = x3
MSComm1.Output = x4
Trang 11End Sub
4 Code phần mềm cho 89s52
#include<reg52.h>
#include<stdio.h>
#include<math.h>
sbit LED1=P1^1; // quet led hang don vi
sbit LED2=P1^0; // quet led hang chuc
sbit LED3=P1^3; // quet led hang tram
sbit LED4=P1^2; // quet led hang nghin
int so4, so3,so2,so1,i,j,tg;
unsigned char dem=0;
unsigned char
M[10]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; // ma led 7 thanh
void timer0 (void) interrupt 1
{
TH0=0xF8;
TL0=0x40;
switch(dem)
{
case 0:
LED2=LED3=LED4=1;
P0=m[so1];
LED1=0; //
break;
case 1:
LED1=LED3=LED4=1;
P0=M[so2];
LED2=0; // LED hang chuc break;
case 2:
LED1=LED2=LED4=1;
P0=M[so3];
LED3=0; // led hang tram
case 3:
Trang 12LED1=LED2=LED3=1;
P0=M[so4];;
LED4=0; // led hang nghin
}
if(++dem==4)dem=0;
}
void main()
{
SCON=0x52;
TMOD=0x20;
TH1=TL1=-3;
TR1=1;
TH0=0xF8;
TL0=0x30;
TR0=1;
ET0=EA=1;
PT0=1;
tg =10;
while(1)
{
do
{
tg =_getkey();
}
while(tg!='@');
so1=_getkey();
so2=_getkey();
so3=_getkey();
so4=_getkey();
};
}