정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

안녕하세요 8051로 char LCD로 온도를표시해주는것에대해 질문이있습니다
박현성 | 2015-10-04

안녕하세요  8051로 이용한 char LCD로  온도센서로  온도를 표시하고싶어서 질문을 남겨드립니다

 
먼저 제가 charLCD로 간단한 문자출력 소스를 만들어봤는데요 
 




ypedef unsigned char BYTE;
typedef unsigned int WORD;

#include <ioAT89s52.h>

BYTE msg1[]= "#goodtime #";
BYTE msg2[]= "nice day";

#define RS P2_bit.P2_5
#define RW P2_bit.P2_6
#define E  P2_bit.P2_7

#define FLAG P0_bit.P0_7
#define DATA P0

void BUSY(void);

void LCD_Command(BYTE cmd);

void LCD_DATA(BYTE ch);

void LCD_String(BYTE *str);

void LCD_Clear(void);

void LCD_position(BYTE col,BYTE row);

void LCD_Init(void);

void Delay(int i);
void main(void)
{
  LCD_Init();
  
  LCD_position(0,0);
  LCD_String(msg1);
  
  LCD_position(1,0);
  LCD_String(msg2);
  
  while(1)
  {
    P1=0x00; Delay(0x3FFF);
    P1=0xFF; Delay(0x3FFF);
   }
 }
 void BUSY(void)
 {
   BYTE temp=0;
   FLAG=1;
   
   do{
   RS=0;
   RW=1;
   E=1;
   Delay(1);
   temp = DATA;
   E=0;
 }while(temp & 0x80);
 }
 void LCD_Command(BYTE cmd)
 {
  BUSY();
  
  RS=0;
  RW=0;
  E=1;
  Delay(1);
  DATA=cmd;
  Delay(10);
  E=0;
  }
  void LCD_DATA(BYTE ch)
  {
   BUSY();
   
   RS=1;
   RW=0;
   E=1;
   Delay(1);
   DATA=ch;
   E=0;
   }
   void LCD_String(BYTE *str)
   {
    while(*str !=0)
    {
     LCD_DATA(*str);
     str++;
     }
   }
   void LCD_Clear(void)
   {
    LCD_Command(0x01);
    Delay(1000);
    }
    
    void LCD_position(BYTE col,BYTE row)
    {
     LCD_Command(0x80 | row + col * 0x40);
     }
     void LCD_Init(void)
     {
      DATA=0x3F;
      Delay(10000);
      RS=0;
      RW=0;
      E=1;
      E=0;
      Delay(1000);
      
      LCD_Command(0x38); Delay(1000);
      LCD_Command(0x38); Delay(1000);
      LCD_Command(0x08); Delay(1000);
      LCD_Command(0x06); Delay(1000);
      LCD_Command(0x0F); Delay(1000);
      LCD_Clear();
      }
      
                 
           void Delay(int i)
{
  while(i--);
}



 

 

이렇게 문자출력을 만들어봤습니다  온도센서(LM35)로  온도측정후 온도가표시되게 하고싶은데

소스를 어떡게 짜야할지모르겠네요...

 

먼저 LM35를 사용하는 소스는




typedef unsigned char BYTE;

typedef unsigned int WORD;




#include <io51.h>




// 포트 define 

#define CS P1.0

#define Din P1.1

#define Dout P1.2

#define CLK P1.3

#define FND P2

#define LM35_Input P1.4

#define LM35_Output P1.5

#define CdS_Input P1.6

#define CdS_Output P1.7




#define A7 P0.4  // 음성분할녹음  주소 A7의 포트정의 

#define A6 P0.3  // 음성분할녹음  주소 A6의 포트정의 (사용X)

#define A5 P0.2  // 음성분할녹음  주소 A5의 포트정의 

#define PLAYE P0.5 //  음성재생의 포트정의 (Active Low 동작)

#define RECORD P0.0 // 음성녹음 의 포트정의 (Active Low 동작) (사용X)

#define FAN_ON P0.1 // FAN ON (사용X)

#define LAMP_ON P0.6 // LAMP ON (사용X)







//각 상수 define

