2 、各部分程序设计及其程序流程图
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,报警子程序和显示数据刷新子程序等。
(1)主程序:主程序的主要功能是负责温度的实时显示,读出并处理DS18B20的测量温度值。温度测量每1s进行一次。主程序流程图如图9所示。
(2)读出温度子程序:读出温度子程的主要功能是读出RAM中的9字节。在读出时须进行CRC校验,校验有错时不能进行温度数据的改写。读出温度子程序流程图如图10所示。
(3)温度转换命令子程序:温度转换命令子程序主要是发温度转换开始命令。当采用12位分辨率时,转换时间约为750 ms。在本程序设计中,采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如图11所示。
(4)计算温度子程序:计算温度子程序将RAM中读取的值进行十进制的转换运算,并进行温度值正负的判断。其流程图如图12所示。
(5)显示数据刷新子程序:显示数据刷新子程序主要是对显示缓冲器中的显示数据进行刷新操作,当最高数据显示位为0时,将符号显示位移入下一位。显示数据刷新子程序流程 图如图13所示。
图10 读温度子程序 图9 主程序流程图
图11 温度转换命令子程序流程图 图12 计算温度子程序
温度数据移入显示寄存器 N 十位数0? Y 百位数0? Y十位数显示符号 百位数不显示 百位数显示数据(不显示符号)N结束 图13 显示数据刷新子程序流程图
3、源程序设计:
#include
unsigned char code else dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,TempData[2]=dofly_DuanMa 0xdf,0xbf,0x7f}; [(TempH0)/10];
unsigned char TempData[8]; void Display(unsigned char TempData[3]=dofly_DuanMa[(TempHFirstBit,unsigned char Num); 0)]|0x80;
void Init_Timer0(void); void lab() TempData[4]=dofly_DuanMa[TempL]; { TempData[5]=0; unsigned char i = 100; TempData[6]=0x63; unsigned char j = 100; TempData[7]=0x39; while(j--) if(TempH>32||TempH<15) while(i--) { LABA = ~LABA; lab(); } } void main (void) else { { unsigned int TempH,TempL,temp; LABA=0; LABA=0; } Init_Timer0(); } while (1) { } if(ReadTempFlag==1) } { void Display(unsigned char ReadTempFlag=0; FirstBit,unsigned char Num)
{ temp=ReadTemperature(); if(temp&0x8000) static unsigned char i=0;
{ DataPort=0; TempData[0]=0x40; LATCH1=1; temp=~temp; LATCH1=0; temp +=1; } DataPort=dofly_WeiMa[i+FirstBit]; else LATCH2=1; TempData[0]=0; LATCH2=0; DataPort=Te
mpData[i];
LATCH1=1; LATCH1=0; i++;
if(i==Num) i=0; }
void Init_Timer0(void) {
TMOD |= 0x01; //TH0=0x00; //TL0=0x00;
EA=1; ET0=1; TR0=1; }
void Timer0_isr(void) interrupt 1 {
unsigned char dat = 0; for (i=8;i>0;i--) {
DQ = 0; dat>>=1; DQ = 1; if(DQ)
dat|=0x80; DelayUs2x(25); }
return(dat); }
void WriteOneChar(unsigned char dat) {
unsigned char i=0; for (i=8; i>0; i--) {
DQ = 0;
DQ = dat&0x01; DelayUs2x(25); DQ = 1; dat>>=1; }
DelayUs2x(25); }
unsigned int ReadTemperature(void) { static unsigned int num; TH0=(65536-2000)/256; TL0=(65536-2000)%6;
Display(0,8); num++;
if(num==300) { num=0;
ReadTempFlag=1; } }
子程序说明: 温度采集程序:
#include\#include\
bit Init_DS18B20(void) {
bit dat=0; DQ = 1; DelayUs2x(5); DQ = 0; DelayUs2x(200); DelayUs2x(200); DQ = 1; DelayUs2x(50); dat=DQ; DelayUs2x(25); return dat; }
unsigned char ReadOneChar(void) {
unsigned char i=0;
WriteOneChar(0xBE); a=ReadOneChar(); b=ReadOneChar(); b<<=8; t=a+b; return(t); }
延时程序:
#include \
void DelayUs2x(unsigned char t) {
while(--t); }
unsigned char a=0; unsigned int b=0; unsigned int t=0; Init_DS18B20();
WriteOneChar(0xCC); WriteOneChar(0x44);
DelayMs(10); Init_DS18B20(); WriteOneChar(0xCC);
void DelayMs(unsigned char t) {
while(t--) {
//大致延时1mS DelayUs2x(245); DelayUs2x(245); } }
六、仿真调试
1、经软件调试-仿真器调试通过,并烧录芯片,得到所要求的设计结果。试验成功。现根据具体设计方案对整体电路仿真如下图14:
图14 整体电路仿真图
2、总电路图