根据msp430温度数码管显示Word文档下载推荐.docx
《根据msp430温度数码管显示Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《根据msp430温度数码管显示Word文档下载推荐.docx(14页珍藏版)》请在冰豆网上搜索。
![根据msp430温度数码管显示Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-12/6/257ceab1-9206-4a61-92e5-fd895918fdf1/257ceab1-9206-4a61-92e5-fd895918fdf11.gif)
{
/*下面六行程序关闭所有的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<
<
cnt);
wei_h;
wei_l;
cnt++;
if(cnt==6)cnt=0;
Disp_Numb
将从DS18B20读取的11bit温度数据转换
成数码管显示的温度数字
temper--11bit温度数据
voidDisp_Numb(uinttemper)
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;
BIT2)
dN[2]+=5;
dN[3]+=2;
if(dN[2]>
=10)
dN[2]-=10;
BIT3)
dN[3]+=5;
BIT4)
dN[4]+=1;
BIT5)
dN[4]+=2;
BIT6)
dN[4]+=4;
BIT7)
dN[4]+=8;
if(dN[4]>
dN[4]-=10;
dN[5]+=1;
BIT8)
dN[4]+=6;
BIT9)
dN[5]+=3;
BITA)
dN[5]+=6;
if(dN[5]>
dN[5]-=10;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////**********18b20.C******************/////////////////////////////////////////
typedefunsignedcharuchar;
typedefunsignedintuint;
#defineDQ1P1OUT|=BIT6
#defineDQ0P1OUT&
#defineDQ_inP1DIR&
#defineDQ_outP1DIR|=BIT6
#defineDQ_val(P1IN&
DelayNus
实现N个微秒的延时
n--延时长度
说明:
定时器A的计数时钟是1MHz,CPU主频8MHz
所以通过定时器延时能够得到极为精确的
us级延时
voidDelayNus(uintn)
CCR0=n;
TACTL|=MC_1;
//增计数到CCR0
while(!
(TACTL&
BIT0));
//等待
TACTL&
=~MC_1;
//停止计数
=~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;
//初始化成功
//设为输出
//中断使能
DelayNus(400);
returnError;
Write_18B20
向DS18B20写入一个字节的数据
wdata--写入的数据
voidWrite_18B20(ucharwdata)
i<
8;
i++)
DelayNus(6);
//延时6us
if(wdata&
0X01)DQ1;
elseDQ0;
wdata>
>
=1;
DelayNus(50);
//延时50us
DelayNus(10);
//延时10us
Read_18B20
从DS18B20读取一个字节的数据
读出的一个字节数据
ucharRead_18B20(void)
uchartemp=0;
temp>
DelayNus(8);
//延时9us
if(DQ_val)temp|=0x80;
DelayNus(45);
//延时45us
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;
//读取的温度数值
控制DS18B20完成一次温度转换
测量的温度数值
uintDo1Convert(void)
i=Init_18B20();
while(i);
//初始化是否完成
Skip();
//送跳过读取产品ID号命令
Convert();
//发送温度转换命令
for(i=20;
i>
i--)
DelayNus(60000);
//延时800ms以上
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);