*Các chỉ dẫn của hợp ngữ:
Ch dn include
ây l ch dn cho chng trình dch bit ni lu gi th vin các
thanh ghi .
Cấu trúc:
#include <th vin bn cn s dng>
Khi viết chng trình cho MCS51
#include <sfr51.inc>
Ch dn ORG : Ch dn ny giúp cho chng trình dch bit c mã
lnh theo sau ch dn ny.
c ghi vo t a ch no trong ROM.
Ch dn END: Ch dn ny thông báo cho chng trình dch bit
chng trình đã kt thúc.
Chỉ dẫn EQU: Đợc dùng để định nghĩa một hằng số. Chỉ dẫn EQU
không sử dụng ô nhớ để cất dữ liệu, mà thực hiện gán một hằng số cho nhãn
sao cho khi nhãn xuất hiện trong chơng trình thì giá trị hằng số sẽ đợc thay
thế cho nhãn.
Chỉ dẫn DB: DB là chỉ dẫn dữ liệu 8 bit và đợc sử dụng hết sức rộng
rãi khi lập trình hợp ngữ, 8 bit dữ liệu đợc định nghĩa có thể ở dạng thập
phân, nhị phân , Hexa hay Ascii. Đối với dữ liệu thập phân thì có D sau số
thập phân, số nhị phân thì có chữ B và dữ liệu dạng Hexa thì có chữ H và
dù dữ liệu ở dạng nào thì hợp ngữ luôn chuyển về dạng hexa.
Để lập trình cho 8051 có rất nhiều phần mềm nhng các lập trình
khuyên là khi lập trình cho 8051 nên sử dụng phần mềm Reads51. Sau khi
chạy file reads51.exe ta có giao diện của reads51 sau đó vào Project chọn
New project và đặt tên sau đó nhấn ok. Tiếp theo nhấn chuột phải vào tên và
chọn Create New Module đặt tên và lựa chọn ngôn ngữ lập trình. Sau khi lập
trình xong nhấn F2 để dịch ra file Hex
Giao diện của Read51 nh sau:
Hình 5.6 - Giao diện của Reads51.
Sau khi lập trình và dịch chơng trình xong ta tiến hành nạp chơng
trình vào chíp. Để nạp chơng trình cho bất kỳ một chíp vi điều khiển nào thì
đều cần có một chơng trình để nạp. Đối với họ 8051 phần mềm đợc sử dụng
phổ biến đó là EZDL với các phiên bản EZDL.4, EZDL.4.1, EZDL.4.2.
Sau khi chạy file EZDL.4.1.exe nhấn vào send, chọn file cần nạp có
đuôi .hex và ok, thế là chơng trình sẽ đợc nạp vào chíp
Giao diện của phần mềm nạp chíp của 8051 nh sau:
Hình 5.7 - Giao diện cuả phần mềm EZDL.4.1.
Sau đây là chơng trình đo và điều khiển nhiệt độ khí sấy:
5.2.3. Ch−¬ng tr×nh ®o vµ ®iÒu khiÓn nhiÖt ®é khÝ sÊy n«ng s¶n d¹ng h¹t.
; READS51 generated header
; created : 15:56:56, Friday, November 25, 2005
;
;
CHUONG TRINH DIEU KHIEN NHIET DO KHI SAY NONG SAN DANG HAT
; SVTH : NGUYEN THI THU HIEN - LOP TDH46
; GVHD : Ths.NGUYEN THI HOAI SON
#include <sfr51.inc>
ORG 0000H
LJMP MAIN
ORG 0003H
LJMP Interrupt0
ORG 0013H
LJMP Interrupt1 ; Nhay den ngat ngoai INT1
; Chuong trinh chinh
MAIN:
MOV R7,#50
MOV P0,#0ffh ; Chon P0 lam cong vao
MOV IE,#10000110B ; Cho phep ngat ngoai 0,1
MOV IP,#00000001B ; Uu tien ngat mgoai0
MOV R5,#0 ; De dem so ngat 0 xay ra
MOV R4,#00h ; Thanh ghi thap cua T0
MOV R3,#DCh ; Thanh ghi cao cua T0
ACALL Display
Back:
MOV A,#CBh
ACALL Command
CLR P1.4 ; Cho CS = 0 de kich hoat chip
CLR P1.3
nop
nop
nop
SETB P1.3 ; Gui xung thap len cao toi WR de bat dau chuyen doi
Here1:
JB P3.7,Here1 ;Cho ket thuc chuyen doi khi INT=0
CLR P1.2 ; Ket thuc chuyen doi cho phep doc du lieu RD=0
MOV R6,P0 ; Luu tru gia tri doc duoc tu ADC
MOV A,P0 ; Doc du lieu vao A
ACALL Ascii ; Chuyen doi tu so Hexa ra ma Ascii
ACALL Delay
SETB P1.2
SJMP Back
; Chuong trinh con hien thi len LCD nhiet do dat va nhiet do lo say
Display:
Acall LCD_init
ACALL Ndodat
ACALL Ndolo
RET
; Chuong trinh con tao tre
Delay:
MOV R0,#FFH
Delay1:
MOV R1,#FFH
Delay2:
NOP
NOP
DJNZ R1,Delay2
DJNZ R0,Delay1
RET
; Chuong trinh con khoi tao LCD
LCD_init:
MOV A,#38H ; LCD 2 dong ma tran 5x7
ACALL Command ; Goi chuong trinh con lenh
MOV A,#0CH ; Bat hien thi, tat con tro
ACALL Command
MOV A,#01H ; Xoa man hinh
ACALL Command
MOV A,#06H ;Dich hien thi sang phai
ACALL Command
MOV A,#80H ; Dua con tro tro ve dau dong thu nhat
ACALL Command
RET
; Chuong trinh con hien thi nhiet do dat
Ndodat:
MOV R1,#11
MOV DPTR,#STR1
Read1:
CLR A ; Xoa A
MOVC A,@A+DPTR ; Xuat mot ki tu
ACALL Datastr
INC DPTR
DJNZ R1,Read1
MOV A,R7
ACALL Ascii
RET
; Chuong trinh con hien thi nhiet do lo say
Ndolo:
MOV A,#C0H ; Dua con tro ve dau dong thu 2
ACALL Command ; Xuat lenh
MOV R1,#11
MOV DPTR,#STR2
Read2:
CLR A ; Xoa A
MOVC A,@A+DPTR ; Xuat mot ki tu
ACALL Datastr
INC DPTR ; Tang Dptr
DJNZ R1,Read2
RET
; Chuong trinh de LCD thuc hien lenh
Command:
ACALL Ready
MOV P2,A ; Dua du lieu thanh ghi A ra cong P2
CLR P3.5 ; RS = 0, Cho phep thu hien lenh
CLR P3.6 ; RW = 0, Cho phep ghi lenh
SETB P3.4; E = 1
CLR P3.4 ; E = 0
RET
; Chuong trinh de LCD viet du lieu
Datastr:
ACALL Ready
MOV P2,A ; Dua du lieu thanh ghi A ra cong P2
SETB P3.5; RS =1, Cho phep lam viec voi du lieu
CLR P3.6 ; RW = 0, Cho phep ghi du lieu
SETB P3.4; E = 1
CLR P3.4 ; E = 0
RET
; Chuong trinh kiem tra LCD da thuc hien xong lenh chua
Ready:
SETB P2.7; LCD dang ban
CLR P3.5 ; RS=0
SETB P3.6; RW=1
Back1:
CLR P3.4 ; E=0
SETB P3.4 ; E=1
JB P2.7,Back1 ;P2.7#0 quay ve BACK1
RET
; Chuong trinh chuyen doi tu so nhi phan ra ma Ascii
Ascii:
; Chuyen doi tu so nhi phan ra BCD va luu vao o nho co dia chi
;30H,31H,32H
MOV B,#10
DIV AB
MOV R2,A
MOV 32H,B
MOV A,R2
MOV B,#10
DIV AB
MOV 31H,B
MOV 30H,A
; Chuyen tu BCD ra Acsii va cho hien thi len LCD
MOV A,30H
ORL A,#30H
ACALL Datastr
MOV A,31H
ORL A,#30H
ACALL Datastr
MOV A,32H
ORL A,#30H
ACALL Datastr
RET
; Chuong trinh vi dieu khien lam viec khi co ngat ngoai INT0
ORG 100H
Interrupt0:
; dieu khien thyristor
; R6 luu tru gia tri tu ADC
; R7 luu tru gia tri nhiet do dat
SETb P1.5
MOV TMOD,#01 ; Chon Timer0 che do 1 (16bit)
ACALL NapT0
ACALL DelayT0
CLR P1.5; Kich thyristor
CLR C; Xoa co nho De chi tru R7 cho R6 (khong phai tru cho co nho)
MOV A,R7; Dua noi dung R7 vao A
SUBB A,R6; Tru noi dung thanh ghi A cho noi dung thanh ghi R6 va co nho
JNZ next1; Neu R6=R7 thi giu nguyen goc mo truoc do
SJMP Wait
Next1: JNC next2 ; Co nho khong duoc dat (R6 > R7)
; R6 <R7, Giam goc mo triac
Next2:; Tang goc mo triac
NapT0: MOV TL1,R4
MOV TH1,R3
Wait: RETI
DelayT0:
SETB TR0 ; Khoi dong Timer0
AGAIN : JNB TF0,AGAIN; Kiem tra co bo dinh thoi
CLR TR0 ; Dung Timer0
CLR TF0 ; Xoa co bo dinh thoi 0
RET
; Chuong trinh VDK lam viec khi co ngat ngoai INT1
ORG 200H
Interrupt1:
Start: MOV A,P1
ACALL Delay ; Goi chuong trinh tao tre
ANL A,#11000000B
CJNE A,#00000000B,Case1 ; Neu la phim tang thi thuc hien tang nhiet
;do dat
CJNE R7,#100,Tang
SJMP Jump1
Tang:
INC R7 ; Tang gia tri trong thanh ghi R7
Jump1: ACALL LCD_init
ACALL Ndodat
case1:
CJNE A,#01000000B,Case2 ;Neu la phim giam thi thuc hien giam nhiet
;do dat
CLR C
MOV A,R7
SUBB A,R6
CJNE A,#0,Giam
SJMP Jump2
Giam:
DEC R7 ; Giam gia tri trong thanh ghi R7
Jump2: ACALL LCD_init
ACALL Ndodat ; Goi chuong trinh hien thi nhiet do dat
Case2:CJNE A,#10000000B,Start ; Neu la phim lua chon thi hien thi nhu ban
;dau khoi dong
ACALL Ndolo
RETI
STR1: DB "N DO DAT :"
STR2: DB "N DO BUONG:"
END