You are on page 1of 79

1

MỤC LỤC

LỜI MỞ ĐẦU ............................................................................................................ 3


CHƯƠNG I : GIỚI THIỆU MODULE SIM900, TẬP LỆNH ATCOMMAND
1.1 Tổng quan về tin SMS ................................................................................... 5
1.2 Giới thiệu Module SIM900 ........................................................................... 5
1.2.1 Tổng quan về Module SIM900 ................................................................5
1.2.2 Đặc điểm của Module SIM900 ................................................................6
1.2.3 Khảo sát sơ đồ chân và chức năng từng chân của SIM900 ...................8
1.3 Khảo sát tập lệnh AT Command của Module SIM900 ............................ 10
1.3.1 Khởi tạo cấu hình mặc định cho module ..............................................12
1.3.2 Delete tin nhắn trong SIM .....................................................................14
1.3.3 Thực hiện cuộc gọi .................................................................................15
1.3.4 Nhận cuộc gọi đến. .................................................................................16
1.3.5 Đọc tin nhắn. ..........................................................................................18
1.3.6 Gửi tin nhắn. ..........................................................................................19
1.3.7 Các lệnh khác : .......................................................................................21
CHƯƠNG II : KHẢO SÁT VI ĐIỀU KHIỂN PIC16F887A
2.1 Giới thiệu về vi điều khiển PIC 16F877A ................................................... 22
2.1.1 Tổng quan về họ Vi điều khiển PIC ......................................................22
2.1.2 Một số đặc tính của Vi điều khiển PIC .................................................23
2.1.3 Những đặc tính ngoại vi ........................................................................24
2.1.4 Đặc điểm về tương tự ............................................................................24
2.1.5 Các đặc điểm đặc biệt ............................................................................24
2.1.6 Công nghệ CMOS ..................................................................................25
2.2 Giới thiệu về PIC16F8XX và PIC16F877A : ............................................ 25
2.3 Cấu trúc, chức năng PIC16F887A loại 40 chân PDIP ............................. 27
2.3.1 Sơ đồ chân, chức năng các chân ...........................................................27
2.3.2 Cấu trúc bên trong của PIC16F877A ...................................................31
2.3.3 Các cổng xuất nhập ................................................................................33
2

2.3.4 Khối chức năng ngoại vi ........................................................................36


2.3.5 Tổ chức bộ nhớ .......................................................................................36
2.3.6 Thanh ghi chức năng đặc biệt SFR: .....................................................37
2.3.7 Chế độ Reset ...........................................................................................39
2.3.8 Chế độ Sleep ...........................................................................................39
2.3.9 “Đánh thức” vi điều khiển ......................................................................39
2.3.10 Ngắt (interput) .......................................................................................40
2.4 Bộ chuyển đổi ADC trong PIC16F887A .................................................... 41
CHƯƠNG III : GIAO TIẾP GIỮA VI ĐIỀU KHIỂN – SIM900, KHỐI
NGUỒN, NGUYÊN LÝ HOẠT ĐỘNG
3.1 Giao tiếp giữa PIC16F887A và module SIM900....................................... 45
3.1.1 Tìm hiểu giao tiếp nối tiếp UART ..........................................................45
3.2 Giao tiếp giữa PIC16F887A với khối relay ........................................... 46
3.3 Khối nguồn ................................................................................................... 48
3.4 Nguyên lý hoạt động .................................................................................... 48

CHƯƠNG IV : THIẾT KẾ - THI CÔNG HỆ THỐNG


4.1 Dụng cụ và vật liệu ...................................................................................... 51
4.2 Thiết kế và thi công mô hình ...................................................................... 52
CHƯƠNG V : TỔNG KẾT ĐÁNH GIÁ VÀ HƯỚNG PHÁT TRIỂN ĐỀ TÀI
5.1 Kết quả và đánh giá đồ án .......................................................................... 57
5.2 Hướng phát triển đề tài ............................................................................... 58
5.3 Tài liệu tham khảo ........................................................................................ 58
CHƯƠNG VI : PHẦN MỀM HỆ THỐNG
3

LỜI MỞ ĐẦU

Từ những yêu cầu thực tế, xu hướng đòi hỏi ngày càng cao của cuộc sống cùng
với sự phát triển mạnh mẽ của nhiều thiết bị thông minh di động nên em đã chọn đề
tài đồ án tốt nghiệp : " ĐIỀU KHIỂN THIẾT BỊ GIA ĐÌNH BẰNG SMS " được thể
hiện thông qua “ MÔ HÌNH NHÀ THÔNG MINH ”.

 Nội dung đồ án :

Đồ án thiết lập một hệ thống điều khiển thiết bị trong nhà từ xa thông qua tin
nhắn SMS gồm có các thiết bị đơn giản như bóng đèn, quạt máy, lò sưởi đến các thiết
bị tinh vi, phức tạp như tivi, máy giặt, điều hòa, hệ thống báo động … Nó hoạt động
như một ngôi nhà thông minh. Nghĩa là tất cả các thiết bị này có thể giao tiếp với
nhau về mặt dữ liệu thông qua một đầu não trung tâm. Đầu não trung tâm ở đây là
một bộ điều khiển dùng PIC 16F887A đã được lập trình sẵn tất cả các chương trình
điều khiển. Bình thường, các thiết bị trong ngồi nhà có thể được điều khiển từ xa
thông qua các tin nhắn của gia chủ. Chẳng hạn như việc tắt quạt, đèn điện … khi gia
chủ quên chưa tắt trước khi ra khỏi nhà. Hay chỉ với một tin nhắn SMS, gia chủ có
thể bật máy điều hòa để làm mát phòng trước khi về nhà trong một khoảng thời gian
nhất định. Bên cạnh đó thiết bị cũng gửi thông báo cho người điều khiển biết khi có
người lạ đột nhập vào nhà thông qua hệ thống báo động dùng hồng ngoại, khi nhiệt
độ tăng cao có nguy cơ cháy hay gửi thông báo cảnh báo sự rò rỉ khí gas trong gia
đình. Ngoài ra, hệ thống còn mang tính bảo mật. Nghĩa là chỉ có gia chủ hay các thành
viên trong gia đình, người biết mật khẩu của ngôi nhà thì mới điều khiển được ngôi
nhà.

 Mục đích và phương pháp nghiên cứu/thực hiện đồ án :

Đồ án được nghiên cứu, khảo sát và thực hiện với mục đích áp dụng những
kiến thức đã được học trong nhà trường để thiết kế, tạo ra một hệ thống quản lý, hệ
thống cảnh báo trong nhà một cách hoàn chỉnh. Hệ thống tích hợp module điều khiển
giám sát trung tâm, module công suất cho các thiết bị trong nhà và và module báo
4

động (cảnh báo) cùng các module tiện ích khác. Với module báo động sử dụng cảm
biến hồng ngoại sẽ gửi thông tin dữ liệu về bộ xử lí trung tâm khi có tác động của đối
tượng bên ngoài (người lạ đột nhập). Module cảm biến khí gas/cảm biến nhiệt độ sẽ
gởi thông tin dữ liệu về bộ xử lý trung tâm khi có khí gas bị rò rỉ/nhiệt độ trong nhà
tăng quá giới hạn quy định. Qua xử lý, dữ liệu sẽ được gửi về thiết bị đầu cuối
(mobile) của người điều khiển để báo cho biết có tác động của đối tượng bên ngoài
(người lạ đột nhập), hay khí gas đang rò rỉ để có phương án giải quyết.

Trong đề tài này em đã sử dụng các phương pháp nghiên cứu :

 Phương pháp tham khảo tài liệu : phần lớn các tài liệu được tham khảo trên
mạng qua các diễn đàn điện tử, trang web cung cấp tài liệu học tập.
 Phương pháp quan sát : khảo sát một số mạch thực tế đang có trên thị trường,
các mô hình tốt nghiệp của anh chị các khóa trước và tham khảo thêm một số
dạng mạch từ mạng Internet.
 Phương pháp thực nghiệm: từ những ý tưởng và kiến thức vốn có của mình
kết hợp với sự hướng dẫn của giáo viên, em đã lắp ráp thử nghiệm nhiều dạng
mạch khác nhau để từ đó chọn lọc những mạch điện tối ưu. Thiết kế mạch điện
sử dụng các linh kiện thực tế. Thử nghiệm và tối ưu sản phẩm trực quan các
phần không mô phỏng được.

 Kết quả đạt được :

Đồ án đã đạt được những kết quả cụ thể sau :

 Tìm hiểu về tập lệnh AT của Module sim 900.


 Thực hiện kết nối giữa Module SIM900 với vi điều khiển 16F887A.
 Hoàn thành mục tiêu đặt ra là điều khiển được các thiết bị điện trong nhà bằng
SMS và hoàn thiện hệ thống cảnh báo.
5

CHƯƠNG I : GIỚI THIỆU MODULE SIM900, TẬP


LỆNH ATCOMMAND

1.1 Tổng quan về tin SMS

SMS là từ viết tắt của Short Message Service. Đó là một công nghệ cho phép
gửi và nhận các tín nhắn giữa các điện thoại với nhau. Dữ liệu có thể được lưu giữ
bởi một tin nhắn SMS là rất giới hạn. Một tin nhắn SMS có thể chứa tối đa là 140
byte (1120 bit) dữ liệu. Vì vậy, một tin nhắn SMS chỉ có thể chứa :

 160 kí tự nếu như mã hóa kí tự 7 bit được sử dụng.


 70 kí tự nếu như mã hóa kí tự 16 bit Unicode UCS2 được sử dụng.

Tin nhắn SMS dạng text hỗ trợ nhiều ngôn ngữ khác nhau. Nó có thể hoạt động
tốt với nhiều ngôn ngữ mà có hỗ trợ mã Unicode, bao gồm cả Arabic, Trung Quốc,
Nhật bản và Hàn Quốc.

1.2 Giới thiệu Module SIM900


1.2.1 Tổng quan về Module SIM900

Một modem GSM là một modem wireless, nó làm việc cùng với một mạng
wireless GSM. Một modem wireless thì cũng hoạt động giông như một modem quay
số. Điểm khác nhau chính ở đây là modem quay số thì truyền và nhận dữ liệu thông
qua một đường dây điện thoại cố định trong khi đó một modem wireless thì việc gửi
nhận dữ liệu thông qua sóng.

Giống như một điện thoại di động GSM , một modem GSM yêu cầu 1 thẻ sim
với một mạng wireless để hoạt động.

Module SIM 900 là một trong những loại modem GSM. Nhưng Module SIM
900 được nâng cao hơn có tốc độ truyền dữ liệu nhanh hơn. Nó sử dụng công nghệ
GSM/GPRS hoạt động ở băng tầng GSM 850Mhz, EGSM 900Mhz, DCS 1800 Mhz
và PCS 1900Mhz, có tính năng GPRS của Sim 900.
6

Hình 1.2.1 Module SIM900

1.2.2 Đặc điểm của module SIM900


+ Nguồn cung cấp khoảng 3,4 – 4,5V
+ Nguồn lưu trữ
+ Băng tần: GSM 850Mhz EGSM 900Mhz, DCS 1800 Mhz và PCS
1900Mhz SIM900 có thể tự động tìm kiếm các băng tần.
+ Phù hợp với GSM Pha 2/2+
 Loại GSM là loại MS nhỏ
 Kết nối GPRS
 8 lớp điện dung
 10 lớp điện dung
+ Giới hạn nhiêt độ :
 Bình thường -300C tới +800C
 Hạn chế : - 400C tới -300C và +800C tới +850C
 Nhiệt độ bảo quản: -450C tới 900C
+ Dữ liệu GPRS :
 GPRS dữ liệu tải xuống: Max 85.6 kbps
 GPRS dữ liệu úp lên: Max 42.8 kbps
7

 Sơ đồ mã hóa: CS-1, CS-2, CS-3 và CS-4


 Sim 900 hổ trợ giao thức PAP, kiểu sử dụng kết nối PPP
 Sim 900 tích hợp giao thức TCP/IP
 Chấp nhận thông tin được điều chỉnh rộng rãi
+ SMS :
 MT, MO, CB, Text and PDU mode
 Bộ nhớ SMS: Sim card
+ Sim card :
 Hỗ trợ sim card: 1,8v ; 3v
+ Anten ngoài :
 Kết nối thông qua anten ngoài 500km hoặc đế anten
+ Âm thanh :
 Dạng mã hòa âm thanh.
 Mức chế độ (ETS 06.20)
 Toàn bộ chế độ (ETS 06.10)
 Toàn bộ chế độ tăng cường (ETS 06.50/ 06.06/ 06.80)
 Loại bỏ tiếng dội
+ Giao tiếp nối tiếp và sự ghép nối :
 Cổng nối tiếp : 8 Cổng nối tiếp (ghép nối)
 Cổng kết nối có thể Sd với CSD Fax, GPRS và gửi lệnh
ATCommand tới module điều khiển
 Cổng nối tiếp có thể Sd chức năng giao tiếp
 Hỗ trợ tốc độ truyền 1200 BPS tới 115200 BPS
 Cổng hiệu chỉnh lỗi: 2 cổng nối tiếp TXD và RXD
 Cổng hiệu chỉnh lỗi chỉ sử dụng sữa lỗi
+ Quản lý danh sách :
 Hỗ trợ mẫu danh sách: SM, FD, LD, RC,ON, MC
