基于msp430温度数码管显示.docx
《基于msp430温度数码管显示.docx》由会员分享,可在线阅读,更多相关《基于msp430温度数码管显示.docx(16页珍藏版)》请在冰豆网上搜索。
基于msp430温度数码管显示
/*************************************************
程序功能:
用DS18B20测量室温并在数码管上显示。
-------------------------------------------------
测试说明:
观察显示温度数值。
*************************************************/
#include
#include"DS18B20.h"
#include"DS18B20.c"
#definewei_hP5OUT|=BIT5
#definewei_lP5OUT&=~BIT5
#defineduan_lP6OUT&=~BIT6
#defineduan_hP6OUT|=BIT6
//要显示的6位温度数字
uchardN[6];
//数码管七段码;0--f
ucharscandata[16]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
//数码管位选变量
ucharcnt=0;
voidDisp_Numb(uinttemper);
/****************主函数****************/
voidmain(void)
{
/*下面六行程序关闭所有的IO口*/
P5DIR=0xff;
P5OUT=0xff;P1DIR=0XFF;P1OUT=0XFF;
P2DIR=0XFF;P2OUT=0XFF;
P3DIR=0XFF;P3OUT=0XFF;
P4DIR=0XFF;P4OUT=0XFF;
P5DIR=0XFF;P5OUT=0XFF;
P6DIR=0XFF;P6OUT=0XFF;
uchari;
WDTCTL=WDTPW+WDTHOLD;
/*------选择系统主时钟为8MHz-------*/
BCSCTL1&=~XT2OFF;//打开XT2高频晶体振荡器
do
{
IFG1&=~OFIFG;//清除晶振失败标志
for(i=0xFF;i>0;i--);//等待8MHz晶体起振
}
while((IFG1&OFIFG));//晶振失效标志仍然存在?
BCSCTL2|=SELM_2+SELS;//MCLK和SMCLK选择高频晶振
P6DIR|=BIT6;P6OUT|=BIT6;//关闭电平转换
P5DIR|=BIT5;P5OUT|=BIT5;//关闭电平转换
P6DIR|=BIT7;P6OUT|=BIT7;//关闭蜂鸣器
//设置看门狗定时器,初始化控制数码管的IO
WDTCTL=WDT_ADLY_1_9;
IE1|=WDTIE;
//P4DIR=0xff;
//P5DIR=0xFF;
//P5OUT=0xff;
//P4OUT=0xff;
//P6DIR=0xff;
//P6OUT=0xFF;
//计数时钟选择SMLK=8MHz,1/8分频后为1MHz
TACTL|=TASSEL_2+ID_3;
//打开全局中断
_EINT();
//循环读数显示
while
(1)
{
Disp_Numb(Do1Convert());//不停地转换显示
}
}
/*******************************************
函数名称:
watchdog_timer
功能:
看门狗定时器中断服务函数,进行数码
管动态扫描
参数:
无
返回值:
无
********************************************/
#pragmavector=WDT_VECTOR
__interruptvoidwatchdog_timer(void)
{
//P4OUT=0xFF;
//wei_h;
//wei_l;
P4OUT=scandata[dN[5-cnt]];
if(cnt==1)P4OUT|=BIT7;//在第二位显示小数点
duan_h;
duan_l;
P4OUT=~(1<wei_h;
wei_l;
cnt++;
if(cnt==6)cnt=0;
}
/*******************************************
函数名称:
Disp_Numb
功能:
将从DS18B20读取的11bit温度数据转换
成数码管显示的温度数字
参数:
temper--11bit温度数据
返回值:
无
********************************************/
voidDisp_Numb(uinttemper)
{
uchari;
for(i=0;i<6;i++)dN[i]=0;//初始化显示变量
//数值转换
if(temper&BIT0)
{
dN[0]=5;
dN[1]=2;
dN[2]=6;
}
if(temper&BIT1)
{
dN[1]+=5;
dN[2]+=2;
dN[3]+=1;
}
if(temper&BIT2)
{
dN[2]+=5;
dN[3]+=2;
if(dN[2]>=10)
{
dN[2]-=10;
dN[3]+=1;
}
}
if(temper&BIT3)
{
dN[3]+=5;
}
if(temper&BIT4)
{
dN[4]+=1;
}
if(temper&BIT5)
{
dN[4]+=2;
}
if(temper&BIT6)
{
dN[4]+=4;
}
if(temper&BIT7)
{
dN[4]+=8;
if(dN[4]>=10)
{
dN[4]-=10;
dN[5]+=1;
}
}
if(temper&BIT8)
{
dN[4]+=6;
dN[5]+=1;
if(dN[4]>=10)
{
dN[4]-=10;
dN[5]+=1;
}
}
if(temper&BIT9)
{
dN[4]+=2;
dN[5]+=3;
if(dN[4]>=10)
{
dN[4]-=10;
dN[5]+=1;
}
}
if(temper&BITA)
{
dN[4]+=4;
dN[5]+=6;
if(dN[4]>=10)
{
dN[4]-=10;
dN[5]+=1;
}
if(dN[5]>=10)
{
dN[5]-=10;
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////**********18b20.C******************/////////////////////////////////////////
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
#defineDQ1P1OUT|=BIT6
#defineDQ0P1OUT&=~BIT6
#defineDQ_inP1DIR&=~BIT6
#defineDQ_outP1DIR|=BIT6
#defineDQ_val(P1IN&BIT6)
/*******************************************
函数名称:
DelayNus
功能:
实现N个微秒的延时
参数:
n--延时长度
返回值:
无
说明:
定时器A的计数时钟是1MHz,CPU主频8MHz
所以通过定时器延时能够得到极为精确的
us级延时
********************************************/
voidDelayNus(uintn)
{
CCR0=n;
TACTL|=MC_1;//增计数到CCR0
while(!
(TACTL&BIT0));//等待
TACTL&=~MC_1;//停止计数
TACTL&=~BIT0;//清除中断标志
}
/*******************************************
函数名称:
Init_18B20
功能:
对DS18B20进行复位操作
参数:
无
返回值:
初始化状态标志:
1--失败,0--成功
********************************************/
ucharInit_18B20(void)
{
ucharError;
DQ_out;//拉高
_DINT();//关闭中断
DQ0;//拉低
DelayNus(500);
DQ1;//拉高
DelayNus(55);
DQ_in;//方向设置输入
_NOP();
if(DQ_val)//输入值为1
{
Error=1;//初始化失败
}
else//输入值为0
{
Error=0;//初始化成功
}
DQ_out;//设为输出
DQ1;//拉高
_EINT();//中断使能
DelayNus(400);
returnError;
}
/*******************************************
函数名称:
Write_18B20
功能:
向DS18B20写入一个字节的数据
参数:
wdata--写入的数据
返回值:
无
********************************************/
voidWrite_18B20(ucharwdata)
{
uchari;
_DINT();
for(i=0;i<8;i++)
{
DQ0;
DelayNus(6);//延时6us
if(wdata&0X01)DQ1;
elseDQ0;
wdata>>=1;
DelayNus(50);//延时50us
DQ1;
DelayNus(10);//延时10us
}
_EINT();
}
/*******************************************
函数名称:
Read_18B20
功能:
从DS18B20读取一个字节的数据
参数:
无
返回值:
读出的一个字节数据
********************************************/
ucharRead_18B20(void)
{
uchari;
uchartemp=0;
_DINT();
for(i=0;i<8;i++)
{
temp>>=1;
DQ0;
DelayNus(6);//延时6us
DQ1;
DelayNus(8);//延时9us
DQ_in;
_NOP();
if(DQ_val)temp|=0x80;
DelayNus(45);//延时45us
DQ_out;
DQ1;
DelayNus(10);//延时10us
}
_EINT();
returntemp;//读到的一个字节
}
/*******************************************
函数名称:
Skip
功能:
发送跳过读取产品ID号命令
参数:
无
返回值:
无
********************************************/
voidSkip(void)
{
Write_18B20(0xcc);
}
/*******************************************
函数名称:
Convert
功能:
发送温度转换命令
参数:
无
返回值:
无
********************************************/
voidConvert(void)
{
Write_18B20(0x44);
}
/*******************************************
函数名称:
Read_SP
功能:
发送读ScratchPad命令
参数:
无
返回值:
无
********************************************/
voidRead_SP(void)
{
Write_18B20(0xbe);
}
/*******************************************
函数名称:
ReadTemp
功能:
从DS18B20的ScratchPad读取温度转换结果
参数:
无
返回值:
读取的温度数值
********************************************/
uintReadTemp(void)
{
uchartemp_low;
uinttemp;
temp_low=Read_18B20();//读低位
temp=Read_18B20();//读高位
temp=(temp<<8)|temp_low;
returntemp;//读取的温度数值
}
/*******************************************
函数名称:
ReadTemp
功能:
控制DS18B20完成一次温度转换
参数:
无
返回值:
测量的温度数值
********************************************/
uintDo1Convert(void)
{
uchari;
do
{
i=Init_18B20();
}
while(i);//初始化是否完成
Skip();//送跳过读取产品ID号命令
Convert();//发送温度转换命令
for(i=20;i>0;i--)
DelayNus(60000);//延时800ms以上
do
{
i=Init_18B20();
}
while(i);
Skip();
Read_SP();//发送读ScratchPad命令
returnReadTemp();//读取的温度数值
}
////////////////**********************************************///////////////////
/***************18b20.h***************************/
voidDelayNus(unsignedintn);
unsignedcharInit_18B20(void);
voidWrite_18B20(unsignedcharwdata);
unsignedcharRead_18B20(void);
voidSkip(void);
voidConvert(void);
voidRead_SP(void);
unsignedintReadTemp(void);
unsignedintDo1Convert(void);