zoukankan      html  css  js  c++  java
  • 基于51单片机LCD1602显示DS18B20测温的项目工程

    #include<reg52.h>//包含51单片机内部寄存器头文件
    #define uchar unsigned char // 自定义uchar为unsigned char(即无符号字符型数据,数据范围:0到255。)
    #define uint unsigned int//自定义uint为unsigned int(即无符号字符整数型数据,数据范围:0到6355。)         
    sbit RS=P2^0;//位定义LCD1602字符型液晶显示器的数据/命令选择引脚                 
    sbit RW=P2^1;//位定义LCD1602字符型液晶显示器的读写引脚                        
    sbit EN=P2^2; //位定义LCD1602字符型液晶显示器的使能引脚
    sbit DQ=P1^4;//位定义DS18B20数据端口
    uint temperature,t;//读温度值变量
    uint temperatureflag;//负温度标志位变量                                 //DS18B20数据信号端口
    uint wendu,wendubai,wendushi,wenduge,xiaoshudian,xiaoshu,fuhaowei;//温度值变量、温度百位变量、温度十位变量、温度个位变量、小数点变量、符号位变量、
    uchar code table[]="Welcome To";                  
    uchar code table1[]="Our System !";              
    uchar code table2[]="temperature is:";   
      void Delay(uint z)//延时程序
    {
       uint x,y;
       for(x=z;x>0;x--)
        for(y=110;y>0;y--);
     }
      void WriteCommand(uchar command)//LCD1602字符型液晶显示器写指令函数
    {
       RS=0;//LCD1602字符型液晶显示器指令寄存器低电平
       RW=0;//LCD1602字符型液晶显示器写指令操作低电平
       P0=command;//LCD1602字符型液晶显示器写指令函数写指令到单片机P2组端口,再输送到LCD1602字符型液晶显示器指令寄存器中执行。
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=1;//LCD1602字符型液晶显示器使能端高电平  
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=0;//LCD1602字符型液晶显示器使能端低电平
     }
      void WriteData(uchar information)//LCD1602字符型液晶显示器写数据函数
    {  
       RS=1;//LCD1602字符型液晶显示器数据寄存器高电平
       RW=0;//LCD1602字符型液晶显示器写数据操作低电平
       P0=information;//LCD1602字符型液晶显示器写数据函数写数据到单片机P2组端口,再输送到LCD1602字符型液晶显示器上显示。
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=1;//LCD1602字符型液晶显示器使能端高电平 
       Delay(5);//实际单片机演示,可以去掉延时。Proteus 仿真,需要保留延时。
       EN=0;//LCD1602字符型液晶显示器使能端低电平
     }
      void LCD1602Init()//LCD1602初始化函数
    {
       WriteCommand(0x38);//设置LCD1602字符型液晶显示器16x2显示,5*7或5*8点阵,8位数据并口,简称显模。
       WriteCommand(0x08);//设置LCD1602字符型液晶显示器显示开,简称亮屏。
       WriteCommand(0x01);//设置清除LCD1602字符型液晶显示器屏上所有内容,并让光标复位到LCD1602字符型液晶显示器屏左上角,简称清屏。
       WriteCommand(0x06);//设置开光标(或字符)地址指针自增1,光标右移动一个字符位,整屏显示不移动。
       WriteCommand(0x0c);//设置开LCD1602字符型液晶显示器显示,关光标,关光标(字符)闪烁。
     }
      void LCD1602Display()//LCD1602字符型液晶显示器显示函数
    {
       uchar j;//j表示数组元素个数变量
       WriteCommand(0x80+0x00);//LCD1602字符型液晶显示器第一行第一个位置显示
       for(j=0;j<10;j++)//有10个字符,要循环10次。
      {
        WriteData(table[j]);//显示字符串
        Delay(5);
       }
       WriteCommand(0x80+0x40);//LCD1602字符型液晶显示器第二行第一个位置显示
       for(j=0;j<11;j++)//有8个字符,要循环8次。
      { 
        WriteData(table1[j]);//显示字符串
        Delay(5);
       }
     }
      void DS18B20_Delay(uint i)//微妙级延时函数
    {
       while(i--);
     }
    //  void FengNingQi_Alarm()//蜂鸣器报警函数
    //{
    //   uint x;
    //   uint y;
    //   uint t;
    //   for(x=0;x<t;x++)
    //  {
    //    for(y=0;y<50;y++);
    //    FengNingQi=~FengNingQi;//蜂鸣器按位取反FengNingQi
    //   }
    // }
      bit DS18B20Init()//DS18B20初始化函数
    {
       uchar x=0;
       DQ = 1;//单片机将DS18B20通信端口DQ拉高复位  
       DS18B20_Delay(8);//稍做延时
       DQ = 0;//单片机将DS18B20通信端口DQ拉低 
       DS18B20_Delay(80);//延时在480us与960us之间
       DQ = 1;//单片机将DS18B20通信端口DQ拉高
       DS18B20_Delay(4);//延时在15us与60us之间
       x=DQ;//稍做延时后,如果x=0,则初始化成功,若x=1则初始化失败。
       DS18B20_Delay(20);//延时在60us与240us之间
       return x;
     }
      void DS18B20_WriteOneByte(uchar j)//DS18b20写一个字节函数
    {
       uchar i=0;
       for (i=8; i>0; i--)//单片机向DS18B20写入数据
      {
        DQ = 0;//单片机将DS18B20通信端口DQ从高电平拉至低电平时,单片机向DS18B20写数据开始。
        DQ = j&0x01;//单片机按将字节低位写入DS18B20
        DS18B20_Delay(5);//延时在60us与120us之间
        DQ = 1;//单片机将DS18B20通信端口DQ拉高 
        j>>=1;//变量j右移一位,最高位补零。例如当j=1,换成二进制是0000 0001,右移一位就是0000 000。扩展:单片机无符号或有符号数左移几位,高位就依次补几位0,低位也依次去掉几位,让左移几位依次代替低位去掉的几位。单片机有符号数,如果是正数,右移几位,先是确定最高位用0,低位也依次去掉几位,让右移几位依次代替低位去掉的几位,如果是负数,右移几位,先是确定最高位用1,低位也依次去掉几位,让右移几位依次代替低位去掉的几位。       
       }
     }
      uchar DS18B20_ReadOneByte()//DS18B20读一个字节函数
    {
       uchar i=0;
       uchar j = 0;
       for (i=8;i>0;i--)//单片机读取DS18B20采集的温度数据转换成一个字节
      {
        DQ = 0;//单片机将DS18B20通信端口DQ从高电平拉成低电平时,单片机读取DS18B20所采集到温度数据开始。
        j>>=1;//变量j右移一位,最高位补零。例如当j=1,换成二进制是0000 0001,右移一位就是0000 000。扩展:单片机无符号或有符号数左移几位,高位就依次补几位0,低位也依次去掉几位,让左移几位依次代替低位去掉的几位。单片机有符号数,如果是正数,右移几位,先是确定最高位用0,低位也依次去掉几位,让右移几位依次代替低位去掉的几位,如果是负数,右移几位,先是确定最高位用1,低位也依次去掉几位,让右移几位依次代替低位去掉的几位。
        DQ = 1;//单片机将DS18B20通信端口DQ拉高
        if(DQ)//判断DQ是否等于1
        j|=0x80;//若DQ=1,则让当前j最高位为1,在下次循环中移位至次高位,最后达到从低位到高位接收的目的;若DQ=0,则可跳过此语句,直接在下次循环对byte进行移位补0。  
        DS18B20_Delay(4);//稍做延时
      }
       return j;
    }
      uint DS18B20_ReadTemperature()//单片机读取DS18b20当前温度
    {
       uchar L=0;//定义温度值低8位变量
       uchar H=0;//定义温度值高8位变量    
       DS18B20Init( );//DS18B20初始化函数
       DS18B20_WriteOneByte(0xcc);//单片机只连一个DS18B20温度传感器时,可写该段代码,表示单片机向DS18B20写入跳过读DS18B20序号列号指令。
       DS18B20_WriteOneByte(0x44);//单片机向DS18B20九字节暂存器(包括两个字节储温温度寄存器、一字节高温触发器、一字节低温触发器、一字节温度精度转换配置寄存器、三个字节的保留位、一字节DS18B20的64位ROM前56位编码校验CRC发生器)中前两个字节温度寄存器写入启动DS18B20温度转换指令
    // DS18B20_Delay(100);//稍作延时
       DS18B20Init( );//DS18B20初始化函数
       DS18B20_WriteOneByte(0xcc);//单片机只连一个DS18B20温度传感器时,可写该段代码,表示单片机向DS18B20写入跳过读DS18B20序号列号指令。
       DS18B20_WriteOneByte(0xbe);//单片机向DS18B20九字节暂存器(包括两个字节储温温度寄存器、一字节高温触发器、一字节低温触发器、一字节温度精度转换配置寄存器、三个字节的保留位、一字节DS18B20的64位ROM前56位编码校验CRC发生器)中前两个字节温度寄存器写入读取温度的指令
    // DS18B20_Delay(100);//稍作延时
       L=DS18B20_ReadOneByte( );//单片机向DS18B20发送读取温度值低8位指令,把读到的温度值低8位赋给温度值低8位变量
       H=DS18B20_ReadOneByte( );//单片机向DS18B20发送读取温度值高8位指令,把读到的温度值高8位赋给温度值高8位变量
       temperature = H;//DS18B20读到的温度值高8位赋给温度值变量,变成高8位温度值变量,还不是一个温度值变量,由于一个温度值变量是由高8位低8位共16位组成。
       temperature = temperature << 8;//温度值高8位变量左移8位,就可以变成一个只有高8位低8位全0的温度值变量。
       temperature = temperature | L;//只有高8位低8位全0的温度值变量与温度值低8位变量或运算后就变成一个真正有高8位低8位共16位的温度值变量 
       if(temperature>0x0fff)//判断表示温度寄存器16位二进制数的温度值变量是否大于表示温度寄存器16位二进制数的正温度值,假若大于且当表示温度寄存器16位二进制数的温度值变量的前5位二进制数全为1时,该温度值变量表示负温度值。
      {
        temperature = ~temperature+2;//负温度值
        temperatureflag=1;//负温度标志变量等于1
       }
       else
      {      
        temperatureflag=0;//负温度标志变量等于0
       }
       temperature = temperature*0.0625*10;//扩大10倍的温度值
       return temperature;//返回扩大10倍的温度值
         
     }
      void TemperatureFenJie()//LCD1602的温度显示函数   
    {
       wendu=DS18B20_ReadTemperature();//DS18B20读到的温度值赋给温度值变量
       if(temperatureflag==1)//判断负温度标志变量是否等于1
      {    
        fuhaowei=0x2d;//负符号
        wendubai=wendu/1000;//温度值百位
        wendushi=wendu%1000/100;//温度值十位
        wenduge=wendu%100/10;//温度值个位
        xiaoshudian=0x2e;//小数点
        xiaoshu=wendu%10;//小数位
       }
       else
      {
        fuhaowei=0x2b;//正符号
        if(wendu==0)//判断温度是否等于0
       {
         fuhaowei=0x20;//无符号
        }
        wendubai=wendu/1000;//温度值百位
        wendushi=wendu%1000/100;//温度值十位
        wenduge=wendu%100/10;//温度值个位
        xiaoshudian=0x2e;//小数点
        xiaoshu=wendu%10;//小数位
       }         
     }
      void TemperatureDisplay()//LCD1602的温度显示函数   
    { 
       WriteCommand(0x80+0x40);//LCD1602字符型液晶显示器第二行第九个(从第零开始数)显示位
       WriteData(fuhaowei);//符号位显示。
       WriteData(0x30+wendubai);//0x30表示字符库的数字0,整个代码表示温度值百位可显示0到9的数字。
       WriteData(0x30+wendushi);//0x30表示字符库的数字0,整个代码表示温度值十位可显示0到9的数字。
       WriteData(0x30+wenduge);//0x30表示字符库的数字0,整个代码表示温度值个位可显示0到9的数字。
       WriteData(xiaoshudian);//小数点
       WriteData(0x30+xiaoshu);//0x30表示字符库的数字0,整个代码表示小数位可显示0到9的数字。
       WriteData(0xdf);//0xdf表示字符库中摄氏度左上角的符号    
       WriteData(0x43);//0x43表示字符库中大写字母C
     }
      void main()                                 //主函数
    {
       uchar num;
       LCD1602Init();//LCD1602字符型液晶显示器初始化函数
       LCD1602Display();//LCD1602字符型液晶显示器显示函数
       Delay(500);
       WriteCommand(0x01);          //清除LCD1602显示的内容
       DS18B20Init();//DS18B20初始化函数
       while(1)
     {
        WriteCommand(0x80+0x00);//把LCD1602写进来的字符显示地址设为从0x80H(即00H)的上排第一位开始写
        for(num=0;num<15;num++)//将table2[]中的字符依次写入LCD1602的第一排
       {
         WriteData(table2[num]);
         Delay(5);
        }
        TemperatureFenJie();//温度分解函数
        TemperatureDisplay();//温度显示函数
      }
     }

  • 相关阅读:
    fedora上部署ASP.NET——(卡带式电脑跑.NET WEB服务器)
    SQL Server 请求失败或服务未及时响应。有关详细信息,请参见事件日志或其它适合的错误日志
    8086CPU的出栈(pop)和入栈(push) 都是以字为单位进行的
    FTP 服务搭建后不能访问问题解决
    指定的 DSN 中,驱动程序和应用程序之间的体系结构不匹配
    Linux 安装MongoDB 并设置防火墙,使用远程客户端访问
    svn Please execute the 'Cleanup' command. 问题解决
    .net 操作MongoDB 基础
    oracle 使用绑定变量极大的提升性能
    尝试加载 Oracle 客户端库时引发 BadImageFormatException。如果在安装 32 位 Oracle 客户端组件的情况下以 64 位模式运行,将出现此问题。
  • 原文地址:https://www.cnblogs.com/AChenWeiqiangA/p/12890630.html
Copyright © 2011-2022 走看看