qinzhendong 发表于 2010-8-17 12:55:46

请大侠 帮忙看一下我的mega128+18B20+12864 的程序 不知道问题出在哪儿

我的12864 是调的别人的库 没问题这是程序结果总是显示1279不变拔掉1820 竟然还是显示同样的数字,请大侠帮帮忙谢谢
#include<avr/io.h>
#include<util/delay.h>
#include "st7920.h"
#define uchar unsigned char
#define uint unsigned int
unsigned char table0={""};
const char DIP_NUM={"0123456789.C"};
#define ds_dat       (PINA & 0x01)
#define ddr_dat      0

#define out_dat    DDRA|=(1<<ddr_dat)         //set output
#define in_dat   DDRA&=~(1<<ddr_dat)      //set input
#define set_dat    PORTA|=(1<<ddr_dat)      //set dat
#define clr_dat    PORTA&=~(1<<ddr_dat)       //clr dat


      
//unsigned char wmh,wml;
unsigned int a1,a2,a3,a4,a5,a6,a7,a8,a9,a10;   //
long intt;                           //temperature
unsigned char a;
unsigned char b;

//***********************************
//功能:初始化
//说明:
void init_1820(void)
{
   out_dat;               //set output
   set_dat;               //set dat
   clr_dat;               //clr dat
   _delay_us(480);         //wait 480us
   set_dat;               //set dat
   in_dat;                //set input
   _delay_us(60);          //wait 15~60us
   while(!ds_dat);
      out_dat;               //set output
      set_dat;               //set dat
   _delay_us(140);          //wait 60~240us
}

//***********************************
//功能:写一BYTE
//说明:

void write_1820(unsigned char x)
{   
   unsigned char m;
    for(m=0;m<8;m++)
    {
       clr_dat;
       if(x&(1<<m))   
       set_dat;
       else
       {clr_dat; }
      _delay_us(60);   
       set_dat;
    }
       set_dat;
}

//***********************************
//功能:读一BYTE
//说明:
unsigned char read_1820()
{   
    unsigned char temp,k,n;
    temp=0;
    for(n=0;n<8;n++)
       {
      clr_dat ;
      set_dat;
      in_dat;
      k=ds_dat;    //read data
      if(k)
      temp|=(1<<n);
      else
      {temp&=~(1<<n); }
       _delay_us(40);   
      out_dat;
   }
   return (temp);
}

//***********************************
//功能:得到数据
//说明:
   void gettemp()                  
   {   
   
   t=0;   
    //init_1820();      //resert
    // write_1820(0xcc);   //overlook 64bit address
    init_1820();      //resert
   write_1820(0xcc);   //overlook 64bit address
   write_1820(0x44);   //start convert   
   
   _delay_ms(800);
   init_1820();      //resert
    write_1820(0xcc);   // overlook 64bit address
   write_1820(0xbe);   //read memory   
   
   a1=read_1820();    //read temp low
   //a2=read_1820();    //read temp hign
   a3=read_1820();    //read th
   a4=read_1820();    //read tl
   a5=read_1820();    //read config
   a6=read_1820();    //read reserved
   a7=read_1820();    //.............
   a8=read_1820();    //..............
   a9=read_1820();    //read crc

    // if(a2&0xf8) {a10='-';a1=~a1+1;a2=~a2;}       // temperature sign
    // else         a10='+';
   a2=0x07&a2;
   t=t+a2;
   t=t<<8;
   t=t+a1;                           
   t=t*625;                        
                                    
   a=t/1000000;             //100
   a=t%1000000/100000;      //10
   a=t/10000%100%10;      //1
   
   a=t%10000/1000;          //.1
   a=t%1000/100;            //0.01
   a=t%100/10;               //0.001
   a=t%10;                   //0.0001
   
   a=a*100+a*10+a;            //int part
   a=a*1000+a*100+a*10+a;//decimal fraction
       table0=DIP_NUM[ a];
       table0=DIP_NUM[ a];
       table0=DIP_NUM[ a];
          table0=DIP_NUM[ 10];
       table0=DIP_NUM[ a];
       
       table0=DIP_NUM;
               
}   


/*void get_id()
{    unsigned char ii=0;   
   init_1820();      //resert
   write_1820(0x33);
   
   for(ii;ii<8;ii++)
   {b=read_1820();
   }
}

*/




