Để làm việc với truyền thông thì phải biết khung truyền, tốc độ truyền...
+ khung truyền (frame) Dữ liệu đi vào ở đầu thu của đường dữ liệu trong truyền dữ liệu nối tiếp là một dãy các số 0 và 1, và rất khó để hiểu được ý nghĩa của các dữ liệu ấy nếu bên phát và bên thu không cùng thống nhất về một tập các luật, một thủ tục, về cách dữ liệu được đóng gói, bao nhiêu bit tạo nên một ký tự và khi nào dữ liệu bắt đầu và kết thúc. Bên cạnh tốc độ baud, khung truyền là một yếu tố quan trọng tạo nên sự thành công khi truyền và nhận.
Khung truyền bao gồm các quy định về số bit trong mỗi lần truyền, các bit “báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài ra số lượng các bit trong một data cũng được quy định bởi khung truyền.
+ start bit: là bit đầu tiên được truyền trong một frame truyền, bit này có chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới. Start là bit bắt buộc phải có trong khung truyền, và nó là một bit thấp (0).
+ Data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận. Data không nhất thiết phải là gói 8 bit, với 8051 ta có thể quy định số lượng bit của data là 08 hoặc 09 bit. Trong truyền thông nối tiếp UART, bit có trọng số nhỏ nhất của data sẽ được truyền trước và cuối cùng là bit có trọng số lớn nhất.
+ Parity là bit dùng để kiểm tra dữ liệu truyền có đúng không (một cách tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity). Parity chẵn nghĩa là số lượng số “1” trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại tổng số lượng các số “1” trong parity lẻ luôn là số lẻ.
+ Stop bits là 01 hoặc nhiều bit báo cho thiết bị nhận rằng một gói dữ liệu đã được gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bits là các bit bắt buộc xuất hiện trong khung truyền, trong 8051 có thể là 01 hoặc 02 bit, và chúng là các bit cao (1).
Tiếp theo là lập trình phần mềm.
- thanh ghi đệm dữ liệu SBUF là thanh ghi 8 bit được dùng riêng cho truyền thông nối tiếp trong 8051. Đối với một byte dữ liệu muốn truyền qua đường TxD thì nó phải được đặt trong thanh ghi SBUF. Tương tự, SBUF cũng giữ một byte dữ liệu khi nó được nhận từ đường RxD của 8051
Khi một byte được ghi vào thanh ghi SBUF nó sẽ được đóng khung với các bit Start, Stop và được truyền nối tiếp quan chân TxD.
Khi các bit được nhận nối tiếp từ RxD thì 8051 mở khung đó để loại trừ các bit Start, Stop để lấy ra một byte từ dữ liệu nhận được và đặt byte đó vào thanh ghi SBUF.
+ thanh ghi SCON là thanh ghi là thanh ghi 8 bit được dùng để lập trình việc đóng khung dữ liệu, xác định các chế độ làm việc của truyền thông nối tiếp. SCON là thanh ghi có thể đánh địa chỉ theo bit.
Hình ảnh chỉ mang tính chất minh họa |
Khung truyền bao gồm các quy định về số bit trong mỗi lần truyền, các bit “báo” như bit Start và bit Stop, các bit kiểm tra như Parity, ngoài ra số lượng các bit trong một data cũng được quy định bởi khung truyền.
+ start bit: là bit đầu tiên được truyền trong một frame truyền, bit này có chức năng báo cho thiết bị nhận biết rằng có một gói dữ liệu sắp được truyền tới. Start là bit bắt buộc phải có trong khung truyền, và nó là một bit thấp (0).
+ Data hay dữ liệu cần truyền là thông tin chính mà chúng ta cần gởi và nhận. Data không nhất thiết phải là gói 8 bit, với 8051 ta có thể quy định số lượng bit của data là 08 hoặc 09 bit. Trong truyền thông nối tiếp UART, bit có trọng số nhỏ nhất của data sẽ được truyền trước và cuối cùng là bit có trọng số lớn nhất.
+ Parity là bit dùng để kiểm tra dữ liệu truyền có đúng không (một cách tương đối). Có 2 loại parity là parity chẵn (even parity) và parity lẻ (odd parity). Parity chẵn nghĩa là số lượng số “1” trong dữ liệu bao gồm bit parity luôn là số chẵn. Ngược lại tổng số lượng các số “1” trong parity lẻ luôn là số lẻ.
+ Stop bits là 01 hoặc nhiều bit báo cho thiết bị nhận rằng một gói dữ liệu đã được gởi xong. Sau khi nhận được stop bits, thiết bị nhận sẽ tiến hành kiểm tra khung truyền để đảm bảo tính chính xác của dữ liệu. Stop bits là các bit bắt buộc xuất hiện trong khung truyền, trong 8051 có thể là 01 hoặc 02 bit, và chúng là các bit cao (1).
Tiếp theo là lập trình phần mềm.
- thanh ghi đệm dữ liệu SBUF là thanh ghi 8 bit được dùng riêng cho truyền thông nối tiếp trong 8051. Đối với một byte dữ liệu muốn truyền qua đường TxD thì nó phải được đặt trong thanh ghi SBUF. Tương tự, SBUF cũng giữ một byte dữ liệu khi nó được nhận từ đường RxD của 8051
Khi một byte được ghi vào thanh ghi SBUF nó sẽ được đóng khung với các bit Start, Stop và được truyền nối tiếp quan chân TxD.
Khi các bit được nhận nối tiếp từ RxD thì 8051 mở khung đó để loại trừ các bit Start, Stop để lấy ra một byte từ dữ liệu nhận được và đặt byte đó vào thanh ghi SBUF.
+ thanh ghi SCON là thanh ghi là thanh ghi 8 bit được dùng để lập trình việc đóng khung dữ liệu, xác định các chế độ làm việc của truyền thông nối tiếp. SCON là thanh ghi có thể đánh địa chỉ theo bit.
Bằng các set 2 bit SM0 và SM1 của thanh ghi scon cho có thể cài đặt các chế độ truyền thông.
Còn vấn đề quan trọng là tính tốc độ truyền và nhận là như thế nào. Nếu như tính tốc độ không khớp giữa truyền và nhận thì chắc chắn không nhận đúng dữ liệu.
Đối với 8051 thì tốc độ truyền được tính dựa vào timer 1. Phương pháp phổ biến nhất là cài đặt Timer1 ở chế độ tự động nạp lại 8-bit (chế độ 2) và thiết lập một giá trị nạp lại (cho TH1) để tạo ra một tốc độ truyền.
- công thức tính tốc độ truyền của 8051 là.
TH1 = 256 - ((Crystal / (12*32)) / Baud) = 256 - ((Crystal / 384) / Baud)
ví dụ : tính tốc độ 9600 baub với thạch anh 11.0592 thì TH1 được tính như sau:
TH1=256 - ((11059200/384) /9600)= 253
các bước lập trình truyền thông usart là
1. Nạp thanh ghi TMOD giá trị 20H: báo rằng sử dụng Timer1 ở chế độ 2 để thiết lập chế độ baud.
2. Nạp thanh ghi TH1 các giá trị phù hợp để thiết lập chế độ baud truyền dữ liệu nối tiếp.
3. Nạp thanh ghi SCON giá trị 50H báo chế độ nối tiếp 1 để đóng khung 8 bit dữ liệu, 1 bit Start và 1 bit Stop.
4. Bật TR1=1 để khởi động Timer1.
5. Xoá bit cờ truyền dữ liệu: TI=0.
6. Byte ký tự cần phải truyền được ghi vào SBUF.
7. Bit cờ truyền TI được kiểm tra bằng một vòng lặp để đợi đến lúc dữ liệu được truyền xong (cờ TI=1).
8. Để truyền ký tự tiếp theo quay trở về bước 5.
Bây giờ chúng ta vẽ 1 mạch mô phỏng trên proteus và download 2 phần mềm vspe dùng để tạo com ảo và hercules tạm thời demo thay cho giao diện máy tính. 2 phần mềm này bạn có thể download tại file đính kèm
Mình viết 1 chương trinh nhỏ truyền ký tự A lên máy tính như sau:
#include<at89x51.h> //khai báo thu vi?n cho 89c51
void delay(int x)
{
int y;
for(y=0;y<x;y++);
}
void send(unsigned char a); //khai báo nguyên m?u hàm g?i 1 ký t?
void main(void) //Chuong trình chính
{
TMOD=0x20; //chon timer1 che do 2
TH1=0xFD; //toc do 9600 baud
SCON=0x50; //0101 0000: che do 1
TR1=1; //Khoi dong Timer1
while(1) //Vvong lap vo han
{
send('A');
delay(1000);
}
}
void send(unsigned char a) // ham gui 1 ky tu
{
SBUF=a; //ghi byte a vao SBUF
while(TI==0){} //doi truyen xong du lieu co ti bat len 1
TI=0; //xoa
}
để truyền chuỗi ký tự lên máy tính thì làm như sau:
#include<at89x51.h> //khai báo thu vi?n cho 89c51
#include <string.h>
void delay(int x)
{
int y;
for(y=0;y<x;y++);
}
void send(unsigned char a); //khai báo nguyên m?u hàm g?i 1 ký t?
void sendchuoi(char *a);
void main(void) //Chuong trình chính
{
TMOD=0x20; //chon timer1 che do 2
TH1=0xFD; //toc do 9600 baud
SCON=0x50; //0101 0000: che do 1
TR1=1; //Khoi dong Timer1
while(1) //Vvong lap vo han
{
sendchuoi("codientu.org");
send(10);
delay(1000);
}
}
void send(unsigned char a) // ham gui 1 ky tu
{
SBUF=a; //ghi byte a vao SBUF
while(TI==0){} //doi truyen xong du lieu co ti bat len 1
TI=0; //xoa
}
void sendchuoi(char *a) //Ð?nh nghia hàm g?i 1 chu?i ký t?
{
int i,n; //Khai báo bi?n c?c b? s? nguyên: i,n
n=strlen(a); //Tính d? dài c?a chu?i *a, luu vào bi?n n
for(i=0;i<n;i++) //Vòng l?p d? g?i l?n lu?t t?ng ký t? lên,
{ //cho d?n khi h?t chu?i *a (ký t? th? n-1).
send(a[i]); //G?i hàm g?i 1 ký t?.
}
}
ở đây mình chọn thạch anh 11.0592 để set thạch anh vào project chọn options for taget1 chọn tab taget và điền 11.0592 vào ô xtal
tiếp theo tiến hành cài đặt phần mềm vspe lên thiết lập cổng com ảo. 1 cho con chip 89 trên proteus 1 cho herculer trên máy tính. Tiến hành mô phỏng ta được kết quả là
Nhưng với những yêu cầu như truyền vận tốc hay là nhiệt độ hoặc độ ẩm thì có nên truyền ký tự hay không. Mà có thể thay việc truyền 1 ký tự bằng truyền 1 số nguyên (có thể là nhiệt độ, độ ẩm hoặc vận tốc...) lên máy tính.
Ví dụ sau mình truyền các số từ 1 đến 30 lên máy tính.
#include<at89x51.h> //khai báo thu vi?n cho 89c51 sử dụng ở thạch anh 11.0592
unsigned char i;
void delay(int x)
{
int y;
for(y=0;y<x;y++);
}
void send(unsigned char a); //khai báo nguyên m?u hàm g?i 1 ký t?
void main(void) //Chuong trình chính
{
TMOD=0x20; //chon timer1 che do 2
TH1=0xFD; //toc do 9600 baud
SCON=0x50; //0101 0000: che do 1
TR1=1; //Khoi dong Timer1
while(1) //Vvong lap vo han
{for(i=0;i<30;i++)
{
send(i);
delay(1000);
}
}
}
void send(unsigned char a) // ham gui 1 ky tu
{
SBUF=a; //ghi byte a vao SBUF
while(TI==0){} //doi truyen xong du lieu co ti bat len 1
TI=0; //xoa
}
Để nhận về quan tâm đến cờ RI.Khi 8051 nhận được dữ liệu nối tiếp qua RXD và nó tách các bit start và stop để lấy 8 bit dữ liệu đặt vào SBUF, sau khi hoàn tất nó bật cờ RI để báo đã nhận đủ và cần phải lấy nó ra để chuẩn bị nhận byte tiếp.
- khác với khi truyền khi nhận thì nên sử dụng ngắt. Mục đích sử dụng ngắt vì 8051 không biết khi nào máy tính truyền xuống. Vậy nên khi không có dữ liệu truyền xuống vi điều khiển thì vi điều khiển còn thực hiện những công việc khác nữa, không phải cứ nằm chờ máy tính truyền xuống.
- Nhìn vào bảng vecto ngắt
vecto ngat
ta thấy ngắt truyền thông có số thứ tự là 4.
- Còn để kích hoạt ngắt dựa vào thanh ghi điều khiển ngắt. IE
hinh2
Ngắt truyền thông là ES để kích hoạt ngắt truyền thông cần cho phép ngắt toàn cục và ngắt truyền thông hoạt động (EA=1; ES=1;)
Rồi giờ bắt đầu thực hành nhận từ dữ liệu qua cổng usart nhé.
vẽ 1 sơ đồ mạch gồm có cổng com 89c51 vài con led và tiến hành mô phỏng với code
Mã:
#include
unsigned char temp; // bien tam luu du lieu nhan ve
void send(unsigned char a) // ham gui 1 ky tu
{
SBUF=a; //ghi byte a vao SBUF
while(TI==0){} //doi truyen xong du lieu co ti bat len 1
TI=0; //xoa
}
void main(void) //Chuong trình chính
{
TMOD=0x20; //timer1 che do 2
TH1=0xFD; // toc do 9600
SCON=0x50; //che do 1 cho phep nhan
TR1=1; //khoi dong Timer1
IE=0x90; //cho phép ngat truyen thong
P1=0x00;
while(1)
{ if(temp=='1'){P10=1;}
if(temp=='2'){P11=1;}
if(temp=='3'){P12=1;}
if(temp=='4'){P13=1;}
if(temp=='5'){P14=1;}
if(temp=='6'){P15=1;}
if(temp=='0'){P1=0x00;}
}
}
void nhandulieu(void) interrupt 4 // khai bao ngat truyen thong
{
if(RI==1) // kiem tra xem co phai ngat nhan hay khong
{
temp=SBUF; // lây du lieu luu vao bien temp
RI=0; //xóa co nhan chuyen bi cho nhan du lieu tiep theo
}
send(temp);// gui nguoc lai may tinh
}
(code và file mô phỏng )
vậy là đến đây phần gửi và nhận của 8051 cơ bản là được rồi. Tiếp theo để thay cho cái phần mềm dùng để test herculer thì chúng ta viết 1 giao diện và có thể xuất ra 1 phần mềm và có thể chạy độc lập.Có rât nhiều phần mềm viết giao diện, mình vẫn quen sử dụng VB6.
sau khi cài đặt xong VB6 bật lên được giao diện như sau.
chọn standard exe rồi open được.
Ví dụ để điều khiển 6 led thì viết 1 giao diện như sau.
để tạo ra 6 nút điều khiển led1 led 2 led 3 led 4 led 5 led 6 mình sử dụng nút lệnh (command button) để tạo ra chữ giao tiếp máy tính thì mình dùng label (biểu tượng có chữ A).
Tiếp theo là phải lấy ra cái cổng com-control để giao tiếp qua cổng com. Vì com không phải là control cơ bản nên phải lôi nó ra trong thư viện.
Kích chuột phải vào thanh các control cơ bản rồi chọn Component
sau đó chọn tiếp.
nhấn apply ok sẽ thấy 1 cái biểu tượng hộp điện thoại xuất hiện.
giờ viết code cho nó thôi. Muốn viết cho đối tượng nào thì ta đúp chuột vào đối tượng đó.
Trước tiên là load form.
Mã:
Private Sub Form_Load()
MSComm1.CommPort = 2 ' chon cong com so 2
MSComm1.Settings = "9600,n,8,1" 'toc do 9600, 0 bit party,8bit data, 1 bit stop
MSComm1.PortOpen = True ' mo cong com
End Sub
sau đó đến 7 nút điều khiển led và nút exit
Mã:
Private Sub Command1_Click()
End ' lenh end de thoat
End Sub
Private Sub Command2_Click()
MSComm1.Output = "1" ' xuat ra cong com ky tu 1
End Sub
Private Sub Command3_Click()
MSComm1.Output = "2"
End Sub
Private Sub Command4_Click()
MSComm1.Output = "3"
End Sub
Private Sub Command5_Click()
MSComm1.Output = "4"
End Sub
Private Sub Command6_Click()
MSComm1.Output = "5"
End Sub
Private Sub Command7_Click()
MSComm1.Output = "6"
End Sub
Private Sub Command8_Click()
MSComm1.Output = "0"
End Sub
giờ bật phần mềm mô phỏng và code ở #6 và nhớ cài com ảo để xem kết quả nhé.
(toàn bộ code và file mô phỏng download ở file đính kèm)
Theo Codientu.org
Đăng nhận xét