51单片机18b20温度及按键可调上下限报警源程序

2020-02-15来源: 51hei关键字:51单片机  18b20  按键可调

于18b20显示2位温度并显示上下限,超限报警,温度上下限均可调整,附带闪烁灯

单片机源程序如下:


#include

#define uchar unsigned char

#define uint unsigned int

sbit ds=P2^2;                

sbit key1=P3^4;

sbit key2=P3^5;

sbit key3=P3^6;

sbit dula=P2^6;

sbit wela=P2^7;

sbit beep=P2^3;

bit key=0;

sbit led=P1^2;

uint get_temp();

void send(uchar);

uint temp,num,p,cycle,high,low,zd,xs,TL;        

uint l=19;                        //定义温度下限

uint h=25;                        //定义温度上限

uchar code table[]={0x3f,0x06,0x5b,0x4f,

                                        0x66,0x6d,0x7d,0x07,

                                        0x7f,0x6f,0xbf,0x86,

                                    0xdb,0xcf,0xe6,0xed,

                                    0xfd,0x87,0xff,0xef};

void delay(uint z)  //延时函数

{

uint x,y;

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

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

}

void delay1(uint ms)  

{

  uchar j;

        while(ms--)

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

}

/////中断/////////////////////

void init()

{          

        TMOD|=0X10;

        TH0=(65536-2000)/256;

        TL0=(65536-2000)%256;

        EA=1;                  

        ET0=1;

        TR0=1;

}

//按键扫描程序******************************************************

void keyscan()

{

if(key3==0)

        delay1(5);

  if(key3==0)

  {    while(!key3);

                key=!key; 

                while(key3==0);

   }

if(key==0)

   {

  if(key1==0)

   {

    delay1(5);

  if(key1==0)

        //while(!key1)  ;

                 l++;   

                delay(50);

  if(l==99)

            l=0;

       }

   }                      

if(key2==0)

   {

    delay1(5);

  if(key2==0)

{//        while(!key2);

           if(l!=0)

           l--;          

                   delay(50);

      }

          }

          }

if(key==1)

{

  if(key1==0)

   {

    delay1(5);

if(key1==0)

{//        while(!key1)  ;

                 h++; 

                delay(50);

           if(h==99)

            h=0;

       }

   }                      

      if(key2==0)

   {

    delay1(5);

if(key2==0)

{//while(!key2);

          if(h!=0)

           h--;        

                   delay(50);                   

}  

}

}

}

//温度传感器********************************************************

void dsreset()//ds18b20复位 初始化函数

{

        uint i;

        ds=0;

        i=80;

        while(i>0)i--;

        ds=1;

        i=4;

        while(i>0)i--;

}

bit tempreadbit()

{

        uint i;

        bit dat;

        ds=0;i++;         //i++起延时作用

        ds=1;i++;i++;

        dat=ds;

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

        return(dat);

}

uchar tempread()                                                 

{

                uchar i,j,dat;

                dat=0;

                for(i=1;i<=8;i++)

                {

                        j=tempreadbit();

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


                }           

                return(dat);

                }

void tempwritebyte(uchar dat)           //向ds18b20写一个字节数据函数                  

{

                uint i;

                uchar j;

        bit testb;

        for(j=1;j<=8;j++)

                {

                        testb=dat&0x01;

                        dat=dat>>1;

        if(testb)//写一

                {

                         ds=0;

                        i++;i++;

                        ds=1;

                        i=8;

                while(i>0)i--;

                }

        else

                        {

                                ds=0;//写0

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

                                ds=1;

                                i++;i++;


                        }

                }

}                

void tempchange() //DS18B20开始获取温度并转换

{

                dsreset();

                delay(1);

                tempwritebyte(0xcc);   //写跳过读ROM指令

                tempwritebyte(0x44);   //写温度转换指令

}

uint get_temp()

                {

                        uchar a,b;

                        dsreset();

                        delay(1);

                        tempwritebyte(0xcc);

                        tempwritebyte(0xbe);

                        a=tempread(); //读低八位

                        b=tempread();         //读高八位

                        temp=b;

                        temp<<=8;//两个字节组合为一个字

                        temp=temp|a;

                        temp=temp*0.0625;        //温度在寄存器中为12位,分辨率位0.0625        度

                SBUF=temp;

                        return temp;//temp是整型

        }

//数码管显示**********************************************************************

void

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

上一篇:超小型的无线收发模块LT8920配置思路+单片机发射接收程序
下一篇:单片机驱动16X192点阵程序及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 EEWORLD.com.cn, Inc. All rights reserved