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 :

: carriage return (0x0D).

: 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 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 :

ATZOK

13

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

ATE0OK

(3) AT+CLIP=1 đị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 :

RING

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

RING

+CLIP:”0922050808”,129,””,,””,0,

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 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 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 :

OK

(6) AT+CNMI=2,0,0,0,0 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 : OK 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

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: OK

(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; Quay số cần gọi.

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

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:

NO DIAL TONE

(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:

NO CARRIER

(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:

BUSY

(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 :

NO ANSWER (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 :

NO CARRIER

(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 : OK

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: RING

+CLIP:”0929047589”,129,””,0

(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 : OK 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 : OK

(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

+CMGR: ”REC

UNREAD”,”+84929047589”,,”07/05/15,09:32:05+28”

NỘI DUNG

OK

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:

> (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 OK.

(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:

+CMGS :62

20

OK.

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:

+CMS ERROR:193

+CMS ERROR:515

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 :

DC-20MHz Tần số hoạt động

POR, BOR (PWRT, OST) Reset và Delay

8K

Bộ nhớ chương trình Flash (14-bit word)

Bộ nhớ dữ liệu (byte) 368

256 Bộ nhớ dữ liệu EEPROM

(byte)

Các ngắt 15

Các Port xuất/nhập Port A, B, C, D, E

Timer 3

2 Module

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ế độ

I2C

 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.

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

32

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 :

SYNC

BRGH * 0 (Low Speed)

BRGH ■ 1 (High Speed)

0 1

(Asynchronous) Baud Rate = Fosc/(64 (X ♦ 1)) (Synchronous) Baud Rate = Fosc/(4 (X * 1))

Baud Rate = Fosc/116 (X +1)) N/A

46

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

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

- Cách thức trao đổi tín hiệu :

thông qua IC ULN2803 để kích khối relay.

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.

 IC ULN2803 đã bao gồm diode bảo vệ vi điều khiển. Do đó chúng ta

 ULN2803 có khả năng chịu được điện áp cao, lên đến 50V.

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 :

49

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

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

//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

#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

61

#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){

62

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

63

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);

64

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");

65

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);

66

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");

67

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");

68

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;

};

};

69

// 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]);

70

};

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

71

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;

72

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);

73

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 ++){

74

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;

}

75

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;

76

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!");

77

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:

78

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 ++;

}

79