?? 485(最終版).c
字號:
#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;
/************************函數(shù)聲明***********************/
void delay(uint n); //延時函數(shù)
void init_uart(void); //串口初始化
void init_T0(); //定時器T0初始化
void Init_DS18B20(void); //DS18b20初始化函數(shù)
uchar ReadOneChar(void); //DS18b20讀一個字節(jié)
void WriteOneChar(uchar dat); //DS18b20寫一個字節(jié)
int ReadTemperature(void); //DS18b20讀取溫度
void disp_dat(uchar x,uchar y); //單個數(shù)碼管顯示函數(shù)
void disp(void); //溫度顯示函數(shù)
uchar sum(uchar *dat,uchar n); //求和校驗(yàn)函數(shù)
uchar get_adress(void); //獲取從機(jī)地址函數(shù)
void change(void); //數(shù)據(jù)調(diào)整函數(shù)
void send_dat(void); //串行數(shù)據(jù)發(fā)送函數(shù)
/**********************主函數(shù)***********************/
void main()
{
init_T0();
init_uart(); //初始化串口
while(1)
{
change(); //調(diào)整數(shù)據(jù)
disp(); //進(jìn)行顯示
}
}
/**********************延時函數(shù)**********************/
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; //設(shè)置T1
TL1=0xFD;
TR1=1; //啟動定時器T1
}
/*****************DS18b20初始化函數(shù)******************/
void Init_DS18B20(void)
{
uchar x=0;
DQ=1; //DQ復(fù)位
delay(10); //延時
DQ=0; //將DQ拉低
delay(80); //精確延時約480us
DQ=1; //DQ線拉高總線
delay(20);
while(!DQ); //等待初始化結(jié)束
delay(30);
}
/****************DS18b20讀一個字節(jié)*******************/
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寫一個字節(jié)********************/
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); //啟動溫度轉(zhuǎn)換
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);
}
/****************獲取從機(jī)地址函數(shù)*******************/
uchar get_adress(void)
{
uchar ad;
ad=P1;
ad>>=4; //獲取地址
return(ad);
}
/******************求和校驗(yàn)函數(shù)**********************/
uchar sum(uchar *dat,uchar n)
{
uchar i;
uchar s_dat=0x00;
for(i=2;i<n+1;i++) //對十位、個位和小數(shù)位上的數(shù)據(jù)求和
{
s_dat+=dat[i];
}
return(s_dat); //返回求和值
}
/*******************數(shù)據(jù)調(diào)整函數(shù)********************/
void change(void)
{
int temp;
temp=ReadTemperature(); //讀溫度
tem[0]=0x24; //發(fā)送起始標(biāo)志$
tem[1]=get_adress(); //獲取從機(jī)地址
tem[2]=temp%1000/100; //存十位上的數(shù)據(jù)
tem[3]=temp%100/10; //存?zhèn)€位上的數(shù)據(jù)
tem[4]=temp%10; //存小數(shù)位上的數(shù)據(jù)
tem[5]=sum(tem,3); //存校驗(yàn)和
tem[6]=0x23; //發(fā)送結(jié)束標(biāo)志#
}
/***************單個數(shù)碼管顯示函數(shù)*******************/
void disp_dat(uchar x,uchar y)
{
segw=1; //74HC573開鎖存
P0=~(0x01<<x); //送位選
segw=0;
segd=1;
if(x==1)
P0=tab[y]|0x80; //若是個位送顯示小數(shù)點(diǎn)
else
P0=tab[y]; //送顯示數(shù)據(jù)
segd=0;
}
/******************溫度顯示函數(shù)**********************/
void disp(void)
{
disp_dat(0,tem[2]); //顯示十位上的數(shù)據(jù)
delay(200);
disp_dat(1,tem[3]); //顯示個位上的數(shù)據(jù)
delay(200);
disp_dat(2,tem[4]); //顯示小數(shù)點(diǎn)后第一位數(shù)據(jù)
delay(200);
disp_dat(3,16); //清零段位74HC573中的數(shù)據(jù)
}
/****************串行數(shù)據(jù)發(fā)送函數(shù)*******************/
void send_dat(void)
{
uchar i;
for(i=0;i<7;i++)
{
SBUF=tem[i];
while(TI==0); //等待發(fā)送結(jié)束
TI=0;
}
}
/*******************定時T0中斷程序*****************/
void senddat_T0(void) interrupt 1
{
TH0=0x4c; //重載定時器初值
TL0=0x00;
if(--T_num==0)
{
send_dat(); //發(fā)送數(shù)據(jù)
T_num=200; //恢復(fù)計數(shù)值
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -