基于51单片机的温度测量系统 第3页
段数码管赋值
{P1=designP1[i];}
else//如果温度大于10度
{m=i%10;//先给第一个七段数码管赋值
D1=1;
D2=0;
P1=designP1[m];
n=i/10;//再给第二个七段数码管赋值
D1=0;
D2=1;
P1=designP1[n];
if(n>=4&&m>=5)%%(m<=5)//判断温度的取值范围,如果大
于45或小于5度,则蜂鸣器叫,发光二极管闪烁
{int a,b;
Q1=1;//蜂鸣器叫
for(a=0;a<1000;a++)//发光二极管闪烁
for(b=0;b<1000;b++)
Q2=1;
for(a=0;a<1000;a++)
for(b=0;b<1000;b++)
Q2=0;}}}
2系统软件设计
2.1系统程序流程图
系统程序流程图如图4所示。
图4系统程序流程图
2.2温度部分软件设计
DS18B20的一线工作协议流程是:初始化→ROM操作指
令→存储器操作指令→数据传输。其工作时序包括初始化时序、
写时序和读时序。故主机控制DS18B20完成温度转换必须经过三
个步骤:每一次读写之前都要对DS18B20进行复位,复位成功后
发送一条ROM指令,最后发送RAM指令,这样才能对DS18B20
进行预定的操作。复位要求主CPU将数据线下拉500微秒,然后
释放,DS18B20收到信号后等待16~60微秒左右,后发出60~240
微秒的存在低脉冲,主CPU收到此信号表示复位成功。程序主要
函数部分如下:
(1)初始化函数//读一个字节函数
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(4);}
return(dat);}
//写一个字节函数
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;}}
(2)读取温度并计算函数
ReadTemperature(void)
{unsigned char a=0;
unsigned char b=0;
unsigned int t=0;
float tt=0;
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
riteOneChar(0x44);//启动温度转换
Init_DS18B20();
WriteOneChar(0xCC);//跳过读序号列号的操作
WriteOneChar(0xBE);//读取温度寄存器等(共可读9
器)前两个就是温度
a=ReadOneChar();
b=ReadOneChar();
t=b;
t<<=8;
t=t|a;
tt=t*0.0625;
t=tt*10+0.5;//放大10倍输出并四舍五入---此行没用
(3)主程序部分见前