历史上的今天
返回首页

历史上的今天

今天是:2025年02月15日(星期六)

2020年02月15日 | 51单片机18b20温度及按键可调上下限报警源程序

2020-02-15 来源:51hei

于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 display(uchar num,uchar dat)//数据显示程序

{                                                                //num是第几个数码管,dat是要显示的数字                                 

推荐阅读

史海拾趣

Chengdu Sino Microelectronics Technology Co Ltd公司的发展小趣事

2000年3月,成都华微科技诞生。当时,集成电路设计行业刚刚起步,市场竞争激烈。然而,公司凭借对中国电子信息产业集团的坚定信任,以及对中国集成电路设计市场的深刻洞察,毅然决然地踏上了这条充满挑战的道路。初创期的华微科技,虽然规模较小,但团队成员都怀揣着对技术的热情和对未来的憧憬,为公司的长远发展奠定了坚实的基础。

GE公司的发展小趣事

随着国内市场的逐渐饱和,成都华微科技开始将目光投向国际市场。公司凭借过硬的产品质量和完善的服务体系,逐渐在国际市场上崭露头角。通过与国外客户的深入合作,华微科技不仅提升了自身的国际影响力,也为中国集成电路设计行业在国际市场上赢得了更多的话语权。

ALLIED [Allied Electronics]公司的发展小趣事

2000年3月,成都华微科技诞生。当时,集成电路设计行业刚刚起步,市场竞争激烈。然而,公司凭借对中国电子信息产业集团的坚定信任,以及对中国集成电路设计市场的深刻洞察,毅然决然地踏上了这条充满挑战的道路。初创期的华微科技,虽然规模较小,但团队成员都怀揣着对技术的热情和对未来的憧憬,为公司的长远发展奠定了坚实的基础。

Acculin Inc公司的发展小趣事

为了进一步提升技术水平,Acculin Inc积极寻求与国际知名企业的合作。通过与欧洲一家半导体制造商的技术交流,公司引进了一条先进的生产线,并成功将其应用于新型芯片的制造中。这一合作不仅提升了Acculin的生产效率,也使其在芯片制造领域达到了国际先进水平。

安碁科技(AKER)公司的发展小趣事

随着市场需求的不断增长,安碁科技开始寻求扩大产能和全球化布局。1999年,公司正式量产电压控制振荡器(VCXO),并购置了更大的厂房以扩大产能。随后,安碁科技陆续在美国和中国大陆设立子公司和办事处,进一步拓展国际市场。这一系列的举措,不仅提高了公司的产能和效率,也使其能够更好地服务全球客户,实现业务的快速增长。

HEC Inc公司的发展小趣事

1990年,安碁科技股份有限公司正式成立,标志着其进军石英振荡器领域的起点。公司初创时期,面临着激烈的市场竞争和技术挑战。然而,安碁科技凭借对技术的执着追求和对市场的敏锐洞察,逐步在行业中崭露头角。通过不断的技术研发和产品创新,公司逐渐建立了自己的品牌地位,为后续的发展奠定了坚实的基础。

问答坊 | AI 解惑

multisim

以前没传上去。。最近还来是一次哈…

查看全部问答>

求助

谁有MAX458通讯和MAX232转变的接口啊 ?…

查看全部问答>

电路分析?谢谢!!!

图附件电路:IC为控制电路,Q端输出控制信号3V左右,控制三极管的导通。工作电压5--24V, K为24V继电器。 主要意图:24V电源供电,当Q没有输出时,继电器不工作,但有漏电流。当Q端有输出时,三极管导通,继电器工作。电路目前问题是:三极管导通 ...…

查看全部问答>

关于verilog的几个小问题

各位兄弟姐妹大家好,小弟这两天正在苦心学习verilog,书中看到一段话不太明白: 简单的十进制数格式的整数代表一个有符号的数,负数可使用两种补码形式表示。因此32在5位的二进制形式中为10000,在6位二进制形式中为110001;-15在5位的二进制形式 ...…

查看全部问答>

关于dsp的开发工具 CCStudio v3.3 的帮助问题!

为什么我打开help|content  而后在index栏输入  需要查找的内容  如输入stm,sym,mpy等等都没相关主题,倒是有一些不相关的内容!难道是我的东西没安装完全吗!如果是怎样把他安装完全!我的安装程序一共635MB,从网 ...…

查看全部问答>

GPRS猫发送MMS

我要通过GPRS猫发送彩信,有几个问题请教大家: 1、看网上说可以通过Http post发送,是什么意思?是将HTTP post封装到WSP PDU中吗?还是指得HTTP post通过Internet发送? 2、因为我的GPRS猫没有继承MMS模块,所以各层的协议要自己实现,由低到高 ...…

查看全部问答>

为什么我的硬盘在ce启动后不能看见?

我用40G硬盘,分成1个fAT区,2G,其他的为其它的分区。 启动后,存储管理器可以到该硬盘。但是没有挂接上。 我的操作: 1、添加ATAPI PCI/IDE Storage Block Driver 2、添加FAT File System 3、添加CD/UDFS File System 请问是否需要更改注册 ...…

查看全部问答>

单片机编程问题请教;

请教一个问题,代码如下: sbit int_1 = P1^2; sbit int_2 = P1^3; sbit int_3 = P3^7; uchar code drive_1[4] = {0xff,0x00,0xff,0x00}; uchar code drive_2[4] = {0x00,0xff,0x00,0xff}; int main() {   uchar i = 0;  & ...…

查看全部问答>

Cannot open include file: 'icmpapi.h': No such file or directory

我编程(参考别人的)的时候,      需要这个文件,可是怎么也找不到 fatal error C1083: Cannot open include file: \'icmpapi.h\': No such file or directory 到哪里找这个文件…

查看全部问答>

DriverStudio开发IRP_MJ_DEVICE_CONTROL的routine时设置OutBuffer的问题

请问,我在写自定义的某个IRP_MJ_DEVICE_CONTROL的CODE的时候,采用了METHOD_BUFFERED的方式,发现设置不了输出缓冲中的内容。书上说BUFFERED方式输出缓冲与输入缓冲都是IO MANAGER分配的系统内存,传进来的时候是in buffer,传出动是out buffer, ...…

查看全部问答>