Sự trao đổi các đường dẫn tín hiệu: thái 1 CD Carrier detect Tín hiệu phát hiện mang dữ liệu Vào 3 TD Tranfer data Truyền dữ liệu 4 DTR Data terminal ready Dữ liệu đầu cuối sẵn sàng Ra 6
Trang 1Phần I Cơ Sở Lý Thuyết:
1- CỔNG NỐI TIẾP (COM/ RS232)
Đặc trưng của cổng nối tiếp:
vì lý do kinh tế nên ngày nay thường có 2 cổng là Com 1 và Com 2
Com 1 địa chỉ cơ bản : 3F8H, Com 2 địa chỉ cơ bản : 2F8H, Com 3 địa chỉ cơ bản : 3E8H, Com 4 địa chỉ cơ bản : 2E8H
Sự trao đổi các đường dẫn tín hiệu:
thái
1 CD Carrier detect Tín hiệu phát hiện mang dữ
liệu
Vào
3 TD Tranfer data Truyền dữ liệu
4 DTR Data terminal
ready
Dữ liệu đầu cuối sẵn sàng Ra
6 DSR Data set ready Dữ liệu sẵn sàng được gửi Vào
7 RTS Request to send Tín hiệu yêu cầu gửi Ra
8 CTS Clear to send Tín hiệu yêu cầu xóa để gửi
Trang 2Trên máy tính có 1 vi mạch đảm bảo việc truyền nhận dữ liệu qua cổng nối tiếp vi mạch đó gọi là UART ( Universal Asynchronous Receive/Transmiter) Bộ truyền nhận nối tiếp không đồng bộ UART phổ biến nhất là vi mạch 8250 của Intel và các phiên bản cao hơnnhư 16450, 16550,16570… Việc trao đổi dữ liệ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 mạch này.
- Thanh ghi điều khiển modem ( Địa chỉ cơ sở + 4):
Trạng thái của 2 bít D0 & D1 có liên quan trực tiếp đến các đường dẫn RTS và DTR
D0=D1=1 thì trên 2 chân RTS & DTR sẽ có mức điện áp tương ứng là mức 1 -12V và ngược lại
LOOP =1 thì 8250 hoạt động ở chế độ vòng TXD nối với RXD cho phép kiểm tra đường truyền nhận cổng com trên PC
- Thanh ghi trạng thái modem ( Địa chỉ cơ sở +6)
Thông báo về trạng thái các đường dẫn bắt tay
- Thanh ghi điều khiển đường truyền ( địa chỉ cơ sở +3)
Chức năng đặt thông số đường truyền:
1: có kiểm tra
1: parity chẵnC5 Bít đánh dấu khung cần kiểm tra chẵn
lẻ (Stick bit)
0: không có Stick bit1: Stick bitC6 Bít điều khiển đường truyền( Break bit 0: truyền nhận bình
thường ( mức cao -12V)1: không truyền nhậnDLAB Divisor Latch Access Bit: Bít phân chia truy nhập cho các thanh
ghi có cùng địa chỉ ( 8250 có 3 địa chỉ nhưng có 9 thanh ghi)
- Thanh ghi trạng thái đường truyền ( Địa chỉ cơ sở +5)
Phản ánh trạng thái của đường truyền nối tiếp:
Trang 3S0 =1 khi có 1 byte mới nhận được
S1 =1 khi ký tự trước chưa được đọc, ký tự mới đến sẽ xóa ký tự cũ trong bộ đệm
S2=1 khi có lỗi chẵn lẻ
S3= 1 khi có lỗi khung truyền
S4 =1 khi có gián đoạn đường truyền
S5= 1 khi bộ truyền rỗng cổng nối tiếp có thể truyền nhận
S6= 1 khi bộ đệm rỗng
- Thanh ghi đệm đọc/ghi ( Địa chỉ cơ sở):
Lưu trữ tạm thời dữ liệu truyền nhận từ 2 chân TXD & RXD
- Thanh ghi chứa số chia tốc độ Baud ( byte thấp- Địa chỉ cơ sở)
Gồm 8 bít, chứa phần thấp số chia tốc độ baud
Số chia tốc độ baud = 1843200/(16*tốc độ baud thiết lập)
VD: Tốc độ baud là 9600 thì số chia tương úng là 3, khi đó byte thấp của số chia tốc độ baudđược nạp là 3, byte cao là 0
- Thanh ghi chứa số chia tốc độ Baud ( byte cao- địa chỉ cơ sở +1)
- Thanh ghi chỉ phép ngắt ( địa chỉ cơ sở +1)
D2: đặt ngắt khi thay đổi trạng thái đường truyền
D3: đặt ngắt khi thay đổi trạng thái modem
- Thanh ghi nhận dạng ngắt ( Địa chỉ cơ sở +2)
D2 D1 D0 Mức ưu tiên Nguồn gây ngắt Đặt lại ngắt
0 0 1 Không kiểm tra ngắt
1 1 0 Cao nhất Lỗi đường nhận dữ
liệu Đọc thanh ghi trạng thái đường truyền
1 0 0 Thứ 2 Có nhận dữ liệu Đọc thanh ghi đệm
Do mức logic của bộ vi điều khiển và ở
cổng COM khác nhau Khắc phục vấn đề này
người ta sử dụng vi mạch MAX232 để chuyển
Trang 4đổi mức điện áp giữa hai chuẩn Vi mạch này chứa 2 bộ chuyển đổi mức logic từ TTL sang RSMAX232 và ngược lại
Bảng so sánh diện áp của các mức logic giưa RS232 và TTL:
Đối Tượng Mức logic Mức điện áp tương ứng
Trang 5Dải điện áp ra dương Vs+: -0.3V÷15V
Dải điện áp ra âm Vs-: -0.3V÷-15V
Dải điện áp vào Vi: Driver: -0.3V ÷ Vcc +0.3v
Receive: ±30VDải điện áp ra Vo: T1out, T2out: Vs 0.3V ÷ Vs++0.3V
R1out, R2out: -0.3V ÷ Vcc +0.3V
3-Vi Điều Khiển AT89S52:
Sơ Đồ Chân AT89S52:
Sơ Đồ Khối AT89S52:
Trang 6P1.0 (T2): cửa vào Bộ đếm thời gian/Bộ đếm 2
P1.1 (T2EX): Bộ thời gian/ Bộ đếm 2 bắt/tải lại trigger và điều khiển hướng
P1.5 (MOSI): sử dụng cho chương trình hệ thống bên trong
P1.6 (MISO): sử dụng cho chương trình hệ thống bên trong
P1.7 (SCK): sử dụng cho chương trình hệ thống bên trong
Port 2: (P2.0-> P2.7):
Trang 7Là cổng vào/ra hai chiều 8 bit
Cổng P2 cũng nhận các bit địa chỉ có yêu cầu cao và một số tín
hiệu điều khiển cho chương trình Flash và sự xác nhận.
Port 3: (P3.0-> P3.7):
Là cổng vào/ra hai chiều 8 bit
Ngoài ra:
P3.0: RXD (serial input port - cổng vào nối tiếp)
P3.1: TXD (serial input port - cổng vào nối tiếp)
P3.2: INT0 (external interrupt 0 - Ngắt ngoài 0)
P3.3: INT1 (external interrupt 1 - Ngắt ngoài 1)
P3.4: T0 (timer 0 external input - cổng vào bên ngoài timer 0)
P3.5: T1 (timer 1 external input - cổng vào bên ngoài timer 1)
P3.6: WR (external data memory write strobe)
P3.7: RD (external data memory read strobe
RST: Reset - Tích cực ở mức cao
ALE/PROG:
Chốt địa chỉ ở mức cao, chạy chương trình Flash ở mức thấp
PSEN: Cho phép lưu trữ chương trình để đọc mẫu từ bộ nhớ chương trình ngoài EA/VPP: Cho phép truy nhập từ bên ngoài.
XTAL1: Lối vào của bộ khuếch đại dao động đảo và là lối vào của mạch tạo xung
Trang 8Chân số Ký hiệu Vào/Ra Chức năng
Trang 91.53 s
1.53 s
định dịch hiển thị các thao tác này đợc thực hiện khi
Trang 102 dũng N=0 :Hiển thị 1 dũng F=1 :Hiển thị 5*10 điểm F=0 :Hiển thị 5*7 điểm
AC3
AC2
AC1
AC
0 Cài đặt địa chỉ CGRAM trong địa chỉ bộ đếm.
A C4
A C3
A C2
A C1
A C0
Cài đặt địa chỉ DDRAM trong địa chỉ bộ đếm.
A C4
A C3
A C2
A C1
A C0
Cờ bận đọc (BF) báo hoạt
động bên trong
đang đợc thực hiện và đọc nội dung bộ đếm
BF=1: busy state
BF= 0 : Realdy
0 s s
Trang 11state Ghi
I/F=0: Giảm DDRAM: Display Data RAM
S=1: Bật hiển thị dịch CGRAM: Character Generator RAM
D=1: Bật hiển thị ACG: Character Generator RAM Address
C=1: Bật hiển thị con trỏ ADD: Display Data RAM Address
B=1: Bật con trỏ nhấp nháy AC: Address counter
Trang 12Phần II : Trình Tự Và Nội Dung Thiết Kế:
1 SƠ ĐỒ NGUYÊN LÝ MẠCH ĐỒNG HỒ:
Trang 131 2 9
1 1
1 0
1 3 8
1 4 7
Trang 142-Sơ Đồ Mạch In:
3-Chương Trình Thực Hiện:
// Chuong trinh hien thi thoi gian thuc tren LCD
// Giao tiep voi may tinh qua cong COM
#include <at89s52.h>
#include <stdio.h>
#define LCD_DATA P0
sbit LCD_RS = P1^0; // RS LCD
sbit LCD_E = P1^1; // ENABLE LCD
unsigned int n,chedo,dk;
unsigned int i,So1,So2,So3,So4;
unsigned char x,bien;
Trang 15void Write_cmd_lcd(char bien){
// Hien thi ki tu len LCD
void Write_data_lcd(char datax)
Trang 16{
Write_cmd_lcd(0X03); // Cho phep hien thi dich
Write_cmd_lcd(0X38); // Truyen 8 bit, 2 dong ki tu, 5x7
Write_cmd_lcd(0X06); // Cho phep con tro tang
Write_cmd_lcd(0X0C); // tat hien thi con tro
Write_cmd_lcd(0x01); // Xoa hien thi
} // Chuong trinh ngat de nhan tin hieu tu cong noi tiep void Ngat_COM(void) interrupt 4 { if(RI) {
RI=0; TI=0; sbuff[dk] = SBUF; if ((sbuff[dk]=='@')&(dk>0)) {
sbuff[0] = '@'; dk = 1; }
else {
dk++; sbuff[dk] = SBUF; if(dk>6) {
if(sbuff[6]=='#') {
chedo = sbuff[1]; So1 = sbuff[2]; So2 = sbuff[3]; So3 = sbuff[4]; So4 = sbuff[5];
}
dk = 0; }
}
Trang 17}
void main()
{
EA = 1; // Cho phep ngat toan bo
ES = 1; // Cho phep ngat cong COM
SCON = 0x50; // Dat cong COM 8bit,n,1
sprintf(&message[0],"\1Thoi gian thuc\nGiaotiep com,usb");
Write_str_lcd(&message[0]); // Hien thi chuoi ra LCD
if ( chedo == 1)sprintf(&message[0],"\1CheDo Gio-Phut");
else if ( chedo == 2)sprintf(&message[0],"\1CheDo Phut-Giay");
else if ( chedo == 3)sprintf(&message[0],"\1CheDo Ngay-Thang");
else if ( chedo == 4)sprintf(&message[0],"\1CheDo Thang-Nam");
hien_thi = 0;
}
if ( chedo == 1)
{sprintf(&message[0],"\n %d%d : %d%d ",So1,So2,So3,So4);
Write_str_lcd(&message[0]); // Hien thi chuoi ra LCDchedo = 0;
}
if ( chedo == 2)
Trang 18{sprintf(&message[0],"\n %d%d : %d%d ",So1,So2,So3,So4);
Write_str_lcd(&message[0]); // Hien thi chuoi ra LCDchedo = 0;
}
if ( chedo == 3)
{sprintf(&message[0],"\n %d%d - %d%d ",So1,So2,So3,So4);
Write_str_lcd(&message[0]); // Hien thi chuoi ra LCDchedo = 0;
}
if ( chedo == 4)
{sprintf(&message[0],"\n %d%d - 20%d%d ",So1,So2,So3,So4);
Write_str_lcd(&message[0]); // Hien thi chuoi ra LCDchedo = 0;
}}
Trang 19Private Sub Command1_Click()
Private Sub MyHour_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 48 To 57, 8 ' 0-9 & Backspace
Case Else
KeyAscii = 0
Trang 20End Select
End Sub
Private Sub MyMin_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 48 To 57, 8 ' 0-9 & Backspace
Case Else
KeyAscii = 0
End Select
End Sub
Private Sub MySec_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 48 To 57, 8 ' 0-9 & Backspace
Case Else
KeyAscii = 0
End Select
End Sub
Private Sub MyDay_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 48 To 57, 8 ' 0-9 & Backspace
Case Else
KeyAscii = 0
End Select
End Sub
Private Sub MyMon_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 48 To 57, 8 ' 0-9 & Backspace
Case Else
KeyAscii = 0
End Select
End Sub
Private Sub MyYear_KeyPress(KeyAscii As Integer)
Select Case KeyAscii
Case 48 To 57, 8 ' 0-9 & Backspace
Case Else
KeyAscii = 0
End Select
End Sub
Trang 21Private Sub Start_Click()
If MSComm.PortOpen = False Then
Private Sub Stop_Click()
If MSComm.PortOpen = True Then
Trang 22Private Sub Timer_Timer()
NgayGio.Caption = "Time : " & Format(Now, "hh:nn:ss") & " - Date : " & Format(Now,
"dd/mm/yyyy")
End Sub
Private Sub Timer1_Timer()
If Val(MyHour.Text) > 23 Then MyHour.Text = 0
If Val(MyMin.Text) > 59 Then MyMin.Text = 0
If Val(MySec.Text) > 59 Then MySec.Text = 0
If Val(MyMon.Text) > 12 Then MyMon.Text = 1
If Val(MyDay.Text) > 31 Then MyDay.Text = 1
If Cdo1.Value = True Then
Chedo = 1
So1 = Hour(Time) \ 10
So2 = Hour(Time) Mod 10
So3 = Minute(Time) \ 10
So4 = Minute(Time) Mod 10
Hthi.Caption = "Che do Gio va Phut : " & Val(So1) & Val(So2) & ":" & Val(So3) & Val(So4)
Trang 23So4 = Second(Time) Mod 10
Hthi.Caption = "Che do Phut va Giay : " & Val(So1) & Val(So2) & ":" & Val(So3) & Val(So4)
So4 = Month(Date) Mod 10
Hthi.Caption = "Che do Ngay va Thang : " & Val(So1) & Val(So2) & "/" & Val(So3)
So2 = Month(Date) Mod 10
So3 = (Year(Date) Mod 100) \ 10
So4 = (Year(Date) Mod 100) Mod 10
Trang 24MyTime = TimeSerial(Val(MyHour.Text), Val(MyMin.Text), Val(MySec.Text))
Time = MyTime ' Thay doi thoi gian cua may tinh
MyDate = DateSerial(Val(MyYear.Text), Val(MyMon.Text), Val(MyDay.Text))
Date = MyDate ' Thay doi ngay cua may tinh
End Sub
Private Sub Exit_Click()
If MSComm.PortOpen = True Then MSComm.PortOpen = False
Giúp sinh viên thực hành khả năng lập trình và rèn luyện kỹ năng thiết kế mạch
Là bước đệm cho các công việc thiết kế và lập trình sau này
2:Nhược Điểm:
Những mô hình tạo ra chỉ có tác dụng trong phòng thực hành
Hiện nay do các máy tính đơn giản không còn cồng kềnh nên cổng Com gần như
không còn được sử dụng nhiều, vì vậy ứng dụng của nó bị hạn chế
3 :Hướng phát triển:
Thay vì sử dụng cổng Com nhóm chúng em sử dụng thêm cổng USB, vì hiện nay cổng này được sử dụng nhiều trên máy tính và rất tiện cho người sử dụng
Đối với mô hình này cổng USB vừa được sử dụng để giao tiếp thay vì sử dụng cổng
Com Đồng thời sử dụng làm nguồn cấp cho mô hình khi sử dụng cổng Com của máy tính