|
- #include <reg51.h>
- #include <intrins.h>
- #define uchar unsigned char
- sbit DQ=P3^7;
- bdata uchar dat;
- sbit dat0=dat^0;
- sbit dat7=dat^7;
- uchar dp[16]={0,0,1,1,2,3,3,4,5,5,6,6,7,8,8,9};
- uchar code segtab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
- 0x80,0x90, 0x88,0x83,0xc6,0xa1,0x86,0x8e,0x89,0x8c,0xbf,0xff};
- uchar dbuf[4]={0,0,0,0x12};
- void disp(void)
- {
- uchar i,n,bsel;
- bsel=0x01;
- for(n=0;n<4;n++)
- {
- P2=0xf0|bsel;
- P0=segtab[dbuf[n]];
- if(n==1)P0=P0&0x7f;
- bsel=_crol_(bsel,1);
- for(i=1;i<200;i++);
- P0=0xff;
-
- }
-
- }
- void delay15(uchar n) //15us????
- { do {
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- _nop_();
- n--;
- }while(n);
- }
- bit reset(void) //初始化DS18B20
- {
- bit err;
- DQ=0; //在数据线上产生600US低电平
- delay15(40);
- DQ=1; //数据线电平拉高
- delay15(4); //延时60us
- err=DQ; //将读数据线状态,如果为低则复位成功
- delay15(18); // 如果数据线为高则复位不成功
- return(err);
- }
- void wrbyte(uchar d) //单片机向DS18B20发送一个字节的命令
- {
- uchar i;
- dat=d;
- for(i=8;i>0;i--) //循环写入8位
- {
- DQ=0; //数据低电平产生15us
- delay15(1);
- DQ=dat0; //将当前数据为送至数据总线
- dat=dat>>1; //将下一位要写入的数据移到最低位
- delay15(1); //延时15us
- DQ=1; //数据线拉高为写入下一位做准备
- }
- }
- uchar rdbyte(void) //从DS18B20读取一个字节数据
- {
- uchar i;
- dat=0; //读取数据初始值要为0
- for(i=8;i>0;i--) //循环读取8位(先低后高)
- {
- dat=dat>>1; //读出数据线右移一位
- DQ=0; //产生1us负脉冲
- _nop_();
- DQ=1; // 产生15us高电平
- delay15(1);
- dat7=DQ; // 读取到数据放入暂存·
- delay15(4); // 延时,为读取下一位做准备
- }
- return(dat); //将读取到的温度值返回给单片机
- }
-
- void convert(void) //启动DS18B20开始温度转换
- {
- bit err;
- err=reset(); //先复位温度传感器
- wrbyte(0xcc); //由于我们本次只用了一个温度传感器,则这里跳过传感器的识别
- wrbyte(0x44); //启动温度传感器
-
- }
- int readt(void)//读取DS18B20暂存器中的值
- {
- uchar h,l;
- bit err;
- err=reset(); //复位温度传感器
- wrbyte(0xcc);//跳过多传感器识别
- wrbyte(0xbe);//读暂存指令
- l=rdbyte(); //读取温度低位
- h=rdbyte(); //读取温度高位
- return(h*256+l); //返回读取到的温度
- }
- void format(int t)//将读取到的温度值转换为带一位小数的BCD码格式送至缓存区,并灭掉高位0
- {
- bit zf; // 正负标记,0正数;1负数
- zf=0;
- if(t<0) //如果温度在0度以下
- {
- zf=1; //置为负数标志
- t=-t; //求补码
- }
- dbuf[0]=dp[t&0x0f]; //求出温度的小数
- t=t>>4; //移掉小数部分
-
- if(t==0xff)t=99; //字节扩展
- dbuf[3]=t/100; //求出百位
- t=t%100;
- dbuf[2]=t/10; //求出十位
- dbuf[1]=t%10; // 求出个位
- if(zf==1) //如果是负数
- {
- if(dbuf[2]==0) // 如果十位为零
- {
- dbuf[3]=0x13; //显示格式为“-x.x"
- dbuf[2]=0x12;
-
- }
- else // 如果十位不为零
- dbuf[3]=0x12; //显示格式为“-xx.x"
-
- }
- else //如果是正数
- {
-
- if(dbuf[3]==0) //如果百位,十位都为零
- {
- if(dbuf[2]==0) //显示格式为x.x
- dbuf[2]=0x13; //如果只有百位为零
- dbuf[3]=0x13; //显示格式为xx.x
-
- }
- }
- }
- main()
- {
- int temp; //保存测量的温度值
- while(1)
- {
- temp=0;
- convert(); //启动温度转换
- temp=readt(); // 读取温度值
- format(temp); //将温度值转换为BCD码送至显缓区
- disp();
- }
- }
复制代码 |
评分
-
查看全部评分
|