STC12C5A60S2+LCD1602+18B20

论坛 期权论坛 编程之家     
选择匿名的用户   2021-5-21 13:08   11   0

注意单片机晶振大小!18B20时序!

注意单片机晶振大小!18B20时序!

注意单片机晶振大小!18B20时序!

/**************************************************
FILE NAME:   main.c
CHIP TYPE:   STC12C5A60S2
CLOCK FREQUENCY:                12 MHZ
IDE:    WAVE SH51
COMPILER:   KEIL for 8051
TIME:    10/06/2020
AUTHOR:    RE
VERSION:   2.0 
HARDWARE CONNECT:     MAIN_BOARD     CPU_51
                        RS     ---   P3:P2.4
                        RW     ---   P3:P2.5
                        E      ---   P3:P2.6
                        D0-D7  ---   P2:P0.0-P0.7
                        CPU_51        SENSOR
                        P1.0   ---   J3:18B20_OUT
    
***************************************************/
#include<reg51.h>

#define uchar unsigned char
#define uint unsigned  int

char code dx516[3] _at_ 0x003b;

sbit DQ = P1^0;   //18B20数据输出
sbit RS = P2^4;
sbit RW = P2^5;
sbit EN = P2^6;

uchar data disdata[7];

uint tvalue;                        //温度值
uchar tflag;                        //温度正负标志
              
/********************************************************
            LCD1602相关程序
********************************************************/
void delay1ms(unsigned int ms)         //延时1毫秒
{ 
 unsigned int i,j;
 for(i=0;i<ms;i++)
 {
   for(j=0;j<100;j++);
 }
}

void Lcd_Write_Com(unsigned char com)   //LCD1602的写指令程序
{ 
 delay1ms(1);
 RS=0;
 RW=0;
 EN=0;
 P0=com;
 delay1ms(1);
 EN=1;
 delay1ms(1);
 EN=0;
}
void Lcd_Write_Dat(unsigned char dat)    //LCD1602的写数据程序
{ 
 delay1ms(1);;
 RS=1;
 RW=0;
 EN=0;
 P0=dat;
 delay1ms(1);
 EN=1;
 delay1ms(1);
 EN=0;
}
void Lcd_Init()                            //LCD1602初始化设置
{
 delay1ms(15);
 Lcd_Write_Com(0x38);delay1ms(5);
 Lcd_Write_Com(0x08);delay1ms(5);
 Lcd_Write_Com(0x01);delay1ms(5);
 Lcd_Write_Com(0x06);delay1ms(5);
 Lcd_Write_Com(0x0c);delay1ms(5);
}

void Lcd_1602_Display_String(uchar ad, uchar *s)//LCD1602的显示程序
{
 Lcd_Write_Com(ad);
 while(*s>0)
 { 
  Lcd_Write_Dat(*s++);
 }
}

/****************************************************
      DS18B20相关程序
****************************************************/
void delay_18B20(unsigned int i)//延时1微秒
{
 while(i--);
}

void DS18B20_Reset()   //DS18B20的复位程序
{ 
 unsigned char x=0;
  DQ = 1;                        //DQ复位
  delay_18B20(80);                //延时     
  DQ = 0;                        //DQ拉低
  delay_18B20(600);              //精确延时大于480us
  DQ = 1;                        //拉高
  delay_18B20(140); 
} 

uchar DS18B20_Read()    //DS18B20的读数据程序
{ 
 unsigned char i=0;
 unsigned char dat = 0;
 for (i=8;i>0;i--)
 {   
  DQ = 0;                        //给脉冲信号
  dat>>=1;
  DQ = 1;                    //给脉冲信号
  if(DQ)
  {
    dat|=0x80;
  }
  delay_18B20(40);
 }
 return(dat);
}

void DS18B20_Write(uchar wdata)   //DS18B20的写数据程序
{
 unsigned char i=0;
 for (i=8; i>0; i--)
 { 
  DQ = 0;
  DQ = wdata&0x01;
  delay_18B20(50);
  DQ = 1;
  wdata>>=1;
 }
}

/***************************************************
       读取温度值并转换
***************************************************/
DS18B20_Read_Temp()
{
 uchar a,b;
 DS18B20_Reset();    
 DS18B20_Write(0xcc);   //跳过读序列号
 DS18B20_Write(0x44);   //启动温度转换
 DS18B20_Reset();    
 DS18B20_Write(0xcc);   //跳过读序列号 
 DS18B20_Write(0xbe);   //读取温度
 a=DS18B20_Read();
 b=DS18B20_Read();
 tvalue=b;
 tvalue<<=8;
 tvalue=tvalue|a;
 if(tvalue<0x0fff)
 {
  tflag=0;
 }
 else
 {
  tvalue=~tvalue+1;
  tflag=1;
 }
 tvalue=tvalue*(0.625); //温度值扩大10倍,精确到1位小
 return(tvalue);
}

/************************************************************
      温度值显示
*************************************************************/

void DS18B20_Display()
{    
 uchar flagdat;
 disdata[0]=tvalue/1000+0x30;     //百位数
 disdata[1]=tvalue%1000/100+0x30; //十位数
 disdata[2]=tvalue%100/10+0x30;   //个位数
 disdata[3] = '.';      
 disdata[4]=tvalue%10+0x30;   //小数位
 disdata[5]=0xDF;
 disdata[6]='C';

 Lcd_1602_Display_String(0x80, "Current Temp :");

 if(tflag==0)
 {
    flagdat=0x20;//正温度不显示符号
  }              
 else
 {
    flagdat=0x2d;//负温度显示负号:-
  }              
 if(disdata[0]==0x30)
 {
  disdata[0]=0x20;             //如果百位为0,不显示
  if(disdata[1]==0x30)
  { 
   disdata[1]=0x20;         //如果百位为0,十位为0也不显示
  }
 }
 Lcd_Write_Com(0xc0);
 Lcd_Write_Dat(flagdat);          //显示符号
 Lcd_1602_Display_String(0xc1,disdata);
}

 
/******************************************************
                    主函数
******************************************************/

void main()
{ 
 Lcd_Init();        //清屏
 while(1)
 {
  DS18B20_Read_Temp();  //读取温度
  DS18B20_Display();    //显示
 }
}

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP