搜索
bottom↓
回复: 6

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

[复制链接]

出0入0汤圆

发表于 2010-8-17 12:55:46 | 显示全部楼层 |阅读模式
我的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[7]={""};
const char DIP_NUM[16]={"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 int  t;                           //temperature  
unsigned char a[9];
unsigned char b[9];

//***********************************
//功能:初始化
//说明:
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[0]=t/1000000;             //100
     a[1]=t%1000000/100000;      //10  
     a[2]=t/10000%100%10;        //1
     
     a[4]=t%10000/1000;          //.1
     a[5]=t%1000/100;            //0.01
     a[6]=t%100/10;               //0.001
     a[7]=t%10;                   //0.0001  
     
     a[3]=a[0]*100+a[1]*10+a[2];            //int part
     a[8]=a[4]*1000+a[5]*100+a[6]*10+a[7];  //decimal fraction
         table0[0]=DIP_NUM[ a[0]];
         table0[1]=DIP_NUM[ a[1]];
         table0[2]=DIP_NUM[ a[2]];
          table0[3]=DIP_NUM[ 10];
         table0[4]=DIP_NUM[ a[4]];
       
         table0[5]=DIP_NUM[11];
               
}   


/*void get_id()
{    unsigned char ii=0;   
     init_1820();        //resert
     write_1820(0x33);
   
     for(ii;ii<8;ii++)
     {b[ii]=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[3]=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[d]");
  // LCD_DisplayChinese(0,2,table0);
        _delay_ms(500);          
   }
  
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

 楼主| 发表于 2010-8-17 12:59:21 | 显示全部楼层
我的程序 只读低八位 也是得到不变的数字

出0入0汤圆

发表于 2010-8-17 14:52:56 | 显示全部楼层
#include <iom128v.h>
#include <macros.h>
#define uchar unsigned char
#define uint  unsigned 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);
                                }
                        return  recByte;
}



/******************************************************************
- 功能描述: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[5];  //全局数组,用来存放温度

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[0] = inter/10 +'0';
                  g_temperature[1] = inter%10 +'0';
                  g_temperature[2] = '.';
                  g_temperature[3] = 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[4]=Tem/1000+'0';
          g_temperature[3]=Tem%1000/100+'0';
          g_temperature[2]='.';
          g_temperature[1]=Tem%100/10+'0';
          g_temperature[0]=Tem%10+'0';
          write_com(0X80);
          delay(1);
          write_dat(g_temperature[4]);
          delay(1);
          write_dat(g_temperature[3]);
          delay(1);
          write_dat(g_temperature[2]);
          delay(1);          
          write_dat(g_temperature[1]);
          delay(1);
          write_dat(g_temperature[0]);
          delay(1);
        }
}



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

出0入0汤圆

 楼主| 发表于 2010-8-17 20:52:26 | 显示全部楼层
回复【2楼】zhurenjiejj
-----------------------------------------------------------------------
谢谢了 您的程序 我稍微修改一下用  还是不好使。
我想问一下 18B20的手册上说 释放总线 是什么意思 ?
是设置PORTx口 为高阻态 还是上拉电阻啊

出0入0汤圆

发表于 2010-9-26 12:20:49 | 显示全部楼层
这么会不好用。。我是128接12864画温度曲线,挺好用的啊

出0入0汤圆

发表于 2013-3-17 15:48:55 | 显示全部楼层
呜呜,好感动,参看3楼程序,成功调出
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 01:24

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表