unsigned char text[]={"少说话多做事"};
int main()
{
   
        //LCD_ClearRam();
        //LCD_DisplayCLR();
   LCD_Init();
       LCD_DisplayChinese(0,0,text);
//       while(1);

    //unsigned char d=4;
// unsigned char c=5;
//       unsigned char b=6;
        //table2=4;
   // LCD_Init();
///        LCD_ClearRam();
//        LCD_DisplayCLR();
        // LCD_DisplayChinese(0,0,text1);
           //LCD_DisplayCLR();       
   //Init_DS18B20();
       
   while(1)
{
   
           //_delay_ms(10);
   //LCD_DisplayStrings_WithAddress(0x80,text);
// init_1820() ;
// get_temp();
          gettemp();   
   //_delay_ms(50);
   LCD_Init();
   LCD_ClearRam();
           LCD_DisplayCLR();
   LCD_DisplayChinese(0,2,text);
   _delay_ms(500);
   LCD_DisplayChinese(0,1,table0);
   //LCD_DisplayStrings_WithAddress(0x80,table2);
// LCD_DisplayStrings_WithAddress(0x80,"table2");
// LCD_DisplayChinese(0,2,table0);
        _delay_ms(500);          
   }

}

qinzhendong 发表于 2010-8-17 12:59:21

我的程序 只读低八位 也是得到不变的数字

zhurenjiejj 发表于 2010-8-17 14:52:56

#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uintunsigned int

#define DS18B20 PF0
#define RESOLU_9            0X1F        //即分别对应config 中的R1 R0=00 01 10 11
#define RESOLU_10             0X3F
#define RESOLU_11             0X5F
#define RESOLU_12             0X7F

#define RD_ROM                                     0X33   //总线上只有一个设备时才可能使用该命令
#define MATCH_ROM                              0X55
#define SKIP_ROM                          0XCC
#define SEARCH_ROM                          0XF0
#define ALARM_ROM                                       0XEC

#define TEMP_TRANS                          0X44//启动温度转换
#define RD_SCRATCHPAD                   0XBE//从暂存存储器中读字节(9字节)从字节0开始,可由复位中断读
#define WR_SCRATCHPAD                   0X4E //写数值到暂存存储器地址2和3(TH,TL温度触发器)
#define COPY_SCRATCHPAD                 0X48 //将暂存存储器中数值调入E2中(仅地址2、3:TH,TL高低温触发)
#define RECALL_E2                                        0XB8 //将非易失性存储器中的数值重新调入暂存存储器
#define RD_POWER                                        0XB4//发18B20电源方式的信号到主机

/******************************************************************
- 功能描述:延时函数
- 隶属模块:延时
- 函数属性:外部,供用户使用
- 参数说明:us:us级的延时
- 返回说明:无
- 注:无
******************************************************************/
void delay_us(uint us)                  
{
                  uint i;
                  us = us*5/4;                         //5/4是在8MHz晶振下,通过软件仿真反复实验得到的数值
                  for(i=0; i<us; i++);
}



/******************************************************************
- 功能描述:延时函数
- 隶属模块:延时
- 函数属性:外部,供用户使用
- 参数说明:ms:ms级的延时
- 返回说明:无
- 注:无
******************************************************************/
void delay(uint ms)                  
{
                  uint i,j;
                  for(i=0; i<ms; i++)
                     for(j=0; j<1141; j++);       
}



/******************************************************************
- 功能描述:18b20的初始化
- 隶属模块:18b20
- 函数属性:内部
- 参数说明:无
- 返回说明:无
- 注:无
******************************************************************/
void _18B20_Init(void)
{
                  DDRF |= BIT(DS18B20);      
                  PORTF &= ~BIT(DS18B20);      //主机(Master Tx)发送复位脉冲
                  delay_us(600);               //拉低至少480us
                  PORTF |= BIT(DS18B20);
                  delay_us(40);                                       //18B20等待15-60us再响应主机复位脉冲发存在脉冲
                  
                  DDRF &= ~BIT(DS18B20);       //配置为输入,等待18B20发主机发存在脉冲
                  while(PINF & BIT(DS18B20));//等待18B20拉低总线(ds18b20 Tx)
                  delay_us(150);
                  while(!(PINF & BIT(DS18B20))); ////等待18B20释放总线
                  DDRF |= BIT(DS18B20);
}



