微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 新生求叫,做了个简单51的数码管温度显示,但是显示不出来

新生求叫,做了个简单51的数码管温度显示,但是显示不出来

时间:10-02 整理:3721RD 点击:
#include <reg51.h>
#include<intrins.h>
#include<stdio.h>
#define uchar unsigned char
#define uint unsigned int
#define DIG P0
uchar code shuzi[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
uint chucun[5]={0x3f,0x3f,0x3f,0x3f,0x3f};
uint a=0;
sbit DSIO=P3^7;
sbit LSA=P2^2;
sbit LSB=P2^3;
sbit LSC=P2^4;
void delay(unsigned int a) //延迟函数 毫秒级别
{
   int i;
   for(a;a>0;a--)
   for(i=110;i>0;i--);
}
void delayus(uint us)         //微秒级别
{
    while (--us);
}
uchar DS18B20start() //18B20初始化函数
{int i;
DSIO=0;
i=100;while(i--);
DSIO=1;
i=0;
while(DSIO)
   {  i++;
                if(i>50000)
          return 0;
   }
i=15;while(i--);
DSIO=1;
i=100;while(i--);
   return 1;
}
void sendbyte(uchar dat)                //数据写入18B20函数          
{ int i,j;
  bit sdat;
  for(j=0;j<8;j++)
   {
         sdat=dat&0x01;
         dat=dat>>1;
         if(sdat)
           {
             DSIO=0;i++;i++;
                 DSIO=1;i=8;while(i--);
           }
         else
           {
            DSIO=0;i=8;while(i--);
                DSIO=1;i++;i++;
           }
   }
}
uchar readbyte()                        //18B20数据读取函数
{  unsigned char dat;
   unsigned char bi;
   int i;int j;
   for(j=8;j>0;j--)
    {
          DSIO=1;i++;
          DSIO=0;i++;
          DSIO=1;
      i++;i++;
          bi=DSIO;
          i=8;while(i--);
          dat=(dat>>1)|(bi<<7);
        }
    return dat;
}
int DS18B20readtemp()         //温度读取函数
{ unsigned int temp=0;
  uchar th,tl;
  DS18B20start();
  delay(1);
  sendbyte(0xcc);                        //跳过ROM操作
  sendbyte(0x44);                        //发送转换命令
  delayus(750);
  //while(!DSIO);
  DS18B20start();
  sendbyte(0xcc);                   //跳过ROM操作
  sendbyte(0xbe);                   //发送读取命令
  tl=readbyte();                   //温度读取开始
  th=readbyte();
  temp=th;
  temp=temp<<8;
        temp|=tl;                  //温度读取结束
  return temp;
}
void display(int temp)
{
  float tp;
        if(temp>0)
          {        chucun[4]=0;
                tp=temp;
            temp=tp*0.0625*100+0.5;
          }
        else
          {        chucun[4]=0x40;
           temp=temp-1;
           temp=~temp;
           tp=temp;
           temp=tp*0.0625*100+0.5;
          }
  chucun[3]=shuzi[temp/10000];                   //百位
  chucun[2]=shuzi[temp%10000/1000];                 //十位
  chucun[1]=shuzi[temp%1000/100]|0x80;                   //个位
  chucun[0]=shuzi[temp%100/10];                                                 //小数点后
}
//void display(int temp)
//{
//chucun[3]=shuzi[temp / 10000];                   //百位
//chucun[2]=shuzi[temp % 10000 / 1000];                 //十位
//chucun[1]=shuzi[temp % 1000 / 100]|0x80;                   //个位
//chucun[0]=shuzi[temp % 100 / 10];                                                 //小数点后
//}
void Timestart()
{
   TMOD=0x20;
   TH1=0x9c;
   TL1=0x9c;
   ET1=1;
   EA=1;
   TR1=1;
}
void main()
{
   Timestart();
   while(1)
   {
      display(DS18B20readtemp());
   }
}
void DIGstart() interrupt 3
{  
   DIG=0;
        switch(a)
                {
                      case(0):
                       LSA=0;LSB=0;LSC=0; break;
                                  case(1):
                                   LSA=1;LSB=0;LSC=0; break;
                                  case(2):
                                   LSA=0;LSB=1;LSC=0; break;
                                  case(3):
                                   LSA=1;LSB=1;LSC=0; break;
                                   case(4):
                                   LSA=0;LSB=0;LSC=1; break;
                }
        DIG=chucun[a];
                a++;
                if(a==4)
                   a=0;         
}
当改变shuzi[x]中x的值的时候就可以显示出所改的值,但是一旦换成变量,显示出来的就是0,问题就是变量的转换出了问题,但是我实在找不出转换的问题,求大神解救

温度模块没有问题

谢谢,但是改了之后还是不行,怎么办……

谢谢,我会仔细看的,好的,以后学单独写

换成unsigned int 试试?



……经过我的排查,是温度显示模块出了问题,然而我这个温度显示模块用于LCD1602是可以显示出来的,但是为什么用于数码管就不行呢

是不是用三八译码器了?看看硬件连接是否正确。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top