搜索
bottom↓
回复: 0

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

[复制链接]

出0入0汤圆

发表于 2013-7-12 19:15:08 | 显示全部楼层 |阅读模式
我前几天做了一个ds18b20,显示乱码。我是看着时序写的,我用的是atmega8515晶振为8mhz,烧录熔丝位设置为8mhz。程序如下
**************8mhz*****************/
#include<iom8515v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int


#define  rs_clr  PORTC&=~BIT(6)
#define  rs_set  PORTC|=BIT(6)
#define  rs_out  DDRC|=BIT(6)

#define  rw_clr  PORTC&=~BIT(5)
#define  rw_set  PORTC|=BIT(5)
#define  rw_out  DDRC|=BIT(5)

#define  en_clr  PORTC&=~BIT(7)
#define  en_set  PORTC|=BIT(7)
#define  en_out  DDRC|=BIT(7)


#define  dq_clr  PORTC&=~BIT(2)
#define  dq_set  PORTC|=BIT(2)
#define  dq_in   DDRC&=~BIT(2)
#define  dq_out  DDRC|=BIT(2)
#define  dq_r    PINC&BIT(2)


uchar table []={"welcome temp:"};
uchar table_num []={"0123456789"};
uchar disp[3]={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[i]);
    write_com(0x80+0x42);
    for(i=0;i<5;i++)
    write_data(table[i+8]);
    for(i=0;i<2;i++)
        {
    write_data(table_num[disp[i]]);
        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;
}

void  main(void)
{
uchar temp;
init_1602();
ds18b20_init();
while(1)
{
  temp=read_temp();
  disp[0]=temp/10;
  disp[1]=temp%10;
  dipaly_1602();
}

}


1602显示正常就是温度显示不出来

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-7-24 01:33

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

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