基于18B20和单片机89C52的测温程序

发布者:技术旅人最新更新时间:2015-07-23 来源: 51hei关键字:18B20  单片机  89C52  测温程序 手机看文章 扫描二维码
随时随地手机看文章
#include
 
#include
 
#include"KEY.h"
 
#include"IIC.h"
 
#define uint unsigned int
 
#define uchar unsigned char
 
#define IICADDR 0x20  //存储地址
 
#define LEDIO    P0             //P0扫描段码,P2扫描位选信号 
 
#define LEDCHIP   P2
 
sbit  DQ=P3^2; //18B20接口
 
sbit BEEP=P3^7; // 蜂鸣器接口
 
uchar i=0,mod=0; //扫描变量
 
uchar key1,key2=20;    //按键寄存
 
uchar Tmp_max=10,Tmp_min=5,Tmp;    //温度寄存
 
uint k=0,p=0,num=5000;    //有关扫描的变量
 
/****************温度小数部分用查表法*********************/
 
uchar code LedTab[14]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00,0x40,0x063};
 
 /***共阴数码管段码表  0    1    2    3    4    5    6    7    8    9    不亮  -    °  */
 
uchar code selchip[6]={0x01,0x02,0x04,0x08,0x10,0x20};//列扫描位选信号
 
uchar data temp_data[2]={0x00,0x00};//读出温度暂放
 
uchar data display[3][7]={{0x00,0x3f,0x3f,0x3f,0x3f,0x3f,0x00},  //显示单元数据,共6个数据一个用作运算                   {0x00,0x3f,0x3f,0x3f,0x3f,0x76,0x00},  //显示H设置最大值
 
  {0x00,0x3f,0x3f,0x3f,0x3f,0x38,0x00}};  //显示L设置最小值
 
///////////////////////////////////////////////////////////////////////////////
 
void Delay_tmp(uchar time)   //延时10us  
 
{
 
while(time--)
 
{
 
_nop_();
 
_nop_();
 
}
 
}
 
void Delay_2s()    //延时两秒开机检测数码管
 
{
 
    unsigned char a,b,c;
 
    for(c=23;c>0;c--)
 
        for(b=216;b>0;b--)
 
            for(a=184;a>0;a--);
 
}
 
/*********************定时器初始化***********************************/
 
void TimerInit()
 
{
 
TMOD=0x01; //定时器1定时扫描
 
ET0=1;
 
EA=1;
 
TH0=0xfc;
 
TL0=0xd8;
 
TR0=1;
 
}
 
/******************定时器中断扫描程序**********************/
 
void timedis() interrupt 1
 
{
 
if(mod) //闪烁程序,提醒用户正在设置
 
{
 
if(num--)  //自动退出闪烁,返回主界面
 
{
 
if(k++<190)
 
{
 
P2=0x00;
 
}
 
else
 
{
 
LEDIO=display[mod][i];
 
LEDCHIP=selchip[i];
 
if(i>=5)
 
i=0;
 
else 
 
i++;
 
if(p++>190)
 
{
 
p=0;
 
k=0;
 
}
 
}
 
}
 
else
 
mod=0;
 
}
 
else   //正常数码管扫描显示
 
{
 
LEDIO=display[mod][i];
 
LEDCHIP=selchip[i];
 
if(i>=5)
 
i=0;
 
else 
 
i++;
 
    }
 
TH0=0xfc;
 
TL0=0xd8;
 
}
 
/*********************DS18B20复位函数*****************************/
 
void Temp_Reset(void)
 
{
 
EA=0;
 
    CY = 1;
 
    while (CY)
 
    {
 
        DQ = 0;                     //送出低电平复位信号
 
        Delay_tmp(48);              //延时至少480us
 
        DQ = 1;                     //释放数据线
 
        Delay_tmp(6);               //等待60us
 
        CY = DQ;                    //检测存在脉冲
 
        Delay_tmp(42);              //等待设备释放数据线
 
    }
 
EA=1;
 
}
 
/************************写一字节********************/
 
void Temp_Write_byte(uchar val)
 
{
 
uchar i;
 
EA=0;
 
for (i=8;i>0;i--)
 
{
 
DQ=0;_nop_();_nop_();
 
val >>=1;; //写数据
 
DQ=CY;
 
Delay_tmp(6); //延时66us等待采样结束
 
DQ=1; //右移一位
 
}
 
EA=1;
 
}
 
/***********************读一字节****************************/
 
char Temp_Read_byte()
 
