Để tính toán thời gian cho đồng hồ, ta sử dụng biến nhớ HH, MM, SS, 
MSS tương ứng với giờ, phút, giây, phần trăm giây. 
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:
                
              
                                            
                                
            
 
            
                 28 trang
28 trang | 
Chia sẻ: lvcdongnoi | Lượt xem: 3757 | Lượt tải: 2 
              
            Bạn đang xem trước 20 trang tài liệu Đề tài Đồng hồ số, để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 1 
Bài Tập Kết Thúc Học Phần 
Môn: VI ĐIỀU KHIỂN 
Đề tài: Đồng Hồ Số 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 2 
 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. 
 Sự phát triển mạnh mẽ của công nghệ điện tử đã cho ra đời nhiều vi mạch số 
cỡ lớn với giá thành rẻ và khả năng lập trình cao đã mang lại những thay đổi lớn 
trong ngành điện tử. Mạch số ở những mức độ khác nhau đã đang thâm nhập 
trong các lĩnh vực điện tử thông dụng và chuyên nghiệp một cách nhanh chóng. 
Tuy nhiên bên cạnh đó 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 
như mong muốn. 
 Giới hạn của đề tài trong phạm vi hiển thị giờ, phút. Không có hiển thị 
giây và ngày, tháng, năm. 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 3 
II-GIẢI QUYẾT VẤN ĐỀ 
1. Phần cứng 
- Sơ đồ khối của hệ thống: 
- Hoạt động chung của hệ thống 
Bộ điều khiển vật lý gồm có 2 nút ấn start và stop. Khi ta ấn start thì khối 
CPU sẽ cho đồng hồ hoạt động và hiển thì ra led 7 đoạn. Khi ta ấn nút Stop thì 
đồng hồ sẽ ngưng hoạt động, nếu ta ấn Start nữa thì đồng hồ hoạt động lại nhưng 
bắt đầu từ 0000. 
- Sơ đồ nguyên lý chi tiết 
CPU 
KHỐI XỬ LÝ VÀ ĐIỀU KHIỂN 
TRUNG TÂM 
KHỐI HIỂN THỊ 
BỘ ĐIỀU KHIỂN VẬT 
LÝ 
(NÚT ẤN) 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 4 
- Thiết kế chi tiết: 
* Khối hiển thị 
Gồm 4 Led 7 đoạn – Anode chung – 
(LED7SEG) gắn thành cặp hiển thị theo 
dạng HH:MM (Giờ:Phút), ngăn giữa hai cặp 
HH và MM là 2 Led đơn (SEC). 
 Bốn Led 7 đoạn: 
 Có nhiệm vụ hiển thị phút và giờ. 
 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. 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 5 
* 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 
không ấn nút là ở mức cao, khi ấn là 
mức thấp. 
 Xử lý tín hiệu: Sau khi nhận tín hiệu 
từ nút ấn, vi điều khiển xem xét và 
đưa ra các kết quả tùy thuộc vào nút 
được ấn là nút nào mà sẽ cho đồng hồ 
ngừng chạy hay chạy, hay là reset. 
 Xuất tín hiệu: vi điều khiển được ta lập trình dùng bảng dữ liệu mã 
BCD cho Led 7 đoạn kiểu Cathod để điều khiển và hiển thị 4 Led 7 
đoạn ở trên. Nguyên nhân dùng mã 7 đoạn kiểu Cathod là do bảng mã 
này đã được lập sẵn, ta không cần tốn công lập lại bảng mã kiểu Anode 
mà chỉ cần lấy đảo tín hiệu mã 7 đoạn kiểu Cathod thì sẽ được kết quả 
là mã 7 đoạn kiểu Anode. Bốn chân điều khiển tác động ở mức cao 
được điều khiển bởi Port0. 
 MSC51 là một giải pháp tốt và cũng nhằm phù hợp với yêu cầu của đề tài. 
Cụ thể AT89C52 – một loại vi điều khiển thuộc họ MSC51 của hãng Atmel. 
 AT89C52 về chức năng phần cứng cũng như phần mềm đều có thể đáp 
ứng được yêu cầu của đề tài. 
 Việc lập trình cũng như thực hiện lắp mạch nguyên lý khi ta dùng 
AT89C52 cũng không khác gì mấy so với các loại vi điều khiển khác 
cùng dòng MSC51. 
 Nguyên nhân dẫn đến sự lựa chọn này là ở sự đáp ứng tốt khả năng xuất 
nhập của các Port (có 4 Port) và ở bộ nhớ lưu trữ ROM 8K byte và 
RAM 256 byte. Bên cạnh đó sự chênh lệch về giá thành của AT89C52 
với các loại vi điều khiển 8051 (như AT89C51) là không là bao. Do đó 
lựa chọn sử dụng AT89C52 là rất thiết thực. 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 6 
* Khối Điều khiển vật lý: 
 Để điều khiển việc hoạt động của đồng hồ ta 
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 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 7 
2. Phần mềm 
SƠ ĐỒ KHỐI: 
BEGIN 
Khởi Động 
SP 
Buff 
isStart 
HH,MM,SS,MSS 
TMOD,IE 
T0,T1 
TR0,TR1 
VAR… 
SCANBUTTON 
SCANLED 
T=5000 CM 
ISR_SCANLED 
Sơ đồ khối chương trình chính 
CLOCK 
T=10000 CM 
ISR_CLOCK 
IsStart=1; 
Reset HH,MM,SS,MSS 
INT0 
STARTCLOCK 
IsStart=1; 
Reset HH,MM,SS,MSS 
INT1 
STOPCLOCK 
MAIN 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 8 
 CHƯƠNG TRÌNH CHÍNH MAIN: 
 Sau khi được cấp nguồn và được reset bởi mạch reset, vi điều khiển nhảy 
tới thực hiện lệnh Main, là lệnh chính trong chương trình. Sau khi nhảy tới Main 
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 
xoay Port0 để hiển thị Led 7 đoạn kiểu quét được thực hiện trên VarCol 
sau đó mới xuất ra ColLed. Nguyên nhân của việc này là nếu dùng xoay 
trực tiếp ColLed thì sau khi hiển thị thì tín hiệu mức cao đưa ra Led bị kéo 
BEGIN 
Khởi Động 
SP 
Buff 
isStart 
HH,MM,SS,MSS 
TMOD,IE 
T0,T1 
TR0,TR1 
VAR… 
SCANBUTTON 
MAIN 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 9 
xuống mức thấp do sụt áp cũng như do Led 7 đoạn đã tiêu thụ dòng làm 
mất tín hiệu (chứng minh bằng thực nghiệm). Nếu ta tiếp tục xoay thì 
Port0 (ColLed) sẽ toàn là tín hiệu mức thấp, vì vậy không thể điều khiển 
được led sáng nữa. 
o Cài đặt TMOD để sử dụng 2 Timer dùng cho ngắt Timer. 
o Cài đặt các khởi trị của 2 Timer 
o Cài đặt IE, cho phép ngắt 2 Timer và 2 ngắt ngoài 
o Bắt đầu khởi động 2 Timer 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 10 
Code lập trình cho khởi động: 
 Mov Sp,#255-32 
 Mov Buff+0,#0 
 Mov Buff+1,#0 
 Mov Buff+2,#0 
 Mov Buff+3,#0 
 Mov HH,#0 
 Mov MM,#0 
 Mov SS,#0 
 Mov MSS,#0 
 Clr IsStart 
 Clr CkStart 
 Clr CkStop 
 Clr SecTic 
 Mov ColLed,#10H ;00010000 
 Mov VarCol,#10H 
 Mov Col,#4 
 Mov TMOD,#11H ;Setup Timer0 va Timer1 o Mode 1 
 Mov TL0,#03CH 
 Mov TH0,#0F6H ;Tran sau 2500 CM 
 Mov TL1,#0F0H 
 Mov TH1,#0D8H ;Tran sau 10000 CM 
 Mov IE,#8FH ;Cho phep ngat 2 ngat ngoai va 2 timer 
 SetB TR0 ;Bat Timer0 
 SetB TR1 ;Bat Timer1 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 11 
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: 
ckStart=1? 
Yes 
Start=1? 
Yes 
Start INT0, 
SetB ckStart 
ckStop=1? 
Stop=1? 
Start INT1, 
SetB ckStop, 
Clr ckStart 
Yes 
Yes 
SCANBUTTON 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 12 
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 
ckStart. Nếu ckStart là 1, nghĩa là đồng hồ đang chạy thì sẽ không làm gì và 
nhảy đến kiểm tra nút Stop. 
Sau khi kiểm tra nút Start, ta tiến hành kiểm tra nút Stop. Đầu tiên biến 
ckStop được xét xem có bằng 1 hay không. Ở đây hơi khác so với khi làm 
việc với nút Start vì chức năng hai nút có phần khác nhau. Nếu ckStop=1 
nghĩa là nút Stop vừa được ấn (trong thời gian rất ngắn ngay lúc trước đó) thì 
sẽ không làm gì và nhảy ra khỏi chương trình con này. Nếu nút Stop chưa 
được ấn, nghĩa là ckStop=0 thì sẽ kích hoạt ngắt ngoài INT1 hoạt động để gọi 
chương trình con STOPCLOCK và Set bit ckStop, song song đó là khôi phục 
lại tác dụng của nút Start bằng cách Set bit ckStart trở lại. Còn về nút Stop sau 
khi ấn cũng bị vô tác dụng do ckStop bị Set lên 1, để trả lại tác dụng cho nút 
Stop thì trong chương trình con Clock ta đặt vài dòng lệnh để Set ckStop, 
dòng lệnh đó đặt ngay trong vùng kiểm tra số Giây của đồng hồ. Nghĩa là nút 
Stop sẽ có tác dụng trở lại sau 1 giây được ấn. 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 13 
Code chương trình con SCANLED 
Main_Loop: 
 Call ScanButton 
 Jmp Main_loop 
ScanButton: 
 Jb CkStart,CheckStop 
 Jb Start,CheckStop 
 SetB CkStart 
 Clr P3.2 
 SetB P3.2 
 CheckStop: 
 Jb CkStop,ScanButton_Exit 
 Jb Stop,ScanButton_Exit 
 SetB CkStop 
 Clr CkStart 
 Clr SecTic 
 Clr P3.3 
 SetB P3.3 
 ScanButton_Exit: 
 Ret 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 14 
 HAI NGẮT NGOÀI INT0, INT1 VÀ HAI CHƯƠNG TRÌNH PHỤC VỤ 
NGẮT NGOÀI STARTCLOCK VÀ STOPCLOCK: 
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ồ. 
IsStart=1; 
Reset HH,MM,SS,MSS 
INT0 
STARTCLOCK 
IsStart=0; 
INT1 
STOPCLOCK 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 15 
Code chương trình con STARTCLOCK và STOPCLOCK 
StartClock: 
 SetB IsStart 
 Mov Buff+0,#0 
 Mov Buff+1,#0 
 Mov Buff+2,#0 
 Mov Buff+3,#0 
 Mov HH,#0 
 Mov MM,#0 
 Mov SS,#0 
 Mov MSS,#0 
 Reti 
StopClock: 
 Clr IsStart 
 Reti 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 16 
 NGẮT TIMER0 VÀ CHƯƠNG TRÌNH PHỤC VỤ NGẮT ISR_SCANLED: 
Để phục vụ cho việc hiển thị ra Led 7 đoạn theo kiểu quét, ta dùng ngắt 
Timer (Timer0). Khi thực hiện lệnh ngắt, chương trình con SCANLED được gọi 
và hiển thị từng Led 7 đoạn 1 lần lượt trong 4 Led 7 đoạn trên. Trước khi gọi 
lệnh SCANLED thì việc cài đặt lại Timer0 là không thể thiếu. Chu kỳ được tính 
cho mỗi vòng quét Led này (Chu kỳ để ngắt Timer0 hoạt động) là 5000 chu kỳ 
máy (CM). Nghĩa là: Sau 5000x4=20000 CM = 0.02s thì Led 7 đoạn này sẽ 
đượ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. 
Biểu đồ xung cấp cho 4 led 7 đoạn 
Led0 
Led1 
Led2 
Led3 
5000CM 
20000CM 
SCANLED 
T=5000 CM 
ISR_SCANLED 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 17 
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. 
ISR_ScanLed: 
 Clr TR0 
 Mov TL0,#078H+10 ;Tru di 10 Chu ky may di nhay vao lenh ngat 
 Mov TH0,#0ECH ;Tran sau 5000 CM 
 SetB TR0 ;Bat Timer0 
 Call ScanLed 
 Reti 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 18 
Code chương trình con SCANLED: 
ScanLed: 
 Mov A,VarCol 
 RR A 
 Mov VarCol,A 
 Mov ColLed,A 
 Jnb Col7,Col7_Not0 
 Mov VarCol,#08H 
 Col7_Not0: 
 Mov DPTR,#DB7SEG 
 Mov A,#Buff 
 Dec Col 
 Add A,Col 
 Mov R0,A 
 Mov A,@R0 
 MovC A,@A+DPTR 
 CPL A 
 Mov RowLed,A 
 Mov A,Col 
 Cjne A,#0,Col_Not0 
 Mov Col,#4 
 Col_Not0: 
 Ret 
;-------------------------------------------- 
DB7SEG: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,40H 
 ;BANG DU LIEU "CODE LED 7 DOAN" 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 19 
 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à: 
ISR_Clock: 
 Clr TR1 
 Mov TL1,#0F0H+10 ;Tru di 10 Chu ky may di nhay vao lenh 
ngat 
 Mov TH1,#0D8H ;Tran sau 10000 CM 
 SetB TR1 ;Bat Timer0 
 Call Clock 
 Reti 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 20 
Timer0 tràn lần đầu tiên sau 2500CM, còn Timer1 tràn lần đầu tiên sau 
10000CM. Ở đây Timer1 không thay đổi gì khi tràn sau 10000CM ở các lần tràn 
tiếp. Nhưng sau lần tràn đầu Timer0 được cài sẽ tràn sau 5000CM. Việc này sẽ 
làm cho 2 Timer tràn ở những thời gian khác nhau, không có việc 2 Timer cùng 
tràn 1 lúc, đảm bảo cho tính chính xác của đồng hồ. 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 21 
 CHƯƠNG TRÌNH CON CLOCK: 
INC(MSS) 
MSS=100? 
No 
INC(SS) 
SS=60? 
INC(MM) 
MM=60? 
INC(HH) 
CLOCK 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 22 
Để tính toán thời gian cho đồng hồ, ta sử dụng biến nhớ HH, MM, SS, 
MSS tương ứng với giờ, phút, giây, phần trăm giây. 
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: 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 23 
Clock: 
 Jnb IsStart,Clock_exit 
 Clock_Start: 
 Mov A,MSS 
 INC A 
 Mov MSS,A 
 Cjne A,#50,Next_0 
 CPL SecTic 
 Next_0: 
 Cjne A,#100,Next_1 
 CPL SecTic 
 Next_1: 
 Jc Clock_Exit 
 Mov MSS,#0 
 Mov A,SS 
 INC A 
 Mov SS,A 
 ;---------------Phuc vu toi uu hoa phim an Start Stop 
 Jnb Stop,Clock_Next2 
 Clr CkStop 
 Clock_Next2: 
 ;---------------Ket thuc {Phuc vu toi uu hoa phim an Start Stop} 
 Cjne A,#60,Next_2 
 Next_2: 
 Jc Clock_Exit 
 Mov SS,#0 
 Mov A,MM 
 INC A 
 Mov MM,A 
 Cjne A,#60,Next_3 
 Next_3: 
 Jc Clock_Exit 
 Mov MM,#0 
 Mov A,HH 
 INC A 
 Mov HH,A 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 24 
CODE ĐẦY ĐỦ: 
;Khai bao port vao ra 
RowLed Data P1 
ColLed Data P0 
Col7 Bit P0.7 
Start Bit P3.0 
Stop Bit P3.1 
SecTic Bit P3.4 
;Khai bao doan du lieu 
Bseg at 20h 
 IsStart: Dbit 1 
 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 
Cjne A,#99,Next_4 
 Next_4: 
 Jc Clock_Exit 
 Clr IsStart 
 Clock_Exit: 
 Mov A,HH 
 Mov B,#10 
 Div AB 
 Mov Buff+0,A 
 Mov Buff+1,B 
 Mov A,MM 
 Mov B,#10 
 Div AB 
 Mov Buff+2,A 
 Mov Buff+3,B 
 Ret 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 25 
 Jmp ISR_Clock 
Org 03H 
 Jmp StartClock 
Org 13H 
 Jmp StopClock 
Org 030H 
;Dinh nghia chuong trinh chinh 
Main: 
 Mov Sp,#255-32 
 Mov Buff+0,#0 
 Mov Buff+1,#0 
 Mov Buff+2,#0 
 Mov Buff+3,#0 
 Mov HH,#0 
 Mov MM,#0 
 Mov SS,#0 
 Mov MSS,#0 
 Mov HH2,#0 
 Mov MM2,#0 
 Clr IsTimer 
 Clr IsStart 
 Clr CkStart 
 Clr CkStop 
 Clr SecTic 
 Mov ColLed,#10H ;00010000 
 Mov VarCol,#10H 
 Mov Col,#4 
 Mov TMOD,#11H ;Setup 
Timer0 va Timer1 o Mode 1 
 Mov TL0,#03CH 
 Mov TH0,#0F6H ;Tran sau 
2500 CM 
 Mov TL1,#0F0H 
 Mov TH1,#0D8H ;Tran sau 
10000 CM 
 Mov IE,#8FH 
 ;Cho phep ngat 2 ngat ngoai va 2 
timer 
 SetB TR0 ;Bat 
Timer0 
 SetB TR1 ;Bat 
Timer1 
 Main_Loop: 
 Call ScanButton 
 Jmp Main_loop 
;-------------------------------------------- 
ScanButton: 
 Jb CkStart,CheckStop 
 Jb Start,CheckStop 
 SetB CkStart 
 Clr P3.2 
 SetB P3.2 
 CheckStop: 
 Jb 
 CkStop,ScanButton_Exit 
 Jb 
 Stop,ScanButton_Exit 
 SetB CkStop 
 Clr CkStart 
 Clr SecTic 
 Clr P3.3 
 SetB P3.3 
 ScanButton_Exit: 
 Ret 
;-------------------------------------------- 
StartClock: 
 SetB IsStart 
 Mov Buff+0,#0 
 Mov Buff+1,#0 
 Mov Buff+2,#0 
 Mov Buff+3,#0 
 Mov HH,#0 
 Mov MM,#0 
 Mov SS,#0 
 Mov MSS,#0 
 Reti 
;-------------------------------------------- 
StopClock: 
 Clr IsStart 
 Reti 
;-------------------------------------------- 
ISR_Clock: 
 Clr TR1 
 Mov TL1,#0F0H+10 ;Tru di 10 
Chu ky may di nhay vao lenh ngat 
 Mov TH1,#0D8H 
 ;Tran sau 10000 CM 
 SetB TR1 
 ;Bat Timer0 
 Call Clock 
 Reti 
;-------------------------------------------- 
ISR_ScanLed: 
 Clr TR0 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 26 
 Mov TL0,#078H+10
 ;Tru di 10 Chu ky may di nhay vao 
lenh ngat 
 Mov TH0,#0ECH 
 ;Tran sau 5000 CM 
 SetB TR0 
 ;Bat Timer0 
 Call ScanLed 
 Reti 
;-------------------------------------------- 
Clock: 
 Jnb IsStart,Clock_exit 
 Clock_Start: 
 Mov A,MSS 
 INC A 
 Mov MSS,A 
 Cjne A,#50,Next_0 
 CPL SecTic 
 Next_0: 
 Cjne A,#100,Next_1 
 CPL SecTic 
 Next_1: 
 Jc Clock_Exit 
 Mov MSS,#0 
 Mov A,SS 
 INC A 
 Mov SS,A 
 ;---------------Phuc vu toi uu hoa phim 
an Start Stop 
 Jnb Stop,Clock_Next2 
 Clr CkStop 
 Clock_Next2: 
 ;---------------Ket thuc {Phuc vu toi uu 
hoa phim an Start Stop} 
 Cjne A,#60,Next_2 
 Next_2: 
 Jc Clock_Exit 
 Mov SS,#0 
 Mov A,MM 
 INC A 
 Mov MM,A 
 Cjne A,#60,Next_3 
 Next_3: 
 Jc Clock_Exit 
 Mov MM,#0 
 Mov A,HH 
 INC A 
 Mov HH,A 
 Cjne A,#99,Next_4 
 Next_4: 
 Jc Clock_Exit 
 Clr IsStart 
 Clock_Exit: 
 Mov A,MM 
 Mov B,#10 
 Div AB 
 Mov Buff+0,A 
 Mov Buff+1,B 
 Mov A,SS 
 Mov B,#10 
 Div AB 
 Mov Buff+2,A 
 Mov Buff+3,B 
 Ret 
