求助:基于msp430g和ds18b20的温度控制

2019-07-15 15:47发布

器件用的是msp430g和ds18b20和lcd12864

采用的是串行接法
经过调试后LCD只亮,什么都不显示。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
猫又dada
1楼-- · 2019-07-15 21:03
程序如下,应该怎么修改,还是我的接线有误,单口接线接到1.4
#include"msp430g2553.h"
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define CS   0
#define SID  1
#define SCLK 2
#define LCDPORT P2OUT
#define LCDDDR  P2OUT
#define SID_1 LCDPORT |= SID
#define SID_0 LCDPORT &= ~SID
#define SCLK_1 LCDPORT |= SCLK
#define SCLK_0 LCDPORT &= ~SCLK
#define CS_1 LCDPORT |= CS
#define CS_0 LCDPORT &= ~CS


#define DQ_OUT P1DIR|=BIT4
#define DQ_IN P1DIR&=~BIT4
#define DQ_H P1OUT|=BIT4
#define DQ_L P1OUT&=~BIT4
#define DQ_VOLT (P1IN&BIT4)

uchar a[]={"当前温度为:**.**C "};
uchar MM=0;
uint x=0;
//200us延时程序


void delay(uchar i)
{
        uchar j,k;
        for(j=i;j>0;j--)
                for(k=100;k>0;k--);
        _NOP();
}

/***********************************************************
*名 称:LCD_Write_cmd()
*功 能:写一个命令到LCD12864
*入口参数:cmd:待写入的命令,无符号字节形式
*出口参数:无
*说 明:写入命令时,RW=0,RS=0 扩展成24位串行发送
*格 式:11111 RW0 RS 0 xxxx0000 xxxx0000
* |最高的字节 |命令的bit7~4|命令的bit3~0|
***********************************************************/
void write_cmd(uchar cmd)
{
uchar i,high4bits,low4bits;
ulong lcdcmd;
high4bits = cmd & 0xf0;
low4bits = cmd & 0x0f;
lcdcmd=((ulong)0xf8<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);
CS_1;
SCLK_0;
for(i=0;i<24;i++)
{
SID_0;
if(lcdcmd & 0x00800000)
SID_1;
lcdcmd <<=1;
delay(3);
SCLK_1;
delay(3);
SCLK_0;
}
CS_0;
}


/***********************************************************
*名 称:LCD_Write_Byte()
*功 能:向LCD12864写入一个字节数据
*入口参数:byte:待写入的字符,无符号形式
*出口参数:无
*范 例:LCD_Write_Byte(*F*) //写入字符*F*
***********************************************************/
void write_dat(uchar dat)
{
uchar i,high4bits,low4bits;
ulong lcddat;
high4bits = dat & 0xf0;
low4bits = dat & 0x0f;
lcddat=((ulong)0xfa<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);
CS_1;
SCLK_0;
for(i=0;i<24;i++)
{
SID_0;
if(lcddat & 0x00800000) SID_1;
lcddat <<=1;
delay(3);
SCLK_1;
delay(3);
SCLK_0;
}
CS_0;
}
/***********************************************************
*名 称:LCD_pos()
*功 能:设置液晶的显示位置
*入口参数:x:第几行,1~4对应第1行~第4行
* y:第几列,0~15对应第1列~第16列
*出口参数:无
*范 例:LCD_pos(2,3) //第二行,第四列
***********************************************************/
void lcd_pos(uchar x,uchar y)
{
uchar pos;
switch(x)
{
case 1:pos=0x80;break;
case 2:pos=0x90;break;
case 3:pos=0x88;break;
case 4:pos=0x98;break;
default:pos=0x80;
}
pos += y;
write_cmd(pos);
}
/****************************************************/
//LCD12864初始化
void LCD_init(void)
{
write_cmd(0x30);
delay(5);
write_cmd(0x0C);
delay(5);
write_cmd(0x01);
delay(5);
write_cmd(0x02);
delay(5);
}
//数据处理
void data_display(uchar aa)
{
unsigned char lcd_table[4];
lcd_table[0]=aa/100;
lcd_table[1]=aa%100/10;
lcd_table[2]=aa%10;
lcd_table[3]=aa%1;
write_dat((lcd_table[0]+0x30)); //显示整数部分的百位数 0x30的原因CGROM和CGRAM与字符的对应关系
write_dat((lcd_table[1]+0x30));//显示整数数部分的十位
write_dat((lcd_table[2]+0x30)); //显示个位
write_dat(a[11]);
write_dat((lcd_table[3]+0x30));
}
//初始化函数
void init_ds18b20()
{
uchar error=0;
DQ_H;
delay(8);
DQ_L;
delay(80);
DQ_H;
delay(5);
DQ_IN;
_NOP();
if(DQ_IN)
     error=1;
else error=0;
delay(20);

}
//读一个字节
uchar readonechar(void)
{
uchar i=0;
uchar dat=0;
DQ_OUT;
for(i=8;i>0;i--)
{
DQ_H; // 给脉冲信号
delay(1);
DQ_L;
dat>>=1;
_NOP();
DQ_H; // 给脉冲信号
_NOP();
if(P1IN&BIT4)
dat|=0x80;
delay(4);
}
return(dat);
}
//写一个字节
void writeonechar(uchar dat)
{
uchar i=0;

for (i=8; i>0; i--)
{
DQ_L;
if(dat&0x01)
DQ_H;
else
DQ_L;
delay(4);
DQ_H;
dat>>=1;
}
}

uint readtemperature(void)
{
uchar a=0;
uchar b=0;
uint t=0;
float tt=0;
init_ds18b20();
writeonechar(0xCC); // 跳过读序号列号的操作
writeonechar(0x44); // 启动温度转换
delay(125);
init_ds18b20();
writeonechar(0xCC); //跳过读序号列号的操作
writeonechar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
a=readonechar();//低四位
b=readonechar();//高四位
t=a+b;
t<<=8;
t=t|a;
tt=t*0.0625; //精确到0.0625
tt= tt*100; //放大100倍输出
return(t);
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗
P1DIR|=BIT0;
P1OUT|=BIT0;
P1DIR|=(BIT1 + BIT2 + BIT3);
LCD_init();
while(1)
{
x=readtemperature();
delay(40);

lcd_pos(1,0);
write_dat(a[0]);
write_dat(a[1]);
write_dat(a[2]);
write_dat(a[3]);
write_dat(a[4]);
write_dat(a[5]);
write_dat(a[6]);
write_dat(a[7]);
write_dat(a[8]);
lcd_pos(2,3);
data_display(x);
write_dat(a[13]);
write_dat(a[14]);
write_dat(a[15]);
write_dat(a[16]);

}
}
1.jpg
2.jpg
14907833097
2楼-- · 2019-07-15 21:44
请问这句if(lcddat & 0x00800000) SID_1;什么意思啊?如果是和lcddat与的话   0x00800000就相当于64位二进制啊   lcddat不是24位吗

一周热门 更多>