/******************************************************************
- 功能描述:18b20的写入字节
- 隶属模块:18b20
- 函数属性:内部
- 参数说明:DaCmd为要写入的字节
- 返回说明:无
- 注:无
******************************************************************/
void Write_18B20(uchar DaCmd)   //所有写时间片操作至少需要60us
{
                  uchar i = 0;
                  for(i=0; i<8; i++)
                     {
                                   DDRF |= BIT(DS18B20);   //配置为输出
                                          PORTF &= ~BIT(DS18B20); //拉低总线,启动写数据位
                                          delay_us(2);            //每个独立的写周期都要1us的恢复时间
                              if(DaCmd & 0x01)
                                             PORTF |= BIT(DS18B20);   //DQ线拉低后15-60us,18b20对总线采样
                                        else                        //总线为高则写1操作,为低则写0操作
                                             PORTF &= ~BIT(DS18B20);          
                              delay_us(60);
                                        PORTF |= BIT(DS18B20);//释放总线
                                        DaCmd >>= 1;       
                          }
               delay_us(50);   
}



/******************************************************************
- 功能描述:18b20的读出字节
- 隶属模块:18b20
- 函数属性:内部
- 参数说明:无
- 返回说明:返回读出的字节
- 注:无
******************************************************************/
uchar Read_18B20(void)
{
                        uchar i = 0;
                        uchar recByte = 0;
                        for(i=0; i<8; i++)
                           {
                                  recByte >>= 1;
                                        DDRF |= BIT(DS18B20);    //配置为输出
                                        PORTF &= ~BIT(DS18B20);//主机拉低总线,启起读操作
                             //delay_us(1);          //不能有延时
                                        PORTF |= BIT(DS18B20);
                                   delay_us(5);
                                        DDRF &= ~BIT(DS18B20);   //配置为输入,开始读取数据位
                                        if(PINF & BIT(DS18B20))
                                                recByte |= 0x80;
                                   delay_us(60);
                                }
                        returnrecByte;
}



/******************************************************************
- 功能描述:18b20的分辨率调整
- 隶属模块:18b20
- 函数属性:外部
- 参数说明:RESOLU_9;RESOLU_10;RESOLU_11;RESOLU_12(对应9--12位分辨率)
- 返回说明:无
- 注:无
******************************************************************/
void Adjust_Resolu(uchar resolu)//调整分辨率resolu:0x1f,0x3f,0x5f,0x7f
{                                                                                              //分别对应0.5c,0.25,0.125,0.0625

                  _18B20_Init();
                  Write_18B20(SKIP_ROM);
                  Write_18B20(WR_SCRATCHPAD);
                  Write_18B20(0x44);         //设置TH
                  Write_18B20(0x86);                  //设置TL
                  Write_18B20(resolu);                   //设置配置寄存器R1 R0=01(分辨率10bit)          
                  _18B20_Init();
                  Write_18B20(SKIP_ROM);
                  Write_18B20(COPY_SCRATCHPAD);
}




/******************************************************************
- 功能描述:18b20的读出温度
- 隶属模块:18b20
- 函数属性:外部
- 参数说明:无
- 返回说明:Temp_H:返回温度的16进制
- 注:g_TH, g_TL存放返回温度16进制的高低字节
******************************************************************/
uchar g_TH, g_TL;//全局变量

uint Convert_T(void)
{   
          uint Temp_H = 0;   //定义为无符整型(16bit),最后用于存放温度
                  uchar Temp_L = 0;
                  uchar inter = 0;
                  uchar decim =0;
                  uchar i = 0;
          _18B20_Init();
                  Write_18B20(SKIP_ROM);//单点总线,选择跳过ROM检测
                  Write_18B20(TEMP_TRANS);
                  delay(800);          //温度转换需要750ms的时间,不然每次读的是上次值
                                              
                  _18B20_Init();
                  Write_18B20(SKIP_ROM);
                  Write_18B20(RD_SCRATCHPAD);
          Temp_L = Read_18B20();    //该字节的低4位是温度的小数部分
                  Temp_H = Read_18B20();   //该字节的高5位是符号位,为0是表正温度,为1时为负
                  g_TH = Read_18B20();        //温度上限和下限,用于报警
          g_TL = Read_18B20();
                                    
                  Temp_H =(Temp_H<<8) | (Temp_L);   //转化为16位数据
                  return Temp_H;
}


/******************************************************************
- 功能描述:18b20的扩展性功能模块
- 隶属模块:18b20
- 函数属性:外部
- 参数说明:带入温度的16进制
- 返回说明:neg_flag:为负温度标志位
- 注:可以判断温度正负并转换为ACS码
******************************************************************/
uchar g_temperature;//全局数组,用来存放温度

