SdevLab – Projeto | Controle de semáforos utilizando assembly e microcontrolador 8951

Eae galera!

Este post na verdade é um trabalho que eu fiz na faculdade. Eu precisava desenvolver alguma coisa em assembly para rodar em um microcontrolador. Como eu estava meio sem ideia eu resolvi fazer o que um amigo sugeriu, um semáforo de um cruzamento.

Controle de semáforos utilizando assembly e microcontrolador 8951

Segue uns pedaços do descritivo do projeto para explicar melhor a ideia do que estamos prestes a começar a desenvolver.

Finalidade
A finalidade do projeto é obter um sistema de controle de trânsito, cujas características devem atender as especificações apresentadas no decorrer deste documento.

Funcionalidade
Controle automático dos semáforos de um cruzamento de um condomínio fechado (não apresenta as mesmas condições de uma rua normal, que deve mudar o tempo de mudança de sinal dependendo dos horários do dia), que deverá manter o sinal fechado de uma rua por alguns segundos e abrir para outra (pode variar de acordo com as necessidades do cliente), fechando o sinal da primeira assim que isto acontecer. O sistema deverá ainda dar o alerta que o sinal vai mudar 10 segundos antes disso acontecer (sinal amarelo).

Fluxograma

Código

;---------------------------------------------------------------------
;PROJETO SEMAFORO
;---------------------------------------------------------------------
ORG 0000H
LJMP INIC
ORG 0003H
LJMP INTE0
ORG 0013H
LJMP INTE1
MOV SP,30 ;iniciando a pilha
;----------------------------------------------------------------
; habilitando os bits do registrador de interrupcoes
;----------------------------------------------------------------
INIC: MOV IE,#85H ;habilitando as interrupcoes int0 e int1
MOV TCON,#00H ;configurando registrador de interrupções
MOV P1,#00H ;limpando a entrada (chava de on e led)
OFF: MOV P2,#00H ;Limpando a porta p2 (desligando tudo)
JB P1.2, PADRAO ;se a chave estiver ligada, vai para a rotina padrão
LJMP OFF
;----------------------------------------------------------------------
; iniciando a rotina padrao do semaforo
;----------------------------------------------------------------------
PADRAO: SETB P1.1 ;Ligando a luz de on (indica que o sistema está funcionando)
SETB P2.7 ;ligando a luz vermelha do sinal 1
SETB P2.2 ;ligando a luz verde do sinal 2
LCALL DELAY
CLR P2.7 ;desligando a luz vermelha do sinal 1
SETB P2.6 ;ligando a luz amarela do sinal 1
CLR P2.2 ;desligando a luz verde do sinal 2
SETB P2.3 ;ligando a luz amarela do sinal 2
LCALL DELAY
CLR P2.6 ;desligando a luz amarela do sinal 1
SETB P2.5 ;ligando a luz verde do sinal 1
CLR P2.3 ;desligando a luz amarela do sinal 2
SETB P2.4 ;ligando a luz vermelha do sinal 2
LCALL DELAY
CLR P2.5 ;desligando a luz verde do sinal 1
SETB P2.6 ;ligando a luz amarela do sinal 1
CLR P2.4 ;desligando a luz vermelha do sinal 2
SETB P2.3 ;ligando a luz amarela do sinal 2
LCALL DELAY
CLR P2.3 ;desligando a luz amarela do sinal 2
CLR P2.6 ;desligando a luz amarela do sinal 1
AJMP PADRAO ;voltando para o inicio da rotina normal

