找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2495|回复: 5
打印 上一主题 下一主题
收起左侧

求助,根据at90s8515写的温度检测,一直检测出了的是-1.5,不知道哪里出了问题

[复制链接]
跳转到指定楼层
楼主
程序如下,芯片频率是12M
#include<90s8515.h>
#include<delay.h>

unsigned int temp;
unsigned char dis[4]={0,0,0,0};
unsigned char led[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0xff,0xbf};//共阳极数显管显示0,1,2,3,4,5,6,7,8,9,不显示,负号
unsigned char led1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//带小数点显示

unsigned char init(void)    //ds18b20初始化
{
  unsigned char flag;  
  DDRD=1;//端口设为输出,发送低电平   
  delay_us(550);//延时550us
  DDRD=0;//端口设为输入,释放总线,等待ds18b20响应
  delay_us(68);//延时68us       
while(PIND);
while(!PIND);
if(PIND)
{flag=0;}
else
{flag=1;}       
  delay_us(500);       
  return flag;                                                                    
  }   

void  write(unsigned char dat)    //写字节
{       
        unsigned char i=0;
        for(i=8;i>0;i--)
        {        
                 DDRD=1;//拉低总线
         delay_us(2);
         if(dat&1)
         {DDRD=1;}
         else
         {DDRD=0;}  
         dat>>=1;
         delay_us(60);//主机延时60us,等待ds18b20进行采样
         DDRD=0;//释放总线  
         //delay_us(2);
         }
}

unsigned char read(void)   //读字节
{
        unsigned  char i=0;
        unsigned char dat=0;  
        for(i=8;i>0;i--)
        {         DDRD=1; //定义为输出,拉低总线
        delay_us(1);
        DDRD=0;//定义为输入,释放总线
        delay_us(9);  
        dat>>=1;
        if(PIND)
                dat|=0x80; //按位或然后赋值给dat,读取数据最高位为1
        delay_us(65);
                }       

                return(dat);
}


void Display(unsigned int temp)     //显示函数
{
    if(temp<=0x0800)//进行温度转换
    {
    temp>>=4;//二进制转换成十进制                                                
    temp*=10;
    dis[0]=temp/1000;
    dis[1]=temp%1000/100;
    dis[2]=temp%1000%100/10;
    dis[3]=temp%1000%100%10;
    }
    else
    {
     temp=~temp;
     temp+=1;
     temp>>=4;
     dis[0]=0x0c;
     dis[1]=temp%100/10;
     dis[2]=temp%100%10;
     dis[3]=0;
    }  
    DDRC=0X0F;
    DDRA=0XFF;

    PORTC=0x01;
    PORTA=led[dis[0]];
    delay_us(400);

    PORTC=0x02;
    PORTA=led1[dis[1]];
    delay_us(400);

    PORTC=0x04;
    PORTA=led[dis[2]];
    delay_us(400);

    PORTC=0x08;
    PORTA=led[dis[3]];
    delay_us(400);
}

void main()
{   
    unsigned char th,tl;
    while(1)
    {
    init();
    write(0xcc);//跳过ROM的操作
    write(0x44);//进行温度变换
    delay_ms(10);     

    init();
    write(0xcc);//跳过ROM的操作
    write(0xbe);//发出读取RAM的命令  

    th=read();
    tl=read();
     temp=th<<8;
     temp|=tl;
     Display(temp);
   }
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶1 踩
回复

使用道具 举报

沙发
ID:382826 发表于 2018-10-19 12:09 | 只看该作者
temp=th<<8;会不会有问题呀!th是8位变量,左移8位后给temp会不会出错,应该temp=th;temp=temp<<8;
回复

使用道具 举报

板凳
ID:411631 发表于 2018-10-19 12:22 | 只看该作者
已经解决了
回复

使用道具 举报

地板
ID:411631 发表于 2018-10-19 13:00 | 只看该作者
已经解决了,就是不知道为什么数显管不显示“-”号
回复

使用道具 举报

5#
ID:199427 发表于 2018-11-7 13:02 | 只看该作者
楼主,请问你的问题是怎么解决的?
另外,恳求能不能上传一份完整的程序,包括头文件。
回复

使用道具 举报

6#
ID:480718 发表于 2019-12-16 14:54 | 只看该作者
你是不是显示程序没写对。。。我就经常数码管程序写错细节,你仔细检查一下啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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