我用的下面的程序,附件是打包的整个工程文件夹,有EE21开发板的朋友可以直接下载看看效果,我在屋子里穿着羽绒服,测出的温度有19.5度,还请大家帮忙看看是哪里出了问题
复制代码
- #include"reg51.h"
- #define uchar unsigned char
- #define uint unsigned int
- sbit ds=P1^3;//DS18B20
- sbit dx=P1^4;//段选
- sbit wx=P1^5;//位选
- sbit led_cs=P1^6;//LED片选
- sbit lcd_en=P3^4;
- sbit lcd_rs=P3^5;
- uint temp;//整型的温度数据
- float f_temp;//浮点型的温度数据
- unsigned char code table[]={ 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,
- 0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//带小数的段码表
- unsigned char code table1[]={ 0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,
- 0x00,0x10,0x08,0x03,0x46,0x21,0x06,0x0E};//不带小数的段码表
- void delay(uint z)//延时函数
- {
- uint x,y;
- for(x=z;x>0;x--)
- for(y=113;y>0;y--);
- }
- void dsreset(void)//DS18B20复位,初始化函数
- {
- uint i;
- ds=0;
- i=103;
- while(i>0)i--;
- ds=1;
- i=4;
- while(i>0)i--;
- }
- bit tempreadbit(void)//读1位数据函数
- {
- uint i;
- bit dat;
- ds=0;i++;//i++ 起延时作用
- ds=1;i++;i++;
- dat=ds;
- i=8;while(i>0)i--;
- return (dat);
- }
- uchar tempread(void)//读1个字节数据函数
- {
- uchar i,j,dat;
- dat=0;
- for(i=1;i<=8;i++)
- {
- j=tempreadbit();
- dat=(j<<7)|(dat>>1);//读出的数据最低位在最前面,这样刚好一个字节在DAT里
- }
- return(dat);
- }
- void tempwritebyte(uchar dat)//向18B20写一个字节数据函数
- {
- uint i;
- uchar j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb)//写1
- {
- ds=0;
- i++;i++;
- ds=1;
- i=8;while(i>0)i--;
- }
- else
- {
- ds=0;//写0
- i=8;while(i>0)i--;
- ds=1;
- i++;i++;
- }
- }
- }
- void tempchange(void)//DS18B20开始获取温度并转换
- {
- dsreset();
- delay(1);
- tempwritebyte(0xcc);// 写跳过读ROM指令
- tempwritebyte(0x44);// 写温度转换指令
- }
- uint get_temp()//读取寄存器中存储的温度数据
- {
- uchar a,b;
- dsreset();
- delay(1);
- tempwritebyte(0xcc);
- tempwritebyte(0xbe);
- a=tempread();//读低8位
- b=tempread();//读高8位
- temp=b;
- temp<<=8;//两个字节组合为1个字
- temp=temp|a;
- f_temp=temp*0.0625;//温度在寄存器中为12位 分辨率位0.0625°
- temp=f_temp*10+0.5;//乘以10表示小数点后面只取1位,加0.5是四舍五入
- f_temp=f_temp+0.05;
- return temp;//temp是整型
- }
- ////////////////////显示程序//////////////////////////
- void display(uint t)
- {
- uchar A1,A2,A3;
- A1=t/100;
- A2=t%100/10;
- A3=t%100%10;
- P0=0X01; //选通第一位数码管
- wx=1;
- wx=0;
- P0=table[A1];//显示百位
- dx=1;
- dx=0;
- delay(1);
- P0=0xff;//关位码
- dx=1;
- dx=0;
- P0=0x02;//选通第二位数码管
- wx=1;
- wx=0;
- P0=table1[A2];//显示十位
- dx=1;
- dx=0;
- delay(1);
- P0=0xff;//关位码
- dx=1;
- dx=0;
-
- P0=0x04;//选通第三位数码管
- wx=1;
- wx=0;
- P0=table[A3];//显示个位
- dx=1;
- dx=0;
- delay(1);
- P0=0xff;//关位码
- dx=1;
- dx=0;
- }
- void main()//主函数
- {
- led_cs=0;
- lcd_en=0;
- lcd_rs=0;
- delay(1); // 延时1ms
- tempchange(); // 启动温度转换,需要750ms
- delay(500); // 延时1s
- get_temp(); // 读取温度
-
- while(1)
- {
- tempchange();
- display(get_temp());
- }
- }
复制代码