| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 400 人关注过本帖
标题:(求助)这个代码是我从网下的用18B20测温阴极数码管显示我先把变成阳极显示 ...
只看楼主 加入收藏
NT06
Rank: 1
等 级:新手上路
帖 子:27
专家分:2
注 册:2011-3-24
结帖率:40%
收藏
 问题点数:0 回复次数:0 
(求助)这个代码是我从网下的用18B20测温阴极数码管显示我先把变成阳极显示
#include"reg52.h"
#define uchar unsigned char
#define uint  unsigned int
#define jump_ROM  0xCC                 //写跳过读ROM指令。因为只对一个DB18B20操作。
#define start    0x44      // 写温度转换指令。
#define read_EEROM 0xBE    //读暂存器,读内部RAM中9字节的温度
sbit DQ=P2^3;                       //DS18B02唯一与单片机连接的 数据端
uchar TMPH  ,TMPL;                  //用于读取高低 8位数据。
uchar code tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};  //不带小数点
uchar code table1[11]={0XBF,0X86,0XDB,0XCF,0XE6,0XED,0XFD,0X87,0XFF,0XEF,0x39};  //带点的     //0x39是C
uchar code LED_W[8] = {0,1,2,3,4,5,6,7};
//)为不加小数点的,  后10个(0~9)为加小数点的,
/****************************************************************************************

     以下为延时函数,晶振为11.0592的时候,延时一次大约为:16us。
*******************************************************************************************/
void delay(uint us)
{
   uint s;
   for(s=0;s<us;s++);
}

/******************************************************************************************
  一下为复位函数。resert()  并且读取它的信号。  
  注意:一个delay(1)=16us
********************************************************************************************/
uchar  resert(void)
{
   uchar  receive_ready;
   DQ=0;
   delay(32) ;       //最好延时时间为480us。 本次为32*16=512us。
   DQ=1;
   delay(3);            //延时等待。
   receive_ready=DQ;       //获取信号。
   delay(25);             //等待时间隙 完。 不超过480us,本次为400us。
   return  receive_ready;    //返回信号
}


/********************************************************************
* 名称 : read_bit()
* 功能 : 从DS18B20读一个位值
* 输入 : 无
* 输出 : 从DS18B20读出的一个位值
***********************************************************************/
uchar read_bit()
{
    uchar i;
 DQ=0;
 DQ=1;
 for(i=0;i<3;i++);    //从时间隙开始延时15us。
 return  DQ;      //读出的一个位值返回
}
/********************************************************************
* 名称 : write_bit()
* 功能 : 向DS18B20写一位
* 输入 : bitval(要对DS18B20写入的位值)
* 输出 : 无
***********************************************************************/

void  write_bit(bitval)
{
   
   DQ=0;   //先把数据位置0,开始时间隙。
   //delay(1);        //延时16us。
   if(bitval==1)
   DQ=1;
   delay(5);         //在其余的时间隙保持值。
   DQ=1;

}
/********************************************************************
* 名称 : read_byte()
* 功能 : 从DS18B20读一个字节
* 输入 : 无
* 输出 : 从DS18B20读到的值
***********************************************************************/
uchar  read_byte()
{
    uchar i;
 uchar  value=0;
 for(i=0;i<8;i++)
 {
      if(read_bit())         //当read_bit()=0时,value=0; 当 read_bit()=1时,执行 value|=0x01<<i;,value=1。
   {
      value|=0x01<<i;    //按位或|。  有一个为1则为1
   
   
    }
    delay(6) ;          //等待剩下时间隙。
 
 }

 return  value;

}

/********************************************************************
* 名称 : write_byte()
* 功能 : 向DS18B20写一个字节
* 输入 : val(要对DS18B20写入的命令值)
* 输出 : 无
***********************************************************************/
void write_byte(uchar val)
{
    uchar i,temp;
 for(i=0;i<8;i++)
 {
      
    temp=val>>i;
    temp=temp&0x01;
    write_bit(temp);
  }
   delay(5);

}





//**************获取温度的数值************************************************
uint  get_temp()
{
   float  f_temp;
   uint temp;
   P2=0x00;
   resert();            //通过单总线的所有执行(处理 )都从一个初始化程序开始。其包括总线发出的复位脉冲和{ 从机发出的脉冲。(单机)}
   //write_byte(jump_ROM)  ;        //jump_ROM= 0xCC,  写跳过读ROM指令。因为只对一个DB18B20操作。
   //write_byte(start);                //start 0x44             写温度转换指令。
   //resert();
   write_byte(jump_ROM);            // 写跳过读ROM指令。因为只对一个DB18B20操作。
   write_byte(read_EEROM);       //read_EEROM =0xBE    ,读暂存器,读内部RAM中9字节的温度
   TMPL = read_byte();               //读取低字节的8位数据
   TMPH = read_byte();              //读取低字节的8位数据
   temp = TMPH;                     //把高位的8字节数据 付给temp。
   temp <<= 8;                     //两个字节为一个字
   temp = temp | TMPL;
   f_temp=temp*0.0625;               //温度在寄存器里面是12位,分辨率为:0.0625。
   temp=f_temp*10+0.5;           //扩大10倍为了保存以为小数点。加0.5是为了四舍五入。
   f_temp=f_temp+0.05;
   return   temp;

}

void display(uint tem)   
{
 uchar j;
 
 tem=get_temp();
 for(j=500; j>0; j--)
 {
  
         P2=LED_W[4];
            P0 = tab[tem / 100];
      delay(200);
            P2=LED_W[5];
      P0 = table1[tem / 10 % 10];
      delay(200);
            P2=LED_W[6];
      P0 = tab[tem % 10];
         delay(200);
   P2=LED_W[7];
      P0 = table1[10];
        delay(200);
 }
}


//*****************温度转换函数****************************
void tempchange()
{
    resert();
 delay(50);
 write_byte(jump_ROM);      // 写跳过读ROM指令。因为只对一个DB18B20操作。
 write_byte(start);     //  写温度转换指令。

}

/********************************************************************
* 名称 : Main()
* 功能 : 主函数
* 输入 : 无
* 输出 : 无
***********************************************************************/
void main()
{
   while(1)
   {
       tempchange();              //温度转换函数。
   
       display( 0);
   }
 
}
我把它的tab变成阳极的是不是就行了?
搜索更多相关主题的帖子: 数据 单片机 include 数码管 小数点 
2012-05-21 18:46
快速回复:(求助)这个代码是我从网下的用18B20测温阴极数码管显示我先把变成阳 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015716 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved