历史上的今天
返回首页

历史上的今天

今天是:2025年02月13日(星期四)

正在发生

2020年02月13日 | oled显示温度报警的51单片机程序

2020-02-13 来源:51hei

温度报警限制上下值
由oled显示
制作出来的实物图如下:

image.png?imageView2/2/w/550

单片机源程序如下:

#include

#include "oled.h"

#define uchar unsigned char

#define uint unsigned int

unsigned char set=0;

unsigned char code table[]="0123456789";

uchar shi,bai,ge,xiaoshu;

sbit DSPORT=P3^7;

sbit k1=P2^7;

sbit k2=P2^6;

sbit k3=P3^2;

bit N_flag;

int shangxian=22;

int xiaxian=10;

int temp;

sbit beep=P1^5;

sbit alam=P1^6;

uchar H1,H2,L1,L2;

void delay(uint c)

{

   uint x,y;

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

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

}

void Delay1ms(unsigned int y)

{

        unsigned int x;

        for( ; y>0; y--)

        {

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

        }

}



uchar Ds18b20Init()

{

        uchar i;

        DSPORT = 0;                         //将总线拉低480us~960us

        i = 70;        

        while(i--);//延时642us

        DSPORT = 1;                        //然后拉高总线,如果DS18B20做出反应会将在15us~60us后总线拉低

        i = 0;

        while(DSPORT)        //等待DS18B20拉低总线

        {

                Delay1ms(1);

                i++;

                if(i>5)//等待>5MS

                {

                        return 0;//初始化失败

                }

        

        }

        return 1;//初始化成功

}




void Ds18b20WriteByte(uchar dat)

{

        unsigned int i, j;


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

        {

                DSPORT = 0;                       //每写入一位数据之前先把总线拉低1us

                i++;

                DSPORT = dat & 0x01;  //然后写入一个数据,从最低位开始

                i=6;

                while(i--); //延时68us,持续时间最60us

                DSPORT = 1;        //然后释放总线,至少1us给总线恢复时间才能接着写入第二个数值

                dat >>= 1;

        }

}




uchar Ds18b20ReadByte()

{

        uchar byte, bi;

        unsigned int i, j;        

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

        {

                DSPORT = 0;//先将总线拉低1us

                i++;

                DSPORT = 1;//然后释放总线

                i++;

                i++;//延时6us等待数据稳定

                bi = DSPORT;         //读取数据,从最低位开始读取

                /*将byte左移一位,然后与上右移7位后的bi,注意移动之后移掉那位补0。*/

                byte = (byte >> 1) | (bi << 7);                                                  

                i = 4;                //读取完之后等待48us再接着读取下一个数

                while(i--);

        }                                

        return byte;

}



void  Ds18b20ChangTemp()

{

        Ds18b20Init();

        Delay1ms(1);

        Ds18b20WriteByte(0xcc);                //跳过ROM操作命令                 

        Ds18b20WriteByte(0x44);            //温度转换命令

        //Delay1ms(100);        //等待转换成功,而如果你是一直刷着的话,就不用这个延时了

   

}



void  Ds18b20ReadTempCom()

{        


        Ds18b20Init();

        Delay1ms(1);

        Ds18b20WriteByte(0xcc);         //跳过ROM操作命令

        Ds18b20WriteByte(0xbe);         //发送读取温度命令

}



uint Ds18b20ReadTemp()

{

        int temp = 0;

        uchar tmh, tml;

        Ds18b20ChangTemp();                                 //先写入转换命令

        Ds18b20ReadTempCom();                        //然后等待转换完后发送读取温度命令

        tml = Ds18b20ReadByte();                //读取温度值共16位,先读低字节

        tmh = Ds18b20ReadByte();                //再读高字节

        temp = tmh;

        temp <<= 8;

        temp |= tml;

        if(temp>0x0fff)

        {

    N_flag=1;

                temp=temp-1;

                temp=~temp;

  }

        else

        {

    N_flag=0;

  }

        temp=temp*0.625;

        

         bai=temp/1000;

         shi=temp%1000/100;

   ge=temp%1000%100/10;

   xiaoshu=temp%10;


        return (temp);

}

void keyscan()

{  

        

        if(set==0)

    {        

                if(k1==0)

                {

                        delay(10);

                        if(k1==0)shangxian++;

                }

        if(k2==0)

                {

                        delay(10);

                        if(k2==0)shangxian--;

                }  

        }


    if(set==1)

        {

                if(k1==0)

                { 

                        delay(10);

                        if(k1==0)xiaxian++;

                }

        if(k2==0)

                { 

                        delay(10);

                        if(k2==0)xiaxian--;

        }

     }


         H1=shangxian/10;

         H2=xiaxian/10;

         L1=shangxian%10;

         L2=xiaxian%10;


}

void alarm()

{

        temp=Ds18b20ReadTemp();

   if(temp/10>=shangxian)

         {

      beep=0;

                  alam=0;

                  delay(10);

                  beep=1;

                  alam=1;

                  delay(10);

   }

         else

         {

      beep=1;

                  alam=1;

   }

         if(temp/10<=xiaxian)

         {

      beep=~beep;

                  alam=~alam;

                 delay(10);

   }

         else

         {

         beep=1;

                     alam=1;

   }

}

void main(void)

{        IT0=1;

        EX0=1;

        EA=1;

        OLED_Init();                        //初始化OLED  

        OLED_Clear();        

        while(1) 

        {                

推荐阅读

史海拾趣

General Industrial Controls ( GIC )公司的发展小趣事
Q值反映了电感器的品质因数,直流电阻则会影响电路的效率。一般来说Q值越高、直流电阻越小则性能越好但成本也越高。因此需要根据具体需求和预算来选择合适的电感器。
Esc Electronics Corp公司的发展小趣事

面对电子行业技术的快速迭代和市场竞争的加剧,Esc始终保持创新驱动的发展策略。公司不断加大对研发创新的投入力度,推动产品升级和产业升级。通过引入新技术、新工艺和新材料,Esc成功开发出一系列具有竞争力的新产品,并在市场上取得了显著的成绩。同时,公司还积极参与行业标准的制定和推广工作,推动整个电子行业的进步和发展。

Andigilog公司的发展小趣事

在市场竞争日益激烈的背景下,Esc意识到品质管理的重要性。公司投入大量资源用于提升产品质量和服务水平,通过严格的质量控制和客户反馈机制,不断优化产品设计和生产流程。同时,Esc还积极塑造品牌形象,通过参加行业展会、发布新品广告等方式,提升品牌知名度和美誉度。这些努力使得Esc在消费者心中树立了高品质、可信赖的形象。

GISMA Steckverbinder GmbH公司的发展小趣事

随着技术的不断进步,GISMA持续加大研发投入,不断推出新产品以满足市场需求。其产品线从最初的几个系列扩展到如今的16个系列,涵盖了超过15000种不同类型的连接器。这些连接器不仅具有高电气性能和出色的防水性能,还能够在恶劣的水下环境中保持稳定的工作状态。GISMA的技术创新能力和产品线拓展策略,为其在电子行业中的持续发展奠定了坚实基础。

喜美克斯(Cvilux)公司的发展小趣事

喜美克斯公司深知人才是企业发展的核心动力。因此,他们高度重视人才的引进和培养。公司建立了一套完善的人才选拔和培养机制,通过内部培训、外部引进等多种方式,不断为公司注入新鲜血液。同时,公司还为员工提供广阔的职业发展空间和优厚的福利待遇,激发了员工的工作热情和创造力。这些举措为喜美克斯公司的长期发展提供了坚实的人才保障。

General Electronic Devices公司的发展小趣事
负责产生控制信号,驱动开关元件按一定频率和占空比工作。

问答坊 | AI 解惑

高手看看显示程序哪里出错啊

;--------------------------------------- ;  四位共阳LED动态扫描显示程序 ;  P0为段码口,P2为位选口(低电平有效) ;  参数为要显示的字符串指针 ;---------------------------------------    & ...…

查看全部问答>

是不是明天就出来全部成绩了?

是不是明天所有关于比赛的成绩都应该有结果了?希望获奖的朋友可以分享一下各自的方案和资料,大家共同学习、共同进步。…

查看全部问答>

问一个初学者的问题,wince所用语言

1.wince下主要用什么语言开发,我喜欢c++,可以吗,是主流吗 2.现在嵌入式开发wince是主流吗,尤其是3g 3.用什么工具开发…

查看全部问答>

高薪诚聘 嵌入式 Linux 开发工程师

公司介绍    北京顶嵌开源科技有限公司,简称顶嵌或TOP-E。公司秉承“专业、专注、顶尖”的发展理念,致力于嵌入式技术的人才培养,项目开发,技术推广与技术咨询服务。    顶嵌是国内唯一一家专注嵌入式Linux系统高端培训和 ...…

查看全部问答>

使用串口老出现ttys input overruns!

使用串口老出现ttys input overruns!有谁知道!如何解决!或是什么问题引起的!谢谢了先!…

查看全部问答>

再次遇到奇怪的问题:FPGA板子上的晶振振幅下降。

再次遇到奇怪的问题:FPGA板子上的晶振振幅下降,导致fpga不工作。   板子是好用的,我用其他的程序都没有问题,但是某个程序导致4Vp-p的晶振变到1Vp-p 用的是xilinx的spartan 3 A,我将程序中的chipscope去掉后,时钟恢复正常,再加上chip ...…

查看全部问答>

求verilog HDL代码

我该如何实现以下功能(verilog HDL代码):当A为高电平,并持续5s,那么B输出为高;如果A为低电平,且持续5s,那么B输出为低。请大家指点迷津…

查看全部问答>

可变周期脉冲发生器的设计

信号为50mhz固定,要用分频来实现不同的型号输入。 设计一个周期、占空比可调的脉冲发生器。脉冲产生过程中,可对脉冲的周期、高电平和低电平的延续时间进行调整;调整步长自定;并同时显示已经输出的脉冲的个数,若脉冲个数达到了数码管显示的极 ...…

查看全部问答>

今年题目预测有可能出现红外吗?

今年题目预测有可能出现红外吗? …

查看全部问答>