yao2013lin 发表于 2013-7-12 19:15:08

请教一个18b20显示乱码的问题

我前几天做了一个ds18b20,显示乱码。我是看着时序写的,我用的是atmega8515晶振为8mhz,烧录熔丝位设置为8mhz。程序如下
**************8mhz*****************/
#include<iom8515v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int


#definers_clrPORTC&=~BIT(6)
#definers_setPORTC|=BIT(6)
#definers_outDDRC|=BIT(6)

#definerw_clrPORTC&=~BIT(5)
#definerw_setPORTC|=BIT(5)
#definerw_outDDRC|=BIT(5)

#defineen_clrPORTC&=~BIT(7)
#defineen_setPORTC|=BIT(7)
#defineen_outDDRC|=BIT(7)


#definedq_clrPORTC&=~BIT(2)
#definedq_setPORTC|=BIT(2)
#definedq_in   DDRC&=~BIT(2)
#definedq_outDDRC|=BIT(2)
#definedq_r    PINC&BIT(2)


uchar table []={"welcome temp:"};
uchar table_num []={"0123456789"};
uchar disp={0,0,0};
/************函数申明**********/
void write_com(uchar com);
//void delay_ms(uint ms );

void delay_ms(uint ms )
{
    uint i,j;
    for(i=0;i<ms;i++)
    {
            for(j=0;j<1000;j++)//1ms
            {
         asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
            }
    }
}
/*
void delay_us(uint us )
{
    uint i;
    for(i=0;i<us;i++)
    {          
         asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
               asm("nop");
    }
}
*/

void delay_us(int time)
{   
do
        {
        time--;
        }       
while (time>1);
}

void init_1602(void)
{
DDRA=0xff;//设置为输出
PORTA=0;
rs_out;
rw_out;
en_out;
delay_ms(15);

write_com(0x38);                      //设置16x2显示,5x7点阵,8位数据口
write_com(0x08);                  // 显示关闭
write_com(0x01);                      //显示清屏,数据指针以及所有显示清零
write_com(0x06);                      //读写数据,光标及数据指针加一
write_com(0x0C);                  //开显示,光标不显示
}


void write_com(uchar com)//写命令
{
    rs_set ;
    rw_set;
    en_clr ;
    rs_clr ;
    rw_clr;
    PORTA=com;
    delay_ms(1);
    en_set;
    delay_ms(1);
    en_clr;

}
void write_data(uchar dat)//写数据
{
    rs_clr ;
    rw_set;
    en_clr ;
    rs_set ;
    rw_clr;
    PORTA=dat;
    delay_ms(1);
    en_set;
    delay_ms(1);
    en_clr;
}

void dipaly_1602(void)//显示函数
{
    char i;
    write_com(0x80);
    for(i=0;i<7;i++)
    write_data(table);
    write_com(0x80+0x42);
    for(i=0;i<5;i++)
    write_data(table);
    for(i=0;i<2;i++)
        {
    write_data(table_num]);
        delay_ms(10);
        }
   
    write_data(0xdf);//温度符号
    write_data(0x43);
}


/****************ds18b20**************/
void ds18b20_init(void)//初始化函数
{
uchar n;
dq_out;//设置为输出
//dq_set;//先拉高
//delay_us(8);
dq_clr;
delay_us(500);//至少要480uS
dq_set;
delay_us(15);//至少要15us+60us
dq_in;//设置为输入
n=dq_r;
delay_us(100);//等待释放总线

}


void write_byte_ds18b20(uchar dat)//写一个字节
{
uchar i;
dq_out;//设置为输出
for(i=0;i<8;i++)
{
   //delay_us(10);//延时10us
   dq_clr;
       delay_us(10);//延时10us
   if(dat&0x01)//如果写入的是1
   delay_us(4);
      dq_set;
          delay_us(50);
      dat>>=1;
}
delay_us(4);
}

uchar read_byte_ds18b20(void )//读一个字节
{
char i;
uchar value;   
    dq_out;
    for(i=0;i<8;i++)
    {
          dq_clr;
                value>>=1;
       delay_us(15);
      dq_set;
      dq_in;//设置为输入
      if(dq_r)
      value|=0x80;
      delay_us(45);//延时至少要45us
    }
return value;
}
uchar read_temp(void)//读温度
{
uchar temp_h,temp_l;
ds18b20_init();
write_byte_ds18b20(0xcc);//跳过检测rom
write_byte_ds18b20(0x44);//启动温度转化
delay_us(500);//延时至少需要480us
ds18b20_init();
write_byte_ds18b20(0xcc);//跳过检测rom
write_byte_ds18b20(0xbe);//读取温度
temp_l=read_byte_ds18b20();//读低八位
temp_h=read_byte_ds18b20();//读高八位
temp_h<<=4;
temp_h+=(temp_l&0xf0)>>4;
return temp_h;
}

voidmain(void)
{
uchar temp;
init_1602();
ds18b20_init();
while(1)
{
temp=read_temp();
disp=temp/10;
disp=temp%10;
dipaly_1602();
}

}


1602显示正常就是温度显示不出来
页: [1]
查看完整版本: 请教一个18b20显示乱码的问题