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

Bài tập lớn "Hệ vi xử lý ONCHIP 8" ppt

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 (490.66 KB, 13 trang )

LỜI MỞ ĐẦU
Ngày nay, nhờ sự phát triển của công nghệ điện tử, nhất là công nghệ chế
tạo vi điện tử, đồng thời cùng với sự phát triển của các thế hệ máy vi tính, các
bộ vi điều khiển cũng được ra đời và phát triển. Các bộ vi điều khiển đang có
ứng dụng ngày càng rộng rãi và thâm nhập ngày càng nhiều trong lĩnh vực kỹ
thuật và đời sống xã hội. Hầu hết các thiết bị kỹ thuật từ phức tạp cho đến đơn
giản như thiết bị điều khiển tự động, thiết bị văn phòng,và các thiết bị chất
lượng cao trong gia đình đều có dùng các bộ vi điều khiển. Hệ vi xử lý
ONCHIP 89C51 là một hệ vi điều khiển có đầy đủ chức năng của hệ vi xử lý
8bit có nhiều chức năng đặc biệt, được áp dụng điều khiển các thiết bị thông tin,
viễn thông như trong các hệ thống điều khiển đèn giao thông, truyền tin nối tiếp,
truyền tin song song, đo độ rộng xung. Trong đó,đo độ rộng xung dùng 89C51
được sử dụng rất nhiều trong các thiết bị phát hiện xung, đồng hồ đo xung,
đồng hồ đo tốc độ, cũng có thể được sử dụng trong thiết bị điều chỉnh độ rộng
xung, ứng dụng trong công nghệ Rada, thông tin để thu tin và phát hiện mục
tiêu,vv….
Em xin chân thành cảm ơn thầy Nguyễn Hải Dương đã giúp em hoàn thành
đồ án này.


1
I. MÔ TẢ CHỨC NĂNG CỦA HỆ THỐNG
Thiết kế hệ thống đo độ rộng xung 6 kênh trên hệ VXL on-chip 89C51 với
focs= 12 MHz trên hệ vi xủa Bài toán đặt ra là thiết kế hệ thống đo độ rộng
xung dùng 89C51. Chức năng của hệ thống gắn liền với yêu cầu thực tế đặt ra là
xuất hiện một xung bất kỳ và nhiệm vụ là phải tính toán được độ rộng của xung
tai thời điểm bất kỳ. Xung xuất hiện là không biết trước dạng và đặc tính của
nó, xung có thể được đưa tới từ một bộ thu tin nào đó hay từ một bộ tạo xung.
Xung cần đo độ rộng được đưa vào chân tín hiệu INTO(bit P3.2 – chân IC 12),
kết quả đo phải chứa trong 2 thanh ghi: R1 chứa byte cao của kết quả, R0 chứa
byte thấp của kết quả.


Hệ thống hiển thị sử dụng mà hình LCD 16*2 với thông tin hiển thị gồm
số hiệu kênh và độ rộng xung. Việc lựa chọn kênh hiển thị qua bàn phím điện
thoại.
II. THIẾT KẾ PHẦN CỨNG
2.1. Sơ đồ khối của hệ thống
2
Hình 1: Sơ đồ khối của hệ thống
DISPLAY
Chức năng của các khối:
1. Khối nguồn +5V( Source +5V) : Cung cấp nguồn để VĐK hoạt động
2. Bàn phím (Key pad) : để lựa chọn kênh hiển thị
3. VĐK (MCU): Xử lý tín hiệu đưa vào để tính toán độ rộng xung và đưa
giá trị tương ứng đến LCD
4. Khối hiển thị (LCD) : Hiện thị kết quả đo được
5. 6 kênh xung cần đo( 6 channel input): Có thể là xung từ bộ thu tin hoặc
bộ tạo xung
6. Bộ chuyển mạch (Switch) lựa chọn kênh xung cần đo
2.2. Sơ đồ nguyên lý của hệ thống ( thiết kế trên phần mềm proteus)
3
Hình 2: Sơ đồ nguyên lý của hệ thống
Các linh kiện được sử dụng
1. Vi điều khiển AT89C51
2. Key pad –phone
Bàn phím này gồm 12 phím chia làm 4 hàng, 3 cột
3. LCD 16*2
Các địa chỉ của vị trí con trỏ của LCD 16*2 như sau
16 × 2 LCD
80
C0
81

