导航:首页 > 编程语言 > 18b20和显示程序

18b20和显示程序

发布时间:2024-03-25 16:09:26

⑴ DS18B20的程序

接上18B20温度传感器后数码管显示出当前温度
#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DS=P2^2; //define interface
uint temp; // variable of temperature
uchar flag1; // sign of the result positive or negative
sbit la=P2^6;
sbit wela=P2^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
unsigned char code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef};

void delay(uint count) //delay
{
uint i;
while(count)
{
i=200;
while(i>0)
i--;
count--;
}
}
///////功能:串口初始化,波特率9600,方式///////
void Init_Com(void)
{
TMOD = 0x20;
PCON = 0x00;
SCON = 0x50;
TH1 = 0xFd;
TL1 = 0xFd;
TR1 = 1;
}

void dsreset(void) //send reset and initialization command
{
uint i;
DS=0;
i=103;
while(i>0)i--;
DS=1;
i=4;
while(i>0)i--;
}

bit tmpreadbit(void) //read a bit
{
uint i;
bit dat;
DS=0;i++; //i++ for delay
DS=1;i++;i++;
dat=DS;
i=8;while(i>0)i--;
return (dat);
}

uchar tmpread(void) //read a byte date
{
uchar i,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1); //读出的数据最低位在最前面,这样刚好一个字节在DAT里
}
return(dat);
}

void tmpwritebyte(uchar dat) //write a byte to ds18b20
{
uint i;
uchar j;
bit testb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb) //write 1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0; //write 0
i=8;while(i>0)i--;
DS=1;
i++;i++;
}

}
}

void tmpchange(void) //DS18B20 begin change
{
dsreset();
delay(1);
tmpwritebyte(0xcc); // address all drivers on bus
tmpwritebyte(0x44); // initiates a single temperature conversion
}

uint tmp() //get the temperature
{
float tt;
uchar a,b;
dsreset();
delay(1);
tmpwritebyte(0xcc);
tmpwritebyte(0xbe);
a=tmpread();
b=tmpread();
temp=b;
temp<<=8; //two byte compose a int variable
temp=temp|a;
tt=temp*0.0625;
temp=tt*10+0.5;
return temp;
}

void readrom() //read the serial
{
uchar sn1,sn2;
dsreset();
delay(1);
tmpwritebyte(0x33);
sn1=tmpread();
sn2=tmpread();
}

void delay10ms() //delay
{
uchar a,b;
for(a=10;a>0;a--)
for(b=60;b>0;b--);
}

void display(uint temp) //显示程序
{
uchar A1,A2,A2t,A3,ser;
ser=temp/10;
SBUF=ser;
A1=temp/100;
A2t=temp%100;
A2=A2t/10;
A3=A2t%10;
la=0;
P0=table[A1]; //显示百位
la=1;
la=0;

wela=0;
P0=0x7e;
wela=1;
wela=0;
delay(1);

la=0;
P0=table1[A2]; //显示十位
la=1;
la=0;

wela=0;
P0=0x7d;
wela=1;
wela=0;
delay(1);

P0=table[A3]; //显示个位
la=1;
la=0;

P0=0x7b;
wela=1;
wela=0;
delay(1);
}

void main()
{
uchar a;
Init_Com();
do
{
tmpchange();
// delay(200);
for(a=10;a>0;a--)
{ display(tmp());
}
} while(1);
}

⑵ 18b20和51单片机实现温度显示,求程序

//按照我的电路图我这是四位有负温度显示你可以看一下。有什么问题可以问我?

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

created:2010/07/27

created:27:7:201010:27

filename:D:KeilDebugds18b20.c

filepath:D:KeilDebug

filebase:ds18b20

fileext:c

author:HonguoZHU

purpose:

//DS18B20的读写程序,数据脚P2.7

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

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

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

//P0口为段码输入,P34~P37为位选

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

#include"reg51.h"

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

#defineDisdataP0//段码输出口

#definediscanP3//扫描口

#defineucharunsignedchar

#defineuintunsignedint

#defineREADROM_18b20_CM0x33

#defineMATCHROM_18b20_CM0x55

#defineSKIPROM_18b20_CM0xCC

#defineSEARCHROM_18b20_CM0xF0

#defineALARMSEARCH_18b20_CM0xEC

#defineCONVERTT_CM0x44

#defineRSCRATCHPAD_CM0xBE

#defineWSCRATCHPAD_CM0x4E