#define MaxVolt 5

#define MaxNumber 0xFFF

#define Multiplier 100

#define Gain 4




//사용자 정의 함수

WORD SPI_of_MCP3202 (BYTE ch);

void Delay(WORD count);

void FND_Conversion(BYTE temp);

BYTE Temp_Conversion(WORD temp);

void CdS_State (BYTE Flag);

void PLAY_Function(BYTE addr6, BYTE addr5);




//main 함수

void main(void)

{

  WORD result;

  BYTE converted_result;




  P1 = P2 = P0 = 0x00; Delay(0xFFFF);

  PLAYE = 1; RECORD = 1;




  while(1)

  {

    result = SPI_of_MCP3202(1);

    converted_result = Temp_Conversion(result);

    FND_Conversion(converted_result); Delay(0xFFFF);

    if(P2 >= 0x30)

    {

      LM35_Output = 1;

    }

    else if(P2 < 0x30)

    {

      LM35_Output = 0;

    }

    CdS_State(CdS_Input);

   

    if(LM35_Output == 1)

    {

        

PLAY_Function(0, 0); // FAN이 ON 되면(0,0)주소에 녹음된 음성 재생 

        PLAYE=0;

    }

    else if(CdS_Output == 1)

    {

      PLAY_Function(0, 1); // LAMP가 ON 되면 (0,1)주소에 녹음된 음성 재생

      PLAYE=0;

    }

    else

    {

RECORD = 1; PLAYE = 1; // 그 이외에는 녹음,재생 안되게 1로 셋팅

    }

  

  }

}




WORD SPI_of_MCP3202(BYTE ch)

{

  WORD OUT12 = 0x0000;

  BYTE  i;




  CS = 1; CLK = 1; CS = 0;

  Din = 1; CLK = 0; CLK = 1;

  Din = 1; CLK = 0; CLK = 1;

  Din = ch; CLK = 0; CLK = 1;

  Din = 1; CLK = 0; CLK = 1;

          CLK = 0; CLK = 1;




  for( i = 0; i<12; i++)

  {

    OUT12 = OUT12 <<1;

    CLK = 0;

    if(Dout == 1)

    {

      OUT12 = OUT12 | 0x0001;

    }

    CLK = 1;

  }

  CS = 1; Din = 0;




  return OUT12;

}




void Delay(WORD count)

{

  while(count --);

}




void FND_Conversion (BYTE temp)

{

  BYTE temp10 , temp01;

  temp10 = temp/10;

  temp01 = temp;




  FND = (temp10 <<4) | temp01;

}




BYTE Temp_Conversion (WORD temp)

{

  float temp_data;

  temp_data = temp / (float) MaxNumber;

  temp_data = temp_data * (float) MaxVolt;

  temp_data = temp_data / (float) Gain;

  temp_data = temp_data * (float) Multiplier;




  return (BYTE)temp_data;

}







void CdS_State (BYTE Flag)

{

  BYTE CdS_flag;

  

  CdS_flag = Flag;

  if(CdS_flag == 1)

  {

    CdS_Output = 1;

  }

  else

  {

    CdS_Output = 0;

  }

}







void PLAY_Function(BYTE addr6, BYTE addr5)  // 음성분할재생 불러오는 함수

{

    A7=0;   // A7=0이면 음성을 분할 한다는 뜻

    A6=addr6;  

    A5=addr5; Delay(3000); // 주소할당 후 약간의 딜레이를 주는 것이 더 이상적이기 때문에 약간의 딜레이를 줌    

}



 

이소스를 사용합니다 조도센서와 다른것들도 포함된 소스이구요(이건 제가짠소스가 아닙니다)

여기서  포트만 다르게 LM35의 온도를재서 위에 char LCD로 표시가되게 하고싶습니다. 온도센서는 ADC를포함해서 납떔까지 완성한부분입니다.이제 포트연결해서 코드를짜야하는데 어찌해야할지모르겠네요..ㅜ 알려주시면감사하겠습니다!

이전글   |    GPS관련입니다 많은 도움 부탁드립니다 ㅠ 2015-10-02
다음글   |    에러메시지 2015-10-06