;-------------------------------------------- 
ScanLed: 
 Mov A,VarCol 
 RR A 
 Mov VarCol,A 
 Mov ColLed,A 
 Jnb Col7,Col7_Not0 
 Mov VarCol,#08H 
 Col7_Not0: 
 Mov DPTR,#DB7SEG 
 Mov A,#Buff 
 Dec Col 
 Add A,Col 
 Mov R0,A 
 Mov A,@R0 
 MovC A,@A+DPTR 
 CPL A 
 Mov RowLed,A 
 Mov A,Col 
 Cjne A,#0,Col_Not0 
 Mov Col,#4 
 Col_Not0: 
 Ret 
;-------------------------------------------- 
DB7SEG: DB
 3FH,06H,5BH,4FH,66H,6DH,7DH,0
7H,7FH,6FH,40H ;BANG DU 
LIEU "CODE LED 7 DOAN" 
;-------------------------------------------- 
End 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 27 
III. KẾT LUẬN. 
1. Ưu điểm: 
 Qua Kết quả thực tế ta thấy đồng hồ hoạt động tốt, cách sử dụng 
đơn giản, chính xác với yêu cầu thiết kế ban đầu như : 
 + Khi ấn Start Thì đồng hồ bắt đầu điếm từ 0 
 + Khi ấn Stop thì đồng hồ ngưng. 
=> đồng hồ hoạt động với mức sai số không đáng kể. 
 2. Nhược điểm: 
 Do lâp trình bằng vi xử lý nên không thể đạt độ chính xác tối đa 
được và sau một thời gian thì có thể cũng có một số lổi làm cho hệ thống 
không chính xác như lúc đầu được (sai số do qua trình tính toán hoặc sai số 
của linh kiện). 
3. Hướng phát triển: 
 Bằng việc ứng dụng kỹ thuật vi xử lý, chúng ta có thể thiết kế 
những hệ thống không những hiển thị được giờ-phút mà còn có thể hiển thị 
được lun cả giây, ngày, tháng, năm…..và còn có thể phát triển nhiều loại 
đông hồ kiểu khác nữa như là đồng hồ hẹn giờ hay các loại động hồ đa 
năng khác, các tính năng về thời gian… 
 Muốn phát triển được như vậy thì trước tiên ta cần phải có kiến 
thức đủ rộng và có những hiểu biết sâu về mạch số, lập trình… 
4. Lời kết: 
Mạch đồng hồ số là đề tài rất thiết thực và gần gũi với cuộc sống 
chúng ta. Đây là một đề tài nhỏ nhưng cũng là đề tài đầu tiên mà chúng em 
tự mình tìm hiểu và thi công, qua đó giúp chúng em ứng dụng những kiến 
thức mà mình đã học. 
Vì đây là lần đầu thực hiện một mạch thực tế hoàn chỉnh dựa vào 
những kiến thức đã học nên còn nhiều sai sót và hạn chế nên chưa được như 
ý muốn. Mong được sự đóng góp ý kiến của Thầy và các bạn. 
Báo Cáo Vi Điều Khiển Mạch Đồng Hồ 
GVHD: Nguyễn Khắc Nguyên 28 
Mục Lục 
I - MỤC TIÊU ĐỀ TÀI .................................................................. Trang 2 
II - GIẢI QUYẾT VẤN ĐỀ ........................................................... Trang 3 
1. Phần cứng ................................................................... Trang 3 
2. Phần mền .................................................................... Trang 7 
III - KẾT LUẬN ............................................................................. Trang 24 
1. Ưu điểm ....................................................................... Trang 24 
2. Nhược điểm ................................................................. Trang 24 
3. Hướng phát triển ......................................................... Trang 25 
4. Lời kết .......................................................................... Trang 25 
            Các file đính kèm theo tài liệu này:
 doko_vn_1793979_bao_cao_mon_vi_dieu_khien_dong_3633.pdf doko_vn_1793979_bao_cao_mon_vi_dieu_khien_dong_3633.pdf