MSP430与DS18B20之1602显示.docx
- 文档编号:26640248
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:15
- 大小:17.08KB
MSP430与DS18B20之1602显示.docx
《MSP430与DS18B20之1602显示.docx》由会员分享,可在线阅读,更多相关《MSP430与DS18B20之1602显示.docx(15页珍藏版)》请在冰豆网上搜索。
MSP430与DS18B20之1602显示
#include
typedefunsignedcharuchar;
typedefunsignedintuint;
/**************宏定义***************/
#defineDataDirP4DIR
#defineDataPortP4OUT
#defineBusy0x80
#defineCtrlDirP3DIR
#defineCLR_RSP3OUT&=~BIT0;//RS=P3.0
#defineSET_RSP3OUT|=BIT0;
#defineCLR_RWP3OUT&=~BIT1;//RW=P3.1
#defineSET_RWP3OUT|=BIT1;
#defineCLR_ENP3OUT&=~BIT2;//EN=P3.2
#defineSET_ENP3OUT|=BIT2;
#defineDQ1P1OUT|=BIT6
#defineDQ0P1OUT&=~BIT6
#defineDQ_inP1DIR&=~BIT6
#defineDQ_outP1DIR|=BIT6
#defineDQ_val(P1IN&BIT6)
uinttvalue;
uchartflag;
uchardisdata[4];
/*******************************************
函数名称:
Delay5ms
功能:
延时约5ms
参数:
无
返回值:
无
********************************************/
voidDelay5ms(void)
{
uinti=40000;
while(i!
=0)
{
i--;
}
}
/*******************************************
函数名称:
DelayNus
功能:
实现N个微秒的延时
参数:
n--延时长度
返回值:
无
说明:
定时器A的计数时钟是1MHz,CPU主频8MHz
所以通过定时器延时能够得到极为精确的
us级延时
********************************************/
voidDelayNus(uintn)
{
CCR0=n;
TACTL|=MC_1;//增计数到CCR0
while(!
(TACTL&BIT0));//等待
TACTL&=~MC_1;//停止计数
TACTL&=~BIT0;//清除中断标志
}
/*******************************************
函数名称:
WaitForEnable
功能:
等待1602液晶完成内部操作
参数:
无
返回值:
无
********************************************/
voidWaitForEnable(void)
{
P4DIR&=0x00;//将P4口切换为输入状态
CLR_RS;
SET_RW;
_NOP();
SET_EN;
_NOP();
_NOP();
while((P4IN&Busy)!
=0);//检测忙标志
CLR_EN;
P4DIR|=0xFF;//将P4口切换为输出状态
}
/*******************************************
函数名称:
write_com
功能:
向液晶模块写入命令
参数:
cmd--命令,
chk--是否判忙的标志,1:
判忙,0:
不判
返回值:
无
********************************************/
voidwrite_com(ucharcmd)
{
WaitForEnable();//检测忙信号?
CLR_RS;
CLR_RW;
_NOP();
DataPort=cmd;//将命令字写入数据端口
_NOP();
SET_EN;//产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
/*******************************************
函数名称:
write_data
功能:
向液晶显示的当前地址写入显示数据
参数:
data--显示字符数据
返回值:
无
********************************************/
voidwrite_data(uchardata)
{
WaitForEnable();//等待液晶不忙
SET_RS;
CLR_RW;
_NOP();
DataPort=data;//将显示数据写入数据端口
_NOP();
SET_EN;//产生使能脉冲信号
_NOP();
_NOP();
CLR_EN;
}
voidzifuchuan(uchar*ch)
{
while(*ch!
=0)
write_data(*ch++);
Delay5ms();
}
/*******************************************
函数名称:
LcdReset
功能:
对1602液晶模块进行复位操作
参数:
无
返回值:
无
********************************************/
voidLcdReset(void)
{
CtrlDir|=0x07;//控制线端口设为输出状态
DataDir=0xFF;//数据端口设为输出状态
write_com(0x38);//规定的复位操作
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);
Delay5ms();
write_com(0x38);//显示模式设置
write_com(0x08);//显示关闭
write_com(0x01);//显示清屏
write_com(0x06);//写字符时整体不移动
write_com(0x0c);//显示开,不开游标,不闪烁
}
/*******************************************
函数名称:
Init_18B20
功能:
对DS18B20进行复位操作
参数:
无
返回值:
初始化状态标志:
1--失败,0--成功
********************************************/
ucharInit_18B20(void)
{
ucharError;
DQ_out;
_DINT();
DQ0;
DelayNus(500);
DQ1;
DelayNus(55);
DQ_in;
_NOP();
if(DQ_val)
{
Error=1;//初始化失败
}
else
{
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;
}
uintDo1Convert(void)
{
uchari;
uchartemp_low;
uinttemp;
do
{
i=Init_18B20();
}
while(i);
//此处的i就是等于前面的Error,Error=1,就会出现死循环,表示18B20可能坏了
Write_18B20(0xcc);//送跳过读取产品ID号命令
Write_18B20(0x44);//发送温度转换命令
for(i=20;i>0;i--)
DelayNus(60000);//延时800ms以上
do
{
i=Init_18B20();
}
while(i);
//此处的i就是等于前面的Error,Error=1,就会出现死循环,表示18B20可能坏了
Write_18B20(0xcc);//送跳过读取产品ID号命令
Write_18B20(0xbe);//发送读ROM命令
temp_low=Read_18B20();//读低位
temp=Read_18B20();//读高位
temp=(temp<<8)|temp_low;
if(temp<0x0fff)
tflag=0;
else
{temp=~temp+1;
tflag=1;
}
tvalue=temp*(0.625);//温度值扩大10倍,精确到1位小数
returntvalue;
}
voiddisplay(intdat)
{
disdata[0]=dat/1000;
disdata[1]=dat%1000/100;
disdata[2]=dat%100/10;
disdata[3]=dat%10;
write_com(0x80+0x40);
write_data(disdata[0]+0x30);
write_data(disdata[1]+0x30);
write_data(disdata[2]+0x30);
write_com(0x80+0x43);
write_data(0x2e);
write_data(disdata[3]+0x30);
write_data(0xdf);//写入摄氏度的小圈
write_data('C');
}
/*************************主函数*************************/
voidmain(void)
{
/*下面六行程序关闭所有的IO口*/
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;//关狗
P6DIR|=BIT2;P6OUT|=BIT2;//关闭电平转换
/*------选择系统主时钟为8MHz-------*/
BCSCTL1&=~XT2OFF;//打开XT2高频晶体振荡器
do
{
IFG1&=~OFIFG;//清除晶振失败标志
for(i=0xFF;i>0;i--);//等待8MHz晶体起振
}
while((IFG1&OFIFG));//晶振失效标志仍然存在?
BCSCTL2|=SELM_2+SELS;//MCLK和SMCLK选择高频晶振
//计数时钟选择SMLK=8MHz,1/8分频后为1MHz
TACTL|=TASSEL_2+ID_3;
//打开全局中断
_EINT();
LcdReset();
zifuchuan("Temperatureis:
");
//循环读数显示
while
(1)
{
display(Do1Convert());
}
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MSP430 DS18B20 1602 显示