Bài Tập Kết Thúc Học Phần
Môn: VI ĐIỀU KHIỂN
Đề tài: Đồng Hồ Số
I-MỤC TIÊU ĐỀ TÀI
- Nêu vấn đề:
Cùng với sự phát triển của khoa học và công nghệ, các thiết bị điện tử đã,
đang và sẽ tiếp tục được ứng dụng ngày càng rộng rãi và mang lại hiệu quả trong
hầu hết các lĩnh vực khoa học kỹ thuật cũng như trong đời sống xã hội.
Việc gia công, xử lý các tín hiệu điện-điện tử hiện đại đều dựa trên cơ sở
nguyên lý số. Vì các thiết bị làm việc dựa trên cơ sở nguyên lý số có ưu điểm hơn
hẳn so với các thiết bị làm việc dưạ trên cơ sở nguyên lý tương tự, đặc biệt là
trong kỹ thuật tính toán.
!!"##$%&'()(!*)+"&),-#./
012-2!3"4-356718 !"9&)+#&1:!&);12
!"3)(!*<./=:#>)?5&)+)&!@#8
!"1A-)(!*!'BC-3( #?!&D<
EF)D ngày nay những chíp vi xử lý cũng được ứng dụng rộng
rãi trong nhiều lãnh vực, các họ 89XXX là một loại IC thích hợp cho các sinh
viên mới bắt đầu tìm hiểu về vi xử lý. Các IC họ 89XXX có thể được ứng dụng
trong khá nhiều mạch điện tử với khá nhiều chức năng. Một trong những mạch
thông dụng có sử dụng IC họ 89XXX đó là mạch đồng hồ.
Đề tài về đồng hồ rất đa dạng với nhiều chức năng khác nhau tùy vào khả
năng lập trình và kiến thức về mạch số của người chế tạo.
Mục tiêu của nhóm như sau :
-Phần cứng: thiết kế được mạch điện hoàn chỉnh có thể hiện được giờ-
phút trên led 7 đoạn.
-Phần mềm: Sử dụng hợp ngữ để lập trình cho đồng hồ hiển thị, ứng dụng
ngắt timer, ngắt ngoài. Sau khi lập trình hoàn chỉnh thì thời gian chạy chính xác
• Kiểu hiển thị được dùng là kiểu quét Led với tần số cố định và
đều nhau nên độ sáng giữa các Led trước sau là như nhau. Các chân điều
khiển nhận tín hiệu từ Vi điều khiển (4 chân ở Port0 – P0.3, P0.2, P0.1, P0.0
ứng với HH MM) tác động ở mức cao. Các chân a,b,…,g (ở đây không dùng
đến dp nên sẽ không đề cập đến đoạn dp) nhận tín hiệu BCD từ Port1 của Vi
điều khiển, tác động ở mức thấp.
• Khi mới khởi động bốn Led này hiển thị 4 số 0. Khi ấn Start
đồng hồ bắt đầu đếm 2 Led đầu hiển thị giờ, 2 Led sau hiển thị phút. Khi ấn
Stop đồng hồ ngừng đếm, số giờ và phút được chốt lại và hiển thị trên 4 Led
theo thứ tự HH MM (giờ phút). Khi muốn đồng hồ đếm lại chỉ cần ấn Start,
số giờ phút sẽ trờ về 0 và bắt đầu đếm như cũ. Nếu sau khi đã ấn Start mà lại
ấn Start nữa thì không có tác dụng nhằm tránh trường hợp lỡ ấn trên hai
lần vào nút Start làm đồng hồ bắt đầu không như mong muốn. Sau khi đồng
hồ đã được chạy và được dừng bởi ấn nút Stop mà ta ấn Stop nữa thì cũng
không có tác dụng, số trên đồng hồ chỉ được reset khi ấn nút Start.
Hai Led đơn (SEC) sẽ có tần số sáng tắt theo Giây (tần số 1Hz).
Ngoài chức năng cho biết số Giây, hai Led đơn này còn cho ta biết khi nào
đồng hồ đang đếm và khi nào đồng hồ ngừng đếm. Cụ thể là khi ta ấn Start
hai Led này sẽ chớp tắt với tần số như trên, khi ấn Stop đồng hồ ngừng đếm
và hai Led này cũng tắt không chớp nữa.
I
* Khối CPU – Khối xử lý và điều khiển trung tâm
Để nhận, xuất, xử lý cũng như hiển thị ta cần
một bộ điều khiển trung tâm (CPU).
• Nhận tín hiệu điều khiển từ bộ điều
khiển vật lý: vi điêu khiển nhận tín
hiệu từ nút ấn ở hai chân P3.0 và P3.1
ở Port3 tương ứng với nút Start và nút
Stop. Tín hiệu ở hai chân này lúc
dùng hai nút ấn thường hở 1 tần tiếp điểm. Để
có thể nhận tín hiệu từ nút ấn này ta dùng 2
điện trở 330
Ω
kéo dương giữa nút ấn và chân
vi điều khiển nối với nút ấn như sơ đồ nguyên
lý. Phía còn lại của nút ta nối xuống MASS.
Như vậy trạng thái bình thường – không ấn –
thì tín hiệu vi điều khiểnđọc được sẽ là mức
cao, khi ấn nút thì tín hiệu sẽ là mức thấp.
• Nút Start: Có nhiệm vụ sau khi được ấn sẽ phát tín hiệu cho vi điều
khiển biết để chạy đồng hồ. Khi được ấn, thời gian lưu trữ về giờ, phút,
giây… sẽ được reset về ban đầu.
• Nút Stop: Có nhiệm vụ sau khi được ấn sẽ phát tín hiệu cho vi điều
khiển biết để ngừng đồng hồ, nếu như đồng hồ đang đếm. Bên cạnh đó
nút Stop còn là nút để cho phép nút Start có tác dụng sau khi đã ấn Start
rồi. Cụ thể: Sau khi ấn Start thì nút Start sẽ bị vô hiệu hóa và mất tác
dụng, chỉ khi ấn Stop thì nút Start mới trở lại như cũ và có tác dụng như
ban đầu.
* Chú ý: Ngoài các khối được kể trên còn một số phần khối khác ta không nhắc
đến nhưng được lắp vào mạch đó là:
o Khối Reset cho vi điều khiển
o Khối tạo xung cho vi điều khiển
o Khối tạo nguồn 5V
K
2. Phần mềm
SƠ ĐỒ KHỐI:
L
MN
là bước khởi động, sau đó là tiến trình kiểm tra phím ấn. Sau khi thực hiện xong
việc kiểm tra phím ấn thì quay lại và tiếp tục kiểm tra phím ấn. Còn các việc khác
được thực hiện trong các ngắt được cài đặt ở phần sau.
Khởi động gồm:
o Khởi động con trỏ Stack
o Khởi động vùng đệm hiển thị Buff. Gồm bốn byte đều được reset về 0.
o Biến nhớ điều khiển việc chạy/ngừng đồng hồ IsStart được đưa về 0.
o Khởi động các biến nhớ thời gian đếm HH, MM, SS, MSS lần lượt là: giờ,
phút, giây và MSS=SS/100 (phần trăm giây). Tất cả được reset về 0.
o Khởi động hai biến nhớ phục vụ tối ưu hóa ấn phím ckStart và ckStop.
Được reset về 0.
o Reset chân SecTic (P3.4) là chân chớp tắt hai led có nhiệm vụ thể hiện sự
dao động của số giây.
o Khởi động ColLed và VarCol lần lượt là Port0 - xuất tín hiệu điều khiển 4
Led bảy đoạn - và biến nhớ tương ứng. ColLed là ánh xạ của VarCol. Việc
_
MN
=?
O
P
.!&"!
QQQ
ERQNM
ESQE
ETSQET
UTV
UWEER
MAIN
xoay Port0 để hiển thị Led 7 đoạn kiểu quét được thực hiện trên VarCol
- ERQa ]^! E#^"S-&E#^"B^
- EXSQaSH
- ESQaSdK ]E"&.&GJSS
- EXQaSdS
- EQaS_ ]E"&.&SSSS
- NMQa_d ] ^ &!G&!&-&Ge#^"
^! ETS ]&!E#^"S
^! ET ]&!E#^"
MAIN_LOOP:
Là vòng lặp chính của chương trình. Trong vòng lặp này chỉ chứa một lệnh đó
là gọi chương trình con SCANBUTTON. Là lệnh kiểm tra nút ấn,
SCANBUTTON được quét liên tục và lặp đi lặp lại.
Chương trình con SCANBUTTON:
Việc kiểm tra phím ấn sử dụng thêm hai biến ckStart và ckStop, chương
trình con này hoạt động như sau:
Việc đầu tiên là kiểm tra biến ckStart để xem có phải là nút Start đã được
ấn rồi hay chưa. Nếu nút Start chưa được ấn lần nào thì sẽ khởi động ngắt
ngoài INT0 để gọi chương trình phục vụ ngắt ngoài STARTCLOCK và Set bit
G
5!&"!Yf
g^.
!&"!Yf
g^.
!&"!NESQ
^!5!&"!
5! Yf
! Yf
&i
jF 5!&"!Q^5!
jF !&"!Q^5!
^! 5!&"!
1" OH<G
^! OH<G
^5!
jF 5! Q&ihMk!
jF ! Q&ihMk!
^! 5!
1" 5!&"!
1" ^E
1" OH<H
^! OH<H
&ihMk!
T^!
Như ta đã đề cập ở trên, hai chương trình con phục vụ ngắt ngoài
STARTCLOCK và STOPCLOCK được kích hoạt từ việc kiểm tra nút ấn Start
và Stop.
Việc sử dụng 2 ngắt ngoài này có thể được lược bỏ vì ta có thể hoàn toàn
đặt các dòng lệnh của hai ngắt này trong chương trình con SCANBUTTON.
Nhưng vì nhằm phục vụ cho việc học tập, nghiên cứu nên ta vẫn sử dụng 2 ngắt
ngoài này để kiểm chứng những gì ta đã học trong lý thuyết.
STARTCLOCK: Đơn giản chỉ Set bit IsStart để kích hoạt đồng hồ chạy,
reset các biến thời gian HH, MM, SS, MSS và vùng đệm hiển thị.
STOPCLOCK: Clear bit IsStart để ngưng đồng hồ.
Code chương trình con STARTCLOCK và STOPCLOCK
J
N.!&"!Y]
được sáng trở lại. Điều này tương đương với tần số sáng là f=1/T=1/0.02=50Hz,
đủ để mắt người có thể không phát hiện được có sự thay đổi giữa sáng và tắt.
L
UXM
EYJSSS
ISR_SCANLED
Biểu đồ xung cấp cho 4 led 7 đoạn
X^BS
X^B
X^BG
X^BH
JSSS
GSSSS
Code chương trình phục vụ ngắt Timer0 ISR_SCANLED:
Việc tại sao ta lại cộng thêm 10 vào TL0 và việc tại sao lại nói là trừ 10
Chu ký máy… sẽ được nhắc ở phần ngắt Timer1<
CHƯƠNG TRÌNH CON SCANLED:
Chương trình con SCANLED được gọi nhờ lệnh trong chương trình phục vụ
ngắt Timer0 IRS_SCANLED. Nhiệm vụ chính của chương trình con ScanLed là
hiển thị giá trị thời gian đếm của đồng hồ ra led 7 đoạn, cũng như việc chớp tắt 2
led đơn SEC. Lệnh được gọi sau mỗi 5000CM để hiển thị lần lượt mỗi khi gọi là
1 led 7 đoạn được cho sáng.
_
NTh&X^B
1" ETS
- EXSQaSL_cS ]E"BS5#&B&-&1^
&!
- ESQaSM ]E"&.&JSSS
^! ETS ]&!E#^"S
NGẮT TIMER1 VÀ CHƯƠNG TRÌNH PHỤC VỤ NGẮT
ISR_CLOCK:
Chương trình ngắt Timer1 là phần có thể nói là thiết yếu trong đề tài này, để
quyết định độ chính xác cho đồng hồ tùy thuộc phần lớn vào việc ta xử lý ngắt
này. Ở đây ta dùng ngắt Timer1 và chương trình phục vụ ngắt ISR_CLOCK.
Ngắt Timer1 hoạt động sau mỗi 10000CM. Lý do ta con con số 10000CM là do
đơn giản hóa việc tính toán, giúp cho việc tính toán được chính xác hơn. Vì đề
tài này cần có một đồng hồ có thời gian thực, nên chương trình con được gọi
trong ngắt Timer1 là CLOCK cũng phải kết hợp nhuần nhuyễn với ngắt Timer1
để tính toán được con số chính xác nhất. Trong chương trình con phục vụ ngắt
Timer1 ISR_CLOCK chỉ đơn giản là việc cài đặt lại Timer1 và gọi chương trình
con CLOCK.
Code chương trình con phục vụ ngắt Timer1 ISR_CLOCK:
Cũng như ở chương trình con phục vụ ngắt Timer0, ở chương trình con
phục vụ ngắt Timer1, biến TL1 được cộng thêm 10 và ghi chú là trừ đi 10 chu
kỳ máy nảy vào lệnh ngắt. Lý do là: để cho đồng hồ hoạt động 1 cách chính xác
nhất, việc hiển thị một cách đều đặn nhất, thì các ngắt Timer phải được gọi một
cách đều đặn nhất. Bằng thực nghiệm mô phỏng với phần mềm KeilC, ta biết
được, kể từ khi ngắt Timer (Timer0 và Timer1) được gọi ngắt (tràn) cho đến khi
được hoạt động trở lại thì ta cần thêm 10 CM nữa gồm các lệnh nhảy vào ngắt
và cài đặt lại khởi trị cho các Timer. Vì vậy ta sẽ thêm 10 vào byte TL của các
Timer đồng nghĩa với giảm đi 10 CM cho các Timer.
Cho nên qua đây ta có thể chứng minh được rằng, đồng hồ dùng code lập
trình như vậy sẽ chạy một cách chính xác và có thể nói nếu không có vấn đề
khác xảy ra thì sai số có thể là bằng 0. Tuy nhiên, nếu 2 Timer0 và Timer1 cùng
tràn 1 lúc, 2 lệnh ngắt được gọi cùng lúc thì đó là điều không thể, điều này dẫn
tới sai số cho đồng hồ. Để khắc phục điều này, ban đầu khi qua chương trình
khởi động, ta cho khởi động 2 Timer cách nhau 1 khoảng nhất định, cụ thể là:
Timer0 tràn lần đầu tiên sau 2500CM, còn Timer1 tràn lần đầu tiên sau
MSS=SS/100
Như vậy mỗi lần gọi gọi lệnh CLOCK ta sẽ cộng thêm 1 vào MSS. Nếu
sau khi cộng 1 vào MSS mà MSS bằng 100 thì ta sẽ cộng thêm 1 vào SS và gán
MSS bằng 0.
Lệnh này được lặp lại cho đến khi SS bằng 60 (60 giây) thì cộng thêm 1
vào MM (phút) và gán SS bằng 0. Và làm tương tự đối với HH (Giờ).
Cuối cùng nếu HH bằng 99 thì ta sẽ ngừng đồng hồ bằng cách Clear
IsStart.
Code chương trình con CLOCK:
GH
GI
15
jF N.!&"!Q15h^k!
15h!&"!
- UQ
N U
- QU
n^ UQaJSQ^k!hS
OX ^E
^k!hS
n^ UQaSSQ^k!h
OX ^E
^k!h
j 15hMk!
- QaS
- UQ
N U
- QU
]bbbbbbbbbbbbbbbO-!& #&!&"!!
CkStart: Dbit 1
CkStop : Dbit 1
IsTimer: Dbit 1
Dseg at 30h
Buff: DS 4
HH: DS 1
MM: DS 1
SS: DS 1
MSS: DS 1
Col: DS 1
VarCol:DS 1
Var1: DS 1
LA: DS 1
HH2: DS 1
MM2: DS 1
Button: DS 1
;Khai bao doan chuong trinh
Cseg at 0h
Org 0H
Jmp Main
Org 0BH
Jmp ISR_ScanLed
Org 01BH
Jmp ISR_Clock
Org 03H
GJ
n^ UQa``Q^k!hI
^k!hI
j 15hMk!
1" N.!&"!