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

đo tốc độ động cơ hiển thị bằng hyper terminal

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 (334.32 KB, 30 trang )

Bộ Công Thương
Trường ĐHCN Hà Nội
Báo Cáo:Bài Tập Lớn Môn VĐK
Đề tài:đo tốc độ động cơ hiển thị bằng hyper terminal

Giáo viên hướng dẫn:NGUYỄN ANH DŨNG

Sinh viên thực hiện:
PHÙNG ĐỨC HIỆP
CẤN MẠNH TRUNG
Lớp:CĐ DDT2-K9
File đính kèm 008.rar


Lời Nói Đầu
Với sự ra đời của chip 8051 vào năm 1980 do INTEL sản xuất,nó đã tạo ra bước
tiến quoan trọng trong lĩnh vưc vi điều khiển.vói sự ra đó đã giúp cho viêc thiết
kế các hệ thống như đo lường,điều khiển tự động,truyền thông ngày càng đơn
giản gọn nhẹ và chính xác hơn.ngày nay các chíp thế hệ sau của 8051 ngay càng
được tăng cường thêm cá tính năng cũng như rung lượng,đã giúp cho họ vi điều
khiển 8051 trở thành 1 trong những bộ vi điều khiển 8bit mạnh và linh hoạt nhất
trong những năm gần đây.
Đó là việc nghiên cứu và tìm hiểu về vi điều khiển,trong đó đặc biệt là họ vi
điều khiển 8051 la điều cần thiết với sinh viên khoa điện tử chúng em nói chung
cũng như sinh viên các khoa khác co liên quoan tới môn học.nhưng do thời gian
tìm hiểu và kiến thức về môn học còn có nhiều hạn chế,cho nên trong đề tài
nghiên cứu về vi điều khiển của chúng em còn gì thiếu sót và hạn chế mong thầy
chỉ bảo giúp cho chúng em hiểu sâu hơn về môn học này,chúng em xin chân
thành cảm ơn.
I,Giới thiệu tổng quan về họ 8051 (AT89S52):
Với chíp 8051 lần đầu tiên được đưa ra thị trường thì nó có các đặc chưng


được tóm tắt như sau:


- 4KB ROM
- 128byte RAM
- 4 pori xuất nhập (I/O)8-bit
- 2 bộ định thời 16-bit
- Mạch giao tiếp nối tiếp
- Không gian nhớ chương trình (mã) ngoài 64k
- Không gian nhớ rữ liệu ngoài 64k
- Bộ xử lý bit (thao tác trên các bít riêng rẽ)
- 210 vị chí được định địa chỉ,mỗi vị chí 1bit
- Nhân/chia trong 4 micro giây
Còn đối với vi điều khiển 8052 thì nó có thêm bộ định thời thứ 3
Dưới đây là hình dạng thực tế và sơ đồ chân của vi điều khiển AT89S52:


Hình 1.1:hình dạng thực tế và sơ đồ chân của AT89S52
Hình 1.2:sơ đồ khối của vi điều khiển 89s52
1.Chức năng từng chân trong sơ đồ:
Như ta thấy trong sơ đồ hình 1.1 chên 32 trong 40 chân của AT89S52 có công
dụng xuất nhập,tuy nhiên 24 trong 32 đường này có 2 mục đích.mỗi đường có
thể hoạt động xuất/nhập hoặc hoạt động như một đường điều khiển hoặc hoạt
động như một đường địa chỉ/dữ liệu da hợp.
a.Port 0(từ chân 32 tới 39)có hai công dụng.một là được sử dụng làm nhiệm vụ
xuất nhập,hai là port 0 chở thành bus địa chỉ và bus dữ liệu đa hợp.
b.Port 1(từ chân 1 tới chân 8)chỉ có một công dụng là xuất nhập và được dùng
để giao tiếp với thiết bị bên ngoài khi có yêu cầu.
c.Port 2(từ chân 21 tới 28)có hai công dụng.hoặc làm nhiệm vụ xuất nhập hoặc
là byte địa chỉ cao của bus địa chỉ 16-bit.

