历史上的今天
返回首页

历史上的今天

今天是:2025年05月12日(星期一)

正在发生

2018年05月12日 | 单片机DS18b20 温度检测液晶显示

2018-05-12 来源:eefocus

/*-----------------------------------------------  

  名称:DS18b20 温度检测液晶显示  

  论坛:www.doflye.net  

  编写:shifang  

  日期:2009.5  

  修改:无  

  内容:  

------------------------------------------------*/  

#include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义  

#include  

#include "18b20.h"  

#include "1602.h"  

#include "delay.h"  

  

  

#define KeyPort P3 //定义按键端口  

  

  

bit ReadTempFlag;//定义读时间标志  

  

  

void Init_Timer0(void);//定时器初始化  

unsigned char KeyScan(void);//键盘扫描  

/*------------------------------------------------  

              串口通讯初始化  

------------------------------------------------*/  

void UART_Init(void)  

{  

    SCON  = 0x50;        // SCON: 模式 1, 8-bit UART, 使能接收    

    TMOD |= 0x20;               // TMOD: timer 1, mode 2, 8-bit 重装  

    TH1   = 0xFD;               // TH1:  重装值 9600 波特率 晶振 11.0592MHz    

    TR1   = 1;                  // TR1:  timer 1 打开                           

    //EA    = 1;                  //打开总中断  

    //ES    = 1;                  //打开串口中断  

TI=1;  

}  

/*------------------------------------------------  

                    主函数  

------------------------------------------------*/  

void main (void)  

