Professional Documents
Culture Documents
I – MỤC TIÊU
- Thiết kế khóa số điện tử bằng mật khẩu (6 số) sử dụng chip vi xử lí họ msp430.
- Dùng bàn phím hex (16 phím) thực hiện chức năng giao tiếp.
- Dùng động cơ một chiều đóng – mở khóa bằng cách điều – khiển đảo chiều động
cơ.
- Mật khẩu có thể thay đổi được.
- Báo động ra loa và treo hệ thống khi mật khẩu nhập sai 3 lần.
II – PHƯƠNG PHÁP GIẢI QUYẾT
- Thiết kế khối điều khiển đảo chiều động cơ để đóng – mở cửa.
- Thiết kế khối báo động.
- Tìm hiểu chip xử lí và các linh kiện được sử dụng.
- Viết chương trình theo sơ đồ giải thuật.
- Liên kết các khối.
- Ráp mạch kiểm tra và chạy thử.
III – NỘI DUNG
1. SƠ ĐỒ KHỐI
KHỐI
BÀN PHÍM KHỐI XỬ LÍ
Trang 1
Hình 2: Sơ đồ giải thuật cho chương trình chính
Hình 3: Sơ đồ giải thuật cho chương trình con “Change”
3. TÌM HIỂU CHIP MSP430G2x52
P0
P1
P2
P3
P4
P5
P6
P7
1 2 3 OPEN
R4R3R2 R1
33k33k33k 33k
P1.0 4 5 6 CLOSE
EXIT 0 CLEAR OK
Các hàng và cột của bàn phím kết nối với Port 1. Bit 0,1,2,3 của Port 1 sẽ làm
ngỏ ra và kết nối với các hàng của bàn phím. Còn các bit 4,5,6,7 làm ngỏ ngỏ vào
kết nối với các cột của bàn phím.
4.4. CHỐNG DỘI CHO BÀN PHÍM
Do thời gian dội của phím vào khoảng 20ms nên để chống dội ta sẽ chống
dội bằng phần mềm để phần cứng được đơn giản.
Đoạn chương trình chống dội:
n=0;
while ( n==0 )
{
if ((P1IN&COTX) == 0) //Nút đang nhấn giữ.
n=0;
else //Nút nhả ra.
n=1;
}
Ngoài ra giữa các lần chọn hàng (hoặc cột) để quét phím ta thêm đoạn delay:
delay_cycles(5000);
5. KHỐI ĐIỀU KHIỂN ĐỘNG CƠ
5.1. SƠ ĐỒ MẠCH ĐIỀU KHIỂN ĐẢO CHIỀU ĐỘNG CƠ ĐÓNG – MỞ
CỬA
3V 3V
D1 RL2
10BQ040 RL1 D2
10BQ040
Px R1 Q2 Q1 R2 Py
330R C828 3V 330R
C828
R10 C1C2 C1 C2 C5
330R Q6 R5 Q3 ra
A1015 Ngo
C828 330R
10u 10u Q4 1u 1u 10u LS1
Q5 C828 Q2 Q1 SPEAKER
C828 C828 C828
Khối 1 Khối 2
Khi kết hợp hai khối lại cung hoạt động thì tín hiêu ở ngỏ ra cấp cho loa như hình 13:
C1 C2 R15 Q3 C3 C4 C5
Q6 ra
Ngo
330R A1015
C828
Q4 1u 1u 10u LS1
R10 Q5 10u 10u C828 Q2 Q1 SPEAKER
C828
330R C828 C828
Pz
3V
1 2 3 OPEN
R4 R3 R2 R1
33k33k33k 33k
U1 124
P2.0/ACLK/CA2 P2.1/INCLK/CA3 5 6 CLOSE
8 13
P1.0/TACLK P1.1/TA0
9 14
10 15
11 P2.2/CAOUT/TA0/CA4 P1.2/TA1 16
12 P2.3/TA1/CA0 P1.3/TA2 17 7 8 9 CHANGE
3 P2.4/TA2/CA1 P1.4/SMCLK/TCK 18
P1.5/TA0/TMS
P2.5/CA5 P1.6/TA1/TDI/TCLK P1.7/TA2/TDO/TDI
19
20
EXIT 0 CLOSE OK
7 XIN/P2.6/CA6 6
RST/NMI TEST
1 XOUT/P2.7/CA7 5
MSP430G2452
3V 3V 3V
3V 3V
D3 D4 D5 R7
LED-RED LED-RED LED-RED D1 D2 4k7
10 RL1 RL2 10
- Khi mới bắt đầu, chương trình thực hiện quét phím số và phím close (phím close
chỉ có tác dụng nếu ta chưa nhấn một phím số nào). Ở đây, chương trình yêu cầu
nhập password (6 số). Ngoài ra, ta có thể dùng phím clear để xóa số vừa nhập sai.
Khi nhấn một phím chương trình sẽ báo hiệu (đèn sáng) một lần.
- Khi nhập password xong ta nhấn ok:
+ Nếu password sai thì báo động và cho nhập lại, khi nhập sai 3 lần, hệ thống
treo trong 1 phút sau đó trở về chương trinh ban đầu và cho nhập tiếp.
+ Nếu password đúng sẽ báo hiệu (đèn chớp), sau đó chương trình thực hiện đến
đoạn quét phím chức năng.
- Ở đoạn chương trình quét phím chức năng:
+ Nếu nhấn open thì ra lệnh điều khiển mở rồi trở về đoạn quét phím chức năng.
+ Nếu nhấn close thì ra lệnh đóng và trở về chương trinh ban đầu.
+ Nếu nhấn change để thay đổi password sau đó trở về chương trinh ban đầu.
- Sau khi nhấn phím change, ta cần thực hiện nhập password hai lần (cách nhập
pass tương tự như ở đầu chương trình, tức là sau khi nhập đủ 6 số ta cần nhấn
phím ok), chương trình sẽ ra báo hiệu giữa hai lần nhập.
+ Nếu password giữa hai lần nhập không giống nhau thì ra báo động sau đó cho
nhập tiếp. Nếu sai 3 lần hệ thống bị treo trong 1 phút rồi trở về chương trình ban
đầu.
+ Nếu password giữa hai lần nhập giống nhau, chương trình sẽ lưu và thay đổi
password sau đó trở về chương trình ban đầu.
Ngoai ra, ta có thể nhấn Exit để trở về chương trình ban đầu khi không muốn thay
đổi password nữa.
/*…………………………………………………………………………………*/
#include "io430.h"
#include "intrinsics.h"
#define COT0 BIT0
#define COT1 BIT1
#define COT2 BIT2
#define COT3 BIT3
#define COT4 BIT4
#define COT5 BIT5
#define COT6 BIT6
#define COT7 BIT7
intrinsic void delay_cycles(unsigned long cycles);
/*........................Doan quet phim so va nhap pass.....................*/
void quetphim (int *nhappass,int *p)
{
int i=0,n=0;
while(i < 6)
{
P1OUT = 0x0E; /*.................Chon hang thu 1...............*/
delay_cycles(5000);
if ((P1IN&COT4) == 0) //Nhap so 1
{
P2OUT |= COT3;
nhappass[i] = 1;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT5) == 0) //Nhap so 2
{
P2OUT |= COT3;
nhappass[i] = 2;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT5) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT6) == 0) //Nhap so 3
{
P2OUT |= COT3;
nhappass[i] = 3;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else //Khong nhap
P2OUT &= ~COT3;
P1OUT = 0x0D; /*.................Chon hang thu 2...............*/
delay_cycles(5000);
if ((P1IN&COT4) == 0) //Nhap so 4
{
P2OUT |= COT3;
nhappass[i] = 4;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT5) == 0) //Nhap so 5
{
P2OUT |= COT3;
nhappass[i] = 5;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT5) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT6) == 0) //Nhap so 6
{
P2OUT |= COT3;
nhappass[i] = 6;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT7) == 0) //Nhan close.
{
if (*p==1)
{
if (i==0)
{
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{
P2OUT &= ~COT3;
n=0;
while ( n<4 )
{
P2OUT |= COT1;
delay_cycles(35000);
P2OUT &= ~COT1;
delay_cycles(35000);
delay_cycles(35000); n+
+;
}
n=1;
}
}
}
}
}
else //Khong nhap
P2OUT &= ~COT3;
P1OUT = 0x0B; /*.................Chon hang thu 3...............*/
delay_cycles(5000);
if ((P1IN&COT4) == 0) //Nhap so 7
{
P2OUT |= COT3;
nhappass[i] = 7;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT5) == 0) //Nhap so 8
{
P2OUT |= COT3;
nhappass[i] = 8;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT5) == 0)
n=0;
else
n=1;
}
}
else if ((P1IN&COT6) == 0) //Nhap so 9
{
P2OUT |= COT3;
nhappass[i] = 9;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else //Khong nhap
P2OUT &= ~COT3;
P1OUT = 0x07; /*.................Chon hang thu 4...............*/
delay_cycles(5000);
if (*p==0)
{
if ((P1IN&COT4) == 0) //Nhan nut Exit
{
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
{ n=
1;
i=7;
*p = *p+1;
P2OUT &= ~COT3;
}
}
}
}
if ((P1IN&COT5) == 0) //Nhap so 0
{
P2OUT |= COT3;
nhappass[i] = 0;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT5) == 0)
n=0;
else
{ n=
1;
P2OUT &= ~COT3;
}
}
}
else if ((P1IN&COT6) == 0) //Xoa so vua nhap
{
if ( i >0 ) //Neu bang i = 1 khong xoa
{
i--;
P2OUT |= COT3;
}
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else //Khong nhap
P2OUT &= ~COT3;
/*......................Chon nhan ok hay exit hoac clear.....................*/
while (i==6) //Xoa so vua nhap khi i = 5.
{
P1OUT = 0x07; //chon hang thu
4 if ((P1IN&COT7) == 0) //Nhan
ok
{
P2OUT |= COT3;
i++;
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{ n=
1;
P2OUT &= ~COT3;
}
}
}
else if ((P1IN&COT6) == 0) //Xoa so vua nhap
{
if ( i > 0 ) //Neu bang i = 0 khong xoa
{
i--;
P2OUT |= COT3;
}
n=0;
while ( n==0 )
{
if ((P1IN&COT6) == 0)
n=0;
else
n=1;
}
}
else if (*p==0)
{
if ((P1IN&COT4) == 0) //Nhan nut Exit
{
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT4) == 0)
n=0;
else
{ n=
1;
i=7;
*p = *p+1;
P2OUT &= ~COT3;
}
}
}
}
else //Khong nhap
P2OUT &= ~COT3;
}
/*................Ket thuc doan cho nhan ok hay exit hoac clear..............*/
}
}
/*.....................Ket thuc doan quet phim so va nhap pass...............*/
/*...........................Doan so sanh pass...............................*/
void sosanh (int nhappass[6],int *i,int a,int b,int c,int d,int e,int h)
{
if (*i==0)
{
if(nhappass[*i] == a)
{
*i = *i+1;
if(nhappass[*i] == b)
{
*i = *i+1;
if(nhappass[*i] == c)
{
*i = *i+1;
if(nhappass[*i] == d)
{
*i = *i+1;
if(nhappass[*i] == e)
{
*i = *i+1;
if(nhappass[*i] == h)
*i = *i+1;
}
}
}
}
}
}
else
*i = 7;
}
/*.........................Ket thuc doan so sanh pass........................*/
/*............................Doan treo he thong.............................*/
void treohethong (void)
{
int j;
P2OUT |= COT3;
j=0;
while (j<=60)
{
delay_cycles(1000000); j+
+;
}
P2OUT &= ~COT3;
}
/*...........................Ket thuc doan treo he thong.....................*/
/*............................Doan den chop tat..............................*/
void denchop (void)
{
int j=0;
while (j<=10)
{
P2OUT ^= COT3;
delay_cycles(50000);
j++;
}
P2OUT &= ~COT3;
}
/*...........................Ket thuc doan den chop tat......................*/
/*.................................Doan lo keu...............................*/
void loakeu(void)
{
P2OUT |= COT0;
delay_cycles(500000);
P2OUT &= ~COT0;
}
/*............................Ket thuc doan lo keu...........................*/
/*.....................Doan khai bao bien ngoai chuong trinh.................*/
int j=0,i,k,n,m,p,g;
int nhappass[6],passdoi[6];
int
a=3,b=5,c=7,d=1,e=5,h=9;
/*.....................Doan chuong trinh chinh...............................*/
void main( void )
{
WDTCTL = WDTPW + WDTHOLD;
BCSCTL1 =
CALBC1_1MHZ; DCOCTL =
CALDCO_1MHZ; P2DIR =
0xFF;
P2OUT = 0x00;
P1DIR = 0x0F; //port 1.0,1.1,1.2,1.3 ngo ra,port 1.4,1.5,1.6,1.7 ngo
vao. while(1)
{
P2OUT = 0x00;
p=1;
quetphim(nhappass,&p);
i=0;
sosanh(nhappass,&i,a,b,c,d,e,h);
/*...............Doan kiem tra ket qua so sanh pass.............*/
k=0;
while (k==0)
{
if ( i == 6 )//Nhap pass dung.
{
denchop ();
m=0; //Cho phep vong lap quet phim chuc nang hoat dong.
j=0; //Gan j=0 de dem so lan nhap pass sai trong lan nhap moi.
k=1; //Gan k=1 de thoat khoi vong lap so sanh pass.
}
else //Nhap sai pass mot lan.
{ j+
+;
if (j==3)//So sanh da sai du 3 lan chua.
{
loakeu();
treohethong ();
j=0; //Gan j=0 dem so lan nhap pass sai trong lan nhap moi.
k=1; //Gan k=1 de thoat khoi vong lap so sanh pass.
m=1;
}
else //Nhap sai chua qua 3 lan.
{
loakeu();
k=1; //Gan k=1 thoat khoi doan sanh pass de nhap tiep khi j<3.
m=1; //Khong phep vong lap quet phim chuc nang hoat dong.
}
}
}
/*...................Ket thuc doan kiem tra ket qua so sanh pass.............*/
/*..............................Doan quet phim chuc nang.....................*/
while (m==0)
{
P1OUT = 0x0E; /*Quet phim open.*/
delay_cycles(5000);
if ((P1IN&COT7) == 0) /*Nhan open.*/
{
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{
P2OUT &= ~COT3;
n=0;
while ( n<4 )
{
P2OUT |= COT2;
delay_cycles(35000);
P2OUT &= ~COT2;
delay_cycles(35000);
delay_cycles(35000);
n++;
}
n=1;
}
}
}
P1OUT = 0x0D; /*Quet phim close.*/
delay_cycles(5000);
if ((P1IN&COT7) == 0) /*Nhan close.*/
{ m=
1;
P2OUT |= COT3;
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{
P2OUT &= ~COT3;
n=0;
while ( n<4 )
{
P2OUT |= COT1;
delay_cycles(35000);
P2OUT &= ~COT1;
delay_cycles(35000);
delay_cycles(35000);
n++;
}
n=1;
}
}
}
P1OUT = 0x0B; /*Quet phim change.*/
delay_cycles(5000);
if ((P1IN&COT7) == 0) /*Nhan chance de thay doi pass.*/
{
P2OUT |= COT3;
delay_cycles(500000);
n=0;
while ( n==0 )
{
if ((P1IN&COT7) == 0)
n=0;
else
{
P2OUT &= ~COT3;
n=1;
}
}
p=0; //Gan p=0 lam bien cho vong lap thay doi pass.
g=0; //Gan g=0 lam bien so sanh nhap pass sai may lan khi chon
change. while (p==0)
{
quetphim(nhappass,&p); //Nhap pass lan dau.
if (p==0)
{
P2OUT |= COT3;
delay_cycles(1000000);
P2OUT &= ~COT3;
quetphim(passdoi,&p); //Nhap pass lan hai xac nhan.
}
else
m=1;
if (p==0)
{
k=0;
while (k<6)
{
if(nhappass[k]==passdoi[k]) //So sanh hai pass vua nhap.
k++;
else
k=7;
}
if (k==6) //Luu pass vua nhap vao.
{
denchop ();
a = nhappass[0];
b = nhappass[1];
c = nhappass[2];
d = nhappass[3];
e = nhappass[4];
h = nhappass[5];
p=1; //Gan p=1 de thoat khoi vong lap khi pass da thay doi.
m=1; //Gan m=1 de thoat doan quet phim chuc nang roi ve ban dau.
}
else
{
g++; //Tang g len 1 khi nhap pass sai.
if (g == 3)
{
loakeu();
treohethong (); //Treo he thong.
p=1; //Gan p=1 de thoat khoi vong lap khi pass da thay doi.
m=1; //Gan m=1 thoat doan quet phim chuc nang roi ve ban
dau.
}
else //Nhap sai chua qua 3 lan.
{
loakeu();
}
}
}
else
m=1;
}
}
}
/*.......................Ket thuc doan quet phim chuc nang...................*/
}
/*..................Ket thuc doan kiem tra ket qua so sanh pass..............*/
}