新生求叫,做了个简单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,问题就是变量的转换出了问题,但是我实在找不出转换的问题,求大神解救
#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是可以显示出来的,但是为什么用于数码管就不行呢
是不是用三八译码器了?看看硬件连接是否正确。