新手请教~ds18b20数码管显示温度哪里出了问题?

2019-07-18 13:18发布

本人初学者,写出多处错误请见谅啊,包括注释部分的理解也可能是错的程序说: “WENDUJI.C(189): warning C206: 'displaytemp': missing function-prototype”               “WENDUJI.C(189): error C267: 'displaytemp': requires ANSI-style prototype”             但我已经把函数写在主函数前了,而且displaytemp调用的函数是整型啊#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit ds=P2^2;sbit dula=P2^6;sbit wela=P2^7;uint temp;//整型温度数据float f_temp; //浮点型温度数据uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 带小数点编码。
/***********************************///延时void delay(uint t){        uint x,y;        for(x=t;x>0;x--)                for(y=110;y>0;y--);}/***********************************/
/***********************************///ds18b20初始化bit reset(){        uint time;        bit flag;//用于存储ds18b20是否工作,flag=1表工作        ds=1;        for(time=0;time<2;time++);//略延时6微妙        ds=0;        for(time=0;time<200;time++);//延时约600微秒//以向DS18B20发出480~960的低脉冲        ds=1;//释放数据线        for(time=0;time<10;time++);//延时30us(释放总先后等待15~60us让18b20输出)        flag=ds;//输出到标志位        for(time=0;time<200;time++);//延时足够长时间,等待存在脉冲输出完毕        return(flag);//返回标志位。}/***********************************/
/***********************************///ds18b20向ds18b20写一个字节void write_byte(uchar dat){        uint i,j;        bit testb;        for(j=0;j<8;j++)//写够8个字节        {                testb=dat&0x01;//testb读取主机发出的dat中的第一位                dat>>=1;//dat要移动才能让testb读下一位                if(testb)//write 1                {                        ds=0;                        i++;i++;//延时2微妙                        ds=1;                        i=8;while(i>0)i--;//延时16微妙,这时ds18b20采样16微妙左右                }                else//write 0                {                        ds=0;                        i=15;while(i>0)i--;//延时30微妙,ds18b20有大概15微妙的采样时间                        ds=1;                        i++;i++;//两个写操作之间要至少多于1微妙,但少于15微妙                }        }        for(i=0;i<4;i++);//稍作延时给硬件一点反应时间。}/***********************************/

/***********************************///主机向ds18b20读一个字节//主机是从最低位开始读的uchar read_byte(){        uint i,j;        uchar dat;//用于读取字节        for(i=0;i<8;i++)        {                ds=0;//启动读时序                j++;                ds=1;//人为把数据线拉高,为检测ds18b20做准备                j++;j++;j++;//ds18b20将给出相应电平                dat>>=1;                if(ds==1)                {                        dat|=0x80;//这时就把1放在dat的最高位,如果再读一次,通过dat的右移,就可以把前一个读到的数据存储起来,直至存完为止                }                else                {                        dat|=0x00;//这时就可以把0存到最高位                }                for(j=0;j<2;j++);//延时大于1微妙的恢复期        }        return(dat);        ds=1;//将数据线拉高以处理其它指令}/***********************************/
/***********************************///发送温度转换命令void tempchange(){        reset();        delay(1);        write_byte(0xcc);// 跳过序列号命令        write_byte(0x44);//发送温度转换命令}/***********************************/
/***********************************///读取寄存器中存储的温度数据uint gettemperature(){        float temperature;        uchar di,gao;        reset();        delay(1);        write_byte(0xcc);// 发Skip ROM命令        write_byte(0xbe);// 发读命令        di=read_byte();//温度低8位        gao=read_byte();//温度高8位        temp=gao;        temp<<=8;//two byte compose a int variable        temp|=di;//两字节合成一个整型变量。        temperature=temp*0.0625;//得到真实十进制温度值        temp=temperature*10+0.5;//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作        return temp;}/***********************************/
/***********************************///数据显示void display(uint num,uchar dat){//num表第几个数码管亮,dat表要显示的数字        uchar i;        dula=0;        P0=table[dat];        dula=1;dula=0;        wela=0;        i=0xff;//用i存储位选数据        i=i&(~((0x01)<<(num)));        P0=i;        wela=1;wela=0;        delay(1);}/***********************************/
/***********************************///温度显示void dispalytemp(uint t){        uchar i;        i=t/100;        display(0,i);        i=t%100/10;        display(1,i);        i=t%100%10;        display(2,i);        }/***********************************/
void main(){        uchar a;        dula=0;        wela=0;        while(1)        {                tempchange();                for(a=10;a>0;a--)                {                        displaytemp(gettemperature());                }        }}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
Nepxizh-24DL
1楼-- · 2019-07-18 13:26
 精彩回答 2  元偷偷看……
Nepxizh-24DL
2楼-- · 2019-07-18 15:57
本人初学者,写出多处错误请见谅啊,包括注释部分的理解也可能是错的
程序说: “WENDUJI.C(189): warning C206: 'displaytemp': missing function-prototype”  
              “WENDUJI.C(189): error C267: 'displaytemp': requires ANSI-style prototype”
           但我已经把函数写在主函数前了,而且displaytemp调用的函数是整型啊
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit ds=P2^2;
sbit dula=P2^6;
sbit wela=P2^7;
uint temp;//整型温度数据
float f_temp; //浮点型温度数据
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//不带小数点编码。
uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,
0x87,0xff,0xef}; // 带小数点编码。

