真的很急!基于51单片机的DS18B20 温度测控系统 C语言程序
#include #include#include#define uchar unsigned char#define uint unsigned int;/******************************************************************//* 定义端口 *//******************************************************************/sbit seg1=P2^0;...全部
#include #include#include#define uchar unsigned char#define uint unsigned int;/******************************************************************//* 定义端口 *//******************************************************************/sbit seg1=P2^0;sbit seg2=P2^1;sbit seg3=P2^2;sbit DQ=P1^7;//ds18b20 端口sfr dataled=0x80;//显示数据端口/******************************************************************//* 全局变量 *//******************************************************************/uint temp;uchar flag_get,count,num,minute,second;uchar code tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //7段数码管段码表共阳uchar str[6];/******************************************************************//* 函数声明 *//******************************************************************/void delay1(uchar MS);unsigned int ReadTemperature(void);void Init_DS18B20(void);unsigned char ReadOneChar(void);void WriteOneChar(unsigned char dat);void delay(unsigned int i);/******************************************************************//* 主函数 *//******************************************************************/main(){unsigned char TempH,TempL;TMOD|=0x01;//定时器设置TH0=0xef;TL0=0xf0;IE=0x82;TR0=1;P2=0x00; count=0;while(1){ str[5]=0x39; //显示C符号 str[1]=tab[TempH/100]; //十位温度 str[2]=tab[(TempH0)/10]; //十位温度 str[3]=tab[(TempH0)]|0x80; //个位温度,带小数点 str[4]=tab[TempL]; if(flag_get==1) //定时读取当前温度 { temp=ReadTemperature(); if(temp&0x8000) { str[0]=0x40;//负号标志 temp=~temp; // 取反加1 temp =1; } else str[0]=0; TempH=temp>>4; TempL=temp&0x0F; TempL=TempL*6/10;//小数近似处理 flag_get=0; } }}/******************************************************************//* 定时器中断 *//******************************************************************/void tim(void) interrupt 1 using 1//中断,用于数码管扫描和温度检测间隔{TH0=0xef;//定时器重装值TL0=0xf0;num ;if (num==50) {num=0; flag_get=1;//标志位有效 second ; if(second>=60) {second=0; minute ; } }count ;if(count==1) {P2=0; dataled=str[0];}//数码管扫描if(count==2) {P2=1; dataled=str[1];}if(count==3) { P2=2; dataled=str[2]; }if(count==4) { P2=3; dataled=str[3]; }if(count==5) { P2=4; dataled=str[4]; }if(count==6) { P2=5; dataled=str[5]; count=0;}}/******************************************************************//* 延时函数 *//******************************************************************/void delay(unsigned int i)//延时函数{ while(i--);}/******************************************************************//* 初始化 *//******************************************************************/void Init_DS18B20(void){ unsigned char x=0; DQ = 1; //DQ复位 delay(8); //稍做延时 DQ = 0; //单片机将DQ拉低 delay(80); //精确延时 大于 480us DQ = 1; //拉高总线 delay(10); x=DQ; //稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(5);}/******************************************************************//* 读一个字节 *//******************************************************************/unsigned char ReadOneChar(void){unsigned char i=0;unsigned char dat = 0;for (i=8;i>0;i--) { DQ = 0; // 给脉冲信号 dat>>=1; DQ = 1; // 给脉冲信号 if(DQ) dat|=0x80; delay(5); } return(dat);}/******************************************************************//* 写一个字节 *//******************************************************************/void WriteOneChar(unsigned char dat){ unsigned char i=0; for (i=8; i>0; i--) { DQ = 0; DQ = dat&0x01; delay(5); DQ = 1; dat>>=1; }delay(5);}/******************************************************************//* 读取温度 *//******************************************************************/unsigned int ReadTemperature(void){unsigned char a=0;unsigned int b=0;unsigned int t=0;Init_DS18B20();WriteOneChar(0xCC); // 跳过读序号列号的操作WriteOneChar(0x44); // 启动温度转换delay(200);Init_DS18B20();WriteOneChar(0xCC); //跳过读序号列号的操作 WriteOneChar(0xBE); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度a=ReadOneChar(); //低位b=ReadOneChar(); //高位bt=a b;return(t);}//LZ,这是测温并且用数码管显示程序,报警可以自己另行添加!主要程序就是这些!()。
收起