escrver temperatura no LCD

Software e Hardware para linha x51

Moderadores: 51, guest2003, Renie, gpenga

escrver temperatura no LCD

Mensagempor castroale » 16 Set 2013 21:11

Pessoal blz, estou fazendo um projeto de um controlador de temperatura de 0 a 250 celsius. Estou utilizando um termopar tipo j, AD595, ADC0804, 8051 e um lcd L016L para exibir as temperaturas. A parte do hardware esta legal, estou com problema em exibir a temperatura do sensor no lcd. Na configuração que montei, tenho 10 mV/ºC porém o lcd está exibindo somente um caracter de cada vez....Exemplo: vejam que no programa salvei em DB 0000001002003004005...pois desejo que o lcd exiba os dados na sequencia 000, 001, 002, 003 ,etc...porém o passo está errado. ele anda caracter por caracter. Como posso resolver este problema??segue o trecho do programa que escreve a temperatura....o mesmo acontece para a temperatura ajustada.

asm code
ESCREVE_TEMPNOW:PUSH ACC
MOV A, #0C6h
LCALL ENVIA_COMANDO_LCD
MOV A, LASTTEMP
MOV DPTR, #VALORES
MOV R3 ,#0h
MOV R0, A
ESCREVENDOTEMPNOW:

MOV A, R0
MOVC A, @A + DPTR
LCALL ENVIA_DADO_LCD
INC R0
INC R3
CJNE R3, #03d, ESCREVENDOTEMPNOW
POP ACC
RET

VALORES: DB '0000010020030040050060070080090100110120130140150 16017018019020021022023024025026027028029030031032 '

algumas duvidas:
- O lcd trabalha em ASCII????

- como posso transformar meu valor de temperatura binário em ASCII para enviar para o LCD??
castroale
 
Mensagens: 2
Registrado em: 16 Set 2013 20:50

Re: escrver temperatura no LCD

Mensagempor xultz » 17 Set 2013 08:39

Sim, o LCD trabalha em ASCII.
Para converte um número binário para ASCII, some 48 a ele ('0' em ASCII é 48 em decimal, '1' é 49 e assim por diante).

Agora, programar em assembly no 8051 em pleno século 21 é masoquismo, né não?
98% das vezes estou certo, e não estou nem aí pros outros 3%.
Avatar do usuário
xultz
Dword
 
Mensagens: 3001
Registrado em: 13 Out 2006 18:41
Localização: Curitiba

Re: escrver temperatura no LCD

Mensagempor renan-papaco » 17 Set 2013 09:20

castroale escreveu:Pessoal blz, estou fazendo um projeto de um controlador de temperatura de 0 a 250 celsius. Estou utilizando um termopar tipo j, AD595, ADC0804, 8051 e um lcd L016L para exibir as temperaturas. A parte do hardware esta legal, estou com problema em exibir a temperatura do sensor no lcd. Na configuração que montei, tenho 10 mV/ºC porém o lcd está exibindo somente um caracter de cada vez....Exemplo: vejam que no programa salvei em DB 0000001002003004005...pois desejo que o lcd exiba os dados na sequencia 000, 001, 002, 003 ,etc...porém o passo está errado. ele anda caracter por caracter. Como posso resolver este problema??segue o trecho do programa que escreve a temperatura....o mesmo acontece para a temperatura ajustada.

ESCREVE_TEMPNOW:PUSH ACC
MOV A, #0C6h
LCALL ENVIA_COMANDO_LCD
MOV A, LASTTEMP
MOV DPTR, #VALORES
MOV R3 ,#0h
MOV R0, A
ESCREVENDOTEMPNOW:

MOV A, R0
MOVC A, @A + DPTR
LCALL ENVIA_DADO_LCD
INC R0
INC R3
CJNE R3, #03d, ESCREVENDOTEMPNOW
POP ACC
RET

VALORES: DB '0000010020030040050060070080090100110120130140150 16017018019020021022023024025026027028029030031032 '

algumas duvidas:
- O lcd trabalha em ASCII????

- como posso transformar meu valor de temperatura binário em ASCII para enviar para o LCD??



seria mais fácil você programar em C .. eu por mim mesmo faria assim:

o ADC que vc tá usando é paralelo, não é? se for isso você anota os bits gerados na saida desse ADC e através deles você programa a faixa de temperatura que irá exibir no LCD...
Sabe quem mais programa um 8051 com ROM externa? MINHA MÃE! HOOOOOOOOOOOOOOOOOO
Avatar do usuário
renan-papaco
Byte
 
Mensagens: 292
Registrado em: 17 Jun 2012 15:56

Re: escrver temperatura no LCD

Mensagempor tcpipchip » 17 Set 2013 11:03

Cara
Legal que voce está programando em Assembly!!!!!

Anexo um bootloader para o 8051 que fiz no final dos anos 80.

Espero que ajude. Eu escrevo no LCD e tambem implementei rotina para imprimer byte na usart e no lcd.


asm code
;***************************************************************************
;MONITOR PARA O SISTEMA MINIMO BASEADO NO MICROCONTROLADOR 8031
;DA FAMILIA MCS-51
; MIGUEL ALEXANDRE WISINTAINER
; 11/02/1989
;OBJETIVO: DAR A CARGA DE UM PROGRAMA .COM GERADO PELO ASSEMBLADOR 8031
; PELA INTERFACE SERIAL (9600 BPS) NO ENDERECO 4000H DA RAM E
; EXECUTA-LO.
;**************************************************************************

.org 0
LJMP INICIO
.org h'3
LJMP ext_0
.org h'b
LJMP timer_0
.org h'13
LJMP ext_1
.org h'1b
LJMP timer_1
.org h'23
LJMP serial
.org h'2b
LJMP timer_2

INFO_1:.DB "SISTEMA",0
INFO_2:.DB "8031",0
INFO_3:.DB "MCS51"

;********************************************************************

COMMAND_OUT:
PUSH DPH
PUSH DPL
MOV DPTR,#LCD_STATUS
PUSH ACC
BUSY:
MOVX A,@DPTR
JB ACC.7,BUSY
POP ACC
MOV DPTR,#INSTRUCTION_INPUT
MOVX @DPTR,A
POP DPL
POP DPH
RET

;********************************************************************

DATA_OUT:
PUSH DPH
PUSH DPL
MOV DPTR,#LCD_STATUS
PUSH ACC
BUSY1:
MOVX A,@DPTR
JB ACC.7,BUSY1
POP ACC
MOV DPTR,#DATA_INPUT
MOVX @DPTR,A
POP DPL
POP DPH
RET

;********************************************************************


CLEAR_DISPLAY:

PUSH ACC
MOV A,#1
ACALL COMMAND_OUT
POP ACC
RET

;********************************************************************


HOME_CURSOR:

PUSH ACC
MOV A,#2
ACALL COMMAND_OUT
POP ACC
RET

;********************************************************************


CURSOR_OFF:

PUSH ACC
MOV A,#H'0C
ACALL COMMAND_OUT
POP ACC
RET

;********************************************************************


SET_C_M:

PUSH ACC
ADD A,#H'80
ACALL COMMAND_OUT
POP ACC
RET

;********************************************************************


SET_C_R:

PUSH ACC
ADD A,#H'C0
ACALL COMMAND_OUT
POP ACC
RET

;********************************************************************

I_MEN_LCD:
PUSH ACC
PUSH DPH
PUSH DPL
COMPARA_SE_NULL_L:
MOVX A,@DPTR
CJNE A,#0,IMP_L
LJMP SAI_MEN_L
IMP_L:
ACALL DATA_OUT
INC DPTR
LJMP COMPARA_SE_NULL_L
SAI_MEN_L:
POP DPL
POP DPH
POP ACC
RET

;********************************************************************

LE_BYTE:
MOV SBUF,#255
ESP_BYTE:
JNB RI,ESP_BYTE
CLR RI
MOV A,SBUF
CLR TI
RET

;********************************************************************

LE_WORD:

MOV SBUF,#254
ESP_LOW_BYTE:
JNB RI,ESP_LOW_BYTE
CLR RI
MOV DPL,SBUF
ESP_HIG_BYTE:
JNB RI,ESP_HIG_BYTE
CLR RI
MOV DPH,SBUF
CLR TI
RET

;********************************************************************

LE_STRING:
PUSH ACC
PUSH DPH
PUSH DPL
MOV SBUF,#253
ESP_LETRA:
JNB RI,ESP_LETRA
CLR RI
MOV A,SBUF
CJNE A,#0,NOR_LETRA
LJMP SAI_LETRA
NOR_LETRA:
MOVX @DPTR,A
INC DPTR
LJMP ESP_LETRA
SAI_LETRA:
MOVX @DPTR,A
POP DPL
POP DPH
POP ACC
CLR TI
RET

;********************************************************************

I_MEN_SERIAL:
PUSH ACC
PUSH DPH
PUSH DPL
COM_SE_NULL_S:
MOVX A,@DPTR
CJNE A,#0,IMP_S
LJMP S_MEN_S
IMP_S:
MOV SBUF,A
ESP_S:
JNB TI,ESP_S
CLR TI

; ESPERA CONFIRMACAO DA IMPRESSAO DO CARACTER

IMS:
JNB RI,IMS
CLR RI
MOV A,SBUF ; SEM VALOR ALGUM PARA A, APENAS CONFIRMACAO

INC DPTR
LJMP COM_SE_NULL_S
S_MEN_S:
POP DPL
POP DPH
POP ACC
RET

;********************************************************************


IMP_BYTE_lcd:

PUSH ACC
PUSH B
PUSH H'00
MOV H'00,#0
NAO_FIM:
MOV B,#D'10
DIV AB
INC H'00
PUSH B
CJNE A,#0,NAO_FIM
IMP_DIGITO:
POP B
MOV A,B
ADD A,#H'30
ACALL DATA_OUT
DJNZ H'00,IMP_DIGITO
POP H'00
POP B
POP ACC
RET

;********************************************************************


IMP_B_serial:
PUSH ACC
PUSH B
PUSH H'00
MOV H'00,#0
NAO_F_S:
MOV B,#D'10
DIV AB
INC H'00
PUSH B
CJNE A,#0,NAO_F_s
IMP_DI_s:
POP B
MOV A,B
ADD A,#H'30
MOV SBUF,A
ESPE_S:
JNB TI,ESPE_S
CLR TI

; ESPERA CONFIRMACAO DA IMPRESSAO DO CARACTER

IBS:
JNB RI,IBS
CLR RI
MOV A,SBUF ; SEM VALOR ALGUM PARA A, APENAS PARA CONFIRMACAO

DJNZ H'00,IMP_DI_s
POP H'00
POP B
POP ACC
RET

;********************************************************************


CLEAR_TERMINAL:

PUSH ACC
MOV SBUF,#252
ESP_TI:
JNB TI,ESP_TI
CLR TI

;ESPERA A TELA APAGAR COMPLETAMENTE

ESP_APAGAR:
JNB RI,ESP_APAGAR
CLR RI
MOV A,SBUF ; AX SEM EFEITO

POP ACC
RET

;*********************************************************************

IMP_CHAR_S:

PUSH ACC
MOV SBUF,A
ESP_TI_C:
JNB TI,ESP_TI_C
CLR TI

; ESPERA CONFIRMACAO DA IMPRESSAO DO CARACTER

ICS:
JNB RI,ICS
CLR RI
MOV A,SBUF ; SEM VALOR ALGUM PARA A, SO PARA CONFIRMACAO

POP ACC
RET

;*********************************************************************

CURS_ON:

PUSH ACC
MOV A,#H'0F
ACALL COMMAND_OUT
POP ACC
RET

;*********************************************************************

VERIFICA_SE_TECLA_PRESSIONADA:

MOV SBUF,#251
ESP_VST:
JNB RI,ESP_VST
CLR RI
MOV A,SBUF
CJNE A,#0,FOI_PRESSIONADA
CLR C
SJMP NAO_FOI_PRESSIONADA
FOI_PRESSIONADA:
SETB C
NAO_FOI_PRESSIONADA:
CLR TI
RET

;*********************************************************************

LE_CODIGO_PRESSIONADA:

MOV SBUF,#250
ESP_COD1:
JNB RI,ESP_COD1
CLR RI
MOV A,SBUF
CJNE A,#0,NA_T_EXTENDIDA
SETB C
SJMP T_EXTENDIDA
NA_T_EXTENDIDA:
CLR C
T_EXTENDIDA:
ESP_COD2:
JNB RI,ESP_COD2
CLR RI
MOV A,SBUF
CLR TI
RET

;*********************************************************************

INICIO:

; PALAVRA DE CONTROLE AO DISPLAY


MOV A,#H'6
ACALL COMMAND_OUT
MOV A,#H'0C
ACALL COMMAND_OUT
MOV A,#H'38
ACALL COMMAND_OUT


ACALL CLEAR_DISPLAY
ACALL HOME_CURSOR
ACALL CURSOR_OFF


; IDENTIFICACAO DO SISTEMA

MOV DPTR,#INFO_1
LCALL I_MEN_LCD
MOV A,#0
LCALL SET_C_R
MOV DPTR,#INFO_2
LCALL I_MEN_LCD


; PROGRAMA TAXA DE TRANSMISSAO 19200 BPS, 10 BITS


MOV h'98,#B'01010000 ; scon
MOV TMOD,#H'20 ; tmod
MOV TH1,#H'FD ; th1 (e6)
MOV h'87,#b'10000000 ; Duplica velocidade
SETB TR1

; ENDERECO INICIAL DA RAM

MOV DPTR,#PROGRAMA_EM_RAM

; CLEAR BUFFER SERIAL

MOV A,SBUF

;*********************************************************************

PED_H:
MOV SBUF,#'M'
ESP_H:
JNB RI,ESP_H
CLR RI
MOV R1,SBUF
MAN_H_R:
MOV SBUF,R1
ESP_FF_H:
JNB RI,ESP_FF_H
CLR RI
MOV A,SBUF

;*********************************************************************

PED_L:
MOV SBUF,#'M'
ESP_L:
JNB RI,ESP_L
CLR RI
MOV R0,SBUF
MAN_L_R:
MOV SBUF,R0
ESP_FF_L:
JNB RI,ESP_FF_L
CLR RI
MOV A,SBUF

; ******************************************************************


PED_C:
MOV SBUF,#'M'

ESP_C:
JNB RI,ESP_C
CLR RI
MOV A,SBUF
MOVX @DPTR,A
MAN_C_R:
MOVX A,@DPTR
MOV SBUF,A

INC DPTR

ESPERA_FF_C:
JNB RI,ESPERA_FF_C
CLR RI
MOV A,SBUF

;******************************************************************

MOV A,R0
DEC R0
JNZ MSB
DEC R1

MSB:

MOV A,R0
ORL A,R1
JNZ PED_C

CLR TI

; AQUI CARREGA ROTINA DE CHECKSUM E EXECUTA O PROGRAMA

CLR RI
MOV DPTR,#H'3FC0
MOV R0,#0
ECHECK:
JNB RI,ECHECK
MOV A,SBUF
CLR RI
MOVX @DPTR,A


MOVX A,@DPTR
MOV SBUF,A ;Apenas confirma o recebimento}

INC DPTR
INC R0

CJNE R0,#D'52,ECHECK

; EXECUTANDO CHECKSUM (PROGRAMA NA RAM)

LJMP H'3FC0

.org h'2000
PROGRAMA_EM_RAM:
.org h'2003
ext_0:
.org h'200b
timer_0:
.org h'2013
ext_1:
.org h'201b
timer_1:
.ORG h'2023
serial:
.ORG h'202b
timer_2:

;********************************************************************

.org h'4000
INSTRUCTION_INPUT:
.org h'4001
DATA_INPUT:
.org h'4002
LCD_STATUS:


.END INICIO

;3FC0
------------------------------------------
http://www.youtube.com/tcpipchip
Avatar do usuário
tcpipchip
Dword
 
Mensagens: 6560
Registrado em: 11 Out 2006 22:32
Localização: TCPIPCHIPizinho!

Re: escrever temperatura no LCD

Mensagempor castroale » 01 Nov 2013 07:25

Pessoal blz...muito obrigado pela ajuda!! ......em relação ao programa o pessoal do grupo conseguiu resolver......porém só conseguiram fazer de 0 a 99 ºC mas já atende nossa necessidade. Agora estou com problemas em relação ao AD595 mas, deve ser ruído ou aterramento da placa...estou resolvendo....

Em relação ao assembly....acho q em C seria mais fácil mas não sei programar...preciso pesquisar e aprender sobre isso o tempo esta curto e preciso entregar esse projeto.....

Obrigado..
castroale
 
Mensagens: 2
Registrado em: 16 Set 2013 20:50


Voltar para 8051

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante

x