/***********************************/
//延时
void delay(uint t)
{
        uint x,y;
        for(x=t;x>0;x--)
                for(y=110;y>0;y--);
}
/***********************************/

/***********************************/
//ds18b20初始化
bit reset()
{
        uint time;
        bit flag;//用于存储ds18b20是否工作,flag=1表工作
        ds=1;
        for(time=0;time<2;time++);//略延时6微妙
        ds=0;
        for(time=0;time<200;time++);//延时约600微秒//以向DS18B20发出480~960的低脉冲
        ds=1;//释放数据线
        for(time=0;time<10;time++);//延时30us(释放总先后等待15~60us让18b20输出)
        flag=ds;//输出到标志位
        for(time=0;time<200;time++);//延时足够长时间,等待存在脉冲输出完毕
        return(flag);//返回标志位。
}
/***********************************/

/***********************************/
//ds18b20向ds18b20写一个字节
void write_byte(uchar dat)
{
        uint i,j;
        bit testb;
        for(j=0;j<8;j++)//写够8个字节
        {
                testb=dat&0x01;//testb读取主机发出的dat中的第一位
                dat>>=1;//dat要移动才能让testb读下一位
                if(testb)//write 1
                {
                        ds=0;
                        i++;i++;//延时2微妙
                        ds=1;
                        i=8;while(i>0)i--;//延时16微妙,这时ds18b20采样16微妙左右
                }
                else//write 0
                {
                        ds=0;
                        i=15;while(i>0)i--;//延时30微妙,ds18b20有大概15微妙的采样时间
                        ds=1;
                        i++;i++;//两个写操作之间要至少多于1微妙,但少于15微妙
                }
        }
        for(i=0;i<4;i++);//稍作延时给硬件一点反应时间。
}
/***********************************/


/***********************************/
//主机向ds18b20读一个字节
//主机是从最低位开始读的
uchar read_byte()
{
        uint i,j;
        uchar dat;//用于读取字节
        for(i=0;i<8;i++)
        {
                ds=0;//启动读时序
                j++;
                ds=1;//人为把数据线拉高,为检测ds18b20做准备(先控制总线才能使ds18b20有作用嘛)
                j++;j++;j++;//ds18b20将给出相应电平
                dat>>=1;//你不能把ds左移吧,只能把dat右移了
                if(ds==1)
                {
                        dat|=0x80;//这时就把1放在dat的最高位,如果再读一次,通过dat的左移,就可以把前一个读到的数据存储起来,直至存完为止
                }
                else
                {
                        dat|=0x00;//这时就可以把0存到最高位
                }
                for(j=0;j<2;j++);//延时大于1微妙的恢复期
        }
        return(dat);
        ds=1;//将数据线拉高以处理其它指令
}
/***********************************/

/***********************************/
//发送温度转换命令
void tempchange()
{
        reset();
        delay(1);
        write_byte(0xcc);// 跳过序列号命令
        write_byte(0x44);//发送温度转换命令
}
/***********************************/

/***********************************/
//读取寄存器中存储的温度数据
uint gettemperature()
{
        float temperature;
        uchar di,gao;
        reset();
        delay(1);
        write_byte(0xcc);// 发Skip ROM命令
        write_byte(0xbe);// 发读命令
        di=read_byte();//温度低8位
        gao=read_byte();//温度高8位
        temp=gao;
        temp<<=8;//two byte compose a int variable
        temp|=di;//两字节合成一个整型变量。
        temperature=temp*0.0625;//得到真实十进制温度值,因为DS18B20可以精确到0.0625 度,所以读回数据的最低位代表的是,0.0625 度
        temp=temperature*10+0.5;//放大十倍,这样做的目的将小数点后第一位也转换为可显示数字,同时进行一个四舍五入操作
        return temp;
}
/***********************************/

/***********************************/
//多个ds18b20获得温度,本程序没用上
/*
void readrom()
{
        uchar sn1,sn2;
        reset();
        delay(1);
        write_byte(0x33);
        sn1=read_byte();
        sn2=read_byte();
}
*/
/***********************************/

/***********************************/
//数据显示
void display(uint num,uchar dat)
{//num表第几个数码管亮,dat表要显示的数字
        uchar i;
        dula=0;
        P0=table[dat];
        dula=1;dula=0;
        wela=0;
        i=0xff;//用i存储位选数据
        i=i&(~((0x01)<<(num)));//若想让第一个数码管亮,也就是num=0,算一算就知道这样写n
        P0=i;
        wela=1;wela=0;
        delay(1);
}
/***********************************/

/***********************************/
//温度显示
void dispalytemp(uint t)
{
        uchar i;
        i=t/100;//字符型和整型可通用
        display(0,i);
        i=t%100/10;
        display(1,i);
        i=t%100%10;
        display(2,i);       
}
/***********************************/

void main()
{
        uchar a;
        dula=0;
        wela=0;
        while(1)
        {
                tempchange();
                for(a=10;a>0;a--)
                {
                        displaytemp(gettemperature());
                }
        }
}

一周热门 更多>