{                    

int temp,tempH=50,tempL=1;  

float temperature;  

unsigned char TempFlag=0;  

char displaytemp[16],num;//定义显示区域临时存储数组  

  

  

LCD_Init();           //初始化液晶  

DelayMs(20);          //延时有助于稳定  

LCD_Clear();          //清屏  

Init_Timer0();  

UART_Init();  

Lcd_User_Chr();       //写入自定义字符  

  

  

  

  

while (1)         //主循环  

  {  

 num=KeyScan();  

 switch(num)  

       {  

   case 1:if(tempH<127)tempH++;break;  

case 2:if(tempH>-55)tempH--;break;  

case 3:if(tempL<127)tempL++;break;  

case 4:if(tempL>-55)tempL--;break;  

default:break;  

  }  

   

switch(TempFlag)  

       {  

   case 0:    //输出温度上限下限  

     sprintf(displaytemp,"H.%3d  L.%3d ",tempH,tempL);  

              LCD_Write_String(0,1,displaytemp);//显示第二行  

 break;  

case 1:LCD_Write_String(0,1,"over  tempH    ");break;  

case 2:LCD_Write_String(0,1,"under  tempL   ");break;  

default:break;  

  }  

if(ReadTempFlag==1)  

 {  

  ReadTempFlag=0;  

  temp=ReadTemperature();  

  

  

  

  

  temperature=temp*0.0625;  

  

  

  temp>>=4;  

 if(temp>tempH)  

    TempFlag=1;  //高于高温标志  

 else if(temp

    TempFlag=2;  //低于低温标志  

 else  

   TempFlag=0;   //正常显示标志  

  

  

      

  

  

  sprintf(displaytemp,"Temp  %6.2f ",temperature);//打印温度值  

  LCD_Write_String(0,0,displaytemp);//显示第一行  

  LCD_Write_Char(13,0,0x01);//写入温度右上角点  

  LCD_Write_Char(14,0,'C'); //写入字符C  

  }   

 }  

}  

  

  

/*------------------------------------------------  

                    定时器初始化子程序  

------------------------------------------------*/  

void Init_Timer0(void)  

{  

 TMOD |= 0x01;  //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响  

      

 //TH0=0x00;      //给定初值  

 //TL0=0x00;  

 EA=1;            //总中断打开  

 ET0=1;           //定时器中断打开  

 TR0=1;           //定时器开关打开  

}  

/*------------------------------------------------  

                 定时器中断子程序  

------------------------------------------------*/  

void Timer0_isr(void) interrupt 1   

{  

 static unsigned int num;  

 TH0=(65536-2000)/256;  //重新赋值 2ms  

 TL0=(65536-2000)%256;  

   

 num++;  

 if(num==400)        //  

   {  

    num=0;  

    ReadTempFlag=1; //读标志位置1  

}  

}  

  

  

/*------------------------------------------------  

按键扫描函数,返回扫描键值  

------------------------------------------------*/  

unsigned char KeyScan(void)  

{  

 unsigned char keyvalue;  

 if(KeyPort!=0xff)  

   {  

    DelayMs(10);  

    if(KeyPort!=0xff)  

  {  

   keyvalue=KeyPort;  

   while(KeyPort!=0xff);  

switch(keyvalue)  

{  

case 0xfe:return 1;break;  

case 0xfd:return 2;break;  

case 0xfb:return 3;break;  

case 0xf7:return 4;break;  

case 0xef:return 5;break;  

case 0xdf:return 6;break;  

case 0xbf:return 7;break;  

case 0x7f:return 8;break;  

default:return 0;break;  

}  

 }  

   }  

   return 0;  


推荐阅读

史海拾趣

Davicom公司的发展小趣事

为了进一步提升自身的技术实力和市场竞争力,Davicom积极寻求与业界巨头的合作。经过多轮谈判,Davicom最终与一家国际知名的IC设计大厂达成战略合作协议。双方共同研发出一系列高性能、低功耗的网络通讯IC产品,这些产品一经推出便受到市场的热烈欢迎。

Eska公司的发展小趣事

Eska公司成立于荷兰北部,自创立之初就专注于造纸业务。公司引进了先进的造纸技术和设备,建立了两座灰板纸厂,配备了3台技术领先的纸板机和2台造纸机。凭借高效的生产能力和优质的产品质量,Eska迅速在造纸行业中崭露头角。Eska的灰板纸以“Eska(青蛙)”品牌销售,因其优良且稳定的质量而享誉全球。

Antiference公司的发展小趣事

在追求经济效益的同时,Antiference公司始终不忘履行社会责任。公司积极参与环保事业,推动绿色生产,努力降低生产过程中的能耗和排放。此外,Antiference还积极投身公益事业,支持教育事业和扶贫工作,为社会做出了积极贡献。

Desco Tools公司的发展小趣事

近年来,随着全球对环保问题的日益关注,Desco Tools公司也积极响应环保号召,将环保理念融入公司的生产和经营中。公司采用环保材料和工艺,减少生产过程中的废弃物和污染物排放。同时,公司还积极推动绿色生产和可持续发展,为客户提供更加环保、可持续的防静电解决方案。这些举措不仅有助于保护环境,还提升了公司的社会责任感和形象。

ept Connectors公司的发展小趣事

进入上世纪80年代,EPT Connectors公司迎来了一次重要的技术突破。公司成功推出了DIN 41612连接器,这一产品凭借其高性能和可靠性迅速在市场上获得了认可。随后,EPT又相继推出了PC/104和PC/104-Plus、Hm2.0、AdvancedTCA和MicroTCA等产品组,进一步巩固了其在连接器领域的领先地位。这些产品的推出不仅提升了EPT的品牌影响力,也为公司带来了可观的收益。

承兴(CX)公司的发展小趣事

经过多年的努力和发展,承兴公司已经成为一家具有全球影响力的电子企业。除了在中国市场保持领先地位外,承兴还积极拓展海外市场,并在美国、新加坡等地设立了分公司和研发中心。通过与全球合作伙伴的紧密合作和资源共享,承兴不断提升其全球竞争力,并努力实现国际化的发展目标。

请注意,由于承兴(CX)公司的具体发展历程和细节可能因时间和市场变化而有所不同,以上故事仅为虚构示例,旨在展示承兴公司在电子行业中的发展脉络和关键事件。

问答坊 | AI 解惑

[转贴]:气隙位置对电感参数的影响及改进

气隙位置对电感参数的影响及改进除了用铁粉芯作磁芯的电感外,一般电感(Flyback变压器为耦合电感)。气隙的位置对电感参数有较大影响,下面基于有限元计算对此问题进行分析并给出一种新结构之磁芯。 为方便起见,从一EE型的Flyback变压器开始分析 ...…

查看全部问答>

稳压电源的制作

(一) 电容降压式稳压电源       电容降压式稳压电源输出电流较小,但他不用变压器所以体积小,成本低,适用于耗电小的电子设备,原理图见(1-1) 如果桥式整流电路的输入交流电压为Vi输出直流电压为Vo,输出电流为Iz 则降压电容 ...…

查看全部问答>

帮忙分析下这个电路,将将其原理

[ 本帖最后由 tonytong 于 2010-5-20 12:46 编辑 ]…

查看全部问答>

请问一个循环延时问题?

题目:若使蜂鸣器响5次,约0.5秒响.一秒停(p1.0输出1时,三极管截至,蜂鸣器不响,机器周期为去1us) BEEP:MOV R7,#5 BEEPL:CLR P1.0            LCALL DEL5            ...…

查看全部问答>

有谁用过BGB100?

自己用蓝牙无线收发器做了一个板子,想用FPGA控制它通信,但是没通,大家谁用过这个芯片,希望指点一下。…

查看全部问答>

谁能帮忙从 pudn 上下载几个程序发到我的邮箱里,谢谢

一个内存驱动器的源代码 http://www.pudn.com/downloads/sourcecode/windows/vxd/detail1558.html 虚拟串口用VC编译 http://www.pudn.com/downloads170/sourcecode/windows/vxd/detail788464.html 8139网卡驱动源码 http://www.pudn.co ...…

查看全部问答>

用Studio 5.0 Platform Builder编译出来的SDK怎么用?

编译出来的SDK只有5M不到,直接将msi文件运行安装之后,在建立一个简单的工程都编译不过。 一般一个标准SDK都有100M多的样子,为什么我自己编译出来的只有SDK只有几兆呢,哪位知道这个SDK到底是怎么用的,还要什么别的设置么,找MSDN,也没找到。 ...…

查看全部问答>

FPC上贴装SMD几种方案

  根据贴装精度要求以及组件种类和数量的不同,目前常用的方案如下几种:   方案1   单片FPC上的简单贴装   1. 适用范围   A. 组件种类:以电阻电容等片装为主。   B. 组件数量:每片FPC需要贴装的组件数量很少,一般只有几个组件 ...…

查看全部问答>

【讨论】大家的3V、5V逻辑接口都是怎么设计的?

单向的话,我习惯用74HC245做转换。 但比较烦人的就是双向接口了。比如驱动OLED、点阵液晶,模拟并口需要读取和写入双向操作,这就比较复杂。再加上我的这个模拟并口又与USB芯片的并口复用。电路上就出现了问题。 大家在双向逻辑电平转换时都是怎 ...…

查看全部问答>

求全新msp430 Value Line LaunchPad,了解如何购买的也请进

谁那里有多余的全新msp430 Value Line LaunchPad,想求一个,或者有谁了解如果购买。(PS:现在还可以申请吗?)…

查看全部问答>