⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 w013.c

📁 使用Keil环境开发了基于C8051单片机的温度采集模块
💻 C
字号:
/*******************************************************************************
* 实验名称: 数字温度表(DS18B20)LCD1620显示                                     *
********************************************************************************
* 实验描述: LCD1620显示测量的温度                                              *
* 实验说明: DS18B20正常时,显示“DS18B20 OK”及温度值				           *
*           DS18B20没有安装时,显示“DS18B20  ERR0R PLEASE CHECK” 			   *
*			实验前要在J7上安装DS18B20						                   *
*			1:接DS18B20的GND端								                   *
*           2:接DS18B20的DQ端                                                 * 
*           3:接DS18B20的VDD端                                                *
*******************************************************************************/

#include <reg51.h>
#include <intrins.h>

#define uchar unsigned char
#define uint  unsigned int

sbit LCD_RS = P2^3;
sbit LCD_RW = P2^4;

sbit HC138_A = P2^5;
sbit HC138_B = P2^6;
sbit HC138_C = P2^7;

#define SELECT_LCD()	HC138_A=0; HC138_B=1; HC138_C=0
#define NOSELECT_LCD()	HC138_A=1; HC138_B=1; HC138_C=1

sbit DQ = P3^7 ;    //定义DS18B20端口DQ  
bit presence ;	    //DS18B20初始化成功标志位

uchar data  temp_data[2] = {0x00,0x00} ;   //温度数据缓存
uchar data  dis_data[5]={0,0,0,0,0};	   //温度值百十个小数位及一个数据缓存

uchar code  dis_code1[ ] = {"   DS18B20 OK   "} ;
uchar code  dis_code2[ ] = {"  TEMP:    .  C "} ;
uchar code  dis_code3[ ] = {" DS18B20  ERR0R "} ;
uchar code  dis_code4[ ] = {"  PLEASE CHECK  "} ;


/*温度小数部分查表*/
unsigned char code  ditab[16] = {0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,
                                 0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};


/*自定义字符*/
unsigned char code  mytab[8] = {0x0C,0x12,0x12,0x0C,0x00,0x00,0x00,0x00} ; //度的符号


void Delay(unsigned int num) //us级延时函数
{
  while( --num ) ;
}

bit LCD_Busy()	   //LCD忙碌状态检测
{							
	bit result;
	LCD_RS = 0;			    
	LCD_RW = 1;
	SELECT_LCD();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	result = (bit)(P0 & 0x80);	
	NOSELECT_LCD();
	return result;	
}

LCD_WriteCommand(uchar cmd)	 //写指令数据到LCD
{							   
	while(LCD_Busy());
	LCD_RS = 0;
	LCD_RW = 0;
	NOSELECT_LCD();
	_nop_();
	_nop_();	
	P0 = cmd;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SELECT_LCD();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	NOSELECT_LCD();		
}

LCD_WriteDate(uchar dat)   //写字符显示数据到LCD
{							
	while(LCD_Busy());
	LCD_RS = 1;
	LCD_RW = 0;
	NOSELECT_LCD();
	P0 = dat;
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	SELECT_LCD();
	_nop_();
	_nop_();
	_nop_();
	_nop_();
	NOSELECT_LCD();	
}

LCD_DisplayPosit(uchar pos)	 //设定字符在LCD上显示的位置
{							
	LCD_WriteCommand(pos | 0x80);
}

LCD_Init()	//LCD初始化
{							
	LCD_WriteCommand(0x38);	   
	Delay(5);
	LCD_WriteCommand(0x0c);	  
	Delay(5);
	LCD_WriteCommand(0x06);	  
	Delay(5);
	LCD_WriteCommand(0x01);	
	Delay(5);
}

void  LCD_WriteMytab()  //自定义字符写入CGRAM函数
{  
    unsigned char i ;
    LCD_WriteCommand(0x40) ;  //写CGRAM
    for (i = 0 ; i< 8 ; i++)       
    LCD_WriteDate(mytab[ i ]) ;        
}

