Tải bản đầy đủ (.docx) (20 trang)

Chuẩn bị thí nghiệm vi điều khiển Đại Học Bách Khoa Hà Nội

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (90.22 KB, 20 trang )

Chuẩn bị thí nghiệm vi điều khiển

Bài 1: Điều khiển động cơ bước
Code assembly:
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:
MOV R1,#4
MOV A,#0FEH
SETB C
QUAY:MOV P1,A
LCALL DELAY
RL A
DJNZ R1,QUAY
SJMP MAIN
DELAY:
MOV R5,#20
L1: MOV R6,#20
L2: MOV R7,#248
DJNZ R7,$
DJNZ R6,L2
DJNZ R5,L1
RET
END
Bài 2: Hiển thị LCD 16x2
Code bằng C:
#include<regx51.h>
sbit rs=P3^3;
sbit rw=P3^4;
sbit en=P3^5;


sbit lcd_port=P0;
void delay_us(unsigned int t)
{
unsigned int i;
for(i=0;i<t;i++);
}
void delay_ms(unsigned int t)
{
unsigned int i,j;
for(i=0;i<t;i++)
{for(j=0;j<125;j++);}
}
// chuong trinh con tao mot xung tu cao xuong thap de kich chan chot tin hieu
void lcd_enable()
{
en=1;
delay_us(3);
en=0;
delay_us(50);
}
// ham gui lenh len lcd
void lcd_sendcommand(unsigned char command)
{
rs=1;
rw=0;
lcd_port=command;
lcd_enable();
}
// chuong trinh con ghi du lieu len LCD
void lcd_senddata(unsigned char data)

{
rs=0;
rw=0;
lcd_port=data;
lcd_enable();
}
void lcd_clear()
{
lcd_sendcommand(0x01);
delay_us(10);
}
// chuong trinh con khoi tao lcd
void init()
{
lcd_sendcommand(0x030); //chon che do 8 bit du lieu
delay_ms(5);
lcd_sendcommand(0x38); // chon hien thi 2 dong va ma tran 5x7
delay_ms(5);
lcd_sendcommand(0x0C); // bat hien thi, tat con tro
delay_ms(5);
lcd_sendcommand(0x06);
delay_ms(5);
lcd_sendcommand(0x01); // clear man hinh lcd
delay_ms(5);
}
// chuong trinh con tro ve dau dong
void lcd_home()
{
lcd_sendcommand(0x80);
}

// chuong trinh con gui mot kis tu len lcd
void lcd_putchar(unsigned char data)
{
rs=1;
lcd_sendcommand(data);
rs=0;
}
// chuong trinh con gui mot chuoi ki tu len lcd
void lcd_puts(unsigned char *s)
{
while(*s)
{
lcd_putchar(data);
s++;
}
}
// ********************* ham main****************************
main()
{
lcd_init(); // khoi tao lcd
delay_ms(1000);
lcd_Puts("DESIGNER LE THIEN DUC");//Gui chuoi len LCD
delay_ms(1000);
lcd_Clear();//Xoa man hinh
lcd_Gotoxy(0,0);//Tro toi vi tri
lcd_Puts("Test LCD ");
delay_ms(2000);
lcd_clear();
lcd_Gotoxy(0,1);//Tro toi vi tri
lcd_Puts("PHIM BAN NHAN LA");

while(1);//ko lam gi ca
{

}
}
Bài 3: Quét bàn phím hiển thị led 7 thanh
;chuong trinh quyet ban phim va hien thi LED
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#10000010b ; đây là từ điều khiển xuất ra từ vđk port
A,port C là đầu ra còn port B là đầu vào
MOV DPTR,#8003H ; chọn thanh ghi điều khiển
MOVX @DPTR,A ; xuất từ điều khiển
MOV A,#11110000b
MOV DPTR,#8001H ; chỏ tới địa chỉ của port B
MOVX @DPTR,A ; cài đặt cho các bit cao của port B ở mức
cao
; Đây là chương trình con kiểm tra phím đã được nhả hay chưa( đấy là sau khi bấm
phím) để đảm bảo chắc chắn rằng phím ấn trước đo đã dc nhả ra
KEY1: MOV A,#11110000B
MOV DPTR,#8000H
MOVX @DPTR,A
MOV DPTR,#8001H
MOVX A,@DPTR
ANL A,#11110000B
CJNE A,#11110000B,KEY1
; Đây là chương trình con kiểm tra xem có phím nào được ấn hay không và chờ
một phím được ấn

