51单片机多点18b20温度测量系统

2020-02-14来源: 51hei关键字:51单片机  多点  18b20  温度测量系统

分享我的期末作业,基于51单片机的多点温度测量
同时多点温度测量是在单总线上挂载多个18b20温度传感器

单片机源程序如下:

#include        

#include   

#define uchar unsigned char  

#define uint unsigned int  

#define MAXNUM 4        //宏定义单总线上最大可扫描DS18B20个数  

//*****************************//

//**初始定义管脚、变量与数组***//

//*****************************//     

sbit DS=P3^7; 

sbit lcden=P2^7;//液晶使能端

sbit lcdrs=P2^6;//液晶数0据命令选择端

sbit lcdrw=P2^5;

union{                 

    uchar c[2];        

    uint x;            

}temp;                                           

uchar time=0;   

uint cc,xs;             //变量cc中保存计算出的温度值的整数部分,xs保存计算出的温度值的小数部分的第一位            

uchar idata disbuffer[6];   //LCD显示缓存数组  

uchar idata ID[4][8]={0};//{{0x28,0xff,0x80,0x2e,0x70,0x16,0x03,0xad},{0x28,0xff,0x95,0xb5,0x81,0x16,0x03,0x50},{0x28,0xff,0x02,0x96,0xa1,0x16,0x04,0x59},{0x28,0xff,0xf0,0xf5,0x62,0x16,0x04,0xd3}};

                       //{"82FF08E2076130DA","82FF595B18613005","82FF20691A614095","82FF0F5F2661403D"};   //用于记录各DS18B20的ROM序列号  

uchar idata RomID_temp[8];  //匹配DS18B20时临时记录要匹配DS18B20的序列号

uchar east[5]=" EAST";

uchar west[5]=" WEST";

uchar south[5]="SOUTH";

uchar north[5]="NORTH";

uchar m=0;             

uchar num=0;           

//***************************//

//*******18b20时序延时*******//

//***************************// 

void delay(uint i)      //i*9.62us   

{  

    uint j;  

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

}  

  

void delay_ms(uchar i)  //(j*2+1+2)*i+5     

{ uchar j;              //12MHz   0.5*i ms  

  do{j=248;            

     do{j--;}while(j);   

     i--;   

    }while(i);   

}  

    

void delay_2us(uchar i)   // 2*i+5 us  

{  

  while(--i);  

}  

//**************************//

//******18b20子程***********//

//**************************//  

uchar DS_init(void)       //18B20复位,初始化函数  

{  

  uchar presence;  

  DS=0;          delay_2us(250); //根据DS18B20的复位时序.先把总线拉低555us  

  DS=1;          delay_2us(30);  //再释放总线,65us后读取DS18B20发出的信号  

  presence=DS;   delay_2us(250); //如果复位成功,则presence的值为0;否则为1  

  return (presence);             //返回0则初始化成功,否则失败  

}   

  

uchar read_byte(void)       //读1字节  

{  

  uchar i,j,dat=0;  

  for(i=1;i<=8;i++)          //作8个循环,读出的8位组成一个字节  

    {DS=0;   _nop_();       //先将总线拉低1us,   

     DS=1;   delay_2us(2);  //再释放总线,产生读起始信号,延迟9us后读取总线上的DS18B20发出的值  

     j=DS;   delay_2us(30); //一位读完后,延迟65us后读下一位  

     dat=(j<<7)|(dat>>1);   //读出的数据最低位在一个字节的最低位,这样刚好一个字节在DAT里  

    }  

  return(dat);  

}   

  

uchar read_2bit(void)       //读2位  

{  

  uchar i=0,j=0;  

  DS=0;   _nop_();          //先将总线拉低1us,   

  DS=1;   delay_2us(2);     //再释放总线,产生读起始信号,延迟9us后读取总线上的DS18B20发出的值  

  j=DS;   delay_2us(30);    //一位读完后,延迟65us后读下一位  

  DS=0;   _nop_();            

  DS=1;   delay_2us(2);  

  i=DS;   delay_2us(30);  

  i=j*2+i;              //将读出的两位放到变量i中,其中第一个读出的位处于i的第1位;而第二个读出的位处于i的第0位  

  return(i);  

}   

    

void write_byte(uchar dat)  //写1字节  

{    

  uchar i;  

  for(i=0;i<8;i++)           //作8个循环,写入的8位组成一个字节  

    {DS=0;                  //先将总线拉低  

     DS = dat&0x01;         //向总线上放入要写的值  

     delay_2us(50);         //延迟105us,以使DS18B20能采样到要写入的值  

     DS = 1;                //释放总线,准备写入下一位  

     dat>>=1;             //将要写的下一位移到dat的最低位        

    }  

}   

   

void write_bit(bit dat) //写1位  

{    

  DS=0;             //先将总线拉低  

  DS=dat;           //向总线上放入要写的值  

  delay_2us(50);    //延迟105us,以使DS18B20能采样到要写入的值  

  DS = 1;           //释放总线  

}  

//************************//

//*******1602延时*********//

//************************// 

void delay1(uint z)

{

        uint i,j;

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

        for(j=110;j>0;j--);

}

//************************//

//******1602子程**********//

//************************// 

void write_com(uchar com) //写命令 

{

        lcdrs=0;//选择写命令模式

        P0=com;//将要写的命令字送到数据总线上

        delay1(5);//稍作延时以待数据稳定

        lcden=1;//使能端给一高电平脉冲,因为初始化函数中已将lcden置零

        delay1(5);//稍作延时

        lcden=0;//将使能端置零完成高脉冲

}


void write_data(uchar date)  //写数据 

{

        lcdrs=1;//选择写数据操作

        P0=date;//将要写的数据送到数据总线上

        delay1(5);//稍作延时

        lcden=1;//使能端给一高电平脉冲

        delay1(5);

        lcden=0;

}


void init()   //1602初始化 

{

        lcdrw=0;

        lcden=0;

        write_com(0x38);//设置16*2显示,5*7点阵,8位数据接口

        write_com(0x0c);//设置开显示,不显示光标

        write_com(0x06);//写一个字节后地址指针加1

        write_com(0x01);//显示清零,数据指针清零

        write_com(0x80);//设置数据指针起点

}

//****************************//

//***读取18b20温度数据子程 ***//

//****************************//

void Read_Temperature_rom(void) //读取温度函数  

{   uchar i;  

    DS_init();  

    write_byte(0x55);       //匹配ROM  

    for(i=0;i<8;i++)     //发出64位ROM编码  

            write_byte(RomID_temp[i]);  

    write_byte(0x44);       //开始转换温度 

    DS_init();  

    write_byte(0x55);       //匹配ROM  

    for(i=0;i<8;i++)     //发出64位ROM编码  

            write_byte(RomID_temp[i]);  

    write_byte(0xBE);       //发读温度命令  

    temp.c[1]=read_byte();  //读低字节,之所以c[1]中放低字节,是因为C51采用的是大端格式 

    temp.c[0]=read_byte();  //读高字节,之所以c[0]中放低字节,是因为C51采用的是大端格式 

                            //共用体定义 

}  

  

void Temperature_cov(void)

[1] [2] [3]
关键字:51单片机  多点  18b20  温度测量系统 编辑:什么鱼 引用地址:http://news.0830abc.com/mcu/ic488275.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。重庆体彩网_[开户赠金]如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:基于单片机的PM2.5空气质量检测
下一篇:51单片机的酒精检测Proteus仿真+源代码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

