АСВТ - Сборник задач

Материал из Национальной библиотеки им. Н. Э. Баумана
Последнее изменение этой страницы: 21:01, 10 января 2016.

Содержание

__NUMBEREDHEADINGS__


__NUMBEREDHEADINGS__

Домашнее задание 1

Вывод нажатой клавиши на цифровом индикаторе

Задание: реализовать вывод номера нажатой клавиши на цифровой клавиатуре в двоичном виде

Реализация программы на ассемблере. org 0000h ; начало программы устанавливается в памяти с нулевого адреса. jmp start

org 0010h start:

mov p0, #0h mov p1, #0h mov p2, #0h mov p3, #0FFh

begin: acall st_1 ; проверяем 1-ый столбец, вызов функии st_1 acall st_2 ; проверяем 2-ой столбец, вызов функии st_2 acall st_3 ; проверяем 3-ой столбец, вызов функии st_3

; Прокрутка в небольшом цикле mov r0, #0FFh ; устранение дребезга контактов осуществляется программно, т.е. задержка несколько милисекунд. mov r1, #0FFh mov r2, #01h delay: djnz r0, delay djnz r1, delay djnz r2, delay jmp begin

st_1: mov p1, #11111110b mov a, p3 cjne a, #11111110b, b_4 mov p2, #00000001b jmp end_st_1

b_4: cjne a, #11111101b, b_7 mov p2, #00000100b jmp end_st_1

b_7: cjne a, #11111011b, end_st_1 mov p2, #00000111b

end_st_1: ret ; возврат к вызванной функции и продолжение программы

st_2: mov p1, #11111101b mov a, p3 cjne a, #11111110b, b_5 mov p2, #00000010b jmp end_st_2

b_5: cjne a, #11111101b, b_8 mov p2, #00000101b jmp end_st_2

b_8: cjne a, #11111011b, b_0 mov p2, #00001000b jmp end_st_2

b_0: cjne a, #11110111b, end_st_2 mov p2, #00000000b end_st_2: ret

st_3: mov p1, #11111011b mov a, p3 cjne a, #11111110b, b_6 mov p2, #00000011b jmp end_st_3

b_6: cjne a, #11111101b, b_9 mov p2, #00000110b jmp end_st_3

b_9: cjne a, #11111011b, end_st_3 mov p2, #00001001b

end_st_3: ret end

Схема в Протеусе:

Рис.1 Схема ДЗ1


Использование байтовых операций

Задание: реализовать подсчёт булевой функции с использованием байтовых операций:

Реализация программы на ассемблере.

function Q = ( W*/Y + X*/Z ) + (B + C*U +D ) BYTE
       Q 	BIT     P1.3

U BIT 22H.0 V BIT P2.2 W BIT 20H.3 X BIT 28H.2 Y BIT P3.2 Z BIT P2.5 A_ BIT 28H.5 B_ BIT 21H.4 C_ BIT 25H.0 D_ BIT P3.5

ORG 0

JMP 10H

ORG 10H


   MOV 20H,#11111111b
   MOV 21H,#00000000b
   MOV 22H,#00000000b
   MOV 25H,#00000000b
   MOV 28H,#11111111b 

START:

MOV a,p3 ANL a,#00000100b XRL a,#00000100b RL a ANL a,20H JNZ BEGIN

MOV a,p2 ANL a,#00100000b XRL a,#00100000b RR a RR a RR a ANL a,28H JNZ BEGIN

MOV a,21H ANL a,#00010000b JNZ BEGIN

MOV a,25H ANL a,#00000001b ANL a,22H JNZ BEGIN

MOV a,p3 ANL a,#00100000b JNZ BEGIN

MOV p1,#00000000b

JMP START

BEGIN:

MOV p1,#11111111b

JMP START

END

Схемы в Протеус:

Рис. 1.Схема Протеусе


Реализовать выполнение логической функции на базе микропроцессора совместимого с 8051 в среде Proteus

Исходные данные:

<br?\>
Принципиальная схема

Реализация на языке Ассемблер с использованием битовых операций

V_X BIT P0.0 V_V BIT P0.1 V_Y BIT P0.2 V_Z BIT P0.3 V_B BIT P0.4 V_D BIT P0.5 V_A BIT P0.6 V_U BIT P0.7 V_Q BIT P1.0 V_T BIT 20H.1

ORG 0H JMP INIT ORG 03H JMP INTERRUPT ORG 100H

INIT: MOV A,#0H SETB EA SETB EX0 JMP MAIN

INTERRUPT: MOV C,V_X ORL C,V_V MOV V_T,C

MOV C,V_Y CPL C ORL C,/V_Z

ANL C,V_T MOV V_T,C

MOV C,V_U ORL C,/V_A

ANL C,V_D ANL C,V_B ANL C,V_T

MOV V_Q,C RETI

MAIN: JMP MAIN

end

Реализация логической функции

Реализовать подсчёт булевой функции:

Рис. 1. Исходная схема

Использование байтовых операций

Реализуем программу на языке Ассемблер.

Вход – P0
7 6 5 4 3 2 1 0
A D U V W X Y Z

ORG 0 LJMP start

ORG 013h LJMP check

ORG 100h

start: MOV A,#00000000b SETB EA ; снять запрет на все прерывания SETB EX0 ; разрешение внешних прерываний SETB EX1 loop: MOV P2,#00000000b LJMP loop

check: MOV C,VAR_Y JNC return_one

MOV C,VAR_Z CPL C ANL C,VAR_X JC return_one

MOV C,VAR_U JNC return_zero MOV C,VAR_V ORL C,VAR_A JC return_one

MOV C,VAR_D ANL C,VAR_W JC return_one

JMP return_zero

return_zero: MOV P1,#0000000b RETI return_one: MOV P1,#11111111b RETI


VAR_A BIT P0.7 VAR_D BIT P0.6 VAR_U BIT P0.5 VAR_V BIT P0.4 VAR_W BIT P0.3 VAR_X BIT P0.2 VAR_Y BIT P0.1 VAR_Z BIT P0.0

END

Схема в Протеус:

Рис. 2. Схема в Протеусе

Реализовать подсчёт булевой функции c использование байтовых операцийРеализовать подсчёт булевой функции q = ( X V ∨ Y ¯ Z ¯ ) ∨ ( b ∨ d ∨ A ¯ U ) {\displaystyle q=(XV\lor {\overline {Y}}\,{\overline {Z}})\lor (b\lor d\lor {\overline {A}}U)} c использование байтовых операций

Реализация программы представлена на языке ASSEMBLER:

               qq  bit p1.7

uu bit 24h.0 vv bit p2.4 ww bit 22h.5 xx bit 24h.7 yy bit p3.2 zz bit p2.2

               aa bit 28h.0
               bb bit 20h.3
               dd bit p3.5


q = (X*V + /Y*/Z) + (b + d + /A*U)

ORG 0 jmp 10h

ORG 10h

               mov p1,#01111111b

mov p2,#11111111b

               mov p3,#11111111b
               

_reset: mov a,p2

               anl a,#00010000b
               rl  a

rl a rl a

               anl a,24h			
               jnz true 		;X*V	
               mov a,p2
               anl a,#00000100b

orl a,p3

               xrl a,#00000100b			
               jnz true		;/Y*/Z
               mov a,20h
               anl a,#00001000b			
               jnz true		;b	
               mov a,p3
               anl a,#00010000b		
               jnz true		;d	
               mov a,28h
               anl a,#00000001b

xrl a,#00000001b

               anl a,24h				
               jnz true		;/A*U	
               mov p1,00000000b		

true: mov p1,11111111b

jmp _reset END Схема в Протеусе выглядит следующим образом:

Рис. 8.1. Схема в Протеусе


Реализация логической функции

Реализовать подсчёт булевой функции:

Рис. 1. Исходная схема

Использование битовых операций

Реализуем программу на языке Ассемблер. varX BIT P0.0 varV BIT P0.1 varY BIT P0.2 varZ BIT P0.3 varB BIT P0.4 varC BIT P0.5 varU BIT P0.6 varD BIT P0.7

ORG 0 LJMP start ORG 100h

start: MOV A,P0 MOV 01h,A RR A ANL 01h,A RR A CPL A MOV 02h,A RR A ANL 02h,A MOV 03h,A MOV A,02h ORL 01h,A MOV A,03h CPL A RR A ORL 01h,A RR A MOV 02h,A RR A ANL 02h,A RR A ORL A,02h ORL A,01h ANL A,#00000001b MOV P1,A END

Схема в Протеусе:

Рис. 2. Схема в Протеусе


__NUMBEREDHEADINGS__


Домашнее задание 2

Вывод установленного значения светодиодом

Задание: после нажатия клавиши светодиод1 должен промигать число раз, установленное двоичными переключателями разрядов, а затем светодиод2 должен загореться, сигнализируя окончание вывода.

Реализация программы на ассемблере. COUNT BIT 20h.1 EXIT BIT p2.0 DONE BIT p2.1 INPUT EQU p1 BUF EQU 21h ORG 0 jmp 100h ORG 03H setb TCON.4 jnb TCON.5,$ clr TCON.4 clr TCON.5 _first: jb COUNT,_second SETB DONE mov A,INPUT rr A rr A rr A ANL A,#00000111b mov BUF,A setb COUNT RETI _second: MOV A,INPUT ANL A,#00111000b ORL BUF,A INC BUF _why: DJNZ BUF,_blink CLR DONE CLR COUNT RETI setb TCON.4 jnb TCON.5,$                   clr TCON.4 clr TCON.5 setb TCON.4 jnb TCON.5,$                   clr TCON.4 clr TCON.5 setb TCON.4 jnb TCON.5,$                   clr TCON.4 clr TCON.5 CLR EXIT setb TCON.4 jnb TCON.5,$                   clr TCON.4 clr TCON.5 setb TCON.4 jnb TCON.5,$                   clr TCON.4 clr TCON.5 setb TCON.4 jnb TCON.5,$                   clr TCON.4 clr TCON.5 jmp _why ORG 100H _reset:  mov p2,#11111111b setb IT0 setb EA                 setb EX0 clr A mov TMOD,#00000001b mov TL0,#00000000b mov TH0,#11111111b clr COUNT _loop: jmp _loop END

Схема в Протеусе:

Рис.2 Схема ДЗ2


Автомобильная индикация и подсчет количества перегоревших лампочек.

Необходимо реализовать схему автомобильной световой индикации. Функционал модели сигналов автомобильной панели должен включать в сбя следующее:

  • Имеется 6 ламп (выходные сигналы) – левая и правая передние лампы, левая и правая задние лампы, левый и правый указатель на панели.
  • Имеется 4 входных сигнала – аварийный сигнал, педаль тормоза, переключатель правого поворота и переключатель левого поворота.
  • рычаг поворотов на колонке рулевого управления является трехходовым переключателем; в центральном положении все контакты разомкнуты, замыкание контакта в одно из крайних положений представляет из себя активацию одного из режимов поворота (правого или левого соответственно)
  • Когда замыкается аварийный переключатель, зажигаются все шесть ламп
  • Нажатие тормозной педали включает немигающий задний свет, если в это время не происходит поворот, при котором сохраняется мигание заднего указателя поворота.
  • Каждая из внешних сигнальных ламп является также ослабленным светом габаритных указателей на стоянке.

Задание:подсчитать количество перегоревших лампочек в автомобиле. Реализация программы на ассемблере.

------------------------------------------------------
код программы подсчета количества перегоревших лампочек
------------------------------------------------------
 START:
   MOV     TH0, #0h
   MOV TL0, #0h
   MOV TMOD, #1h
   MOV R0, #5
   MOV R1, #5
   SETB    TCON.4
   JMP OPROS


OPROS:

   MOV     C, P0.0
   JC  AGAINL
   ANL P1, #11111100b
   MOV C, P0.1
   JC  AGAINR
   ANL P1, #00111111b
   JMP OPROS




AGAINL:

   JNB TCON.5, AGAINL
   CLR TCON.5
   DJNZ    R0, AGAINL
   XRL P1, #00000011b
   MOV R0, #5
   JMP OPROS




AGAINR:

   JNB TCON.5, AGAINR
   CLR TCON.5
   DJNZ    R1, AGAINR
   XRL P1, #11000000b
   MOV R1, #5
   JMP OPROS
------------------------------------------------------------
конец кода программы подсчета количества перегоревших лампочек
-------------------------------------------------------------


-----------------
основная программа
-----------------


INPUTS
   BRAKE           BIT P1.0
   EMERG           BIT P1.1
   PARK            BIT P1.2
   L_TURN      BIT P1.3
   R_TURN      BIT P1.4
   DAY_NIGHT       BIT P1.5
OUTPUTS
   L_FRNT      BIT P2.0
   R_FRNT      BIT P2.1
   L_DASH      BIT P2.2
   R_DASH      BIT P2.3
   L_REAR      BIT P2.4
   R_REAR      BIT P2.5
   STOP            BIT P2.6
   GABARIT     BIT P2.7
ЧАСТОТА МЕРЦАНИЯ ЛАМПОЧЕК
   SUB_DIV     DATA    20H
   HI_FREQ     BIT SUB_DIV.0
   LO_FREQ     BIT SUB_DIV.7
   ML_FREQ     BIT SUB_DIV.4


RESET
   ORG     0000H
   ACALL       INIT
   JMP     MAIN
T/C0
   ORG     000BH
   ACALL       TMR0_PROCCESING
   RETI


MAIN
   ORG     100H

MAIN:

   JMP     $
ПОДПРОГРАММЫ
   ORG     150H

INIT:

   MOV     TMOD, #00000001B
   MOV     TL0, #0
   MOV     TH0, #-16
   MOV     SUB_DIV, #244
   SETB        ET0
   SETB        TR0
   SETB        EA
   
   RET


TMR0_PROCCESING:

   MOV     TL0, #0
   MOV     TH0, #-16
   DJNZ        SUB_DIV, T0_SERV
   MOV     SUB_DIV, #244

T0_SERV:

   MOV     C, ML_FREQ
   MOV     P1.6, C

PARK_SCRIPT:

   JNB     PARK, ORDINARY_MODE
   MOV     C, PARK
   ANL     C, HI_FREQ
   MOV     L_REAR, C
   MOV     R_REAR, C
   JMP     STOP_SCRIPT
   

ORDINARY_MODE:

   MOV     C, L_TURN
   ORL     C, EMERG
   ANL     C, LO_FREQ
   MOV     L_DASH, C
   MOV     L_FRNT, C
   MOV     L_REAR, C
   MOV     C, R_TURN
   ORL     C, EMERG
   ANL     C, LO_FREQ
   MOV     R_DASH, C
   MOV     R_FRNT, C
   MOV     R_REAR, C

STOP_SCRIPT:

   MOV     C, BRAKE
   JC      BRAKE_PRESSED
   SETB        STOP
   JMP     GABARIT_SCRIPT

BRAKE_PRESSED:

   CLR     STOP

GABARIT_SCRIPT:

   MOV     C, DAY_NIGHT
   JC      NIGHT_MODE
   SETB        GABARIT
   RET

NIGHT_MODE:

   CLR     GABARIT
   RET   
   END

Схемы в Протеус:

Рис. 2.Общая схема автомобильной индикации в Протеусе
Рис. 3.Схема подсчета количества перегоревших лампочек в Протеусе




Автомобильная индикация

Необходимо реализовать схему автомобильной световой индикации. Функционал модели сигналов автомобильной панели должен включать в сбя следующее:

  • Имеется 6 ламп (выходные сигналы) – левая и правая передние лампы, левая и правая задние лампы, левый и правый указатель на панели.
  • Имеется 4 входных сигнала – аварийный сигнал, педаль тормоза, переключатель правого поворота и переключатель левого поворота.
  • рычаг поворотов на колонке рулевого управления является трехходовым переключателем; в центральном положении все контакты разомкнуты, замыкание контакта в одно из крайних положений представляет из себя активацию одного из режимов поворота (правого или левого соответственно)
  • Когда замыкается аварийный переключатель, зажигаются все шесть ламп
  • Нажатие тормозной педали включает немигающий задний свет, если в это время не происходит поворот, при котором сохраняется мигание заднего указателя поворота.
  • Каждая из внешних сигнальных ламп является также ослабленным светом габаритных указателей на стоянке.

Исходная схема, реализованная в Протеусе, выглядит следующим образом:

Рис. 3. Схема в Протеусе

Введем в модель также дополнительный функционал – кроме вышеперечисленных функций она должна выполнять функцию «выявления ошибки» - обнаруживать дефекты в цепях ламп. Код программы на языке ASSEMBLER представлен далее по тексту.

BRAKE BIT P1.0 ;тормоз EMERG BIT P1.1 ;аварийная сигнализация PARK BIT P1.2 ;сигнал парковки L_TURN BIT P1.3 ;правый поворотник R_TURN BIT P1.4 ;левый поворотник

L_FRNT BIT P1.5 ;передний указатель левого поворота R_FRNT BIT P1.6 ; передний указатель правого поворота L_DASH BIT P1.7 ;левый поворот на панели R_DASH BIT P2.0 ;правый поворот на панели L_REAR BIT P2.1 ;задний левый поворот R_REAR BIT P2.2 ;задний правый поворот

L_FAULT BIT P2.3 ;ошибка


SUB_DIV DATA 20H HI_FREQ BIT SUB_DIV.0 ; сигнал высокой частоты LO_FREQ BIT SUB_DIV.7 ;сигнал низкой частоты DIM BIT PSW.1 ;carry flag


$EJECT ORG 0000H ;вектор сброса LJMP INIT ORG 000BH ;вектор прерывания таймер MOV TH0,#-16 PUSH ACC PUSH PSW PUSH B AJMP UPDATE_SYS ORG 0100h

INIT: MOV TL0,#0 ;загрузка младшего байта таймера MOV TH0,#-16 ;загрузка старшего байта таймера MOV TMOD,#01100001B ;установка режима счетчика MOV SUB_DIV,#244 обеспечение частоты прерываний в 1 Гц SETB ET0 ;исп. переполнения таймера прерываний SETB EA ;разрешение всех прерываний SETB TR0 ;сохранение до переполнения SJMP $ ; начало выполнения основной программы


UPDATE_SYS: ;выполнение 1раз в сек DJNZ SUB_DIV, T0SERV MOV TL0,#0 ;загрузка младшего байта таймера MOV TH0,#-16 ;загрузка старшего байта таймера MOV TMOD,#01100001B ;установка режима счетчика MOV SUB_DIV,#244


ORL P1,#11100000B ;установление высоких управляющих выходов ORL P2, #00000111B

вход Т0 отвечает за обнаружение ошибки-если на него поступает сигнал 1, значит, какая-то лампа не горит
если Т0=0,сбрасываем бит p2.3 в 0,чтобы диод, указывающий на неисправность лампы, не горел

JNB T0, TV TV:MOV C, 0 MOV P2.3, C JNB T0, T0SERV

CLR L_FRNT ;выключаем лампы JB T0, FAULT ;если Т0=1=>ошибка в сети, т. е. лампа не горит SETB L_FRNT

повторяем аналогичные операции для остальных сигналов

CLR L_DASH JB T0, FAULT SETB L_DASH

CLR L_REAR JB T0, FAULT SETB L_REAR

CLR L_DASH JB T0, FAULT SETB L_DASH

CLR R_FRNT JB T0, FAULT SETB R_FRNT

CLR R_DASH JB T0, FAULT SETB R_DASH

CLR R_REAR JB T0, FAULT SETB R_REAR

JNB T0, TV ;если Т0=0,сбрасываем бит p2.3 в 0,чтобы диод, указывающий на неисправность лампы, не горел TV:MOV C, 0 MOV P2.3, C


JB T0, T0SERV

FAULT: CPL L_FAULT ;обработка ошибки-1 раз в секунду

$EJECT

T0SERV: ;выполнение основной программы

MOV C, SUB_DIV.1 ;скважность 50% ANL C, SUB_DIV.0 ;уменьшить скважность до 25% ORL C, SUB_DIV.2 ;восстановить ANL C, PARK ;габаритные огни MOV DIM, C

MOV C, L_TURN ;функция мигания левого поворота на панели ORL C, EMERG ANL C, LO_FREQ MOV L_DASH, C

MOV F0,C ;сигнал переднего левого поворота ORL C, DIM MOV L_FRNT,C

MOV C, BRAKE ;нажатие тормоза ANL C, /L_TURN ORL C, F0 ORL C, DIM MOV L_REAR, C


MOV C, R_TURN ;аналогичная последовательность действий для правой стороны ORL C, EMERG ANL C, LO_FREQ MOV R_DASH, C

MOV F0,C ORL C, DIM MOV R_FRNT,C

MOV C, BRAKE ANL C, /R_TURN ORL C, F0 ORL C, DIM MOV R_REAR, C

POP B POP ACC POP PSW RETI END

Схему такой индикации можно представить следующим образом:

Рис. 4. Схема индикации

Автомобильная индикация 2

Необходимо реализовать схему автомобильной световой индикации. Функционал модели сигналов автомобильной панели должен включать в сбя следующее:

  • Имеется 6 ламп (выходные сигналы) – левая и правая передние лампы, левая и правая задние лампы, левый и правый указатель на панели.
  • Имеется 4 входных сигнала – аварийный сигнал, педаль тормоза, переключатель правого поворота и переключатель левого поворота.
  • рычаг поворотов на колонке рулевого управления является трехходовым переключателем; в центральном положении все контакты разомкнуты, замыкание контакта в одно из крайних положений представляет из себя активацию одного из режимов поворота (правого или левого соответственно)
  • Когда замыкается аварийный переключатель, зажигаются все шесть ламп
  • Нажатие тормозной педали включает немигающий задний свет, если в это время не происходит поворот, при котором сохраняется мигание заднего указателя поворота.
  • Каждая из внешних сигнальных ламп является также ослабленным светом габаритных указателей на стоянке.

Исходная схема, реализованная в Протеусе, выглядит следующим образом:

Рис. 3. Схема в Протеусе

Введем в модель также дополнительный функционал – кроме вышеперечисленных функций она должна выполнять функцию «выявления ошибки» - обнаруживать дефекты в цепях ламп. Код программы на языке ASSEMBLER представлен далее по тексту.

Кнопки переключения различных световых сигналов

brake bit p1.0 ;педаль тормоза emerg bit p1.1 ;аварийный сигнал park bit p1.2 ;габаритные огни на стоянке l_turn bit p1.3 ;левый поворотник r_turn bit p1.4 ;правый поворотник

Световые индикаторы

l_frnt bit p2.0 ;передний указатель левого поворота r_frnt bit p2.1 ;передний указатель правого поворота l_dash bit p2.2 ;индикатор левого поворота на панели r_dash bit p2.3 ;индикатор правого поворота не панели l_rear bit p2.4 ;задний указатель левого поворота r_rear bit p2.5 ;задний указатель правого поворота

error bit p2.6 ;индикатор отказа какой-нибудь из ламп

sub_div data 20h ;делитель скорости прерывания lo_freq bit sub_div.7 ;бит генератора высокой частоты hi_freq bit sub_div.0 ;бит генератора низкой частоты dim bit psw.1 ;флаг сгоревшей лампы


org 0h jmp init

org 0bh mov tl0, #0 ;младший байт таймера mov th0, #-16 ;старший байт таймера jmp update

org 50h


init: clr error mov sub_div, #244 mov tl0, #0 mov th0, #-16 mov tmod, #01100001b ;режим 8-разрядного счетчика setb ea setb et0 setb tr0 jmp $

update: djnz sub_div, toserv mov sub_div, #244

orl p2, #00111111B clr l_frnt jb t0, fault setb l_frnt

clr l_dash jb t0, fault setb l_dash

clr l_rear jb t0, fault setb l_rear

clr r_frnt jb t0, fault setb r_frnt

clr r_dash jb t0, fault setb r_dash

clr r_rear jb t0, fault setb r_rear

clr error jmp toserv

fault:

cpl error

toserv:

mov c, park anl c, hi_freq mov dim,c

mov c, l_turn orl c, emerg anl c, lo_freq mov l_dash, c

mov f0, c orl c, dim mov l_frnt, c

mov c, brake anl c, /l_turn orl c, f0 orl c, dim mov l_rear, c

mov c, r_turn orl c, emerg anl c, lo_freq mov r_dash, c

mov f0, c orl c, dim mov r_frnt, c

mov c, brake anl c, /r_turn orl c, f0 orl c, dim mov r_rear, c


reti end
Схему такой индикации можно представить следующим образом:


__NUMBEREDHEADINGS__


Домашнее задание 3

Cчётчик со сбросом

Задание: реализовать счётчик со сбросом

Реализация программы на ассемблере. ORG 0000H JMP INIT_1 ORG 000BH CALL TIME0 CLR TR0 RETI

ORG 0003H CALL INTERUPT0 RETI

