本帖最后由 Nepxizh-24DL 于 2013-8-23 10:09 编辑
本人初学者,写出多处错误请见谅啊,包括注释部分的理解也可能是错的
程序说: “WENDUJI.C(189): warning C206: 'displaytemp': missing func
tion-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做准备
j++;j++;j++;
dat>>=1;
if(ds==1)
{
dat|=0x80;//这时就把1放在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;
}
/***********************************/
/***********************************/
//数据显示
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());
}
}
}
一周热门 更多>