#defineCSCRATCHPAD_CM0x48

#defineRECALLE2_CM0xB8

#defineRPOWERSUNNLY_CM0xB4

sbitDQ=P2^7;//温度输入口

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

//

//

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

ucharcodeditab[16]=

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

//

ucharcodedis_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""不亮""-"

ucharcodescan_con[4]={0x8f,0x4f,0x2f,0x1f};//列扫描控制字

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

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

//

//

//

/*****************11us延时函数*************************/

//

voiddelay(uintt)

{

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

}

//

/****************显示函数******************************/

scan()

{

chark;

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

{

Disdata=0xff;//

discan=scan_con[k];//位选

Disdata=dis_7[display[k]];//数据显示

if(k==1)

{

DIN=0;

}//小数点显示

delay(300);

}

}

//

//

/****************DS18B20复位函数************************/

ow_reset(void)

{

charpresence=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;//拉高电平

}

//

//

/****************DS18B20写命令函数************************/

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

voidwrite_byte(ucharval)

{

uchari;

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

{

DQ=1;_nop_();_nop_();//从高拉倒低

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

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

delay(6);//66us

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

}

DQ=1;

delay(1);

}

//

/****************DS18B20读1字节函数************************/

//从总线上取1个字节

ucharread_byte(void)

{

uchari;

ucharvalue=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);

}

//

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

//

uintread_temp()

{

uinttemp;

//ow_reset();//总线复位

//delay(200);

//write_byte(SKIPROM_18b20_CM);//发命令

//write_byte(CONVERTT_CM);//发转换命令

ow_reset();

delay(1);

write_byte(SKIPROM_18b20_CM);//发命令

write_byte(RSCRATCHPAD_CM);

temp_data[0]=read_byte();//读温度值的第字节

temp_data[1]=read_byte();//读温度值的高字节

temp=temp_data[1];

temp<<=8;

temp=temp|temp_data[0];//两字节合成一个整型变量。

returntemp;//返回温度值

}

//

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

//二进制高字节的低半字节和低字节的高半字节组成一字节,这个

//字节的二进制转换为十进制后,就是温度值的百、十、个位值,而剩

//下的低字节的低半字节转化成十进制后,就是温度值的小数部分

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

work_temp(uinttem)

{

ucharn=0;

if(tem>6348)//温度值正负判断

{

tem=65536-tem;

n=1;

}//负温度求补码,标志位置1

display[4]=tem&0x0f;//取小数部分的值

display[0]=ditab[display[4]];//存入小数部分显示值

display[4]=tem>>4;//取中间八位,即整数部分的值

display[3]=display[4]/100;//取百位数据暂存

display[1]=display[4]%100;//取后两位数据暂存

display[2]=display[1]/10;//取十位数据暂存

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

/******************符号位显示判断**************************/

if(!display[3])

{

display[3]=0x0a;//最高位为0时不显示

if(!display[2])

{

display[2]=0x0a;//次高位为0时不显示

}

}

if(n)

{

display[3]=0x0b;

}//负温度时最高位显示"-"

}

//

//

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

main()

{

uinth;

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

discan=0xff;

for(h=0;h<4;h++)//开机显示"0000"

{display[h]=0;}

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

write_byte(SKIPROM_18b20_CM);//SkipROM

write_byte(CONVERTT_CM);//发转换命令

for(h=0;h<100;h++)//开机显示"0000"

{scan();}

while(1)

{

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

scan();//显示温度值

}

}

//

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

阅读全文

与18b20和显示程序相关的资料

热点内容
能力考试背日语单词app 浏览:804
rpc文件被删 浏览:337
有一部电影叫晓月是个寡妇 浏览:532
java图形数组 浏览:162
韩国末日轮船电影免费 浏览:888
抗战兑换军火类小说 浏览:977
在线看网址大全 浏览:689
同性恋男电影 浏览:796
kettle大数据效率 浏览:725
在网站提交文件提交不了该怎么办 浏览:680
有一部关于射箭的外国电影 浏览:157
上海点合网络技术 浏览:100
阿甘正传主人公叫什么 浏览:353
信用卡客户数据库 浏览:714
湖北延长产假的文件哪里找 浏览:155
牛蛙吃人的电影名字 浏览:93
免费鬼片观看 浏览:342
在线免费观看韩国高分爱情片韩国伦理片 浏览:707
mod是什么文件 浏览:777
韩国女保姆的电影 浏览:788

友情链接