+ Đồng hồ thời gian thực :
8

 Người cài đặt


+ Times function :
 Lập trình thông qua AT Command
+ Đặc tính vật lý (đặc điểm) :
 Kích thước 24mmx24mmx24mm> Nặng 3.4g

1.2.3 Khảo sát sơ đồ chân và chức năng từng chân của SIM900

Hình 1.2.2 Sơ đồ chân SIM900

Trong đồ án đã sử dụng Breakout SIM 900 tức là SIM 900 đã được thế kế kết
nối phù hợp thành module để tiện phục vụ cho nội dung cần thiết trong đồ án.
9

Hình 1.2.3 Sơ đồ thiết kế Breakout của Module SIM900


10

Sơ đồ chân Breakout:

Hình 1.2.4 Sơ đồ chân Breakout SIM900

 Chân 1: Chân ON/OFF ta cần kích 1 xung có mức tích cực dương vào
khoảng 1s, lúc này đèn status sẽ sáng, sau đó chớp nháy với tần suất nhanh
báo hiệu SIM900 đang khởi động và tìm mạng. Sau 10s sau Led Status
nhấp nháy chậm báo hiệu SIM900 đã hoạt động bình thường.
 Chân 2 : Request to send.
 Chân 3 : đầu ra dùng để chỉ báo mạng kết nối được hệ thống.
 Chân 4 : Clear to send.
 Chân 5 : đầu vào pin dự phòng cho module.
 Chân 6 : Data carrier detection.
 Chân 7 : Chân vào của bộ chuyển đổi tín hiệu tương tự sang số
 Chân 8 : Ring chân ra loa báo hiệu có cuộc gọi đến.
 Chân 9, 11 : chân loa nghe cuộc thoại
 Chân 13,15 : chân MIC.
 Chân 10 : chân đầu cuối dữ liệu.
 Chân 12 : chân truyền dữ liệu.
 Chân 14 : chân nhận dữ liệu.
 Chân 16 : chân RESET SIM900.
 Chân 17,19 : chân nguồn cấp cho sim hoạt động.
 Chân 18,20 : chân mass.
1.3 Khảo sát tập lệnh AT Command của Module SIM900

Các lệnh AT là các hướng dẫn được sử dụng để điều khiển một modem.
AT là một cách viết gọn của chữ Attention. Mỗi dòng lệnh của nó bắt đầu với
11

“AT” hay “at”. Đó là lý do tại sao các lệnh modem được gọi là các lệnh AT.
Nhiều lệnh của nó được sử dụng để điều khiển các modem quay số sử dụng dây
mối (wired dial-up modems), chẳng hạn như ATD (Dial), ATA (Answer),
ATH (Hool control) và ATO (return to online data state), cũng được hỗ trợ bởi
các modem GSM/GPRS và các điện thoại di động.

Bên cạnh bộ lệnh AT thông dụng này, các modem GSM/GPRS và các
điện thoại di động còn được hỗ trợ bởi một bộ lệnh AT đặc biệt đối với công
nghệ GSM. Nó bao gồm các lệnh liên quan tới SMS như AT+ CMGS (gửi tin
nhắn SMS), AT+CMSS (gửi tin nhắn SMS từ một vùng lưu trữ), AT+CMGL
(chuỗi liệt kê các tin nhắn SMS) và AT+CMGR (đọc tin nhắn SMS). Ngoài ra,
các modem GSM còn hỗ trợ một bộ lệnh AT mở rộng. Những lệnh AT mở rộng
này được định nghĩa trong các chuẩn của GSM. Với các lệnh AT mở rộng này
có thể làm một số thứ như sau :

 Đọc,viết, xóa tin nhắn.


 Gửi tin nhắn SMS.
 Kiểm tra chiều dài tín hiệu.
 Đọc, viết và tìm kiếm về các mục danh bạ.

Số tin nhắn SMS có thể được thực thi bởi một modem SMS trên một phút
thì rất thấp, nó chỉ khoảng từ 6 đến 10 tin nhắn SMS trên 1 phút.

Trong khuôn khổ của đồ án em chỉ tìm hiểu 1 số tập lệnh cơ bản phục vụ
cho công việc của mình. Sau đây em xin giới thiệu 1 số tập lệnh cơ bản để thao
tác dùng cho dịch vụ SMS, bao gồm :

 Khởi tạo.
 Nhận cuộc gọi.
 Thiết lập cuộc gọi.
12

 Nhận tin nhắn.


 Gửi tin nhắn.

Các thuật ngữ em dùng :

 <CR> : carriage return (0x0D).


 <LF> : Line Feed (0x0A).
 MT : Mobile Terminal :Thiết bị đầu cuối mạng (chính là
module).
 TE : Terminal Equipment: Thiết bị đầu cuối (chính là vi
điều khiển).
1.3.1 Khởi tạo cấu hình mặc định cho modem

Hình 1.3.1 Cấu hình mặc định cho SIM900

(1) ATZ<CR> reset modem, kiểm tra modem đã hoạt động bình thường chưa.
Gửi nhiều lần cho chắc ăn, cho đến khi nhận được chuỗi :
ATZ<CR><CR><LF>OK<C><LF>
13

(2) ATE0<CR> tắt chế độ TE cho lệnh. Chuỗi trả về có dạng :

ATE0<CR><CR><LF>OK<CR><LF>

(3) AT+CLIP=1<CR> định dạng chuỗi trả về khi nhân cuộc gọi. Thông
thường, ở chế độ mặc định, khi có cuộc gọi đến, chuỗi trả về sẽ có dạng :

<CR><LF>RING<CR><LF>

Sau khi lệnh AT+CLIP=1<CR> đã được thực thi, chuỗi trả về sẽ có dạng :

<CR><LF>RING<CR><LF>

<CR><LF>+CLIP:”0922050808”,129,””,,””,0,<CR><LF>

Chuỗi trả về có chứa thông tin về số điện thoại gọi đến. Thông tin này cho phép
xác định việc có nên nhận cuộc gọi hay từ chối cuộc gọi.

Kết thúc các thao tác khởi tạo cho quá trình nhận cuộc gọi đến. Các bước khởi
tạo tiếp theo liên quan đến các thao tác truyền nhận tin nhắn.

(4) AT&W<CR> Lưu cấu hình cài đặt được thiết bị bởi các tập lệnh AET0 và
AT+CLIP vào bộ nhớ.

(5) AT+CMGF=1<CR> Thiết lập quá trình truyền nhận tin nhắn được thực
hiện ở chế độ text (mặc định là ở chế độ PDU) Chuỗi trả về sẽ có dạng :

<CR><LF>OK<CR><LF>

(6) AT+CNMI=2,0,0,0,0<CR> Thiết lập chế độ thông báo cho TE khi MT


nhận được tin nhắn mới.

Chuỗi trả về sẽ có dạng : <CR><LF>OK<CR><LF> Sau khi lệnh trên được


thiết lập, tin nhắn mới nhận được sẽ được lưu trong SIM, và MT không truyền tở về
TE bất cứ thông báo nào. TE sẽ đọc tin nhắn được lưu trong sim trong trường hợp
cần thiết.

(7) AT+CSAS<CR>
14

(8) Lưu cấu hình cài đặt được thiết lập bởi các lệnh AT+CMGF và
AT+CNMI.

1.3.2 Delete tin nhắn trong SIM.

(1) AT+CMGD=1

Xóa tin nhắn ở vùng nhớ 1 trong SIM.

Chuỗi trả về sẽ có dạng: <CR><LF>OK<CR><LF>

(2) AT+CMGD=2

Lệnh này được dùng để xóa tin nhắn được lưu trong ngăn số 2.

Hình 1.3.2 Cấu hình xóa tin nhắn SIM900

Có thể hình dung bộ nhớ lưu tin nhắn trong SIM bao gồm nhiều. Mỗi ngăn
được đại diện bằng một số thứ tự. Khi nhận được tin nhắn mới, nội dung tin nhắn sẽ
được lưu trong một ngăn trống có số thứ tự nhỏ nhất có thể.

Việc xóa nội dung tin nhắn ở hai ngăn 1 và 2 cho phép tin nhắn nhận được
luôn được lưu vào trong hai ô nhớ này, giúp dễ dàng xác định vị trí lưu tin nhắn vừa
nhận được, và giúp cho việc thao tác với tin nhắn mới nhận được trở nên dễ dàng và
đơn giản hơn, giảm khả năng việc tin nhắn mới nhận được bị thất lạc ở vùng nhớ nào
đó mà ta không kiểm soát được.

Ngoài ra, khi bộ nhớ chứa tin nhắn đầy, MT sẽ không được phép nhận thêm
tin nhắn mới nào nữa. Những tin nhắn được gửi đến MT trong trường hợp bộ nhớ
chứa tin nhắn được gửi đến MT trong trường hợp bộ nhớ chứa tin nhắn của MT đã
15

được đầy sẽ được lưu trên tổng đài, và sẽ được gửi đến MT sau khi bộ nhớ chứa tin
nhắn của MT có xuất hiện những ngăn trống dùng để chứa tin nhắn. Việc xóa nội
dung tin nhắn trong các ngăn 1 và 2 sẽ giúp đảm bảo khả năng nhận thêm tin nhắn
mới của MT.

1.3.3 Thực hiện cuộc gọi

Hình 1.3.3 Cấu hình gọi điện cho SIM 900.

(1) ATDxxxxxxxxxx;<CR> Quay số cần gọi.

(2) Chuỗi trả về sẽ có dạng : <CR><LF>OK<CR><LF>

Chuỗi này thông báo lệnh trên đã được nhận và đang được thực thi.
16

Sau đó là những chuỗi thông báo kết quả quá trình kết nối ( nếu như kết nối
không được thực hiện thành công).

(2A) Nếu MT không thực hiện được kết nối do sóng yếu, hoặc không có sóng
( thử bằng cách tháo antenna của modem GSM), chuỗi trả về sẽ có dạng:

<CR><LF>NO DIAL TONE<CR><LF>

(2B) Nếu cuộc gọi bị từ chối bởi người nhận cuộc gọi, hoặc số máy đang gọi
tạm thời không hoạt động ( chẳng hạn như bị tắt máy ) chuỗi trả về có dạng:

<CR><LF>NO CARRIER<CR><LF>

(2C) Nếu cuộc gọi không thể thiết lập được do máy nhận cuộc gọi đang bận
(ví dụ như đang thông thoại với một thuê bao khác), chuỗi trả về sẽ có dạng:
<CR><LF>BUSY<CR><LF>

(4s) Tổng thời gian từ lúc modem nhận lệnh cho đến lúc nhận được chuỗi trên
thông thường là 4 giây.

(2D) Nếu sau 1 phút mà thuê bao nhận cuộc gọi không bắt máy, chuỗi trả về
sẽ có dạng :

<CR><LF>NO ANSWER<CR><LF> (60s)

(3) Trong trường hợp quá trình thiết lập cuộc gọi diễn ra bình thường, không
có chuỗi thông báo nào (2A, 2B, 2C hay 2D) được trả về, và chuyển sang giai đoạn
thông thoại.

Quá trình kết thúc cuộc gọi được diễn ra trong hai trường hợp:

(4A) Đầu nhận cuộc gọi gác máy trước, chuỗi trả về sẽ có dạng :
<CR><LF>NO CARRIER<CR><LF>

(4B) Đầu thiết lập cuộc gọi gác máy trước: phải tiến hành gửi lệnh ATH, và
chuỗi trả về sẽ có dạng : <CR><LF>OK<CR><LF>

1.3.4 Nhận cuộc gọi đến.


17

Hình 1.3.4 Cấu hình nhận cuộc gọi

(1) Sau khi được khởi tạo bằng lệnh AT+CLIP=1, khi có cuộc gọi đến, chuỗi
trả về sẽ có dạng: <CR><LF>RING<CR><LF>

<CR><LF>+CLIP:”0929047589”,129,””,0<CR><LF>

(2A) Nếu số điện thoại gọi đến không hợp lệ, từ chối nhận cuộc gọi bằng lệnh
ATH, và chuỗi trả về sẽ có dạng : <CR><LF>OK<CR><LF> Cuộc gọi kết thúc.

(2B) Nếu số điện thoại gọi đến là hợp lệ, nhận cuộc gọi bằng cách gửi lệnh
ATA, và chuỗi trả về sẽ có dạng : <CR><LF>OK<CR><LF>

(3) Giai đoạn thông thoại.


18

(4A) Kết thúc cuộc gọi. Đầu còn lại gác máy trước.

(4B) Kết thúc cuộc gọi, chủ động gác máy bằng cách gửi lệnh ATH.

1.3.5 Đọc tin nhắn.

Hình 1.3.5 Cấu hình đọc tin nhắn

Mọi thao tác liên quan đến quá trình nhận tin nhắn đều được thực hiện trên hai
ngăn 1 và 2 của bộ nhớ nằm trong SIM.

(1) Đọc tin nhắn trong ngăn 1 bằng lệnh AT+CMGR=1.

(2A) Nếu ngăn 1 không chứa tin nhắn, nội dung tin nhắn sẽ được gửi trả về TE
với định dạng như sau:
19

<CR><LF>+CMGR: ”REC

UNREAD”,”+84929047589”,,”07/05/15,09:32:05+28” <CR><LF>

<CR><LF>NỘI DUNG<CR><LF>

<CR><LF>OK<CR><LF>

Các tham số trong chuỗi trả về bao gồm trạng thái của tin nhắn (REC
UNREAD), số điện thoại gửi tin nhắn (+84929047589) và thời gian gửi tin nhắn
(07/05/15,09:32:05+28) và nội dung tin nhắn.

Đây là dạng mặc định của module SIM900 lúc khởi động, dạng mở rộng có
thể được thiết lập bằng cách sử dụng lệnh AT+CSDH=1 trước khi thực hiện đọc tin
nhắn.

(3) Sau khi đọc, tin nhắn được xóa đi bằng lệnh AT+CMGD=1

Thao tác tương tự đối với tin nhắn chứa trong ngăn thứ 2 trong các bước
4,(5A), (5B) và 6.

1.3.6 Gửi tin nhắn.

(1) Gửi tin nhắn đến thuê bao bằng cách sử dụng lệnh AT+CMGS=”số điện
thoại”.

(2) Nếu lệnh (1) được thực hiện thành công, chuỗi trả về sẽ có dạng:

<CR><LF>> (kí tự “>” và 1 khoảng trắng).

(3) Gửi nội dung tin nhắn và kết thúc bằng kí tự có mã ASCII 0x1A.

(3A) Gửi kí tự ESC ( mã ASCII là 27) nếu không muốn tiếp tục gửi tin nhắn
nữa. Khi đó TE sẽ gửi trả về chuỗi <CR><LF>OK<CR><LF>.

(4) Chuỗi trả về thông báo quá trình gửi tin nhắn. Chuỗi trả về có định dạng
như sau:

<CR><LF>+CMGS :62<CR><LF>
20

<CR><LF>OK<CR><LF>.

Trong đó 62 là một số tham chiếu cho tin nhắn đã được gửi. Sau mỗi tin nhắn
được gửi đi, giá trị của tham chiếu này sẽ tăng lên 1 đơn vị. Số tham chiếu này có giá
trị nằm trong khoảng từ 0 đến 255.

Thời gian gửi một tin nhắn vào khoảng 3-4 giây (kiểm tra với mạng
Mobiphone).

Hình 1.3.6 Cấu hình gửi tin nhắn

(4A) Nếu tình trạng sóng không cho phép thực hiên việc gửi tin nhắn ( thử
bằng cách tháo antenna), hoặc chức năng RF của modem không được cho phép hoạt
động ( do sử dụng các lệnh AT+CFUN=0 hoặc AT+CFUN=4), hoặc số tin nhắn
trong hàng đợi phía tổng đài vượt qua giới hạn cho phép, hoặc bộ nhớ chứa tin nhắn
21

của MT nhận được tin nhắn bị tràn, MT sẽ gửi thông báo lỗi về và có định dạng như
sau:

<CR><LF>+CMS ERROR:193<CR><LF>

<CR><LF>+CMS ERROR:515<CR><LF>

Chức năng truyền nhận tin nhắn và chức năng thoại được tách biệt. Khi đang
thông thoại vẫn có thể truyền nhận được tin nhắn. Khi truyền nhận tin nhắn vẫn có
thể tiến hành thiết lập và kết thúc cuộc gọi.

1.3.7 Các lệnh khác :

Ngoài ra còn có các lệnh khác cho GPRS, các tập lệnh khởi tạo kiểm
tra…chúng ta có thể tra datasheet của SIM 900 để biết nhiều thêm các lệnh nếu cần.
Trong khuôn khổ đồ án em chỉ đưa ra một số tập lệnh cơ bản phục vụ cho công việc
của mình.
22

CHƯƠNG II : KHẢO SÁT VI ĐIỀU KHIỂN PIC16F887A

2.1 Giới thiệu về vi điều khiển PIC 16F877A


2.1.1 Tổng quan về họ Vi điều khiển PIC
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 từ chữ viết tắt của “Programmable
Intelligent Computer” (Máy tính khả trình thông 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,
PIC 1650 được dùng để giao tiếp với các thiết bị ngoại vi cho máy chủ 16 bit CP1600,
vì vậy, người ta cũng gọi PIC vớ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). 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 EPROM để 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. Nhưng chúng ta có thể điểm qua
một vài nét như sau :

 8/16 bit CPU, xây dựng theo kiến truc Harvard có sửa đổi
 Flash và ROM có thể tuỳ chọn từ 256 byte đến 256 Kbyte
 Các cổng Xuất/ Nhập (I/ O ports) (mức logic thường từ 0V đến
5.5V, ứng với logic 0 và logic 1)
 8/16 bit Timer
23

2.1.2 Một số đặc tính của Vi điều khiển PIC


Hiện nay có khá nhiều dòng PIC và có rất nhiều khác biệt về phần cứng. Các
chuẩn giao tiếp nối tiếp đồng bộ/ khung đồng bộ USART.
 Bộ chuyển đổi ADC Analog-to-digital converters, 10/12 bit
 Bộ so sánh điện áp (Voltage Comparator)
 Các module Capture/ Compare/ PWM
 LCD
 MSSP Peripheral dựng cho các giao tiếp I2 C, SPI, I2 S
 Bộ nhớ nội EPROM – có thể ghi/ xoá lớn tới 1 triệu lần
 Module Điều khiển động cơ, đọc encoder
 Hỗ trợ giao tiếp USB
 Hỗ trợ giao tiếp CAN
 Hỗ trợ giao tiếp LIN
 Hỗ trợ giao tiếp IrDA
 Một số dòng có tích hợp bộ RF (PIC16f639, và rfPIC)
 KEELOQ mờ hoá và giải mờ
 DSP những tính năng xử lý tín hiệu số (dsPIC)
- Đặc điểm thực thi tốc độ cao của RISC CPU của họ vi điều khiển
PIC16F87XA :
 Chỉ gồm 35 lệnh đơn.
 Tất cả các lệnh là 1chu kỳ ngoại trừ chương trình con là 2 chu
kỳ.
 Tốc độ hoạt động :
*DC- 20MHz ngõ vào xung clock.

*DC- 200ns chu kỳ lệnh.

 Độ rộng của bộ nhớ chương trình Flash là 8K x 14word, của bộ


nhớ dữ liệu (RAM) là 368 x 8bytes, của bộ nhớ dữ liệu là
EPROM (RAM) là 256 x 8bytes.
24

2.1.3 Những đặc tính ngoại vi


 Timer0 : 8- bit định thời/ đếm với 8- bit prescaler
 Timer1 : 16- bit định thời/ đếm với prescaler, có thể được tăng
lên trong suốt chế độ Sleep qua thạch anh/ xung clock bên ngoài.
 Timer2 : 8- bit định thời/đếm với 8- bit, prescaler và postscaler
 Hai module Capture, Compare, PWM :

* Capture có độ rộng 16 bit, độ phân giải 12.5ns

* Compare có độ rộng 16 bit, độ phân giải 200ns

* Độ phân giải lớn nhất của PWM là 10bit.

 Có 13 ngõ I/O có thể điều khiển trực tiếp


 Dòng vào và dòng ra lớn :

* 25mA dòng vào cho mỗi chân

* 20mA dòng ra cho mỗi chân


2.1.4 Đặc điểm về tương tự
 10 bit, với 8 kênh của bộ chuyển đổi tương tự sang số (A/D).
 Brown – out Reset (BOR).
 Module so sánh về tương tự.

* Hai bộ so sánh tương tự.

* Module điện áp chuẩn VREF có thể lập trình trên PIC.

 Có thể lập trình ngõ ra vào đến từ những ngõ vào của PIC và
trên điện áp bên trong.
 Những ngõ ra của bộ so sánh có thể sử dụng cho bên ngoài.

2.1.5 Các đặc điểm đặc biệt


 Có thể ghi/ xoá 100.000 lần với kiểu bộ nhớ chương trình
Enhanced Flash.
 1.000.000 lần ghi/ xoá với kiểu bộ nhớ EPROM.
25

 EPROM có thể lưu trữ dữ liệu hơn 40 năm.


 Có thể tự lập trình lại dưới sự điều khiển của phần mềm.
 Mạch lập trình nối tiếp qua 2 chân.
 Nguồn đơn 5V cấp cho mạch lập trình nối tiếp.
 Watchdog Timer (WDT) với bộ dao động RC tích hợp sẵn trên
Chip cho hoạt động đáng tin cậy.
 Có thể lập trình mờ bảo vệ.
 Tiết kiệm năng lượng với chế độ Sleep.
 Có thể lựa chọn bộ dao động.
 Mạch dở sai (ICD : In- Circuit Debug) qua 2 chân.
2.1.6 Công nghệ CMOS
 Năng lượng thấp, tốc độ cao Flash/ công nghệ EPROM
 Việc thiết kế hoàn toàn tĩnh
 Khoảng điện áp hoạt động từ 2V đến 5.5V
 Tiêu tốn năng lượng thấp.
2.2 Giới thiệu về PIC16F8XX và PIC16F877A :
PIC16F8X là nhóm PIC trong họ PIC16XX của họ Vi điều khiển 8-bit, tiêu
hao năng lượng thấp, đáp ứng nhanh, chế tạo theo công nghệ CMOS, chống tĩnh điện
tuyệt đối. Nhóm bao gồm các thiết bị sau :
 PIC16F83
 PIC16CR83
 PIC16F84
 PIC16CR84

Tất cả các PIC16/17 đều có cấu trúc RISC. PIC16CXX các đặc tính nổi bậc, 8
mức ngăn xếp Stack, nhiều nguồn ngắt tích hợp bên trong lẫn ngoài. Có cấu trúc
Havard với các bus dữ liệu và bus thực thi chương trình riêng biệt nhau cho phép độ
dài 1 lệnh là 14-bit và bus dữ liệu 8-bit cách biệt nhau. Tất cả các lệnh đều mất 1 chu
kỳ lệnh ngoại trừ các lệnh rẽ nhánh chương trình mất 2 chu kỳ lệnh. Chỉ có 35 lệnh
và 1 lượng lớn các thanh ghi cho phép đáp ứng cao trong ứng dụng.
26

Họ PIC16F8X có nhiều tính năng đặc biệt làm giảm thiểu các thiết bị ngoại vi,
vì vậy kinh tế cao, có hệ thống nổi bật đáng tin cậy và sự tiêu thụ năng lượng thấp. Ở
đây có 4 sự lựa chọn bộ dao dộng và chỉ có 1 chân kết nối bộ dao động RC nên có
giải pháp tiết kiệm cao. Chế độ SLEEP tiết kiệm nguồn và có thể được đánh thức bởi
các nguồn reset.
PIC16F877A có 40/44 chân với sự phân chia cấu trúc như sau :
 Có 5 port xuất/nhập
 Có 8 kênh chuyển đổi A/D 10-bit
 Có bộ nhớ gấp đôi so với PIC16F873A và PIC16F874A
- Các đặc điểm của PIC16F887A :
Tần số hoạt động DC-20MHz
Reset và Delay POR, BOR (PWRT, OST)
Bộ nhớ chương trình Flash 8K
(14-bit word)
Bộ nhớ dữ liệu (byte) 368
Bộ nhớ dữ liệu EEPROM 256
(byte)
Các ngắt 15
Các Port xuất/nhập Port A, B, C, D, E
Timer 3
Module 2
Capture/Compare/PWM
Giao tiếp nối tiếp MSSP, USART
Giao tiếp song song PSP
Module A/D 10-bit 8 kênh ngõ vào
Bộ so sánh tương tự 2
Tập lệnh 35 lệnh
Số chân 40 chân PDIP
44 chân PLCC
44 chân TQFP
44 chân QFN
27

Bảng 2.1 Tóm tắt đặc điểm của PIC16F877A

2.3 Cấu trúc, chức năng PIC16F887A loại 40 chân PDIP


2.3.1 Sơ đồ chân, chức năng các chân

Hình 2.3.1 Sơ đồ chân PIC16F887A

- Chức năng các chân :


 Chân OSC1/CLKI (13) : ngõ vào dao động thạch anh hoặc xung clock bên
ngoài.
28

- OSC1 : ngõ vào dao động thạch anh hoặc xung clock bên ngoài.
Ngõ vào Schmit trigger khi được cấu tạo ở chế độ RC ; một cách
khác của CMOS.
- CLKI : ngõ vào nguồn xung bên ngoài. Luôn được kết hợp với
chức năng OSC1.
 Chân OSC2/CLKO (13) : ngõ vào dao động thạch anh hoặc xung clock.
- OSC2 : Ngõ ra dao động thạch anh. Kết nối đến thạch anh hoặc
bộ cộng hưởng.
- CLKO : ở chế độ RC, ngõ ra của OSC2, bằng tần số của OSC1
và chỉ ra tốc độ của chu kỳ lệnh.
 Chân /VPP (1) :
- MCLR : Hoạt động Reset ở mức thấp
- VPP : ngõ vào áp lập trình
 Chân RA0/AN0 (2) :
- RA0 : xuất/nhập số
- AN0 : ngõ vào tương tự 0
 Chân RA1/NA1 (3) :
- RA1 : xuất/nhập số
- AN1 : ngõ vào tương tự 1
 Chân RA2/NA2/VREF-/CVREF (4) :
- RA2 : xuất/nhập số
- AN2 : ngõ vào tương tự 2
- VREF -: ngõ vào điện áp chuẩn (thấp) của bộ A/D
- CVREF: điện áp tham chiếu VREF ngõ ra bộ so sánh
 Chân RA3/NA3/VREF+ (5) :
- RA3 : xuất/nhập số
- AN3 : ngõ vào tương tự 3
- VREF+ : ngõ vào điện áp chuẩn (cao) của bộ A/D
 Chân RA4/TOCKI/C1OUT (6) :
29

- RA4 : xuất/nhập số - mở khi được cấu tạo như ngõ ra


- TOCKI : ngõ vào xung clock bên ngoài cho Timer 0
- C1 OUT : Ngõ ra bộ so sánh 1
 Chân RA5/AN4/ /C2OUT (7) :
- RA5 : xuất/nhập số
- AN4 : ngõ vào tương tự 4
- SS : ngõ vào chọn lựa SPI phụ
- C2 OUT : ngõ ra bộ so sánh 2
 RB0/INT (33) :
- RB0 : xuất/nhập số
- INT : ngắt ngoài
 RB1 (34) : xuất/nhập số
 RB2 (35) : xuất/nhập số
 RB3/PGC :
- RB3 : xuất/nhập số
- PGC : Chân cho phép lập trình điện áp thấp ICPS
 RB4 (37), RB5 (38) : xuất/nhập số
 RB6/PGC (39) :
- RB6 : xuất/nhập số
- PGC : mạch dũ sai và xung clock lập trỡnh ICSP
 RB7/PGD (40) :
- RB7 : xuất/nhập số
- PGD : mạch dữ sai và dữ liệu lập trình ICSP
 Chân RC0/T1 OCO/T1CKI (15) :
- RC0 : xuất/nhập số
- T1 OCO : ngõ vào bộ dao động Timer 1
- T1 CKI : ngõ vào xung clock bên ngoài Timer 1
 Chân RC1/T1 OSI/CCP2 (16) :
- RC1 : xuất/nhập số
30

- T1 OSI : ngõ vào bộ dao động Timer 1


- CCP2 : ngõ vào Capture 2, ngõ ra compare 2, ngõ ra PWM2
 Chân RC2/CCP1 (17) :
- RC2 : xuất/nhập số
- CCP1 : ngõ vào Capture 1, ngõ ra compare 1, ngõ ra PWM1
 Chân RC3/SCK/SCL (18):
- RC3 : xuất/nhập số
- SCK : ngõ vào xung clock nối tiếp đồng bộ/ngõ ra của chế độ
SPI
- SCL : ngõ vào xung clock nối tiếp đồng bộ/ ngõ ra của chế độ
I2 C
 Chân RC4/SDI/SDA (23) :
- RC4 : xuất/nhập số
- SDI : dữ liệu vào SPI
- SDA : xuất/nhập dữ liệu vào I2C
 Chân RC5/SDO (24) :
- RC5 : xuất/nhập số
- SDO : dữ liệu ra SPI
 Chân RC6/TX/CK (25) :
- RC6 : xuất/nhập số
- TX : truyền bất đồng bộ USART
- CK : xung đồng bộ USART
 Chân RC7/RX/DT (26) :
- RC7 : xuất/nhập số
- RX : nhận bất đồng USART
- DT : dữ liệu đồng bộ USART
 Chân RD0/PSP0 (19) :
- RD0 : xuất/nhập số
- PSP0 : dữ liệu port nhánh song song
31

 Chân RD1/PSP1 (20) :


- RD1 : xuất/nhập số
- PSP1 : dữ liệu port nhánh song song
 Các chân : RD2/PSP2 (21), RD3/PSP3 (22), RD4/PSP (27), RD5/PSP5 (28),
RD6/PSP6 (29), RD7/PSP7 (30) tương tự chân 19,20.
 Chân RE0/ /AN6 (8) :
- RE0 : xuất nhập số
- RD : điều khiển việc đọc ở port nhánh song song
- AN5 : ngõ vào tương tự 5
 Chân RE1/ /AN6 (9) :
- RE1 : xuất/nhập số
- WR : điều khiển việc ghi ở port nhánh song song
- AN6 : ngõ vào tương tự 6
 Chân RE2/ /AN7 (10) :
- RE2 : xuất/nhập số
- CS : Chip lựa chọn sự điều khiển ở port nhánh song song
- AN7 : ngõ vào tương tự 7
 Chân VDD(11,32), và VSS(12,31) : là các chân nguồn của PIC.

2.3.2 Cấu trúc bên trong của PIC16F877A


Hình 2.3.2 là sơ đồ khối cấu trúc bên trong PIC16F887A bao gồm :

- Khối ALU - Arithmetic Logic Unit.


- Khối bộ nhớ chứa chương trình - Flash Program Memory.
- Khối bộ nhớ chứa dữ liệu EPROM - Data EPROM.
- Khối bộ nhớ file thanh ghi RAM - RAM file Register.
- Khối giải mã lệnh và điều khiển - Instruction Decode Control.
- Khối thanh ghi đặc biệt.
- Khối ngoại vi timer.
- Khối giao tiếp nổi tiếp.
- Khối chuyển đổi tín hiệu tương tự sang số - ADC.
32

- Khối các port xuất nhập.

Hình 2.3.2 Sơ đồ khối cấu trúc bên trong PIC16F887A

- Tổng quát cơ bản PIC16F887A :


33

Hình 2.3.3 Sơ đồ tổng quát về PIC16F887A

2.3.3 Các cổng xuất nhập


Cổng xuất nhập (I/O port) chính là phương tiện mà vi điều khiển dùng để
tương tác với thế giới bên ngoài. Sự tương tác này rất đa dạng và thông qua quá trình
tương tác đó, chức năng của vi điều khiển được thể hiện một cách rõ ràng.
Một cổng xuất nhập của vi điều khiển bao gồm nhiều chân (I/O pin), tùy theo
cách bố trí và chức năng của vi điều khiển mà số lượng cổng xuất nhập và số lượng
chân trong mỗi cổng có thể khác nhau. Bên cạnh đó, do vi điều khiển được tích hợp
sẵn bên trong các đặc tính giao tiếp ngoại vi nên bên cạnh chức năng là cổng xuất
nhập thông thường, một số chân xuất nhập còn có thêm các chức năng khác để thể
hiện sự tác động của các đặc tính ngoại vi nêu trên đối với thế giới bên ngoài. Chức
34

năng của từng chân xuất nhập trong mỗi cổng hoàn toàn có thể được xác lập và điều
khiển được thông qua các thanh ghi SFR liên quan đến chân xuất nhập đó.
Vi điều khiển PIC16F877A có 5 cổng xuất nhập, bao gồm PORTA, PORTB,
PORTC, PORTD và PORTE.
 PORTA
PORTA (RPA) bao gồm 6 I/O pin. Đây là các chân “hai chiều” (bidirectional
pin), nghĩa là có thể xuất và nhập được. Chức năng I/O này được điều khiển bởi
thanh ghi TRIS A (địa chỉ 85h). Muốn xác lập chức năng của một chân trong PORTA
là input, ta “set” bit điều khiển tương ứng với chân đó trong thanh ghi TRISA và
ngược lại, muốn xác lập chức năng của một chân trong PORTA là output, ta “clear”
bit điều khiển tương ứng với chân đó trong thanh ghi TRISA. Thao tác này hoàn toàn
tương tự đối với các PORT và các thanh ghi điều khiên tương ứng TRIS (đối với
PORTA là TRISA, đổi với PORTB là TRISB, đối với PORTC là TRISC, đối với
PORTD là TRISD và đối với PORTE là TRISE).
Bên cạnh đó PORTA còn là ngõ ra của bộ ADC, bộ so sánh, ngõ vào analog
ngõ vào xung clock của TimerO và ngõ vào của bộ giao tiếp MSSP (Master
Synchronous Serial Port).
Các thanh ghi SFR liên quan đến PORTA bao gồm :
 PORTA (địa chỉ 05h): chứa giá trị các pin trong PORTA.
 TRIS A (địa chỉ 85h): chứa giá trị các pin trong PORTA.
 CMCON (địa chỉ 9Ch) : thanh ghi điều khiển bộ so sánh.
 CVRCON (địa chỉ 9Dh) : thanh ghi điều khiển bộ so sánh điện áp.
 ADCON1 (địa chỉ 9Fh) : thanh ghi điều khiển bộ ADC.
 PORTB
PORTB (RPB) gồm 8 pin I/O. Thanh ghi điều khiến xuất nhập tương ứng là
TRISB. Bên cạnh đó một sổ chân của PORTB còn được sử dụng trong quá trình nạp
chương trình cho vi điều khiển với các chế độ nạp khác nhau. PORTB còn liên quan
đến ngắt ngoại vi và bộ TimerO. PORTB còn được tích hợp chức năng điện trở kéo
lên được điều khiển bởi chương trình.
35

Các thanh ghi SFR liên quan đến PORTB bao gồm :
 PORTB (địa chỉ 06h,106h) : chứa giá trị các pin trong PORTB
 TRISB (địa chỉ 86h,186h) : điều khiển xuất nhập
 OPTION_REG (địa chỉ 81 h, 181 h) : điều khiển ngắt ngoại vi và bộ
TimerO.
 PORTC
PORTC (RPC) gồm 8 pin I/O. Thanh ghi điều khiển xuất nhập tương ứng là
TRISC. Bên cạnh đó PORTC còn chứa các chân chức năng của bộ so sánh, bộ Timerl,
bộ PWM và các chuẩn giao tiếp nối tiếp I2C, SPI, SSP, USART.
Các thanh ghi điều khiển liên quan đến PORTC :
 PORTC (địa chỉ 07h) : chứa giá trị các pin trong PORTC
 TRISC (địa chỉ 87h) : điều khiển xuất nhập.
 PORTD
PORTD (RPD) gồm 8 chân I/O, thanh ghi điều khiển xuất nhập tương ứng là
TRISD. PORTD còn là cổng xuất dừ liệu của chuẩn giao tiếp PSP (Parallel Slave
Port).
Các thanh ghi liên quan đến PORTD bao gồm :
 Thanh ghi PORTD : chứa giá trị các pin trong PORTD.
 Thanh ghi TRISD : điều khiển xuất nhập.
 PORTE
PORTE (RPE) gồm 3 chân I/O. Thanh ghi điều khiển xuất nhập tương ứng là
TRISE. Các chân của PORTE có ngõ vào analog. Bên cạnh đó PORTE còn là các
chân điều khiên của chuấn giao tiếp PSP.
Các thanh ghi liên quan đến PORTE bao gồm :
 PORTE : chứa giá trị các chân trong PORTE.
 TRISE : điều khiên xuất nhập và xác lập các thông số cho chuẩn giao
tiếp PSP.
 ADCON1 : thanh ghi điều khiển khối ADC.
36

2.3.4 Khối chức năng ngoại vi


 Timer0: bộ đếm 8 bit với bộ chia tần số 8 bit.
 Timer1: bộ đếm 16 bit với bộ chia tần số, có thể thực hiện chức năng đếm dựa
vào xung clock ngoại vi ngay khi vi điều khiển hoạt động ở chế độ sleep.
 Timer2: bộ đếm 8 bit với bộ chia tần số, bộ postcaler.
 Hai bộ Capture/so sánh/điều chế độ rông xung.
 Các chuẩn giao tiếp nối tiếp SSP (Synchronous Serial Port), SPI và I2C.
 Chuẩn giao tiếp nối tiếp USART với 9 bit địa chỉ.
 Cổng giao tiếp song song PSP (Parallel Slave Port) với các chân điều khiển
RD, WR,CS ở bên ngoài.
 Các đặc tính Analog :
- 8 kênh chuyển đổi ADC 10 bit.
- Hai bộ so sánh.
 Bên cạnh đó là một vài đặc tính khác của vi điều khiển như :
- Bộ nhớ flash với khả năng ghi xóa được 100.000 lần.
- Bộ nhớ EEPROM với khả năng ghi xóa được 1.000.000 lần.
- Dữ liệu bộ nhớ EEPROM có thể lưu trữ trên 40 năm.
- Khả năng tự nạp chương trình với sự điều khiển của phần mềm.
Nạp được chương trình ngay trên mạch điện ICSP (In Circuit
Serial Programming) thông qua 2 chân. Watchdog Timer với bộ
dao động trong.
- Chức năng bảo mật mã chương trình.
- Chế độ Sleep.
- Có thể hoạt động với nhiều dạng Oscillator khác nhau.
2.3.5 Tổ chức bộ nhớ
Cấu trúc bộ nhớ của vi điều khiển PIC16F877A bao gồm bộ nhớ chương trình
(Program memory) và bộ nhớ dữ liệu (Data Memory).
Bộ nhớ chương trình :
37

Bộ nhớ chương trình của vi điều khiển PIC16F877A là bộ nhớ flash, dung
lượng bộ nhớ 8K word (1 word = 14 bit) và được phân thành nhiều trang (từ page0
đến page3). Như vậy bộ nhớ chương trình có khả năng chứa được 8*1024 = 8192
lệnh (vì một lệnh sau khi mã hóa sẽ có dung lượng 1 word (14 bit). Để mã hóa được
địa chỉ của 8K word bộ nhớ chương trình, bộ đếm chương trình có dung lượng 13 bit
(PC<12:0>).

Khi vi điều khiển được reset, bộ đếm chương trình sẽ chỉ đến địa chỉ 0000h
(Reset vector). Khi có ngắt xảy ra, bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h
(Interrupt vector).
Bộ nhớ dữ liệu :
Bộ nhớ dữ liệu của PIC là bộ nhớ EEPROM được chia ra làm nhiều bank. Đối
với PIC16F877A bộ nhớ dữ liệu được chia ra làm 4 bank. Mỗi bank có dung lượng
128 byte, bao gồm các thanh ghi có chức năng đặc biệt SFG (Special Function
Register) nằm ở các vùng địa chỉ thấp và các thanh ghi mục đích chung GPR (General
Purpose Register) nằm ở vùng địa chỉ còn lại trong bank. Các thanh ghi SFR thường
xuyên được sử dụng (ví dụ như thanh ghi STATUS) sẽ được đặt ở tất cả các bank của
bộ nhớ dữ liệu giúp thuận tiện trong quá trình truy xuất và làm giảm bớt lệnh của
chương trình.
2.3.6 Thanh ghi chức năng đặc biệt SFR:
Đây là các thanh ghi được sử dụng bởi CPU hoặc được dùng để thiết lập và
điều khiển các khối chức năng được tích hợp bên trong vi điều khiển. Có thể phân
thanh ghi SFR làm hai lọai: thanh ghi SFR liên quan đến các chức năng bên trong
(CPU) và thanh ghi SRF dùng để thiết lập và điều khiển các khối chức năng bên ngoài
(ví dụ như ADC, PWM, …).

+ Thanh ghi STATUS (03h, 83h, 103h, 183h): thanh ghi chứa kết quả thực hiện
phép toán của khối ALU, trạng thái reset và các bit chọn bank cần truy xuất
trong bộ nhớ dữ liệu. Thanh ghi OPTION_REG (81h, 181h): thanh ghi này
cho phép đọc và ghi, cho phép điều khiển chức năng pull-up của các chân
38

trong PORTB, xác lập các tham số về xung tác động, cạnh tác động của ngắt
ngoại vi và bộ đếm Timer0.

+ Thanh ghi INTCON (0Bh, 8Bh,10Bh, 18Bh): thanh ghi cho phép đọc và ghi,
chứa các bit điều khiển và các bit cờ hiệu khi timer0 bị tràn, ngắt ngoại vi
RB0/INT và ngắt interrput-on-change tại các chân của PORTB.

+ Thanh ghi PIE1 (8Ch): chứa các bit điều khiển chi tiết các ngắt của các khối
chức năng ngoại vi.

+ Thanh ghi PIR1 (0Ch) chứa cờ ngắt của các khối chức năng ngoại vi, các ngắt
này được cho phép bởi các bit điều khiển chứa trong thanh ghi PIE1.

+ Thanh ghi PIE2 (8Dh): chứa các bit điều khiển các ngắt của các khối chức
năng CCP2, SSP bus, ngắt của bộ so sánh và ngắt ghi vào bộ nhớ EEPROM.

+ Thanh ghi PIR2 (0Dh): chứa các cờ ngắt của các khối chức năng ngoại vi, các
ngắt này được cho phép bởi các bit điều khiển chứa trong thanh ghi PIE2.

+ Thanh ghi PCON (8Eh): chứa các cờ hiệu cho biết trạng thái các chế độ reset
của vi điều khiển.
39

2.3.7 Chế độ Reset


Có nhiều chế độ reset cho vi điều khiển, bao gồm:

 Power-on Reset POR: Reset khi cấp nguồn hoạt động cho vi điều
khiển.
 MCLR reset trong quá trình hoạt động.
 MCLR từ chế độ Sleep.
 WDT reset:reset do khối WDT tạo ra trong quá trình hoạt động.
 WDT wake up từ chế độ Sleep.

2.3.8 Chế độ Sleep


Đây là chế độ hoạt động của vi điều khiển khi lệnh SLEEP được thực thi. Khi đó
nếu được cho phép hoạt động, bộ đếm của WDT sẽ bị xóa nhưng WDT vẫn tiếp tục
hoạt động, bit PD(STATUS<3>) được reset về 0, bit TO được set, oscillator ngưng tác
động và các PORT giữ nguyên trạng thái như trước khi lệnh SLEEP được thực thi. Do
khi ở chế độ sleep, dòng cung cấp cho vi điều khiển rất nhỏ nên ta cần thực hiện các
bước sau trước khi thực thi lệnh SLEEP :

 Đưa tất cả các pin về trạng thái VDD hay VSS.


 Cần đảm bảo không có mạch ngoại vi nào được điều khiển bởi dòng của
vi điều khiển vì dòng điện nhỏ không đủ khả năng cung cấp cho các mạch
ngoại vi hoạt động.
 Tạm ngưng hoạt động của khối A/D và không cho phép các xung clock
từ bên ngoài tác động vào vi điều khiển.
 Để ý đến chức năng kéo lên ở PORTB.
 Pin MCLR phải ở mức cao.

2.3.9 “Đánh thức” vi điều khiển


40

Vi điều khiển có thể được “đánh thức” dưới tác động của một trong số các hiện
tượng sau:

 Tác động của reset ngoại vi thông qua pin MCLR.


 Tác động của WDT khi bị tràn.
 Tác động từ các ngắt ngoại vi từ PORTB(PORTB Interupt on charge hoặc
pin INT).
 Các bit PD và TO được dùng để thể hiện trạng thái của vi điều khiển và
để phát hiện nguồn tác động làm reset vi điều khiển. Bit PD được set khi
vi điều khiển được cấp nguồn và reset về 0 khi vi điều khiển ở chế độ
SLEEP. Bit TO được reset về 0 khi WDT tác động do bộ đếm bị tràn.

Ngoài ra còn có một số nguồn tác động khác từ các chức năng ngoại vi bao gồm :

 Đọc hay ghi dữ liệu thông qua PSP.


 Ngắt timer1 khi hoạt động ở chế độ đếm bất đồng bộ.
 Ngắt CCP khi hoạt động ở chế độ Capture.
 Các hiện tượng đặc biệt làm reset Timer1 khi hoạt động ở chế độ đếm bất
đồng bộ dùng nguồn xung clock bên ngoài.
 Ngắt SSP khi bit Stat/Stop được phát hiện.
 SSP hoạt động ở chế độ Slave mode khi truyền hoặc nhận dữ liệu.
 Tác động của USART từ các pin RX hay TX khi hoạt động ở chế độ slave
mode đồng bộ
 Khối chuyển đổi A/D khi nguồn xung clock hoạt động ở dạng RC.
 Hoàn tất quá trình ghi vào EEPROM.
 Ngõ ra so sánh thay đổi trạng thái.

2.3.10 Ngắt (interput)

PIC16F877A có đến 15 nguồn tạo ra hoạt động ngắt được điều khiên bởi thanh
ghi INTCON (bit GIE). Bên cạnh đó mỗi ngắt còn có một bit điều khiển và cờ ngắt
riêng. Các cờ ngắt vẫn được set bình thường khi thỏa mãn điều kiện ngắt xảy ra bất
41

chấp trạng thái của bit GIE, tuy nhiên hoạt động ngắt vẫn phụ thuôc vào bit GIE và
các bit điều khiên khác. Bit điều khiển ngắt RBO/INT và TMRO nằm trong thanh ghi
INTCON, thanh ghi này còn chứa bit cho phép các ngắt ngoại vi PEIE. Bit điều khiển
các ngắt nằm trong thanh ghi PIE1 và PIE2. Cờ ngắt của các ngắt nằm trong thanh
ghi PIR1 và PIR2.
Trong một thời điểm chỉ có một chương trình ngắt được thực thi, chương trình
ngắt được kết thúc bàng lệnh RETFIE. Khi chương trình ngắt được thực thi, bit GIE
tự động được xóa, địa chỉ lệnh tiếp theo của chương trình chính được cất vào trong
bộ nhớ Stack và bộ đếm chương trình sẽ chỉ đến địa chỉ 0004h. Lệnh RETFIE được
dùng để thoát khỏi chương trình ngắt và quay trở về chương trình chính, đồng thời
bit GIE cũng sẽ được set để cho phép các ngắt hoạt động trở lại. Các cờ hiệu được
dùng để kiêm tra ngắt nào đang xảy ra và phải được xóa bằng chương trình trước khi
cho phép ngắt tiếp tục hoạt động trở lại để ta có thể phát hiện được thời điểm tiếp
theo mà ngắt xảy ra.
Đối với các ngắt ngoại vi như ngắt từ chân INT hay ngắt từ sự thay đối trạng
thái các pin của PORTB (PORTB Interrupt on change), việc xác định ngắt nào xảy
ra cần 3 hoặc 4 chu kì lệnh tùy thuộc vào thời điểm xảy ra ngắt.
- Ngắt INT
Ngắt này dựa trên sự thay đổi trạng thái của pin RBO/INT. Cạnh tác động gây
ra ngắt có thể là cạnh lên hay cạnh xuống và được điều khiến bởi bit INTEDG (thanh
ghi OPTION_REG <6>). Khi có cạnh tác động thích hợp xuất hiện tại pin RBO/INT,
cờ ngắt ĨNTF được set bất chấp trạng thái các bit điều khiển GIE và PEIE. Ngắt này
có khả năng đánh thức vi điều khiển từ chế độ sleep nếu bit cho phép ngắt được set
trước khi lệnh SLEEP được thực thi.
- NGẮT DO SỤ THAY ĐỔI TRẠNG THÁI CÁC PIN TRONG PORTB
Các pin PORTB<7:4> được dùng cho ngắt này và được điều khiển bởi bit
RBIE (thanh ghi INTCON<4>). Cờ ngắt của ngắt này là bit RBIF (INTCC)N<0>).
2.4 Bộ chuyển đổi ADC trong PIC16F887A
42

ADC (Analog to Digital Converter) là bộ chuyển đồi tín hiệu giữa hai dạng
tương tự và số. PIC16F877A có 8 ngõ vào analog (RA4:RA0 và RE2:RE0). Hiệu
điện thế chuẩn VREF có thể được lựa chọn là VDD, Vss hay hiệu điện thế chuẩn được
xác lập trên hai chân RA2 và RA3. Kết quả chuyến đổi từ tín tiệu tương tự sang tín
hiệu số là 10 bit số tương ứng và được lưu trong hai thanh ghi ADRESH:ADRESL.
Khi không sử dụng bộ chuyển đổi ADC, các thanh ghi này có thể được sử dụng
như các thanh ghi thông thường khác. Khi quá trình chuyển đổi hoàn tất, kết quả sẽ
được lưu vào hai thanh ghi ADRESH:ADRESL, bit GO/DONE (ADCONO<2>)
được xóa về 0 và cờ ngắt ADIF được set.
- Quy trình chuyển đổi từ tương tự sang số bao gồm các bước sau :
1. Thiết lập các thông số cho bộ chuyển đổi ADC:
- Chọn ngõ vào analog, chọn điện áp mẫu (dựa trên các thông số của thanh
ghi ADCON1)
- Chọn kênh chuyển đổi A/D (thanh ghi ADCONO).
- Chọn xung clock cho kênh chuyển đổi A/D (thanh ghi ADCONO).
- Cho phép bộ chuyển đổi A/D hoạt động (thanh ghi ADCONO).
2. Thiết lập các cờ ngắt cho bộ A/D
- Clear bit ADIF.
- Set bit ADIE.
- Set bit PEIE.
- Set bit GIE.
3. Đợi cho tới khi quá trình lấy mẫu hoàn tất.
4. Bắt đầu quá trình chuyển đổi (set bit GO/DONE)
5. Đợi cho tới khi quá trình chuyển đổi hoàn tất bằng cách:
- Kiểm tra bit, nếu bit GO/DONE =0, quá trình chuyển đổi đã hoàn tất.
- Kiểm tra cờ ngắt.
6. Đọc kết quả chuyển đối và xóa cờ ngắt, set bit GO/DONE (nếu cần tiếp tục
chuyển đổi).
Tiếp tục thực hiện các bước 1 và 2 cho quá trình chuyền đổi tiếp theo.
43

Hình 2.4.1 Sơ đồ khối bộ chuyển đổi ADC.


Cần chú ý là có hai cách lưu kết quả chuyển đổi A/D, việc lựa chọn cách lưu
được điều khiển bởi bit ADFM và được minh họa cụ thể trong hình sau:

Hình 2.4.2 Các cách lưu kêt quả chuyển đổi A/D
- Các thanh ghi liên quan đến bộ chuyển đổi ADC bao gồm:
- INTCON (địa chỉ OBh, 8Bh, lOBh, 18Bh): cho phép các ngắt (các bit
GIE,PEIE).
- PIR1 (địa chỉ OCh): chứa cờ ngắt A/D (bit ADIF).
- PIE1 (địa chỉ 8Ch): chứa bit điều khiển A/D (ADIE)
44

- ADRESH (địa chỉ lEh) và ADRESL (địa chỉ 9Eh): các thanh ghi chứa
kết quả chuyển đổi A/D.
- ADCONO (địa chỉ lFh) và ADCON1 (địa chỉ 9Fh): xác lập các thông
số cho bộ chuyển đổi A/D.
- PORTA (địa chỉ 05h) và TRISA (địa chỉ 85h): liên quan đến các ngõ
vào analog ở PORTA.
- PORTE (địa chỉ 09h) và TRISE (địa chỉ 89h): liên quan đến các ngõ
vào analog ở PORTE.
45

