|
- #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();
- }
- }
復制代碼 |
-
-
DS18B20.7z
2020-9-21 15:02 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
19.7 KB, 下載次數: 29, 下載積分: 黑幣 -5
評分
-
查看全部評分
|