基于msp430温度数码管显示.docx

上传人:b****3 文档编号:24732704 上传时间:2023-06-01 格式:DOCX 页数:16 大小:17KB
下载 相关 举报
基于msp430温度数码管显示.docx_第1页
第1页 / 共16页
基于msp430温度数码管显示.docx_第2页
第2页 / 共16页
基于msp430温度数码管显示.docx_第3页
第3页 / 共16页
基于msp430温度数码管显示.docx_第4页
第4页 / 共16页
基于msp430温度数码管显示.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

基于msp430温度数码管显示.docx

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

基于msp430温度数码管显示.docx

基于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);

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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