CHƯƠNG III : GIAO TIẾP GIỮA VI ĐIỀU KHIỂN VÀ


SIM900, KHỐI NGUỒN, NGUYÊN LÝ HOẠT ĐỘNG

3.1 Giao tiếp giữa PIC16F887A và module SIM900


Vi điều khiển PIC16F887A và module SIM900 giao tiếp với nhau bằng chuẩn
truyền nhận không đồng bộ USART/UART thông qua hai chân RXD(9), TXD(10)
của module SIM900 và hai chân RC6/TX/CK(25), RC7/RX/DT(26) của 16F887A.

 Chân RXD(9) được nối với chân RC7/RX/DT(26)


 Chân TXD(10) được nối với chân RC6/RX/CK(25)

3.1.1 Tìm hiểu giao tiếp nối tiếp UART


UART (Universal Asynchronous Receiver Transmitter) là một trong hai chuẩn
giao tiếp nối tiếp. UART còn được gọi là giao diện giao tiếp nối tiếp nối tiếp SCI
(Serial Communication Interface). Có thể sử dụng giao diện này cho các giao tiếp với
các thiết bị ngọai vi, với các vi điều khiển khác hay với máy tính. Các dạng của giao
diện UART ngoại vi bao gồm :
 Bất động bộ (Asynchronous).
 Đồng bộ_ Master mode.
 Đồng bộ_ Slave mode.
Hai pin dùng cho giao diện này là RC6/TX/CK và RC7/RX/DT, trong đó
RC6/TX/CK dùng để truyền xung clock (baud rate) và RC7/RX/DT dùng để truyền
data. Trong trường họp này ta phải set bit TRISC<7:6> và SPEN (RCSTA<7>) để
cho phép giao diện UART.
PIC16F877A được tích hợp sẵn bộ tạo tốc độ baud BRG (Baud Rate
Genetator) 8 bit dùng cho giao diện UART. BRG thực chất là một bộ đếm có
thể được sử dụng cho cả hai dạng đồng bộ và bất đồng bộ và được điều khiển
bởi thanh ghi PSBRG. Ở dạng bất đồng bộ, BRG còn được điều khiển bởi bit
BRGH ( TXSTA<2>). Ở dạng đồng bộ tác động của bit BRGH được bỏ qua.
Tốc độ baud do BRG tạo ra được tính theo công thức sau :
46

SYNC BRGH * 0 (Low Speed) BRGH ■ 1 (High Speed)

0 (Asynchronous) Baud Rate = Fosc/(64 (X ♦ 1)) Baud Rate = Fosc/116 (X +1))


1 (Synchronous) Baud Rate = Fosc/(4 (X * 1)) N/A

Trong đó X là giá trị của thanh ghi RSBRG ( X là số nguyên và 0<x<255).


Các thanh ghi liên quan đến BRG bao gồm :
 TXSTA (địa chỉ 98h): chọn chế độ đồng bộ hay bất đồng bộ ( bit
SYNC) và chọn mức tốc độ baud (bit BRGH).
 RCSTA (địa chỉ 18h): cho phép hoạt động cổng nối tiếp (bit
SPEN).
 RSBRG (địa chỉ 99h): quyết định tốc độ baud.

3.2 Giao tiếp giữa PIC16F887A với khối relay


Vi điều khiển không thể đóng – ngắt các relay để điều khiển tải vì vậy việc
thực hiện giao tiếp trao đổi tín hiệu giữa PIC16F887A với khối relay được thực hiện
thông qua IC ULN2803 để kích khối relay.
- Cách thức trao đổi tín hiệu :
Khi ngõ ra của vi điều khiển (được nối với ngõ vào của ULN2083) xuất tín
hiệu là mức cao, qua ULN2803 đảo tín hiệu thành mức thấp và xuất ra đầu vào của
mạch relay (ngõ vào của mạch relay được xem như nối mass.), lúc này có dòng từ
nguồn 12v đi xuống => tiếp điểm role đóng lại => tải được cấp nguồn hoạt động.
Một số đặc tính của ULN2083 được dùng trong mạch :
 ULN2803 gồm 8 cặp transistor mắc theo kiểu darlington cho phép tải
được dòng lên đến 500mA.
 ULN2803 là một IC có chức năng đệm, đảo.
 ULN2803 có khả năng chịu được điện áp cao, lên đến 50V.
 IC ULN2803 đã bao gồm diode bảo vệ vi điều khiển. Do đó chúng ta
có thể điều khiển motor, rơle... mà không sợ dòng điện cảm ứng gây
nhiễu và hư hỏng vi điều khiển.
47

Hình 3.2.1 Sơ đồ kết nối PIC16F887 với khối relay


48

3.3 Khối nguồn

Hình 3.3.1 Khối nguồn

Khối nguồn là một trong những yếu tố quan trọng của một mạch điện, là một
trong những yếu tố quyết định giúp mạch hoạt động ổn định và an toàn. Trong mạch
em sử dụng 2 nguồn để cung cấp điện áp : 5V và 3V8. Nguồn chính được cấp từ
adapter 12V 4A. Lý do em sử dụng dòng 4A là vì chỉ riêng module sim900 khi hoạt
động đã cần dòng > 2A, ngoài ra còn có các mạch khác sử dụng để hoạt động. Vì đặc
tính của dòng là xài bao nhiêu lấy bấy nhiêu nên mức ampe cao cũng không ảnh
hưởng đến mạch. Vì vậy việc chọn dòng có ampe càng cao càng tốt.
Do module sim và vi điều khiển đều hoạt động ở mức điện áp dưới 5v nên em
đã sử dụng mạch nguồn dùng ic LM2576 để định áp đầu ra cho phù hợp với điện áp
hoạt động của 2 module này. Nguồn 5v dùng ic ổn áp 7805 cung cấp điện áp cho các
linh kiện khác hoạt động ở mức điện áp 5v.
3.4 Nguyên lý hoạt động
Sơ đồ nguyên lý toàn mạch :
RO1

1K

RL1
LO1 4
3
5
1
OUT8 2

12V

MOTOR

1
U2 RO2 2
1K
1 CON2
1 5V
12V
LO2 RL2

2
3
4
R_RS1 3

2
3
ANT 5
10K 1
3V3 R_RS2 470 OUT7 2
RST

STATUS
NETLIGHT
C_RS1 12V
LCD 20x4
10uF

68
67
66
65
64
63
62
61
60
59
58
57
56
55
54
53
52
LCD 16x2 3V3 RO3

GND
GND
GND
GND
GND
GND
GND
GND
GND

VBAT
VBAT
VBAT
3V3 1K

VSS
VDD
VEE
RS
RW
E
D0
D1
D2
D3
D4
D5
D6
D7
A
K
GPIO12
GPIO11
STATUS
RF_ANT
R_LM35 1K LM35 JNAP RN1

NETLIGHT
JDK1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PWRKEY 1 51 ADC 2 1
2 PWRKEY GPIO10/KBC0 50 3V3 RST 1 DK1 2 RL3 2
3 PWRKEY_OUT GPIO9/KBC1 49 VDD 2 DK2 3 LO3 4 1
DTR GPIO8/KBC2 VSS DK3

DB4
DB5
DB6
DB7
4 48 C_LM351 C_LM352 3 4 3

RS
EN
RI GPIO7/KBC3

3
5 47 PGD 4 DK4 5 5
6 DCD GPIO6/KBC4 46 10uF 104 PGC 5 DK5 6 1 CON2
7 DSR GND 45 DK6 7 OUT6 2
5V CTS GND DK7
5V 8 M1 44 8
R18 RXD 9 RST GPIO5/KBR0 43 3V3 DK8 9 12V

11
32
TXD 10 TXD MODULE SIM900A GPIO4/KBR1 42 U1
RV ADJ 10K 10K 11 RXD GPIO3/KBR2 41 RST 1 40 PGD
12 DISP_CLK GPIO2/KBR3 40 ADC 2 MCLR/VPP RB7/PGD 39 PGC 10K

VDD
VDD
13 DISP_DATA GPIO1/KBR4 39 3 RA0/AN0 RB6/PGC 38 RS
14 DISP_D/C GND 38 VREF 4 RA1/AN1 RB5 37 EN RO4
15 DISP_CS SCL 37 5 RA2/AN2/VREF-/CVREF RB4 36 DB4
16 VDD_EXT SDA 36 6 RA3/AN3/VREF+ RB3/PGM 35 DB5 1K
17 NRESET PWM2 35 7 RA4/T0CKI/C1OUT RB2 34 DB6 U5
GND PWM1 10K CV1 CV2 8 RA5/AN4/SS/C2OUT RB1 33 DB7
9 RE0/RD/AN5 RB0/INT DK1 1 18 OUT1 JDK2
104 10uF IN2 10 RE1/WR/AN6 DK2 2 IN1 OUT1 17 OUT2 RL4 2
CX1 22 13 RE2/CS/AN7 30 COI DK3 3 IN2 OUT2 16 OUT3 LO4 4 1
OSC1/CLKI RD7/PSP7 29 DK4 4 IN3 OUT3 15 OUT4 3

GND
MIC_P
MIC_N
SPK_P
SPK_N
LINEIN_R
LINEIN_L
ADC
VRTC
DBG_TXD
DBG_RXD
GND
SIM_VDD
SIM_DATA
SIM_CLK
SIM_RST
SIM_PRESENCE
Y1 RD6/PSP6 28 DK5 5 IN4 OUT4 14 OUT5 5
20Mhz RD5/PSP5 27 PWSIM DK6 6 IN5 OUT5 13 OUT6 1 CON2
RD4/PSP4 IN6 OUT6

18
19
20
21
22
23
24
25
26
27
28
29
33
34
CX2 22 14 26 RXD DK7 7 12 OUT7 OUT5 2
CK1 15 OSC2/CLKO RC7/RX/DT 25 TXD DK8 8 IN7 OUT7 11 OUT8
IN1 16 RC0/T1OSO/T1CKI RC6/TX/CK 24 DK1 IN8 OUT8
DK8 17 RC1/T1OSI/CCP2 RC5/SDO 23 DK2 10 12V
GND

DK7 RC2/CCP1 RC4/SDI/SDA DK3 12V COM


18 22
DK6 RC3/SCK/SCL RD3/PSP3 DK4

SIM_VDD 30
SIM_CLK 32
19 21

SIM_DATA 31
SIM_RST
RD0/PSP0 RD2/PSP2
9

DK5 20 ULN2803
VSS
VSS

RD1/PSP1
RO5
12
31

16F877A
1K

JDK3
VSS

RL5 2
LO5 4 1
49

C1 3
5
220nF 1 CON2
SIM_VDD U3 OUT4 2
1 12V
R10 22 2 SIM_VDD
SIM_RST 3 SIM_RST 3V3 3V3 12V
4 SIM_CLK
GND COI
R11 22 5
SIM_CLK 6 VPP
SIM_DATA DCOI
R12 22 SIM CARD D1 D2 RO6
SIM_DATA 3V3
LED LED 1K
5V 5V 5V
COI Q1
C945 5V RA1 JDK4
R6 R9 R_COI1 4K7 RL6 2
12V RA6 RA5 2K2 LO6 4 1
7805 220 220 RA7 3
U8A CK1 5
8

1 3 VDD 330 100K 100K 1 CON2


VIN VOUT 5V
R3 1K R4 4K7 R7 4K7 3 RA3 10K OUT3 2

GND
PWRKEY NETLIGHT STATUS +
Q2 Q3 1 QA
CN4 CN5 2 C945 12V
-

2
R1 4K7 C945 C945
2200uF 104 5V 3V3 PWSIM Q1 R5 R8 RA2

Hình 3.4.1 Sơ đồ nguyên lý toàn mạch


4

DA2 RA4 LM358

VSS
C945 47K 47K DA1 3K3
R2 RO7
RLN1 RLN2 LED LED 100K
U4 47K 1K
3V3 330 330
1 4
V_IN FB JDK5
CN1 L1 RL7 2
J1 5 R15 4K7 D5 D6 LO7 4 1
1 2200uF ON/OFF 2 CN2 CN3 3

GND
2 OUT 5
100uH R17 2200uF 104 1 CON2

3
LM2576 OUT2 2
CON2 R16 220 2K2
12V

RO8

1K

JDK6
RL8 2
LO8 4 1
3
5
1 CON2
OUT1 2

3V3

RM1 RM2
10K 10K
JMOTOR
IN1 3
IN2 2
1

CON3
50

- Nguyên lý hoạt động truyền nhận tin nhắn và điều khiển thiết bị như
sau :
Ví dụ : bật đèn phòng khách.
Dùng điện thoại nhắn tin đến số điện thoại trong module sim với cú pháp
#123456denpkbat. Thì module sim sẽ nhận được chuỗi kí tự tin #123456denpkbat.
Khi nhận được tin nhắn mới thì modue sim sẽ gửi ngay đến vi điều khiển thông qua
kết nối UART. Tại đây vi điều khiển tiến hành phân tích gói tin mà module sim gửi
đến. Cụ thể như sau :
1. Trước tiên vi điều khiển lưu tất các các kí tự vào mãng để so sánh (các kí tự
được lưu bắt đầu bằng # và kết thúc bằng ). Do đó nếu cú pháp tin nhắn không
có dấu # và dấu . thì vi điều khiển sẽ không thực hiện lệnh.
2. Sau khi lưu các kí tự vào mãng, vi điều khiển lấy 6 kí tự mật mã để so sánh,
nếu đúng mật khẩu sẽ là điều kiện cần để thực hiện lệnh.
3. Sau đó vi điều khiển so sánh cấu trúc lệnh ( char tb1_on[] = "denpkbat"; ).
Để điều khiển cho đúng thiết bị, vi điều khiển so sánh toàn bộ chuỗi kí tự được
gửi đến, chuỗi kí tự này ứng với cấu trúc lệnh nào thì lệnh đó sẽ được thực
hiện. Cụ thể ở đây chuỗi kí tự "denpkbat" ứng với cấu trúc lệnh “tb1_on” nên
vi điều khiển sẽ kích relay bật đèn.
4. Khi đã điều khiển xong thiết bị, vi điều khiển gửi kí tự trả lời (kí tự lưu sẵn
trong các case do người lập trình cài đặt) đến điện thoại thông qua module sim
bằng kết nối UART.
Các thao tác điều khiển các thiết bị khác cũng tương tự như trên.
51

CHƯƠNG IV : THIẾT KẾ - THI CÔNG HỆ THỐNG

4.1 Dụng cụ và vật liệu


Dụng cụ và vật liệu em sử dụng khi tiến hành làm mô hình gồm có :
- Dụng cụ : Khoan, vít, kéo, kiềm, búa, thước đo, mỏ hàn chì, súng bắn
keo, cọ quét v.v..
- Vật liệu : Gỗ, mica, chì hàn, keo nến, dây diện, ốc bắt gỗ, vật liệu cắt
dán thủ công, thiết bị và linh kiện cần dùng cho đồ án.

Hình ảnh một số dụng cụ và vật liệu dùng trong đồ án :

Hình 4.1.1 Dụng cụ


52

Hình 4.1.2 Vật liệu

4.2 Thiết kế và thi công mô hình


Giai đoạn 1 : Thi công mạch điều khiển
Giai đoạn này em tiến hành đi in sơ đồ mạch in của bo mạch điều khiển, sau
đó đặt ủi và ngâm mạch, mua linh kiện trong mạch tại tiệm bán linh kiện điện tử. Tiếp
theo khoan lỗ chân linh kiện, lắp linh kiện lên bo mạch theo sơ đồ nguyên lý rồi hàn
chì chân linh kiện.

- Một số hình ảnh khi thực hiện giai đoạn 1 :


53

Hình 4.2.1 Sơ đồ mạch in

.......... Sau khi lắp linh kiện lên mạch và hàn chân lên bo đồng thì được bo mạch
điều khiển như hình :
54

Hình 4.2.2 Mặt trước bo mạch điều khiển

Hình 4.2.3 Mặt sau bo mạch điều khiển


55

Giai đoạn 2 : Đi dây điện và lắp ghép phần nội thất


Giai đoạn này em tính toán kích thước chiều dài dây điện và đi dây ngõ ra
của bo điều khiển đến các thiết bị trong mô hình. Tiến hành cắt dán thủ công, lắp
ghép các đồ vật dùng trang trí nội thất.

Hình 4.2.4 Tính toán và đi dây đến các thiết bị

Hình 4.2.5 Lắp ghép đồ vật trang trí nội thất


56

Giai đoạn 3 : Hoàn thành phần cứng mô hình


Sau khi đi tính toán đi dây và hoàn thành đồ vật trang trí nội thất hoàn chỉnh,
em bắt đầu lắp mica lên mô hình như thiết kế đã định, kế tiếp lắp các thiết bị và đồ
vật nội thất. Nạp chương trình điều khiển. Hoàn thành mô hình.

Hình 4.2.6 Lắp mica, thiết bị và trang trí nội thất

Hình 4.2.7 Hoàn thiện mô hình


57

CHƯƠNG V : TỔNG KẾT ĐÁNH GIÁ VÀ HƯỚNG


PHÁT TRIỂN ĐỀ TÀI

5.1 Kết quả và đánh giá đồ án


Đồ án " ĐIỀU KHIỂN THIẾT BỊ GIA ĐÌNH BẰNG SMS " là đề tài có tính
ứng dụng cao trong thực tế. Việc xây dựng nên hệ thống như thế này liên quan đến
nhiều kiến thức như : điện - điện tử, kiến thức lập trình C, các kiến thức về tập lệnh
của Module SIM…
Qua thời gian nghiên cứu và thi công đồ án đã được hoàn thành. Bằng sự nỗ
lực, cố gắng của bản thân, bên cạnh đó còn là sự hướng dẫn nhiệt tình, tận tâm của
thầy Phạm Quốc Tiến – Trưởng khoa Điện-điện tử, đồ án đã được hoàn thành đúng
thời gian như đã định và đã đạt được yêu cầu đặt ra. Trong quá trình thực hiện đề tài,
em đã thu được những kết quả nhất định như sau :
 Mạch điện với các module nhỏ trên mạch được thiết kế, thi công hoàn
chỉnh và đã được thử nghiệm nhiều lần, hoạt động ổn định trong thực
tế.
 Hệ thống có thể điều khiển được thiết bị điện từ xa thông qua tin nhắn
SMS : Sau khi gửi tin nhắn, bộ xử lí sẽ thực thi quá trình xử lí, sau đó
là điều khiển thiết bị một cách tự động.
 Hệ thống có khả năng được bảo vệ tốt, nghĩa là người sử dụng phải biết
lệnh điều khiển và mật khẩu (password) thì mới đăng nhập điều khiển
được thiết bị trong ngôi nhà.
 Hệ thống có chức năng cảnh báo sự cố : Khối cảnh báo trộm, báo cháy,
báo rò gas được thiết kế, lập trình kết hợp với trung tâm xử lí, có khả
năng gửi thông tin dữ liệu tới trung tâm xử lí.
Nội dung của đề tài được trình bày khá chi tiết rõ ràng bằng cách sử dụng
những từ ngữ thông dụng, các hình ảnh đi kèm giúp người đọc dễ hiểu và có thể thực
hiện một cách tương tự, đạt hiệu quả trong một thời gian ngắn.
58

Để thực hiện được các chức năng nêu trên, em đã tìm hiểu, nghiên cứu các vấn
đề có liên quan tới đề tài như : PIC16F887A, Module SIM 900, các ngôn ngữ lập
trình tương ứng như C, bộ lệnh AT Command dành cho Module sim900, và các vấn
đề khác liên quan tới đề tài.
Cuối cùng, theo nhận định chủ quan của em thì đồ án đã được hoàn thành đúng
thời gian, đạt được mục tiêu đề ra và đã trình bày khá đầy đủ các mảng kiến thức, các
vấn đề liên qua tới đề tài.
5.2 Hướng phát triển đề tài
Mục tiêu đề ra dù đã được hoàn thành nhưng chỉ là một phần khía cạnh trong
tiêu chuẩn của nhà thông minh. Vì vậy, để đề tài này thêm phong phú, mang nhiều
tính thực tế, ứng dụng cao hơn thì cần đưa thêm vào những yêu cầu như sau :
 Ngoài việc điều khiển giám sát bằng tin nhắn SMS, người dùng có thể
điều khiển – giám sát ngôi nhà thông qua mạng LAN.
 Sử dụng thêm nhiều loại cảm biến khác phục vụ nhu cầu của con người
như : cảm biến độ ẩm, cảm biến chuyển động, cảm biến âm thanh, v.v...
 Mở rộng điều khiển được nhiều hơn nữa các thiết bị trong nhà.
 Đề tài không những chỉ áp dụng cho với ngôi nhà mà nên được mở rộng
áp dụng cho các thiết bị sử dụng nơi công cộng, trung tâm thương mại,
cao ốc, văn phòng, v.v...
Hy vọng với những hướng phát triển nêu trên cùng với những ý tưởng khác
của người đọc, thế hệ đàn em đi sau sẽ phát triển hơn nữa về nội dung đề tài, làm cho
đề tài trở nên phong phú hơn, mang tính ứng dụng cao hơn vào trong thực tế, phục
vụ cho những lợi ích của con người và xã hội trong tương lai.
5.3 Tài liệu tham khảo
[1] Kỹ thuật lập trình C – GS Phạm Văn Ất.
[2] Giáo trình vi điều khiển PIC tại trang http://www.thuvienmienphi.com
Ngoài ra, nguồn tài liệu trên mạng cũng rất phong phú, các trang web hỗ trợ
em về kiến thức và datasheet linh kiện mà em sử dụng trong đồ án :
[3] http://www.alldatasheet.com
59

[4] http://www.dientuvietnam.net
[5] https://www.google.com.vn
[6] http://www.simcom.us
[7] http://at-sky.com.vn/nghien-cuu/gsmgprs-gps/32-dieu-khien-thiet-bi-su-
dung-module-sim900-p2-tiep-theo.html
[8] http://at-sky.com.vn/.UfnRAazebBM
60

CHƯƠNG VI : PHẦN MỀM HỆ THỐNG

Về phần mềm em dùng ngôn ngữ lập trình là C, trình biên dịch CCS
Complier, nạp chương trình bằng Pickit2. Code đã được em chú thích tương đối rõ
ràng và chi tiết.
Nội dung phần mềm

#include <16f887.H> //Khai báo thư viện PIC


#device ADC = 10 //Khai báo sử dụng ADC 10 bit
#use delay(clock=20000000)
#include <string.h> //Gọi thư viện xử lý chuỗi
#include "LCD16x2.c" //Gọi thư viện LCD
#use
rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,DISABLE_INTS)
#fuses
HS,NOWDT,PROTECT,NOBROWNOUT,PUT,NOLVP,NOCPD,NOWRT,NOCPD,NOI
ESO,NOFCMEN,MCLR
// Định nghĩa các chân điều khiển
#define pin_pwgsm PIN_D4
#define pin_dk1 PIN_C5
#define pin_dk2 PIN_C4
#define pin_dk3 PIN_D3
#define pin_dk4 PIN_D2
#define pin_dk5 PIN_D1
#define pin_dk6 PIN_D0
#define pin_dk7 PIN_D5
#define pin_dk8 PIN_D6
#define pin_cuamo PIN_C3
#define pin_cuadong PIN_C2
#define f_cuamo PIN_C1
61

#define f_cuadong PIN_E2


#define cam_bien PIN_C0
#define cam_bien_gas PIN_C1
#define pin_coi PIN_D7
Thiết lập mật khẩu và thiết lập quy định chuỗi cú pháp nhắn tin
char mk[] = "123456";
char tb1_on[] = "denpkbat"; // thay thế chuỗi “tb1=denpk”, “on=bat”
char tb1_off[] = "denpktat";
char tb2_on[] = "denn1bat";
char tb2_off[] = "denn1tat";
char tb3_on[] = "denn2bat";
char tb3_off[] = "denn2tat";
char tb4_on[] = "dennbbat";
char tb4_off[] = " dennbtat";
char tb5_on[] = "dentlbat";
char tb5_off[] = "dentltat";
char tb6_on[] = "quatpkbat";
char tb6_off[] = "quatpktat";
char tb7_on[] = "quatn1bat";
char tb7_off[] = "quatn1tat";
char tb8_on[] = "quatn2bat";
char tb8_off[] = "quatn2tat";
char cua_mo[] = "cuamo";
char cua_dong[] = "cuadong";
char status[] = "?";
int1 s_dk1 = 0, s_dk2 = 0, s_dk3 = 0, s_dk4 = 0, s_dk5 = 0, s_dk6 = 0, s_dk7 = 0,
s_dk8 = 0;
int1 s_cua = 0; //Cua dong = 0, cua mo = 1;
// Khai báo bộ đệm
62

#define buffer_size 80
unsigned buffer[buffer_size];
unsigned int8 c = 0, c1 = 0, counter_buffer = 0;
int1 sms_mode = false;

char *ptr1 = 0;
char *ptr2 = 0;
void read_sms(char index);
void send_sms(unsigned int8 n);
void doc_nhiet_do();
unsigned int8 nhiet_do = 0,pre_nhiet_do = 0;
void check_cam_bien();
int1 bit_cam_bien = 0;
int1 bit_cam_bien_gas = 0;
#define nhiet_do_max 50
char data[15];
char data_len;
void init();
int1 get_ok(void);
void erase_buffer();
char sdt[15];
char number;
char st_sms = 0xff;
void main(){
init();
while(TRUE)
{
read_sms(1); //Đọc tin nhắn
if(st_sms != 0xff){
63

send_sms(st_sms); //Nếu có tin nhắn SMS trả lời tin nhắn


};
doc_nhiet_do();
check_cam_bien();
}
}
// Nhận và phản hồi tin nhắn
void read_sms(char index)
{
st_sms = 0xff;
unsigned int8 i;
sms_mode = false;
erase_buffer();
printf("AT+CMGR=%d\r\n",index); //Đọc tin nhắn
delay_ms(500);
if(sms_mode == true){ //Nếu có tin nhắn đến
output_bit(pin_coi,1);
strcpy(data,"123456"); //Copy mật khẩu vào data
data_len = strlen(data); //Lấy độ dài chuỗi data
ptr1 = strstr(buffer,data); //Tìm kiếm data trong buffer
if(strncmp(ptr1,data,data_len) == 0){ //Nếu có ký tự của data trong buffer (kiểm
tra nếu đúng mật khẩu)

// Điều khiển thiết bị 1 ( đèn phòng Khách )


strcpy(data,"denpkbat"); //Copy ký tự “denpkbat” vào data
data_len = strlen(data); //Lấy độ dài chuỗi data
ptr2 = strstr(buffer,data); //Tìm kiếm ký tự data trong buffer
if(strncmp(ptr2,data,data_len) == 0){ //Nếu có ký tự data trong buffer
output_bit(pin_dk1,1); //Bật đèn phòng khách
64

s_dk1 = 1; //Cho trạng thái đèn phòng khách = 1


st_sms = 1; // gửi tin nhắn trong case 1 báo đèn bật
}
else{
strcpy(data,"denpktat"); //Copy ký tự “denpktat” vào data
data_len = strlen(data); //Lấy độ dài chuỗi data
ptr2 = strstr(buffer,data); //Tìm kiếm ký tự data trong buffer
if(strncmp(ptr2,data,data_len) == 0){ //Nếu có ký tự data trong buffer
output_bit(pin_dk1,0); // tắt đèn phòng khách
s_dk1 = 0; //Cho trạng thái đèn phòng khách = 0
st_sms = 2; // gửi tin nhắn case 2 báo đèn đã tắt
};
};
CÁC THIẾT BỊ KHÁC ĐỀU CÓ LỆNH BẬT TẮT TƯỢNG TỰ NHƯ ĐÈN
PHÒNG KHÁCH NÊN EM SẼ KHÔNG CHÚ THÍCH RÕ NỮA NHẰM TRÁNH GÂY
LOÃNG MẮT KHI ĐỌC.
// Thiết bị 2 (đèn phòng ngủ 1)
strcpy(data,"denn1bat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk2,1);
s_dk2 = 1;
st_sms = 3;
}
else
{
strcpy(data,"denn1tat");
data_len = strlen(data);
65

ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk2,0);
s_dk2 = 0;
st_sms = 4;
};
};

// Thiết bị 3 (đèn phòng ngủ 2)


strcpy(data,"denn2bat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk3,1);
s_dk3 = 1;
st_sms = 5;
}
else{
strcpy(data,"denn2tat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk3,0);
s_dk3 = 0;
st_sms = 6;
};
};
// Thiết bị 4 (đèn nhà bếp)
strcpy(data,"dennbbat");
66

data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk4,1);
s_dk4 = 1;
st_sms = 7;
}
else{
strcpy(data,"dennbtat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk4,0);
s_dk4 = 0;
st_sms = 8;
};
};
// Thiết bị 5 (đèn toilet)
strcpy(data,"dentlbat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk5,1);
s_dk5 = 1;
st_sms = 9;
}
else{
strcpy(data,"dentltat");
data_len = strlen(data);
67

ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk5,0);
s_dk5 = 0;
st_sms = 10;
};
};
// Thiết bị 6 (quạt phòng khách)
strcpy(data,"quatpkbat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk6,1);
s_dk6 = 1;
st_sms = 11;
}
else{
strcpy(data,"quatpktat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk6,0);
s_dk6 = 0;
st_sms = 12;
};
};

// Thiết bị 7 (quạt phòng ngủ 1)


strcpy(data,"quatn1bat");
68

data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk7,1);
s_dk7 = 1;
st_sms = 13;
}
else{
strcpy(data,"quatn1tat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk7,0);
s_dk7 = 0;
st_sms = 14;
};
};

// Thiết bị 8 (quạt phòng ngủ 2)


strcpy(data,"quatn2bat");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk8,1);
s_dk8 = 1;
st_sms = 15;
}
else{
strcpy(data,"quatn2tat");
69

data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_dk8,0);
s_dk8 = 0;
st_sms = 16;
};
};
// Điều khiển đóng mở cửa
strcpy(data,"mocua");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_cuadong,0);
output_bit(pin_cuamo,1);
s_cua = 1;
st_sms = 17;
}
else{
strcpy(data,"dongcua");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
output_bit(pin_cuamo,0);
output_bit(pin_cuadong,1);
s_cua = 0;
st_sms = 18;
};
};
70

// Kiểm tra trạng thái các thiết bị


strcpy(data,"?");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
st_sms = 19;
};
// Đặt số điện thoại điều khiển
strcpy(data,"sdt");
data_len = strlen(data);
ptr2 = strstr(buffer,data);
if(strncmp(ptr2,data,data_len) == 0){
number = 0;
for(i = 0; i < 15; i ++){ //Xóa số điện thoại trong bộ đệm về 0
sdt[i] = 0x00;
};
for(i = 10; i < counter_buffer; i ++){ //Lấy số điện thoại
if(buffer[i] != '.'){
sdt[number] = buffer[i];
number ++;
if(number >= 15) break;
}
else{
break;
};
}
if(number < 15){ //Ghi số điện thoại vào bộ nhớ eeprom
for(i = 0; i < number; i ++){
write_eeprom(i,sdt[i]);
71

};
write_eeprom(20,number); //Ghi độ dài của số điện thoại
st_sms = 20;
};
};
};
};
sms_mode = false;
erase_buffer(); //Xóa bộ đệm
printf("AT+CMGD=%d\r\n",index); //Xóa tin nhắn
delay_ms(100);
output_bit(pin_coi,0);
delay_ms(1000);
}

// Chống trộm
void check_cam_bien() //Kiem tra cam bien hong ngoai
{
if(input(cam_bien) == 1){ //Nếu cảm biến = 1 (có trộm)
delay_ms(10);
if((input(cam_bien) == 1) && (bit_cam_bien == 0)){ //Nếu có trộm và chưa
báo động sẽ báo động
bit_cam_bien = 1; //Bit ghi nhớ đã báo động
output_bit(pin_coi,1); //Báo còi ( chuông )
send_sms(22); //Gửi tin nhắn báo động về sdt
};
}
else{
bit_cam_bien = 0; //Xóa bít ghi nhớ báo động để báo động lần kế tiếp
72

output_bit(pin_coi,0); //Tắt còi (chuông)


};
// Kiểm tra cảm biến khí gas (chú thích tương tự phần chống trộm)
if(input(cam_bien_gas) == 0){
delay_ms(10);
if((input(cam_bien_gas) == 0) && (bit_cam_bien_gas == 0)){
bit_cam_bien_gas = 1;
output_bit(pin_coi,1);
send_sms(23);
};
}
else{
bit_cam_bien_gas = 0;
output_bit(pin_coi,0);
};
}
// Đọc nhiệt độ và báo cháy
void doc_nhiet_do(){
unsigned int16 adc = 0;
unsigned int32 sum_adc = 0;
unsigned int8 coun_adc = 0;
while(coun_adc < 32)
{ //Đọc nhiệt độ
adc = read_adc();
sum_adc = sum_adc + adc;
coun_adc++;
};
pre_nhiet_do = nhiet_do;
nhiet_do = sum_adc /150;
73

lcd_gotoxy(1,2);
printf(lcd_putc," Nhiet do:%3u%cC",nhiet_do,0xdf); //Hiển thị ra LCD
if((nhiet_do >= nhiet_do_max) && (pre_nhiet_do < nhiet_do_max)){//Nếu quá 50
độ C báo động
send_sms(21);
};
}
// Tắt hết ngõ ra
void init(){
unsigned int8 i;
output_bit(pin_dk1,0);
output_bit(pin_dk2,0);
output_bit(pin_dk3,0);
output_bit(pin_dk4,0);
output_bit(pin_dk5,0);
output_bit(pin_dk6,0);
output_bit(pin_cuamo,0);
output_bit(pin_cuadong,1);
// Khởi tạo ADC
SETUP_ADC(ADC_CLOCK_DIV_32);
SETUP_ADC_PORTS(sAN0 | VSS_VREF);
SET_ADC_CHANNEL(0);
lcd_init(); //Khởi tạo LCD
ENABLE_INTERRUPTS(INT_RDA); //Cho phép ngắt
ENABLE_INTERRUPTS(GLOBAL);
erase_buffer(); //Xóa bộ đệm
delay_ms(200);
printf("AT\r"); //Test modul sim
delay_ms(200);
74

if(get_ok() == 0){ //Chờ phản hồi từ modul sim


lcd_gotoxy(1,1);
printf(lcd_putc," Init SIM900A "); // chuỗi hiển thị khi khởi động
output_bit(pin_pwgsm,1); //Khởi động modul sim
delay_ms(1000);
output_bit(pin_pwgsm,0);
printf("AT\r");
while(get_ok() == 0){
printf("AT\r");
delay_ms(200);
};
lcd_gotoxy(1,1);
printf(lcd_putc," Init Sucsess ");
};
// Khởi tạo modul sim
printf("AT+CNMI=2,1,0,0,0\r\n");
delay_ms(200);
printf("AT+CMGF=1\r\n");
delay_ms(200);
printf("AT+CLIP=1\r\n");
delay_ms(200);
printf("AT+CMGD=1\r\n");
delay_ms(200);
lcd_gotoxy(1,1);
printf(lcd_putc," Nha Thong Minh ");
lcd_gotoxy(1,2);
printf(lcd_putc," Nhiet do:%3u%cC",nhiet_do,0xdf);

for(i = 0; i < 15; i ++){


75

sdt[i] = 0;
}
number = read_eeprom(20); //Đọc số điện thoại
if(number < 15){
for(i = 0; i < number; i ++){
sdt[i] = read_eeprom(i);
};
};
}

int1 get_ok(void){
char *ptr; char string_s1[]="OK";
ptr = strstr(buffer,string_s1);
if(strncmp(ptr,string_s1,2) == 0){
return 1;
}
else{
return 0;
}
}

void erase_buffer(){
unsigned int8 i;
for(i = 0; i < buffer_size; i ++){
buffer[i] = 0x00;
};
counter_buffer = 0;
}
76

void send_sms(unsigned int8 n){


unsigned int8 i;
delay_ms(2000);
printf("AT+CMGS=\""); //Gửi tin nhắn
printf(sdt);
printf("\"\r\n");
delay_ms(1000);
switch(n){
case 0:
printf("He thong khoi dong"); // đặt kí tự phản hồi SMS về điện thoại vào các case
break;
case 1:
printf("Den phong khach da bat!");
break;
case 2:
printf("Den phong khach da tat!");
break;
case 3:
printf("Den phong ngu 1 da bat!");
break;
case 4:
printf("Den phong ngu 1 da tat!");
break;
case 5:
printf("Den phong ngu 2 da bat!");
break;
case 6:
printf("Den phong ngu 2 da tat!");
break;
77

case 7:
printf("Den nha bep da bat!");
break;
case 8:
printf("Den nha bep da tat!");
break;
case 9:
printf("Den toilet da bat!");
break;
case 10:
printf("Den toilet da tat!");
break;
case 11:
printf("Quat phong khach da bat!");
break;
case 12:
printf("Quat phong khach da tat!");
break;
case 13:
printf("Quat phong ngu 1 da bat!");
break;
case 14:
printf("Quat phong ngu 1 da tat!");
break;
case 15:
printf("Quat phong ngu 2 da bat!");
break;
case 16:
printf("Quat phong ngu 2 da tat!");
78

break;
case 17:
printf("Cua da mo!");
break;
case 18:
printf("Cua da dong!");
break;
case 19:
if(s_dk1 == 1) printf("Den pk bat!\r");
else printf("Den pk tat!\r");
if(s_dk2 == 1) printf("Den pn1 bat!\r");
else printf("Den pn1 tat!\r");
if(s_dk3 == 1) printf("Den pn2 bat!\r");
else printf("Den pn2 tat!\r");
if(s_dk4 == 1) printf("Den nb bat!\r");
else printf("Den nb tat!\r");
if(s_dk5 == 1) printf("Den toilet bat!\r");
else printf("Den toilet tat!\r");
if(s_dk6 == 1) printf("Quat pk bat!\r");
else printf("Quat pk tat!\r");
if(s_dk7 == 1) printf("Quat pn1 bat!\r");
else printf("Quat pn1 tat!\r");
if(s_dk8 == 1) printf("Quat pn2 da bat!\r");
else printf("Quat pn2 tat!\r");
if(s_cua == 1) printf("Cua dang mo!\r");
else printf("Cua dang dong!\r");
printf("Nhiet do: %u do C\r",nhiet_do);
break;
case 20:
79

printf("Dang Ky Thanh Cong SDT: ");


printf(sdt);
break;
case 21:
printf("Bao dong, nha dang chay!\r");
printf("Nhiet do lon hon %u do C\r",nhiet_do_max);
break;
case 22:
printf("Bao dong, co nguoi dot nhap!\r");
break;
case 23:
printf("Bao dong, ro ri khi gas!\r");
break;
};
delay_ms(1000);
putc(26);
delay_ms(5000);
}
#INT_RDA //Ngắt UART nhận
void rda_isr(){
c = getchar(); //Đọc bộ đệm nhận
if(c == '#'){c1 = c; counter_buffer = 0;};
if(c == '.' && c1 == '#'){sms_mode = true; c1 = 0;};
if(counter_buffer > buffer_size){counter_buffer = 0;};
buffer[counter_buffer] = c;
counter_buffer ++;
}

You might also like