问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

急求教大哥大姐们基于51单片机的数字温度计设计7

发布网友 发布时间:2023-10-03 04:57

我来回答

6个回答

热心网友 时间:2024-12-12 19:32

//DS18B20的读写程序,数据脚P3.3                     //

//温度传感器18B20汇编程序,采用器件默认的12位转化   //

//最大转化时间750微秒,显示温度-55到+125度,显示精度 //

//为0.1度,显示采用4位LED共阳显示测温值            //

//P0口为段码输入,P24~P27为位选                       //

/***************************************************/

#include "reg51.h"

#include "intrins.h"                            //_nop_();延时函数用

#define  Disdata P0                             //段码输出口

#define  discan  P2                             //扫描口

#define  uchar unsigned char

#define  uint  unsigned int

sbit     DQ=P3^3;                               //温度输入口

sbit     DIN=P0^7;                              //LED小数点控制

uint     h; 

uchar flag;

//**************温度小数部分用查表法***********//

uchar code ditab[16]=

{0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};

//

uchar code dis_7[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff,0xbf};

//共阳LED段码表        "0"  "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9" "不亮" "-"              

uchar code scan_con[4]={0x7f,0xbf,0xdf,0xef};    //列扫描控制字

uchar data temp_data[2]={0x00,0x00};             //读出温度暂放

uchar data display[5]={0x00,0x00,0x00,0x00,0x00};     //显示单元数据,共4个数据和一个运算暂用

//

//

//

/***********11微秒延时函数**********/

//

void delay(uint t)

{

for(;t>0;t--);

}

//

/***********显示扫描函数**********/

scan()

{

char k;

    for(k=0;k<4;k++)         //四位LED扫描控制

     {

  Disdata=0xff;

      Disdata=dis_7[display[k]];

      if(k==1){DIN=0;}

      discan=scan_con[k];delay(90);

   discan=0xff;

     }

}

//

//

/***********18B20复位函数**********/

ow_reset(void)

{

char presence=1;

while(presence)

{

while(presence)

{

DQ=1;_nop_();_nop_();

DQ=0;    //

delay(50); // 550us

DQ=1;    // 

delay(6); // 66us

presence=DQ; // presence=0继续下一步

   }

delay(45);    //延时500us

presence = ~DQ;

}

DQ=1;

//

//

/**********18B20写命令函数*********/

//向 1-WIRE 总线上写一个字节

void write_byte(uchar val)

{

uchar i;

for (i=8; i>0; i--) //

{

DQ=1;_nop_();_nop_(); 

DQ = 0;_nop_();_nop_();_nop_();_nop_();_nop_();//5us

DQ = val&0x01;      //最低位移出

delay(6);           //66us

val=val/2;          //右移一位

}

DQ = 1;

delay(1); 

}

//

/*********18B20读1个字节函数********/

//从总线上读取一个字节

uchar read_byte(void)

{

uchar i;

uchar value = 0;

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

{

DQ=1;_nop_();_nop_();

value>>=1;

DQ = 0;             //

_nop_();_nop_();_nop_();_nop_();   //4us

DQ = 1;_nop_();_nop_();_nop_();_nop_();   //4us 

if(DQ)value|=0x80;

delay(6);           //66us

}

DQ=1;

return(value);

}

//

/***********读出温度函数**********/

//

read_temp()

{

ow_reset();       //总线复位

write_byte(0xCC); // 发Skip ROM命令

write_byte(0xBE); // 发读命令

temp_data[0]=read_byte(); //温度低8位

temp_data[1]=read_byte(); //温度高8位

ow_reset();

write_byte(0xCC); // Skip ROM

write_byte(0x44); // 发转换命令

}

//

/***********温度数据处理函数**********/

void work_temp()

{

uchar n=0;

uchar doth,dotl;

uchar flag3=1,flag2=1;       //数字显示修正标记

if((temp_data[1]&0xf8)!=0x00)

{

   temp_data[1]=~(temp_data[1]);

   temp_data[0]=~(temp_data[0])+1;

   n=1;

   flag=1;

}//负温度求补码

if(temp_data[0]>255)

{

temp_data[1]++; 

}

display[4]=temp_data[0]&0x0f;

display[0]=ditab[display[4]];

doth=display[0]/10;

dotl=display[0]%10;

display[4]=((temp_data[0]&0xf0)>>4)|((temp_data[1]&0x07)<<4);

display[3]=display[4]/100;

display[2]=display[4]/10%10;

display[1]=display[4]%10;

if(!display[3])

   {

    display[3]=0x0a;

    flag3=0;

    if(!display[2])

    {

     display[2]=0x0a;

     flag2=0;

    }

   }//最高位为0时都不显示

if(n)

{

   display[3]=0x0b;//负温度时最高位显示"-"

   flag3=0;

}

}

// 

//

/**************主函数****************/

main()

{

Disdata=0xff;    //初始化端口

discan=0xff;

for(h=0;h<4;h++){display[h]=8;}//开机显示8888

ow_reset();       // 开机先转换一次

write_byte(0xCC); // Skip ROM

write_byte(0x44); // 发转换命令

for(h=0;h<500;h++)

   {scan();}          //开机显示"8888"2秒

while(1)

{

read_temp();         //读出18B20温度数据

work_temp();         //处理温度数据

   scan();        //显示温度值2秒

}

}

//

//*********************结束**************************//

热心网友 时间:2024-12-12 19:32

我主页上有 18B20的程序

热心网友 时间:2024-12-12 19:33

这个不是一句做好,说一句谢谢就能给你的,除非是现成的.......

热心网友 时间:2024-12-12 19:34

区区20分,小气得很。
发到你邮箱,懒得很。

热心网友 时间:2024-12-12 19:34

我有一个精度到0.1℃的程序可以给你参考下

/****************************************
//DS18B20温度传感器//
****************************************/

/*****************************************************/
//包含头文件
#include<reg51.h>
#include<stdio.h>

/*****************************************************/
typedef unsigned char uint8; //定义8位无符号变量
typedef unsigned int uint16; //定义16位无符号变量

/*****************************************************/
//定义引脚(根据硬件改变)
sbit BCD4 = P2^7;
sbit BCD3 = P2^6;
sbit BCD2 = P2^5;
sbit BCD1 = P2^4;
sbit DQ = P1^3; //温度传感器数据引脚通信定义
sbit BEEP = P1^4; //蜂鸣器信号引脚

/**********************************************************************************************/
const uint8 Code[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90}; //定义数字显示数组为常量
//0, 1, 2 3 4 5 6 7 8 9

#define C 0xc6 //显示'C', 表示温度符号

/************************************************************/
//全局变量
uint16 Htemperature = 0;
uint16 Ltemperature = 0;
uint8 setupflag = 0;

/************************************************************/
//定义ds18b20,数码管延时子函数
void mDelay(uint8 Delay)
{
while(Delay--);
}

//定义按键延时子程序
void Delay(uint8 Delay)
{ uint8 i;
for(;Delay>0;Delay--)
{
for(i=0;i<200;i++);
}
}

/************************************************************/
//温度传感器DS18B20的初始化函数
uint8 Init_DS18B20(void)
{
DQ = 1; //DQ复位信号
DQ = 0; //初始化发送一复位脉冲
mDelay(600); //脉冲时间大于480us
DQ = 1;
mDelay(100);
return(0xff);
}

/************************************************************/
//读一个字节
uint8 ReadOneChar(void)
{
uint8 i = 0;
uint8 dat = 0;
for(i=8;i>0;i--)
{
DQ = 0; //低电平脉冲信号
dat>>=1; //dat右移一位
DQ = 1; //高低平脉冲信号
if(DQ)
{
dat |= 0x80;
}
mDelay(10);//延时
}
return(dat); //返回dat值
}

/************************************************************/
//写一个字节
void WriteOneChar(uint8 dat)
{
uint8 i = 0;
for(i=8;i>0;i--)
{
DQ = 0; //低电平脉冲信号
DQ = dat&0x01;
mDelay(10);//延时
DQ = 1; //高电平脉冲信号
dat >>= 1;//dat右移一位
}
mDelay(4);
}

/************************************************************/
//读取温度
uint16 ReadTemperature(void)
{
uint8 ltemp = 0; //定义温度高八位
uint8 htemp = 0; //定义温度低八位
float temp = 0;
mDelay(255);
Init_DS18B20(); //温度传感器DS18B20初始化
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
ltemp = ReadOneChar(); //读取温度值低位
htemp = ReadOneChar(); //读取温度值高位
temp = htemp;
temp = (htemp<<8) | ltemp;
temp = temp * 0.0625 ;
temp = temp* 10;
return temp;
}

/******************************************************************/
//温度显示函数
void DisplayTemperture(uint16 temp)
{
P0=Code[temp/100%10];
BCD4 = 0;
mDelay(100);
BCD4 = 1;

P0 = Code[temp/10%10] & 0x7F;
BCD3 = 0;
mDelay(100);
BCD3 = 1;

P0 = Code[temp%10];
BCD2 = 0;
mDelay(100);
BCD2 = 1;

P0 = C;
BCD1 = 0;
mDelay(100);
BCD1 = 1;
}

/******************************************************************/
//温度设置函数
void SetupTemperature(void)
{
Htemperature = 100;
Ltemperature = 600;
}

/*******************************************************************/
//主函数
void main(void)
{
uint16 CurrentTemp;

//BEEP = 1; //关闭蜂鸣器
SetupTemperature(); //设置温度

//主循环
while(1)
{
CurrentTemp = ReadTemperature(); //读取温度
DisplayTemperture(CurrentTemp); //显示温度

if(CurrentTemp > Htemperature) //当温度高于预设最高温度,报警
{
BEEP = 0;
Delay(10);
BEEP = 1;
}
if(CurrentTemp < Ltemperature) //当温度低于预设最低温度,报警
{
BEEP = 0;
Delay(10);
BEEP = 1;
}
}
}

热心网友 时间:2024-12-12 19:35

匿名回答 你经典的很
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
天将雄师观后感600字 为什么喝酒会降血糖 牛栏山 52度浓香型白酒-购买最佳价格 全兴大曲 52度浓香型白酒-购买最佳价格 笔记本电脑怎么接音箱电脑如何连接外置音箱 笔记本电脑有音箱插孔吗笔记本电脑如何连接喇叭 冰箱压缩机过热启动5秒就停了 周长相等的正方形和圆,其面积比是多少 周长相等的正方形和圆面积比是多少 周长相等的正方形与圆形,边长与半径的比是( ),面积之比是( )。 要有... 用AT89C51单片机和温度传感器DS18B20S设计数字式... 网上银行是不是很容易被黑客攻击?网上银行到底安全不?1 网上银行存在哪些风险11 网上银行安全吗,我不懂。银行到底会有什么危险。大概讲哈 网上银行的安全性7 穷二代与富二代作文 我想寄100斤的东西回家邮政的大概要多少钱…急10 洛杉矶湖人主场球票多少钱,我要最靠前的座位 消毒柜按键按下去弹不起来怎么回事?2 基于51单片机的温度计设计问题!温度传感器的选择? 绍兴品诚网络技术有限公司怎么样? 广州市天河区林和东路沾益直街121号怎么做公交车去啊?1 三个杯口朝上的杯子每次同时翻转两个怎么让他动三次后杯口朝下19 小米6两个卡槽,电话卡放哪个卡槽都可以吗28 广州121A最新公交车路线有谁知道4 内存条与硬盘的区别是什么?703 在原先表的基础上增加一列SQL语句怎么写?24 sql给表中某列数据同时加1的语句8 SQL语句如何按指定id增加一列对应的内容 海通证券公司潜力怎么样?海通证券股市主力流入?海通证券什么时... 利用89c51单片机,制作温度传感器的温度控制c程序和图 关于石材的知识31 求基于51单片机的温度传感器的程序和电路图,一定要自己做成功... 基于单片机的温度控制器的设计 用AT89S51单片机如何做数...9 谁能帮我把(广州用)的英语课本中初一至初三的所有短语(页数为...16 大家有没有在中外运淄博公司工作的啊!我想问下成为正式员工之后...2 谁能帮我整理一下英语中关于put的短语411 深圳乐玩时空科技有限公司怎么样? 我用同一个手机号申请了两个后,原来那个不能登了该...5 大伙知道乐玩游戏怎样吗?3 为什么我玩DOTA2这么卡? 求助VMware Workstation虚拟机一机启动电脑就...2 动迁了买不起房子了是否可以申请廉租房或经济适用房3 散发着什么的课本填空28 填空题:什么的教科书14 显卡功率150w,要求450w以上电源,我的电源是400w的...2 课本填空 请问这个电脑蓝屏是什么问题,如何解决1 书本是什么什么~填空34 为什么要选择一汽红旗H5呢?