C0
82
C2
83
C3
84
C4
85
C5
86
C6
Through
Through
8F
CF
4. IC cầu W005G và IC 7805 để tạo nguồn 5V
5. IC MUX 74151
IC 74151 có chân lý như sau:
Tín hiệu vào Tín hiệu ra
/E C B A Y= kênh
0 0 0 0 0
0 0 0 1 1
0 0 1 0 2
0 0 1 1 3
0 1 0 0 4
0 1 0 1 5
0 1 1 0 6
0 1 1 1 7
1 X X X Y=0
Yêu cầu bài toán là đo độ rộng xung 6 kênh nên ta sử dụng tổ hợp

6 tín hiệu đầu tương ứng như sau:
Kênh CBA Kênh CBA
1 000 4 011
2 001 5 100
3 010 6 101
6. Thạch anh 12MHZ
7. Điện trở, tụ điện, LED.
III. XÂY DỰNG THUẬT TOÁN
4
III.1. Phân tích bài toán
Hệ thống đo độ rộng xung có sơ đồ như trên hình 3.Phương pháp đo độ
rộng: ta chèn một chuỗi xung chuẩn(xung răng lược) có độ rộng xác định trước
trong thời gian tồn tại của xung cần đo.
Độ rộng xung cần đo=(chu kỳ xung răng lược)*(số lượng xung răng lược).
Sai số của phép đo max = ½ chu kỳ xung răng lược
Vì tần số dao động nội = 12MHz/12 = 1MHz nên chu kỳ xung răng lược =
1 micro giây nên nội dung Timer0 chính là kết quả. Sử dụng Timer0 chạy ở
mode 1-16bit để tạo xung răng lược. Muốn vậy, thanh ghi TMOD = 09H =
00001001(gate0=1, tạo điều kiện cho INTO được kích hoạt Timer0, C/TO = 0
làm việc với dao động nội, M1M0=01 cho Timer0 = mode 1).
Khởi đầu cần xóa cờ TF0 và cấm Timer0 chạy TR0. Do đó TCON =00H=
0000 0000 (TF0 = TR0 =0)
III.2. Lưu đồ thuật toán
5
INT0
Hình 3: Sơ đồ hệ đo độ rộng xung
6
Hình 4: Lưu đồ thuật toán của hệ thống
Y
IV. XÂY DỰNG PHẦN MỀM

; KHAI BA0 VA DINH NGHIA
E_LCD EQU P1.0 ;chan cho phep cua LCD
RW_LCD EQU P1.1 ;chan dieu khien doc/ghi
RS_LCD EQU P1.2 ;chan chon thanh ghi data/command
CHECK EQU P1.3
PORT_LCD EQU P2 ;cong du lieu cua LCD
READY_PIN EQU P2.7 ;chan kiem tra su san sang cua LCD
LCD_CLR EQU 01H
RDY_LCD EQU 20H
ROW1 EQU P0.0
ROW2 EQU P0.1
COL1 EQU P0.4
COL2 EQU P0.5
COL3 EQU P0.6
STATE1 EQU P1.5
STATE2 EQU P1.6
STATE3 EQU P1.7
INPUT_PULSE EQU P3.2 ;chan tin hieu dau vao
; CHUONG TRINH CHINH
ORG 0000H
CLR CHECK
LJMP MAIN ;goi den chuong trinh chinh va bo qua cac ISR ngat
RET
ORG 30H
;
MAIN:
ACALL INSTALLATION ;khoi tao he thong
JB CHECK, MAIN_SUB
MAINLOOP:
SETB PSW.4

CLR ROW1
JNB COL1,KEY1
JNB COL2,KEY2
JNB COL3,KEY3
SETB ROW1
;
CLR ROW2
JNB COL1,KEY4
JNB COL2,KEY5
JNB COL3,KEY6
SETB ROW2
;
JMP MAINLOOP
7
;
KEY1:
JNB COL1, KEY1
MOV R7,#'1'
SETB ROW1
CLR STATE1
CLR STATE2
CLR STATE3
JMP FREE
KEY2:
JNB COL2, KEY2
MOV R7,#'2'
SETB ROW1
SETB STATE1
CLR STATE2
CLR STATE3

