DS18B20MSP4304位数码管显示温度.docx

上传人:b****1 文档编号:23000673 上传时间:2023-04-30 格式:DOCX 页数:11 大小:16.41KB
下载 相关 举报
DS18B20MSP4304位数码管显示温度.docx_第1页
第1页 / 共11页
DS18B20MSP4304位数码管显示温度.docx_第2页
第2页 / 共11页
DS18B20MSP4304位数码管显示温度.docx_第3页
第3页 / 共11页
DS18B20MSP4304位数码管显示温度.docx_第4页
第4页 / 共11页
DS18B20MSP4304位数码管显示温度.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

DS18B20MSP4304位数码管显示温度.docx

《DS18B20MSP4304位数码管显示温度.docx》由会员分享,可在线阅读,更多相关《DS18B20MSP4304位数码管显示温度.docx(11页珍藏版)》请在冰豆网上搜索。

DS18B20MSP4304位数码管显示温度.docx

DS18B20MSP4304位数码管显示温度

DS18B20MSP4304位数码管显示温度

//实验材料:

MSP430F149开发板,DS18B20一个,杜邦线15条,3元普通4位共阴极数码管一个

//由于本人没有排阻,没有采用灌电流方式给4位共阴极数码管供电,MSP430的I/O口直接接4位共阴极数码管的12个脚

//接线说明:

DS18B20数据口接P17,电源接3.3V直流;P40~P47接数码管a、b、c、d、e、f、g、dp

//P50~P53接位1、位2、位3,位4,数码管接线图请XX

//MadeByZhongSirFromWuhanUniversity

#include

//延时函数

#defineCPU_F((double)8000000)//外部高频晶振8MHZ

//#defineCPU_F((double)32768)//外部低频晶振32.768KHZ

#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))

#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))

//自定义数据结构

#defineucharunsignedchar

#defineuintunsignedint

#defineulongunsignedlong

//DS18B20控制脚,单脚控制

#defineDQ_INP1DIR&=~BIT7//DS18B20接单片机P17口

#defineDQ_OUTP1DIR|=BIT7//设置输出

#defineDQ_CLRP1OUT&=~BIT7//置低电平

#defineDQ_SETP1OUT|=BIT7//置高电平

#defineDQ_RP1IN&BIT7//读电平

inttemp_value;

inttemp;//定义的变量,显示数据处理

intA1,A2,A3;

 

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

//系统时钟初始化,外部8M晶振

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

voidClock_Init()

{

uchari;

BCSCTL1&=~XT2OFF;//打开XT2振荡器

BCSCTL2|=SELM1+SELS;//MCLK为8MHZ,SMCLK为8MHZ

do{

IFG1&=~OFIFG;//清楚振荡器错误标志

for(i=0;i<100;i++)

_NOP();

}

while((IFG1&OFIFG)!

=0);//如果标志位1,则继续循环等待

IFG1&=~OFIFG;

}

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

//MSP430内部看门狗初始化

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

voidWDT_Init()

{

WDTCTL=WDTPW+WDTHOLD;//关闭看门狗

}

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

//初始化IO口子程序

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

voidPort_Init()

{

P5DIR=0xFF;//设置IO口方向为输出

P4DIR=0xFF;//P2口初始设置为FF

}

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

//DS18B20初始化

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

unsignedcharDS18B20_Reset(void)//初始化和复位

{

unsignedchari;

DQ_OUT;

DQ_CLR;

delay_us(500);//延时500uS(480-960)

DQ_SET;

DQ_IN;

delay_us(80);//延时80uS

i=DQ_R;

delay_us(500);//延时500uS(保持>480uS)

if(i)

{

return0x00;

}

else

{

return0x01;

}

}

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

//DS18B20读一个字节函数

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

unsignedchards1820_read_byte(void)

{

unsignedchari;

unsignedcharvalue=0;

for(i=8;i!

=0;i--)

{

value>>=1;

DQ_OUT;

DQ_CLR;

delay_us(4);//*延时4uS

DQ_SET;

DQ_IN;

delay_us(10);//*延时10uS

if(DQ_R)

{

value|=0x80;

}

delay_us(60);//*延时60uS

}

return(value);

}

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

//向18B20写一个字节函数

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

/*DS18B20字节写入函数*/

voidds1820_write_byte(unsignedcharvalue)

{

unsignedchari;

for(i=8;i!

=0;i--)

{

DQ_OUT;

DQ_CLR;

delay_us(4);//延时4uS

if(value&0x01)

{

DQ_SET;

}

delay_us(80);//延时80uS

DQ_SET;//位结束

value>>=1;

}

}

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

//发送温度转换命令

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

/*启动ds1820转换*/

voidds1820_start(void)

{

DS18B20_Reset();

ds1820_write_byte(0xCC);//勿略地址

ds1820_write_byte(0x44);//启动转换

}

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

//DS8B20读取温度信息

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

unsignedintds1820_read_temp(void)

{

unsignedinti;

unsignedcharbuf[9];

DS18B20_Reset();

ds1820_write_byte(0xCC);//勿略地址

ds1820_write_byte(0xBE);//读取温度

for(i=0;i<9;i++)

{

buf[i]=ds1820_read_byte();

}

i=buf[1];

i<<=8;

i|=buf[0];

temp_value=i;

temp_value=(uint)(temp_value*0.625);

//不是乘以0.0625的原因是为了把小数点后一位数据也转化为可以显示的数据

returni;

}

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

//温度数据处理函数

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

voiddata_do(inttemp_d)

{

intA2t;

A1=temp_d/100;//分出百,十,和个位

A2t=temp_d%100;

A2=A2t/10;

A3=A2t%10;

}

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

//主程序

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

voidmain(void)

{

constunsignedcharseg[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};

constunsignedcharzww[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09};

ucharj;

WDT_Init();//看门狗初始化

Clock_Init();//时钟初始化

Port_Init();//端口初始化,用于控制IO口输入或输出

DS18B20_Reset();//复位D18B20

while

(1)

{

ds1820_start();//启动一次转换

ds1820_read_temp();//读取温度数值

data_do(temp_value);//处理数据,得到要显示的值

if(A1==zww[0])A1=seg[0];//以下将DS18B20反馈的数值换成数码管的字符编码以显示

elseif(A1==zww[1])A1=seg[1];

elseif(A1==zww[2])A1=seg[2];

elseif(A1==zww[3])A1=seg[3];

elseif(A1==zww[4])A1=seg[4];

elseif(A1==zww[5])A1=seg[5];

elseif(A1==zww[6])A1=seg[6];

elseif(A1==zww[7])A1=seg[7];

elseif(A1==zww[8])A1=seg[8];

elseif(A1==zww[9])A1=seg[9];

elseA1=A1;

if(A2==zww[0])A2=seg[0];

elseif(A2==zww[1])A2=seg[1];

elseif(A2==zww[2])A2=seg[2];

elseif(A2==zww[3])A2=seg[3];

elseif(A2==zww[4])A2=seg[4];

elseif(A2==zww[5])A2=seg[5];

elseif(A2==zww[6])A2=seg[6];

elseif(A2==zww[7])A2=seg[7];

elseif(A2==zww[8])A2=seg[8];

elseif(A2==zww[9])A2=seg[9];

elseA2=A2;

if(A3==zww[0])A3=seg[0];

elseif(A3==zww[1])A3=seg[1];

elseif(A3==zww[2])A3=seg[2];

elseif(A3==zww[3])A3=seg[3];

elseif(A3==zww[4])A3=seg[4];

elseif(A3==zww[5])A3=seg[5];

elseif(A3==zww[6])A3=seg[6];

elseif(A3==zww[7])A3=seg[7];

elseif(A3==zww[8])A3=seg[8];

elseif(A3==zww[9])A3=seg[9];

elseA3=A3;

for(j=0;j<8;j++)

{

P4OUT=A1;

P5OUT=0X0E;

delay_ms(0.4);

P4OUT=A2+BIT7;

P5OUT=0x0D;

delay_ms(0.4);

P4OUT=A3;

P5OUT=0x0B;

delay_ms(0.4);

P4OUT=0x58;

P5OUT=0x07;

delay_ms(0.4);

P4OUT=0x00;//缺少该句,数码管会有微弱重影,有该句无重影

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > IT计算机 > 互联网

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1