{
 
uchar i;
 
uchar value=0;
 
EA=0;
 
for(i=0;i<8;i++)
 
{
 
value >>=1; //18B20右移一位
 
DQ=0;_nop_();_nop_();   //2us
 
DQ=1;_nop_();_nop_(); //2us
 
if(DQ) //读出来的是1
 
value |=0x80;
 
Delay_tmp(6);    //66us
 
}
 
DQ=1;
 
EA=1;
 
return value;
 
}
 
/***********************读出温度函数*****************************************/
 
void Read_temp()
 
{
 
Temp_Reset();  //总线复位
 
Temp_Write_byte(0xcc);//发skip ROM命令
 
Temp_Write_byte(0xbe);//发读命令
 
temp_data[0]=Temp_Read_byte();//读低8位
 
temp_data[1]=Temp_Read_byte();//读高8位
 
Temp_Reset();
 
Temp_Write_byte(0xcc);//发skip ROM命令
 
Temp_Write_byte(0x44); //温度变换
 
while(!DQ);
 
}
 
/************************温度数据处理函数************************************/
 
void Temp_Change()
 
{
 
bit n=0,n1=0,n2=0;
 
Tmp= ((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4); //记录当前的温度值,用于比较
 
if(temp_data[1]>127) // 温度为负时
 
{
 
temp_data[1]=(256-temp_data[1]);  //负温度求补码
 
temp_data[0]=(256-temp_data[0]);
 
n=1;
 
}                                                                  
 
display[0][6]=temp_data[0]&0x0f;
 
display[0][4]=LedTab[(uchar)display[0][6]*5/8]; //小数部分
 
display[0][6]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x0f)<<4);  //整数部分
 
display[0][1]=LedTab[display[0][6]/100]; //十六进制转BCD码
 
display[0][6]=display[0][6]%100;
 
display[0][2]=LedTab[display[0][6]/10]; //十位段码
 
display[0][3]=LedTab[(display[0][6]%10)]|0x80;    //个位段码带小数点
 
display[0][5]=LedTab[12]; //显示度
 
if(display[0][1]==LedTab[0]) //最高位为零时都不显示
 
{
 
display[0][1]=LedTab[10];
 
if(display[0][2]==LedTab[0]) //次高位处理
 
{
 
display[0][2]=LedTab[10];
 
}
 
}         [page]                                                   
 
if(n)  //负温度时最高位显示“-”
 
display[0][0]=LedTab[11];
 
else 
 
display[0][0]=LedTab[10];
 
//////////////////////////////////////////////////处理键盘值
 
if(Tmp_max>127) //最高温度上限处理
 
{
 
n1=1;
 
display[1][6]=(256-Tmp_max);  //负数去反
 
}
 
else
 
display[1][6]=Tmp_max;
 
display[1][1]=LedTab[display[1][6]/100];  //求最高位
 
display[1][6]=display[1][6]%100;   //求次高位
 
display[1][2]=LedTab[display[1][6]/10];
 
display[1][3]=LedTab[display[1][6]%10]|0x80;         //求个位段码带小数点
 
if(display[1][1]==LedTab[0]) //最高位为0不显示
 
{
 
display[1][1]=LedTab[10];
 
if(display[1][2]==LedTab[0])  //最高位为0次高位为0不显示
 
{
 
display[1][2]=LedTab[10];
 
}
 
}                                                            
 
if(n1)  //负温度时最高位显示“-”
 
display[1][0]=LedTab[11];
 
else 
 
{
 
display[1][0]=LedTab[10];   //不显示正
 
}
 
//////////////////////////////////////////////////////////////
 
if(Tmp_min>127) //最低温度下限处理
 
{
 
n2=1;
 
display[2][6]=(256-Tmp_min);  //取反
 
}
 
else
 
display[2][6]=Tmp_min;
 
display[2][1]=LedTab[display[2][6]/100];   //求最高位
 
display[2][6]=display[2][6]%100;    //求次高位
 
display[2][2]=LedTab[display[2][6]/10];
 
display[2][3]=LedTab[display[2][6]%10]|0x80;    //求个位段码带小数点
 
if(display[2][1]==LedTab[0]) //最高位为0不显示
 
{
 
display[2][1]=LedTab[10];
 
if(display[2][2]==LedTab[0]) //最高位为0次高位为0不显示
 
{
 
display[2][2]=LedTab[10];
 
}
 
}                                                            
 
if(n2)   
 
display[2][0]=LedTab[11];      //负温度时最高位显示“-”
 
else
 
{
 
display[2][0]=LedTab[10]; //不显示正
 
}   
 
}
 
/***************************键盘扫描***************************************/
 