uchar Split_temp(uint temp_val)
{
          uchar inter = 0;
                  uchar decim = 0;
                  uchar neg_flag = 0;   //负数标记
                  if((temp_val) & (0xF000))
                                 {
                                                  temp_val = ~temp_val+1;
                                                neg_flag = 1;   //表明为负温度
                               }
                  else
                     {
                                           neg_flag = 0;
                               }               
                               
                  inter = (uchar)(temp_val*0.0625);          //取整数部分                                                                          
                  decim = (uchar)(temp_val & 0xf)*0.625;//10位分辨率bit0,bit1未定义,权值为0
                                                                                                   //扩大10倍,后取整,保留一位小数,有强制转换float->char               
                  if(inter >= 100)
                            inter = 0;
                  g_temperature = inter/10 +'0';
                  g_temperature = inter%10 +'0';
                  g_temperature = '.';
                  g_temperature = decim +'0';
                  return neg_flag;
}

/******************************************************************
- 功能描述:向LCD中写入命令
- 隶属模块:LCD模块
- 函数属性:外部,供用户使用
- 参数说明:com:为命令控制字
- 返回说明:实现向LCD中写入控制命令
- 注:无
******************************************************************/
void write_com(uchar com)
{
       PORTB&=~BIT(0);//RS
           PORTB&=~BIT(1);//RW
           PORTD=com;
           PORTB|=BIT(2);   //EN
           delay(1);
           PORTB&=~BIT(2);//EN
}

/******************************************************************
- 功能描述:向LCD中写入数据
- 隶属模块:LCD模块
- 函数属性:外部,供用户使用
- 参数说明:dat:为写入的数据
- 返回说明:实现向LCD中写入数据
- 注:无
******************************************************************/
void write_dat(uchar dat)
{   
       PORTB|=BIT(0);//RS
           PORTB&=~BIT(1);//RW
           PORTD=dat;
           PORTB|=BIT(2);   //EN
           delay(1);
           PORTB&=~BIT(2);   //EN

}

/******************************************************************
- 功能描述:LCD初始化
- 隶属模块:LCD模块
- 函数属性:内部
- 参数说明:无
- 返回说明:实现LCD的初始化
- 注:无
******************************************************************/
void lcd_Init() //lcd初始化
{
      DDRD=0XFF;//数据端
          DDRB|=BIT(0)|BIT(1)|BIT(2);   //控制端 RS RW EN
          PORTB&=~BIT(2);
          write_com(0X30);
          delay(1);
          write_com(0X01);
          delay(1);
          write_com(0X0C);
          delay(1);
          write_com(0X06); //如果为07且write_com(0X18)。。显示为右到左的现实直到消失,如果为06且write_com(0X18)为右到左显示
                         //07表示右边到左边显示出来。。06为光标处出现
}

void main()
{
   uchar i;
   uint Temperature,Tem;
   lcd_Init();               //液晶初始化
   Adjust_Resolu(RESOLU_11);
   while(1)
        {
          Temperature=(Convert_T());   //除以100保留小数点后2位,符合18b20的10位精度
          Tem=Temperature*6.25;
          g_temperature=Tem/1000+'0';
          g_temperature=Tem%1000/100+'0';
          g_temperature='.';
          g_temperature=Tem%100/10+'0';
          g_temperature=Tem%10+'0';
          write_com(0X80);
          delay(1);
          write_dat(g_temperature);
          delay(1);
          write_dat(g_temperature);
          delay(1);
          write_dat(g_temperature);
          delay(1);          
          write_dat(g_temperature);
          delay(1);
          write_dat(g_temperature);
          delay(1);
        }
}



这个肯定没问题。。我前几天做的..1820部分抄论坛上的

qinzhendong 发表于 2010-8-17 20:52:26

回复【2楼】zhurenjiejj
-----------------------------------------------------------------------
谢谢了 您的程序 我稍微修改一下用还是不好使。
我想问一下 18B20的手册上说 释放总线 是什么意思 ?
是设置PORTx口 为高阻态 还是上拉电阻啊

zhurenjiejj 发表于 2010-9-26 12:20:49

这么会不好用。。我是128接12864画温度曲线,挺好用的啊

chump 发表于 2013-3-17 15:48:55

呜呜,好感动,参看3楼程序,成功调出
页: [1]
查看完整版本: 请大侠 帮忙看一下我的mega128+18B20+12864 的程序 不知道问题出在哪儿