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

求助各位大侠帮我编写用数码管和DS18B20设计温度显示器的C语言程序,不要报警器和蜂鸣器的

发布网友 发布时间:2022-05-06 23:18

我来回答

4个回答

热心网友 时间:2023-10-27 07:13

======================================================================
#include"reg51.h" //包含头文件
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
float tt; //tt为采集的温度值
code uchar TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90}; //数码管段码
uchar str_TME[4]={0,0,0,0};
unsigned char MAX=30;
unsigned char MIN=10;
sbit DQ =P2^4; //定义通信端口
sbit fm =P2^7;
//短延时函数
void delay(unsigned int i)
{
while(i--);
}
//1ms延时函数
void delay1(uchar ms)
{
uchar i;
while(ms--)
for(i=0;i<125;i++);
}
//DS18B20初始化函数
Init_DS18B20(void)
{
unsigned char x=0;
DQ = 1; //DQ复位
delay(8); //稍做延时
DQ = 0; //单片机将DQ拉低
delay(80); //精确延时 大于 480us
DQ = 1; //拉高总线
delay(14);
x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delay(20);
}
//读一个字节
ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat=0;
for (i=8;i>0;i--)
{
DQ=0; // 给脉冲信号
dat>>=1;
DQ=1; // 给脉冲信号
if(DQ)
dat|=0x80;
delay(4);
}
return(dat);
}

//写一个字节
WriteOneChar(unsigned char dat)
{
unsigned char i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(5);
DQ=1;
dat>>=1;
}
delay(4);
}

//读取温度
ReadTemperature(void)
{
unsigned char a=0;
unsigned char b=0;
unsigned int t=0;

Init_DS18B20();
WriteOneChar(0xCC); // 跳过读序号列号的操作
WriteOneChar(0x44); // 启动温度转换
Init_DS18B20();
WriteOneChar(0xCC); //跳过读序号列号的操作
WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
return(tt);
}

uchar tmel=0;
uchar ad_dat;
bit sim=1;
/********************定时器中断函数********************/
void tme_tr0(void) interrupt 1
{
TL0=0xb0;
TH0=0x3c;
if(++tmel==20)
{
tmel=0;
sim=1;
}
}
/*****************定义数码管显示***************************/
sbit k1=P1^0;
sbit k2=P1^1;
sbit k3=P1^2;
sbit k4=P1^3;
void VAL_xs()
{
P0=TAB[str_TME[0]]; //?????
k1=0;
delay1(5);
k1=1;
P0=(TAB[str_TME[1]])&0x7f;
k2=0;
delay1(5);
k2=1;
P0=TAB[str_TME[2]];
k3=0;
delay1(5);
k3=1;
P0=0xc6;
k4=0;
delay1(5);
k4=1;
}

void changs() //数据转换
{
uchar tint,tfloat;
ReadTemperature();//读温度
tint=(int)(tt);
tfloat=(tt-tint)*100;
str_TME[0]=tint/10;
str_TME[1]=tint%10;
str_TME[2]=tfloat/10;
}
write_tempere_alarm()
{
if(((int)tt>MAX)||((int)tt<MIN ) )
{fm=0;}
else
{fm=1;}
}
main()
{
P1=0xc0;
IE=0x82;
TMOD=0x01;
IP=0x01;
TL0=0xb0;
TH0=0x3c;
TR0=1;
while(1)
{
VAL_xs();
write_tempere_alarm();
if(sim==1)
{changs();
sim=0;

}
}
}

这里加了报警器和蜂鸣器的
你不要的话删除就行了

热心网友 时间:2023-10-27 07:13

完全搞定,以下都是详解.看清楚,非常的详细
------------------------------------------------------------------------------------

#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P2^3; //DS18B20数据口
uchar code table[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

void delay(uint a) //延时
{
while(a--);//为了精准控制
}

void reset() //复位
{
DQ=0;
delay(50);
DQ=1;
delay(50);
}

void write_bit(uchar a) //写一位
{
DQ=0;
if(a) DQ=1;
delay(5);
DQ=1;
}

uchar read_bit() //读一位
{
DQ=0;
DQ=1;
delay(0);//需要非常准确控制时间 5US左右
return DQ;
}

void write_byte(char k) //写一个字节
{
uchar i,b;
for(i=0;i<8;i++)
{
b=k;
b=b>>i;//位操作 用于除2计算
write_bit(b&0x01);
delay(5);
}

}

uchar read_byte()//读一个字节
{
uchar i,m=1,s=0;
for(i=0;i<8;i++)
{
if(read_bit())s+=m<<i; //位操作 用于乘2计算
delay(5);
}
return s;
}

void display_smg(uint temp) //驱动数码管
{
uint i;
for(i=7;i>=0;i--)
{
P2=i;//位选
P0=table[temp%10]; //段选
temp/=10;
delay(500);
if(temp==0)break; //消零
}
}

main()
{
uchar temp_h,temp_l;
uint temp;
P0=0x00;
P2=0x00;
while(1)
{
reset(); //复位
write_byte(0xcc); //跳过搜索
write_byte(0x44); //温度转换
reset(); //复位
write_byte(0xcc); //跳过搜索
write_byte(0xbe); //要求读出数据
temp_l=read_byte(); //读出低八位
temp_h=read_byte(); //读出高八位
reset();//终止读数
temp=temp_h*16+temp_l/16;//转换低位和高位之和
display_smg(temp);//驱动数码管
}
}

------------------------------------------------------------------------------------------------------------

热心网友 时间:2023-10-27 07:13

前两天刚写了一个AVR的,自己看看手册,应该不太难。先将ID读出来,说明1wire就走通了。建议数码管用2003加573驱动。

热心网友 时间:2023-10-27 07:14

有戏了
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
2019哈尔滨煤气费怎么有税? 快手删除的作品如何恢复 体育理念体育理念 有关体育的格言和理念 什么是体育理念 万里挑一算彩礼还是见面礼 绿萝扦插多少天后发芽 绿萝扦插多久发芽 扦插绿萝多久发芽 炖牛排骨的做法和配料 智联怎么看自己刷简历的时间 谁知道老舍的文章,老舍的资料 在美团购买的销售产品,店家又推存别的产品。属于什么行为 老舍散文集主要内容 老舍散文的介绍 帮奶茶店取个好名字? 没有开红酒的东西怎么开 红酒没有工具怎么开?? 葡萄酒瓶盖没起子怎么开? 没有酒开的话怎么开红酒呢? 如果没有开红酒的开刀该怎么开红酒 租房子交了押金不想租了能退吗 租房没签合同交了押金能退吗? 租房交了押金不想租可以退吗 赠与公证可以撤销吗 家用电脑是怎么样连入因特网 公共邮箱注册过但未激活,还可以申请吗 党在推进反腐倡廉建设方面应发挥的领导作用 怎么手动将电脑连接到因特网? 关于开展治理商业贿赂专项工作的意见 单片机我要用数码管显示温度传感器测得的温度,但是不能完全理解这段程序 在单片机设计中,用数字温度传感器 DS18B20 在数码管上显示温度,还要加其他器件吗? 用51单片机测室内温度并通过数码管显示出来 鱼缸温度显示器显示e 胃贲门亚蒂息肉亚蒂就是无根的意思吗 求51单片机、一个18b20测温,数码管显示的电路,制作数字温度显示器 为什么直肠息肉宜手术? 如何让数码管显示温度传感器的温度值? 胃镜检查发很多细小息肉是否要开刀 3位半数字显示温度计数码管接多大电阻 设计一个温度计,数码管显示温度和时间。急急急 人生无根蒂,飘如陌上尘,分散逐风转,此已非常身,荣华梦一场,功名纸半张什么意? 求一个简易的用单片机做温度计(两个数码管显示)的程序 人生无根蒂飘如陌上尘中的陌上尘是什么意思 如何用ad转换器做一个数字温度计 浮云柳絮无根蒂,天地阔远随风扬 什么意思 毕设用5110显示湿度.温度.时间好还是用数码管显示好? 多发性息肉什么意思 K型热电偶采集的温度,经过MAX6675转换以后,用数码管不能实时显示温度值,什么原因了 假性尖锐湿疣和尖锐湿疣有什么区别吗?