KEY2:
ACALL DELAY ;chờ khoảng 20ms
MOV DPTR,#8001H ; trỏ tới địa chỉ của port B
MOVX A,@DPTR ; đọc tất cả các hàng
ANL A,#11110000B ; che các bit không dùng tới
CJNE A,#11110000B,OVER ; Nếu có phim dc ấn thì nhảy đến chương
trình con OVER (chương trình con đảm bảo cho bàn phim không bị lỗi xung nhiểu
gây ra và kiểm tra xem phím đã dc nhấn thực sự hay không)
SJMP KEY2 ; Nếu các bit cao của port B đều là mức cao thì quay lạ
nhãm KEY2 lặp lại quá trình quét
; chương trình con đảm bảo cho bàn phim không bị lỗi xung nhiểu gây ra và kiểm
tra xem phím đã dc nhấn thực sự hay không
OVER:
LCALL DELAY ; chờ ấn xong
MOV DPTR,#8001H; ; chỏ tới địa chỉ của port B
MOVX A,@DPTR ; đọc dữ liệu từ port B
ANL A,#11110000B ; che cac bit khong dung
CJNE A,#11110000B,OVER1 ; neu phim dc bam,nhay den chuong trinh
tim hang
SJMP KEY2 ; neu khong thi kiem tra lai
;chương trìnhh con tìm hàng
OVER1:
MOV A,#11111110B
MOV DPTR,#8000H ; chọn port A
MOVX @DPTR,A ; tiếp đất cột 1
MOV DPTR,#8001H; ; chọn port B
MOVX A,@DPTR ; đọc tất cả các hàng
ANL A,#11110000B ; che các bit không dùng
CJNE A,#11110000B,FIND_HANG1 ; cot 1, tìm hàng
LCALL DELAY

MOV A,#11111101B ; tiếp đất cột 2
MOV DPTR,#8000H ; chọn port A
MOVX @DPTR,A; ; xuất dữ liệu ra port A
MOV DPTR,#8001H; ; chọn port B
MOVX A,@DPTR
ANL A,#11110000B
CJNE A,#11110000B,FIND_HANG2
LCALL DELAY
MOV A,#11111011B ; tiep dat cot 3
MOV DPTR,#8000H; ; chọn port A
MOVX @DPTR,A ; XUAT DU LIEU RA PORT A
MOV DPTR,#8001H; ; CHON PORT B
MOVX A,@DPTR ; đọc tất cả các hàng
ANL A,#11110000B
CJNE A,#11110000B,FIND_HANG3
LJMP KEY2
; tập chương trình con tìm phím dã dc ấn
FIND_HANG1:
MOV DPTR,#8001H ; CHON PORT B
MOVX A,@DPTR ; LAY TIN HIEU TU PORT B
ANL A,#11110000B
SO_1: CJNE A,#10110000B,SO_4 ; kiểm tra xem phím số 4 có dc ấn
không?,nếu không thì nhảy đến SO_4 tìm tiếp
LJMP HT_1 ; nếu phím dc ấn thì nhảy dến chương trình
con hiển thị số 1 lên led
SO_4:
CJNE A,#11010000B,SO_7
LJMP HT_4
SO_7:
CJNE A,#11100000B,FIND_HANG2

LJMP HT_7
FIND_HANG2:
MOV DPTR,#8001H; CHON PORT B
MOVX A,@DPTR; LAY TIN HIEU TU PORT B
ANL A,#11110000B
SO_0:
CJNE A,#01110000B ,SO_2
LJMP HT_0
SO_2:
CJNE A,#10110000B,SO_5
LJMP HT_2
SO_5:
CJNE A,#11010000B,SO_8
LJMP HT_5
SO_8:
CJNE A,#11100000B,FIND_HANG3
LJMP HT_8
FIND_HANG3:
MOV DPTR,#8001H; CHON PORT B
MOVX A,@DPTR ; LAY TIN HIEU TU PORT B
ANL A,#11110000B
SO_9:
CJNE A,#11100000B,SO_3
LJMP HT_9
SO_3: CJNE A,#10110000B,SO_6
LJMP HT_3
SO_6:
CJNE A,#11010000B,FIND_HANG1
LJMP HT_6


HT_9:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#00001001B;
MOVX @DPTR,A;
LJMP KEY1
HT_7:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#00000111B;
MOVX @DPTR,A;
LJMP KEY1
HT_4:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#00000100B;
MOVX @DPTR,A;
LJMP KEY1
HT_1:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#00000001B;
MOVX @DPTR,A;
LJMP KEY1
HT_3:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#11110011B;
MOVX @DPTR,A;
LJMP KEY1
HT_6:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#11110110B;
MOVX @DPTR,A;
LJMP KEY1

HT_2:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#11110010B;
MOVX @DPTR,A;
LJMP KEY1
HT_0:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#11110000B; HIEN THI SO 0
MOVX @DPTR,A;
LJMP KEY1
HT_8:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#11111000B;
MOVX @DPTR,A;
LCALL DELAY
LJMP KEY1
HT_5:
MOV DPTR,#8002H; CHO TOI DIA CHI CUA PC
MOV A,#11110101B;
MOVX @DPTR,A
LJMP KEY1

DELAY:
MOV R1,#4
L1: MOV R2,#10
L2: MOV R3,#249
L3: DJNZ R3,L3
DJNZ R2,L2
DJNZ R1,L1
RET

END













Bài 14: Giao tiếp relay với Led đơn
ORG 0000H
SJMP MAIN
ORG 0030H
MAIN:
;CAI DAT IC 82C55
MOV A,#82H ; CHON PA,PC LA DAU RA CON PB LA
DAU VAO
MOV DPTR,#8003H
MOVX @DPTR,A
MOV DPTR,#8001H ; CHON PORT B
MOV A,#0FFH
MOVX @DPTR,A
;CHUONG TRINH CON KIEM TRA XEM PHIM CO DC AN KHONG
BACK:
MOV DPTR,#8001H

MOVX A,@DPTR
ANL A,#00FH ; CHE CAC BIT KHONG DUNG
CJNE A,#00FH,PHIM_1
SJMP BACK
; CHUONG TRINH CON QUET PHIM
PHIM_1:
LCALL DELAY
MOV DPTR,#8001H
MOVX A,@DPTR ; LAY DU LIEU TU PORT B
ANL A,#0FH
CJNE A,#00001110B,PHIM_2 ; NEU PHIM 1 KO DC AN,NHAY
DEN CHUONG TRINH QUET PHIM 2
SJMP RL_1 ; NEU PHIM 1 DC AN, BAT RELAY 1
PHIM_2: LCALL DELAY
MOV DPTR,#8001H
MOVX A,@DPTR ; LAY DU LIEU TU PORT B
ANL A,#0FH
CJNE A,#00001101B,PHIM_3
SJMP RL_2
PHIM_3: LCALL DELAY
MOV DPTR,#8001H
MOVX A,@DPTR ; LAY DU LIEU TU PORT B
ANL A,#0FH
CJNE A,#00001011B,PHIM_4
SJMP RL_3
PHIM_4: LCALL DELAY
MOV DPTR,#8001H
MOVX A,@DPTR ; LAY DU LIEU TU PORT B
ANL A,#0FH
CJNE A,#00000111B,BACK

SJMP RL_4
; CHUONG TRINH DIEU KHIEN RELAY
RL_1: MOV DPTR,#8000H ; CHO TOI DIA CHI CUA PORT A
MOV A,#00000001B
MOVX @DPTR,A
LJMP BACK
RL_2:
MOV DPTR,#8000H
MOV A,#00000010B
MOVX @DPTR,A
LJMP BACK
RL_3:
MOV DPTR,#8000H
MOV A,#00000100B
MOVX @DPTR,A
LJMP BACK
RL_4:
MOV DPTR,#8000H
MOV A,#00001000B
MOVX @DPTR,A
LJMP BACK
RET
;HAM TRE
DELAY: mov r0,#1
loop1:mov r1,#10
loop2:mov r2,#255
loop3:djnz r2,loop3
djnz r1,loop2
djnz r0,loop1
ret

END
CHỈNH SỬA BÀI CỦA THẦY:
org 00h
ljmp main
org 30h
porta equ 8000h
portb equ 8001h
portc equ 8002h
strc equ 8003h
main:
mov a,#10000010b
mov dptr,#strc
movx @dptr,a
mov a,#0ffh
mov dptr,#portb
movx @dptr,a
back:
acall delay
mov dptr,#portb
movx a,@dptr
anl a,#0fh
cjne a,#0fh,over
sjmp back
over:
acall delay
mov dptr,#portb
movx a,@dptr
anl a,#00001111b
cjne a,#00001110b,but1
sjmp rl_0

but1:
mov dptr,#portb
movx a,@dptr
anl a,#00001111b
cjne a,#00001101B,but2
sjmp rl_1
but2:
mov dptr,#portb
movx a,@dptr
anl a,#00001111b
cjne a,#00001011B,but3
sjmp rl_2
but3:
mov dptr,#portb
movx a,@dptr
anl a,#00001111b
cjne a,#00000111B,but1
sjmp rl_3
rl_0:
mov a,#00000001b
mov dptr,#porta
movx @dptr,a
ljmp back
rl_1:
mov a,#00000010b
mov dptr,#porta
movx @dptr,a
ljmp back
rl_2:
mov a,#00000100b

mov dptr,#porta
movx @dptr,a
ljmp back
rl_3:
mov a,#00001000b
mov dptr,#porta
movx @dptr,a
ljmp back
delay:mov r0,#1
loop1:mov r1,#10
loop2:mov r2,#255
loop3:djnz r2,loop3
djnz r1,loop2
djnz r0,loop1
ret
delayrun:
mov r0,#3
loop11: mov r1,#255
loop12: mov r2,#255
loop13: djnz r2,loop13
djnz r1,loop12
djnz r0,loop11
ret
end


×