问什么 温度不能刷新,显示不出当前温度。。。求大神解答,坐等回复...
#include <msp430g2553.h>
#include <intrinsics.h>
#include <math.H>
#define uchar unsigned char
#define uint unsigned int
#define RS P2OUT //设置P2.0--rs
#define RW P2OUT //设置P2.1--rw
#define EN P2OUT //设置P2.2--en
#define DQ_OUT P2DIR|=BIT3
#define DQ_IN P2DIR&=~BIT3
#define DQ_H P2OUT|=BIT3
#define DQ_L P2OUT&=~BIT3
uchar datas[] ={"0123456789"};
uchar table1[]=" 21.0 32.0 43.0 ";
uchar table2[]=" Tem_C ";
uchar table3[]=" HX_0_532 ";
void delayus(unsigned int z)
{
unsigned int i,j;
for(i = 0;i<20;i++)
for(j=0;j<z;j++)
{;;};
}
void delayMs(uint a)
{
uint i, j;
for(i = a; i > 0; i--)
for(j = 100; j > 0; j--);
}
void DelayUs2x(unsigned char t)
{
while(--t);
}
void writeComm(uchar comm)//写命令
{
RS&=~BIT0;
EN&=~BIT2;
P1OUT&=0X00;
P1OUT|=comm;
delayMs(5);
EN|=BIT2;
EN&=~BIT2;
}
void writeData(uchar dat)//写数据
{
RS|=BIT0;
EN&=~BIT2;
P1OUT&=0X00;
P1OUT|=dat;
delayMs(5);
EN|=BIT2;
EN&=~BIT2;
}
void init()//1602初始化
{
uchar num;
RW&=~BIT1;
EN&=~BIT2;
writeComm(0x38);
writeComm(0x0c);
writeComm(0x06);
writeComm(0x01);
writeComm(0x80);
for(num=0;num<9;num++)
{
writeData(table2[num]);
delayMs(100);
}
writeComm(0x80+0x40);
for(num=0;num<12;num++)
{
writeData(table3[num]);
delayMs(100);
}
delayMs(420);
delayMs(300);
}
void writeString(uchar * str, uchar length)
{
uchar i;
for(i = 0; i < length; i++)
{
writeData(str[i]);
delayMs(100);
}
}
void Init_DS18B20() //18b20初始化函数
{
DQ_OUT;
_NOP();
DQ_H; //DQ复位
delayus(2); //稍做延时40us
DQ_L; //将DQ拉低
delayus(25); //精确延时 大于 500us
DQ_H; //拉高总线
delayus(3);//延时60us
DQ_IN;
_NOP();
// if(P1IN&BIT6)
// error=1;
// else error=0;
DQ_OUT;
DQ_H; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
delayus(10);//延时200us
}
//读一个字节
uchar read_DS18B20(void)
{
uchar i=0;
uchar dt=0;
DQ_OUT;
for(i=8;i>0;i--)
{
DQ_L; // 给脉冲信号
dt>>=1;
_NOP();
DQ_H; // 给脉冲信号
_NOP();
DQ_IN;
if(P1IN&BIT6)
dt|=0x80;
delayus(2);
DQ_OUT;
DQ_H;
delayus(1);
}
return(dt);
}
//写一个字节
void writeByte(uchar dat)
{
uchar i=0;
DQ_OUT;
for (i=8; i>0; i--)
{
DQ_L;
if(dat&0x01)
DQ_H;
else
DQ_L;
delayus(2);
DQ_H;
dat>>=1;
}
}
void sendChangeCmd()
{
Init_DS18B20();
delayMs(1);
writeByte(0xcc);
writeByte(0x44);
}
void sendReadCmd()
{
Init_DS18B20();
delayMs(1);
writeByte(0xcc);
writeByte(0xbe);
}
int getTmpValue()
{
uchar a=0;
uchar b=0;
uint t=0;
float tt=0;
sendChangeCmd();
sendReadCmd();
a=read_DS18B20();//低四位
b=read_DS18B20();//高四位
t=b;
t<<=8;
t=t|a;
tt=t*0.0625; //精确到0.0625
t= tt*10; //放大100倍输出
return(t);
}
void display(int v)
{ uchar bai,shi,ge,xiao1;
uint temp;
sendChangeCmd();
temp = abs(v);
if(v < 0)
writeData('-');
else
writeData('+');
bai = temp / 1000;
shi = temp % 1000 / 100;
ge = temp % 100 / 10;
xiao1 = temp % 10 ;
if(bai!= 0)
writeData(datas[bai]);
if(shi!=0)
writeData(datas[shi]);
if(ge!=0)
writeData(datas[ge]) ;
else
writeData('0');
_NOP();
writeData('.');
writeData(datas[xiao1]);
}
/*void write_sfm(uchar add,uchar date)
{
uchar shi,ge;
shi=date/10;
ge=date%10;
writeComm(0x80+0x40+add);
writeData(0x30+shi);
writeData(0x30+ge);
}*/
void wrining()
{
uchar num;
writeComm(0x80+0x40);
for(num=0;num<16;num++)
{
writeData(table1[num]);
delayMs(100);
}
}
void main()
{
uchar table[] = " NOW_T:.....";
WDTCTL=WDTPW+WDTHOLD; //关闭看门狗
BCSCTL1=CALBC1_1MHZ; //BCSCTL1 Calibra
tion Data for 1MHz
DCOCTL=CALDCO_1MHZ; //DCOCTL Calibration Data for 1MHz
BCSCTL2=SELM_1+DIVM_0; //设置MCLK为1MHZ
P1SEL&=0X00; //设置P1口为I/O模式
P2SEL&=0X00; //设置P2口为I/O模式
P1DIR|=0XFF; //设置P1口为输出模式
P2DIR|=0XFF; //设置P2口为输出模式
P1OUT&=0X00;
P2OUT&=0X00;
init();
writeComm(0x80);
writeString(table,14);
wrining();
sendChangeCmd();
while(1)
{
delayMs(100);
writeComm(0x80+9);
display(getTmpValue());
sendChangeCmd();
}
}
一周热门 更多>