Professional Documents
Culture Documents
ĐỒ ÁN VI XỬ LÝ
Đề bài : Thiết kế bộ đếm sản phẩm dùng cảm biến hồng ngoại
I Giới thiệu về mạch và sơ đồ khối
Mạch sử dụng cảm biến hồng ngoại để đếm sản phẩm đi qua một vị trí cô định trên băng
truyền.
Mạch đếm sản phẩm bằng phương pháp đếm xung nên mỗi khi sản phẩm đi qua băng
chuyền thì cần có mạch để chuyển tín hiệu từ cảm biến thành dạng xung.Ta goi phần nay
la mạch điều chế.
Xung tao ra sẽ được đưa qua khối xử lý để tiến hành đếm sau đó số sản phẩm được hiển
thị lên máy tính.
Vì vi điều khiển sử dụng mức logic TTL còn máy tính thì được thiết kế cổng COM theo
chuẩn RS232 nên để giao tiếp giữa vi điều khiển và máy tính chúng ta cần có một mạch để
chuyển đổi mức tín hiệu.
Từ đó ta có sơ đồ khối như sau:
Cảm Xử
biến lý Chuyển Hiển
và và đổi mức thị
điều tính tín
chế toán hiệu lên
LCD
R 1 R 2
D 1
L E D
U 3
1 3 U 2 A
8
3 +
2 4 1 I N _ T H
2 -
V R 1
L M 3 5 8
4
S W 2
C 6
1 0 u F
R E S E T R S T
R 2
1 0 K
-Mạch tạo dao động (89s52 có thể lấy tần số thạch anh từ 0 33Mhz)
ở đây ta lấy tần số là 12 Mhz để hiện thị lên LCD
C 1
X 1
3 3 p F
Y 1
C 2 1 2 M H z
X 2
3 3 p F
b/ Ngắt (interrupt)
- 89s52 có 6 nguồn gây ngắt : ngắt ngoài 0,ngắt ngoài 1,ngắt timer 0,timer 1, timer 2,ngắt
do port nối tiếp
Chúng ta sử dụng ngắt ngoài 0 để đếm xung.Với phương pháp này,nếu sản phẩm đi qua
băng tải khi vi điều khiển đang bận xử lý thì chúng ta vẫn đếm được.Do đó sẽ cho kết
quả chính xác hơn.
- Ngắt ngoài 0 lấy tín hiệu đầu vào là chân INT0 (P3.2).Có hai kiểu gây ngắt đó là ngắt
theo mức “0“ và ngắt theo sườn âm.Khi có tín hiệu ngắt vào chân INT0 thì cờ IE0 được
dựng lên yêu cầu phục vụ ngắt.IE0 được xóa bởi phần mềm.
Có 2 thanh ghi điều khiển ngắt đó là:
- Thanh ghi cho phép/cấm ngắt IE
Bit Ký hiệu Địa chỉ bit Mô tả
- 2 bit IT0,IT1 nằm trong thanh ghi TCON dùng để chọn kiểu ngắt.IT0=0 cho ta kiểu ngắt
theo mức “0”,IT0=1 cho ta kiểu ngắt theo sườn âm.Trong bài này ta sử dụng ngắt theo
sườn âm.Code thiết lập ngắt :
EA=EX0=1; // cho phep ngat 0
IT0=1; // ngat bang suon am
c/ Timer 1
Chúng ta dùng timer 1 ở chế độ 2 (tự nạp lại 8 bít – auto- reload)
Sơ đồ hoạt động của time 0 va 1 ở chế độ này là :
VCC
270
R1
LCD1
R2
1K LD1
R3
220 3 IC1A RS 1 39
8
T2/P1.0 P0.0/AD0
OP1 1 RW 2 38
T2 EX/P1.1 P0.1/AD1
2 EN 3 37
P1.2 P0.2/AD2
LCD 16x2A
VR1 4 36
GND
VDD
VSS
RS
R/W
EN
D0
D1
D2
D3
D4
D5
D6
D7
A
K
10K P1.3 P0.3/AD3
5 35
4
P1.4 P0.4/AD4
6 34
1
2
3
4
5
6
7
8
9
P1.5 P0.5/AD5 GND
10
11
12
13
14
15
16
Optoisolator1 7 33
P1.6 P0.6/AD6
8 32 GND R4
P1.7 P0.7/AD7
EN
VCC
RS
RW
D0
D1
D2
D3
D4
D5
D6
D7
10 21 D0
RXD/P3.0 P2.0/A8 220
11 22 D1 VCC
TXD/P3.1 P2.1/A9
VCC 12 23 D2
INT0/P3.2 P2.2/A10 VR2
GND 13 24 D3
INT1/P3.3 P2.3/A11 10K
14 25 D4
T0/P3.4 P2.4/A12
15 26 D5
T1/P3.5 P2.5/A13
C1 16 27 D6
WR/P3.6 P2.6/A14
10uF 17 28 D7
RD/P3.7 P2.7/A15
2
SW1
9 31 GND
RESET EA/VPP VCC
18 30
XTAL1 ALE/PROG
1
X1 19 29
XTAL2 PSEN
IC2
11.0592 VCC
C2 C3 D1
33 33 1 3
R5 1 IN OUT
10K 2
GND
HD1
C4 C7 C5 C6 R6
2
GND
LD2
GND
Mạch in
3
20 19 18 17 16 15 14 13 12 10 9 8 7 6 5 3 2 1
2 1
2 1
2
1 2 1
2 2 1 2
2 1
2
1 1
1
1
2 1
2
21 22 23 24 25 26 27 28 0 30 31 32 33 34 35 36 37 38 39 40
3 3 4
2 1 1 2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2
1 2
1 8
2 7
2 1
3 6
4 5 1 2 3 2 1 2
1 2 1
1 2
1 2
1 2
VI:CODE
#include<reg52.h>
#include<stdio.h>
#include<math.h>
sbit RS = P1^0;
sbit RW= P1^1;
sbit EN= P1^2;
unsigned char y;
char x;
int num;
int t;
float v;
unsigned char message[32];
void delay30ms(void)
{
TMOD=0x10;
TH1=35535/256;
TL1=35535%256;
TR1=1;
while(!TF1);
TR1=TF1=0;
}
void delay(unsigned long int m)
{
EN=1;
delay(50);
EN=0;
delay(50);
}
void write_string(char *s)
{
while(*s)
{
write_data(*s);
s++;
}
}
void init(void)
write_command(0x03);
write_command(0x38);
write_command(0x06);
write_command(0x0e);
}
void hienthi(void)
{//write_command(0x01);
// write_command(0x80);
sprintf(&message[0]," \n ssp = %d sp ",num);
write_string(&message[0]);
delay(20000);
}
void main(void)
{
IE=0x84;
IT1=1;
num=0;
delay30ms();
init();
write_command(0x01);
write_command(0x80);
sprintf(&message[0],"N. SV THUC HIEN: \n Bui Thanh Son ");
write_string(&message[0]);
delay(20000);
write_command(0x01);
write_command(0x80);
sprintf(&message[0],"sinh vien 2. \n Bui Van Son ");
write_string(&message[0]);
delay(20000);
write_command(0x01);
write_command(0x80);
sprintf(&message[0],"sinh vien 3. \n Le Trong Thanh ");
write_string(&message[0]);
delay(20000);
write_command(0x01);
write_command(0x80);
sprintf(&message[0],"so san pham:");
write_string(&message[0]);
while(1)
{
hienthi();
delay30ms();
}
}
void dsp(void) interrupt 2
{
++num;
}