首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 其他开发语言 >

高人看看,单片机C程序,温度值读不进去咋回事

2012-12-28 
高人看看,单片机C程序,温度值读不进去怎么回事?#includereg51.h#includeabsacc.h#define SEND_INIT XB

高人看看,单片机C程序,温度值读不进去怎么回事?
#include<reg51.h>
#include<absacc.h>
#define SEND_INIT XBYTE[0xf400]
#define SEND_DATA XBYTE[0xf500]
#define READ_BUSY XBYTE[0xf600]       //
#define READ_DATA XBYTE[0xfF00]      //读点地址
#define COM8155 XBYTE[0x8000]
#define PB XBYTE[0X8002]
#define PC XBYTE[0X8003]
#define DQ PA5
#define uchar unsigned char
#define uint  unsigned  int
#define comm  0//定义传送指令代码为0
#define dat   1
bit busy;
sbit DQ=P1^0;   //ds18b20与单片机连接口
sbit RS=P2^0;
sbit RW=P2^1;
sbit EN=P2^2;                         //定义LCD忙标志位
void first();// 初始化
void wr_lcd (uchar dat_comm,uchar content);     //写控制字与数据
void wr_str(unsigned char addr,unsigned char counts,const unsigned char *ps);//写字符串
void chk_busy (void);
void delay (uint us);
void init_lcd();
void clrram(void);
void loose();
void dshi();
void dge();
void Write_hms(uint add,uchar date) ;
uchar data disdata[5];
uint tvalue;      //温度值
uchar tflag;      //温度正负标志
uchar yu=0;
uint a=5,b;
uchar shi=0,ge=0,ai;//定义变量
uchar code TAB1A[]={"题目:时钟显示"};
uchar code TAB1B[]={"时间: 00: 00: 00"};
uchar code TAB1C[]={"摄氏温度: 0000"};
uchar code TAB1D[]={"华氏温度:00"};
//uchar code disdata[]={0,1,2,3};
uchar miao,fen,shi;

/******************************************************************************************
* 函数名称    :init_lcd
* 功能描述    :初始化LCD
******************************************************************************************/
void init_lcd()
{  wr_lcd(comm,0x30);//0011 0000 扩充功能设定——8位数据 基本指令操作
   wr_lcd(comm,0x34);                     //扩展指令操作
   wr_lcd(comm,0x01);//0000 0001 清屏——将DDRAM填满"20H",并且设定DDRAM的地址计数器为"00H"
   wr_lcd(comm,0x06);//0000 0110 进入点设定——指定在数据的读取与写入时,设定游标的移动方向
   wr_lcd(comm,0x0c);//0000 1100 游标或显示移位控制——开显          //开显示,关光标,不闪烁
}
/******************************************************************************************
* 函数名称    :clrram
* 功能描述    :将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H"
******************************************************************************************/
void clrram(void)
{
   wr_lcd(comm,0x30);
   delay(10);
   wr_lcd(comm,0x01);
   delay(10);
}
/*********写字符串**************************************/
void wr_str(unsigned char addr,unsigned char counts,const unsigned char *ps)
{
    int i;
    wr_lcd(comm,addr);
    delay(1);
    for(i=counts;i>0;i--)          //循环counts次
    {


        wr_lcd(dat,*ps);          //查表取数并调用显示一个字节数据函数送显示
        delay(1);                 //延长一定时间,确保能看到数据一个个的显示出来
        ps++;                    //取下一个数据
     }
}
/******************************************************************************************
* 函数名称    :wr_lcd
* 功能描述    :当dat_comm=0时,写入指令,dat_comm=1时,写入数据
******************************************************************************************/
void wr_lcd(uchar dat_comm,uchar content)
{
   chk_busy ();
   if(dat_comm)
    SEND_DATA=content;    //写数据
   else
     SEND_INIT=content;       //写指令
}
/******************************************************************************************
* 函数名称    :chk_busy
* 功能描述    :检测LCD忙信号
******************************************************************************************/
void chk_busy(void)
{ uchar temp;
  busy=1;                      //先置位繁忙标志
  READ_BUSY=0xFF;
  while(busy)
  {
   temp=READ_BUSY;
   if (temp&0x80==1)
    busy=1;
   else
   {
     busy=0;
     break;
   }
  }
}
/******************************************************************************************
* 函数名称    :delay
* 功能描述    :延时函数
******************************************************************************************/
void delay(uint us)   //delay time
{
   while(us--);
}
/******************************************************************************************
* 函数名称    :delay1
* 功能描述    :延时函数 1ms
******************************************************************************************/
void delay1(uint ms)
{
   uint i,j;
   for(i=0;i<ms;i++)
   for(j=0;j<15;j++)
   delay(1);
}

/*****************************************************************************
                   写分秒
******************************************************************************/
 void Write_hms(uint add,uchar date)
{
  uchar shi,ge;
  shi=date/10;
  ge=date%10;
  wr_lcd(comm,add);
  delay(1);
  wr_lcd(dat,0x30+shi);
  delay(1);
  wr_lcd(dat,0x30+ge);
  delay(1);
}

/******************************ds1820程序***************************************/
void delay_18B20(unsigned int i)//延时1微秒
   {
    while(i--);
   }

/*****ds1820复位******/
void ds1820rst()


   {
    unsigned char x=0;
    DQ = 1;           //DQ复位
    delay_18B20(4);   //延时
    DQ = 0;           //DQ拉低
    delay_18B20(100); //精确延时大于480us
    DQ = 1;           //拉高
    delay_18B20(40);
   }

uchar ds1820rd()/*读数据*/
   {
    unsigned char i=0;
    unsigned char datb = 0;
    for (i=8;i>0;i--)
      {
       DQ = 0; //给脉冲信号
       datb>>=1;
       DQ = 1; //给脉冲信号
       if(DQ)
       datb|=0x80;
       delay_18B20(10);
      }
    return(datb);
   }
/*************************************************************************************
/DS18B20写字节函数
*************************************************************************************/
void ds1820wr(uchar wdata)
   {
    unsigned char i=0;
    for (i=8; i>0; i--)
      {
       DQ = 0;
       DQ = wdata&0x01;
       delay_18B20(10);
       DQ = 1;
       wdata>>=1;
      }
   }
/*************************************************************************************
/DS18B20读字节函数
*************************************************************************************/
read_temp()
   {
    uchar a,b;
    ds1820rst();
    ds1820wr(0xcc); //*跳过读序列号*/
    ds1820wr(0x44); //*启动温度转换*/

    ds1820rst();
    ds1820wr(0xcc); //*跳过读序列号*/
    ds1820wr(0xbe); //*读取温度*/

    a=ds1820rd();
    b=ds1820rd();

    tvalue=b;
    tvalue<<=8;
    tvalue=tvalue|a;
    if(tvalue<0x0fff)
       tflag=0;
       else
       {
        tvalue=~tvalue+1;
        tflag=1;
       }
    tvalue=tvalue*(0.625);          //温度值扩大10倍,精确到1位小数
    return(tvalue);
   }

/*************************************************************************************
/DS18B20读温度函数
*************************************************************************************/
 /*void ds1820disp()                    //温度值显示


   {
    disdata[0]=tvalue/1000+0x30;     //百位数
    disdata[1]=tvalue%1000/100+0x30; //十位数
    disdata[2]=tvalue%100/10+0x30;   //个位数
    disdata[3]=tvalue%10+0x30;       //小数位

    /*wr_com(0xc0);
    wr_dat(flagdat);    //显示符号位
    wr_com(0xc1);
    wr_dat(disdata[0]); //显示百位
    wr_com(0xc2);
    wr_dat(disdata[1]); //显示十位
    wr_com(0xc3);
    wr_dat(disdata[2]); //显示个位
    wr_com(0xc4);
    wr_dat(0x2e);       //显示小数点
    wr_com(0xc5);
    wr_dat(disdata[3]); //显示小数位

   }*/
/*****************************************************************************
                   写温度
******************************************************************************/
 void Write_wendu(uint add,tvalue)
{
  uchar bai1,shi1,ge1,xiao1;
  bai1=tvalue/1000;
  shi1=tvalue%1000/100;
  ge1=tvalue%100/10;
  xiao1=tvalue%10;
  wr_lcd(comm,add);
  delay(1);
  wr_lcd(dat,0x30+bai1);
  delay(1);
  wr_lcd(dat,0x30+shi1);
  delay(1);
  wr_lcd(dat,0x30+ge1);
  delay(1);
  wr_lcd(dat,0x30+xiao1);
  delay(1);
}

/******************************************************************************************
* 函数名称    :main
* 功能描述    :主函数
******************************************************************************************/
void main()
{
    SP=0x60;
    COM8155=0X02;
    IT0=1;
    EX0=1;
    EA=1;
    ds1820rst();
    ds1820rd();
    delay(100);
    init_lcd();
     clrram();
     delay(100);
     wr_str(0x80,14,TAB1A);
     delay1(10);
     wr_str(0x90,16,TAB1B);
     delay1(10);
     wr_str(0x88,14,TAB1C);
     delay1(10);
     wr_str(0x98,14,TAB1D);
     do
     {
       read_temp();    //读取温度
       Write_wendu(0x8d,tvalue);
       delay1(2100);
       Write_hms(0x97,miao);
       miao++;
        if(miao==60)
        {
           miao=0;
           fen++;
              if(fen==60)
              {
                  fen=0;


                  shi++;
                     if(shi==24)
                     {
                        shi=0;
                     }
                   Write_hms(0x93,shi);
                     delay(1);
              }
            Write_hms(0x95,fen);
              delay(1);
       }
    }

     while(1);
  }



[解决办法]
哪个函数不对?太多了吧。

[解决办法]
DS18B20温度值不能在12864上显示啊,请主要看看18B20部分程序好么?小弟先谢过啊。。
[解决办法]
语句能看懂,但是整体流程不明白,也看不出来原因。


[解决办法]
网上找找吧,这个程序蛮多的,你是用实物硬件来的?
建议:装个Proteus(小虽小,但够用了),搭个简单的原理图,然后分模块测试你的软件代码即可,
比如你现在可以搭个简单的DS18B20电路,然后显示的话用个1602就行了,一般这样测过之后,
实物运行起来是不会有多大问题的。
ds18b20那器件记得毕业设计那会弄得都要吐了,呵呵,现在全忘了……

热点排行