JMP FREE
KEY3:
JNB COL3, KEY3
MOV R7,#'3'
SETB ROW1
CLR STATE1
SETB STATE2
CLR STATE3
JMP FREE
KEY4:
JNB COL1, KEY4
MOV R7,#'4'
SETB ROW2
SETB STATE1
SETB STATE2
CLR STATE3
JMP FREE
KEY5:
JNB COL2, KEY5
MOV R7,#'5'
SETB ROW2
CLR STATE1
CLR STATE2
SETB STATE3
JMP FREE
KEY6:
JNB COL3, KEY6
MOV R7,#'6'
SETB ROW2
SETB STATE1

CLR STATE2
SETB STATE3
JMP FREE
;
FREE:
SETB CHECK
CLR PSW.4
;
MAIN_SUB:
ACALL MEASURE_PULSE_WIDTH
ACALL PROCESS_AND_DISPLAY
RET ;Ket thuc chuong
trinh chinh
INSTALLATION: ; chuong trinh khoi tao he
thong
ACALL INSTALL_LCD ;khoi dong LCD
SETB INPUT_PULSE ;goi chan tin hieu la
dau vao
RET
; MODULE DO DO RONG XUNG
MEASURE_PULSE_WIDTH:
MOV R1,#00
MOV R0,#00
MOV TMOD,#09H
MOV TCON,#00H
SETB TR0
;
PULSE_CHECK:JB INPUT_PULSE,PULSE_CHECK
8
CLR TF0

MOV TH0,#00
MOV TL0,#00
;
PULSE_LOW:
JNB INPUT_PULSE,PULSE_LOW ;neu xung vao co muc
thap
; neu co Xung vao co muc tich cuc cao thi bat dau do
PULSE_HIGH:
JB INPUT_PULSE,PULSE_HIGH ;van dang co xung
; neu da het xung thi doc tin hieu Do Rong
JB TF0,PULSE_CHECK
MOV R0,TL0 ;byte thap > R0
MOV R1,TH0 ;byte cao > R1
RET
; Chuong trinh con xu ly tin tuc do duoc va Hien thi len LCD
PROCESS_AND_DISPLAY:
; Dong 1
MOV A,#80h
ACALL
COMMWRT
MOV A,#"("
ACALL
DATAWRT
MOV A,#"^"
ACALL
DATAWRT
MOV A,#"_"
ACALL
DATAWRT
MOV A,#"^"

ACALL
DATAWRT
MOV A,#")"
ACALL
DATAWRT
MOV A,#" "
ACALL
DATAWRT
MOV A,#"C"
ACALL
DATAWRT
MOV A,#"H"
ACALL
DATAWRT
MOV A,#"A"
ACALL
DATAWRT
MOV A,#"N"
ACALL
DATAWRT
MOV A,#"N"
ACALL
DATAWRT
MOV A,#"E"
ACALL
DATAWRT
MOV A,#"L"
ACALL
DATAWRT
MOV A,#" "

ACALL
DATAWRT
SETB PSW.4
MOV A,R7
ACALL
DATAWRT
CLR PSW.4
9
; Dong 2
MOV A,#0C0h
MOV A,#"P"
ACALL DATAWRT
MOV A,#"W"
ACALL DATAWRT
MOV A,#"="
ACALL DATAWRT
MOV R3
,#HIGH(10000)
MOV R2
,#LOW(10000)
LCALL DIV16_16
MOV A ,R2
ADD A ,#30H
ACALL DATAWRT;
R5
MOV R3
,#HIGH(1000)
MOV R2 ,#LOW(1000)
LCALL DIV16_16
MOV A ,R2

ADD A ,#30HACALL
DATAWRT; R4
MOV R3 ,#HIGH(100)
MOV R2 ,#LOW(100)
LCALL DIV16_16
MOV A ,R2
ADD A ,#30H
ACALL DATAWRT ;
R3
MOV R3 ,#HIGH(10)
MOV R2 ,#LOW(10)
LCALL DIV16_16
MOV A ,R2
ADD A ,#30H
ACALL DATAWRT ;
R2
MOV A ,R0
SUBB A,# ;bu sai
so
ADD A ,#30H
ACALL DATAWRT
MOV A,#"u"
ACALL DATAWRT
MOV A,#"s"
ACALL DATAWRT
MOV R0,#0000H
MOV R1,#0000H
MOV R2,#0000H
MOV R3,#0000H
MOV R4,#0000H

