完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本人初学者,写出多处错误请见谅啊
![]() ![]() /***********************************///延时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个回答
|
|
发得不好再发一次
|
|
|
|
本人初学者,写出多处错误请见谅啊,包括注释部分的理解也可能是错的
程序说: “WENDUJI.C(189): warning C206: 'displaytemp': missing function-prototype” “WENDUJI.C(189): error C267: 'displaytemp': requires ANSI-style prototype” 但我已经把函数写在主函数前了,而且displaytemp调用的函数是整型啊 #include #define uchar unsigned char #define uint unsigned int ***it ds=P2^2; ***it dula=P2^6; ***it 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()); } } } |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1529 浏览 0 评论
1972 浏览 0 评论
Protues中自己封装的芯片元件无Program File、Clock Frequency选项怎么解决,求求大神了!
3751 浏览 1 评论
基于51单片机的车辆倒车雷达报警系统,HC-SR04超声波测距,全套资料
1006 浏览 0 评论
【原创】收藏!单片机输出4种波形的函数信号发生器毕设(Proteus仿真+原理图+源码和论文)
4543 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-24 05:17 , Processed in 0.572760 second(s), Total 80, Slave 62 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191