- •Отчет по курсовой работе
- •2. Структурная схема системы.
- •3. Реализация логической функции.
- •3.1. Метод с использованием условных переходов.
- •3.2. Метод с использованием булевых операций.
- •3.3. Табличный метод.
- •3.4. Сравнение методов.
- •4. Карта распределения адресных пространств.
- •4. Оценка характеристик работы системы.
4. Оценка характеристик работы системы.
Время выполнения отдельных частей кода приведено в таблице:
|
Подпрограмма |
Время |
|
Подготовка, инициализация |
29 мкс |
|
Чтение клавиатуры |
59 мкс |
|
Выполнение символа с клавиатуры |
7 мкс |
|
Запуск АЦП |
34 мкс |
|
Обработка датчиков ДД |
12 мкс |
|
Обработка аналоговых датчиков |
27 мкс |
|
Управление двигателем |
12 мкс |
|
Обработка значений температуры |
29 мкс |
|
Всего |
207 мкс |
Полный текст программы с комментариями приведен в листинге 4.
Листинг 1.
$Mod812
JMP START
ORG 30H
Y BIT P0.4
START: MOV A, P0 ; load data
RRC A ; put X4 into C
JNC CHK_X3 ; if X4 == 0, check X3
RRC A
CHK_X2: RRC A ; else put X2 into C
JNC CHK_X1 ; if X2 == 0, check X1
SET_Y0: CLR Y ; else output 0
JMP START
CHK_X1: RRC A ; get X1
JC SET_Y1 ; if X1 == 1 output 1
JMP SET_Y0 ; else output 0
CHK_X3: RRC A ; get X3
JNC SET_Y1 ; if X3 == 0 output 1
JMP CHK_X2 ; else check X2
SET_Y1: SETB Y
JMP START
END
Листинг 2.
$Mod812
JMP START
ORG 30H
X1 BIT ACC.3
X2 BIT ACC.2
X3 BIT ACC.1
X4 BIT ACC.0
Y BIT P0.4
START: MOV A, P0
MOV C, X1
ANL C, /X2
MOV F0, C
MOV C, X3 ; "MOV C, /X3" do not work
CPL C ; so use inversion...
ANL C, /X4
ORL C, F0
MOV Y, C
JMP START
END
Листинг 3.
$Mod812
JMP START
ORG 30H
Y BIT P0.4
START: MOV R0, #20H
MOV @R0, #1H
INC R0
MOV @R0, #0H
INC R0
MOV @R0, #0H
INC R0
MOV @R0, #0H
INC R0
MOV @R0, #1H
INC R0
MOV @R0, #0H
INC R0
MOV @R0, #0H
INC R0
MOV @R0, #0H
INC R0
MOV @R0, #1H
INC R0
MOV @R0, #1H
INC R0
MOV @R0, #1H
INC R0
MOV @R0, #1H
INC R0
MOV @R0, #1H
INC R0
MOV @R0, #0H
INC R0
MOV @R0, #0H
INC R0
MOV @R0, #0H
MOV R0, #20H
MOV R2, #0FH
FIND: MOV A, P0
ANL A, R2
ADD A, R0
MOV R1, A
MOV A, @R1
JNB ACC.0, SET_Y1
SETB Y
JMP FIND
SET_Y1: CLR Y
JMP FIND
END
Листинг 4.
$Mod812
; _________________________________________________________
; DEFINES
; memory defines
keypressed data 20h
isnewkey data 21h
inputvalue data 22h
adcK data 23h
U1 data 24h
U2 data 25h
Temp1 data 26h
Temp2 data 27h
Temp3 data 28h
Tm0_code data 29h
prev_y1 data 2Ah
Q data 2Bh
engine_disabled data 2Ch
Tmin data 2Dh
Tmax data 2Eh
Tcp data 2Fh
Nasos1_time data 30h
Nasos2_time data 31h
nasos_prev_state data 32h
LED_period data 33h
; keyboard defines
line0 bit P0.0
line1 bit P0.1
line2 bit P0.2
line3 bit P0.3
col0 bit P1.0
col1 bit P1.1
col2 bit P1.2
col3 bit P1.3
col4 bit P1.4
; X inputs
X1 bit P0.7
X2 bit P0.6
X3 bit P0.5
X4 bit P0.4
; Other inputs
L1 bit P1.6
L2 bit P1.7
Ueng bit P1.5
DTR bit P3.6
; Y outputs
Y1 bit P2.0
Y23 bit P2.1
Y4 bit P2.2
Y5 bit P2.3
Y6 bit P2.4
Yeng bit P2.5
Ysignal bit P2.6
; Other outputs
DSR bit P3.5
MuxSel bit P3.4
Nasos1 bit P3.7
Nasos2 bit P2.7
; _________________________________________________________
; INSTRUCTION MEMORY
jmp init
org 03h
jmp int0_handler
org 0Bh ; Timer 0 overflow
jmp timer0_int
org 13h
jmp int1_handler
org 50h ; Program start
; _________________________________________________________
; INIT ROUTINE
init:
; Interrupts config
mov IE, #0FFh ; enable all interrupts
clr IE.6 ; disable ADC interrupt
mov TCON, #05h ; enable int0 and int1 by edge
; PIO
mov P1, #0 ; all P0 are inputs
mov P2, #0 ; clear P2
mov P3, #0 ; clear P3
; ADC
mov ADCCON1, #50h ; set normal mode, 1/8 clk
mov ADCCON2, #10h ; select channel 0
; Move stack pointer
mov SP, #80h
; Init timers
mov TMOD, #00h
; Set constants
mov Q, #55h
mov Tmin, #41h
mov Tmax, #80h
; UART
mov SCON, #50h ; mode2, receive enable
; _________________________________________________________
; MAIN APPLICATION
start:
call readkey
call process_key
call run_adc
call process_ddd
call process_analog
call process_engine
call process_temperature
call process_nasos
jmp start
; _________________________________________________________
; SEND HEX VALUE BY UART
send_hex:
mov A, R0
swap A
anl A, #0Fh
add A, #30h
mov R1, A
subb A, #3Ah
mov A, R1
jc no_add_7_1
add A, #7h
no_add_7_1:
mov SBUF, A
mov A, R0
anl A, #0Fh
add A, #30h
mov R1, A
subb A, #3Ah
mov A, R1
jc no_add_7_2
add A, #7h
no_add_7_2:
mov SBUF, A
mov SBUF, #68h
mov SBUF, #20h
ret
; _________________________________________________________
; SEND BIN VALUE BY UART
send_bin:
jc send_1bin
mov SBUF, #30h
jmp send_bin_exit
send_1bin:
mov SBUF, #31h
send_bin_exit:
mov SBUF, #62h
mov SBUF, #20h
ret
; _________________________________________________________
; INT 1 HANDLER
int1_handler:
; start LED indication
setb IP.1 ; increase timer 0 priority
mov TMOD, #01h ; set mode1 on timer 0
mov TL0, #00h
mov TH0, #00h
mov Tm0_code, #03h ; handler parameter
mov LED_period, #0h
setb TCON.4 ; start timer (65k cycles)
; send data to UART
mov SBUF, #20h
mov SBUF, #20h
mov C, X1
call send_bin
mov C, X2
call send_bin
mov C, X3
call send_bin
mov C, X4
call send_bin
mov R0, Tcp
call send_hex
mov R0, adcK
call send_hex
mov R0, Q
call send_hex
mov C, L1
call send_bin
mov C, L2
call send_bin
; go in endless loop
jmp finish
reti
; _________________________________________________________
; PROCESS NASOS
process_nasos:
; Increment nasos1 timer if enabled
jnb Nasos1, no_n1_inc
inc Nasos1_time
no_n1_inc:
; Increment nasos2 timer if enabled
jnb Nasos2, no_n2_inc
inc Nasos2_time
no_n2_inc:
; Enable or disable nasos 1 and 2
mov C, L1
mov B.0, C
mov C, L2
mov B.1, C
mov A, B
cjne A, nasos_prev_state, nasos_change_state
jmp nasos_exit
nasos_change_state:
jnb L1, disable_all
jb L2, enable_all
; run one
mov A, Nasos1_time
subb A, Nasos2_time
jc run_nasos1
setb Nasos2
clr Nasos1
jmp nasos_save_state
run_nasos1:
setb Nasos1
clr Nasos2
jmp nasos_save_state
; disable all
disable_all:
clr Nasos1
clr Nasos2
jmp nasos_save_state
; enable all
enable_all:
setb Nasos1
setb Nasos2
jmp nasos_save_state
nasos_save_state:
mov C, L1
mov B.0, C
mov C, L2
mov B.1, C
mov nasos_prev_state, B
nasos_exit:
ret
; _________________________________________________________
; PROCESS TEMPERATURE
process_temperature:
mov A, Temp3
rrc A
clr C
rrc A
clr C
mov R0, A
mov A, Temp2
rrc A
clr C
rrc A
clr C
mov R1, A
mov A, Temp1
rrc A
clr C
add A, R0
add A, R1
mov Tcp, A ; save Tcp to memory
subb A, Tmin
jc temp_too_low
mov A, Tcp
subb A, Tmax
jnc temp_too_high
jmp temp_normal
temp_too_low:
setb Y4
clr Y5
jmp temp_exit
temp_too_high:
setb Y5
clr Y4
jmp temp_exit
temp_normal:
clr Y5
clr Y4
temp_exit:
ret
; _________________________________________________________
; PROCESS ENGINE
process_engine:
mov A, engine_disabled
jnb Ueng, stop_engine ; stop if no power
cjne A, #00h, stop_engine ; stop if disabled
; start engine
setb Yeng
jmp engine_exit
stop_engine:
clr Yeng
engine_exit:
ret
; _________________________________________________________
; PROCESS ANALOG DATA
process_analog:
mov A, U2
add A, adcK ; calc U2+K
subb A, U1 ; compare with U1
jc U1_is_greather
add A, U1 ; find U2+K, as it is greather
jmp compare_with_Q
U1_is_greather:
mov A, U1 ; or find U1
compare_with_Q:
subb A, Q
jc Q_is_greather
; Max(U1,U2+K) > Q
setb Y23
mov Tm0_code, #02h ; Send params to timer0 int handler
mov TH0, #0FCh ; launch for 120 us
setb TCON.4 ; start timer
jmp analog_exit
Q_is_greather:
; Max(U1,U2+K) < Q
setb Y23
call wait_10us ; wait by software
clr Y23
analog_exit:
ret
; _________________________________________________________
; WAIT 10 us
wait_10us: ; 2 us to jump here
nop ; 6 nops by 1 us each
nop
nop
nop
nop
nop
ret ; 2 us to jump back
; _________________________________________________________
; INTERRUPT 0 HANDLER
int0_handler:
setb Y6
call wait_10us
call wait_10us
call wait_10us
clr Y6
call wait_10us
call wait_10us
call wait_10us
setb Y6
call wait_10us
call wait_10us
call wait_10us
clr Y6
jmp finish
reti
; _________________________________________________________
; TIMER0 OVERFLOW HANDLER
timer0_int:
push ACC
push PSW
mov A, Tm0_code
; Remove Y1
cjne A, #1h, op_not_y1
clr Y1
jmp timer0_int_exit
; Remove Y23
op_not_y1:
cjne A, #2h, op_not_y23
clr Y23
jmp timer0_int_exit
; Blink LED
op_not_y23:
cjne A, #3h, op_not_LED
mov A, LED_period
inc A
cjne A, #08h, inc_led_period ; 8 * 65K ~ 500 ms
mov LED_period, #0h
mov C, Ysignal
cpl C
mov Ysignal, C
jmp timer0_int_exit
inc_led_period:
mov LED_period, A
jmp timer0_int_exit
; Others
op_not_LED:
jmp timer0_int_exit
timer0_int_exit:
pop PSW
pop ACC
reti
; _________________________________________________________
; PROCESS DISKRET. DATA
process_ddd:
; calculate function value
mov C, X1
anl C, /X2
mov F0, C
mov C, X3 ; "mov C, /X3" do not work
cpl C ;
anl C, /X4
orl C, F0
jnc no_output ; do not set if zero
; output data
mov Tm0_code, #1h ; send parameters to T0 handler
mov TH0, #0FDh ; launch for 100 us
mov Y1, C
setb TCON.4 ; start timer
jmp ddd_exit
no_output:
clr TCON.4
ddd_exit:
ret
; _________________________________________________________
; ADC START ROUTINE
run_adc:
clr MuxSel ; switch MUX
setb ADCCON2.4
nop ; wait for 5 clc to
nop ; make conversion
nop
nop
nop
; read data
mov A, ADCDATAH
anl A, #0Fh
mov R0, A
mov A, ADCDATAL
anl A, #0F0h
orl A, R0
swap A
mov R1, A
; select new channel
mov A, ADCDATAH
swap A
anl A, #0Fh
inc A
mov R0, A
subb A, #4h
jc set_next_chan
mov R0, #00h
set_next_chan:
mov ADCCON2, R0
; put result in memory
mov A, #U1
add A, R0
mov R0, A
mov A, R1
mov @R0, A
ret
; _________________________________________________________
; PROCESS PRESSED KEY
process_key:
mov A, isnewkey ; load current key status
cjne A, #01h, process_key_end ; quit, if status is 0 or 2
mov A, #0Fh
subb A, keypressed
jnc process_other
; process keys G, H, I, J
mov A, keypressed
cjne A, #10h, process_HIJ
; process G (Start engine)
mov engine_disabled, #0h
ret
process_HIJ:
cjne A, #11h, process_IJ
; process H (Stop engine)
mov engine_disabled, #1h
ret
process_IJ:
cjne A, #12h, process_J
; process I (Input K)
mov adcK, inputvalue
ret
process_J:
; process J (Stop execution)
jmp finish
ret
; process other (0 - F) keys
process_other:
mov A, inputvalue ; load current key sequince
swap A ; move low 4-bit to high
anl A, #0F0h ; clear low 4 bit
orl A, keypressed ; write low 4 bit with new key
mov inputvalue, A ; write back to memory
process_key_end:
ret
; _________________________________________________________
; READ CURRENT PRESSED KEY
readkey:
; switch MUX
setb MuxSel
; read line0
clr line0
setb line1
setb line2
setb line3
jnb col0, key1
jnb col1, key2
jnb col2, key3
jnb col3, keyC
jnb col4, keyD
; read line1
clr line1
setb line0
jnb col0, key4
jnb col1, key5
jnb col2, key6
jnb col3, keyE
jnb col4, keyF
; read line2
clr line2
setb line1
jnb col0, key7
jnb col1, key8
jnb col2, key9
jnb col3, keyG
jnb col4, keyH
; read line3
clr line3
setb line2
jnb col0, keyA
jnb col1, key0
jnb col2, keyB
jnb col3, keyI
jnb col4, keyJ
mov keypressed, #0FFh ; return FF
mov isnewkey, #0 ; and clear key status
ret ; if no key pressed
key1: mov keypressed, #01h
jmp readkey_end
key2: mov keypressed, #02h
jmp readkey_end
key3: mov keypressed, #03h
jmp readkey_end
keyC: mov keypressed, #0Ch
jmp readkey_end
keyD: mov keypressed, #0Dh
jmp readkey_end
key4: mov keypressed, #04h
jmp readkey_end
key5: mov keypressed, #05h
jmp readkey_end
key6: mov keypressed, #06h
jmp readkey_end
keyE: mov keypressed, #0Eh
jmp readkey_end
keyF: mov keypressed, #0Fh
jmp readkey_end
key7: mov keypressed, #07h
jmp readkey_end
key8: mov keypressed, #08h
jmp readkey_end
key9: mov keypressed, #09h
jmp readkey_end
keyG: mov keypressed, #10h
jmp readkey_end
keyH: mov keypressed, #11h
jmp readkey_end
keyA: mov keypressed, #0Ah
jmp readkey_end
key0: mov keypressed, #00h
jmp readkey_end
keyB: mov keypressed, #0Bh
jmp readkey_end
keyI: mov keypressed, #12h
jmp readkey_end
keyJ: mov keypressed, #13h
jmp readkey_end
readkey_end:
mov A, isnewkey
cjne A, #02, change_key_status
ret
change_key_status:
inc isnewkey
ret
; _________________________________________________________
; FINISH LOOP
finish:
jmp finish
end
