找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3774|回复: 2
收起左侧

51单片机DS18b20温度传感器

[复制链接]
ID:391775 发表于 2018-8-31 08:05 | 显示全部楼层 |阅读模式
#include<reg52.h>
#include<port.h>
#include<18b20.h>
#include<1602.h>
#include<delay.h>
char InitTemp=26;
int i=0;
unsigned int temphex;
float tempfloat;//存放DS18B20采集的温度值-小数
unsigned char temp[];
sbit KEYPLUS=P3^2;  //定义温度加按键输入端口
sbit KEYMINUS=P3^3;  //定义温度减按键输入端口
void InitKey(void)           //外部按键中断初始化
{
  EA=1;          //全局中断开
  EX0=1;         //外部中断0开
  IT0=1;         //边沿触发

  EX1=1;         //外部中断1开
  IT1=1;         //IT1=1表示边沿触发
}
void Init_Port(void)    //串口初始化
{
  SCON=0x40;         //
  TMOD=0x20;        //定时器T1初始化
  PCON=0x00;               
  TH1=0xFD;
  TL1=0xFD;
  TR1=1;
}
void Init_Timer0(void)    //定时器0初始化
{
TMOD |= 0x01;          //使用模式1,16位定时器,使用"|"符号可以在使用多个定时器时不受影响                     
TH0=0x00;              //给定初值,这里使用定时器最大值从0开始计数一直到65535溢出
TL0=0x00;
EA=1;            //总中断打开
ET0=1;           //定时器中断打开
TR0=1;           //定时器开关打开
}
void  Init_Temp_OnComputer(char temperature)
{  
  SendByte(temperature/10+0x30);
  SendByte(temperature%10+0x30);
  SendByte('C');
}
void  Display_18b20_OnComputer(float temperature)
{
  unsigned long int wendu;
  wendu=temperature*10000;//此变量类型一定要设置为unsigned long int,若定义为unsigned int则溢出
  SendStr("实时温度:");
  SendByte(wendu/1000000+0x30); //百位
  SendByte(wendu%1000000/100000+0x30);//十位
  SendByte(wendu%100000/10000+0x30);//个位
  SendByte('.');
  SendByte(wendu%10000/1000+0x30);//小数点后第1位,小数点后千位
  SendByte(wendu%1000/100+0x30);//小数点后第2位,小数点后百位
  SendByte(wendu%100/10+0x30);//小数点后第3位,小数点后十位
  SendByte(wendu%10+0x30);//小数点后第4位,小数点后个位
  SendByte('C');//温度单位
  SendByte('\r');    //SendByte(0x0D);  SendByte(0x0A);                  换行
  SendByte('\n');
}
void Display_LCD_OnLCD(float temperature)
{
unsigned long int wendu;
  wendu=temperature*10000;//此变量类型一定要设置为unsigned long int,若定义为unsigned int则溢出
  LCD_Write_Char(6,1,'+');
  LCD_Write_Char(7,1,wendu/1000000+0x30);
  LCD_Write_Char(8,1,wendu%1000000/100000+0x30);
  LCD_Write_Char(9,1,wendu%100000/10000+0x30);
  LCD_Write_Char(10,1,'.');
  LCD_Write_Char(11,1,wendu%10000/1000+0x30);
  LCD_Write_Char(12,1,wendu%1000/100+0x30);
  LCD_Write_Char(13,1,wendu%100/10+0x30);
  LCD_Write_Char(14,1,wendu%10+0x30);
  LCD_Write_Char(15,1,'C');
}
void main()
{
        InitKey();
        Init_Port();
        LCD_Init();
        LCD_Write_String(0,0,"SetTemp:");
        LCD_Write_String(0,1,"MTemp:");
    LCD_Write_Char(8,0,'2');
        LCD_Write_Char(9,0,'6');
        LCD_Write_Char(10,0,'C');
        Init_Timer0();
        while(1);
}
/*------------------------------------------------
                 定时器中断子程序
------------------------------------------------*/
void Timer0_isr(void) interrupt 1
{
static unsigned int j;
// ET0=0;           //定时器中断打开
// TR0=0;


j++;
if(j==51)
{
   j=0;
   temphex=ReadTemperature();    //定时时间1s到,采集一次温度数据
   tempfloat=(float)temphex*0.0625;//16进制温度数据转换为实际温度值
   Display_18b20_OnComputer(tempfloat);
   Display_LCD_OnLCD(tempfloat);
}

TH0=(65536-10000)/256;                  //重新赋值 12M晶振计算,指令周期1uS,
                              //采集间隔10s,由于定时器
                              //最大值65536 即65.536ms 所以
TL0=(65536-10000)%256;       //直接定时器不够用,需要用循环处理,
                              //定时10ms,然后循环1000次后输出 1000x10ms=10s
// ET0=1;           //定时器中断打开
//TR0=1;

}
/*------------------------------------------------
                 外部中断0程序-温度加
------------------------------------------------*/
void ISR_INT0(void) interrupt 0
{
   DelayMs(5);
   if(!KEYPLUS)     //再次确认按键是否按下,没有按下则退出
           {
        while(!KEYPLUS);//如果确认按下按键等待按键释放,没有释放则一直等待
           {
              InitTemp++;            //KEYPLUS按下触发一次,温度值加1
              LCD_Write_String(0,0,"SetTemp:");
                      LCD_Write_Char(8,0,InitTemp/10+0x30);
                          LCD_Write_Char(9,0,InitTemp%10+0x30);
                          LCD_Write_Char(10,0,'C');
                          SendStr("设置温度值:");
                          Init_Temp_OnComputer(InitTemp);   //发送设定的加减温度值
                          SendByte('\r');
                            SendByte('\n');
            }
       }
       

}
/*------------------------------------------------
                 外部中断1程序-温度减
------------------------------------------------*/
void ISR_INT1(void) interrupt 2
{
   DelayMs(5);
   if(!KEYMINUS)     //再次确认按键是否按下,没有按下则退出
           {
        while(!KEYMINUS);//如果确认按下按键等待按键释放,没有释放则一直等待
           {
              InitTemp--;            //KEYMINUS按下触发一次,温度值减1
                          LCD_Write_String(0,0,"SetTemp:");
                      LCD_Write_Char(8,0,InitTemp/10+0x30);
                          LCD_Write_Char(9,0,InitTemp%10+0x30);
                          LCD_Write_Char(10,0,'C');
                             SendStr("设置温度值:");
                          Init_Temp_OnComputer(InitTemp);   //发送设定的加减温度值
                             SendByte('\r');
                            SendByte('\n');
            }
       }
}

回复

使用道具 举报

ID:1 发表于 2018-8-31 15:16 | 显示全部楼层
补全原理图或者详细说明一下电路连接即可获得100+黑币
回复

使用道具 举报

ID:1 发表于 2018-8-31 15:17 | 显示全部楼层
还有头文件
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表