LUẬN VĂN THẠC SỸ KỸ THUẬT
NGÀNH TỰ ĐỘNG HOÁ
THIẾT KẾ HỆ THỐNG ĐIỀU KHIỂN VÀ GIÁM SÁT
TỪ XA THÔNG QUA HỆ THỐNG TRUYỀN THÔNG
VỚI GIAO THỨC TCP/IP
LỜI CAM ĐOAN
Sau gần 2 năm học tôi lựa chọn đề tài „Thiết kế hệ thống điều
khiển và giám sát từ xa thông qua hệ thống truyền thông với giao
thức TCP/IP‟ làm đề tài luận văn tốt nghiệp. Đến nay tôi đã hoàn
thành xong đề tài, đây là kết quả của nỗ lực của bản thân và được
chỉ bảo và hướng dẫn tận tình của PGS.TS Đỗ Xuân Tiến.
Tôi xin cam đoan đây là công trình nghiên cứu của riêng tôi,
các số liệu và kết quả hoàn toàn là trung thực và chưa được công
bố trong bất kỳ một công trình nào.
MỞ ĐẦU
Ngày nay, các thiết bị điện tử và tự động hóa có mặt ở khắp nơi, chúng ta dễ
dàng bắt gặp trong tất cả các lĩnh vực, từ những ứng dụng đặc biệt trong công nghiệp
cho đến những sản phẩm dân dụng.
Ban đầu, việc giám sát từ xa thông qua một hệ thống gồm các phần tử nối với
nhau bằng dây dẫn với các chuẩn truyền thông phổ biến như RS-232, RS-485 và các
chuẩn công nghiệp như ProfiBus. Tuy nhiên, việc mở rộng phạm vi điều khiển (tức số
lượng các phần tử) của mô hình này khá khó khăn, và đặc biệt là khoảng cách điều
khiển thì rất hạn chế.
Sự ra đời của công nghệ truyền thông với giao thức TCP/IP đã làm thay đổi
hoàn toàn suy nghĩ cũng như phạm vi ứng dụng của thiết bị giám sát từ xa. Mô hình
mạng phổ biến đó là mạng nội bộ LAN (Local Area Network) và mạng diện rộng
WAN (Wide Area Network), gọi chung là mạng Ethernet đã cho phép mở rộng dễ dàng
phạm vi giám sát và quy mô của hệ thống. Không những thế, trong mạng Ethernet, có
thể gắn nhiều thiết bị đầu cuối khác nhau có cùng giao tiếp thông qua cổng truyền
thông ethernet như máy tính, máy in, camera, do đó, việc vận hành và giám sát trở
nên cực kỳ dễ dàng.
Với đề tài “Thiết kế hệ thống điều khiển và giám sát từ xa thông qua hệ thống
truyền thông với giao thức TCP/IP‟‟ tôi mong xây dựng các hệ thống điều khiển, giám
sát với quy mô mạng lớn hơn.
Được sự chỉ bảo và hướng dẫn tận tình của PGS.TS Đỗ Xuân Tiến đến nay tôi
đã hoàn thành xong đề tài.
Kính mong được sự chỉ bảo và đóng góp từ phía người đọc!
MỤC LỤC
Trang
Lời cam đoan 01
Mục lục 02
Danh mục các bảng 05
Danh mục các hình vẽ, đồ thị 06
MỞ ĐẦU 08
CHưƠNG 1 - KHÁT QUÁT CHUNG VỀ VI ĐIỀU KHIỂN 09
1.1. Khái niệm về vi điều khiển 09
1.2. Các vi điều khiển thông dụng 09
1.3. Các thế hệ vi xử lý 12
1.4. Sơ đồ khối của vi xử lý 13
1.4.1. Đơn vị xử lý trung tâm CPU 14
1.1.4.2. Bộ nhớ 15
1.4.3. Cổng vào/ra song song 15
1.4.4. Cổng vào/ra nối tiếp 15
1.4.5. Bộ đếm/Bộ định thời 16
1.5. Nguyên lý hoạt động của một vi xử lý
CHưƠNG 2: TỔNG QUAN VỀ TCP/IP
2.1. Mạng và giao thức
18
23
23
2.1.1. Mạng (Mạng máy tính) 23
2.1.2 . Giao thức TCP/IP 24
2.2. Mạng cục bộ LAN và công nghệ Ethernet
29
2.2.1. Mạng cục bộ LAN 29
2.2.2. Công nghệ Ethernet 30
2.3. Hệ thống tên/địa chỉ
CHưƠNG 3 - KIẾN TRÚC CỦA HỆ THỐNG
3.1. Sơ đồ khối hệ thống 35
3.2. Vi mạch truyền thông ethernet 36
3.3. Vi mạch điều khiển (vi xử lý) 40
3.3.1. Sơ đồ các chân PIC16F87X 42
3.3.2. Sự tổ chức bộ nhớ PIC16F877. 43
3.3.3. Truy xuất bộ nhớ 44
3.3.4. Truy xuất các cổng vào ra 44
3.3.5. Các Bộ Timer của chip 46
3.3.6. Bộ chuyển đổi tương tự sang số 51
3.3.7. Các ngắt của PIC16F877 52
3.4. Các vi mạch phụ trợ khác
52
3.4.1. Màn hình LCD 16 ký tự, 2 dòng 52
3.4.2. Vi mạch chuyển đổi mức MAX232 53
3.4.3. Vi mạch ổn áp 3V3 – LD1117S33 54
3.4.4. Biến áp mạng 55
3.4.5. Các linh kiện khác 55
3.5. Sơ đồ nguyên lý của hệ thống 55
3.6. Vẽ mạch in trên sơ đồ nguyên lý 57
CHưƠNG 4 - LẬP TRÌNH CHO HỆ THỐNG
4.1. Phần mềm lập trình và biên dịch CCS
58
58
4.1.1. Tổng quan về CCS 58
4.1.2. Giới thiệu về CCS 58
4.1.3. Tạo PROJECT đầu tiên trong CCS 59
4.1.3.1. Tab General 61
4.1.3.2. Tab Communications 62
4.1.3.3. Tab SPI and LCD 62
4.1.3.4. Tab Timer 63
4.1.3.5. Tab Analog 63
4.1.3.6. Tab Other 64
4.1.3.7. Tab Interrupts và Tab Driver 65
4.2. Lưu đồ thuật toán và chương trình
66
4.2.1. Mô hình điều khiển của hệ thống điều khiển và giám sát từ xa 66
4.2.2. Lưu đồ thuật toán 67
4.2.3. Chương trình cho vi xử lý 68
KẾT QUẢ VÀ KIẾN NGHỊ 78
TÀI LIỆU THAM KHẢO 79
                
              
                                            
                                
            
 
            
                
85 trang | 
Chia sẻ: maiphuongtl | Lượt xem: 2457 | Lượt tải: 2
              
            Bạn đang xem trước 20 trang tài liệu Luận văn Thiết kế hệ thống điều khiển và giám sát từ xa thông qua hệ thống truyền thông với giao thức TCP/IP, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
hứa giá trị tương đối của gói con trong gói to ban đầu. Khi phân mảnh các cờ được bật 
lên, đồng thời trường offset được thiết lập giá trị. Dựa vào các dữ liệu trên, IP có thể dễ 
dàng gom mảnh gói dữ liệu, hồi phục khối dữ liệu từ ban đầu. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
CHƢƠNG 3 
KIẾN TRÚC CỦA HỆ THỐNG 
3.1. Sơ đồ khối hệ thống 
Tôi xin đưa ra sơ đồ khối của “Hệ thống điều khiển và giám sát từ xa qua hệ thống 
truyền thông với giao thức TCP/IP”, như sau: 
Hình 3.1. Sơ đồ khối hệ thống điều khiển và giám sát thông qua mạng Ethernet 
Những khối được liệt kê trong sơ đồ khối có thể là một hay nhiều IC riêng lẻ, cũng 
có thể một IC phụ trách nhiều khối trong sơ đồ. Khi lựa chọn vi mạch, việc đầu tiên là 
xem xét sự phù hợp của nó cho mục đích sử dụng, quy mô dự án, sự hỗ trợ của hãng 
cung cấp linh kiện, sự hỗ trợ về phần mềm lập trình, tài liệu, ... sau cùng mới tính đến 
giá thành và sự phổ biến của các vi mạch trên thị trường. 
Trong đề tài này, mặc dù chíp vi xử lý là hạt nhân của cả dự án, nhưng tôi chọn 
trước tiên lại chính là chíp hỗ trợ truyền thông ethernet. Còn tất cả các vi mạch phụ trợ 
khác đã quá quen thuộc với những kỹ sư điện tử và thiết kế mạch, tôi chỉ xin đưa ra và 
coi đó là lựa trọn hiển nhiên và hoàn toàn không ảnh hưởng gì đến bản chất của dự án. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Trong những phần tiếp theo, chúng ta tập trung xem xét hai vi mạch chính là vi 
mạch giao tiếp ethernet và vi mạch điều khiển (vi mạch vi xử lý). 
3.2. Vi mạch truyền thông ethernet 
Khi khảo sát về vi mạch ethernet, đòi hỏi người thiết kế phải có trình độ nhất định 
trong lĩnh vực mạng Internet, tuy nhiên vì đề tài có hạn, tôi xin không đi sâu vào kỹ 
thuật này. 
Trên thế giới có rất nhiều hãng cung cấp vi mạch hỗ trợ sẵn sàng cho các giao tiếp 
theo giao thức TCP/IP, như các hãng lớn: Realtek, Conexant, MicroChip,... Tuy nhiên, 
xét trên quan điểm của người thiết kế thì các chíp được đánh giá cao là chíp đáp ứng 
được nhu cầu thực tế (không thiếu và cũng không quá dư thừa tính năng), được sự hỗ 
trợ tối đa từ hãng về các thư viện lập trình, dễ dàng giao tiếp với các vi xử lý, mạch 
thiết kế đơn giản, ít đòi hỏi các linh kiện ngoài. Từ những tiêu chí đó, cùng với sự ra 
đời dòng chíp hỗ trợ hoàn toàn giao thức ethernet, việc lựa chọn ENC28J60 của 
MicroChip là lựa chọn rất phù hợp, cả về tính năng kỹ thuật và giá cả (tại thời điểm 
năm 2008,2009 giá ~3USD/1chíp). Ngoài ra, hãng hỗ trợ đầy đủ tài liệu và các thư 
viện lập trình, rất thân thiện khi ghép nối với các họ vi xử lý có trên thị trường. 
Các chỉ tiêu kỹ thuật 
* Giới thiệu chung: 
- Tương thích chuẩn IEEE 802.3 Ethernet Controller 
- Tích hợp địa chỉ MAC và 10BASE-T PHY 
- Bộ đệm SRAM 8 Kbyte Transmit/Receive Packet Dual Port Buffer 
- Chế độ tự động gửi lại khi có xung đột 
- Chế độ tự động hủy bỏ các gói tin sai 
* Bộ đệm: 
- Kích thước bộ đệm transmit/receive có thể lập trình được 
- Giám sát quá trình nhận FIFO 
* PHY: 
- Bộ lọc tín hiệu ra 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
- Có chế độ Loopback 
* MAC (Media Access Control): 
- Hỗ trợ Unicast, Multicast và Broadcast 
- Hỗ trợ nhiều dạng đóng gói tin Magic Packet®, Unicast, Multicast, 
Broadcast 
Hình 3.2. Sơ đồ khối vi mạch giao tiếp ethernet ENC28J60 
Như đã trình bày ở trên, ta xem xét chủ yếu vào phần giao tiếp của vi mạch này với 
vi xử lý, tất cả các phần liên quan đến kỹ thuật mạng ethernet sẽ sáng tỏ khi chúng ta 
lập trình cho nó ở phần tiếp theo. 
Vi mạch ENC28J60 giao tiếp với các vi xử lý khác thông qua chuẩn truyền dữ liệu 
nối tiếp SPI (Serial Peripheral Interface), đây là chuẩn giao tiếp rất phổ biến, được 
dùng để nối các vi mạch trong cùng một hệ thống với ưu điểm là chạy nhanh và tốn rất 
ít dây nối tín hiệu, chỉ cần 3 dây cho cả đường ghi và đọc, đó là: 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 3.3. Sơ đồ ghép nối ENC28J60 với vi xử lý 
SCK Serial Clock – Xung đồng bộ cho đường nối tiếp 
SI Serial Input – Tín hiệu nối tiếp vào (ghi) 
SO Serial Output – Tín hiệu nối tiếp ra (đọc) 
Sau đây là bộ lệnh SPI dùng cho vi mạch ENC28J60 và các giản đồ xung thể hiện 
các quá trình ghi, đọc dữ liệu, lệnh giữa vi xử lý và ENC28J60 
Hình 3.4. Quá trình đọc thanh ghi điều khiển Ethernet 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 3.5. Quá trình đọc thanh ghi điều khiển MAC 
Hình 3.6. Quá trình ghi vào thanh ghi lệnh 
Hình 3.7. Quá trình ghi vào bộ đệm lệnh 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 3.8. Quá trình ghi vào lệnh của hệ thống 
Mặc dù đã được thiết kế theo cấu trúc “stand alone” (một chip làm hết các việc) 
nhưng việc điều khiển để vi mạch này hoạt động được là rất phức tạp và đòi hỏi có 
hiểu biết khá toàn diện về vi điều khiển, mạch điện tử và mạng Internet. Tuy nhiên, rất 
may mắn cho người thiết kế và lập trình vì hãng MicroChip (hãng sản xuất vi mạch 
ENC28J60) đã hỗ trợ tối đa, bằng cách đưa ra đầy đủ các thư viện phục vụ cho việc lập 
trình, làm cho việc lập trình giao tiếp với vi mạch này trở nên khá dễ dàng. 
3.3. Vi mạch điều khiển (vi xử lý) 
PIC là một họ vi điều khiển RISC được sản xuất bởi công ty Microchip 
Technology. Dòng PIC đầu tiên là PIC1650 được phát triển bởi Microelectronics 
Division thuộc General Instrument. PIC bắt nguồn là chữ viết tắt của Programmable 
Intelligent Computer" (Máy tính khả trình thong minh) là một sản phẩm của hãng 
General Instruments đặt cho dòng sản phẩm đầu tiên của họ là PIC1650. Lúc này, 
PIC1650 được dùng để giao tiếp với các thiết bị ngoại vi cho máy chủ 16bit CP1600, 
vì vậy, người ta cũng gọi PIC với cái tên "Peripheral Interface Controller" (Bộ điều 
khiển giao tiếp ngoại vi). CP1600 là một CPU tốt, nhưng lại kém về các hoạt động xuất 
nhập, và vì vậy PIC 8-bit được phát triển vào khoảng năm 1975 để hỗ trợ hoạt động 
xuất nhập cho CP1600. PIC sử dụng microcode đơn giản đặt trong ROM, và mặc dù, 
cụm từ RISC chưa được sử dụng thời bây giờ, nhưng PIC thực sự là một vi điều khiển 
với kiến trúc RISC, chạy một lệnh một chu kỳ máy (4 chu kỳ của bộ dao động). 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Năm 1985 General Instruments bán bộ phận vi điện tử của họ, và chủ sở hữu mới 
hủy bỏ hầu hết các dự án - lúc đó đã quá lỗi thời. Tuy nhiên PIC được bổ sung 
EEPROM để tạo thành 1 bộ điều khiển vào ra khả trình. Ngày nay rất nhiều dòng PIC 
được xuất xưởng với hàng loạt các module ngoại vi tích hợp sẵn (như USART, PWM, 
ADC...), với bộ nhớ chương trình từ 512 Word đến 32K Word. 
Sau khi xem xét nhu cầu của hệ thống và dùng cho những mục đích phát triển sau 
này, tôi chọn sử dụng loại PIC 40 chân, với rất nhiều cổng vào ra số và các đầu vào 
analog, bên cạnh đó là giá thành của vi điều khiển này khá rẻ, chỉ vào khoảng 
5USD/1con. Để hiểu rõ hơn về chip này, chúng ta sẽ tìm hiểu sâu hơn ở các mục tiếp 
theo. 
Đặc tính nổi bật của bộ vi xử lý 
+ Sử dụng công nghệ tích hợp cao RISC CPU. 
+ Người sử dụng có thể lập trình với 35 câu lệnh đơn giản. 
+ Tất cả các câu lệnh thực hiện trong một chu kì lệnh ngoại trừ một số câu lệnh 
rẽ nhánh thực hiện trong 2 chu kì lệnh. 
+ Tốc độ hoạt động là: Xung đồng hồ vào là DC 20MHz 
+ Chu kỳ lệnh thực hiện trong 200ns 
+ Bộ nhớ chương trình Flash 8Kx14 words 
+ Bộ nhớ Ram 368x8 bytes 
+ Bộ nhớ EFPROM 256x 8 bytes 
+ Khả năng ngắt ( lên tới 14 nguồn ngắt trong và ngắt ngoài ) 
+ Ngăn nhớ Stack được phân chia làm 8 mức 
+ Truy cập bộ nhớ bằng địa chỉ trực tiếp hoặc gián tiếp. 
+ Nguồn khởi động lại (POR) 
+ Bộ tạo xung thời gian (PWRT) và bộ tạo dao động (OST) 
+ Bộ đếm xung thời gian (WDT) với nguồn dao động trên chíp (nguồn dao động 
RC ) hoạt động đáng tin cậy. 
+ Có mã chương trình bảo vệ. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
+ Phương thức cất giữ SLEEP 
+ Có bảng lựa chọn dao động. 
+ Công nghệ CMOS FLASH /EEPROM nguồn mức thấp ,tốc độ cao. 
+ Thiết kế hoàn toàn tĩnh . 
+ Mạch chương trình nối tiếp có 2 chân. 
+ Xử lý đọc /ghi tới bộ nhớ chương trình . 
+ Dải điện thế hoạt động rộng : 2.0V đến 5.5V 
+ Nguồn sử dụng hiện tại 25 mA 
+ Công suất tiêu thụ thấp 
Các đặc tính nổi bật của thiết bị ngoại vi trên chip 
+ Timer0: 8 bit của bộ định thời, bộ đếm với hệ số tỷ lệ trước 
+ Timer1: 16 bit của bộ định thời, bộ đếm với hệ số tỷ lệ trước, có khả năng 
tăng trong khi ở chế độ Sleep qua xung đồng hồ được cung cấp bên ngoài. 
+ Timer 2: 8 bit của bộ định thời, bộ đếm với 8 bit của hệ số tỷ lệ trước, hệ số tỷ 
lệ sau. 
+ Có 2 chế độ bắt giữ, so sánh, điều chế độ rộng xung(PWM). 
+ Chế độ bắt giữ với 16 bit, với tốc độ 12.5 ns, chế độ so sánh với 16 bit, tốc độ 
giải quyết cực đại là 200 ns, chế độ điều chế độ rộng xung 10 bit. 
+ Bộ chuyển đổi tín hiệu số sang tương tự với 10 bit . 
+ Cổng truyền thông nối tiếp SSP với SPI phương thức chủ và I2C 
+ Bộ truyền nhận thông tin đồng bộ, dị bộ(USART/SCL) có khả năng phát hiện 
9 bit địa chỉ. 
+ Cổng phụ song song (PSP) với 8 bit, với RD, WR và CS điều khiển. 
3.3.1. Sơ đồ các chân PIC16F87X 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 3.9. Sơ đồ chân vi mạch PIC16F87X 
3.3.2. Sự tổ chức bộ nhớ PIC16F877. 
PIC16F877 có 3 khối bộ nhớ. Bộ nhớ chương trình PLASH, bộ nhớ dữ liệu RAM, 
bộ nhớ EEPROM. 
a)Bộ nhớ chương trình FLASH và Stack nhớ 
Vi điều khiển PIC16F877 có một bộ đếm chương trình 13 bit và có 8Kx14 từ mã 
của bộ nhớ chương trình FLASH, được chia thành 4 trang mỗi trang 2Kx14 từ mã. Khi 
Reset địa chỉ bắt đầu thực hiện chạy là 0000h, Vector ngắt bắt đầu 0004h. Stack có 8 
mức dùng để lưu địa chỉ lệnh (PC) thực hiện tiếp theo sau lệnh CALL và khi xẩy ra 
ngắt. 
b) Bộ nhớ dữ liệu RAM 
RAM là bộ nhớ có thể đọc và ghi, nó không lưu dữ liệu khi mất điện, bộ nhớ RAM 
của PIC16F877 có 4 bank, mỗi bank có dải địa chỉ 027Fh(128byte) trên các bank 
những thanh ghi đa mục đích, nó hoạt động như một RAM tĩnh.(General purpose 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
register), và những thanh ghi chức năng đặc biệt (Special function registers) ở vùng địa 
chỉ thấp. Bit RP1(Status ) và bit RP0 (Status ) dùng để lụa chọn bank làm việc. 
3.3.3. Truy xuất bộ nhớ 
a) Đọc bộ nhớ dữ liệu EEPROM 
Để đọc một vị trí bộ nhớ dữ liệu, ta phải ghi địa chỉ vào thanh ghi EEADR, xoá bit 
điều khiển EEPGD (EECON1) sau đó set bit điều khiển RD (EECON1). Dữ 
liệu vẫn tồn tại trên nhiều lệnh tiếp theo ở trên thanh ghi EEDATA, do đó nó có thể 
được đọc bởi lệnh tiếp theo. EEDATA sẽ giữ giá trị này cho tới khi có hoạt động đọc 
dữ liệu khác hoặc là tới khi được ghi. 
b) Ghi vào bộ nhớ dữ liệu EEPROM 
Để ghi vào bộ nhớ EEPROM thì đầu tiên địa chỉ phải được ghi vào thanh ghi 
EEADR và dữ liệu ghi vào thanh ghi EEDATA. Một số chân của các cổng vào/ra được 
tích hợp với một số hàm có thể thay đổi để phù hợp với những thiết bị ngoại vi. Nhìn 
chung khi thiết bị ngoại vi hoạt động, các chân có thể không sử dụng với mục đích làm 
chân vào ra. 
3.3.4. Truy xuất các cổng vào ra 
a) Cổng A và thanh ghi TRISA 
Cổng A là cổng hai chiều với độ rộng đường truyền là 6 bit. Để điều khiển việc truy 
xuất dữ liệu người ta dùng thanh ghi TRISA . 
Nếu đặt bit TRISA = 1 thì lúc này cổng A sẽ tương ứng có các chân là chân vào. 
Nếu xoá bit TRISA = 0 thì lúc này cổng A sẽ tương ứng có các chân là chân ra. 
Việc đọc cổng A chính là đọc trạng thái của các chân, trong khi đó việc viết phải qua 
việc viết các chốt của cổng. Các chân của cổng A chủ yếu được sử dụng với mục đích 
chính là nhận tín hiệu tương tự hoặc làm các chân vào ra. Riêng chân RA4 có thể đa 
hợp với chân vào bộ Timer 0 và khi đó nó trở thành chân RA4/T0CKI. Chân này như 
một đầu vào của Schmitt Trigger và nó mở đầu ra. Các chân khác của cổng A là chân 
vào với bộ TTL. Việc điều khiển các chân này thông qua việc đặt hay xoá các bit của 
thanh ghi ADCON1. Thang ghi TRISA điều khiển trực tiếp các chân của cổng A, khi 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
sử dụng các chân này để nhận tín hiệu tương tự vào ta phải chắc chắn rằng các bit của 
thanh ghi TRISA đã được đặt rồi. 
Sơ đồ khối chân RA3:RA0 và chân RA5 và của chân RA4/TOCKI của cổng A. 
b) Cổng B và thanh ghi TRISB 
Cổng B là cổng hai chiều với độ rộng đường truyền là 8 bit. Tương ứng với nó để 
điều khiển trực tiếp dữ liệu ta sử dụng thanh ghi TRISB. 
Nếu đặt bit TRISB = 1 thì lúc này các chân cổng B được định nghĩa là chân vào. 
Nếu xoá bit TRISB = 0 thì lúc này các chân cổng B được định nghĩa là chân ra. Nội 
dung của chốt ra có thể chọn trên mỗi chân. Có 3 chân của cổng B có thể đa hợp với 
các chương trình vận hành bằng điện áp thấp. Đó là các chân sau: RB3/PGM, 
RB6/PGC, RB7/PGD. Sự thay đổi hoạt động của những chân này được miêu tả ở trong 
phần đặc tính nổi bật. Mỗi chân của cổng B có một khả năng dừng bên trong nhưng 
yếu. Điều này được trình bày bởi việc xoá bit RBPU (bit 7 của thanh ghi 
OPTION_REG). Khả năng dừng này sẽ tự động tắt đi khi các chân của cổng được định 
nghĩa là chân ra. Khả năng dừng này sẽ tự động mất đi khi ta RESET. Bốn chân của 
cổng B, từ RB7 đến RB4 có đặc tính là ngắt khi thay đổi trạng thái. Chỉ những chân 
được định dạng là những chân vào thì ngắt này mới tồn tại. Một vài chân RB7:RB4 
được định dạng như chân ra, nó thi hành ngắt trên sự thay đổi so sánh. Chân vào 
RB7:RB4 được so sánh với giá trị cũ của chốt ở lần đọc cuối cùng của cổng B. 
Sự ghép đôi không khớp chân ra của RB7:RB4 bằng lệnh OR làm phát ra lệnh ngắt 
với cờ bit RBIF của thanh ghi INTCON. Ngắt này có thể khởi động thiết bị từ trạng 
thái SLEEP. 
c) Cổng C và thanh ghi TRISC 
Cổng C là cổng hai chiều với độ rộng đường truyền là 8 bit .Tương ứng với việc 
điều khiển nó là thanh ghi TRISC. 
Nếu đặt bit TRISC = 1 thì tương ứng với chân của cổng C là chân vào. 
Nếu ta xoá bit TRISC = 0 thì tương ứng với nó chân của cổng C là chân ra. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Đặt nội dung của chốt ra có thể đặt trên chân chọn. Cổng C đa hợp với việc vận 
hành thiết bi ngoại vi. Chân của cổng C thông qua bộ đệm Schmitt Trigger đầu vào. 
Khi chế độ I2C hoạt động, thì các chân cổng PORTC có thể được sắp xếp với 
mức I2C thường hoặc với mức SMBUS bằng cách sử dụng bit CKE (SSPSTAT) là 
bit 6 của thanh ghi SSPSTAT. Khi vận hành các thiết bị ngoại vi bằng việc xác định bit 
TRIS của mỗi chân cổng C. Một số phần phụ có thể ghi đè lên bit TRISC làm cho chân 
này trở thành chân ra, trong khi đó thì một số phần phụ khác lại ghi đè lên bit TRIS 
làm cho chân này trở thành chân vào. Từ khi những bit TRIS ghi đè thì trong việc tác 
động trong các thiết bị ngoại vi là có thể, những lệnh đọc, sửa, ghi (BSF, BCF, 
XORWF) với thanh ghi TRISC như là nơi gửi tới sẽ được tránh. Người sử dụng nên đề 
cập tới việc phân chia kết nối các thiết bị ngoại vi cho việc set chính xác các bit TRIS. 
d) Cổng D và thanh ghi TRISD 
Cổng D có 8 bit có bộ đệm đầu vào Schmitt Trigger. Mỗi chân được sắp xếp riêng 
lẻ như đầu vào hoặc đầu ra. Cổng D cũng có thể được sắp xếp như là một cổng vi xử lý 
8 bit (cổng phụ song song) bằng việc đặt bit điều khiển PSPMODE(TRISE) và 
trong chế độ này vùng đệm đầu vào là TTL. 
e) Cổng E và thanh ghi TRISE 
Cổng E có 3 chân là RE0/RD/AN5, RE1/WR/AN6, RE2/CS/AN7. Các chân này có 
thể sắp xếp riêng lẻ là các đầu vào hoặc các đầu ra, và các chân có vùng đệm đầu vào 
là các mạch Schmitt Trigger. Cổng vào/ra E trở thành đầu vào điều khiển cho cổng vi 
xử lý khi bit PSPMODE(TRISE) được đặt. Và trong chế độ này phải chắc chắn 
rằng các bit TRISE được đặt (các chân được định dạng là các đầu vào số), thanh 
ghi ADCON1 phải được định dạng cho việc số vào/ra và vùng đệm đầu vào là TTL. 
Các chân cổng E cũng được tích hợp với các đầu vào tương tự và trong trường hợp 
này các chân sẽ đọc là „0‟. Thanh ghi TRISE điều khiển trực tiếp các chân RE, ngay cả 
khi chúng được dùng là các đầu vào tương tự. 
3.3.5. Các Bộ Timer của chip 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Bộ vi điều khiển PIC16F87X có 3 bộ Timer đó là: Timer0, Timer1, Timer2 là bộ 
định thời hoặc bộ đếm có những ưu diểm nổi bật sau: 
+ 8 bit cho timer hoặc bộ đếm 
+ Có khả năng đọc và viết 
+ Có thể dùng đồng hồ bên trong hoặc bên ngoài 
+ Có thể chọn canh xung của xung đồng hồ 
+ Có hệ số chia cho xung đầu vào có thể lập trình lại bằng phần mềm 
+ Ngắt tràn 
a) Tốc độ truyền 
Tốc độ truyền được cung cấp cho cả hai chế độ đó là truyền thông đồng bộ và dị bộ 
thanh ghi SPBRG điều khiển chu kì chạy 8 bit của timer. Trong chế độ dị bộ, bit 
BRGH của thanh ghi TXSTA được dùng để điều khiển tốc độ, còn ở trong chế độ đồng 
bộ nó không được sử dụng. 
b) Chế độ truyền thông không đồng bộ 
Trong chế độ này dữ liệu được định dạng như sau: đầu tiên là bit START, tiếp theo 
là 8 hoặc 9 bit dữ liệu, cuối cùng là bit STOP. Thông thường dữ liệu được định dạng ở 
dạng 8 bit. Việc truyền và nhận dữ liệu được tiến hành với những bit thấp trước. Việc 
truyền và nhận có thể tiến hành độc lập nhau, khi sử dụng có thể định dạng dữ liệu và 
tốc độ truyền. Việc truyền thông dị bộ dừng khi ở chế độ SLEEP. 
*Truyền dữ liệu ở chế độ dị bộ 
Quan trọng nhất trong việc truyền dữ liệu là thanh ghi TSR. Dữ liệu của nó có thể 
được viết và đọc thông qua bộ đệm là thanh ghi TXREG. Thanh ghi TSR không được 
nạp giá trị cho tới khi bit STOP của lần trước chuyển đi. Khi bit STOP chuyển đi nó sẽ 
nạp giá trị mới tới thanh ghi TSR từ thanh ghi TXREG. Nếu thanh ghi TXREG rỗng nó 
sẽ đặt cờ bit TXIF của thanh ghi PIR1. Trong khi cờ bit TXIF cho biết trạng thái của 
thanh ghi TXREG, thì bit TRMT cho biết trạng thái của thanh ghi TSR. Bit trạng thái 
TRMT chỉ dùng để đọc, nó được đặt khi thanh ghi TSR rỗng. Việc truyền dữ liệu hoạt 
động khi ta đặt bit TXEN của thanh ghi TXSTA. Việc truyền dữ liệu chỉ hoạt động khi 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
dữ liệu đã được nạp tới thanh ghi TXREG và tốc độ truyền đã được sản sinh từ xung 
đồng hồ. Khi việc truyền dữ liệu bắt đầu lần đầu tiên thì thanh ghi TSR lúc đó rỗng. 
Ngay lập tức dữ liệu được truyền từ thanh ghi TXREG tới thanh ghi TSR và sau đó 
thanh ghi TXREG rỗng, sau đó nó lại quay lại 
như trên. Để việc truyền 9 bit dữ liệu thì bit truyền TX9 của thanh ghi TXSTA phải 
được đặt và bit thứ 9 truyền đi được viết tới bit TX9D. Bit thứ 9 này phải được viết 
trước, trước khi chuyển 8 bit dữ liệu tới thanh ghi TXREG. Bởi vì dữ liệu viết tới thanh 
ghi ngay lập tức được chuyển tới thanh ghi TSR. 
*Việc nhận dữ liệu ở chế độ dị bộ 
Trong chế độ dị bộ, việc nhận dữ liệu được kích hoạt bằng việc đặt bit CREN của 
thanh ghi RCSTA. Phần quan trọng nhất trong việc nhận dữ liệu là thanh ghi RSR. Sau 
khi đã nhận xong bit STOP, nó chuyển dữ liệu từ thanh ghi RSR tới thanh ghi RCREG 
nếu thanh ghi này trống. Nếu việc truyền nhận hoàn thành thì cờ bit RCIF của thanh 
ghi PIR1 sẽ được đặt, có thể ngắt hoạt động của nó bằng việc đặt bit RCIE của thanh 
ghi PIE1. Cờ bit RCIF chỉ dùng để đọc, nó được xóa trong phần cứng. Nó sẽ được xoá 
khi thanh ghi RCREG được đọc là trống. Thanh ghi này là một thanh ghi có bộ đệm 
đôi. Nó có khả năng nhận 2 byte dữ liệu và truyền tới thanh ghi RCREG FIFO và khi 
đó byte thứ 3 đi vào thanh ghi RSR. Nếu phát hiện bit STOP mà thanh ghi RCREG vẫn 
đầy thì bit báo lỗi OERR sẽ được đặt. Bit báo lỗi chỉ được xoá trong phần mềm. Nếu 
bit OERR được đặt thì việc truyền dữ liệu từ thanh ghi RSR tới thanh ghi RCREG bị 
ngăn cấm và không có dữ liệu được nhận. Cấu trúc của bit báo lỗi FERR được đặt khi 
bit STOP được phát hiện đã được xoá. Bit FERR và bit thứ 9 là các bộ dệm giống như 
phương pháp bộ đệm. Trong khi đang đọc thanh ghi RCREG nó sẽ nạp giá trị mới cho 
bit RX9D và FERR. 
c) Truyền thông đồng bộ chế độ chủ 
Trong chế độ này dữ liệu được truyền nhận duới dạng bán song công (việc truyền 
và nhận dữ liệu không thể tiến hành đồng thời cùng một lúc). Khi đang truyền dữ liệu 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
thì việc nhận dữ liệu bị ngăn cấm, việc chọn chế độ truyền thông đồng bộ được xác lập 
bằng việc đặt bit SYNC của thanh ghi TXSTA, ngoài ra bit SPEN còn được đặt để định 
dạng các chân RC6/TX/CKvà RC7/RX/DT để cho chân xung đồng hồ và chân truyền 
dữ liệu. Chế độ chờ còn được xác lập bằng việc đặt bit CSRC của thanh ghi TXSTA. 
Việc nhận dữ liệu trong chế độ truyền thông đồng bộ chờ tương tự như truyền 
thông dị bộ, nó phải có thanh ghi TSR. thanh ghi này đọc và viết dữ liệu thông qua bộ 
đệm là thanh ghi TXREG. Thanh ghi này được nạp dữ liệu trong phần mềm. Thanh ghi 
TSR sẽ không được nạp giá trị cho tới tận khi đã truyền hết bit cuối cùng của lần truớc 
đó. Khi đã truyền hết bit cuối cùng, thì thanh ghi TSR sẽ nạp giá trị mới từ thanh ghi 
TXREG. Thanh ghi TXREG rỗng thì bit cờ ngắt TXIF sẽ được đặt. Cờ ngắt này có thể 
quy định hoạt động hoặc không hoajt động bằng việc đặt hoặc xoá bit TXIE của thanh 
ghi PIE1. Trong khi cờ bit TXIF cho biết trạng thái của thanh ghi TXREG, thì bit 
TRMT cho biết trạng thái của thanh ghi TSR. Bit trạng thái TRMT chỉ dùng để đọc, nó 
được đặt khi thanh ghi TSR rỗng. 
Việc truyền dữ liệu hoạt động bằng việc đặt bit TXEN của thanh ghi TXSTA, bit 
dữ liệu đầu tiên sẽ được di chuyển trên xung đi lên của xung clock trên chân CLK. 
Việc truyền dữ liệu được bắt đầu bằng thanh ghi TXREG và đặt bit TXEN. Ưu diểm ở 
đây là tốc độ thấp có thể được lựa chọn. Tốc độ truyền được giữ nguyên trong khi 
RESET xoá 3 bit TXEN, CREN, SREN. Việc truyền dữ liệu được bắt đầu lần đầu tiên 
khi thanh ghi TSR rỗng, khi chuyển dữ liệu tới thanh ghi TXREG nó ngay lập túc 
chuyển tới thanh ghi TSR và kết quả là thanh ghi TXREG rỗng. 
Xoá bit TXEN trong khi đang truyền dữ liệu là lí do việc truyền dữ liệu bị gián 
đoạn và nó phải dừng lại, và nếu bit CREN hoặc bit SREN được đặt trong khi đang 
truyền cũng là nguyên nhân gây ra việc truyền dữ liệu bị gián đọan. Với mục dích 
truyền 9 bit dữ liệu thì bit TX9 của thanh ghi TXSTA phải được đặt và bit thứ 9 này 
phải được viết tới bit TX9D. Bit thứ 9 này phải được viết trước khi viết 8 bit dữ liệu tới 
thanh ghi TXREG. Bởi vì dữ liệu được viết tới thanh ghi TXREG ngay lập tức được 
chuyển tới thanh ghi TSR, nếu thanh ghi này rỗng. Nếu thanh ghi TSR rỗng và thanh 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
ghi TXREG được viết trước khi viết giá trị mới tới bit TX9D, thì hiện tại nó sẽ nạp giá 
trị cũ ở trong bit TX9D. 
Việc nhận dữ liệu ở chế độ đồng bộ chờ 
 chế độ nhận dữ liệu ở chế độ đồng bộ chờ được chọn bằng việc đặt bit SREN hoặc 
bit CREN của thanh ghi RCSTA. Dữ liệu được đưa ở chân RC/RX/DT ở trên cạnh 
xuống của xung đồng hồ. Nếu bit SREN được đặt thì chỉ có 1 từ được nhận. nếu bit 
CREN được đặt thì việc nhận cứ tiếp diễn cho tới tận khi bit này được xoá mới thôi. Cả 
hai bit này đều được đặt thì bit CREN được ưu tiên trước rồi theo thứ tự đó. Sau khi dữ 
liệu đã được nhận vào trong thanh ghi RSR nó sẽ chuyển tới thanh ghi RCREG. Khi 
việc chuyển dịch này hoàn thành thì cờ bit RCIF của thanh ghi PIR1 sẽ được đặt. Hoạt 
động của cờ này có thể có hoặc không nhờ việc đặt hoặc xoá bit RCIE của thanh ghi 
PIE1. RCREG là 1 thanh ghi có 2 bộ đệm là 2 thanh ghi. Nó có khả năng nhận 2 byte 
dữ liệu để chuyển tới thanh ghi RCREG FIFO và byte thứ ba bắt đầu chuyển tới thanh 
ghi RSR. Trong khi rời bit cuối cùng của byte thứ ba mà thanh ghi RCREG vẫn đầy thì 
bit báo lỗi OERR sẽ được đặt và từ ở trong thanh ghi RSR sẽ bị lỗi. Bit OERR được 
xóa trong phần mềm. Nếu bit này được đặt thì việc chuyển dữ liệu từ thanh ghi RSR 
tới thanh ghi RCREG bị ngăn cấm. Việc nhận bit thứ 9 cũng tương tự như việc nhận 
bit dữ liệu. Trong khi thanh ghi RCREG đang đọc nó sẽ nạp giá trị mới cho bit RX9D. 
Đó là điều cần chú ý khi người sử dụng dùng truyền thông chín bit dữ liệu 
d) Truyền thông đồng bộ chế độ phụ 
Truyền thông đồng bộ chế độ phụ khác với truyền thông đồng bộ chế độ chính 
trong trường hợp xung đồng hồ bên ngoài cung cấp tại chân RC6/ TX / CK. Nó có thể 
cho phép thiết bị nhận hoặc truyền dữ liệu trong chế độ SLEEP. Chế độ phụ được tiến 
hành bằng việc xoá bit CSRC của thanh ghi TXSTA. 
*Truyền dữ liệu trong chế độ truyền thông phụ 
Hoạt động của chế độ truyền thông đồng bộ chính và truyền thông đồng bộ phụ 
hoàn toàn giống nhau, chỉ khác là chế độ truyền thông phụ có thể hoạt động ở chế độ 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
SLEEP. Nếu hai từ được viết tới thanh ghi TXREG và lệnh SLEEP đựơc tiến hành thì 
nó sẽ tồn tại những điểm sau : 
+ Từ đầu truyền tới thanh ghi TSR và nó chuyển đi ngay lập tức. 
+ Từ thứ hai được chứa trong thanh ghi TXREG. 
+ Cờ bit TXIF sẽ không được đặt. 
+ Khi từ đầu tiên được chuyển ra khỏi thanh ghi TSR. Thanh ghi TXREG sẽ 
chuyển từ thứ hai vào thanh ghi TSR và bây giờ cờ bit TXIF sẽ được đặt. 
+ Nếu bit TXIE được đặt ngắt sẽ được gọi từ SLEEP và ngắt tính toàn cầu của ngắt 
sẽ được gọi. 
*Nhận dữ liệu ở chế độ truyền thông đồng bộ phụ 
Hoạt động của chế độ truyền thông đồng bộ chế độ phụ và truyền thông đồng bộ 
chế độ chính hoàn toàn giống nhau, nhưng ở chế độ phụ nó có thể hoạt động ở lệnh 
SLEEP. Bit SREN không được sử dụng ở chế độ này. 
Nếu việc nhận dữ liệu được hoạt động bằng việc đặt bit CREN trước khi lệnh 
SLEEP được thực hiện. Từ được nhận trong khi SLEEP, khi việc nhận dữ liệu hoàn 
thành, thì thanh ghi RSR sẽ chuyển dữ liệu tới thanh ghi RCREG và nếu bit RCIE 
được đặt, thì ngắt có thể gọi từ lệnh SLEEP. 
3.3.6. Bộ chuyển đổi tƣơng tự sang số 
Bộ chuyển đổi tương tự sang số có 8 kênh đối với PIC16F877. Tín hiệu tương tự 
được nạp vào bộ nạp điện và giữ điện dung. Tín hiệu ra điển hình và giữ điện dung duy 
trì là đầu vào bộ chuyển đổi. Bộ chuyển đổi A/D phát ra kết quả số 10 bit. Bộ chuyển 
đổi A/D có sự chuyển điện thế cao và thấp đầu vào được lựa chọn trong phần mềm để 
có sự kết hợp của VDD, VSS, RA2, RA3. 
Bộ chuyển đổi A/D có đặc trưng duy nhất có thể hoạt động trong khi thiết bị là 
trong trạng thái SLEEP. Để hoạt động trong phương thức này A/D phải được lấy từ 
nguồn đồng hồ bên trong mạch dao động RC. 
Bộ chuyển đổi A/D có 4 thanh ghi. Đó là những thanh ghi: 
- A/D thanh ghi kết quả cao(ADRESH) 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
- A/D thanh ghi kết quả thấp(ADRESL) 
- Thanh ghi điều khiển chuyển đổi A/D ( ADCON0) 
- Thanh ghi điều khiển chuyển đổi A/D ( ADCON1) 
Tốc độ chuyển đổi là được định như là TAD. Quy định thời gian chuyển đổi A/D 
nhỏ nhất 12TAD cho 10 bit chuyển đổi. Nguồn của thời gian chuyển đổi lựa chọn 
trong phần mềm. 
3.3.7. Các ngắt của PIC16F877 
PIC16F877 có 14 nguồn ngắt, thanh ghi INTCON là thanh ghi điều khiển các ngắt, 
mỗi ngắt có một bit cờ ngắt và một bit cho phép hoặc cấm ngắt. Bit GIE(INTCON) 
điều khiển chung cho 14 ngắt. Khi bit này set thì các ngắt mới có tác dụng, khi bit GIE 
xoá thì tất cả các ngắt bị cấm. Bit GIE bị xoá khi reset. Khi bit cờ ngắt thiết lập bit GIE 
thiết lập và bit PEIE thiết lập với ngắt ngoại vi đồng thời bit cho phép ngắt của ngắt đó 
cho phép thì ngắt đó xảy ra. 
Khi một ngắt xảy ra bộ đếm chương trình PC được nạp giá trị 0004h và bit GIE bị 
xoá để cấm sự chồng ngắt, khi chỉ lệnh RETFIE thực hiện trả lại địa chỉ cho PC nơi 
xảy ra ngắt, đồng thời thiết lập lại bit GIE. Khi xảy ra ngắt PC luôn được nạp giá trị 
0004h vì các ngắt được phân biệt bởi bit cờ ngắt của ngắt đó. 
Ngắt ngoài từ chân RB0/INT, và ngắt từ sự thay đổi trạng thái các chân RB4:RB7 
có thể đánh thức bộ xử lý từ chế độ SLEEP. Các thanh ghi PIE1, PIR1, PIE2, PIR2 
điều khiển các ngắt ngoại vi. 
3.4. Các vi mạch phụ trợ khác 
3.4.1. Màn hình LCD 16 ký tự, 2 dòng 
Hình 3.10. Màn hình LCD 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Bảng 3.1. Thông số kỹ thuật của LCD 
Hình 3.11. Sơ đồ khối chức năng LCD 
3.4.2. Vi mạch chuyển đổi mức MAX232 
Vi mạch phổ biến được sử dụng cho mục đích chuyển đổi mức TTL/CMOS sang 
RS-232 là vi mạch MAX232 của hãng Maxim. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Bảng 3.2. Thông số kỹ thuật phần phát của MAX232 
Bảng 3.3. Thông số kỹ thuật phần thu của MAX232 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 3.12. Sơ đồ mạch áp dụng điển hình của MAX232 
3.4.3. Vi mạch ổn áp 3V3 – LD1117S33 
Vi mạch ổn áp này dùng để cấp điện +3.3V cho riêng vi mạch ENC28J60 
Hình 3.13. Sơ đồ mạch áp dụng điển hình của LD1117S33 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
3.4.4. Biến áp mạng 
Biến áp mạng dùng để cách ly về mặt điện 1 chiều giữa thiết bị với các mạng bên 
ngoài, trong đề tài sử dụng loại biến áp có kèm jắc RJ-45. 
Hình 3.14. Sơ đồ chân của biến áp mạng 
3.4.5. Các linh kiện khác 
Các linh kiện phụ trợ khác đã được đưa vào thiết kế: 
- Vi mạch đo nhiệt độ LM335 
- Vi mạch RTC DS1307 
- PIN, thạch anh, .. 
3.5. Sơ đồ nguyên lý của hệ thống 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 3.15. Sơ đồ nguyên lý của hệ thống 
3.6. Vẽ mạch in trên sơ đồ nguyên lý 
Để tiện cho việc thử nghiệm, đơn giản hóa mà không làm mất đi tính tổng quát của 
sơ đồ khối đã đưa ra ở phần trên, thiết kế thực tế đã có 1 số thay đổi cho phù hợp hơn, 
đó là: 
- Các cơ cấu chấp hành (rơle, đèn báo, ..) được thay bằng đèn LED. 
- Một số cổng không sử dụng được đưa ra ngoài bằng jắc cắm dùng cho mục đích 
mở rộng hay các thử nghiệm khác. 
- Tín hiệu analog vào được là vi mạch đo nhiệt độ LM335 
- Phần nguồn DC5V dùng trực tiếp qua cổng USB của PC (hay nguồn ngoài 
+5VDC đã đc ổn áp), trên mạch chỉ còn ổn áp +3.3VDC. 
- Thêm vi mạch DS1307 làm nhiệm vụ tạo đồng hồ thời gian thực cho hệ thống, 
dùng cho mục đích ghi lại thời gian của những sự cố, của người cấu hình, .. 
Sơ đồ nguyên lý được thiết kế trên cơ sở các mạch kết nối điển hình đã được trình 
bày ở phần trên. Phần mềm thiết kế mạch và vẽ sơ đồ nguyên lý có thể dùng bất kỳ 
chương trình nào đang có trên thị trường như ORCAD, PROTEL. Tuy nhiên, do thói 
quen sử dụng, tôi chọn phần mềm ORCAD cho việc thiết kế mạch in và sơ đồ, và vì 
mạch khá phức tạp, nên phải vẽ bằng 2 lớp. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
CHƢƠNG 4 
LẬP TRÌNH CHO HỆ THỐNG 
4.1. Phần mềm lập trình và biên dịch 
4.1.1. Tổng quan về CCS 
Sự ra đời của một loại vi điều khiển đi kèm với việc phát triển phần mềm ứng dụng 
cho việc lập trình cho con vi điều khiển đó. Vi điều khiển chỉ hiểu và làm việc với hai 
con số 0 và 1. Ban đầu để việc lập trình cho vi điều khiển là làm việc với dãy các con 
số 0 và 1. Sau này khi kiến trúc của Vi điều khiển ngày càng phức tạp, số luợng thanh 
ghi lệnh nhiều lên, việc lập trình với dãy các số 0 và 1 không còn phù hợp nữa, đòi hỏi 
ra đời một ngôn ngữ mới thay thế. Và ngôn ngữ lập trình Assembly. Ở đây ta không 
nói nhiều đến Assmebly. Sau này khi ngôn ngữ C ra đời, nhu cầu dùng ngôn ngữ C đề 
thay cho ASM trong việc mô tả các lệnh lập trình cho Vi điều khiển một cách ngắn gọn 
và dễ hiểu hơn đã dẫn đến sự ra đời của nhiều chương trình soạn thảo và biên dịch C 
cho Vi điều khiển : Keil C, HT-PIC, MikroC, CCS… 
Tôi chọn CCS cho bài đề tài này vì CCS là một công cụ lập trình C mạnh cho Vi 
điều khiển PIC. Những ưu và nhược điểm của CCS sẽ được đề cập đến trong các phần 
dưới đây. 
4.1.2. Giới thiệu về CCS 
CCS là trình biên dịch lập trình ngôn ngữ C cho Vi điều khiển PIC của hãng 
Microchip. Chương trình là sự tích hợp của 3 trình biên dich riêng biết cho 3 dòng PIC 
khác nhau đó là: 
- PCB cho dòng PIC 12-bit opcodes 
- PCM cho dòng PIC 14-bit opcodes 
- PCH cho dòng PIC 16 và 18-bit 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Tất cả 3 trình biên dịch này đuợc tích hợp lại vào trong một chương trình bao gồm 
cả trình soạn thảo và biên dịch là CCS, phiên bản mới nhất là PCWH Compiler Ver 
3.227. 
Giống như nhiều trình biên dịch C khác cho PIC, CCS giúp cho người sử dụng nắm 
bắt nhanh được vi điều khiển PIC và sử dụng PIC trong các dự án. Các chương trình 
điều khiển sẽ được thực hiện nhanh chóng và đạt hiệu quả cao thông qua việc sử dụng 
ngôn ngữ lập trình cấp cao – Ngôn ngữ C. 
Tài liệu hướng dẫn sử dụng có rất nhiều, nhưng chi tiết nhất chính là bản Help đi 
kèm theo phần mềm (tài liệu Tiếng Anh). Trong bản trợ giúp nhà sản xuất đã mô tả rất 
nhiều về hằng, biến, chỉ thị tiền xủa lý, cấu trúc các câu lệnh trong chương trình, các 
hàm tạo sẵn cho người sử dụng… 
4.1.3. Tạo PROJECT đầu tiên trong CCS 
Để tạo một Project trong CCS có nhiều cách, có thể dùng Project Wizard, Manual 
Creat, hay đơn giản là tạo một Files mới và thêm vào đó các khai báo ban đầu cần thiết 
và “bắt buộc”. 
Dưới đây sẽ trình bày cách tạo một project hợp lệ theo cả 3 phương pháp. Một điều 
ta cần chú ý khi tạo một Project đó là: khi tạo bắt cứ một Project nào mới thì ta nên tạo 
một thư mục mới với tên liên quan đến Project ta định làm, rồi lưu các files vào đó. 
Khi lập trình và biên dịch, CCS sẽ tạo ra rất nhiều files khác nhau, do đó nếu để chung 
các Project trong một thư mục sẽ rất mất thời gian trong việc tìm kiếm sau này. Đây 
cũng là quy tắc chung khi ta làm việc với bất kỳ phần mềm nào, thiết kế mạch hay 
lậptrình. 
 Tạo một PROJECT sử dụng PIC Wizard 
Trước hết bạn khởi động chương trình làm việc PIC C Compiler. Từ giao diện 
chương trình di chuột chọn Project -> New -> PIC Wizad. 
Sau khi nhấn chuột, một cửa sổ hiện ra yêu cầu ban nhập tên Files cần tạo. Bạn tạo 
một thư mục mới, vào thư mục đó và lưu tên files cần tạo tại đây. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 4.1. Tạo file mới trong PCW compiler 
Như vậy là xong bước đầu tiên. Sau khi nhấn nút Save, một cửa sổ New Project 
hiện ra. Trong của sổ này bao gồm rất nhiều Tab, mỗi Tab mô tả về một vài tính năng 
của con PIC. Ta sẽ chọn tính năng sử dụng tại các Tab tương ứng. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 4.2. Lưu file vào thư mục có sẵn 
Dưới đây sẽ trình bày ý nghĩa từang mục chọn trong mỗi Tab. Các mục chọn này 
chính là đề cập đến các tính năng của một con PIC, tùy theo từng loại mà sẽ có các Tab 
tương ứng. Đối với từng dự án khác nhau, khi ta cần sử dụng tính năng nào của con 
PIC thì ta sẽ chọn mục đó. Tổng cộng có 13 Tab đẻ ta lựa chọn. Sau đây xin giới thiệu 
những Tab chính thường hay được sử dụng. 
4.1.3.1. Tab General 
Tab General cho phép ta lựa chọn loại PIC mà ta sử dụng và một số lựa chọn khác 
như chọn tần số thạch anh dao động, thiết lập các bit CONFIG nhằm thiết lập chế độ 
hoạt động cho PIC. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 4.3. Tab General 
- Device: Liệt kê danh sách các loại PIC 12F, 16F, 18F… Ta sẽ chọn tên Vi điều 
khiển PIC mà ta sử dụng trong dự án. Lấy ví dụ chọn PIC16F877A 
- Oscilator Frequency: Tần số thạch anh ta sử dụng, chọn 20 MHz (tùy từng loại) 
- Fuses: Thiết lập các bit Config như: Chế độ dao động (HS, RC, Internal ), chế độ 
bảo vệ Code, Brownout detected… 
- Chọn kiểu con trỏ RAM là 16-bit hay 8-bit 
4.1.3.2. Tab Communications 
Tab Communications liệt kê các giao tiếp nối tiếp mà một con PIC hỗ trợ, thường là 
RS232 và I2C, cùng với các lựa chọn để thiết lập chế độ hoạt động cho từng loại giao 
tiếp. 
- Giao tiếp RS232: Mỗi một Vi điều khiển PIC hỗ trợ một cổng truyền thông RS232 
chuẩn. Tab này cho phép ta lựa chọn chân Rx, Tx, tốc độ Baud, Data bit, Bit Parity… 
- Giao tiếp I2C: Để sử dụng I2C ta tích vào nút chọn Use I2C, khi đó ta có các lựa 
chọn: Chân SDA, SCL, Tốc độ truyền (Fast - Slow), chế độ Master hay Slave, địa chỉ 
cho Salve. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 4.4. Tab Communications 
4.1.3.3. Tab SPI and LCD 
Tab này liệt kê cho người dùng các lựa chọn đối với giao tiếp nối tiếp SPI, chuẩn 
giao tiếp tốc độ cao mà PIC hỗ trợ về phần cứng. Chú ý khi ta dùng I2C thì không thể 
dùng SPI và ngược lại. Để có thể sử dụng cả hai giao tiếp này cùng một lúc thì buộc 
một trong 2 giao tiếp phải lập trình bằng phần mềm (giồng như khi dùng I2C cho các 
chip AT8051, không có hỗ trợ phần cứng SSP). 
Hình 4.5. Tab SPI and LCD 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
4.1.3.4. Tab Timer 
Liệt kê các bộ đếm/định thời mà các con PIC dòng Mid-range có: Timer0, timer1, 
timer2, WDT… 
Trong các lựa chọn cấu hình cho các bộ đếm /định thời có: chọn nguồn xung đồng 
hồ (trong/ngoài), khoảng thời gian xảy ra tràn… 
Hình 4.6. Tab Timer 
4.1.3.5. Tab Analog 
Liệt kê các lựa chọn cho bộ chuyển đổi tương tự/số (ADC)của PIC. Tùy vào từng 
IC cụ thể mà có các lựa chọn khác nhau, bao gồm: 
- Lựa chọn cổng vào tương tự 
- Chọn chân điện áp lấy mẫu (Vref) 
- Chọn độ phân giải: 8-bit = 0 ~ 255 hay 10-bit = 0~1023 
- Nguồn xung đồng hồ cho bộ ADC (trong hay ngoài), từ đó mà ta có được tốc độ 
lấy mẫu, thường ta chọn là internal 2-6 us. 
- Khi không sử dụng bộ ADC ta chọn none 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 4.7. Tab Analog 
4.1.3.6. Tab Other 
Tab này cho phép ta thiết lập các thông số cho các bộ Capture/Comparator/PWM. 
 Capture - Bắt giữ 
- Chọn bắt giữ xung theo sườn dương (rising edge) hay sườn âm (falling edge) của 
xung vào. 
- Chọn bắt giữ sau 1, 4 hay 16 xung (copy giá trị của TimerX vào thanh ghi lưu trữ 
CCCPx sau 1, 4 hay 16 xung). 
 Compare - So sánh 
Ta có các lựa chọn thực hiện lệnh khi xayư ra bằng nhau giữa 2 đối tượng so sánh 
là giá trị của Timer1 với giá trị lưu trong thanh ghi để so sánh. Bao gồm: 
- Thực hiện ngắt và thiết lập mức 0 
- Thực hiện ngắt và thiết lập mức 1 
- Thực hiện ngắt nhưng không thay đổi trạng thái của chân PIC. 
- Đưa Timer1 về 0 nhưng không thay đổi trạng thái chân. 
 PWM - Điều chế độ rộng xung 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
- Lựa chọn về tần số xung ra và duty cycle. Ta có thể lựa chọn sẵn hay tự chọn tần 
số, tất nhiên tần số ra phải nằm trong một khoảng nhất định. 
 Comparator - So sánh điện áp 
- Lựa chọn mức điện áp so sánh Vref. Có rất nhiều mức điện áp để ta lựa chọn. 
Ngoài ra ta còn có thể lựa chọn cho đầu vào của các bộ so sánh. 
Hình 4.8. Tab Other 
4.1.3.7. Tab Interrupts và Tab Driver 
Tab Interrupts cho phép ta lựa chọn nguồn ngắt mà ta muốn sử dụng. Tùy vào từng 
loại PIC mà số lượng nguồn ngắt khác nhau, bao gồm: ngắt ngoài 0(INT0), ngắt 
RS232, ngắt Timer, ngắt I2C-SPI, ngắt onchange PORTB.v.v… 
Tab Drivers được dùng để lựa chọn những ngoại vi mà trình dịch đã hỗ trợ các hàm 
giao tiếp. Đây là những ngoại vi mà ta sẽ kết nối với PIC, trong các IC mà CCS hỗ trợ, 
đáng chú ý là các loại EEPROM như 2404, 2416, 2432, 9346, 9356…Ngoài ra còn có 
IC RAM PCF8570, IC thời gian thực DS1302, Keypad 3x4, LCD, ADC… Chi tiết ta 
có thể xem trong thư mục Driver của chương trình: \...\PICC\Drivers. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 4.9. Tab Interrupts 
Sau các bước chọn trên, ta nhấn OK để kết thúc quá trình tạo một Project trong 
CCS, một Files ten_project.c được tạo ra, chứa những khai báo 
cần thiết cho PIC trong một Files ten_project. h. 
4.2. Lƣu đồ thuật toán và chƣơng trình 
4.2.1. Mô hình điều khiển của hệ thống điều khiển và giám sát từ xa 
Để cho việc xem xét lưu đồ thuật toán được sáng sủa và giúp cho việc lập trình dễ 
dàng hơn, mô hình điều khiển và giám sát sẽ được đưa ra. Trong mô hình, bộ điều 
khiển và giám sát được đặt trong một mạng LAN (và coi như một phần tử trong mạng), 
trong mạng gồm 1 SWITCH, 1 DHCP Server và bao gồm nhiều máy trạm (các máy 
PC) có cài chương trình duyệt WEB, các phần mềm duyệt web phổ biến là IE (Internet 
Explorer), FireFox, .. 
Bộ điều khiển và giám sát từ xa sẽ đọc nhiệt độ từ sensor nhiệt độ LM335, đọc 
trạng thái các phím bấm, điều khiển các đèn LED (tương đương với các cơ cấu chấp 
hành), hiển thị thông điệp ngắn lên màn hình LCD. Bộ điều khiển này đóng vai trò như 
một Mini Web Server, tất cả các máy trong mạng có yêu cầu Web đến địa chỉ IP của 
bộ điều khiển đều được trả về dưới dạng 1 trang WEB. Như vậy, tất cả các máy trong 
mạng, dù bất kỳ ở đâu cũng đều nhận được thông tin và điều khiển được nhờ một trình 
duyệt web sẵn có. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 4.10. Mô hình hệ thống điều khiển và giám sát từ xa thông qua mạng LAN 
4.2.2. Lƣu đồ thuật toán 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
Hình 4.11. Lưu đồ thuật toán của hệ thống 
4.2.3. Chƣơng trình cho vi xử lý 
- Chương trình được viết bởi phần mềm biên dịch CCS. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
- Một số thư viện, hàm phục vụ cho việc lập trình được lấy từ trang WEB chính 
thức của hãng sản xuất phần cứng MicroChip và hãng CCS. 
- Chương trình có sử dụng 1 số mã nguồn lấy từ Internet 
- Chương trình đã được lược bỏ phần cấu hình vi mạch PIC, các hàm, thủ tục để 
việc theo dõi được dễ hiểu. Để xem toàn bộ chương trình, xin hãy tham khảo bản soft 
copy trên đĩa CD kèm theo. 
- Chương trình sau khi biên dịch được nạp vào vi xử lý bằng thiết bị nạp IC hoặc có 
thể nạp qua cổng RS-232 nếu đã được cài BootLoader. 
#include "tcpip/stacktsk.c" //include Microchip's TCP/IP stack 
#include "ccshelper.c" //include CCS's PICDEM.net/PICNET helper 
functions 
#include "ccshelperui.c" 
/////***** WEB PAGES STORED INTO PROGRAM MEMORY *****///// 
//The following escape characters are used: 
// %0 - AN0 
// %1 - AN1 
// %2 - BUTTON0 
// %3 - BUTTON1 
// %4 - Current LCD Message 
// %5 - CHECKED if LED1 is ON 
// %6 - CHECKED if LED1 is OFF 
// %7 - CHECKED if LED2 is ON 
// %8 - CHECKED if LED2 is OFF 
// %9 - Temperature (EWL ONLY) 
// %F - Message stack 
//here is this examples / page 
const char HTML_INDEX_PAGE[]= 
" 
CCS HTTP/CGI EXAMPLE 
leethanhnc_nhim 
%F 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
LCD:<input type=\"text\" name=\"lcd\" 
size=20 maxlength=16 value=\"%4\"> 
LED1:<input type=\"radio\" name=\"led1\" value=1 
%5>ON 
<input type=\"radio\" name=\"led1\" value=0 
%6>OFF 
LED2:<input type=\"radio\" name=\"led2\" value=1 
%7>ON 
<input type=\"radio\" name=\"led2\" value=0 
%8>OFF 
<input type=\"hidden\" name=\"msgStack\" value=\"LCD/LEDs 
changed!\"> 
Analog Readings 
"; 
// 
const char HTML_ANALOG_PAGE[]= 
" 
leethanhnc_nhim 
PICNET ADC READINGS 
%0 
%1 
%2 
%3 
%9 
Change LCD/LEDs 
"; 
/////***** END OF WEB PAGES STORED INTO PROGRAM MEMORY *****///// 
char g_HTTPMessageStack[20]=""; 
char g_HTTPLCDMessage[20]="CCS Webserver"; 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
//this is a callback function to the HTTP stack. see http.c 
//this demo provides to web "pages", an index (/) and an about 
page (/about) 
int32 http_get_page(char *file_str) 
{ 
int32 file_loc=0; 
static char index[]="/"; 
static char about[]="/analog"; 
if (stricmp(file_str,index)==0) 
file_loc=label_address(HTML_INDEX_PAGE); 
else if (stricmp(file_str,about)==0) 
file_loc=label_address(HTML_ANALOG_PAGE); 
return(file_loc); 
} 
//this isn't a required callback, this is an application function 
being 
//used by http_format_char. 
int http_format_char_checked(int8 flag, char *str) 
{ 
int len=0; 
if (flag) 
{ 
sprintf(str,"checked=\"checked\""); 
len = 7; 
} 
return(len); 
} 
//this is a callback function to the HTTP stack. see http.c 
//The following escape characters are used: 
// %0 - AN0 
// %1 - AN1 
// %2 - BUTTON0 
// %3 - BUTTON1 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
// %4 - Current LCD Message 
// %5 - CHECKED if LED1 is ON 
// %6 - CHECKED if LED1 is OFF 
// %7 - CHECKED if LED2 is ON 
// %8 - CHECKED if LED2 is OFF 
// %F - Message stack 
int8 http_format_char(int32 file, char id, char *str, int8 
max_ret) { 
char new_str[25]; 
int8 len=0; 
int8 i; 
switch(id) { 
#if defined(ADC_CHAN_0) 
case '0': 
set_adc_channel(ADC_CHAN_0); 
delay_us(100); 
i=read_adc(); 
sprintf(new_str,"AN%U = 0x%X",ADC_CHAN_0,i); 
len=strlen(new_str); 
break; 
#endif 
#if defined(ADC_CHAN_1) 
case '1': 
set_adc_channel(ADC_CHAN_1); 
delay_us(100); 
i=read_adc(); 
sprintf(new_str,"AN%U = 0x%X",ADC_CHAN_1,i); 
len=strlen(new_str); 
break; 
#endif 
#if defined(USER_BUTTON1) 
case '2': 
sprintf(new_str,"BTN1 = "); 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
if (!BUTTON_PRESSED(USER_BUTTON1)) 
sprintf(&new_str[14], "UP"); 
else 
sprintf(&new_str[14], "DOWN"); 
len=strlen(new_str); 
break; 
#endif 
#if defined(USER_BUTTON2) 
case '3': 
sprintf(new_str,"BTN2 = "); 
if (!BUTTON_PRESSED(USER_BUTTON2)) 
sprintf(&new_str[14], "UP"); 
else 
sprintf(&new_str[14], "DOWN"); 
len=strlen(new_str); 
break; 
#endif 
case '4': 
strncpy(new_str, g_HTTPLCDMessage, sizeof(new_str)); 
new_str[sizeof(new_str)-1] = 0; 
len = strlen(new_str); 
break; 
case '5': 
len = http_format_char_checked(g_LEDState[0], new_str); 
break; 
case '6': 
len = http_format_char_checked(!g_LEDState[0], new_str); 
break; 
case '7': 
len = http_format_char_checked(g_LEDState[1], new_str); 
break; 
case '8': 
len = http_format_char_checked(!g_LEDState[1], new_str); 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
break; 
#if STACK_USE_TEMP 
case '9': 
sprintf(new_str, "Temp: %6.2wº F", read_full_temp()); 
len=strlen(new_str); 
new_str[len]=0; 
break; 
#endif 
case 'F': 
strncpy(new_str, g_HTTPMessageStack, sizeof(new_str)); 
new_str[sizeof(new_str)-1] = 0; 
len = strlen(new_str); 
g_HTTPMessageStack[0] = 0; 
break; 
} 
if (len){ 
strncpy(str, new_str, max_ret); 
}else 
*str=0; 
return(len); 
} 
//this is a callback function to the HTTP stack. see http.c 
//in this example it verifies that "pwd" is "master", if it is 
//then it sets led1 and led2 ("led1" and "led2") based on their 
value 
//and changes the lcd screen ("lcd"). 
void http_exec_cgi(int32 file, char *key, char *val) { 
static char led1_key[]="led1"; 
static char led2_key[]="led2"; 
static char lcd_key[]="lcd"; 
static char msgStack_key[]="msgStack"; 
int8 v; 
// #if defined(USER_LED1) 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
if (stricmp(key,led1_key)==0) { 
v=atoi(val); 
g_LEDState[0]=v; 
} 
// #endif 
// #if defined(USER_LED2) 
if (stricmp(key,led2_key)==0) { 
v=atoi(val); 
g_LEDState[1]=v; 
} 
// #endif 
if (stricmp(key, msgStack_key)==0) 
{ 
strncpy(g_HTTPMessageStack, val, 
sizeof(g_HTTPMessageStack)); 
g_HTTPMessageStack[sizeof(g_HTTPMessageStack)-1] = 0; 
} 
if (stricmp(key,lcd_key)==0) { 
strncpy(g_HTTPLCDMessage, val, sizeof(g_HTTPLCDMessage)); 
g_HTTPLCDMessage[sizeof(g_HTTPLCDMessage)-1] = 0; 
#if STACK_USE_PICDEM_LCD 
printf(lcd_putc,"\f%s",val); 
#endif 
} 
} 
void splash(void) { 
#IF STACK_USE_PICDEM_LCD 
printf(lcd_putc,"\fCCS Webserver"); 
#ENDIF 
#if STACK_USE_ANNOUNCE 
InitAnnounce(" - EX_ST_WEBSERVER"); 
#endif 
#if STACK_USE_SERIAL 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
fprintf(USER,"\r\n\r\nCCS ex_st_webserver\r\n"); 
ui_settings(); 
ui_menu(); 
#endif 
} 
void main(void) 
{ 
fprintf(USER,"Init..."); 
init(); // ccshelpers.c 
printf(lcd_putc,"\nAll Init OK "); 
fprintf(USER,"\nInit OK"); 
delay_ms(1000); 
splash(); 
while (TRUE) { 
restart_wdt(); 
#if STACK_USE_SERIAL 
if (kbhit(USER)) { 
ui_handle(); 
} 
#endif 
//every second: refresh current IP, blink LED 
if (second_counter>=1) { 
display_ip_lcd(); 
#if defined(USER_LED3) 
output_toggle(USER_LED3); 
#endif 
second_counter=0; 
} 
//just something to test the buttons 
#if STACK_USE_CCS_PICNET 
if (BUTTON_PRESSED(USER_BUTTON1)) 
{ 
output_low(USER_LED1); 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
} 
else 
{ 
if (g_LEDState[0]) 
output_low(USER_LED1); 
else 
{ 
output_high(USER_LED1); 
} 
} 
if (BUTTON_PRESSED(USER_BUTTON2)) 
{ 
output_low(USER_LED2); 
} 
else 
{ 
if (g_LEDState[1]) 
output_low(USER_LED2); 
else 
{ 
output_high(USER_LED2); 
} 
} 
#elif STACK_USE_CCS_PICENS 
if (g_LEDState[0]) 
output_high(USER_LED1); 
else 
{ 
output_low(USER_LED1); 
} 
if (g_LEDState[1]) 
output_high(USER_LED2); 
else 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
{ 
output_low(USER_LED2); 
} 
if (BUTTON_PRESSED(USER_BUTTON1)) output_low(USER_LED3); 
#endif 
#if STACK_USE_PPP 
if (ppp_is_connected()) { 
#endif 
StackTask(); //Microchip's TCP/IP stack handler. 
Must be called routinely. 
#if STACK_USE_PPP 
} 
#endif 
} 
} 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
KẾT LUẬN VÀ KIẾN NGHỊ 
1.Kết luận. 
 Kết quả đạt được sau quá trình nghiên cứu và thiết kế: 
- Người thiết kế tìm hiểu sâu thêm về các lĩnh vực như kỹ thuật điện tử, kỹ thuật 
máy tính, và đặc biệt là kỹ thuật vi xử lý, kỹ thuật mạng và kỹ thuật lập trình. 
- Đề tài là nền móng cho sự phát triển các ứng dụng trong mạng LAN, trên môi 
trường Internet. 
- Có thể ứng dụng cho nhiều mục đích khác như thiết bị cảnh báo, giám sát trong 
mạng nội bộ, mạng internet, .. 
2. Kiến nghị. 
Các kiến nghị và hướng phát triển: 
- Đây là một đề tài liên quan đến nhiều lĩnh vực khác nhau, đòi hỏi người thiết kế 
phải có nhiều kinh nghiệm và thời gian, do đó rất mong rằng với các đề tài tương tự 
hoặc có quy mô lớn hơn, nhà trường sẽ bố trí một nhóm học viên cùng thực hiện 
chung để kết quả được tốt hơn. 
- Sau khi nhìn nhận lại, với mô hình đề tài này khi đưa vào sử dụng trong thực tế 
mạng Internet, sẽ gặp phải những khó khăn trong việc xây hệ thống bảo mật, chống 
phá hoại và thâm nhập trái phép, vì hệ thống này khá đắt tiền và đòi hỏi phần 
software tại server khá phức tạp. 
- Hướng phát triển của đề tài đã được tính đến và thể hiện thông qua hình vẽ của hệ 
thống tương lai chạy trong môi trường Internet. Để có được sản phẩm dùng thực tế, 
mức đầu tư tối thiểu khoảng 5,000 USD cùng với sự làm việc nhiệt tình của nhóm 4 
người. 
Số hóa bởi Trung tâm Học liệu – Đại học Thái Nguyên  
PHỤ LỤC 
            Các file đính kèm theo tài liệu này:
23LV09_CN_TudonghoaLeThiPhuongThanh.pdf