;———————————————————————————————————————–
; entrando na rotina de loop
;———————————————————————————————————————–
DELAY: MOV B,#08H ;carrega o registrador B com 8
VOLTA: LCALL DELAY250 ;chama o delay de 250ms
DJNZ B,VOLTA ;decrementa o B
RET ;retorna
DELAY250: PUSH B ;salva o B de 8 na pilha
MOV B,#0FAH ;carrega B com 250ms
VOLTA1: LCALL DELAY1MS ;chama o delay de 1ms
DJNZ B,VOLTA1 ;decrementa o B de 250ms
POP B ;retira o B da pilha
RET ;retorna
DELAY1MS: PUSH B ;coloca o B de 250ms na pilha
MOV B,14H ;ESTE E O DELAY DE 1MS
FIM: DJNZ B,FIM ;decrementa o B de 1ms
POP B
RET
;———————————————————————————————————————-
;saindo da rotina de loop
;———————————————————————————————————————-
; iniciando a rotina de interrupcao 1
; se sensor1 = 1 e sensor 2 = 0
;———————————————————————————————————————
INTE0:
SETB P2.7 ;ligando a luz vermelha do sinal 1
CLR P2.6 ;desligando a luz amarela do sinal 1
CLR P2.5 ;desligando a luz verde do sinal 1
CLR P2.4 ;desligando a luz vermelha do sinal 2
CLR P2.3 ;desligando a luz amarela do sinal 2
SETB P2.2 ;ligando a luz verde do sinal 2
LCALL DELAY
CLR P2.7 ;desligando a luz vermelha do sinal 1
SETB P2.6 ;ligando a luz amarela do sinal 1
SETB P2.3 ;ligando a luz amarela do sinal 2
CLR P2.2 ;desligando a luz verde do sinal 2
LCALL DELAY
CLR P2.6 ;desligando a luz amarela do sinal 1
SETB P2.5 ;ligando a luz verde do sinal 1
SETB P2.4 ;ligando a luz vermelha do sinal 2
CLR P2.3 ;desligando a luz amarela do sinal 2
LCALL DELAY
RET ;voltando para o inicio da rotina normal
;———————————————————————————————————————
; iniciando a rotina de interrupcao 2
; se sensor1 = 0 e sensor 2 = 1
;———————————————————————————————————————
INTE1:
CLR P2.7 ;desligando a luz vermelha do sinal 1
CLR P2.6 ;desligando a luz amarela do sinal 1
SETB P2.5 ;ligando a luz verde do sinal 1
SETB P2.4 ;ligando a luz vermelha do sinal 2
CLR P2.3 ;desligando a luz amarela do sinal 2
CLR P2.2 ;desligando a luz verde do sinal 2
LCALL DELAY
SETB P2.6 ;ligando a luz amarela do sinal 1
CLR P2.5 ;desligando a luz verde do sinal 1
CLR P2.4 ;desligando a luz vermelha do sinal 2
SETB P2.3 ;ligando a luz amarela do sinal 2
LCALL DELAY
CLR P2.6 ;desligando a luz amarela do sinal 1
SETB P2.7 ;ligando a luz vermelha do sinal 1
SETB P2.2 ;ligando a luz verde do sinal 2
CLR P2.3 ;desligando a luz amarela do sinal 2
LCALL DELAY
RET ;voltando para o inicio da rotina normal

END

;———————————————————————————————————————
; Fim do Programa
;———————————————————————————————————————

Esquema Elétrico

O projeto é bastante simples. Usei 6 leds, um microcontrolador 8951, alguns resistores e transistores. A maioria do projeto está no post, se não me engano, só ficou faltando os cálculos das resistências.

Dica: Se for utilizar um led diferente do vermelho padrão, refaça os cálculos, porque a corrente que os leds amarelos e verdes utilizam são diferentes!

Até a próxima!
xD

Anúncios

15 comentários sobre “SdevLab – Projeto | Controle de semáforos utilizando assembly e microcontrolador 8951

  1. gostei da ideia mais faltou alguns truques ate porque poderiamos usar display para o publico visualizar um dos grandes efeitos que ha nos semáforo e o projecto ficava mais lindo em ves de usar-mos simplesmente a programação…
    para min este projecto está mais do que a palavra apto
    até porque nos limitamos muito em programação
    xta aprovado que não importa o numero de componentes que vamos usar mais sim a brilhante ideia…
    nota 10

    • Então rapaz, não coloquei display porque este projeto era pra aprender a programar em assembly….foi projeto relâmpago também, nem tive tanto tempo pra fazer!
      Tirei uma foto dele mas esqueci de colocar aqui no blog, vou ver se upo ela pra você ver como ficou na protoboard.
      Vlw

    • Fala Wellington,

      eu me lembro que os comandos são bem parecidos, e como eu usei o mínimo de hardware neste projeto, talvez o mesmo código funcione no 8085, no máximo algumas adaptações, mas a lógica eu acho que da pra usar a mesma. (isto é só um palpite, entendo muito pouco desta parte, mas este projeto foi eu msm que fiz 100% dele, então vale a tentativa).

    • Cara, este projeto eu fiz pra minha facul (engenharia da computação)…na matéria q eu precisei aprender para o curso, se não me engano, dizia que tanto o 8051 quanto o 8951 são da mesma família, creio que se não funcionar 100% você vai precisar mudar pouca coisa…acho que compensa viu…
      Qualquer coisa me da um toque que eu tento te ajudar…
      vlw pelo comentário, até!
      😉

  2. Valeu pela dica, eu tenho que apresentar no dia 5/2/2011, sem querer ser chato, mas sem algém tiver já pronto utilizando o 8051 e tiver disposto a negociar esse projeto, eu agradeceria, pode ser em alugeul mpra data ou vender, não sei. só sei que preciso pra antes desta data, pra fechar o curso. O meu tel é: 11-23756345 e 11-86305919 e o e-mail é od.charles@gmail.com. Desde já agradeço e enquanto isso vou tentar fazer seguindo o site.

    • Vish cara, eu to enrolado, não vou conseguir te ajudar, e pro seu azar desta vez, todo mundo q eu conheço q poderia resolver o problema ta de férias também….acho que desta vez vou te deixar na mão viu!
      foi mal!
      😛

  3. ola amigos ,estou precisando de um projeto desse, so que p/ um semaforo só , que tem os 3 leds normais + os 5 leds laterais esquerdo vermelho e os 5 leds laterais direito verdes ambos c/ timer decrecente tipo 5 segundos p/ cada led .Alguem conhece esse tipo de semaforo ? Alguem pode me ajudar ?este é um trabalho da faculdade e tenho que apresentad-lo até 15 de abril tô no maior desepero, preciso do diagrama de blocos,do fluxograma,e o projeto em assembly c/ microcontrolador 8051. se puderem me ajudar meu EMAIL é cezartecnologo@hotmail.com fico muito grato e podemos trocar conhecimentos pois sou muito bom na area de sistemas de medição e controle(SMC),comandos eletricos e eletrica . desde já agradeço valeu…

  4. Olá poderia me ajudar?
    ; iniciando a rotina de interrupcao 1
    ; se sensor1 = 1 e sensor 2 = 0

    ; iniciando a rotina de interrupcao 2
    ; se sensor1 = 0 e sensor 2 = 1

    Como posso executar esta interrupção utilizando o uvision?

    • Oi Herberto,

      Não sei se entendi sua pergunta. Mas se você quer usar os recursos do uVision (IDE) eu acho que deve ser tranquilo. Talvez atribuindo os sensores e fazendo esta lógica E, é só fazer saltar para a subrotina caso atenda a condição.
      Eu nunca usei o uVision, mas creio que seja isto.
      Qualquer coisa da um toque!

      • Olá novamente… se puder ajudar é assim:
        a minha dúvida é como “Talvez atribuindo os sensores” ??
        por exemplo: sensor1 = 0 e sensor 2 = 1
        onde activo estes sensores nas portas do uvision?
        Cada paralell port tem 2 linhas (P1 e Pins) o que considero como sensor a linha PIN ou a linha P1, P2, P3

      • Oi Herberto,

        Neste caso sua dúvida é na IDE, e como eu não uso este uVision, não vou conseguir ajudar.
        Quando escrevi este código (faculdade) nem usei IDE, fiz em algum Notepad genérico….
        Foi mal!

  5. Boa tarde,
    Tenho 3 perguntas:

    1º – Como faço pra montar, ou demonstrar? Qual programa, qual software?
    2º – Como faço pra fazer esta montagem em uma protoboard por exemplo?
    3º – Como faço para o código em si, no computador, interaja com o MIC 8051?

    Se puder me ajudar eu agradeço muitooooo.
    Att,
    André

    • Oi Andre,

      Por partes:
      1 – Este programa você tem que carregar no 8051 (fiz o código inteiro no bloco de notas do windows). Normalmente tem um programa pra gravar, eu usei o que tinha da faculdade. Como já fazem mais de cinco anos, o nome do programa eu não lembro.
      2 – A montagem você faz seguindo o esquema elétrico. Eu montei na protoboard mesmo! Só que usei duas, para separar mais um componente do outro, porém nada te impede de usar só uma.
      3 – conforme te falei, tem um aparelhinho, onde você coloca o 8051, e liga no computador. Então, você passa o código deste probrama para o 8051.

      A parte mais complicada do projeto, na minha opinião, foi conseguir entender o esquema da diferença do led vermelho e o das outras cores. Eu tinha feito um semáforo com as três cores, mas depois descobri que iria ter que recalcular tudo porque o led vermelho (que eu tinha usado como base) é ativado de uma maneira diferente do amarelo e verde. Se não me engano a corrente que cada um precisa é diferente. Por isso mudei tudo para led vermelho.

      Da uma sacada, e se não conseguir evoluir, pelo menos o nome do programa eu posso tentar resgatar – mas sem promessa! hehehe

      att,
      jonas

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s