*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 . 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. 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. 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