DS18B20MSP4304位数码管显示温度.docx
- 文档编号:23000673
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:11
- 大小:16.41KB
DS18B20MSP4304位数码管显示温度.docx
《DS18B20MSP4304位数码管显示温度.docx》由会员分享,可在线阅读,更多相关《DS18B20MSP4304位数码管显示温度.docx(11页珍藏版)》请在冰豆网上搜索。
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;//缺少该句,数码管会有微弱重影,有该句无重影
}
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- DS18B20MSP4304 数码管 显示 温度