中原工学院信息商务学院课程设计
3.2 DS18B20初始化
开始C51寄存器初始化N18B20存在?Y温度转换命令读取温度温度数据处理温度显示N温度比较超出范围?Y报警
图 5-2 DS18B20初始化流程图
3.3部分电路图设计 3.3.1 晶振设计
80C52单片机内部带有时钟电路,只需在片外通过XTAL1和XTAL2引脚接入定时控制元件(12MHZ晶振和电容)即可构成一个稳定的自激振荡器。XTAL1和XTAL2分别是80C52内部高增益反响放大器的输入端和输出端 时钟频率为 12MHz.
此部分为其使能和复位电路,该电路采用上电自动复位方式,通过复位电容
25
中原工学院信息商务学院课程设计
C1的充电来实现,接通电源就实现了系统的复位初始化。
3.3.2 报警电路设计
单片机一个引脚控制蜂鸣器,当温度超过设定的值时,他就可以报警,下图为PNP型三极管给低电平即可以实现报警。
3.4 软件流程图
系统程序主要包括主程序,读出温度子程序,温度转换命令子程序,计算温度子程序,显示数据刷新子程序等。
3.4.1 主程序
主程序的主要功能是负责温度的实时显示、读出并处理DS18B20的测量的当前温度值,温度测量每1s进行一次。这样可以在一秒之内测量一次被测温度,其程序流程见图7所示。
26
中原工学院信息商务学院课程设计
初始化 调用显示子程序 N 1S到? Y Y 初次上电 N 读出温度值温度计算处理显示数据刷新
发DS18B20 复位命令 发跳过ROM命令 发读取温度命令 读取操作,CRC校验 Y 发温度转换开始命令 结束 移入温度暂存器 N 9字节完? Y CRC校验正?N
3.12主程序流程图 图3-13 读温度流程图
3.4.2 读温度子程序
读出温度子程序的主要功能是读出RAM中的9字节,在读出时需进行CRC校验,校验有错时不进行温度数据的改写。其程序流程图如图8示
发DS18B20复位命令 发跳过ROM命令
发温度转换开始命令 27
结束 中原工学院信息商务学院课程设计
图3.13 温度转换流程图
3.4.3 温度转换命令子程序
温度转换命令子程序主要是发温度转换开始命令,当采用12位分辨率时转换时间约为750ms,在本程序设计中采用1s显示程序延时法等待转换的完成。温度转换命令子程序流程图如上图,图3.14所示
3.4.4 计算温度子程序
计算温度子程序将RAM中读取值进行BCD码的转换运算,并进行温度值正负的判定,其程序流程图如图3.15所示
开始 N 温度零下? Y N 温度数据移入显示寄存器 十位数0? 温度值取补码置置“+”标志 Y 百位数0? N 计算小数位温度BCD值 Y 十位数显示符号百位数显示数据(不显示符号) 计算整数位温度BCD值 百位数不显示
结束 结束 图3-14 计算温度流程图 图3-15显示数据刷新流程图
3.4.5软件总程序:
//DS18B20 的读写程序,数据脚
P2.5 //
28
中原工学院信息商务学院课程设计
//温度传感器18B20 汇编程序,采用器件默认的12 位转化//
//最大转化时间750 微秒,显示温度-55 到+125 度,显示精度//
//为0.1 度,显示采用4 位LED 共阳显示测温值//
//P0 口为段码输入,P20~P24 为位选//
/***************************************************/
#include \#include
\
//_nop_();延时函数用
#define dm P0 //段码输出口 #define uchar unsigned char #define uint unsigned int sbit DQ=P2^5; //温度输入口 sbit w0=P2^3; //数码管4 sbit w1=P2^2; //数码管3 sbit w2=P2^1; //数码管2 sbit w3=P2^0; //数码管1 sbit beep=P1^7; //蜂鸣器和指示灯
sbit set=P1^0; //温度设置切换键
sbit add=P1^1; //温度加 sbit dec=P1^2;
int temp1=0; //显示当前温度和设置温度的标志位为0 时显示当前温度
uint h; uint temp; uchar r;
uchar high=40,low=15;
uchar sign; uchar q=0; uchar tt=0; uchar scale;
//**************温度小数部分用查表法***********//
uchar
code
ditab[16]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09};
//小数断码表 uchar
code
table_dm[12]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};
//共阴LED 段码表\\不亮\
uchar
table_dm1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10}; //个位带小数点的断码表
uchar data
temp_data[2]={0x00,0x00}; //读出
温度暂放
uchar
data
display[5]={0x00,0x00,0x00,0x00,0x00}; //显示单元数据,共4 个数据和一个运算暂用
/*****************11us 延时函数*************************/
void delay(uint t) {
for (;t>0;t--);
2