专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
TI
求助:基于msp430g和ds18b20的温度控制
2019-07-15 15:47
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
11054
2
1729
器件用的是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]);
}
}
加载中...
14907833097
2楼-- · 2019-07-15 21:44
请问这句if(lcddat & 0x00800000) SID_1;什么意思啊?如果是和lcddat与的话 0x00800000就相当于64位二进制啊 lcddat不是24位吗
加载中...
一周热门
更多
>
相关问题
CPLD的方波输出
4 个回答
11个版本Quartus II 软件下载,安装包网盘合集,附教程,47G!
20 个回答
请大家帮忙到21IC发展大家谈支持我申请新版面
20 个回答
【通知】21ic中国电子网服务条款 (所有人员必读)
1 个回答
满载而归乙亥年,大展鸿途庚子年---集签赢好礼
20 个回答
携手ADI,踏上电子工程师之巅—车辆电气化视频,答题领奖!
1 个回答
如何提升论坛质量,看你了!
20 个回答
【最终名单】二姨家喊你来拿100份新年大礼啦~
20 个回答
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
TI
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
#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]);
}
}
一周热门 更多>