完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 deasonata 于 2013-3-9 19:55 编辑
数码管显示部分单独测试过,没有问题,但是就是温度显示不出。!求高手解答 附:原理图和代码部分
|
|
相关推荐
5个回答
|
|
收藏啦
|
|
|
|
{:soso_e113:}
|
|
|
|
{:soso_e113:}
|
|
|
|
|
|
|
|
#pragma db code
#include #include "INTRINS.H" #define BUSY1 (DQ1==0) //定义busy信号 ***it LED_0=P1^0; //定义数码管控制脚为P1口的0-3脚 ***it LED_1=P1^1; ***it LED_2=P1^2; ***it LED_3=P1^3; ***it DQ1=P3^5; //定义18B20单总线引脚 void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4);//声明显示函数 void ds_reset_1(void); //声明18B20复位函数 void wr_ds18_1(char dat); //声明18B20写入函数 void time_delay(unsigned char time);//声明延时函数 int get_temp_1(void); //声明18B20读入温度函数 void delay(unsigned int x); //声明延时函数 void read_ROM(void); //声明18B20读ROM函数 int get_temp_d(void); //声明获取温度函数 void ds_init(void); //声明18B20初始化函数 void ds_getT(void); //声明18B20获得温度显示值函数 /*定义数码管段码=====0-9=====A-G=====*/ unsigned char a[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; //共阳极数码管的段码0 1 2 3 4 5 6 7 8 9 A B C D E F /****************以下定义各种变量********************/ unsigned char ResultSignal; int ResultTemperatureLH,ResultTemperatureLL,ResultTemperatureH; unsigned char ROM[8]; unsigned char idata TMP; unsigned char idata TMP_d; unsigned char f; unsigned char rd_ds18_1(); unsigned int TemH,TemL; //温度的整数部分和小数部分 unsigned int count; //定义小数计算部分 void main() { ds_init(); //18B20初始化 while(1) { ds_getT(); //使用该函数获得温度,整数部分存储到TemH,小数部分存储到count的低8位 display((TemH/10)%10,TemH%10,((count/10)%10),(count%10)); //温度发送到数码管显示 } } /***************18B20初始化函数***********************/ void ds_init(void) { unsigned int k=0; ds_reset_1(); ds_reset_1(); //reset wr_ds18_1(0xcc); //skip rom _nop_(); wr_ds18_1(0x7f); ds_reset_1(); wr_ds18_1(0xcc); _nop_(); wr_ds18_1(0x44); for(k=0;k<11000;k++) time_delay(255); ds_reset_1(); } void ds_getT(void) { wr_ds18_1(0xcc); wr_ds18_1(0xbe); TemH=get_temp_1(); TemL=get_temp_d(); TemH&=0x00ff; TemL&=0x00ff; count=(TemH*256+TemL)*6.25; } /***************延时程序,单位us,大于10us*************/ void time_delay(unsigned char time) { time=time-10; time=time/6; while(time!=0)time--; } /*****************************************************/ /* reset ds18b20 */ /*****************************************************/ void ds_reset_1(void) { unsigned char idata count=0; DQ1=0; time_delay(240); time_delay(240); DQ1=1; return; } void check_pre_1(void) { while(DQ1); while(~DQ1); time_delay(30); } void read_ROM(void) { int n; ds_reset_1(); check_pre_1(); wr_ds18_1(0x33); for(n=0;n<8;n++){ROM[n]=rd_ds18_1();} } /*****************************************************/ /* Read a bit from 1820 位读取 */ /*****************************************************/ bit tmrbit_1(void) { idata char i=0; bit dat; DQ1=0;_nop_(); DQ1=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); dat = DQ1; time_delay(50); return dat; } /*****************************************************/ /* read a bety from ds18b20 字节读取 */ /*****************************************************/ unsigned char rd_ds18_1() { unsigned char idata i,j,dat=0; for(i=1;i<=8;i++) { j=tmrbit_1(); dat=(j<<(i-1))|dat; } return dat; } /*****************************************************/ /* write a bety from ds18b20 写字节 */ /****************************************************/ void wr_ds18_1(char dat) { signed char idata i=0; unsigned char idata j; bit testb; for(j=1;j<=8;j++) { testb=dat & 0x01; dat = dat>>1; if(testb) { DQ1=0; _nop_(); _nop_(); DQ1=1; time_delay(60); } else { DQ1=0; time_delay(50); DQ1=1; _nop_(); _nop_(); } } } int get_temp_1(void) { unsigned char idata a=0,b=0; unsigned char idata i; EA=0; ds_reset_1(); check_pre_1(); wr_ds18_1(0xcc); wr_ds18_1(0x44); while(BUSY1); ds_reset_1(); check_pre_1(); wr_ds18_1(0xcc); wr_ds18_1(0xbe); a=rd_ds18_1(); b=rd_ds18_1(); i=b; /*若b为1则为负温 */ i=(i>>4); if(i==0) { f=0; TMP=((a>>4)|(b<<4)); a=(a&0x0f); if (a>8) { TMP=(TMP+1); } } else { f=1; a=a>>4; b=b<<4; TMP=(a|b); TMP=~TMP; TMP=(TMP+1); } EA=1; return(TMP); } int get_temp_d(void) { unsigned char idata a=0,b=0; unsigned char idata i,m; EA=0; ds_reset_1();//复位 check_pre_1(); wr_ds18_1(0xcc); wr_ds18_1(0x44); while(BUSY1); ds_reset_1(); check_pre_1(); wr_ds18_1(0xcc); wr_ds18_1(0xbe); a=rd_ds18_1(); b=rd_ds18_1(); i=b; /*若b为1则为负温 */ i=(i>>4); if(i==0) { f=0; TMP=((a>>4)|(b<<4)); a=(a&0x0f); TMP_d=a; } else { f=1; a=~a; a=(a+1); b=~b; b=(b+1); m=a; a=a>>4; b=b<<4; TMP=(a|b); m=(m&0x0f); TMP_d=m; } EA=1; return(TMP_d); }void delay(unsigned int x) { unsigned int i; for(i=0;i void display(unsigned char d1,unsigned char d2,unsigned char d3,unsigned char d4) { P0=a[d1]; LED_0=0; delay(100); LED_0=1; P0=a[d2] & 0x7f; LED_1=0; delay(100); LED_1=1; P0=a[d3]; LED_2=0; delay(100); LED_2=1; P0=a[d4]; LED_3=0; delay(100); LED_3=1; } 可以试一下 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
464 浏览 0 评论
478 浏览 1 评论
基于瑞萨FPB-RA4E2智能床头灯项目——1编译环境搭建与点亮驱动ws2812全彩LED
439 浏览 0 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-LCD显示图片编程示例之介绍mmap
994 浏览 0 评论
《DNESP32S3使用指南-IDF版_V1.6》第二章 常用的C语言知识点
1056 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11780 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 08:21 , Processed in 0.705754 second(s), Total 81, Slave 63 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号