d.Port 3(từ chân 10 tới chân số 17)có hai công dụng.khi không hoạt động xuất
nhập các chân của port 3 có các chức năng riêng.
Bảng chức năng các chân của port 3 va 2 chân port 1.0 và port 1.1 của port 1:
Bit tên địa chỉ bit chức năng
P3.0 RxD B0H chân nhận dữ liệu của port nối tiếp
P3.1 TxD B1H chân phát dữ liệu của port nối tiếp
P3.2 INT0 B2H ngõ vào ngắt ngoài 0
P3.3 INT1 B3H ngõ vào ngắt ngoài 1
P3.4 T0 B4H ngõ vào của bộ định thời/đếm 0
P3.5 T1 B5H ngõ vào của bộ định thời/đếm 1
P3.6 WR B6H điều khiển ghi bộ nhớ dữ liệu ngoài
P3.7 RD B7H điều khiển đọc bộ nhớ dữ liệu ngoài
P1.0 T2 90H ngõ vào bộ định thời /đếm 2
P1.1 T2EX 91H nạp lại /thu nhận của bộ định thời 2
e.chân cho phép bộ nhớ trương trình psen:
đây là tín hiệu xuất trên chân 29.Nó điều khiển cho phép ta truy xuất bộ nhớ
ttruw[ng trinh ngoài,chân này thường nối với chân cho phép xuất OEtín hiệu
psen ở logic 0 trong suốt thời gian tìm nạp lệnh.các mã nhị phân của trương
trình được đọc từ EP-ROM,qua bú dữ liệu được chốt vào thang ghi IR của 8051
để được giả mã.
f.Chân cho phép chốt địa chỉ ALE:
8051 sử dụng 30 chân,chân xuất tí hiệu cho phép chốt dịa chỉ ALE để giải đa
hợp bus dũ liệu và bus địa chỉ.chân ALE xuất yins hiệu để chốt địa chỉ vào
thanh ghi ngoài trong suốt ½ đầu của chu kỳ bộ nhớ.sau khi điều này được thực
hieenjcacs chân port 0 sẽ xuất nhập dữ liệu hợp hệ trong suốt ½ thứ 2 của chu kỳ
bộ nhớ.
g.Chân reset (rst)
Nằm ở chân 29laf ngõ vào xóa chính dùng để thiết lập trạng thái ban đầu cho hệ
thống hay gọi tắt là reset hệ thống.khi ngõ này được cheo ở mức tối thiểu 2 chu
kỳ máy,các thanh ghi bên trong của 8051 được nạp các giá trị thích hợp cho việc

khở động lại hệ thống.
Trạng thái của các thanh ghi khi reset,khi reset thì giá trị của các thanh ghi như
ở dưới bảng sau:

h.Chân XTAL1 và XTAL2:
Giao động bên trong của thạch anh được ghép nối với bên ngoài ở 2 chân
XTAL1 và XTAL1 (chân 18 và 19) vói tần số danh dịnh cả thạch anh là
12MHZ.
i.Chân truy xuất ngoài EA:
nằm ở chân 31 nó có thể được nối với 5v(logic 1) hoặc GND (logic 0),nếu chân
này được nối lên 5v thì 8052/8051 thực thi chương trình trong ROM nội.nếu nối
với GND (và chân psen cũng ở mức logic 0)thì chương trình thực thi chứa ở bộ
nhớ ngoài.
II.hoạt động định thời,cổng nối tiếp ,ngắt và xủ ly ngắt của họ 8051:
1.hoạt động đinh thời:như ta đã biết ở trên voi 8051 ta chỉ có 2 timer đó là timer
0 va timer 1 còn đối với 8052 thì chúng ta co thêm bộ định thời thứ 3 là
timer2,các timer này có rất nhiều ứng dụng quoan trọng trong các lĩnh vực như
đo lường,điều khiển.
2.cổng nối tiếp:
AT89S52 có một cổng nối tiếp trên chíp có thể hoạt động ở nhiều chế độ khác
nhau.chức năng chủ yếu của cổng nối tiếp là chuển đổi song song và nối tiếp với
các dữ liệu chuyển đổinối tiếp sang song song với dữ liệu nhập để có thể giao
tiếp với may tính qua cổng nối tiếp hoặc các thiết bị tương tự.
3.ngắ và xử lý ngắt:
Để tận dụng khả năng của cpu chúng ta phải sử dụng đến ngắt,ngắt giúp ta tạm
ngừng công việc của cpu để phục vụ việc chao đổi rữ liệu.sau khi hoàn thành
việc chao đổi dữ liệu thì cpu phải quoay về làm nốt công việc dang bị gián
doạn.điều này giúp cho cpu làm việc hiệu quả hơn rất nhiều.
Với AT89S52 ta có 6 nguồn ngắt:
-Ngắt ngòai đến từ chân #INT0

-Ngắt ngoài đến từ chân #INT1
-Ngắt do bộ timer 0
-Ngắt do bộ timer 1
-Ngắt do bộ timer 2
-Ngắt do port nối tiếp
III.Tổng quan về đề tài đo tốc độ động cơ hiển thị bằng hyper terminal:

Trong đề tài chúng em sử dụng 2 timer của tiner 1 và timer 2,trong đó timer 1
tạo tốc độ baud cho port nối tiếp để chuyền dữ liệu lên máy tính.timer 2 dung để
định khoảng thời gian đếm xung mà ở đây khoảng thời gian là 50ms.chúng em
còn sử dụng ngắt ngoài của timer 0,ở đây để tính tốc độ ta lấy số xung đếm được
trong timer 0 trong khoảng thời gian là 50ms chia cho 100 để tính ra só vòng
trong thời gian 50ms.chia 100 ở dây là do econdo có 100 xung ra trên 1
vòng,sau đó ta nhân với 20 để gia số vòng trên 1 giây,tiếp đó ta nhân với 60 để
tính ra số vòng tren 1 phút.trên mạch thực tế chúng em sử dụng 1 con mã 232 để
nhăm mục đích nối tiếp giữa 8052 với cổng com.thạch anh ở đây sủ dụng có tần
số danh định là 11.0952MHZ.
Hình dạng thực tế của max 232:
Sơ đồ nguyên lý:
Sơ đồ mạch in:
Sơ đồ mô phỏng:
Code do tốc độ động cơ hiển thị bằng màn hình may tính:
/*De tai: Thiet ke mach VDK do toc do dong co

Giao Vien Huong dan:Nguyen Anh Dung

sinh vien thuc hien:Phung duc Hiep
Can manh TRung
Thoi Gian Thuc Hien: 01/10/2009


Thoi GIan hoan thanh:
*/

//========================================================
======================================================
// ()=={}:::::::::::::::::::::::::::::::::>

#include<regx52.h>
#include<math.h>
unsigned char
M[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char
A[19]={'T','O','C',0x20,'D','O',0x20,'D','O','N','G',0x20,'C','O',0x20,'L','A',0x20,':'
};
unsigned char N[5] ={'(','V','/','P',')'};
unsigned char nghin,truc,tram,dvi;
int soxung,v,i;
void tocdodongcola()
// hien thi chu toc do dong co la
{
for(i=0;i<=18;i++)
{
while(!TI);
SBUF=A[i];
TI=0;
}
}
void vp() //hien thi chu vong/phut
{
for(i=0;i<=4;i++)

{
while(!TI);
SBUF=N[i];
TI=0;
}
}
void hienthi() //ham hien thi toc do dong co
{
nghin=v/1000; // xac dinh so hang nghin
tram=(v%1000)/100; // xac ding so hang cham
truc=((v%1000)%100)/10; // xac dinh so hang chuc
dvi=((v%1000)%100)%10;// xac dinh so hang dvi
while(!TI); //doi co bao truyen cho phep truyen
SBUF=M[nghin]; // truyen so o hang Ngin
TI=0; // xoa co bao truyen xong de tiep tuc truyen

while(!TI);
SBUF=M[tram]; // truyen so o hang Tram
TI=0; // xoa co bao truyen xong de tiep tuc truyen
while(!TI);
SBUF=M[truc]; // truyen so o hang truc
TI=0; // xoa co bao truyen xong de tiep tuc truyen
while(!TI);
SBUF=M[dvi]; // truyen so o hang donvi
TI=0; // xoa co bao truyen xong de tiep tuc truyen

while(!TI);
SBUF=0x0a;
TI=0; // xoa co bao truyen xong de tiep tuc truyen
while(!TI);

SBUF=0x0d;
TI=0; // xoa co bao truyen xong de tiep tuc truyen
}
void delay(int y) //tao thoi gian tre
{
int z;
for(z=0;z<=y;z++);
}
void main(void) // chuong trinh chinh
{
//tao toc do baud
SCON=0x52;
TH1=TL1=-3; //toc do baud la 9600
TR1=1; //start timer 1

IE=0x81; // uu tien ngat ngoai timer 0
IT0=1; // ngat theo suon 1 - 0
T2MOD=0x03;RCAP2H=TH2=-50000/256; //thoi gian dem la 50ms
RCAP2L=TL2=-50000%256;
TMOD=0X20; //TIMER 1 lam viec che do 2
TR2=1; // start timer 2
soxung=0;
while(!TF2);
TR2=0;
v=soxung*12;
tocdodongcola();
hienthi();
vp();
delay(5000);
while(1);

}
void ngattimer0(void) interrupt 0 //ngat ngoai timer0
{
soxung++;
}
MẠCH TẠO DAO ĐỘNG VÀ RESET:
*Mach tạo dao động:
AT89S52 có 1 bộ chia tần số bên trong chip bộ này sẽ cấp xung clock cho các
khối trên chip từ nguồn dao động bên ngoài qua 2 chân XTAL1,XTAL2
Mach RESET:
Có 4 cách để reset AT89S52 lần lượt là :
+Reset khi cấp nguồn
+Reset bởi WDT
+Reset bằng phần mềm
+Rsset bằng mạch ngoài qua chân RST
Trong một hệ thống gồm nhiều vi mạch khả trình thì mạch reset tích hợp cả hai
cách RESET khi bật nguồn và bởi mạch ngoài thường dược sử dụng:
MẠCH TẠO XUNG SỬ DỤNG LM555:
Khi ta thay đổi biến trở thi xung clock tu chan 3 tao ra xung vuông cung thay
đổi
theo ( tần số thay đổi) cung cấp vao chân 14( T0) của vi điều khiển.
MAX232 và cổng COM:
Như ta đã biết ,bộ vi điều khiển AT89S52 có khả năng giao tiếp với thế giới bên
ngoài thông qua cổng nối tiếp. Vấn đề trở ngai duy nhất khi giao tiếp với máy
tính là mức logic ở bộ vi điều khiển và cổng COM của máy tính khác nhau, cụ
thể như sau;
Đối tượng
Mức logic Mức điện áp tương ứng
Cổng COM (mức232C)
1

0
-12V đến -3V
+3V đến +12V
Vi điều khiển ( mức
TTL)
1
0
+5V
0V
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 2 chuẩn. Vi mạch này có chứa hai bộ chuyển đổi mức logic từ TTl
sang RS232 và ngược lại , tức là:
Vì tín hiệu cổng COM thường ở mức +12V, -12V nên không tương thích với
điện áp TTL nên để giao tiếp Vi điều khiển 8051 với máy tính qua cổng COM
ta phải qua một vi mạch biến đổi điện áp cho phù hợp với mức TTL, ta chọn vi
mạch MAX232 để thực hiện việc tương thích điện áp.
Hình sau la vd về mạch giao tiếp giữa vdk với máy tính qua cổng RS232C sử
dụng vi mạch đổi mức MAX232.
V C C _ C I R C L E
V C C _ C I R C L E
C 7
C 5
C A P
C 6
C 8
U 1
8 0 5 2
3 1
1 9
1 8

9
1 2
1 3
1 4
1 5
1
2
3
4
5
6
7
8
3 9
3 8
3 7
3 6
3 5
3 4
3 3
3 2
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
1 7

1 6
2 9
3 0
1 1
1 0
4 02 0
E A / V P
X 1
X 2
R E S E T
I N T 0
I N T 1
T 0
T 1
P 1 . 0 / T 2
P 1 . 1 / T 2 X
P 1 . 2
P 1 . 3
P 1 . 4
P 1 . 5
P 1 . 6
P 1 . 7
P 0 . 0
P 0 . 1
P 0 . 2
P 0 . 3
P 0 . 4
P 0 . 5
P 0 . 6
P 0 . 7

P 2 . 0
P 2 . 1
P 2 . 2
P 2 . 3
P 2 . 4
P 2 . 5
P 2 . 6
P 2 . 7
R D
W R
P S E N
A L E / P
T X D
R X D
V C CV S S
Y 1
P 1
C O N N E C T O R D B 9
5
9
4
8
3
7
2
6
1
U 2
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
1 5
1 6
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
G N D

V C C
Cổng nối tiếp RS232 là một giao diện phổ biến rộng rãi nhất. Người ta còn gọi
cổng này là cổng COM1, còn cổng COM2 để tự do cho các ứng dụng khác.
Việc truyền dữ liệu qua cổng COM được tiến hành theo cách nối tiếp. Nghĩa là
các bit dữ liệu được truyền đi nối tiếp nhau trên một đường dẫn.
Cổng COM không phải là một hệ thống bus nó cho phép dễ dàng tạo ra liên kết
dưới hình thức điểm với điểm giữa hai máy cần trao đổi thông tin với nhau, một
thành viên thứ ba không thể tham gia vào cuộc trao đổi thông tin này.
* Các chân và đường dẫn được mô tả như sau:
Chân Ký hiệu Ý nghĩa
1 DCD Tín hiệu phát hiện mang dữ liệu
2 RcD Nhận dữ liệu
3 TxD truyền dữ iệu
4 DTR Dữ liệu đầu cuối sẵn sàng
5 GND Nối đất
6 DSR Dữ liệu sẵn sàng được gửi
7 RTS Tín hiệu yêu cầu gửi
8 CTS Tín hiệu yêu cầu xoá để gửi tiếp
9 RI Ring indicatior
Trên thực tế có hai loại phích cắm, một loại 9 chân và một loại 25 chân.
Việc truyền dữ liệu xảy ra ở trên hai đường dẫn. Qua chân cắm ra TXD máy tính
gởi dữ liệu của nó đến Vi điều khiển. Trong khi đó các dữ liệu mà máy tính
nhận được, lại được dẫn đến chân RXD các tín hiệu khác đóng vai trò như là tín
hiệu hổ trợ khi trao đổi thông tin, và vì thế không phải trong mọi trường hợp
ứng dụng đều dùng hết.
Điện áp quy định với mưc logic 1 nẳm trong khoảng từ -3V đến -12V ; mức
logic 0 là +3V đến +12V.
-Tốc độ truyền dữ liệu đươc quy định chuẩn gồm các tốc độ sau; 300, 600,
1200, 2400, 4800, 9600,19200, 28800, và 56600 baud.
-Độ dài cực đại của cáp kết nối là 15m(trong trường hợp không có các bộ đệm

bộ lặp)
-Trên máy tính có the có 4 cổng nối tiếp. Nhưng thường chỉ có 2 cổng gọi là
cổng Com1 và Com2.
Địa chỉ của các cổng nối tiếp như sau:
-Cổng Com1: địa chỉ cơ bản 3F8H
-Cổng Com2: địa chỉ cơ bản 2F8H.
Ở máy tính PC thường có một bộ phát/nhận không đồng bộ vạn năng (gọi tắt là
-UART: Universal Asnchronous Receiver/ Transmitter) để điều khiển sự trao
đổi thông tin giữa máy tính và các thiết bị ngoại vi.
Hình ảnh của MAX232:
CÁC THANH GHI CỦA CỔNG NỐI TIẾP:
-Có hai thanh ghi chức năng đặc biệt cho phép phần mềm truy xuất đến cổng nối
tiếp là SBUF và SCON.
*SCON: thanh ghi điều khiển cổng nối tiếp
chứa các bit điều khiển và trang thái. Các bit điều khiển đặt chế độ hoạt động
cho cổng nối tiếp, các bit trạng thái báo cáo kết thúc phát hoặc thu 1 ký tự.
*SBUF:thanh ghi đệm truyền nhận ở cổng nối tiếp
chức nang đệm các ký tự khi chúng nhận về từ cổng nối tiếp hoặc được truyền
từ cổng nối tiếp.
CÁC THANH GHI CỦA BỘ ĐỊNH THỜI:
*Thanh ghi của timer 0,1:
-TMOD: Thanh ghi chế độ định thời ,chứa hai nhóm bốn bit dùng để đặt chế độ
làm việc cho Timer0và1
-TCON: Thanh ghi điều khiển Timer,chứa các bit trạng thái và các bit điều
khiển cho
Timer0và1.
*Thanh ghi của timer 2:
-T2CON : chứa các bit điều khiển cho Timer2
-T2MOD:chúa 2 bit DCEN vàT2OE cho phép Timer2 hoạt động nhu1 bộ đếm
lùi hoặc để tạo xung.

Thanh ghi TH2 và TL2 , RCAP2L, RCAP2H:chứa giá trị đếm của timer2.
NGUỒN XUNG CLOCK:
-Nguồn xung clock cấp cho các bộ định thời có thể lấy từ ngoài qua các chân
T0, T1, T2 lần lượt cho các bộ Timer0, Timer1, Timer2 hoặc lấy từ bộ
chia tần trên chip với tần số là 1/12 tần số của bộ dao động thạch anh tuỳ
vào bit C/#T. đối với bài này chúng ta lấy nguồn xung từ con LM555cung
cấp vào chân T0.
TỔ CHỨC NGẮT Ở AT89S52:
AT89S52 có 6 nguồn ngắt :
-Ngắt ngoài từ chân #INT0
-Ngắt ngoài từ chân #INT1
-Ngắt do bộ Timer 0
-Ngắt do bộ Timer 1
-Ngắt do bộ Timer 2
-Ngắt do Port nối tiếp
Các 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)
CHƯƠNG TRÌNH CHÍNH:
#include<stdio.h>
//#include<reg52.h>
#include<at89x52.h>
//#include<math.h>
char x;
int d,daitan,i;
float f,n;
unsigned char
M[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
unsigned char nghin,tram,chuc,donvi;
void ngoaidaitan(void)

{
while(!TI); //doi co bao truyen cho phep truyen
SBUF=0x4E; // truyen ki tu N
TI=0;
while(!TI);
SBUF=0x67;
TI=0;
while(!TI);
SBUF=0x6F;
TI=0;
while(!TI);
SBUF=0x61;
TI=0;
while(!TI);
SBUF=0x69;
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x44;
TI=0;
while(!TI);
SBUF=0x61;
TI=0;
while(!TI);
SBUF=0x69;
TI=0;
while(!TI);
SBUF=0x20;

TI=0;
while(!TI);
SBUF=0x54;
TI=0;
while(!TI);
SBUF=0x61;
TI=0;
while(!TI);
SBUF=0x6E;
TI=0;
while(!TI);
SBUF=0x0D;
TI=0;
}
void xuatkhz(void)
{
nghin = f/1000;
tram = (f-nghin*1000)/100;
chuc = (f-nghin*1000-tram*100)/10;
donvi = f-nghin*1000-tram*100-chuc*10;
while(!TI);
SBUF=0x44;
TI=0;
while(!TI);
SBUF=0x61;
TI=0;
while(!TI);
SBUF=0x69;
TI=0;
while(!TI);

SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x54;
TI=0;
while(!TI);
SBUF=0x61;
TI=0;
while(!TI);
SBUF=0x6E;
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x31;
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=45;
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x31;
TI=0;
while(!TI);

SBUF=0x30;
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x4B;
TI=0;
while(!TI);
SBUF=0x68;
TI=0;
while(!TI);
SBUF=0x7A;
TI=0;
while(!TI); //doi co bao truyen cho phep truyen
SBUF=0x20; // truyen ki tu Space
TI=0;
while(!TI); //doi co bao truyen cho phep truyen
SBUF=0x3a; // truyen Ki tu - hai cham
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=M[nghin];
TI=0;

while(!TI);
SBUF=M[tram];
TI=0;


while(!TI);
SBUF=M[chuc];
TI=0;
while(!TI);
SBUF=M[donvi];
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x48;
TI=0;
while(!TI);
SBUF=0x7A;
TI=0;
while(!TI);
SBUF=0x0D;
TI=0;
}
void xuathz1(void)
{
nghin = f/1000;
tram = (f-nghin*1000)/100;
chuc = (f-nghin*1000-tram*100)/10;
donvi = f-nghin*1000-tram*100-chuc*10;
while(!TI);
SBUF=0x44;
TI=0;
while(!TI);

SBUF=0x61;
TI=0;
while(!TI);
SBUF=0x69;
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x54;
TI=0;
while(!TI);
SBUF=0x61;
TI=0;
while(!TI);
SBUF=0x6E;
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x31;
TI=0;
while(!TI);
SBUF=0x30;
TI=0;
while(!TI);
SBUF=0x30;
TI=0;
while(!TI);

SBUF=0x20;
TI=0;
while(!TI);
SBUF=45;
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x31;
TI=0;
while(!TI);
SBUF=0x30;
TI=0;
while(!TI);
SBUF=0x30;
TI=0;
while(!TI);
SBUF=0x30;
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x68;
TI=0;
while(!TI);
SBUF=0x7A;
TI=0;
while(!TI); //doi co bao truyen cho phep truyen

SBUF=0x20; // truyen ki tu Space
TI=0;
while(!TI); //doi co bao truyen cho phep truyen
SBUF=0x3a; // truyen Ki tu - hai cham
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=M[nghin];
TI=0;

while(!TI);
SBUF=M[tram];
TI=0;
while(!TI);
SBUF=M[chuc];
TI=0;
while(!TI);
SBUF=M[donvi];
TI=0;
while(!TI);
SBUF=0x20;
TI=0;
while(!TI);
SBUF=0x48;
TI=0;
while(!TI);
SBUF=0x7A;
TI=0;

while(!TI);
SBUF=0x0D;
TI=0;
}
void xuathz2(void)
{
nghin = f/1000;
tram = (f-nghin*1000)/100;
chuc = (f-nghin*1000-tram*100)/10;
donvi = f-nghin*1000-tram*100-chuc*10;
while(!TI);
SBUF=0x44;
TI=0;
while(!TI);
SBUF=0x61;
TI=0;
while(!TI);
SBUF=0x69;
TI=0;

×