3504|3

59

帖子

0

TA的资源

纯净的硅(初级)

楼主
 

在线等高手解答!关于ds18b20与液晶12864的问题 [复制链接]

把下面的程序下到单片机后,除了能显示自定义的字符"现在的温度为:",就是在温度显示的位置显示“22”,无论怎么样弄18b20也无法改变数值,还请论坛的各位高手解答,调试了很多天了也没找出原因,很急!拜托各位帮忙,先谢谢了
#include
#include
#define uchar unsigned char
#define uint unsigned int
sbit   DQ = P1^7;
uchar i,a,b;
bit x=0;
uchar code table3[]={"现在的温度为:"};
uchar code ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
unsigned char temp_value,display[];

/***********ds18b20延迟子函数(晶振12MHz )*******/
void delay_18B20(unsigned int i)
{
while(--i);
}
/**********ds18b20初始化函数**********************/
Init_DS18B20(void)
{
  
  DQ = 1;          //DQ复位
  delay_18B20(8);  //稍做延时
  DQ = 0;          //单片机将DQ拉低
  delay_18B20(90); //精确延时 大于 480us
  DQ = 1;          //拉高总线
  delay_18B20(8);
  x=DQ;            //稍做延时后 如果x=0则初始化成功 x=1则初始化失败
  delay_18B20(100);
  return( x);
}
/***********ds18b20读一个字节**************/  
unsigned char ReadOneChar(void)
{
unsigned char i=0;
unsigned char dat = 0;
for (i=8;i>0;i--)
  {
    DQ = 0;      // 给脉冲信号
    dat>>=1;     //数据右移一位
    DQ = 1;      // 给脉冲信号
    if(DQ)
    dat|=0x80;   //按位或,取最高位
    delay_18B20(4);
  }
  return(dat);
}
/*************ds18b20写一个字节****************/  
void WriteOneChar(unsigned char dat)
{
  unsigned char i=0;
  for (i=8; i>0; i--)
  {
    DQ = 0;
   DQ = dat&0x01;     //取最低位
     delay_18B20(5);
   DQ = 1;            //上升沿将数据送入
     dat>>=1;
}
}
/**************读取ds18b20当前温度************/
uchar ReadTemp(void)
{
      
      //long temp_value=0;
   Init_DS18B20();
   
   WriteOneChar(0xCC);     // 跳过读序号列号的操作
   WriteOneChar(0x44);     // 启动温度转换
//   delay_18B20(100);       // It is quite important !!
   Init_DS18B20();
  
   WriteOneChar(0xCC);  //跳过读序号列号的操作
   WriteOneChar(0xBE);  //读取温度寄存器等(共可读9个寄存器) 前两个就是温度
//   delay_18B20(100);
   a=ReadOneChar();     //读取温度值低位
   b=ReadOneChar();     //读取温度值高位
  
      
}
    uchar display_temp()
{
  display[4]=a&0x0f;  //取小数部分
  display[0]=ditab[display[4]]+0x30;  // 查表取小数
  display[4]=((a&0xf0)>>4)|((b&0x0f)<<4);  //取整数
  display[3]=display[4]/100+0x30 ; //百位数
  display[1]=display[4]%100;
  display[2]=display[1]/10+0x30 ;  //十位数
  display[1]=display[1]%10+0x30  ;//个位数
}

/*************************12864液晶子程序*************************/

sbit rs=P2^4;
sbit rw=P2^5;
sbit en=P2^6;
sbit rst=P2^3;
sbit psb=P2^1;
void delay(uint k)
{
uint i,j;
for(i=0;i for(j=0;j<121;j++);
}
void wcode(uchar cmd)
{
   
rs=0;
rw=0;
en=0;
P0=cmd;
delay(5);
en=1;

delay(5);

en=0;
}
void wdata(uchar dat)
{
rs=1;
rw=0;
en=0;
P0=dat;
delay(5);
en=1;
delay(5);
en=0;
}
void init()
{
psb=1;
wcode(0x30);
delay(5);
wcode(0x0c);
delay(5);
wcode(0x01);
delay(5);

}
void lcd_pos(uchar x,uchar y)
{
uchar pos;
if(x==0)
  {x=0x80;}
else if(x==1)
  {x=0x90;}
else if(x==2)
  {x=0x88;}
else if(x==3)
  {x=0x98;}
pos=x+y;
wcode(pos);
}
void main()
{
uchar i;
init();

lcd_pos(0,0);
i=0;
while(table3!='\0')
{
  wdata(table3);
  i++;
}
  while(1)
  { ReadTemp();
    display_temp();
lcd_pos(2,3);
    wdata(display[3]);  
    lcd_pos(2,4);
    wdata(display[2]);      
  }
   
}
此帖出自单片机论坛

最新回复

看了半天,都被你里面的i这个全局变量搞混淆啦!for(i=0;i  详情 回复 发表于 2009-5-25 12:21
点赞 关注
 

回复
举报

2498

帖子

0

TA的资源

至上芯片

沙发
 

回复 楼主 zhupingheng 的帖子

看了半天,都被你里面的i这个全局变量搞混淆啦!for(i=0;i for(j=0;j<121;j++);
还有不知道这个能够直接这么写的吗,直接在这个后面加分号,见的少!
此帖出自单片机论坛
 
个人签名我的邮箱gaoxiaoan123@163.com!回帖是一种美德!互相帮助,共同进步!
口头禅:生活在于创造机会,把握机会!
 

回复

59

帖子

0

TA的资源

纯净的硅(初级)

板凳
 
这个是可以的,就相当于把后面那个for做它的表达式了
此帖出自单片机论坛
 
 
 

回复

59

帖子

0

TA的资源

纯净的硅(初级)

4
 
论坛真的没人知道???:L
此帖出自单片机论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表