void Key_scanf()
 
{
 
key1=KeyTab[KeyRvs()]; //读取键盘值
 
if(key2!=key1)   //防止连续跳动,释放按键
 
{
 
if(key1=='*') //mod选择
 
{
 
mod=mod%2+1;
 
num=5000;
 
}
 
if((key1=='0')&&(mod)) //按键加
 
{
 
num=5000;
 
if(mod==1)
 
{
 
if(Tmp_max==125) //最高上限温度
 
Tmp_max=202;  //最低温度下限
 
else
 
Tmp_max++;
 
}
 
if(mod==2)
 
{
 
if(Tmp_min==125)   //最高上限温度
 
Tmp_min=202;  //最低温度下限
 
else
 
Tmp_min++;
 
}
 
}
 
if((key1=='#')&&(mod))   //按键减
 
{
 
num=5000;
 
if(mod==1)
 
{
 
if(Tmp_max==202)      //最低温度下限
 
Tmp_max=125;   //最高上限温度
 
else
 
Tmp_max--;
 
}
 
if(mod==2)
 
{
 
if(Tmp_min==202)      //最低温度下限
 
Tmp_min=125; //最高上限温度
 
else
 
Tmp_min--;
 
}
 
}
 
if(key1=='D')    //确定以后把修改的数据保存起来
 
{
 
mod=0;  //恢复正常显示
 
EA=0;   //IIC写时候保护
 
while(!Write_Byte_iic(IICADDR,0xaa));      //写判断是否设置标志
 
while(!Write_Byte_iic(IICADDR+2,Tmp_max));   //写温度上限
 
while(!Write_Byte_iic(IICADDR+4,Tmp_min));   //写温度下限
 
EA=1;
 
}
 
}
 
key2=key1;   //键值保存。释放按键用
 
}
 
/**************************蜂鸣器报警***************************/
 
void Beep()
 
{
 
char a,b,c;
 
a=Tmp;b=Tmp_max;c=Tmp_min;
 
if((a>=b)||(a
				   
关键字:18B20  单片机  89C52  测温程序 引用地址:基于18B20和单片机89C52的测温程序

上一篇:A51与C语言的混合编程
下一篇:C8051F320-时钟和4in1八段管

推荐阅读最新更新时间:2024-03-16 14:26

C51单片机学习笔记(三)——按键对灯、蜂鸣器等器件的控制
1.独立按键的原理 一般的独立按键有四个脚,无论按键是否被按下,1和2总是相通的,3和4也是相通的。当按键按下时,1、2脚与3、4脚接通,按住不放则保持接通状态 按键通断过程的抖动:当按键按下时(释放时)输出的理想波形是标准的矩形波,但是,由于机械触点的弹性作用,闭合时电路不会马上稳定的接通,这中间会出现一连串的抖动,如图所示,抖动时间一般为5~10ms 按键的消抖:按键的抖动会造成一次按下被误认为多次按下,所以要进行消抖处理,一般分为硬件消抖和软件消抖,这里讨论软件消抖,方法是当单片机检测到按键闭合时,采用延时程序产生5~10ms的延时,等抖动消失后,再判断是否处于闭合状态,同理释放的时候,也要给延时。 按键给单片机
[单片机]
C51<font color='red'>单片机</font>学习笔记(三)——按键对灯、蜂鸣器等器件的控制
基于AVR单片机的智能分度头研究
在传统的机械加工行业中,采用较多的是分度精度低、分度柔性差、操作人员劳动强度大的手工分度头。随着计算机技术的发展,对机械设备的柔性化和自动化程度要求越来越高,加工精度的要求也越来越高。 目前国外先进水平的分度头一般采取半闭环控制系统,用伺服电机的编码器作为反馈回路的检测元件,每转脉冲数为2 500 P,精度较高,但价格也昂贵。如日本NIKKEN公司生产的数控分度头的分辨率可达到0.001 ,定位精度为15 。 国内很多单位也对数控分度头做了大量的理论研究和产品的开发工作,例如华中科技大学采用神经网络方法对分度头进行误差补偿,能够使分度误差达到15 ;山东烟台机床厂采用意大利技术,采用半闭环控制系统,使分度精度达到20 。 文中设
[单片机]
基于AVR<font color='red'>单片机</font>的智能分度头研究
单片机MSP430入门--理论④--时钟模块-BCSCTL2寄存器
上期大概给大家汇总介绍了,在MSP430环境下的时钟寄存器DOCCTL和BCSCTL1寄存器,每个位代表的意义以及他们的设置方法 本期将重点介绍下,在MSP430环境下的时钟寄存器BCSCTL2,他每个位的意义以及他们的设置方法 1.0 BCSCTL2(Basic Clock System Control2)寄存控制器(用来设置SMCLK子时钟,MCLK主时钟),地址为58H,初始值为00H SELM0-SELM1: 选择MCLK的时钟源,0和1为DCOCLK,2为XT2CLK,3为LFXT1CLK DIVM0-DIVM1: 选择MCLK的分频因子,DIVM=0,1,2,3,对应MCLK的分频因子1,2,4,8
[单片机]
<font color='red'>单片机</font>MSP430入门--理论④--时钟模块-BCSCTL2寄存器
逻辑运算与51单片机的位操作指令
一个单片机逻辑电路题目,要求编一程序实现下面逻辑电路的逻缉功能。 逻辑图: 悬赏分:20 | 解决时间:2011-1-2 22:53 ;------------------------------------------------------------ 最佳答案: 先把逻辑图写成如下的表达式:(用“P1.6\” 代表“P1.6 的非”,其它的也雷同) P3.0 = ((P1.0 * P1.1)\ * (P1.4 + P1.5)\) + P1.6\)\ 再反复应用摩根定理化简: P3.0 = ((P1.0 * P1.1)\ * (P1.4 + P1.5)\)\ * P1.6 P3.0 = ((P1.0 * P1
[单片机]
逻辑运算与51<font color='red'>单片机</font>的位操作指令
TLC1549串口传输与单片机的A/D设计
1 概述   TLC1549系列是美国德州仪器公司生产的具有串行控制、连续逐次逼近型的模数转换器,它采用两个差分基准电压高阻输入和一个三态输出构成三线接口,其中三态输出分别为片选(CS低电平有效),输入/输出时钟(I/O CLOCK),数据输出(DATAOUT)。TLC1549引脚排列如图1所示。TLC1549能以串行方式送给单片机,其功能结构如图2所示。由于TLC1549采用CMOS工艺。内部具有自动采样保持、可按比例量程校准转换范围、抗噪声干扰功能,而且开关电容设计使在满刻度时总误差最大仅为±1 LSB(4.8 mV),因此可广泛应用于模拟量和数字量的转换电路。 TLC1549在工作温度范围内的极限参数:   电源
[单片机]
TLC1549串口传输与<font color='red'>单片机</font>的A/D设计
卡尔曼滤波在单片机上的使用
#ifndef _KALMAN_H_ #define _KALMAN_H_ extern KalmanGain;// 卡尔曼增益 extern EstimateCovariance;//估计协方差 extern MeasureCovariance;//测量协方差 extern EstimateValue;//估计值 extern void KalmanFilterInit(void); extern KalmanFilter( Measure); #endif #include config.h #include math.h KalmanGain;// 卡尔曼增益 Estimat
[单片机]
卡尔曼滤波在<font color='red'>单片机</font>上的使用
利用AVR单片机制作电压表
通过研究和实验,用mega16可以制作5V电压。电压值从LED显示出来。 下面是部分源程序: uint mega16_ad() { uint addata; DDRD|=BIT(4)|BIT(5)|BIT(6); DDRA&=~BIT(PA3); PORTA&=~BIT(PA3); ADMUX=0x03; ADCSR=0X80;//转换使能 ADCSR|=BIT(ADSC);//开始转换 while(!(ADCSR&(BIT(ADIF))));//等待转换结束. addata=ADC*4.8876; //转换为四位5V电压数 return addata; } void main() {
[单片机]
基于8051增强型单片机的RJM8L系列超低功耗MCU介绍
对于一些采用电池供电的产品需要长达数年不换电池情况下能连续工作,系统低功耗设计就尤为重要。MCU微控制器的低功耗设计决定系统的成败关键。MCU微控制器的低功耗技术涉及到软件、系统和底层的硬件工艺等。对于应用来说,在空闲的时候,可以将其时钟关闭以节省动态功耗,或小部分电路以低速低功耗的方式运行,SRAM的读写动态功耗相当可观,因此应该尽量减少读写SRAM。 瑞纳捷针对低功耗应用推出了RJM8L151S和RJM8L003系列产品,已大量应用到各领域,如:烟雾报警器,LoRa模组,智能门锁,灯控设备,GPS定位器,安防探测器,电子烟等应用领域。 RJM8L151S和RJM8L003系列产品是基于8051增强型单片机,工作电压2.
[单片机]
基于8051增强型<font color='red'>单片机</font>的RJM8L系列超低功耗<font color='red'>MCU</font>介绍
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved