#include <reg51.h>
#include "intrins.h"
#define uint unsigned int
#define uchar unsigned char
int num;
sbit shi = P2^0;//-----------------------------------------數碼管十位數
sbit ge = P2^1;//------------------------------------------數碼管個位數
sbit DS = P2^2;//-------------------------------------------單總線
uchar code table[] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F,};//數字0~9
/*進11.95us,一次6.5us*/
void delay_us(unsigned char us)//-----------------------延時
{
while(us --);
}
void display(unsigned int num)//-------------------------數碼管顯示
{
shi = 1;//-------------------------------------------打開十位數碼管
P0 = ~table[num / 10];//----------------------------顯示溫度十位
delay_us(1000);//-------------------------------------延時1ms
shi = 0;//------------------------------------------關閉十位數碼管
ge = 1;//-------------------------------------------打開個位數碼管
P0 = ~table[num % 10];//----------------------------顯示溫度個位
delay_us(1000);//-----------------------------------延時1ms
ge = 0;//-------------------------------------------關閉個位數碼管
}
bit ds_init()
{
bit i;
DS = 1;
_nop_();
DS = 0;
delay_us(75);//499.45us
DS = 1;
delay_us(4);//37.95us
i = DS;
delay_us(20);//141.95us
DS = 1;
_nop_();
return(i);
}
/*寫一字節*/
void write_byte(uchar dat)//------------------------傳輸一個命令
{
uchar i;
for(i = 0; i < 8; i ++)//-------------------------for中傳輸 8 個信號
{
DS = 0;
_nop_();//-------------------------------------產生寫時序
DS = dat & 0x01;
delay_us(10);//76.95us
DS = 1;
_nop_();
dat >>= 1;
}
}
/*讀一字節*/
uchar read_byte()//----------------------------------讀一個命令
{
uchar i,j,dat;
for(i = 0; i < 8; i ++)//-------------------------for中接收 8 個信號
{
DS = 0;
_nop_();//-------------------------------------產生讀時序
DS = 1;
_nop_();
j = DS;
delay_us(10);//76.95us
DS = 1;
_nop_();
dat = (j<<=7) | (dat>>1);
}
return(dat);//----------------------------------將 dat 值返給主函數
}
void main()//---------------------------------------主函數
{
uint i;
uchar L,M;
while(1)//----------------------------------死循環
{
ds_init();
write_byte(0xcc);//--------------------調整ds18b20工作模式 忽略rom指令
write_byte(0x44);//--------------------調整ds18b20工作模式 溫度轉換指令
ds_init();
write_byte(0xcc);//--------------------調整ds18b20工作模式 忽略rom指令
write_byte(0xbe);//--------------------調整ds18b20工作模式 讀暫存器指令
L = read_byte();//----------------------將讀出來的值賦給 L
M = read_byte();//---------------------將讀出來的值賦給 M
i = M;
i <<= 8;
i |= L;
i = (i * 0.0625 + 0.5);//--------------數據轉換為數字
display(i);
}
}
|