Download as pdf or txt
Download as pdf or txt
You are on page 1of 32

TRƯỜNG ĐẠI HỌC CẦN THƠ

KHOA CÔNG NGHỆ

BÁO CÁO ĐỒ ÁN KĨ THUẬT VI XỬ LÝ

GVHD: TRẦN HỮU DANH


ĐỀ TÀI:

Cảnh báo nhiệt độ đơn giản

Sinh viên thực hiện:


Bành Phú Cường Mssv: B1509299

1
A. NỘI DUNG BÁO CÁO
I.GIỚI THIỆU CHUNG.
II. GIẢI PHÁP VÀ THIẾT KẾ :
1. SƠ ĐỒ KHỐI
2. PHÂN TÍCH CHỨC NĂNG VÀ NHIỆM VỤ CỦA CÁC KHỐI
2.1. KHỐI NGUỒN.
2.2. KHỐI BÁO ĐỘNG
2.3. KHỐI XỬ LÝ.
2.4. KHỐI CẢM BIẾN
2.5. KHỐI HIỂN THỊ
III. LINH KIỆN
VI. THIẾT KẾ:
1. Sơ đồ nguyên lý.
2. Thiết kế phần cứng

3. Thiết kế phần mềm và lưu đồ thuật toán


4. Code.
V.KẾT LUẬN.
B. PHỤ LỤC.

2
A. NỘI DUNG BÁO CÁO

I.GIỚI THIỆU CHUNG:


• Đề tài:
 Cảnh báo nhiệt độ đơn giản
• Hướng giải quyết vấn đề:
Dùng MSP430G2553 làm khối xử lý.
Sử dụng cảm biến LM35 để đo nhiệt độ.
Sử dụng SIM900A để gửi báo động đến Phone hoặc gọi trực tiếp đến cứu
hỏ (phải đăng ký với cứu hoả) bằng cách nhắn tin và gọi liên tục.
Led đơn và speaker có nhiệm vụ báo động tại chỗ.
Lcd hiển thị nhiệt độ hiện tại và nhiệt độ ngưỡng cảnh báo.
Có nút ấn tăng giảm nhiệt độ ngưỡng
Nút ngừng ngay lập tức báo động
Nút reset vi điều khiển

II. GIẢI PHÁP THIẾT KẾ :


1. Sơ đồ khối :
2. Phân tích chức năng và nhiệm vụ của các khối
2.1 . Khối nguồn :
Khối nguồn được lấy từ nguồn ổn định 5V cung cấp cho toàn mạch, đồng
thời tạo ra nguồn ổn định 3,3 cung cấp cho MSP430g2553 hoạt động.

3
2.2 . KHỐI BÁO ĐỘNG:
 LED VÀ SPEAKER

Led và speaker sẽ phát đi báo động bằng cách nhấp nhấy và hú liên tục đến khi
được tắt đi.
MODULE SIM900A

4
Giới thiệu
Đây là một mô-đun không dây siêu nhỏ gọn và đáng tin cậy. SIM900A là một giải pháp GSM /
GPRS băng tần kép hoàn chỉnh trong mô-đun SMT có thể được nhúng trong các ứng dụng
của khách hàng. Giao diện tiêu chuẩn công nghiệp, SIM900A cung cấp hiệu suất GSM / GPRS
900/1800 MHz cho thoại, SMS, Dữ liệu và Fax trong một yếu tố hình thức nhỏ và tiêu thụ điện
năng thấp. Với cấu hình nhỏ 24mmx24mmx3mm, SIM900A có thể đáp ứng hầu hết mọi yêu
cầu về không gian trong các ứng dụng của người dùng, đặc biệt là cho nhu cầu thiết kế mỏng
và nhỏ gọn.

Đặc trưng

• Băng tần kép 900/1800 MHz


• GPRS đa khe cắm loại 10 / 8GPRS trạm di động loại B
• Tuân thủ GSM giai đoạn 2/2 + Lớp 4 (2 W @ 850/900 MHz)
• Lớp 1 (1 W @ 1800/1900 MHz)
• Điều khiển thông qua các lệnh AT ( Lệnh GSM 07,07, 07,05 và SIMCOM được tăng cường)
• Tiêu thụ điện năng thấp: 1.5mA (chế độ ngủ) '
• Nhiệt độ hoạt động: -40 ° C đến +85 ° C
• Chỉ báo trạng thái (D5) : Nó sẽ nhấp nháy liên tục bất cứ khi nào cuộc gọi đến nếu không
nó được BẬT.
• Đèn LED mạng (D6) : Đèn led này sẽ nhấp nháy mỗi giây cho biết mô-đun GSM không đ
ược kết nối với mạng di động. Khi kết nối được thiết lập thành công, đèn LED sẽ nhấp nháy
liên tục cứ sau 3 giây.

5
Gửi báo động đến Phone hoặc gọi trực tiếp đến cứu hỏ (phải đăng ký với cứu hoả)
bằng cách nhắn tin và gọi liên tục.

2.3 . KHỐI VI XỬ LÝ
 MSP430G2553

Giới thiệu
MSP430G2553 là bộ vi điều khiển tín hiệu hỗn hợp công suất cực thấp với bộ định thời
16 bit tích hợp, lên đến 24 chân kích hoạt cảm ứng điện dung, bộ so sánh tương tự linh
hoạt và khả năng giao tiếp tích hợp sử dụng giao diện nối tiếp phổ quát . Ngoài ra, các
thành viên gia đình MSP430G2553 có ADC tương tự kỹ thuật số 10 bit.

Các ứng dụng điển hình bao gồm các hệ thống cảm biến chi phí thấp thu tín hiệu tương
tự, chuyển đổi chúng thành giá trị kỹ thuật số và sau đó xử lý dữ liệu để hiển thị hoặc để
truyền đến hệ thống máy chủ.

Tính năng, đặc điểm

6
2.4 . KHỐI CẢM BIẾN
Giới thiệu
Nói chung, cảm biến nhiệt độ là một thiết bị được thiết kế đặc biệt để đo độ nóng hoặc lạnh
của vật thể. LM35 là một cảm biến nhiệt độ IC chính xác với đầu ra tỷ lệ thuận với nhiệt độ
(tính bằng ° C). Với LM35, nhiệt độ có thể được đo chính xác hơn so với nhiệt điện trở. Nó cũ
ng có khả năng tự sưởi ấm thấp và không làm tăng nhiệt độ quá 0,1 ° C trong không
khí. Phạm vi nhiệt độ hoạt động là từ -55 ° C đến 150 ° C. Trở kháng đầu ra thấp, đầu ra tuyến
tính và hiệu chuẩn vốn có của LM35 giúp giao tiếp với mạch đọc hoặc điều khiển đặc biệt dễ
dàng. Nó đã tìm thấy các ứng dụng của nó về nguồn cung cấp năng lượng, quản lý pin, các
thiết bị, vvnhấp vào đây cho bảng dữ liệu.

Cảm biến nhiệt độ LM35

LM35 Cảm biến nhiệt độ Pinout

LM35 là một cảm biến mạch tích hợp có thể được sử dụng để đo nhiệt độ với đầu ra điện tỷ lệ
với nhiệt độ (tính bằng ° C). Nó có thể đo nhiệt độ chính xác hơn so với sử dụng nhiệt điện
trở. Mạch cảm biến được niêm phong và không bị oxy hóa. LM35 tạo ra điện áp đầu ra cao
hơn cặp nhiệt điện và có thể không yêu cầu điện áp đầu ra được khuếch đại. LM35 có điện áp
đầu ra tỷ lệ thuận với nhiệt độ Celsius. Hệ số tỷ lệ là. 01V / ° C.

LM35 không yêu cầu hiệu chuẩn hoặc cắt tỉa bên ngoài và duy trì độ chính xác từ +/- 0,4 ° C ở
nhiệt độ phòng và +/- 0,8 ° C trong phạm vi từ 0 ° C đến + 100 ° C. Một đặc tính quan trọng
khác của LM35 là nó chỉ thu được 60 micro ampe từ nguồn cung cấp và có khả năng tự sưởi
ấm thấp. LM35 có nhiều gói khác nhau như gói giống như bóng bán dẫn nhựa TO-92, gói kim
loại có thể bán dẫn T0-46, 8- gắn bề mặt chì SO-8 gói phác thảo nhỏ.

7
2.5 . KHỐI HIỂN THỊ
Giới thiệu

Màn hình tinh thể lỏng

Màn hình tinh thể lỏng (LCD) là màn hình phẳng được sử dụng trong đồng hồ kỹ thuật số,
máy ảnh và nhiều máy tính cầm tay. Màn hình CD sử dụng hai tấm vật liệu phân cực với dung
dịch tinh thể lỏng giữa chúng. Một dòng điện truyền qua chất lỏng làm cho các tinh thể thẳng
hàng để ánh sáng không thể đi qua chúng. Do đó, mỗi tinh thể giống như một màn trập, cho
phép ánh sáng đi qua hoặc chặn ánh sáng. LCD tiêu thụ ít năng lượng hơn nhiều so với màn
hình LED và màn hình hiển thị khí vì chúng hoạt động theo nguyên tắc chặn ánh sáng thay vì
phát ra. LCD được sử dụng trong TV màn hình phẳng, điện thoại thông minh, màn hình máy
tính, đồng hồ kỹ thuật số, v.v.

LCD có thể được chế tạo ở các kích thước khác nhau, chẳng hạn như
8x1,8x2,10x2,16x1,16x2,16x4,20x2,20x4,24x2,30x2,32x2,40x2, v.v. Ví dụ: lấy LCD 16x2 có nghĩa
là nó có thể hiển thị 16 ký tự trên mỗi dòng và có 2 dòng như vậy. Tất cả các màn hình LCD
này đều thực hiện các chức năng tương tự như ký tự hiển thị, số, ký tự đặc biệt Ký tự ASCII, v.v.
Lập trình của chúng cũng giống nhau vì tất cả chúng đều có cùng 14 chân (0-13) hoặc 16
chân (0 đến 15).

Pin Mô tả của LCD


Tất cả các màn hình LCD có 14 hoặc 16 chân. Hãy xem chúng sau đây.

• GND hoặc VSS: Mặt đất hoặc 0V


• VCC hoặc VDD: Điện áp cung cấp 5V
• VEE: Điều chỉnh độ tương phản thông qua một điện trở thay đổi

8
• RS: Đăng ký chọn. Nói chung, mỗi Lcd có hai loại thanh ghi là Đăng ký lệnh và Đăng
ký dữ liệu . Khi RS = 0 hoặc thấp, Đăng ký lệnh được chọn và Khi RS = 1 hoặc cao, Đă
ng ký dữ liệu được chọn.

Pin Mô tả của LCD

• R / W: Đọc / Ghi. Khi RW = 1 , dữ liệu được đọc từ Lcd và Khi RW = 0 , ghi dữ liệu vào
Lcd.
• EN: Cho phép gửi dữ liệu vào các chân dữ liệu khi có xung cao đến thấp.
• Tám chân dữ liệu (DB0 đến DB7): Chân 8 dữ liệu này mang dữ liệu hoặc lệnh 8 bit từ
một đơn vị bên ngoài như bộ điều khiển vi mô.
• Led +: Đèn nền của màn hình LCD nên được kết nối với Vcc hoặc 5V.
• Led-: Đèn nền của màn hình LCD nên được kết nối với Gnd hoặc 0V.

III. LINH KIỆN :


9
Vi xử lý MSP430G2553
LM35
Module SIM900a
Sim card của nhà mạng bất kỳ
Điện trở
SPEAKER
LED
Nút bấm
Công tắc

VI. THIẾT KẾ:


1. SƠ ĐỒ NGUYÊN LÝ

CÁC NÚT ĐIỀU KHIỂN LCD

SPEALER VÀ LED MSP430G2553 SIM900A

LM35 NGUỒN

10
2. Thiết kế phần cứng

11
3. Thiết kế phần mềm và lưu đồ thuật toán

12
4. CODE
Main.c
#include "msp430g2553.h"
13
#include "string.h"
#include "LCD_New1.h"
#include "uart.h"
float so;
int nguyen,le = 3;
char chuoi[10], chuoi2[5];
int buff=7*30;
int setup,b=0;
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
//--------------------------------------------------------
P2DIR |= (BIT5 + BIT4); //OUT led speaker
P1DIR |=(BIT1 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7); //out LCD
//--------------------------------------------------------
ADC10CTL0 = ADC10SHT_2 + REFON + ADC10ON + SREF_1;
ADC10CTL1 = INCH_0;
ADC10AE0 |= 0X00;
ADC10CTL0 |= ENC + ADC10SC;
//--------------------------------------------------------
// khoi tao ngat ngoai tai P2.1 và P2.2
P2IE |= BIT0+BIT1;
P2IES |= BIT0+BIT1;
P2IFG &= ~(BIT1+BIT2);
// Khai bao dien tro keo len tai P2.1 và P2.2
P2REN |= BIT0 + BIT1;
P2OUT |= BIT0 + BIT1;
//--------------------------------------------------------
P2DIR &= ~BIT3;
P2REN |= BIT3;
P2OUT |= BIT3;
//--------------------------------------------------------
BCSCTL1 = CALBC1_1MHZ;
DCOCTL = CALDCO_1MHZ;
P1SEL = BIT2 ;
P1SEL2 = BIT2 ;
UCA0CTL1 |= UCSSEL_2;
UCA0BR0 = 104;

14
UCA0BR1 = 0;
UCA0MCTL = UCBRS0;
UCA0CTL1 &= ~UCSWRST;
__enable_interrupt();
//--------------------------------------------------------
InitializeLcm();
ClearLcmScreen();
_BIS_SR(GIE);
while(1)
{
so = ((float)(ADC10MEM*150)/1023);
nguyen= (int) so/1; //lay phan nguyen
le = (int)((so - nguyen)*10000); //lay phan le cua tp
ftoa(chuoi,nguyen-2,le); // chuyen no sang chuoi\
//--------------------------------------------------------
ADC10CTL0 = ADC10SHT_2 + REFON + ADC10ON + SREF_1;
ADC10CTL1 = INCH_0;
ADC10AE0 |= 0X00;
ADC10CTL0 |= ENC + ADC10SC;
//--------------------------------------------------------
setup=buff/7;
songuyen(chuoi2,setup-2);
//-------------------------------------------------
LcmSetCursorPosition(0,0);
PrintStr("SETUP");
LcmSetCursorPosition(0,7);
PrintStr(chuoi2);
LcmSetCursorPosition(1,0);
PrintStr("NHIETDO");
LcmSetCursorPosition(1,7);
PrintStr(chuoi);
__delay_cycles(100000);
//--------------------------------------------------------
if(ADC10MEM < buff) // So sanh nhiet do nguong do nguoi dung setup
P2OUT &= ~(BIT5 + BIT4); // Clear P2.5 LED off
else
{
goi(sdt);

15
for(int i=0;i<=100;i++)
{
P2OUT |= (BIT5 + BIT4); // Set P2.5 LED on
__delay_cycles(100000);
P2OUT &= ~(BIT5 + BIT4); // Set P2.5 LED off
__delay_cycles(100000);
}

sendsms(sdt,tinnhan);

}
if(!(P2IN&BIT3))
{
break;
}
}
}
#pragma vector=PORT2_VECTOR
__interrupt void UP_DOWN(void)
{
if(P2IFG&BIT0)
{
buff +=7;
if(buff>=1023)
buff=1023;
P2IFG &= ~BIT0;
}
if(P2IFG&BIT1)
{
buff -=7;
if (buff<=0)
buff=7;
P2IFG &= ~BIT1;
}
}

16
LCD.h
//
// MSP430 LCD Code
//
#include "msp430g2553.h"

#define LCM_DIR P1DIR


#define LCM_OUT P1OUT

//
// Define symbolic LCM - MCU pin mappings
// We've set DATA PIN TO 4,5,6,7 for easy
translation
//
#define LCM_PIN_RS BIT1 // P1.5
#define LCM_PIN_EN BIT3 // P1.4
#define LCM_PIN_D7 BIT7 // P1.0
#define LCM_PIN_D6 BIT6 // P1.1
#define LCM_PIN_D5 BIT5 // P1.2
#define LCM_PIN_D4 BIT4 // P1.3

#define LCM_PIN_MASK ((LCM_PIN_RS |


LCM_PIN_EN | LCM_PIN_D7 | LCM_PIN_D6 |
LCM_PIN_D5 | LCM_PIN_D4))
17
#define FALSE 0
#define TRUE 1

//
// Routine Desc:
//
// This is the function that must be called
// whenever the LCM needs to be told to
// scan it's data bus.
//
// Parameters:
//
// void.
//
// Return
//
// void.
//
void PulseLcm()
{
//
// pull EN bit low
//
LCM_OUT &= ~LCM_PIN_EN;
18
__delay_cycles(200);

//
// pull EN bit high
//
LCM_OUT |= LCM_PIN_EN;
__delay_cycles(200);

//
// pull EN bit low again
//
LCM_OUT &= (~LCM_PIN_EN);
__delay_cycles(200);
}

//
// Routine Desc:
//
// Send a byte on the data bus in the 4 bit mode
// This requires sending the data in two chunks.
// The high nibble first and then the low nible
//
// Parameters:
//
// ByteToSend - the single byte to send
19
//
// IsData - set to TRUE if the byte is character data
// FALSE if its a command
//
// Return
//
// void.
//
void SendByte(char ByteToSend, int IsData)
{
//
// clear out all pins
//
LCM_OUT &= (~LCM_PIN_MASK);

//
// set High Nibble (HN) -
// usefulness of the identity mapping
// apparent here. We can set the
// DB7 - DB4 just by setting P1.7 - P1.4
// using a simple assignment
//
LCM_OUT |= (ByteToSend & 0xF0);

if (IsData == TRUE)
20
{
LCM_OUT |= LCM_PIN_RS;
}
else
{
LCM_OUT &= ~LCM_PIN_RS;
}
//
// we've set up the input voltages to the LCM.
// Now tell it to read them.
//
PulseLcm();

//
// set Low Nibble (LN) -
// usefulness of the identity mapping
// apparent here. We can set the
// DB7 - DB4 just by setting P1.7 - P1.4
// using a simple assignment
//
LCM_OUT &= (~LCM_PIN_MASK);
LCM_OUT |= ((ByteToSend & 0x0F) << 4);

if (IsData == TRUE)
{
21
LCM_OUT |= LCM_PIN_RS;
}
else
{
LCM_OUT &= ~LCM_PIN_RS;
}

//
// we've set up the input voltages to the LCM.
// Now tell it to read them.
//
PulseLcm();
}

//
// Routine Desc:
//
// Set the position of the cursor on the screen
//
// Parameters:
//
// Row - zero based row number
//
// Col - zero based col number
//
22
// Return
//
// void.
//
void LcmSetCursorPosition(char Row, char Col)
{
char address;

//
// construct address from (Row, Col) pair
//

if (Row == 0)
{
address = 0;
}
else
{
address = 0x40;
}

address |= Col;
SendByte(0x80 | address, FALSE);
}

23
//
// Routine Desc:
//
// Clear the screen data and return the
// cursor to home position
//
// Parameters:
//
// void.
//
// Return
//
// void.
//
void ClearLcmScreen()
{
//
// Clear display, return home
//
SendByte(0x01, FALSE);
SendByte(0x02, FALSE);
}
//void ktdo()
//{
// //
24
// // Clear display, return home
// //
// SendByte(0x0B, TRUE);
// SendByte(0x00, TRUE);
//}
//void ClearCursor()
//{
// //
// // Clear display, return home
// //
// SendByte(0x00, FALSE);
// SendByte(0x0C, FALSE);
//}