ORG 0013H CALL RESETING RETI

ORG 0100H INIT_1: MOV P2,#0Fh CALL TIME0 MOV IE, #82h SETB IT1 SETB EX0 SETB EA                  JMP $

ORG 0150H TIME0:

MOV P1, A INC A XRL A,#10h JZ RESETING XRL A, #10h RET

RESETING: ;MOV A,#00h ;MOV P0, #00h RET

INTERUPT0: SETB TR0 RET

END

Схема в Протеусе:

Рис.3 Схема ДЗ3


Работа с индикатором LCD

Задание: программирование на МК i8051 на ассемблере.Входы (кнопки механические) - двоичная СС, выходы (индикаторы LCD) - восьмеричная СС.

Реализация программы на языке ассемблере. org 0000h jmp start

org 0010h start:

mov p0, #0h mov p1, #0h mov p2, #0h mov p3, #0FFh

begin: acall chislo

mov r0, #0FFh mov r1, #0FFh mov r2, #01h delay: djnz r0, delay djnz r1, delay djnz r2, delay jmp begin

chislo: mov p1, #11111110b mov a, p3

cjne a, #11111111b, b_1 mov p2, #00000000b jmp vozvrat b_1: cjne a, #11111110b, b_2 mov p2, #00000001b jmp vozvrat

b_2: cjne a, #11111101b, b_3 mov p2, #00000010b jmp vozvrat

b_3: cjne a, #11111100b, b_4 mov p2, #00000011b jmp vozvrat

b_4: cjne a, #11111011b, b_5 mov p2, #00000100b jmp vozvrat

b_5: cjne a, #11111010b, b_6 mov p2, #00000101b jmp vozvrat

b_6: cjne a, #11111001b, b_7 mov p2, #00000110b jmp vozvrat

b_7: cjne a, #11111000b, vozvrat mov p2, #00000111b

vozvrat: ret end

Схема в Протеус:

Рис. 4. Схема в Протеусе


Работа с индикатором 2

Необходимо по нажатию кнопки «Enter» вывести на индикатор числа 10 в 16-тиричной системе (т.е. на индикаторе должно отображаться А). Реализация программы представлена на языке ASSEMBLER $EJECT ORG 0000h LJMP start

ORG 013h LJMP M1

ORG 100h

start: CLR RS0 CLR RS1 SETB EA SETB EX0 SETB EX1 MOV TMOD, #00000001b ; 16-bit mode MOV TH0, #0d MOV TL0, #0d

SETB ET0 ;исп. переполнения таймера прерываний JMP M1

Устранение дребезга контактов

M1: JB P3.0,M1 ; если P3=1, то M1

    MOV R2,#244		; временная задержка, равная 244 мкс

M3: MOV R1, #250; ; временная задержка, равная 250 мкс M2: DJNZ R1, M2 ; R1=R1–1, если R1 не 0, то М2 MOV R1, #255 M0: DJNZ R1, M0 ; R0=R0–1, если R0 не 0, то М0 DJNZ R2,M3 JB P3.0, M1 JMP cycle ;tз=( N1∙(2+2∙N2+2∙N3)+2)T

tз>> tимп

cycle: ; Код реализации динамической индикации MOV R0, #10d

go_display: MOV 2Ah, #00001000b ;для индикатора MOV A, R0 ;А=Аh ADD A, #20h ;A=2Ah MOV R1, A MOV A, @R1 ;загрузка в А содержимого ОЗУ[2Ah] MOV P2, A MOV P1, R0 JNB TF0, $ CLR TF0 JMP cycle

		RETI	

END

Дребезг представляет собой многократное замыкание и размыкание цепи. В результате на вход микропроцессорного устройства поступает не единичный перепад напряжения, а целая пачка импульсов.

Сигнал приходит на бит 6 порта P3. А продолжительность "дребезга" меньше 200 мкс. Производим устранение дребезга методом временной задержки.

Блок схема алгоритма представлена ниже.

Рис. 5. Блок-Схема

Схема в Протеусе выглядит следующим образом:

Рис. 6. Схема в Протеусе

Выставляем на входе число 1010 (А-младший, D-старший разряд), но не нажимаем Enter:

Рис. 7. Схема в Протеусе

После нажатия Enter загорается индикатор:

Рис. 8. Схема в Протеусе


Клавиатура

Необходимо по нажатию кнопки ввести число "9" в 10-ричной системе и вывести на индикатор тоже в 10-ричной системе.

Реализация программы представлена на языке ASSEMBLER:

========================================================================================
Переменные и константы
========================================================================================
row0 BIT P2.0 ; строчки
row1 BIT P2.1
row2 BIT P2.2
row3 BIT P2.3
cols equ P0 ; столбцы
indR0 BIT P3.3 ; отобразить уже на индикаторах
indR1 BIT P3.4
indR2 BIT P3.5
indR3 BIT P3.6
indC0 BIT P1.0 ; отобразить уже на индикаторах
indC1 BIT P1.1
indC2 BIT P1.2
indC3 BIT P1.3
indC4 BIT P1.4
indC5 BIT P1.5
check_in_row equ 20h ; определяет координаты строки
pressed_in_col equ 21h ; определяет координаты столбца - не используется(cols определяет)


========================================================================================
СЮДА ПОПАДАЕМ ПОСЛЕ RESET
========================================================================================

ORG 0000H JMP INIT_1

========================================================================================
ОБРАБОТЧИК ПРЕРЫВАНИЯ ТАЙМЕРА_0 - этот код выполнится, после поступления прерывания
========================================================================================

ORG 000BH ; по этому адресу располагается программа обработки прерывания ACALL TMR0_PROCCESING CLR TR0 RETI

========================================================================================
ОБРАБОТЧИК ВНЕШНЕГО ПРЕРЫВАНИЯ - этот код выполнится, после поступления прерывания
========================================================================================

ORG 0003H ; по этому адресу располагается программа обработки прерывания ACALL INT0_PROCCESING RETI

========================================================================================
Инициализация - должны делать каждый раз после RST
========================================================================================

CALL DEPICT ORG 0100H INIT_1: ;CLR row0 ; подать на стороки все нули, чтобы можно было вызвать ;CLR row1 ; внешнее прерывание ;CLR row2 ; ;CLR row3 ;CLR row4 ; setb p2.0 setb p2.1 setb p2.2 setb p2.3 setb p2.4 setb p0.0 setb p0.1 setb p0.2 setb p0.3 setb p0.4 ;mov p0, #00h

;MOV pressed_in_col, #11111111B ; ничего не нажато ;MOV check_in_row, #11111111B ; ничего не нажато ACALL TMR0_PROCCESING

; инициализация 0-ГО ТФЙМЕРА - нужен для опроса строк MOV TMOD, #00000001b MOV TH0, #HIGH(15542) MOV TL0, #LOW(15542) MOV IE, #82h

INIT_2: ; инициализация ВНЕШНЕГО ПРЕРЫВАНИЯ INT0 - для определения момента нажатия клавиши SETB IT1 ; прерывание при переходе из 1 в 0 для входов не INT0 (TCON) SETB EX0 ; разрешить внешнее прерывание INT0

       SETB EA                 ; разрешить прерывания (глобальный флаг)
========================================================================================
       JMP $	; Основная программа - ничего не делаем - просто крутимся
========================================================================================


ПОДПРОГРАММЫ

ORG 0200H

========================================================================================
Подпрограмма обработки прерывания от таймера_1
========================================================================================
TMR0_PROCCESING:
		;MOV TH0, #-100		; снова записать, чтоб потом опять считал как надо

clr p2.0 clr p2.1 clr p2.2 clr p2.3 clr p2.4 CLR EA

setb P2.0 JB P0.0, Jmp1 MOV P1, #05h JMP ExitInt Jmp1: JB P0.1, Jmp2 MOV P1, #06h JMP ExitInt Jmp2: JB P0.2, Jmp3 MOV P1, #07h JMP ExitInt Jmp3: JB P0.3, Jmp4 MOV P1, #08h JMP ExitInt Jmp4: clr P2.0 setb P2.1 JB P0.0, Jmp5 MOV P1, #9h JMP ExitInt Jmp5: JB P0.1, Jmp6 MOV P1, #10h JMP ExitInt Jmp6: JB P0.2, Jmp7 MOV P1, #11h JMP ExitInt Jmp7: JB P0.3, Jmp8 MOV P1, #12h JMP ExitInt Jmp8: clr P2.1 setb P2.2 JB P0.0, Jmp9 MOV P1, #13h JMP ExitInt Jmp9: JB P0.1, Jmp10 MOV P1, #14h JMP ExitInt Jmp10: JB P0.2, Jmp11 MOV P1, #15h JMP ExitInt Jmp11: JB P0.3, Jmp12 MOV P1, #16h JMP ExitInt Jmp12: clr P2.2 setb P2.3 JB P0.0, Jmp13 MOV P1, #1h JMP ExitInt Jmp13: JB P0.1, Jmp14 MOV P1, #2h JMP ExitInt Jmp14: JB P0.2, Jmp15 MOV P1, #3h JMP ExitInt Jmp15: JB P0.3, Jmp16 MOV P1, #4h JMP ExitInt Jmp16: JB P0.4, Jmp17 MOV P1, #17h JMP ExitInt Jmp17: clr P2.3 MOV P1, #00h

ExitInt: MOV P2, #11111111b CLR TR0 SETB EA ;ACALL DEPICT RET

========================================================================================
Подпрограмма обработки внешнего прерывания
========================================================================================

INT0_PROCCESING: SETB TR0 RET

========================================================================================
Подпрограмма отображения индикаторов
========================================================================================

DEPICT: JB TR0, JmpNext MOV P2, #00000000b MOV A, P0 CJNE A, #11111111b, JmpStartTimer SETB P2.0 JMP JmpNext JmpStartTimer: SETB TR0 MOV P2, #11111111b JmpNext:

RET END Схема в Протеусе выглядит следующим образом (после нажатия загорается индикатор):

Рис. 8.2. Схема в Протеусе



Работа с индикатором 3

Необходимо вывести в шестнадцатиричной системе исчисления на индикаторы введенное с клавиатуры число в десятичной системе исчисления

Реализация программы представлена на языке ASSEMBLER:

P0.0, P0.1, P0.2, P0.3 - сигналы нажатия кнопки в 4-х столбцах
P1 - выходной 8-битный набор, отображающийся на индикаторах
P2.0, P2.1, P2.2 - сигналы мониторинга 3-х строк
P3.2 - сигнал прерывания от нажатия кнопки


VAR equ B  ; дополнительно используемая переменная RES equ 20h  ; буфер памяти, используемый для запоминания первого нажатого числа NUM equ 22h  ; значение первого бита показывает какое по счету число введено (первое или второе)

ORG 0000H JMP INIT

ORG 000BH ; по этому адресу располагается программа обработки прерывания ACALL TMR0_PROCCESING CLR TR0 RETI

ORG 0003H ; по этому адресу располагается программа обработки прерывания ACALL INT0_PROCCESING RETI

ORG 0010H ; по этому адресу располагается программа умножения фисла из буфера на 10 ACALL MULTIPLY_10 RETI


ORG 0100H

INIT: setb p2.0 setb p2.1 setb p2.2

setb p0.0 setb p0.1 setb p0.2 setb p0.3

ACALL TMR0_PROCCESING

инициализация 0-ГО ТАЙМЕРА - нужен для опроса строк

MOV TMOD, #00000001b MOV TH0, #HIGH(15542) MOV TL0, #LOW(15542) MOV IE, #82

SETB IT1 ; прерывание при переходе из 1 в 0 для входов не INT0 (TCON) SETB EX0 ; разрешить внешнее прерывание INT0 SETB EA  ; разрешить прерывания (глобальный флаг)

JMP $

ORG 0200H


TMR0_PROCCESING: clr p2.0 clr p2.1 clr p2.2 clr NUM

CLR EA

setb P2.0 JB P0.0, Jmp1 JB NUM.0, Jmp1_1 MOV RES, #01h INC NUM JMP ExitInt

Jmp1_1: ACALL MULTIPLY_10 ADD A, #01h MOV P1, A INC NUM JMP ExitInt Jmp1: JB P0.1, Jmp2 JB NUM.0, Jmp2_2 MOV RES, #02h INC NUM JMP ExitInt

Jmp2_2: ACALL MULTIPLY_10 ADD A, #02h MOV P1, A INC NUM JMP ExitInt Jmp2: JB P0.2, Jmp3 JB NUM.0, Jmp3_3 MOV RES, #03h INC NUM JMP ExitInt

Jmp3_3: ACALL MULTIPLY_10 ADD A, #01h MOV P1, A INC NUM JMP ExitInt Jmp3: JB P0.3, Jmp4 JB NUM.0, Jmp4_4 MOV RES, #00h INC NUM JMP ExitInt

Jmp4_4: ACALL MULTIPLY_10 ADD A, #00h MOV P1, A INC NUM JMP ExitInt Jmp4: clr P2.0 setb P2.1 JB P0.0, Jmp5 JB NUM.0, Jmp5_5 MOV RES, #04h INC NUM JMP ExitInt

Jmp5_5: ACALL MULTIPLY_10 ADD A, #04h MOV P1, A INC NUM JMP ExitInt Jmp5: JB P0.1, Jmp6 JB NUM.0, Jmp6_6 MOV RES, #05h INC NUM JMP ExitInt

Jmp6_6: ACALL MULTIPLY_10 ADD A, #05h MOV P1, A INC NUM JMP ExitInt Jmp6: JB P0.2, Jmp7 JB NUM.0, Jmp7_7 MOV RES, #06h INC NUM JMP ExitInt

Jmp7_7: ACALL MULTIPLY_10 ADD A, #06h MOV P1, A INC NUM JMP ExitInt Jmp7: JB P0.3, Jmp8 CLR NUM.0 ANL RES, #0h MOV P1, RES JMP ExitInt Jmp8: clr P2.1 setb P2.2 JB P0.0, Jmp9 JB NUM.0, Jmp9_9 MOV RES, #07h INC NUM JMP ExitInt

Jmp9_9: ACALL MULTIPLY_10 ADD A, #07h MOV P1, A INC NUM JMP ExitInt Jmp9: JB P0.1, Jmp10 JB NUM.0, Jmp10_1 MOV RES, #08h INC NUM JMP ExitInt

Jmp10_1: ACALL MULTIPLY_10 ADD A, #08h MOV P1, A INC NUM JMP ExitInt Jmp10: JB P0.2, Jmp11 JB NUM.0, Jmp10_2 MOV RES, #09h INC NUM JMP ExitInt

Jmp10_2: ACALL MULTIPLY_10 ADD A, #09h MOV P1, A INC NUM JMP ExitInt Jmp11: MOV P1, #00h

ExitInt: MOV P2, #11111111b CLR TR0 SETB EA

RET

INT0_PROCCESING:

SETB TR0

RET


MULTIPLY_10:


MOV A, RES MOV VAR, RES ANL A, #0Fh ANL VAR, #0Fh ADD A,VAR ADD A,VAR ADD A,VAR ADD A,VAR ADD A,VAR ADD A,VAR ADD A,VAR ADD A,VAR ADD A,VAR RET

END


Программа позволяет работать с любыми числами от 0 до 99. Ввод числа осуществляется последовательно по цифрам. После ввода первой цифры числа значение на индикаторе не изменяется. После последовательного введения 2-х чисел результат появляется на индикаторах. Для сброса значения на индикаторе необходимо нажать кнопку RESET. Например, для ввода числа 34, сначала нажимается клавиша 3, далее 4. В результате на индикаторе появится 22. (34dec=22hex)

Схема в Протеусе выглядит следующим образом:

Рис. 4. Схема в Протеусе


__NUMBEREDHEADINGS__


Домашнее задание 4

Переключение светодиодов на PIC12F675

Задание: реализовать на PIC12F675 переключающуюся работу двух светодиодов

Реализация программы на C.

  1. include <12F675.h>
  2. fuses NOWDT
  3. fuses NOMCLR
  4. fuses INTRC_IO
  5. fuses NOPROTECT
  6. fuses NOPUT
  7. fuses BROWNOUT
  8. use delay (clock = 4000000)

//#define recieved PIN_A5 //#define transmited PIN_A1

  1. define GP1 PIN_A1
  2. define GP4 PIN_A4
  3. define GP3 PIN_A3
  4. define GP2 PIN_A2

char i; char q; char new; void state1() {    int j;    for( j = 0; j<7; j++)    {       output_low(GP1);       output_low(GP4);       delay_ms(1);       output_high(GP4);    }    output_high(GP1);    output_low(GP4);    delay_ms(1);    output_high(GP4);    output_low(GP2);    delay_ms(1);    output_high(GP2); } void state0() {    int j;    for( j = 0; j<8; j++)    {       output_low(GP1);       output_low(GP4);       delay_ms(1);       output_high(GP4);    }    output_low(GP2);    delay_ms(1);    output_high(GP2);    q = 0x00;    return; } void state2() {    int j;    for( j = 0; j<6; j++)    {       output_low(GP1);       output_low(GP4);       delay_ms(1);       output_high(GP4);    }    if(q == 0x00)    {       output_high(GP1);       output_low(GP4);       delay_ms(1);       output_high(GP4);       q = 0x01;    }    else    {       output_low(GP1);       output_low(GP4);       delay_ms(1);       output_high(GP4);       q = 0x00;    }    output_low(GP1);    output_low(GP4);    delay_ms(1);    output_high(GP4);    output_low(GP2);    delay_ms(1);    output_high(GP2); } void interrupt() {    delay_ms(22);    if(!input(GP3) && new)  //var 2    //if(input(GP3))        //var 1    {       i++;       new = 0;       switch(i)       {          case 1:             state1();             break;          case 2:             state2();                         break;          case 3:             state0();             break;       }       if(i == 3)       {          i = 0;       }    } } void main () {    char j;    i = 0x00;    q = 0x00;    new = 1;    while(1)    {       output_low(GP2);       output_low(GP4);       if(!input(GP3))       {         // delay_ms(10);   //var 1          interrupt();       }       if(i == 2)       {          state2();          for(j = 0; j<125; j++)          {             delay_ms(4);             if(!input(GP3))             {                interrupt();                delay_ms(22);             }          }       }       if(input(GP3)) new = 1; //var 2    } }

Схема в Протеусе:

Рис.4 Схема ДЗ4


Работа с светодиодами

Задание: Реализовать на микроконтроллере схему управления светофором.При включении тумблера SA1 светофор работает в дневном режиме, то есть чередование сигналов следующее: зеленый (VD1),желтый (VD2),красный (VD3),зеленый,желтый,красный и так далее. При отключении тумблера SA1 светофор работает в ночном режиме, то есть мигает желтый светодиод (VD2).В дневном режиме работы на индикаторе HG1 горит буква "d",в ночном режиме - буква "H".

Реализация программы на языке ассемблере.

_main: MOV SP+0, #128 void main() {

       P0 = 255              ;Configure PORT0 as input

MOV P0+0, #255 P2 = 0x00  ;Initial PORT2 value MOV P2+0, #0

                             ;P1 = 0X00

MOV P1+0, #0

                             ;P3= 0

MOV P3+0, #0

                             ;oldstate = 0

CLR C MOV A, _oldstate+0 MOV #224, C MOV _oldstate+0, A

                             ;do {

L_main0:

                             ;if (Button(0, 1)) { // Detect one-to-zero transition

MOV FARG_Button_time_ms+0, #0 MOV FARG_Button_active_state+0, #1 LCALL _Button+0 MOV A, R0 JZ L_main3

                             ;P3= 161

MOV P3+0, #161

                             ;P1 = 1

MOV P1+0, #1

                             ;P2 =1;DELAY_MS(300)

MOV P2+0, #1 MOV R5, 2 MOV R6, 231 MOV R7, 93 DJNZ R7, DJNZ R6, DJNZ R5, NOP

                              ;P2 =2;DELAY_MS(300)

MOV P2+0, #2 MOV R5, 2 MOV R6, 231 MOV R7, 93 DJNZ R7, DJNZ R6, DJNZ R5, NOP

                              ;P2 =4;DELAY_MS(300)

MOV P2+0, #4 MOV R5, 2 MOV R6, 231 MOV R7, 93 DJNZ R7, DJNZ R6, DJNZ R5, NOP

                              ;}  // Invert PORT2

L_main3:

                              ;if (Button(1,0)) {

MOV FARG_Button_time_ms+0, #1 MOV FARG_Button_active_state+0, #0 LCALL _Button+0 MOV A, R0 JZ L_main4

                               ;P3= 137

MOV P3+0, #137

                               ;P1 = 1

MOV P1+0, #1

                               ;P2 =2
                               ;DELAY_MS(300)

MOV P2+0, #2 MOV R5, 2 MOV R6, 231 MOV R7, 93 DJNZ R7, DJNZ R6, DJNZ R5, NOP

                               ;P2 =0
                               ;DELAY_MS(300)

MOV P2+0, #0 MOV R5, 2 MOV R6, 231 MOV R7, 93 DJNZ R7, DJNZ R6, DJNZ R5, NOP

                               ;}

L_main4:

                               ;} while(1)

SJMP L_main0

                               ;} // Endless loop   
                               ; end of _main

Схема в Протеус:

Рис. 5. Схема в Протеусе


Работа с индикатором

При включении схемы индикатор должен "считать" до 16 (т.е. на индикаторе должны последовательно отображаться числа от 0 до 15 в шестнадцатиричной системе). При включении схемы и во время того, как происходит изменение значений на индикаторе, горит диод 1, как только схема закончила работу, горит диод 2.

Реализация программы представлена на языке ASSEMBLER S1 BIT P1.0 HL1 BIT P1.2 HL2 BIT P1.3

$EJECT

ORG 0 LJMP start ORG 003h LJMP interupt0 ORG 040h LJMP interupt1 ORG 100h

start: MOV R4, #0d MOV R3, #0d SETB C CLR HL1 SETB F0 CLR RS0 CLR RS1 SETB EA SETB EX0 SETB EX1 MOV TMOD, #00000001b ; 16-bit mode MOV TH0, #0d MOV TL0, #0d

MOV 20h, #00000001b MOV 21h, #01001111b MOV 22h, #00010010b MOV 23h, #00000110b MOV 24h, #01001100b MOV 25h, #00100100b MOV 26h, #00100000b MOV 27h, #00001111b MOV 28h, #00000000b MOV 29h, #00000100b MOV 2Ah, #00001000b MOV 2Bh, #01100000b MOV 2Ch, #00110001b MOV 2Dh, #01000010b MOV 2Eh, #00110000b MOV 2Fh, #00111000b SETB T0 SETB ET0

interupt0: cycle: MOV R0, #0d

display_cycle: CJNE R0, #15d, go_display JMP end_display

go_display: MOV P3, #29d MOV A, R0 ANL A, #0Fh ADD A, #20h MOV R1, A MOV A, @R1 MOV P2, A


MOV R1, #0d SETB TR0

delay: ;JNB TF0, $ ;CLR TF0

INC R1 CJNE R1, #2d, delay MOV R1, #0d

;CLR TR0

;INC R0

CJNE R0, #15d, display_cycle

M1: CJNE R4, #1d, LIGHT1

		SETB HL2

CLR HL1 MOV R4, #0d jmp display_cycle

LIGHT1: SETB HL1 CLR HL2 MOV R4, #1d JMP display_cycle


end_display: JMP cycle RETI


interupt1: CJNE R3, #0d, manage1

manage1: MOV P3, #29d MOV A, R0 ANL A, #0Fh ADD A, #20h MOV R1, A MOV A, @R1 MOV P2, A RETI

END Схема в Протеусе выглядит следующим образом:

Рис. 9. Схема в Протеусе

После включения схемы счетчик начинает считать:

Рис. 10. Схема в Протеусе


Работа с индикатором и светодиодами

Написать программу, которая работает следующим образом. В исходном состоянии светодиоды HL1 и HL2 погашены. При нажатии на клавишу ССИ инкрементируется с частотой ~ 1 Гц, горит светодиод HL1. При повторном нажатии на клавишу - останов, горит светодиод HL2, при следующем нажатии снова начинает считать с "0" из исходного состояния.

Реализация программы представлена на языке ASSEMBLER. HD DATA P2 STATE DATA P3 KEY BIT P1.0 NUMB DATA 23h PRESSED BIT 24h.0 SUBD_H DATA 25h SUBD_L DATA 26h

ORG 0000h JMP INIT

ORG 1000h INIT: MOV SUBD_H,#8; FOR REAL 1HZ U SHOULD TYPE: MOV SUBD_H,#4 MOV SUBD_L,#244 MOV STATE,#0h SETB STATE.0 MOV HD,#0h MOV NUMB,#0h MOV TMOD,#1 MOV TL0,#0 MOV TH0,#-4h SETB ET0 SETB EA SETB TR0 DL: JMP DL

ORG 000Bh PUSH PSW MOV C,KEY JC NOPR SETB PRESSED NOPR: ANL C,PRESSED JNC NOREL CLR PRESSED MOV A,STATE MOV C,STATE.2 RL A MOV STATE,A MOV STATE.0,C NOREL:

DJNZ SUBD_L, SBD; UNCOMMENT THIS
MOV SUBD_L,#244; AND THIS

DJNZ SUBD_H,SBD MOV SUBD_H,#8; FOR REAL 1HZ U SHOULD TYPE: MOV SUBD_H,#4 MOV C,STATE.1 JNC SBD INC HD SBD: MOV C,STATE.0 JNC FIN MOV HD,#0 FIN: POP PSW RETI

END Схема в Протеусе выглядит следующим образом:

Рис. 8.3. Схема в Протеусе

После включения схемы счетчик начинает считать, загорается первый светодиод:

Рис. 8.4. Схема в Протеусе

После повторного нажатия счетчик останавливается, загорается второй светодиод:

Рис. 8.5. Схема в Протеусе


Работа со светодиодами 2

При нажатии на кнопку 1 начинает мерцать диод 1, при нажатии на кнопку 2 начинает моргать диод. При повторном нажатии на кнопку 1 или 2 соответствующий диод прекращает мерцать.

Реализация программы представлена на языке ASSEMBLER: Flag1 BIT 24h.0 Flag2 BIT 24h.1 Flag11 BIT 24h.2 Flag22 BIT 24h.3 ORG 0 LJMP start ORG 003h SETB Flag11 LJMP interupt ORG 013h SETB Flag22 LJMP interupt ORG 0Bh LJMP TICK0 ORG 1Bh LJMP TICK1 ORG 100h start: MOV A, #00000111B CLR C MOV p1, #00000000B MOV TMOD,#00010001B MOV IE,#10001010B MOV TL1,#11110000B MOV TH1,#11111111B SETB EX0 SETB EX1 SETB TR0 JMP $


interupt: SETB TR1 RETI


TICK1: CLR TR1 MOV TL1,#11110000B MOV TH1,#11111111B JNB Flag11, Mark11 XRL 24h, #00000001B CLR Flag11 RETI Mark11: XRL 24h, #00000010B CLR Flag22 RETI

TICK0: DEC A JZ INVERT RETI INVERT: MOV A, #00000111B JNB Flag1, Mark1 XRL p1,#00000001B Mark1: JNB Flag2, Mark2 XRL p1,#00000010B Mark2: RETI END

Схема в Протеусе выглядит следующим образом:

Рис. 5. Схема в Протеусе


__NUMBEREDHEADINGS__


Домашнее задание 5

Работа на PIC12F675 с 7-сегментным индикатором

Задание: реализовать работу на PIC12F675 с 7-сегментным индикатором

Реализация программы на ассемблере. LIST P=12C509 #include "P12C509.INC" ; Include header file tmr0 equ 1 gpio equ 6 acc equ 8 temp equ 10 count equ 12 org     0        goto    main org     H'50' main movlw b'00101000' ;включаем T0CKI и частоту 1:1 option calib movlw b'00000001' movwf gpio call dischr movlw b'00001110' ;активируем GP0 tris 6 call measur

;Serial output of result movlw 8       ;Loop for 8 bits movwf count      loop1 clrw ;Start with a zero   btfsc acc,7       ;Test result bit     iorlw 0x20 movwf GPIO            ;Output data bit to port on GP5 bsf GPIO,4 ;Generate Clock pulse on GP4 bcf GPIO,4                             rlf acc,F            ;Get next result bit decfsz count,F ;Loop for next bit goto loop1 goto calib dischr movlw b'00001101' ;разряжаем конденсатор в цикле  tris 6 ;через GP2 movlw 0xFF movwf temp loop decfsz temp goto loop movlw b'00001111' tris 6 retlw 0 measur clrf tmr0 movlw 0x00 movwf acc tloop incfsz acc goto endchk goto endmes endchk btfss tmr0, 0 ;зарядился ли конденсатор? goto tloop endmes movf tmr0, 0 retlw 0 END

Схема в Протеусе:

Рис.5 Схема ДЗ5


Работа с светодиодами.Программирование на МК PIC16F628A.

Задание: то же, что и в домашнем задании 4, только реализация на МК PIC16F628A.

Реализация программы на ассемблере.

list p=PIC16F628A

  1. include <P16F628A.INC>

__CONFIG 3F50 errorlevel 2

status equ 03h PORTA equ 05h PORTB equ 06h TRISA equ 85h TRISB equ 86h Reg_1 equ 23h Reg_2 equ 24h Reg_3 equ 25h

ORG 0 goto START


pause_1s movlw .173

           movwf       Reg_1
           movlw       .19
           movwf       Reg_2
           movlw       .6
           movwf       Reg_3
           decfsz      Reg_1,F
           goto        $-1
           decfsz      Reg_2,F
           goto        $-3
           decfsz      Reg_3,F
           goto        $-5
           nop
           nop

return


pause_5s movlw .110

           movwf       Reg_1
           movlw       .94
           movwf       Reg_2
           movlw       .26
           movwf       Reg_3
           decfsz      Reg_1,F
           goto        $-1
           decfsz      Reg_2,F
           goto        $-3
           decfsz      Reg_3,F
           goto        $-5
           nop

return


DAY BSF status,5 MOVLW b'00000000' MOVWF TRISB BCF status,5 MOVLW b'01011110' MOVWF PORTB return


NICHT BSF status,5 MOVLW b'00000000' MOVWF TRISB BCF status,5 MOVLW b'01110110' MOVWF PORTB return

----------------------------
начало програмы
----------------------------

START BSF status,5 movlw b'00001000' movwf TRISA clrf TRISA clrf TRISB bcf status,5

m1 btfsc PORTA,3 goto R_d goto R_H


R_d call DAY BSF status,5 MOVLW b'00001000' MOVWF TRISA BCF status,5 MOVLW b'00001001' MOVWF PORTA

call pause_5s MOVLW b'00001011' MOVWF PORTA

Call pause_1s MOVLW b'00001100' MOVWF PORTA

Call pause_5s MOVLW b'00001000' MOVWF PORTA Call pause_1s MOVLW b'00001100' MOVWF PORTA Call pause_1s MOVLW b'00001000' MOVWF PORTA Call pause_1s MOVLW b'00001010' MOVWF PORTA Call pause_1s goto m1


R_H call NICHT BSF status,5 MOVLW b'00001000' MOVWF TRISA BCF status,5 MOVLW b'00001000' ; MOVWF PORTA call pause_1s MOVLW b'00001010' MOVWF PORTA

call pause_1s MOVLW b'00001000'; MOVWF PORTA

goto m1


END

Схема в Протеус:

Рис. 6. Схема в Протеусе


Работа со светодиодами 2

Написать программу, которая работает следующим образом. В исходном положении светодиоды HL1 и HL2 погашены, индикатор обнулен. При нажатии на клавишу S1 значение на индикаторе увеличивается с частотой 1с, при повторном нажатии на S1 – останов, после 3 нажатия – исходное состояние. После 1 переполнения загорается диод HL1, после 2 – HL2 и так далее.

Код программы на языке ASSEMBLER представлен далее по тексту.

S1 BIT P1.0 ;кнопка HL1 BIT P1.2 ;диод 1 HL2 BIT P1.3 ;диод 2

$EJECT

ORG 0000h JMP start

ОСНОВНОЙ КОД

ORG 0100h

start: MOV R4, #0d MOV R3, #1d SETB C SETB HL1 SETB F0 CLR RS0 CLR RS1 SETB EA SETB EX0 SETB EX1 MOV TMOD, #00000001b ; 16-bit mode MOV TH0, #0d MOV TL0, #0d

MOV 20h, #00000001b MOV 21h, #01001111b MOV 22h, #00010010b MOV 23h, #00000110b MOV 24h, #01001100b MOV 25h, #00100100b MOV 26h, #00100000b MOV 27h, #00001111b MOV 28h, #00000000b MOV 29h, #00000100b MOV 2Ah, #00001000b MOV 2Bh, #01100000b MOV 2Ch, #00110001b MOV 2Dh, #01000010b MOV 2Eh, #00110000b MOV 2Fh, #00111000b SETB T0 SETB ET0

manage: JB S1, manage

cycle: MOV R0, #0d

display_cycle: CJNE R0, #15d, go_display JMP end_display


go_display:


MOV P3, #29d MOV A, R0 ANL A, #0Fh ADD A, #20h MOV R1, A MOV A, @R1 MOV P2, A MOV R1, #0d SETB TR0

delay: JNB TF0, $ CLR TF0 CJNE R3, #0d, M0 JNB S1, MANAGE1 M0:INC R1 CJNE R1, #10d, delay MOV R1, #0d CLR TR0 INC R0 JNB S1, MANAGE1 MOV r3, #0d CJNE R0, #15d, display_cycle


M1: CJNE R4, #1d, LIGHT1

		SETB HL1

CLR HL2 MOV R4, #0d jmp display_cycle

LIGHT1: SETB HL2 CLR HL1 MOV R4, #1d JMP display_cycle


end_display: JMP cycle

MANAGE1: JnB S1, manage1


manage2: JB S1, manage2 MOV P3, #12d

manage3: JnB S1, manage3 DEL3: INC R1 CJNE R1, #4d, DEL3

	MOV R1, #0d

manage4: JB S1, manage4

manage5: JnB S1, manage5


SETB HL1 SETB HL2 MOV R0, #0d JMP go_display

END

Схема в Протеусе выглядит следующим образом:

Рис. 11. Схема в Протеусе
Рис. 12. Схема в Протеусе. Проверка

Работа с индикатором и светодиодами с использованием микроконтроллера PIC12F629

Реализовать предыдущее задание на МК 12F629.

Реализация программы представлена на языке С:

  1. include <12F629.h>
  2. fuses NOWDT
  3. fuses NOMCLR
  4. fuses INTRC_IO
  5. fuses NOPROTECT
  6. fuses NOPUT
  7. fuses BROWNOUT
  1. use delay (clock = 4000000)
  2. use I2C(Master, SDA = PIN_A5, SCL = PIN_A4)

byte count; byte state; byte msec; unsigned char is_output;

  1. int_timer1

void timer1_isr (void) {

  if (is_output)
  {
     if (++msec == 10)
     {
     i2c_start();
        msec = 0;
        count++;
        i2c_start();
        i2c_write(0x70);
        i2c_write(count);
        i2c_stop();
        
     }
  }

}

  1. int_ext

void ext_isr (void) {

  delay_ms (30);
  
  state++;
  
  if (state == 3)
  {
     state = 0;
  }
  
  switch (state)
  {
     case 0:
        count = 0;
        output_low (PIN_A0);
        output_low (PIN_A1);
        i2c_start();
        i2c_write(0x70);
        i2c_write(count);
        i2c_stop();
        break;
     case 1:
        is_output = 1;
        count = 0;
        set_timer1 (25536);
        msec = 0;
        output_high (PIN_A0);
        output_low (PIN_A1);
        break;
     case 2:
        is_output = 0;
        output_low (PIN_A0);
        output_high (PIN_A1);
        break;
  }

}

void main () {

  is_output = 0;
  state = 0;
  count = 0;
  
  i2c_start();
  i2c_write(0x70);
  i2c_write(count);
  i2c_stop();
  setup_timer_1 (T1_INTERNAL | T1_DIV_BY_1);
  enable_interrupts (INT_EXT);
  enable_interrupts (INT_TIMER1);
  enable_interrupts (global);
  
  while (1);

} Схема в Протеусе выглядит следующим образом:

Рис. 8.6. Схема в Протеусе

При нажатии на кнопку загорается первый светодиод и начинается подсчет:

Рис. 8.7. Схема в Протеусе

После второго нажатия на кнопку - останов и загорается второй светодиод:

Рис. 8.8. Схема в Протеусе

При последующем нажатии происходит сброс.



Работа со светодиодами 3

В исходном состоянии диод №1 и диод №2 погашены, семисегментный индикатор установлен в 0. При нажатии на кнопку значения индикатора с частотой 1 Гц увеличивается на 1 и после того как значение становится равным 7 оно сбрасывается в 0 и загорается диод №1. После этого последовательность действий повторяется, но теперь гаснет диод №1 и загорается диод №2 и т.д. Код программы на языке ASSEMBLER представлен ниже: S1 BIT P1.0 HL1 BIT P1.2 HL2 BIT P1.3

$EJECT

ORG 0 LJMP start ORG 003h LJMP interupt0 ORG 040h LJMP interupt1 ORG 100h

start: MOV R4, #0d MOV R3, #0d SETB C CLR HL1 SETB F0 CLR RS0 CLR RS1 SETB EA SETB EX0 SETB EX1 MOV TMOD, #00000001b ; 16-bit mode MOV TH0, #0d MOV TL0, #0d

MOV 20h, #00000001b MOV 21h, #01001111b MOV 22h, #00010010b MOV 23h, #00000110b MOV 24h, #01001100b MOV 25h, #00100100b MOV 26h, #00100000b MOV 27h, #00001111b MOV 28h, #00000000b MOV 29h, #00000100b MOV 2Ah, #00001000b MOV 2Bh, #01100000b MOV 2Ch, #00110001b MOV 2Dh, #01000010b MOV 2Eh, #00110000b MOV 2Fh, #00111000b SETB T0 SETB ET0

interupt0: cycle: MOV R0, #0d

display_cycle: CJNE R0, #15d, go_display JMP end_display

go_display: MOV P3, #29d MOV A, R0 ANL A, #0Fh ADD A, #20h MOV R1, A MOV A, @R1 MOV P2, A


MOV R1, #0d SETB TR0

delay: ;JNB TF0, $ ;CLR TF0

INC R1 CJNE R1, #2d, delay MOV R1, #0d

;CLR TR0

;INC R0

CJNE R0, #15d, display_cycle

M1: CJNE R4, #1d, LIGHT1

		SETB HL2

CLR HL1 MOV R4, #0d jmp display_cycle

LIGHT1: SETB HL1 CLR HL2 MOV R4, #1d JMP display_cycle


end_display: JMP cycle RETI


interupt1: CJNE R3, #0d, manage1

manage1: MOV P3, #29d MOV A, R0 ANL A, #0Fh ADD A, #20h MOV R1, A MOV A, @R1 MOV P2, A RETI

END Схема реализованная в Протеусе представлена ниже:

Рис. 6. Схема в Протеусе


__NUMBEREDHEADINGS__


Домашнее задание 6

Работа со светодиодами с использованием микроконтролееров PIC12F675 и PIC12F629

Написать программу, которая работает следующим образом. В исходном состоянии светодиоды HL1 и HL2 погашены. При нажатии на клавишу S1 значение на индикаторе увеличивается на 1 с частотой в 1 сек, при повторном нажатии на S1 происходит останов счетчика на индикаторе, после 3 он возвращается в исходное состояние. После первого переполнения загорается светодиод D1, после второго - D2 и так далее.

Реализация программы с использованием микроконтроллера PIC12F675.

Схема в Протеусе выглядит следующим образом:

Рис. 13. Схема в Протеусе

Код программы на языке ASSEMBLER представлен далее по тексту. list p=12f675

  1. include <p12f675.inc>

__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF ERRORLEVEL -302 CBLOCK 0x20 A0 A1 A2 A3 A4 Counter2  ; счетчики для пауз Counter1  ; Counter3 ENDC

wpu equ 95 op_reg equ 81 T1 equ .255  ; задержка T2 equ .255  ; задержка T3 equ .255 Status equ 03h  ; Регистр выбора банка. GPIA equ 05h  ; Регистр управления защелками порта. Cmcon equ 19h  ; Регистр Cmcon - компаратора TrisIO equ 05h  ; Регистр выбора направления работы выводов порта. INTCON equ 0Bh  ; Регистр разрешения(1)/запрета(0) прерываний F equ 1  ; Результат направить в регистр. ANSEL equ 9F ADCON0 EQU 1F

org 0

start bsf Status,5  ;

           movwf       OSCCAL      

bcf Status,5  ; перейти в банк 0

           clrf        GPIA             ; инициализация защелок
           movlw       7               ; биты 0..2 поднять
           movwf       Cmcon            ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых
           

bsf Status,5  ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status).

           movlw       8              ; Записать конфигурацию GPIA в аккумулятор (W) 8=00 001000  GP3 - вход, остальные - выходы
           movwf       TrisIO; Скопировать конфигурацию GPIA из W в регистр TrisIO.
    		 clrf    	   ANSEL	    ;настройка входов и тактирования АЦП

movlw b'00001011' movwf op_reg

bcf Status,5  ; перейти в банк 0 movlw 0x00 movwf A4 bsf A4,0


Scan btfsC GPIA,3 GOTO Scan BTFSS GPIA, 3 GOTO MET_3

MET_3 BTFSC A0,3 call m1 MOVLW 0 BTFSC A0,3 MOVWF A0

INCF A0, 1 ;COMF A0,1 GOTO MET_4


MET_4 BTFSC A0,0 BSF GPIA,0


BTFSC A0,1 BSF GPIA,1


BTFSC A0,2 BSF GPIA,2


BTFSS A0,0 BCF GPIA,0

BTFSS A0,1 BCF GPIA,1

BTFSS A0,2 BCF GPIA,2

next call wait

    	GOTO MET_3

wait

       movlw   T2
       movwf   Counter2

pause2

       movlw   T1
       movwf   Counter1

pause3 movlw T3

       movwf   Counter3

pause1 nop

       decfsz  Counter1,1
       goto pause1
       decfsz Counter2,1
       goto pause3
      	BTFSS	GPIA, 3

GOTO MET_1 return

m1 BTFSS A4,0 GOTO INV2 BTFSC A4,0 GOTO INV1

INV1 BCF GPIA,4 BSF GPIA,5 bcf A4,0 return INV2 BSF GPIA,4 BCF GPIA,5 bsf A4,0 return MET_1: BTFSS GPIA, 3 GOTO MET_1


manage2: BTFSC GPIA, 3 GOTO manage2 BCF GPIA,0 BCF GPIA,1 BCF GPIA,2


manage3: BTFSS GPIA, 3 GOTO manage3 bcf A4,0 bCf GPIA, 4 bCf GPIA, 5 ;call wait MET_5 NOP NOP INCFSZ A2,1 GOTO MET_5 INCFSZ A3,1 GOTO MET_5


manage4: BTFSC GPIA, 3 GOTO manage4

manage5: BTFSS GPIA, 3 GOTO manage5 CLRF A0 GOTO MET_3

END

Осуществляем проверку работу схемы. На рисунках 14-16 представлены моменты включения схемы, работа схемы после ее первого и второго переполнения соответственно.

Рис. 14. Схема в Протеусе
Рис. 15. Схема в Протеусе
Рис. 16. Схема в Протеусе


Реализация программы с использованием микроконтроллера PIC12F629.

Схема в Протеусе выглядит аналогично (рис. 17).

Файл:Dz54.png
Рис. 17. Схема в Протеусе

Код программы на языке ASSEMBLER представлен далее по тексту.

list p = 12f629

__config 01FC4h          ;  01111 11 1 0 0 0 100 

CBLOCK 0x20 A0

       A1       
       A2

A3 A4 Counter2  ; счетчики для пауз

        Counter1         ; 
       Counter3           ;
    
        ENDC

T1 equ .255  ; задержка T2 equ .255  ; задержка T3 equ .255 Status equ 03h  ; Регистр выбора банка. GPIO equ 05h  ; Регистр управления защелками порта. Cmcon equ 19h  ; Регистр Cmcon - компаратора TrisIO equ 05h  ; Регистр выбора направления работы выводов порта. INTCON equ 0Bh  ; Регистр разрешения(1)/запрета(0) прерываний OSCCAL equ 10h  ; Регистр хранения калибровочной константы F equ 1  ; Результат направить в регистр. ANSEL equ 9F

org 0

start bsf Status,5  ;

           Call        3FFh             
	    movwf       OSCCAL      

bcf Status,5  ; перейти в банк 0

           clrf        GPIO             ; инициализация защелок
           movlw       .55               ; биты 0..2 поднять
           movwf       Cmcon            ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых
           

bsf Status,5  ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status).

           movlw       .8              ; Записать конфигурацию GPIO в аккумулятор (W) .8=00 001000  GP3 - вход, остальные - выходы
           movwf       TrisIO           ; Скопировать конфигурацию GPIO из W в регистр TrisIO.
           movlw       .14

movwf ANSEL bcf Status,5  ; перейти в банк 0 movlw .0 movwf A4 bsf A4,0 Scan btfsc GPIO,3 GOTO Scan BTFSS GPIO, 3 GOTO MET_3

MET_3 BTFSC A0,3 call m1 MOVLW .0 BTFSC A0,3 MOVWF A0

INCF A0, 1 ;COMF A0,1 GOTO MET_4


MET_4 BTFSC A0,0 BSF GPIO,0


BTFSC A0,1 BSF GPIO,1


BTFSC A0,2 BSF GPIO,2


BTFSS A0,0 BCF GPIO,0

BTFSS A0,1 BCF GPIO,1

BTFSS A0,2 BCF GPIO,2

next call wait

    	GOTO MET_3

wait

       movlw   T2
       movwf   Counter2

pause2

       movlw   T1
       movwf   Counter1

pause3 movlw T3

       movwf   Counter3

pause1 nop

       decfsz  Counter1,1
       goto pause1
       decfsz Counter2,1
       goto pause3
      	BTFSS	GPIO, 3

GOTO MET_1 return

m1 BTFSS A4,0 GOTO INV2 BTFSC A4,0 GOTO INV1

INV1 BCF GPIO,4 BSF GPIO,5 bcf A4,0 return INV2 BSF GPIO,4 BCF GPIO,5 bsf A4,0 return MET_1: BTFSS GPIO, 3 GOTO MET_1


manage2: BTFSC GPIO, 3 GOTO manage2 BCF GPIO,0 BCF GPIO,1 BCF GPIO,2


manage3: BTFSS GPIO, 3 GOTO manage3 bcf A4,0 bCf GPIO, 4 bCf GPIO, 5 ;call wait MET_5 NOP NOP INCFSZ A2,1 GOTO MET_5 INCFSZ A3,1 GOTO MET_5


manage4: BTFSC GPIO, 3 GOTO manage4

manage5: BTFSS GPIO, 3 GOTO manage5 CLRF A0 GOTO MET_3

END

Работа данной схемы аналогична предыдущей.


Секундомер на МК 12F675 и его аппаратная реализация с использованием отладочной платы AX-12

Реализация программы представлена на языке ASSEMBLER. list p=12f675

  1. include <p12f675.inc>

__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF ERRORLEVEL -302 CBLOCK 0x20 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 Count_But A0 A1 A2 A3 A4 Counter2  ; счетчики для пауз Counter1  ; Counter3 Count temp temp1 ENDC

wpu equ 95 op_reg equ 81 T1 equ .255  ; задержка T2 equ .255  ; задержка T3 equ .4 Status equ 03h  ; Регистр выбора банка. GPIA equ 05h  ; Регистр управления защелками порта. Cmcon equ 19h  ; Регистр Cmcon - компаратора TrisIO equ 05h  ; Регистр выбора направления работы выводов порта. INTCON equ 0Bh  ; Регистр разрешения(1)/запрета(0) прерываний F equ 1  ; Результат направить в регистр. ANSEL equ 9F ADCON0 EQU 1F

org 0

start:

      bsf         Status,5         ;
           movwf       OSCCAL      

bcf Status,5  ; перейти в банк 0

           clrf        GPIA             ; инициализация защелок
           movlw B'00100000'           ;настройка INTCON 

movwf INTCON movlw 7  ; биты 0..2 поднять

           movwf       Cmcon            ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых
           

bsf Status,5  ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status).

           movlw       b'00101000'              ; Записать конфигурацию GPIA в аккумулятор (W) 8=00 101000  GP3 - вход, остальные - выходы
           movwf       TrisIO; Скопировать конфигурацию GPIA из W в регистр TrisIO.
    		 clrf    	   ANSEL	    ;настройка входов и тактирования АЦП

movlw b'00001011' movwf op_reg

bcf Status,5  ; перейти в банк 0 movlw 0x00 MOVLW A4 bsf A4,0

MOVLW b'11111100' MOVWF r1 MOVLW b'01100000' MOVWF r2 MOVLW b'11011010' MOVWF r3 MOVLW b'11110010' MOVWF r4 MOVLW b'01100110' MOVWF r5 MOVLW b'10110110' MOVWF r6 MOVLW b'10111110' MOVWF r7 MOVLW b'11100000' MOVWF r8

MOVLW b'11111110' MOVWF r9 MOVLW b'11110110' MOVWF r10