单片机步进电机转速控制程序(速度LED显示)
单片机源程序如下://数码管位 高位-----低位//四个按键控制步进电机:正转,反转,加1,减1//上电时电机启动,数码管上显示速度最小档1,加减档位均能通过数码管显示出来,电机采用单双八拍方式//电机转速一共10档,通过按键调节转速 //电机正转时最高位数码管显示0,反转时显示1  #include<reg51.h>#define uchar unsigned char#define uint unsigned int#define led P0//数码管段选#define haha P2sbit s1 = P1^0;sbit s2 = P1^1;sbit s3 = P3^0;sbit
发表于 2020-02-08
单片机步进电机转速控制程序(速度LED显示)
基于51单片机的数字电容测量仪设计
本设计详细介绍了一种基于单片机的数字式电容测量仪设计方案及实现方法。设计的主要方法是采用555芯片构成单稳态触发器,将电容容量转换为脉冲宽度。通过单片机的计时器测量脉宽, 根据已知的R值,通过单片机的运算功能,计算出电容容量,最后,再通过单片机的普通I/O口控制液晶屏显示出电容容量的计算结果。系统的测量范围为10pF~ 500uF, 具有多个量程,可根据用户需要由用户选择,与用户的交互是通过键盘实现,不同量程的实现是通过单片机的I/O口控制继电器的吸合与断开来选择不同的R值,从而实现不同的量程。同时,本设计注重设计方法及流程,首先根据原理设计电路,再通过protues仿真,利用keil编程,进而借助altium designer
发表于 2020-02-08
基于51单片机的数字电容测量仪设计
基于51单片机的pwm直流电机调速
仿真原理图如下单片机源程序如下:#include <reg52.h>/********************************************** 定时器初值*********************************************/#define T0HIGH        0xec#define T0LOWW        0x8a
发表于 2020-02-08
基于51单片机的pwm直流电机调速
手把手教你单片机串口通信-基础篇
1的个数之和应为偶数。重庆体彩网_[开户赠金]接收字符时,对1的个数进行校验,若字符不一致,则说明传输数据过程中出现错误。代码和校验发送方将所发数据块求和(或各字节异或),产生一个字节的校验字符(校验和)附加到数据块末尾。接收方接收数据时,同时对数据块(除校验字节外)求和(或各字节异或),将所得的结果与发送方的“校验和”进行比较,一致则无差。循环冗余校验通过某种数学预算实现有效信息与校验位之间的循环校验,常用语对磁盘信息的传输、存储区的完整性校验。串口的基本结构SBUF:51单片机中的特殊寄存器,串行数据缓冲器(一个接收一个发送),两个其实是共用的一个地址99H,但是两个在物理上面是分开的。当发送使用时,就采用SBUF=XXX;  
发表于 2020-02-08
手把手教你单片机串口通信-基础篇
PIC单片机振荡电路中怎样选择晶体?
什么是中断程序呢?形象的生活比喻就比如你现在这在看我的文章,突然你的朋友喊你一起去烤地瓜,这时候你就中断了看文章和朋友烤地瓜去了,烤完地瓜之后你又回来看文章。烤地瓜这件事就好比中断程序,他中断了你看文章这件事。重庆体彩网_[开户赠金]在程序方面来说 当CPU在执行一个程序的时候,突然产生了中断事件CPU就去执行中断程序了,当执行完成后CPU又回来执行原先的程序。中断事件什么是中断事件,就是引起中断的事件。重庆体彩网_[开户赠金]对于单片机来说这些事件是多种多样的。比如 说一个按键按下,一定的时间到了,一串数据发送完毕,或接收完一个数据。重庆体彩网_[开户赠金]讲到中断不得不讲讲和中断相对的 查询。重庆体彩网_[开户赠金]其实不管是按键按下 还是 时间到,还是数据发送完毕,这些事实上都可以用查询的方式办到。比如 你是经理
发表于 2020-02-08
AVR单片机熔丝位的配置
(1)在AVR的器件手册中,对熔丝位使用已编程(Programmed)和未编程(Unprogrammed)定义熔丝位的状态, “Unprogrammed”表示熔丝状态为“1”(禁止);“Programmed”表示熔丝状态为“0”(允许)。因此,配置熔丝位的过程实际上是 “配置熔丝位成为未编程状态“1”或成为已编程状态“0””。(2)在使用通过选择打钩“√”方式确定熔丝位状态值的编程工具软件时,请首先仔细阅读软件的使用说明,弄清楚“√”表示设置熔丝位状态为“0”还是为“1”。(3)使用CVAVR中的编程下载程序时应特别注意,由于CVAVR编程下载界面初始打开时,大部分熔丝位的初始状态定义为“1”,因此不要使用其编程菜单选项中的“all
发表于 2020-02-08
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 0830abc.com, Inc. All rights reserved

页面底部区域 foot.htm