//
// Routine Desc:
//
// Initialize the LCM after power-up.
//
// Note: This routine must not be called twice on the
// LCM. This is not so uncommon when the power
// for the MCU and LCM are separate.
//
// Parameters:
//
25
// void.
//
// Return
//
// void.
//
void InitializeLcm(void)
{
//
// set the MSP pin configurations
// and bring them to low
//
LCM_DIR |= LCM_PIN_MASK;
LCM_OUT &= ~(LCM_PIN_MASK);
//
// wait for the LCM to warm up and reach
// active regions. Remember MSPs can power
// up much faster than the LCM.
//
__delay_cycles(100000);

//
// initialize the LCM module
//
// 1. Set 4-bit input
26
//
LCM_OUT &= ~LCM_PIN_RS;
LCM_OUT &= ~LCM_PIN_EN;

LCM_OUT = 0x20;
PulseLcm();

//
// set 4-bit input - second time.
// (as reqd by the spec.)
//
SendByte(0x28, FALSE);

//
// 2. Display on, cursor on, blink cursor
//
SendByte(0x0E, FALSE);

//
// 3. Cursor move auto-increment
//
SendByte(0x06, FALSE);
SendByte(0x0c, FALSE);
}

27
//
// Routine Desc
//
// Print a string of characters to the screen
//
// Parameters:
//
// Text - null terminated string of chars
//
// Returns
//
// void.
//
void PrintStr(char *Text)
{
char *c;
c = Text;

while ((c != 0) && (*c != 0))


{
SendByte(*c, TRUE);
c++;
}
}
void ftoa(char *string, int a, int b)
28
{
string[0]=a/1000+0x30;
string[1]=(a%1000)/100+48; //tram
string[2]=((a%1000)%100)/10+48; //chuc
string[3]=((a%1000)%100)%10+48; // don vi
string[4]=44;
string[5]=b/1000+0x30;
string[6]=(b%1000)/100+48; //trbm
string[7]=((b%1000)%100)/10+48; //chuc
string[8]=((b%1000)%100)%10+48; // don vi
}
void songuyen(char *string, int d)
{
string[0]=d/1000+0x30;
string[1]=(d%1000)/100+48; //tram
string[2]=((d%1000)%100)/10+48; //chuc
string[3]=((d%1000)%100)%10+48; // don vi
}

UART.H
#include "msp430g2553.h"
#include "string.h"
char i, *sdt="0835805520", *tinnhan="alo chay nha
roi alo (-_-)";
//----------------------gui tex--------------------------
29
void send_text(char a)
{
while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=a;
__delay_cycles(20000);
}
//----------------------gui chuoi ---------------------------
--

void send_str(char chuoi[])


{
while(chuoi[i]!='\0')
{ while (!(IFG2&UCA0TXIFG));
UCA0TXBUF=chuoi[i];
__delay_cycles(20000);
i++;}
i=0;
}
//--------------------------gui lenh ------------------------

void sendcmd(char cmd[],char dk)


{
while(cmd[i]!='\0')
{
while (!(IFG2&UCA0TXIFG));
30
UCA0TXBUF=cmd[i];
__delay_cycles(20000);
i++;
}
UCA0TXBUF=dk;
__delay_cycles(20000);
i=0;
}
//----------------------gui tin nhan (ny chang han) -----
------------------------
void sendsms(char*sdt,char *tinnhan)
{
send_str("AT+CMGS=");
send_text('"');
send_str(sdt);
send_text('"');
send_text(13);
__delay_cycles(200000);
sendcmd(tinnhan,26);
//__delay_cycles(2000000);
}

//----------------------ham goi ----------------------------


-
void goi(char *sdt)
31
{
send_str("ATD");
send_str(sdt);
send_text(';');
send_text(13);
//__delay_cycles(200000);
}

32

You might also like