?? 51
字號:
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit DQ = P1^0; //DS18B20接入口
sbit segd=P1^1; //段控制74573鎖存使能
sbit segw=P1^2; //位控制74573鎖存使能
uchar code tab[]={
0x3f,0x06,0x5b,0x4f, //0~3
0x66,0x6d,0x7d,0x07, //4~7
0x7f,0x6f,0x77,0x7c, //8~b
0x39,0x5e,0x79,0x71, //c~f
0x00 //滅
};
uchar tem[7];
uchar T_num=200;
/************************函數聲明***********************/
void delay(uint n); //延時函數
void init_uart(void); //串口初始化
void init_T0(); //定時器T0初始化
void Init_DS18B20(void); //DS18b20初始化函數
uchar ReadOneChar(void); //DS18b20讀一個字節
void WriteOneChar(uchar dat); //DS18b20寫一個字節
int ReadTemperature(void); //DS18b20讀取溫度
void disp_dat(uchar x,uchar y); //單個數碼管顯示函數
void disp(void); //溫度顯示函數
uchar sum(uchar *dat,uchar n); //求和校驗函數
uchar get_adress(void); //獲取從機地址函數
void change(void); //數據調整函數
void send_dat(void); //串行數據發送函數
/**********************主函數***********************/
void main()
{
init_T0();
init_uart(); //初始化串口
while(1)
{
change(); //調整數據
disp(); //進行顯示
}
}
/**********************延時函數**********************/
void delay(uint n)
{
while(n--) ;
}
/********************定時器T0初始化******************/
void init_T0()
{
TMOD=0x01; //工作方式1
TH0=0x4c; //定時50ms
TL0=0x00;
ET0=1; //允許定時器T0中斷
EA=1; //開總中斷
TR0=1; //啟動定時器T0
}
/*********************串口初始化*********************/
void init_uart(void)
{
SCON=0x40; //工作方式1
TMOD=TMOD|0x20; //T1為工作方式2
TH1=0xFD; //設置T1
TL1=0xFD;
TR1=1; //啟動定時器T1
}
/*****************DS18b20初始化函數******************/
void Init_DS18B20(void)
{
uchar x=0;
DQ=1; //DQ復位
delay(10); //延時
DQ=0; //將DQ拉低
delay(80); //精確延時約480us
DQ=1; //DQ線拉高總線
delay(20);
while(!DQ); //等待初始化結束
delay(30);
}
/****************DS18b20讀一個字節*******************/
uchar ReadOneChar(void)
{
uchar i=0;
uchar dat=0;
for (i=8;i>0;i--)
{
DQ=0; //給脈沖信號
dat>>=1;
DQ=1; //給脈沖信號
if(DQ)dat|=0x80; //讀入值是否為1
delay(8);
}
return(dat);
}
/***************DS18b20寫一個字節********************/
void WriteOneChar(uchar dat)
{
uchar i=0;
for (i=8;i>0;i--)
{
DQ=0;
DQ=dat&0x01;
delay(10);
DQ=1;
dat>>=1;
}
delay(8);
}
/*****************DS18b20讀取溫度********************/
int ReadTemperature(void)
{
uchar dat_L=0,dat_H=0;
int temper=0;
float temp1=0;
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0x44); //啟動溫度轉換
Init_DS18B20();
WriteOneChar(0xCC); //跳過讀序號列號的操作
WriteOneChar(0xBE); //讀取溫度寄存器
dat_L=ReadOneChar(); //低位
dat_H=ReadOneChar(); //高位
temper=dat_H;
temper<<=8;
temper=temper|dat_L;
temp1=temper*0.0625;
temper=temp1*10+0.5; //計算溫度值
return(temper);
}
/****************獲取從機地址函數*******************/
uchar get_adress(void)
{
uchar ad;
ad=P1;
ad>>=4; //獲取地址
return(ad);
}
/******************求和校驗函數**********************/
uchar sum(uchar *dat,uchar n)
{
uchar i;
uchar s_dat=0x00;
for(i=2;i<n+1;i++) //對十位、個位和小數位上的數據求和
{
s_dat+=dat[i];
}
return(s_dat); //返回求和值
}
/*******************數據調整函數********************/
void change(void)
{
int temp;
temp=ReadTemperature(); //讀溫度
tem[0]=0x24; //發送起始標志$
tem[1]=get_adress(); //獲取從機地址
tem[2]=temp%1000/100; //存十位上的數據
tem[3]=temp%100/10; //存個位上的數據
tem[4]=temp%10; //存小數位上的數據
tem[5]=sum(tem,3); //存校驗和
tem[6]=0x23; //發送結束標志#
}
/***************單個數碼管顯示函數*******************/
void disp_dat(uchar x,uchar y)
{
segw=1; //74HC573開鎖存
P0=~(0x01<<x); //送位選
segw=0;
segd=1;
if(x==1)
P0=tab[y]|0x80; //若是個位送顯示小數點
else
P0=tab[y]; //送顯示數據
segd=0;
}
/******************溫度顯示函數**********************/
void disp(void)
{
disp_dat(0,tem[2]); //顯示十位上的數據
delay(200);
disp_dat(1,tem[3]); //顯示個位上的數據
delay(200);
disp_dat(2,tem[4]); //顯示小數點后第一位數據
delay(200);
disp_dat(3,16); //清零段位74HC573中的數據
}
/****************串行數據發送函數*******************/
void send_dat(void)
{
uchar i;
for(i=0;i<7;i++)
{
SBUF=tem[i];
while(TI==0); //等待發送結束
TI=0;
}
}
/*******************定時T0中斷程序*****************/
void senddat_T0(void) interrupt 1
{
TH0=0x4c; //重載定時器初值
TL0=0x00;
if(--T_num==0)
{
send_dat(); //發送數據
T_num=200; //恢復計數值
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -