Смекни!
smekni.com

Блок управления двигателем на МК (стр. 4 из 4)

Литература.

1. Григорьев В. Л. Программное обеспечение микропроцессорных систем. – М.: Энергоатомиздат, 1983.

2. Щелкунов Н. Н., Дианов А. П. Микропроцессорные средства и системы. – М.: Радио и связь, 1989.

3. Сташин В. В. Проектирование цифровых устройств на однокристальных микроконтроллерах. – М.: Энергоатомиздат, 1990.

4. Иванов В. И. Полупроводниковые оптоэлектронные приборы: Справочник – 2-е изд., перераб. И доп. – М.: Энергоатомиздат, 1989

5. Хвощ С. Т. Микропроцессоры и микроЭВМ в системах автоматического управления. Справочник. Л.: Машиностроение. Ленингр. отд-ние, 1987.

Приложение.

Текст программы.

; присваивание имен

p4 data 0e8h

p5 data 0f8h

ip0 data 0a9h

ip1 data 0b9h

ien0 data 0a8h

ien1 data 0b8h

adcon data 0d8h

addat data 0d9h

darp data 0dah

st1 data 52h

n_sd data 53h

obor data 54h

chi_3 data 55h

chi_2 data 56h

chi_1 data 57h

chi_t data 58h

zn_h data 59h

zn_l data 5ah

rez_h data 5bh

rez_l data 5ch

rezul data 5dh

dli_i_l data 5eh

dli_i_h data 5fh

dli_l data 60h

dli_h data 61h

temp data 62h

indik data 63h

flag bit 00h

f_ind bit 01h

f_rev bit 02h

f_nap bit 03h

f_sta bit 04h

f_rab bit 05h

f_rez bit 06h

f_rezind bit 07h

; определение векторов прерываний

org 0000h

sjmp start

org 0003h

ljmp klav

org 013h

ljmp int_1

; начальная инициализация

start:mov darp,#00h

mov adcon,#0fh

clr f_rezind

clr f_rab

clr f_rev

clr f_sta

setb f_nap

setb f_rez

mov n_sd,#0bh

mov st1,#3fh

mov ip0,#04h

mov ip1,#04h

mov sp,#65h

mov ien0,#81h

inizial:mov r0,#47h

mov r1,#03h

; начальное обнуление индикатора

numb:mov @r0,#00h

inc r0

djnz r1,numb

; определение режима работы и его индикация

jnb f_sta,re1

jb f_rez,re1

mov 4ah,#19h

sjmp re2

re1:mov 4ah,#10h

re2:clr f_ind

beg:jb f_ind,beg2

; определение режима работы

jnb f_rezind,na2

clr f_rezind

jb f_nap,na1

mov 4ah,#0fh

sjmp na2

na1: mov 4ah,#0ah

; запуск двигателя с проверкой направления вращения

na2: jnb f_rev,beg2

jb f_nap,napr1

clr p3.5

mov 4ah,#0fh

jb f_rez,napr

mov 4ah,#19h

sjmp napr

napr1: clr p3.4

mov 4ah,#0ah

jb f_rez,napr

mov 4ah,#19h

napr: clr f_rev

clr flag

setb f_rab

mov ien0,#85h

; остановка двигателя

beg2: jnb f_ind,beg1

djnz st1,beg1

mov st1,#05fh

; сдвиг индикационных ячеек вправо

mov r0,#0ahov r1,#49h

mov 40h,#10h

sdvig: mov a,@r1

inc r1

mov @r1,a

mov a,r1

subb a,#02h

mov r1,a

djnz r0,sdvig

djnz n_sd,beg1

mov n_sd,#0bh

ljmp inizial

; процедура индикации

beg1: mov r4,#0feh

mov dptr,#tabcod

mov r0,#47h

cycl: mov p4,#0ffh

mov a,@r0

movc a,@a+dptr

mov p5,a

mov a,r4

mov p4,a

rl a

mov r4,a

inc r0

lcall del

cjne r0,#4bh,cycl

ljmp beg

del: mov r1,#10

st_2: mov r2,#10

st_1: nop

nop

nop

djnz r2,st_1

djnz r1,st_2

ret

tabcod: db 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h

db 0feh,0fdh,0fbh,0f7h,0efh,0dfh,0ffh

db 0c6h,0f8h,0c0h,0c8h,88h,8ch,86h,80h,89h,0ceh,91h,0b0h,82h

; клавиатура

klav: push acc

push p4

push psw

setb psw.3

mov r4,#00h

mov r7,#04h

mov r6,#0feh

loop: mov a,r6

mov p4,a

rl a

mov r6,a

mov a,p4

mov r5,#04h

swap a

rotate: rrc a

jnc dbnc

inc r4

djnz r5,rotate

djnz r7,loop

ljmp quit

dbnc: mov r2,#0ah

m1: mov r3,#55h

m2: djnz r3,m2

djnz r2,m1

mov a,#0f0h

wait: mov p4,#0f0h

cjne a,p4,wait

mov r2,#0ah

m3: mov r3,#55h

m4: djnz r3,m4

djnz r2,m3

mov a,#09h

subb a,r4

jc func

rel: mov r0,#03h

mov r1,#48h

new: mov a,@r1

inc r1

mov @r1,a

mov a,r1

subb a,#02h

mov r1,a

djnz r0,new

mov r1,#47h

mov 47h,r4

ljmp quit

; определение режима по функциональной клавише

func: jb f_ind,quit

cjne r4,#0ah,g2

ljmp bakesp

g2: cjne r4,#0bh,g3

ljmp sta

g3: cjne r4,#0ch,g4

ljmp stop

g4: cjne r4,#0dh,g5

ljmp rezim

g5: cjne r4,#0eh,g6

ljmp rezim

g6: ljmp revers

quit: clr psw.3

pop psw

pop p4

pop acc

reti

; удаление символа

bakesp: jb f_rab,quit

mov 47h,48h

mov 48h,49h

mov 49h,#00h

ljmp quit

; старт. DEC->BIN

sta: jb f_rab,quit

mov 4ah,#0ah

mov b,#0ah

mov a,49h

mul ab

add a,48h

mov b,#0ah

mul ab

add a,47h

mov obor,a

; BIN*24

mov b,#18h

mov a,obor

mul ab

mov zn_l,a

mov zn_h,b

; деление1000000 на полученное значение

lcall div24

mov dli_l,rez_l

mov dli_h,rez_h

; старт измерение

mov tl0,#00h

mov th0,#00h

clr flag

mov indik,#00h

mov tmod,#10h

mov tcon,#04h

mov 4ah,#10h

mov 49h,#10h

mov 48h,#10h

mov 47h,#10h

mov 46h,#11h

mov 45h,#12h

mov 44h,#15h

mov 43h,#16h

mov 42h,#12h

mov 41h,#10h

setb f_ind

setb f_rev

setb f_sta

ljmp quit

; стоп

stop: jnb f_rab,quit

mov ien0,#81h

setb p3.4

setb p3.5

clr f_rab

mov 4ah,#10h

mov 49h,#10h

mov 48h,#10h

mov 47h,#10h

mov 46h,#10h

mov 45h,#11h

mov 44h,#12h

mov 43h,#13h

mov 42h,#14h

mov 41h,#10h

setb f_ind

clr f_sta

ljmp quit

; реверс

revers: jnb f_rab,out2

mov ien0,#81h

setb p3.4

setb p3.5

mov 4ah,#10h

mov 49h,#10h

mov 48h,#10h

mov 47h,#10h

mov 46h,#16h

mov 45h,#17h

mov 44h,#18h

mov 43h,#17h

mov 42h,#16h

mov 41h,#11h

jb f_nap,n1

mov adcon,#0eh

sjmp n2

n1: mov adcon,#0fh

n2: setb f_rev

cpl f_nap

setb f_ind

out2: ljmp quit

; режим обороты двигателя/нагрузка

rezim: jnb f_rab,out

cpl f_rez

jb f_rez,rez1

mov 4ah,#10h

mov 49h,#10h

mov 48h,#10h

mov 47h,#10h

mov 46h,#19h

mov 45h,#15h

mov 44h,#1ah

mov 43h,#16h

mov 42h,#1bh

mov 41h,#1ch

setb f_ind

out: ljmp quit

rez1: mov 4ah,#10h

mov 49h,#10h

mov 48h,#10h

mov 47h,#10h

mov 46h,#13h

mov 45h,#1dh

mov 44h,#13h

mov 43h,#16h

mov 42h,#13h

mov 41h,#12h

setb f_rezind

setb f_ind

ljmp quit

; процедура деления 3-х байт на 2-ва

div24: push psw

push acc

mov chi_3,#0fh

mov chi_2,#42h

mov chi_1,#40h

mov rez_h,#00

mov rez_l,#10h

mov a,zn_h

mov b,#10h

mul ab

mov zn_h,a

mov a,zn_l

mov b,#10h

mul ab

mov zn_l,a

mov a,b

add a,zn_h

mov zn_h,a

lp24: mov a,rez_l

rlc a

mov rez_l,a

mov a,rez_h

rlc a

mov rez_h,a

push psw

clr c

mov a,chi_1

rlc a

mov chi_1,a

mov a,chi_2

rlc a

mov chi_2,a

mov a,chi_3

rlc a

mov chi_3,a

push psw

clr c

mov a,chi_2

subb a,zn_l

mov chi_t,a

mov a,chi_3

subb a,zn_h

jc nosav

pop psw

sav: mov chi_3,a

mov chi_2,chi_t

inc rez_l

sjmp qsav

nosav: pop psw

jc sav

qsav: pop psw

jnc lp24

pop acc

pop psw

ret

; прерывание от датчика

int_1: jb flag,iz2

setb flag

setb tr1 ; первое вхождение. запустить таймер

reti

iz2: push psw ; второе вхождение

push acc

clr tr1

mov ien0,#80h

mov dli_i_l,tl1 ; сохранить измеренное значение

mov dli_i_h,th1 ;

; регулировка

clr c

mov a,dli_i_l

subb a,dli_l

mov a,dli_i_h

subb a,dli_h

jc mot_1

jb f_nap,nap11

setb p3.4

sjmp mot_0

nap11: setb p3.5

sjmp mot_0

mot_1: jb f_nap,nap01

clr p3.4

sjmp mot_0

nap01: clr p3.5

mot_0:

; индикация

jb f_ind,inizdp

djnz indik,inizdp

mov indik,#2fh

jb f_rez,chas

; индикация нагрузки

azp0: jnb adcon.4,azp0

mov a,addat

mov b,#0ah

div ab

mov 47h,b

mov b,#0ah

div ab

mov 48h,b

mov 49h,a

inizdp: ljmp iniz

; индикация частоты вращения

chas: jb f_nap,i_nap1

mov a,4ah

cjne a,#0ah,in_ob2

mov 4ah,#10h

in_ob2: dec 4ah

sjmp i_nap2

i_nap1: mov a,4ah

cjne a,#0fh,in_ob1

mov 4ah,#09h

in_ob1:inc 4ah

i_nap2: mov zn_l,dli_i_l

mov zn_h,dli_i_h

lcall div24 ; деление 3 байт на 2 байт

mov rezul,#01h ; деление 2 байт на 24

lp16: clr c

mov a,rezul

rlc a

mov rezul,a

push psw

clr c

mov a,rez_l

rlc a

mov rez_l,a

mov a,rez_h

rlc a

mov rez_h,a

push psw

clr c

mov a,rez_h

subb a,#18h

jc nosav16

pop psw

sav16: mov rez_h,a

inc rezul

sjmp qsav16

nosav16: pop psw

jc sav16

qsav16: pop psw

jnc lp16

;BIN->DEC

mov a,rezul

mov b,#0ah

div ab

mov 47h,b

mov b,#0ah

div ab

mov 48h,b

mov 49h,a

; инициализация нового запуска программы измерения

iniz: mov tl1,#00h

mov th1,#00h

clr flag

port_0: jb p3.3,port_0

port_1: jnb p3.3,port_1

mov ien0,#85h;84

pop acc

pop psw

reti

end