Professional Documents
Culture Documents
được một mạch đếm sản phẩm, thấy có nhiều bác lên mạng tìm kiếm tài
liệu cực quá vì đa số mọi người trên mạng ít khi chia sẻ hết cho mọi người,
hôm nay mình sẻ nói một cách chi tiết nhất có thể để các bạn có thể dể
dàng hơn trong việc làm mạch đếm sản phẩm này.
Đây là một mạch đếm sản phẩm ứng dụng vi điều khiển mcs_51 dùng thu
phát hồng ngoại, tăng số lượng sản phẩm lên bằng kỷ thuật đếm xung, sử
dụng phương pháp quét led để hiển thị số đếm và có khả năng dừng băng
truyền
Bây giờ chúng ta bắt đầu nhé: Giới thiệu sơ qua cho các bác biết trong
mạch có những gì nhé : để làm mạch này thì chúng ta có 3 khối chính đó là
khối phát hồng ngoại , khối thu hồng ngoại, khối hiển thị và dĩ nhiên là
không thể thiếu bộ xử lý trung tâm rồi đúng không, các bác dùng vi điều
khiển họ 8051 nhé (ở đây mình dùng con 89c51)
Khối phát hồng ngoại: dùng timer0 để phát xung 38khz ở một chân của
89c51 ở đây mình chọn chân p1.5, còn vấn đề phát như thế nào thì mình
sẻ nói sau.
Còn đây là sơ đồ mạch phát:
ở đây mình dùng cách ghép darlington để khuếch đại tín hiệu đưa ra từ
chân p1.5 vì tín hiệu từ 89c51 rất bé nên chúng ta cần khuếch đại dòng
cho nó để đủ sáng led, Q1,Q2 các bác dùng loại NPN nhé ở đây mình
dùng con C1815. Nói sơ qua cho các bác hiểu nguyên lý hoạt động của nó
nhé: chúng ta phát dạng xung vuông có tần số là 38khz tức là chân p1.5
của 89c51 sẻ liên tục đảo chiều cứ lên 1 rồi lại xuống 0, khi p1.5 lên 1 thì
Q1 dẫn lúc đó có dòng Vcc chạy từ cực C xuống E của Q1, vì cực E của
Q1 nối với cực B của Q2 nên khi Q1 dẫn thì cực B của Q2 có dòng nên Q2
cũng dẫn và có dòng chạy từ Vcc qua cực C và xuống E của Q2 rồi qua
led phát hồng ngoại qua điện trở rồi xuống mass, lúc này led phát hồng
ngoại sáng còn khi chân p1.5 xuống mức 0 thì Q1 và Q2 không dẫn nên
led phát hồng ngoại tắt.
khối thu hồng ngoại : có chức năng là phát hiện sự mất xung ( có sản
phẩm đi qua ) và đưa về con 89c51 để xử lý tăng số đếm lên 1 đơn vị
Nguyên lý hoạt động: khi có sản phẩm đi qua thì led thu hồng ngoại bị che
khuất lúc này có dòng đi từ Vcc qua led thu hồng ngoại ròi qua cực B của
Q3 lúc này Q3 dẫn, cực C của Q3 xuống mức thấp lúc này tụ C4 xả điện
qua diode qua Q3 và xuống mass lúc này chân số 2 của LM555 được kích
và tạo ra một xung ở chân số 3 đưa về cho ic89c51 xử lý. (chân số 3 của
LM555 được nối vào chân P3.2 của 89c51 tức là chân 12 )
Biến trở R18 dùng để điều chỉnh tốc độ nhận dạng sản phẩm đi qua, khi có
sản phẩm đi qua thì led thu hồng ngoại bị che khuất ta có sơ đồ mất xung
như sau.
Khối hiển thị : dùng để hiển thị số lượng sản phẩm đã đi qua.
Q4 và Q5 dùng loại PNP ở đây mình dùng A1015. Còn R13, R14 thì các
bác chọn khoảng 10k còn trở R5 đến R12 thì các bác chọn sao cho led đủ
sáng nhé (nên chọn giá trị nhỏ thôi ) còn bác nào mà sợ tốn trở thì làm thế
này bỏ R5 đến R12 đi ta cứ nối thẳng nó vào Port0 của 89c51 thay vào đó
là ta sẻ gắn cho nó một con trở ở cực C của Q4 và Q5 là khoảng 220Ω các
bác cứ chọn sao cho led đủ sáng là được. Ở đây mình dùng led Anot
chung ( loại Anot chung này chân chung được nối lên nguồn )
Led 7đoạn các bác về giải mã nó nhé.
Đây là hình dạng của led
Các bác dùng VOM để ở thang đo điện trở nhỏ nhất rồi đưa que đỏ vào
chân số 3 hoặc chân số 8 que còn lại lần lượt đưa vào các chân
1,2,4,5,6,7,9,10 xem đâu là a, đâu là b… ( lưu ý là VOM trên thị trường có
loại của trung quốc thì que đỏ là cực âm và que đen là cực dương các bác
chú ý nhé nếu là loại này thì phải làm ngược lại đưa que đen vào chân số
3 hoặc 8 còn que kia thì đo các chân còn lại )
Còn ở đây mình giải mã ra được : 1:e 2:d 3:Vcc 4:c 5:dp 6:b 7:a 8:Vcc 9:f
10:g
Các bác nối chân của led vào port0 như thế này nhé: “a” nối vào chân P0.7
( tức là chân 32 của 89c51 ) lần lượt cho tới “dp” nối vào chân P0.0 (tức là
chân 39 của 89c51)
Như vậy là xong phần cứng bây giờ chúng ta thử cho nó hiển thị lên số 0
nhé. Quy tắc là như thế này khi ta cho phép dòng đi qua con led thì led tích
cực và muốn cho chổ nào sáng thì ta cho chổ đó về 0 giả sử muốn cho led
đơn vị sáng lên số 0 thì ta điều khiển sao cho chân p1.7 lên mức 1 và chân
p1.6 về mức 0 như vậy là led đơn vị được cho phép và muốn hiển thị lên
số 0 thì ta cần làm cho các thanh led a,b,c,d,e,f sáng để cho nó sáng thì
các chân này sẻ về mức 0 (cụ thể như con led mình đã giải mã thì mình
điều khiển con 89c51 để cho chân 1,2,4,6,7,9, của led về mức 0 vậy là sẻ
có số 0 hiển thị trên led đơn vị ) như vậy thì muốn hiển thị số 0 thì P0 cần
xuất ra giá trị là 00000011 tức là 03H tương tự số 1 là chân "b,c" sáng và
port0 cần xuất ra giá trị là 10011111 tức là F9H tương tự ta có được bảng
số như sau: 0 = 03H; 1 = 9FH; 2 = 25H; 3 = 0DH; 4 = 99H; 5 = 49H; 6 =
41H; 7 = 1FH; 8 = 01H ; 9 = 09H
Chương trình đếm sản phẩm: chúng ta sử dụng ngắt ngoài 0. Khi phát hiện
mất xung ( có sản phẩm đi qua) chân P3.2 xuống mức thấp và lúc này xảy
ra ngắt ngoài 0. Trong chương trình ngắt ngoài 0 chúng ta tăng số đếm lên
1 đơn vị và so sánh nó với giá trị là 100 khi nó đạt đến 100 thì reset nó về
0
ta có đoạn chương trình ngắt ngoài 0:
EX0_ISR:
INC R7 ; tăng số đếm lên 1 đơn vị
CJNE R7,#100,EXIT ;so sánh R7 với 100 nếu chưa = 100 thì nhảy tởi
EXIT còn nếu bằng 100 thì xóa nó về 0
MOV R7,#0
EXIT: RETI
Còn bác nào muốn dừng băng truyền thì trong chương trình ngắt ngoài 0
ta so sánh số đếm với các giá trị định sẳn chẳng hạn như các giá trị
20,40,60,80,100, khi số đếm bằng các giá trị này thì cho dừng bằng truyền
trong 5s rồi cho băng truyền hoạt động trở lại.
ta có lại đoạn chương trình ngắt ngoài 0 như sau:
Trong chương trình TIEPTUC chúng ta sẻ cho dừng băng truyền nhưng ở
đây mình chỉ làm mô phỏng nên mình thay cái động cơ điều khiển băng
truyền là một con led khi led sáng thì báo hiệu là đang dừng băng truyền.
Trong main chúng ta nạp các giá trị ban đầu cho phép ngắt và tách số BCD
rồi hiển thị lên LED dùng phương pháp quét led ( nói sơ qua về phương
pháp quét led cho một số bác chưa biết hiểu: chúng ta nối các chân
a,b,c,d,e,f,g,dp của led chục và led đơn vị lại với nhau, và ta gửi tín hiệu ra
led để hiển thị giá trị cần hiển thị và dĩ nhiên là nếu chúng ta cho phép cả
hai led thì cả hai led đều hiển thị một số, cho nên trong một lúc chúng ta
chỉ cho phép một led sáng.
ví dụ khi muốn hiển thị số 15 thì ta cần led chục hiển thị số 1 còn led đơn vị
hiển thị số 5 vậy thì đầu tiên ta gửi tín hiệu cho sáng số 1 rồi tắt led đơn vị
và cho phép led chục, delay một khoảng thời gian rồi gửi tiếp tín hiệu cho
sáng số 5 rồi tắt led chục và cho phép led đơn vị)
quét led nghĩa là cho trong một trạng thái chỉ có một led được sáng cứ như
thế led chục sáng số 1 và tắt led đơn vị, delay một khoảng thời gian rồi tắt
led chục và cho led đơn vị sáng số 5 rồi delay một khoảng thời gian, tốc độ
sáng led là khoảng 24hình/s như thế thì mắt chúng ta có không thể nhận
biết được sự thay đổi đó và có cảm giác là nó đang hiển thị số 15. Giải
thuật tách số đếm trong R7 như thế này: chúng ta nạp cho B một giá trị là
10 và lấy R7 chuyển vào A rồi lấy A chia cho B như thế phần nguyên sẻ
nằm trong A ( tức là số chục lưu trong A ) còn phần dư nằm trong B ( tức là
số đơn vị nằm trong B), như vậy là ta đã tách được số chục và số đơn vị
ra, chúng ta chuyển số hàng chục ra port0 rồi cho led chục tích cực và tắt
led đơn vị, rồi chuyển B và A rồi xuất nó ra port0 và cho phép led đơn vị
sáng và tắt led chục.
T0_ISR: CPL P1.5 ; đảo trạng thái p1.5 ( mục đích tạo xung vuông )
RETI ; quay lại từ ngắt
E0_ISR: INC R7 ; tăng R7 lên 1
CJNE R7,#20,TIEP ; so sánh R7 với 20, nếu chưa bằng thì nhảy tới nhản
TIEP còn nếu bằng rồi thì gọi chương trình TIEPTUC
ACALL TIEPTUC ; gọi chương trình TIEPTUC
TIEP: CJNE R7,#40,TIEP1 ; so sánh R7 với 40
ACALL TIEPTUC ; gọi chương trình tiếp tục
TIEP1: CJNE R7,#60,TIEP2 ; so sánh R7 với 60
ACALL TIEPTUC ; gọi chương trình TIEPTUC
TIEP2: CJNE R7,#80,TIEP3 ; so sánh R7 với 80
ACALL TIEPTUC ; gọi chương trình TIEPTUC
TIEP3: CJNE R7,#100,EXIT ; so sánh R7 với 100
MOV R7,#0 ; xóa R7 về 0
ACALL TIEPTUC ; gọi chương trình TIEPTUC
EXIT: RETI ; quay về từ ngắt
DELAY: MOV R6,#200
DJNZ R6,$
RET ; 3 dòng lệnh này là delay 400Ms
TIEPTUC: SETB P1.4 ; cho đèn sáng ( báo hiệu dừng băng truyền )
SETB ET1 ; cho phép ngắt timer 1
MOV TH1,#HIGH(-50000)
MOV TL1,#LOW(-50000) ; hai dòng lệnh này là nạp giá trị cho timer 1 ( sau
50000 Ms thì xảy ra ngắt timer 1)
SETB TR1 ; cho timer 1 chạy
RET ; kết thúc chương trình tiếp tục
LUT: DB 03H,9FH,25H,0DH,99H,49H,41H,1FH,01H,09H
END
phù làm mệt rồi đúng không và đây là thành quả của chúng ta