MOV R5,#0000H
JMP MAIN
; Chuong trinh chia so 16 bit duoc tham khao tu:
;
div16_16:
CLR C ;Clear carry initially
MOV R4,#00h ;Clear R4 working variable initially
MOV R5,#00h ;CLear R5 working variable initially
MOV B,#00h ;Clear B since B will count the number of left-shifted
bits
div1:
INC B ;Increment counter for each left shift
MOV A,R2 ;Move the current divisor low byte into the
accumulator
RLC A ;Shift low-byte left,
MOV R2,A ;Save the updated divisor low-byte
MOV A,R3 ;Move the current divisor high byte into the
accumulator
10
RLC A ;Shift high-byte left high, rotating in carry from low-
byte
MOV R3,A ;Save the updated divisor high-byte
JNC div1 ;Repeat until carry flag is set from high-byte

div2: ;Shift right the divisor
MOV A,R3 ;Move high-byte of divisor into accumulator
RRC A ;Rotate high-byte of divisor right and into carry
MOV R3,A ;Save updated value of high-byte of divisor
MOV A,R2 ;Move low-byte of divisor into accumulator
RRC A ;Rotate low-byte of divisor right, with carry from

high-byte
MOV R2,A ;Save updated value of low-byte of divisor
CLR C ;Clear carry, we don't need it anymore
MOV 07h,R1 ;Make a safe copy of the dividend high-byte
MOV 06h,R0 ;Make a safe copy of the dividend low-byte
MOV A,R0 ;Move low-byte of dividend into accumulator
SUBB A,R2 ;Dividend - shifted divisor = result bit (no factor, only
0 or 1)
MOV R0,A ;Save updated dividend
MOV A,R1 ;Move high-byte of dividend into accumulator
SUBB A,R3 ;Subtract high-byte of divisor
MOV R1,A ;Save updated high-byte back in high-byte of divisor
JNC div3 ;If carry flag is NOT set, result is 1
MOV R1,07h ;Otherwise result is 0, save copy of divisor to undo
subtraction
MOV R0,06h
div3:
CPL C ;Invert carry, so it can be directly copied into result
MOV A,R4
RLC A ;Shift carry flag into temporary result
MOV R4,A
MOV A,R5
RLC A
MOV R5,A
DJNZ B,div2 ;Now count backwards and repeat until "B" is zero
MOV R3,05h ;Move result to R3/R2
MOV R2,04h ;Move result to R3/R2
RET
; MODULE LCD
INSTALL_LCD: ;chuong trinh con khoi tao cho LCD

MOV A,#38H ;gui lenh tao LCD 2 dong
ACALL COMMWRT
11
MOV A,#0CH ;gui lenh hien thi man hinh va tat con tro
ACALL COMMWRT
MOV A,#80H ;dua con tro ve hang 1, cot 1
ACALL COMMWRT
RET
;
COMMWRT:
CALL READY
MOV PORT_LCD, A
CLR RS_LCD
CLR RW_LCD
SETB E_LCD
NOP
NOP
CLR E_LCD
RET
;
DATAWRT:
CALL READY
MOV PORT_LCD, A
SETB RS_LCD
CLR RW_LCD
SETB E_LCD
NOP
NOP
CLR E_LCD
RET

;
READY:
CLR E_LCD
CLR RS_LCD
SETB RW_LCD
MOV PORT_LCD, #0FFH
SETB E_LCD
JB PORT_LCD.7, READY
CLR E_LCD
CLR RW_LCD
RET
DELAY:
MOV R5, #250
DELAY1:
MOV R6, #255
DELAY2:
DJNZ R6, DELAY2
12
DJNZ R5, DELAY1
RET
END
;
V. NẠP CHƯƠNG TRÌNH CHO HỆ LÀM VIỆC
KẾT LUẬN
Chương trình cho phép đo chính xác độ rộng xung 6 kênh
Lựa chọn kênh hiển thị qua bàn phím, có thể mở rộng đo nhiều kênh hơn
Giá trị hiển thị trên màn hình là 16 bít cho nên có thể đo xung có tần số
nhỏ . Ví dụ, với xung có độ rộng 90% thì tần số có thể là 15Hz
13

×