51单片机:STC_1602温度采集和显示

LCD1602.c

#include

 

/********************延时函数,延时一毫秒************************/

void LCD1602_Delay(uint z)

{

         uint x,y;

         for(x=z;x>0;x--)

                  for(y=112;y>0;y--);

}

 

/**************************1602显示****************************/

 

void LCD1602_Write_Cmd(char cmd)  //写指令函数

{

         LCD1602_RS=0;//低电位送指令

         P0=cmd;

         LCD1602_Delay(1);

         LCD1602_EN=1;

         LCD1602_Delay(1);

         LCD1602_EN=0;

 

}

 

void LCD1602_Write_data(uchar dat) //写数据函数

{

         LCD1602_RS=1;//高电位送数据

         P0=dat ;

         LCD1602_Delay(1);

         LCD1602_EN=1;

         LCD1602_Delay(1);

         LCD1602_EN=0;

}

 

void LCD1602_Write_str(uchar *str)//写字符串函数

{

         while(*str!='\0')

         {

                  LCD1602_Write_data(*str++);

                  LCD1602_Delay(60);

         }

}

/*

函数名称:1602液晶显示屏显示函数

函数功能:指定位置显示字符串

函数参数:

x:显示行数(1或2)。1:表示第一行,2表示第二行

y:表示显示的起始位置(0-15)。

str:将要显示的字符串

*/

void LCD1602_Display(uchar x,uchar y, uchar *str)

{

         if(x==1) x=0x80;

         if(x==2) x=0x80+0x40;

         x=x+y;

         LCD1602_Write_Cmd(x);

         LCD1602_Write_str(str);

}

/***************************1602液晶初始化******************************/

void LCD1602_Init()

{

 

         LCD1602_RW=0;//先将RW拉低

         LCD1602_EN=0;//再把EN拉低

         LCD1602_Write_Cmd(0x38);//显示模式设置

         LCD1602_Write_Cmd(0x0c);//开启显示屏,关光标,光标不闪烁

         LCD1602_Write_Cmd(0x06);//显示地址递增,即写一个数据后,显示位置右移一位

         LCD1602_Write_Cmd(0x01);//清除屏幕

         LCD1602_Write_Cmd(0x80);//数据指针 把光标移到第一行第一个位置

}

 

 

LCD1602.h

#include

#define uchar unsigned char

#define uint unsigned int

 

/**************************I/O端口设置**************************         */

sbit LCD1602_RS=P1^0; //LCD液晶显示器数据/命令选择端口

sbit LCD1602_RW=P1^1; //LCD液晶显示器读/写选择端口

sbit LCD1602_EN=P1^2;    //LCD液晶显示器使能端口  

 

void LCD1602_Delay(uint z);

void LCD1602_Write_Cmd(char cmd);

void LCD1602_Write_data(uchar dat);

void LCD1602_Write_str(uchar *str);

void LCD1602_Init();

void LCD1602_Display(uchar x,uchar y, uchar *str);

DS18B20.c

#include

 

unsigned int temp;

 

void delay(unsigned int m)     //温度延时程序

{

    while(m--);

}

 

void Init_DS18B20()

{

         unsigned char x=0;

         DS18B20_DQ = 1;          //DQ复位 ds18b20通信端口

         delay(8); //稍做延时

         DS18B20_DQ = 0;          //单片机将DQ拉低

         delay(80); //精确延时 大于 480us

         DS18B20_DQ = 1;          //拉高总线 

         delay(4);

         x=DS18B20_DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败

         delay(20);

}

 

 

/***********ds18b20读一个字节**************/

uchar ReadOneChar()

{

         unsigned char i=0;

         unsigned char dat = 0;

         for (i=8;i>0;i--)

         {

             DS18B20_DQ = 0; // 高电平拉成低电平时读周期开始

             dat>>=1;

             DS18B20_DQ = 1; // 给脉冲信号

             if(DS18B20_DQ)

             dat|=0x80;   //

             delay(4);

         }

         return(dat);

}

 

/*************ds18b20写一个字节****************/

void WriteOneChar(unsigned char dat)

{

   unsigned char i=0;

   for (i=8; i>0; i--)

   {

              DS18B20_DQ = 0; //从高电平拉至低电平时,写周期的开始

             DS18B20_DQ = dat&0x01;   //数据的最低位先写入

             delay(5); //60us到120us延时

             DS18B20_DQ = 1;      

             dat>>=1; //从最低位到最高位传入

}

}

 

/**************读取ds18b20当前温度************/

void ReadTemperature()

{

    unsigned char tempL=0;

    unsigned  tempH=0;

    unsigned  t=0;

 

    Init_DS18B20();

    WriteOneChar(0xCC);    // 跳过读序列号的操作

    WriteOneChar(0x44); // 启动温度转换

    delay(5);       // this message is very important

    Init_DS18B20();

    WriteOneChar(0xCC); //跳过读序列号的操作

    WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度/

    delay(5);

    tempL=ReadOneChar();    //读取温度值低位  /

    tempH=ReadOneChar();      //读取温度值高位    /

 

         temp = (tempH*256+tempL)*0.625;

  }

 

DS18B20.h

#include

#define uchar unsigned char

//端口配置

sbit DS18B20_DQ=P3^2;        //温度数据口 

//函数申明

void delay(unsigned int m);     //温度延时程序

void Init_DS18B20();

uchar ReadOneChar();

void WriteOneChar(unsigned char dat);

void ReadTemperature();

 

主程序

#include

#include

 

 

sbit LED0 = P1^7;

uchar display[]={"0123456789"};     //定义数组,并赋初值

extern unsigned int temp; //外部调用温度变量

 

void _Delay_ms(uint z)

{

         uint x,y;

         for(x=z;x>0;x--)

    for(y=114;y>0;y--);

}

 

void main()

{

         LCD1602_Init();

        LCD1602_Display(1,5,"TX");

 

         while(1)

         {

                          _Delay_ms(600);

                          LED0=~LED0;

                          ReadTemperature();

                          LCD1602_Display(2,0,"Now Temp:");

                          LCD1602_Write_Cmd(0x80+0x40+10);

                          LCD1602_Write_data(display[temp/100]);

                          LCD1602_Write_data(display[temp%100/10]);

                          LCD1602_Display(2,12,".");

                          LCD1602_Write_data(display[temp%10]);

                          LCD1602_Display(2,15,"C");                    

         }

 

}

 

 

你可能感兴趣的:(51单片机:STC_1602温度采集和显示)