Scan btfsC GPIA,3 GOTO Scan BTFSS GPIA, 3 GOTO Begin


Begin:


incf temp ;Увеличиваем содержимое на единицу


ShiftRegOut: CALL wait clrf Count movf r1,0 movwf temp

RegOut: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut1

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut

ShiftRegOut1: CALL wait clrf Count movf r2,0 movwf temp

RegOut1: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut2 btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut1

ShiftRegOut2: clrf Count call wait movf r3,0 movwf temp

RegOut2: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut3

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut2

ShiftRegOut3: clrf Count call wait movf r4,0 movwf temp

RegOut3: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut4

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut3

ShiftRegOut4: clrf Count call wait movf r5,0 movwf temp

RegOut4: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut5

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut4

ShiftRegOut5: clrf Count call wait movf r6,0 movwf temp

RegOut5: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut6

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut5

ShiftRegOut6: clrf Count call wait movf r7,0 movwf temp

RegOut6: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut7

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut6

ShiftRegOut7: clrf Count call wait

incf Count_But

movf r8,0 movwf temp

RegOut7: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut8

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut7

ShiftRegOut8: clrf Count call wait movf r9,0 movwf temp

RegOut8: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut9

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut8



ShiftRegOut9: clrf Count call wait movf r10,0 movwf temp

RegOut9: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut9


endproc: BSF GPIA,2 nop nop BCF GPIA,2 bcf GPIA,1 movf temp1,0 movwf temp return


wait

       movlw   T3
       movwf   Counter3

pause2

       movlw   T2
       movwf   Counter2

pause3 movlw T1

       movwf   Counter1

pause1 nop

       decfsz  Counter1,1
       goto pause1
       decfsz Counter2,1
       goto pause3
       decfsz Counter3,1
       goto pause2
      

BTFSS GPIA, 3 GOTO stop

return


stop: BTFSS GPIA, 3 goto stop

stop2: btfsC GPIA,3 GOTO stop2 BTFSS GPIA, 3 GOTO start

end Схема в Протеусе выглядит следующим образом:

Рис. 8.9. Схема в Протеусе

После включения схемы счетчик начинает считать:

Рис. 8.10. Схема в Протеусе

После повторного нажатия счетчик останавливается и после следующего нажатия сбрасывает значение:

Рис. 8.11. Схема в Протеусе









Работа со светодиодами 2 с использованием PIC12F629

В исходном состоянии диод №1 и диод №2 погашены, семисегментный индикатор установлен в 0. При нажатии на кнопку значения индикатора с частотой 1 Гц увеличивается на 1 и после того как значение становится равным 7 оно сбрасывается в 0 и загорается диод №1. После этого последовательность действий повторяется, но теперь гаснет диод №1 и загорается диод №2 и т.д.

Код программы на языке ASSEMBLER представлен ниже: list p = 12f675

__config 01FC4h         

CBLOCK 0x20 A0

       A1       
       A2

A3 A4 Cnt2

       Cnt1        
       Cnt3         
    
        ENDC

T1 equ .255 T2 equ .255 T3 equ .255 St equ 03h GPIO equ 05h Cmcon equ 19h TIO equ 05h INTCON equ 0Bh OSCCAL equ 10h F equ 1 ANSEL equ 9F

org 0

start bsf St,5

           Call        3FFh             
	    movwf       OSCCAL      

bcf St,5

           clrf        GPIO            
           movlw       .55               
           movwf       Cmcon            
           

bsf St,5

           movlw       .8                      
   movwf       TIO           
           movlw       .14

movwf ANSEL bcf St,5 movlw .0 movwf A4 bsf A4,0 Scan btfsc GPIO,3 GOTO Scan BTFSS GPIO, 3 GOTO MET_3

MET_3 BTFSC A0,3 call m1 MOVLW .0 BTFSC A0,3 MOVWF A0

INCF A0, 1 ;COMF A0,1 GOTO MET_4


MET_4 BTFSC A0,0 BSF GPIO,0


BTFSC A0,1 BSF GPIO,1


BTFSC A0,2 BSF GPIO,2


BTFSS A0,0 BCF GPIO,0

BTFSS A0,1 BCF GPIO,1

BTFSS A0,2 BCF GPIO,2

next call wait

    	GOTO MET_3

wait

       movlw   T2
       movwf   Cnt2

pause2

       movlw   T1
       movwf   Cnt1

pause3 movlw T3

       movwf   Cnt3

pause1 nop

       decfsz  Cnt1,1
       goto pause1
       decfsz Cnt2,1
       goto pause3
      	BTFSS	GPIO, 3

GOTO MET_1 return

m1 BTFSS A4,0 GOTO INV2 BTFSC A4,0 GOTO INV1

INV1 BCF GPIO,4 BSF GPIO,5 bcf A4,0 return INV2 BSF GPIO,4 BCF GPIO,5 bsf A4,0 return MET_1: BTFSS GPIO, 3 GOTO MET_1


manage2: BTFSC GPIO, 3 GOTO manage2 BCF GPIO,0 BCF GPIO,1 BCF GPIO,2


manage3: BTFSS GPIO, 3 GOTO manage3 bcf A4,0 bCf GPIO, 4 bCf GPIO, 5 ;call wait MET_5 NOP NOP INCFSZ A2,1 GOTO MET_5 INCFSZ A3,1 GOTO MET_5


manage4: BTFSC GPIO, 3 GOTO manage4

manage5: BTFSS GPIO, 3 GOTO manage5 CLRF A0 GOTO MET_3

END Схема реализованная в Протеусе представлена ниже:

Рис. 7. Схема в Протеусе


__NUMBEREDHEADINGS__

Домашнее задание 7

Аппаратная реализация системы индикации с использованием отладочной платы AX-12

В данной работе необходимо реализовать задачу из домашнего задания 6 аппаратно. Так как на плате AX-12 ресурсы ограничены ( плата располагает 1 семисегментным индикатором, 8 диодами, причем одновременно они работать не могут, 3 кнопками-переключателями, 1 сдвиговым регистром), поэтому модифицируем условие задачи следующим образом:

При однократном нажатии на кнопку S1 значения на индикаторе начинают меняться от 1 до 7, по окончании данного процесса на индикаторе высвечивается точка - признак того, что счет окончен. Далее необходимо осуществить переключение с режима индикатора в режим диодов (переставлением защелки GP3) и после нажатия на кнопку S2 загорается диод D1 (признак первого переполнения значений на индикаторе). После этого необходимо вновь переключиться в режим семисегментного индикатора (переставлением кнопки GP3 в начальное положение) и снова запустить его путем нажатия кнопки S1. После этого процесс повторится, причем при переключении в режим диодов должен загораться диод D2. Код программы на языке ASSEMBLER представлен далее по тексту. list p=12f675

  1. include <p12f675.inc>

__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF ERRORLEVEL -302 CBLOCK 0x20 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 Count_But A0 A1 A2 A3 A4 Counter2  ; счетчики для пауз Counter1  ; Counter3 Count temp temp1 ENDC

wpu equ 95 op_reg equ 81 T1 equ .255  ; задержка T2 equ .255  ; задержка T3 equ .255 Status equ 03h  ; Регистр выбора банка. GPIA equ 05h  ; Регистр управления защелками порта. Cmcon equ 19h  ; Регистр Cmcon - компаратора TrisIO equ 05h  ; Регистр выбора направления работы выводов порта. INTCON equ 0Bh  ; Регистр разрешения(1)/запрета(0) прерываний F equ 1  ; Результат направить в регистр. ANSEL equ 9F ADCON0 EQU 1F

org 0

start bsf Status,5  ;

           movwf       OSCCAL      

bcf Status,5  ; перейти в банк 0

           clrf        GPIA             ; инициализация защелок
           movlw B'00100000'           ;настройка INTCON 

movwf INTCON movlw 7  ; биты 0..2 поднять

           movwf       Cmcon            ; компаратор выключен, GP0, GP1, GP2 - цифровые вх/вых
           

bsf Status,5  ; Перейти в 1-й банк (установить в 1 5-й бит регистра Status).

           movlw       b'00101000'              ; Записать конфигурацию GPIA в аккумулятор (W) 8=00 101000  GP3 - вход, остальные - выходы
           movwf       TrisIO; Скопировать конфигурацию GPIA из W в регистр TrisIO.
    		 clrf    	   ANSEL	    ;настройка входов и тактирования АЦП

movlw b'00001011' movwf op_reg

bcf Status,5  ; перейти в банк 0 movlw 0x00 MOVLW A4 bsf A4,0

MOVLW b'11111100' MOVWF r1 MOVLW b'01100000' MOVWF r2 MOVLW b'11011010' MOVWF r3 MOVLW b'11110010' MOVWF r4 MOVLW b'01100110' MOVWF r5 MOVLW b'10110110' MOVWF r6 MOVLW b'10111110' MOVWF r7 MOVLW b'11100000' MOVWF r8

MOVLW b'00000001' MOVWF r9 MOVLW b'10000000' MOVWF r10 MOVLW b'01000000'


MOVWF r11 Scan btfsC GPIA,3 GOTO Scan BTFSS GPIA, 3 GOTO Begin


Begin:

incf temp ;Увеличиваем содержимое на единицу


ShiftRegOut: CALL wait clrf Count movf r1,0 movwf temp

RegOut: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut1

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut

ShiftRegOut1: CALL wait clrf Count movf r2,0 movwf temp

RegOut1: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut2 btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut1

ShiftRegOut2: clrf Count call wait movf r3,0 movwf temp

RegOut2: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut3

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut2

ShiftRegOut3: clrf Count call wait movf r4,0 movwf temp

RegOut3: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut4

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut3

ShiftRegOut4: clrf Count call wait movf r5,0 movwf temp

RegOut4: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut5

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut4

ShiftRegOut5: clrf Count call wait movf r6,0 movwf temp

RegOut5: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut6

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut5

ShiftRegOut6: clrf Count call wait movf r7,0 movwf temp

RegOut6: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut7

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut6

ShiftRegOut7: clrf Count call wait

incf Count_But

movf r8,0 movwf temp

RegOut7: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut8

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut7

ShiftRegOut8: clrf Count call wait movf r9,0 movwf temp

RegOut8: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut9

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto RegOut8

endproc: BSF GPIA,2 nop nop BCF GPIA,2 bcf GPIA,1 movf temp1,0 movwf temp return


wait

       movlw   T2
       movwf   Counter2

pause2

       movlw   T1
       movwf   Counter1

pause3 movlw T3

       movwf   Counter3

pause1 nop

       decfsz  Counter1,1
       goto pause1
       decfsz Counter2,1
       goto pause3

;goto pause2

return

ShiftRegOut9: goto MET01

MET01: BTFSc GPIA, 5 GOTO MET01

MET_1: btfsc Count_But, 0 goto led1 btfss Count_But, 0 goto led2

led1: CALL wait clrf Count movf r10,0 movwf temp

led11: btfsc Count,3 call endproc btfsc Count,3 goto MET02

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto led11

led2: CALL wait clrf Count movf r11,0 movwf temp clrf Count_But led21: btfsc Count,3 call endproc btfsc Count,3 goto MET02

bsf GPIA,1;На линии данных лог ноль...
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp ; СДВИГАЕМ ВСЕ БИТЫ РЕГИСТРА ТЕМП ВПРАВО!!!! incf Count,1 goto led21

MET02: BTFSC GPIA, 5 GOTO MET02 goto Scan


end

В Протеусе схемы выглядит следующим образом:

Рис. 18. Схема в Протеусе

Осуществляем проверку работы схемы (рисунки 19-20).

Рис. 19. Схема в Протеусе
Рис. 20. Схема в Протеусе

Использование отладочной платы AX-12 для реализации системы индикации

В исходном состоянии значение семисегментного индикатора равно 0. При нажатии на кнопку S1 он начинает увеличивать значения на 1. После того как значение стало равным 7, на экране появляется точка. После этого нужно переключиться в режим диодов. При нажатии на кнопку S2 загорается диод D1. Далее последовательность действий повоторяется, только теперь загорается диод D2. Код программы на языке ASSEMBLER представлен ниже: list p=12f675

  1. include <p12f675.inc>

__CONFIG _INTRC_OSC_NOCLKOUT & _WDT_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _CPD_OFF ERRORLEVEL -302 CBLOCK 0x20 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 Count_But A0 A1 A2 A3 A4 Cnt2 Cnt1 Cnt3 Count temp temp1 ENDC

wpu equ 95 op_reg equ 81 T1 equ .255 T2 equ .255 T3 equ .255 St equ 03h GPIA equ 05h COMP equ 19h TIO equ 05h INTCON equ 0Bh F equ 1 ANSEL equ 9F ADCON0 EQU 1F

org 0

start bsf St,5

           movwf       OSCCAL      

bcf St,5

           clrf        GPIA            
           movlw B'00100000'          

movwf INTCON movlw 7

           movwf       COMP      
           

bsf St,5

           movlw       b'00101000'             
           movwf       TIO
    		 clrf    	   ANSEL	 

movlw b'00001011' movwf op_reg

bcf St,5 movlw 0x00 MOVLW A4 bsf A4,0

MOVLW b'11111100' MOVWF r1 MOVLW b'01100000' MOVWF r2 MOVLW b'11011010' MOVWF r3 MOVLW b'11110010' MOVWF r4 MOVLW b'01100110' MOVWF r5 MOVLW b'10110110' MOVWF r6 MOVLW b'10111110' MOVWF r7 MOVLW b'11100000' MOVWF r8

MOVLW b'00000001' MOVWF r9 MOVLW b'10000000' MOVWF r10 MOVLW b'01000000'


MOVWF r11 Scan btfsC GPIA,3 GOTO Scan BTFSS GPIA, 3 GOTO Begin


Begin:

incf temp


ShiftRegOut: CALL wait clrf Count movf r1,0 movwf temp

RegOut: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut1

bsf GPIA,1
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto RegOut

ShiftRegOut1: CALL wait clrf Count movf r2,0 movwf temp

RegOut1: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut2 btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto RegOut1

ShiftRegOut2: clrf Count call wait movf r3,0 movwf temp

RegOut2: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut3

bsf GPIA,1
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto RegOut2

ShiftRegOut3: clrf Count call wait movf r4,0 movwf temp

RegOut3: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut4

bsf GPIA,1
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto RegOut3

ShiftRegOut4: clrf Count call wait movf r5,0 movwf temp

RegOut4: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut5

bsf GPIA,1
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto RegOut4

ShiftRegOut5: clrf Count call wait movf r6,0 movwf temp

RegOut5: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut6

bsf GPIA,1
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto RegOut5

ShiftRegOut6: clrf Count call wait movf r7,0 movwf temp

RegOut6: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut7

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto RegOut6

ShiftRegOut7: clrf Count call wait

incf Count_But

movf r8,0 movwf temp

RegOut7: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut8

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto RegOut7

ShiftRegOut8: clrf Count call wait movf r9,0 movwf temp

RegOut8: btfsc Count,3 call endproc btfsc Count,3 goto ShiftRegOut9

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto RegOut8

endproc: BSF GPIA,2 nop nop BCF GPIA,2 bcf GPIA,1 movf temp1,0 movwf temp return


wait

       movlw   T2
       movwf   Cnt2

pause2

       movlw   T1
       movwf   Cnt1

pause3 movlw T3

       movwf   Cnt3

pause1 nop

       decfsz  Cnt1,1
       goto pause1
       decfsz Cnt2,1
       goto pause3

;goto pause2

return

ShiftRegOut9: goto MET01

MET01: BTFSc GPIA, 5 GOTO MET01

MET_1: btfsc Count_But, 0 goto led1 btfss Count_But, 0 goto led2

led1: CALL wait clrf Count movf r10,0 movwf temp

led11: btfsc Count,3 call endproc btfsc Count,3 goto MET02

bsf GPIA,1
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto led11

led2: CALL wait clrf Count movf r11,0 movwf temp clrf Count_But led21: btfsc Count,3 call endproc btfsc Count,3 goto MET02

bsf GPIA,1
andwf temp,0
andwf GPIA,1

btfsc temp, 0 bsf GPIA,1 btfss temp, 0 bcf GPIA,1 bsf GPIA,4 nop nop BCF GPIA,4

RRF temp incf Count,1 goto led21

MET02: BTFSC GPIA, 5 GOTO MET02 goto Scan


end
Схема в Протеусе представлена ниже:

Рис 8. Схема в Протеусе


__NUMBEREDHEADINGS__


Домашнее задание 8

Аппаратная реализация UART с использованием отладочной платы AX-12

Реализацию UART с использованием отладочной платы AX-12 представим следующим образом. На плате режим передачи или приема символов определяется переключателем GP5, если переключатель находится в положении RxD, плата будет в режиме приема данных по интерфейсу RS232, при перестановке переключателя в положение S3, кнопка S3 становится рабочей. Осуществлять передачу данных будет при помощи этой кнопки.

Алгоритм работы следующий. Если переключатель GP5 находится в положении RxD, с внешнего устройства осуществляется передача данных на плату, и принимаемые данные фиксируются на диодах (в шестнадцатиричном представлении). Если переключатель GP5 находится в положении S3, при нажатии на соответствующую кнопку будет осуществляться передача данных с платы на внешнее устройство (с платы будет передаваться некоторое фиксированное значение, указанное в коде программы - в данном примере, это символ "p").

Код программы на языке Cи представлен далее по тексту.

  1. include <12F675.h>
  2. fuses NOWDT
  3. fuses NOMCLR
  4. fuses INTRC_IO
  5. fuses NOPROTECT
  6. fuses NOPUT
  7. fuses BROWNOUT
  1. use delay (clock = 4000000)
  1. define recieved PIN_A5
  2. define transmited PIN_A1
  3. define seven_seg PIN_A1
  4. define pin_clk PIN_A4
  5. define button PIN_A3
  6. define latch PIN_A2

byte data_out = 0x70; byte data_in = 0; byte press_detection = 0; byte correct=0b11110000; void clk () {

  output_toggle(pin_clk);
  output_toggle(pin_clk);

} void clk1 () {

  output_toggle(latch);
  output_toggle(latch);

}

void seg_out(byte data) {

  byte i = 0;
  for (i = 1; i < 9; i++)
  {
     if (data & (1 << i))
        output_high(seven_seg);
     else
        output_low(seven_seg);
     clk();
  }

}


void uart_out() {

 press_detection = 0;
  output_low(transmited);
  delay_us(308);
  if (data_out & 1)
     output_high(transmited);
  else
     output_low(transmited);
  delay_us(208);
  data_out >>= 1;
  if (data_out & 1)
     output_high(transmited);
  else
     output_low(transmited);
  delay_us(208);
  data_out >>= 1;
  if (data_out & 1)
     output_high(transmited);
  else
     output_low(transmited);
  delay_us(208);
  data_out >>= 1;
  if (data_out & 1)
     output_high(transmited);
  else
     output_low(transmited);
  delay_us(208);
  data_out >>= 1;
  if (data_out & 1)
     output_high(transmited);
  else
     output_low(transmited);
  delay_us(208);
  data_out >>= 1;
  if (data_out & 1)
     output_high(transmited);
  else
     output_low(transmited);
  delay_us(208);
  data_out >>= 1;
  if (data_out & 1)
     output_high(transmited);
  else
     output_low(transmited);
  delay_us(208);
  data_out >>= 1;
  if (data_out & 1)
     output_high(transmited);
  else
     output_low(transmited);
  delay_us(208);
  data_out >>= 1;
  output_high(transmited);
  delay_us(308);
  data_out = 0x70;

void uart_in() {

  //-------------------
  byte i = 0;
  
   
   data_in <<= 1;
   delay_us(312); 

data_in |= (input(recieved));

     data_in <<= 1;
     delay_us(208);
     
     data_in |= (input(recieved));
     data_in <<= 1;
     delay_us(208);
     
     data_in |= (input(recieved));
     data_in <<= 1;
     delay_us(208);
     
      data_in |= (input(recieved));
     data_in <<= 1;
     delay_us(208);
     
     data_in |= (input(recieved));
     data_in <<= 1;
     delay_us(208);
     
     data_in |= (input(recieved));
     data_in <<= 1;
     delay_us(208);
     
     data_in |= (input(recieved));
     data_in <<= 1;
     delay_us(208);
     
           
     delay_us(208);
     data_in |= 1;
      
     seg_out(data_in);
     clk1();
     

}

void uart_clear() {

  delay_us(312);
  byte i = 0;
  data_in = 0;
   
     data_in |= 0b00000001;
  
   
 seg_out(data_in);
  

}

void main () {

  output_high(transmited);
  output_low(pin_clk);
  output_low(seven_seg);
  output_high(latch);
  while (1)
  {
     press_detection |= input(button);
     
     if ((!input(button)) && (press_detection == 1))
     {
        delay_ms(22);
        if ((!input(button))&& (press_detection == 1))
           uart_out();
     }
     if (!input(recieved))  
     {
        data_in = 0;
        data_in |= (input(recieved));
       uart_in();
        delay_ms(20);
     }
  }

} Проиллюстрируем работу схемы. На рисунке 21 представлена схема в Протеусе. Пусть схема находится в режиме приема символов и с внешнего устройства был послан символ "1". Шестнадцатиричный код данного символа - 31 или в двоичном коде - 110001. Данное значение и высвечивается на диодах (старший разряд - диод D7, младший - D2). Работа схемы в этом режиме представлена на рисунке 22. Теперь пусть схема находится в режиме передачи символов и передается символ p. Соответству.щее значение высветится на терминале. (рисунок 23)

Рис. 21. Схема в Протеусе
Рис. 22. Схема в Протеусе
Рис. 23. Схема в Протеусе


Реализация UART 2 при помощи отладочной платы AX-12

Режим направления передачи определяется положением переключателя. При положении переключателя в S3 кнопка становится активной и осуществить передачу можно с ее помощью. Код программы на языке C представлен ниже:

  1. include <12F675.h>
  2. fuses NOWDT
  3. fuses NOMCLR
  4. fuses INTRC_IO
  5. fuses NOPROTECT
  6. fuses NOPUT
  7. fuses BROWNOUT
  1. use delay (clock = 4000000)
  1. define recieved PIN_A5
  2. define transmited PIN_A1
  3. define seven_seg PIN_A1
  4. define pin_clk PIN_A4
  5. define button PIN_A3
  6. define latch PIN_A2

byte data_out = 0x70; byte data_in = 0; byte press_detection = 0; byte correct=0b11110000; void clk () {

  output_toggle(pin_clk);
  output_toggle(pin_clk);

} void clk1 () {

  output_toggle(latch);
  output_toggle(latch);

}

void seg_out(byte data) {

  byte i = 0;
  for (i = 0; i < 8; i++)
  {
     if (data & (1 << i))
        output_high(seven_seg);
     else
        output_low(seven_seg);
     clk();
  }

}


void uart_out() {

  press_detection = 0;
  output_high(transmited);
  delay_us(208);
  byte i = 0;
  for (i = 0; i < 8; i++)
  {
     if (data_out & (1 << i)) 
        output_high(transmited);
     else
        output_low(transmited);
     delay_us(208);
  }
  output_high(transmited);
  delay_us(208);

}


void uart_in() {

  delay_us(312);
  byte i = 0;
  data_in = 0;
  for(i = 0; i < 8; i++)
  {
     data_in <<= 1;
     data_in |= (input(recieved));
     delay_us(200);
  }
  switch (data_in){
  case 0b00001100: data_in=0b11111100;break;
  case 0b10001100: data_in=0b01100000;break;
  case 0b01001100: data_in=0b11011010;break;
  case 0b11001100: data_in=0b11110010;break;
  case 0b00101100: data_in=0b01100110;break;
  case 0b10101100: data_in=0b10110110;break;
  case 0b01101100: data_in=0b10111110;break;
  case 0b11101100: data_in=0b11100000;break;
  case 0b00011100: data_in=0b11111110;break;
  case 0b10011100: data_in=0b11110110;break;
  default:data_in=0b11111100;break;
  }
  
 seg_out(data_in);
  

}

void uart_clear() {

  delay_us(312);
  byte i = 0;
  data_in = 0;
   
     data_in |= 0b00000001;
  
   
 seg_out(data_in);
  

}

void main () {

  output_high(transmited);
  output_low(pin_clk);
  output_low(seven_seg);
  output_high(latch);
  while (1)
  {
     press_detection |= input(button);
     if (!input(button))
     {
           uart_clear();
           clk1();
     }
     if ((!input(button)) && (press_detection == 1))
     {
            delay_ms(22);
           
           uart_out();
           
     }
     if (!input(recieved))  
     {
        uart_in();
        clk1();
     }
  }

} Схема в Протеусе представлена ниже:

Рис. 9. Схема в Протеусе