Tuy nhiên máy tính không chỉ dừng lại với thiết bị ngoại vi nói trên mà có những yêu cầu cao hơn, như kết nối với các máy móc trong công nghiệp… và đã được các nhà sản xuất lưu tâm tới v
Trang 1BỘ CÔNG THƯƠNG
TRƯỜNG ĐẠI HỌC CÔNG NGHIỆP HÀ NỘI
KHOA ĐIỆN TỬ
MÁY TÍNH
GVHD : VŨ THỊ THU HƯƠNG
SVTH : NGUYỄN VĂN TRUNG
ĐẶNG VĂN TÍN
VŨ VĂN THÁI
LỚP : ĐIỆN TỬ 4_K5
LỜI NÓI ĐẦU Trong các máy tính thế hệ hiện nay có một số thiết bị ngoài thông dụng như: Màn hình, bàn phím, chuột, máy in…với các thiết bị ngoài đó máy tính đều có khối ghép nối tương ứng và chúng được tích hợp luôn trên một bo mạch gọi là main board Tuy nhiên máy tính không chỉ dừng lại với thiết bị ngoại vi nói trên
mà có những yêu cầu cao hơn, như kết nối với các máy móc trong công nghiệp…
và đã được các nhà sản xuất lưu tâm tới và họ để trống vô số các con đường có thể ghép nối với bus của máy tính như: RS232, LPT, COM, USB, các khe PCI …Đây chính là con đường ai muốn nghiên cứu mở rộng phạm vi kết nối của máy tính kết
Trang 2hợp sử dụng với bộ vi điều khiển có thể lập trình được Qua nội dung môn học được nghe cô giảng dạy và tìm hiểu tài liệu, và trong phạm vi đồ án nhỏ này chúng
em thực hiện việc kết nối với máy tính qua cổng COM với bo mạch ngoài, cụ thể
là bo mạch ngoài dùng vi điều khiển để đo dòng điện rồi hiển thị kết quả đo được trên máy tính thông qua cổng COM
Mục đích của đề tài hướng đến: Tạo ra bước đầu cho sinh viên thử nghiệm ứng dụng vi điều khiển để giao tiếp với máy tính
Việc thực hiện xong đồ án môn học bằng các kiến thức đã học, một số sách tham khảo và một số nguồn tài liệu khác nên không tránh khỏi những thiếu sót Vì vậy nhóm rất mong được sự góp ý của thầy cô và các bạn
Chúng em xin chân thành cảm ơn!
Trang 3LỜI NHẬN XÉT
MỤC LỤC Phần I Giới thiệu khái quát 5
I.Giới thiệu tổng quan về vi điều khiển 5
1.Sơ đồ khối AT89C52 5
2.Những đặc trưng cơ bản AT89C52 6
3.Sơ đồ chân 6
II.Giới thiệu về cổng COM 10
1.Khái quát 10
2.Một số thuộc tính MSComm 11
Phần II Thiết kế đề tài 16
Trang 41.Code Vi điều khiển 16
2.Giao diện và code VB 19
3.Mô phỏng trên Proteus 23
PHẦN I: GIỚI THIỆU KHÁI QUÁT
I.Giới thiệu tổng quan về họ vi điều khiển 8051
Họ vi điều khiển 8051 là một trong những họ vi điều khiển thông dụng nhất Đây
là họ vi điều khiển được sản xuất theo công nghệ CMOS Có tốc độ cao và công suất thấp, bộ nhớ Flash có thể lập trình được
Trang 51 Sơ đồ khối của AT89C52
2.Những đặc trưng của AT89C52
• Một port nối tiếp sang công có thể lập trình được
3 Sơ đồ chân và chức năng của AT89C52
Trang 6Như vậy theo sơ đồ trên AT89s52 có 40 chân mỗi chân có chức năng như các đường I/O (xuất nhập ) , trong đó 24 chân có công dụng kép, môi x đường có thể hoạt động như một đường I/O hoặc như đường điều khiển hoặc như thành phần của bus điều khiển và bus dữ liệu
a Port 0 ( P0.0- P0.7)
Port 0 gồm 8 chân, ngoài các chức năng xuất nhập, 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 8051 giao tiếp với các thiết bị ngoài có kiến trúc bus như các vi mạch nhớ, mạch nhớ PIO…
b Port 1 ( P1.0- P1.7)
Trang 7Port 1 có chức năng xuất nhập theo bit và byte Ngoài ra, ba chân P1.5, P1.6, P1.7 được dùng để nạp ROM theo chuẩn ISP, hai chân P1.0, và P1.1 được dùng cho bộ Timer 2
c Port 2 (P2.0-P2.7)
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 bị đồng bộ nhớ mở rộng
d
Port 3 (P3.0- P3.7)
Mỗi chân trên Port 3 ngoai chức năng xuất nhập còn có chức năng riêng,
cụ thể như sau :
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 truyền cho port nối tiếp
P3.2 INT0 Ngắt bên ngoài 0
P3.3 INT1 Ngắt bên ngoài 1
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 ngoài
P3.7 /RD Xung đọc bộ nhớ dữ liệu ngoài
e Chân /PSEN ( Program store Enable)
/PSEN là chân điều khiển đọc chương trình ở bộ nhớ ngoài, nó được nối với chân /OE để cho phép đọc các byte mã lệnh trên ROM ngoài /PSEN sẽ ở mức thấp
Trang 8trong thời gian đọc mã lệnh Mã lẹnh được đọc từ bộ nhơ s ngoài qua bus dữ liệu (Port 0) thanh ghi ệnh để được giải mã Khi thực hiện chương trình trong ROM nội thì /PSEN ở mức cao
f Chân ALE (Address Latch Enable)
ALE là tín hiệu điều chỉnh chốt địa chỉ có tần số bằng 1/6 tần số dao động của vi
điều khiển tín hiệu ALE được dùng để cho phép vi mạch chốt bên ngoài như
74373, 74573 chốt byte địa chỉ thấp ra khỏi bus đa hợp địa chỉ / dữ liệu (Port 0)
g Chân /EA (External Access)
Tín hiệu /EA cho phép chọn bộ nhớ chương trình là bộ nhớ trong hay ngoài vi
điều khiển Nếu EA ở mức cao (nối với vcc), thì vi điều khiển thi hành chương trình trong ROM nội Nếu /EA ở mức thấp (nối với GND), thì vi điều khiển thi hành chương trình từ bộ nhớ ngoài
h RST (Reset)
Ngõ vào RST trên chân 9 là ngõ Reset của 8051 Khi tín hiệu này được đưa lên
mức cao , các thanh ghi trong bộ vi điều khiển được tải những giá trị thích hợp để khởi động hệ thống
i XTAL1, XTAL2
AT89C52 có một bộ dao động trên chíp, nó thường được nối với với bộ dao
động bằng thạch anh có tần số lớn nhất là 33MHZ, thông thường là 12MHZ
j Vcc, GND
AT89s52 dùng nguồn điện áp một chiều có dải điện áp từ 4v đến 5,5v được cấp
qua chân 20 và 40
II.Cổng COM
1.Khái quát
RS232 là một chuẩn giao tiếp nối tiếp dùng định dạng không đồng bộ, kết nối nhiều nhất là với 2 thiết bị, chiều dài kết nối lớn nhất cho phép để đảm bảo dữ liệu là 50 – 100 feet ( 12.7 đến 25.4 m), tốc độ 20kBít/s đôi khi là tốc độ 115 k Bit/s với một số thiết bị đặc biệt
Sơ đồ chân cổng Com :
Trang 9Tín hiệu truyền theo chuẩn RS-232 của EIA (Electronics Industry Associations).Chuẩn RS-232 quy định mức logic 1 ứng với điện áp từ -3V đến -25V (mark), mức logic 0 ứng với điện áp từ 3V đến 25V (space) và có khả năng cung cấp dòng từ 10 mA đến 20 mA
Ngoài ra, tất cả các ngõ ra đều có đặc tính chống chập mạch
Các đặc tính kỹ thuật của chuẩn RS-232 như sau:
Trang 10Các tốc độ truyền dữ liệu thông dụng trong cổng nối tiếp là: 1200 bps, 4800 bps,
9600 bps và 19200 bps
2.Một số các thuộc tính của Mscomm trong VB:
MSComm là một điều khiển ActiveX dùng trong truyền thông nối tiếp Các tính chất của điều khiển này được dùng để thiết lập giao tiếp với các thiết bị ngoại vi qua cổng RS232
Điều khiển MSComm trong Visual Basic
Thiết lập tham số cho cổng:
+ CommPort: dạng object.CommPort = value Value là chỉ số của cổng Com có giá trị từ 1 ‐> 16 và mặc định có giá trị =1
+ InBuferSize: thiết lập hoặc trả lại kích thước của bộ đệm nhận, tính = byte Mặc định là 1024 byte Khác với đặc tính InBufferCount là số byte đang chờ trong bộ đệm nhận
+ InputLen : object.InputLen [ = value ] thiết lập hoặc trả lại số byte mỗi lần thuộc tính Input đọc trong bộ đệm nhận Mặc định giá trị Value=0 tức là thuộc tính Input
sẽ đọc hết nội dung của bộ đệm nhận khi thuộc tính này được gọi Nếu số kí tự trong bộ đệm nhận không = InputLen thì thuộc tính Input sẽ trả lại kí tự rỗng “ ” + InputMode: object.InputMode [ = value ] Value = 0 hay = comInputModeText
dữ liệu nhận được dạng văn bản kiểu kí tự theo chuẩn ANSI Dữ liệu nhận được sẽ
là một xâu Value=1 hay = comInputModeBinary dùng nhận mọi kiểu dữ liệu như
kí tự điều khiển nhúng, kí tự NULL, Giá trị nhận được từ Input sẽ là một mảng
Trang 11+ ParityReplace: thiết lập và trả lại kí tự thay thế kí tự không đúng trong lỗi giống nhau
+ PortOpen: thiết lập và trả lại tính trạng của cổng(đóng hoặc mở)
object.PortOpen [ = value ] value = true cổng mở value =false cổng đóng
và xóa toàn bộ dữ liệu trong bộ đệm nhận và truyền
+ RthresHold: object.Rthreshold [ = value ] value kiểu số nguyên Thiết lập số kí
tự nhận được trước khi gây lên sự kiện comEvReceive Mặc định = 0 tức là không
có sự kiện OnComm khi nhận được dữ liệu Thiết lập = 1 tức là sự kiện OnComm xảy ra khi bất kì kí tự nào được chuyển đến bộ đệm nhận
+ Settings: object.Settings [ = value ] thiết lập hoặc trả lại các thông số tần số baud, bít dữ liệu, bít chẵn lẻ, bít stop
+ SThreshold: thiết lập và trả lại số kí tự nhỏ nhất được cho phép trong bộ đệm gửi
để xảy ra sự kiện OnComm = comEvSend Theo mặc định giá trị này = 0 tức là khi truyền sẽ không gây ra sự kiện OnComm Nếu thiết lập thông số này =1 thì sự kiện OnComm xảy ra khi bộ đệm truyền rỗng Sự kiện OnComm = comEvSend chỉ xảy ra khi mà số kí tự trong bộ đệm truyền nhỏ hơn hoặc = Sthreshold Nếu số kí
tự trong bộ đệm này luôn lớn hơn Sthreshold thì sự kiện này không thể xảy ra Truyền nhận dữ liệu:
+ CommEvent: trả lại phần lớn sự kiện giao tiếp hoặc có lỗi
+ InBufferCout: trả lại số kí tự đang có trong bộ đệm nhận Ta có thể xoá bộ đệm nhận bằng cách đặt thuộc tính này =0 Không nhầm với thuộc tính InBufferSize là tổng kích thước của bộ đệm nhận
+ Input: nhận và xoá dữ liệu trong bộ đệm nhận
Nếu InputMode là comInputModeText thì giá trị trả về sẽ là một xâu tức có kiểu String , dữ liệu dạng text trong một biến kiểu Variant Nếu InputMode = comInputModeBinary thì thuộc tính này sẽ trả lại dữ liệu dạng nhị phân dưới dạng một mảng kiểu byte trong một biến Variant
+ OutBufferCount: trả lại số kí tự trong bộ đệm truyền
+ Output: ghi dữ liệu vào bộ đệm truyền có thể truyền kiểu text hoặc kiểu nhị phân Nếu truyền bằng kiểu text thì cho một biến Variant = kiểu String, nếu truyền kiểu nhị phân thì cho cho Output= variant = một mảng kiểu Byte
+ Break : thiết lập hoặc xoá tín hiệu object.Break [ = value] value = true hoặc false Khi set value= true thì thông số Break này sẽ gửi một tín hiệu break Tín hiệu break trì hoàn việc truyền dữ liệu và đưa đường truyền vào trạng thái break tới khi
mà value = false
+ CDHolding: quết định xem sự truyền này đến đâu bằng cách truy vấn đường CD( Carrier Detect) Carrier Detect là tín hiệu gửi từ modem tới máy tính kết nối với nó thống báo rằng nó đang online Nếu giá trị = true thì nó đường CD đang ở mức cao, nếu = false thì đường dây này đang ở mức thấp Tính chất này không có trong
Trang 12lúc thiết kế chỉ có trong khi chạy chương trình.Carrier Detect được biết như là Receive Line Signal Detect (RLSD)
+ CTSHolding: quết định khi nào bạn gửi dữ liệu bằng cách truy vấn trạng thái đường Clear To Send (CTS) Thông thường tín hiệu CTS được gửi từ modem tới máy tính kết nối với nó để báo rằng đang quá trình truyền dữ liệu Thuộc tính Readonly chỉ xuất hiện khi chạy chương trình Đường Clear To Send dùng trong RTS/CTS (Request To Send/Clear To Send) bắt tay phần cứng CTSHolding cho bạn một cách để tự tay dò đường Clear To Send nếu bạn cần biết trạng thái của nó + DSRHolding: biết trạng thái của đường Data Set Ready (DSR) Tín hiệu Data Set Ready truyền từ modem tới máy tính nối với nó để thông báo rằng modem đã sẵn sàng hoạt động Tính chất này dùng khi viết Data Set Ready/Data Terminal Ready
cuối dữ liệu
+ DTREnable: tính chất này quyết định khi nào cho phép đường Data Terminal Ready (DTR) trong truyền thông Tín hiệu DTR gửi từ máy tính tới modem đẻ báo rằng máy tính sẵn sàng là nơi nhận dữ liệu Khi DTREnable = true thì đường Data Terminal Ready set lên cao khi cổng mở, và thấp khi cổng đóng Nếu DTREnable
= false thì đường đó luôn mức thấp Trong phần lớn trường hợp set đường Data Terminal Ready thành thấp để hang up telephone
+ InBufferCout: trả lại số kí tự đang có trong bộ đệm nhận Bạn có thể xoá bộ đệm nhận bằng cách đặt thuộc tính này =0 Không nhầm với thuộc tính InBufferSize là tổng kích thước của bộ đệm nhận
+ Input: nhận và xoá dữ liệu trong bộ đệm nhận
Nếu InputMode là comInputModeText thì giá trị trả về sẽ là một xâu tức có kiểu String , dữ liệu dạng text trong một biến kiểu Variant Nếu InputMode = comInputModeBinary thì thuộc tính này sẽ trả lại dữ liệu dạng nhị phân dưới dạng một mảng kiểu byte trong một biến Variant
+ OutBufferCount: trả lại số kí tự trong bộ đệm truyền
+ Output: ghi dữ liệu vào bộ đệm truyền có thể truyền kiểu text hoặc kiểu nhị phân Nếu truyền bằng kiểu text thì cho một biến Variant = kiểu String, nếu truyền kiểu nhị phân thì cho cho Output= variant = một mảng kiểu Byte
+ Break : thiết lập hoặc xoá tín hiệu object.Break [ = value] value = true hoặc false Khi set value= true thì thông số Break này sẽ gửi một tín hiệu break Tín hiệu
Trang 13lúc thiết kế chỉ có trong khi chạy chương trình.Carrier Detect được biết như là Receive Line Signal Detect (RLSD)
+ CTSHolding: quết định khi nào bạn gửi dữ liệu bằng cách truy vấn trạng thái đường Clear To Send (CTS) Thông thường tín hiệu CTS được gửi từ modem tới máy tính kết nối với nó để báo rằng đang quá trình truyền dữ liệu Thuộc tính Readonly chỉ xuất hiện khi chạy chương trình Đường Clear To Send dùng trong RTS/CTS (Request To Send/Clear To Send) bắt tay phần cứng CTSHolding cho bạn một cách để tự tay dò đường Clear To Send nếu bạn cần biết trạng thái của nó + DSRHolding: biết trạng thái của đường Data Set Ready (DSR) Tín hiệu Data Set Ready truyền từ modem tới máy tính nối với nó để thông báo rằng modem đã sẵn sàng hoạt động Tính chất này dùng khi viết Data Set Ready/Data Terminal Ready
cuối dữ liệu
+ DTREnable: tính chất này quyết định khi nào cho phép đường Data Terminal Ready (DTR) trong truyền thông Tín hiệu DTR gửi từ máy tính tới modem đẻ báo rằng máy tính sẵn sàng là nơi nhận dữ liệu Khi DTREnable = true thì đường Data Terminal Ready set lên cao khi cổng mở, và thấp khi cổng đóng Nếu DTREnable
= false thì đường đó luôn mức thấp Trong phần lớn trường hợp set đường Data Terminal Ready thành thấp để hang up telephone
+ RTSEnable: quết định khi nào cho phép đường Request To Send (RTS), Tín hiệu RTS từ máy tính tới modem để yêu cầu được tryền dữ liệu Khi RTSEnable = true thì đường RTS mức cao khi cổng mở, tích mức thấp khi cổng đóng Và hiển nhiên khi RTSEnable thì đường RTS luôn mức thấp
II- Phần lập trình :
1- Code vi điều khiển :
#include<reg52.h>
#include<stdio.h>
#include<math.h>
sbit LED1=P1^0;
sbit LED2=P1^1;
sbit LED3=P1^2;
sbit LED4=P1^3;
unsigned long int nghin,tram,chuc,donvi,i,j,num;
Trang 14unsigned char temp, quet=0;
unsigned char M[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; void delay(int t)
{
for (i=1;i<=t;i++);
}
void timer0(void) interrupt 1
{
TH0=0xf8;
TL0=0x40;
switch(quet)
{
case 0:
LED2=LED3=LED4=0;
P2=M[donvi];
LED1=1;
break;
case 1:
LED1=LED3=LED4=0;
P2=M[chuc];
LED2=1;
break;
case 2:
LED2=LED1=LED4=0;
P2=M[tram];
LED3=1;
break;
case 3:
LED2=LED3=LED1=0;
P2=M[nghin];
LED4=1;
break;
}
Trang 15TR1=1;
TH0=0xF8;
TL0=0x30;
TR0=1;
IE=0x83;
IP=0x02;
temp=0;
num =0;
while(1)
{
do
temp =_getkey();
while (temp!='@');
temp=_getkey();
num=temp;
temp=_getkey();
num=temp*256 +num;
nghin=num/1000;
tram=(num%1000)/100;
chuc=((num%1000)%100)/10;
donvi=((num%1000)%100)%10;
}
}
2- Code VB :