void LCD_DisplayLine(uchar a[ ],uchar b[ ])	//LCD1620显示两行字符函数
{
    uchar  m ;
    LCD_Init() ;                //初始化LCD 
            
    LCD_DisplayPosit(0) ;       //设置显示位置为第一行的第1个字符
     m = 0 ;
    while(a[m] != '\0')
     {                          //显示第一行字符
       LCD_WriteDate(a[m]) ;
       m++ ;
     }

    LCD_DisplayPosit(0x40) ;    //设置显示位置为第二行第1个字符
     m = 0 ;
    while(b[m] != '\0')
     {
       LCD_WriteDate(b[m]) ;    //显示第二行字符
       m++ ;
     } 
}

DS18B20_Init(void)	 //DS18B20初始化函数
{  
     DQ = 1 ;        //DQ复位
     Delay(8) ;      //延时

     DQ = 0 ;        //单片机将DQ拉低
     Delay(90) ;     //延时 大于 480us

     DQ = 1 ;        //拉高总线
     Delay(8) ;

     presence = DQ ;    //如果 presence=0则初始化成功 presence=1则初始化失败
     Delay(100) ;
     DQ = 1 ; 
     
     return(presence) ; // 返回信号,0=presence,1= no presence
}						   

 ReadOneChar(void)	   //读一个字节数据函数
{					    
  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(4) ;
    }

    return (dat) ;
}


 WriteOneChar(unsigned char dat)  //写一个字节数据函数
{
  unsigned char i = 0 ;
  for (i = 8 ; i > 0 ; i--)
  {
    DQ = 0 ;
    DQ = dat&0x01 ;
    Delay(5) ;

    DQ = 1 ;
    dat>>=1 ;
  }
}

 ReadTemperature(void)	 //读取温度函数
{
     DS18B20_Init() ;
  
     WriteOneChar(0xCC) ;  //跳过读序号列号的操作
     WriteOneChar(0x44) ;  //启动温度转换

     DS18B20_Init() ;
     WriteOneChar(0xCC) ;  //跳过读序号列号的操作
     WriteOneChar(0xBE) ;  //读取温度寄存器

     temp_data[0] = ReadOneChar() ;   //读温度低8位
     temp_data[1] = ReadOneChar() ;   //读温度高8位 
}

 TemperatureDisplay()	//温度数据转换和显示函数
{
  dis_data[4]=temp_data[0]&0x0f ;	     //temp_data[0]低4为有效
  dis_data[3]=ditab[dis_data[4]]+0x30;   //查表得小数位的值
  
  dis_data[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);
  dis_data[2]=dis_data[4]%10+0x30;		   //个位
  dis_data[1]=(dis_data[4]/10)%10+0x30;	   //十位
  dis_data[0]=dis_data[4]/100+0x30;		   //百位

    if(dis_data[0]==0x30)     //百位为0,不显示
   { 
     dis_data[0]=0x20;
	               
     if(dis_data[1]==0x30)    //十位为0,不显示
       dis_data[1]=0x20 ;
   }

     LCD_DisplayPosit(0x48) ;             
     LCD_WriteDate(dis_data[0]) ;  //百位数显示 
     LCD_DisplayPosit(0x49) ;             
     LCD_WriteDate(dis_data[1]) ;  //十位数显示 
     LCD_DisplayPosit(0x4a) ;             
     LCD_WriteDate(dis_data[2]) ;  //个位数显示 
     LCD_DisplayPosit(0x4c) ;             
     LCD_WriteDate(dis_data[3]) ;  //小数位数显示
	 LCD_WriteMytab() ;            //自定义字符(度的符号)写入CGRAM
     Delay(5) ;
     LCD_DisplayPosit(0x4d) ;
     LCD_WriteDate(0x00) ;         //显示自定义字符(度的符号)

}

void  DS18B20_OkMenu ()	   //DS18B20 OK 菜单显示函数
{ 
     LCD_DisplayLine(dis_code1,dis_code2); 
}

void  DS18B20_ErrorMenu ()  //DS18B20 ERROR 菜单显示函数
{
     LCD_DisplayLine(dis_code3,dis_code4);
}

void main()	   //主函数
 {
      DS18B20_OkMenu () ;

    do
    {
      ReadTemperature() ;
      TemperatureDisplay() ;
    }
    while(!presence)  ;

     DS18B20_ErrorMenu () ;

    do
    {  
      DS18B20_Init() ;
    }
    while(presence) ;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -