仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
Altium Designer画的原理图和PCB图如下:(51hei附件中可下载工程文件)
①采用单片机设计电子温度计,选择适合的感温元件,温度测量范围-50℃~110℃; ②测量误差小于0.1℃; ③LED数码直读显示; 1.2总体方案分析在单片机电路设计中,大多都是使用传感器,所以本次设计采用温度传感器DS18B20。整个系统由单片机控制,温度传感器采用DS18B20。DS18b20采用单总线方式与单片机相连.把采集到得温度信息传给单片机。单片机采集到的温度输出到四个数码管上进行显示。当四位数码管显示的温度超过上限值时可以实现报警功能。系统总体方案如图1-1所示。 图1-1 系统总体方案 2 电路设计2.1电路原理图电路原理图如图2-1所示;
图2-1 电路原理图 2.2电路PCB图电路PCB图底层如图2-2所示; 图2-2 电路PCB底层图 电路PCB顶层如图2-3所示; 图2-3 电路PCB顶层图 电路PCB3D图如2-4所示; 图2-4 电路PCB3D图 2.3设计计算及分析说明2.3.1时钟电路和复位电路①复位电路 复位电路的基本功能是:系统上电时提供复位信号,直至系统电源稳定后,撤销复位信号。在本系统中,上电复位采用电平方式开关复位。上电复位采用RC电路,其中电容为10uF,电阻为10K。 ②晶振电路 单片机系统里晶振的作用非常大,它结合单片机内部的电路,产生单片机所必须的时钟频率,单片机的一切指令的执行都是建立在这个基础上的,晶振提供的十种频率越高,单片机运行的速度也就越快。单片机的晶振频率应低于40MHZ,本设计中采用的晶振频率为11.0592MHZ,在晶振上并联两个30pF电容。 时钟电路和复位电路如图2-5所示。 图2-5 电路和复位电路图 2.3.2温度采集电路DS18B20温度传感器是一种改进型智能温度传感器,与传统的热敏电阻等测温元件相比,它能直接读出被测温度,并且可根据实际要求通过简单的编程实现9~12位的数字值读数方式。DS18B20的性能特点如下:
①独特的单线接口仅需要一个端口引脚进行通信;
②多个DS18B20可以并联在惟一的三线上,实现多点组网功能;
③无须外部器件;
④可通过数据线供电,电压范围为3.0~5.5V;
⑤零待机功耗;
⑥温度以9或12位数字;
⑦用户可定义报警设置;
⑧报警搜索命令识别并标志超过程序限定温度(温度报警条件)的器件;
⑨负电压特性,电极接反时,温度计不会因发热而烧毁,只是不能正常工作。温度采集电路如图2-6所示。 图2-6 温度采集电路图 DS18B20测温原理如图2.7所示。图中低温度系数晶振的振荡频率受温度影响很小,用于产生固定频率的脉冲信号送给计数器1。高温度系数晶振随温度变化其振荡率明显改变,所产生的信号作为计数器2的脉冲输入。计数器1和温度寄存器被预置在-55℃所对应的一个基数值。计数器1对低温度系数晶振产生的脉冲信号进行减法计数,当计数器1的预置值减到0时,温度寄存器的值将加1,计数器1的预置将重新被装入,计数器1重新开始对低温度系数晶振产生的脉冲信号进行计数,如此循环直到计数器2计数到0时,停止温度寄存器值的累加,此时温度寄存器中的数值即为所测温度。图中的斜率累加器用于补偿和修正测温过程中的非线性,其输出用于修正计数器1的预置值。 图2-7 DS18B20测温原理 2.3.3蜂鸣器报警电路本设计报警系统使用蜂鸣器报警电路,在单片机程序内设置了报警温度的上下限值,当温度高于设定温度上限时,蜂鸣器提示;当温度低于设定温度下限时,蜂鸣器也会提示。报警功能是重要功能之一,在很多应用场合下通过报警功能可以避免很多人力、财力的损失,蜂鸣器报警电路所测温度超出上、下限温度极限值时,为实现报警功能,设计了蜂鸣器报警电路。报警电路如图2-8所示。 图2-8 蜂鸣器报警电路图 2.3.4位LED数码管显示电路 在该电路中采用的是4位共阳极数码管,通过P2.0~P2.3端来控制四位数码管的亮灭,通过P0并行口来控制数码管显示的数值。使用数码管时,采用动态扫描的方式, 动态显示的特点是将所有位数码管的段选线s一位数码管有效。选亮数码管采用动态扫描显示。所谓动态扫描显示即轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管同时都在显示。LED数码管显示电路图如图2-9所示。 图2-9 LED数码管显示电路图 2.3.5按键控制电路本电路具有按键输入功能,当有按键被按下时,相对应的引脚会变成低电平,便可确定是哪一个按钮被按下。按键可设定报警温度的上限值和下限值,如果当前环境温度不在设定范围之内,蜂鸣器就会报警。按键控制电路如图2-10所示。 图2-10 按键控制电路图
2.4电路元件选择由Altium Designer的bill of material功能导出得到本次设计的所有元器件,电路元器件如图2-11所示。 图2-11 电路元器件清单图
3 程序3.1程序流程图及说明3.1.1主程序主程序设计如图3-1所示; 图3-1 主程序流程图
代码: - //主函数
- void main()
- {
- beep=0;
- delay(10);
- while( 1 )
- {
- tmpchange(); //温度变换
- if(shu==0)
- {
- displayTemp(tmp( ));
- }
- keyscan(); //键盘扫描
- if(shu==1)
- {
- displayTemp(count); //设置上限温度值
- }
- if(shu==2)
- {
- displayTemp(alarm); //设置下限温度值
- }
- if(shu==3)
- {
- shu=0;
- }
- if(temp>count||(temp<alarm)) //比较
- {
- beep=0;
- }
- else
- beep=1;
- }
- }
复制代码
3.1.2按键控制程序设计在键盘扫描程序中,对按键初始化,然后判断按键是否闭合,如果按键闭合,通过软件延时去抖,最后通过显示程序可以看到相应的按键设置值,以做下一步指示,这是最基本的人机交互模式。按键控制流程如图3-2所示。 图3-2 按键控制流程图 代码: - //键盘扫描函数
- uint keyscan()
- {
- if(key1==0)
- {
- delay(5);
- if(key1==0)
- {
- while(!key1);
- shu++;
- }
- }
- if(key2==0)
- {
- delay(5);
- if(key2==0)
- {
- while(!key2);
- count=count+10;
- if(shu==2)
- {
- alarm+=10;
- }
- }
- }
- if(key3==0)
- {
- delay(5);
- if(key3==0)
- {
- while(!key3);
- count=count-10;
- if(shu==2)
- {
- alarm-=10;
- }
- }
- }
- return(count);
- }
复制代码
3.1.3DS18B20初始化程序设计DS18B20的初始化 (1)先将数据线置高电平”1” (2)延时(该时间要求的不是很严格,但是尽可能的短一点)
(3)数据线拉到低电平“0”
(4)延时750微秒(该时间的时间范围可以从480到960微秒)
(5)数据线拉到高电平“1”
(6)延时等待(如果初始化成功则在15到60毫秒时间之内产生一个由DS18B20所返回的低电平”0”。据该状态可以来确走它的存在,但是应注意不能无限的进行等待,不然会使程序进入死循环,所以要进行超时控制)。
(7)若CPU读到了数据线上的低电平“0”后,还要做延时,其延时的时间从发出的高电平算起第(5)步的时间算起)最少要480微秒。
(8)将数据线再次拉高到高电平“1后结束。 DS18B20初始化程序流程图如图3-3所示。 图3-3 DS18B20初始化程序流程图 代码: - void dsreset()//发复位
- {
- uint i;
- DS=0;
- i=103;
- while(i>0)i--;
- DS=1;
- i=4;
- while(i>0)i--;
- }
- uchar tmpread() //读取一字节
- {
- uchar j,k,dat;
- uint i;
- for(j=1;j<=8;j++)
- {
- DS=0;i++; //延时
- DS=1;i++;i++;
- k=DS;
- i=8;while(i>0)i--;
- dat=(k<<7)|(dat>>1);//读出的数据最低位在最前面存一个字节在DAT里
- }
- return(dat);
- }
- void tmpwritebyte(uchar dat) //写一个字节
- {
- uint i;
- uchar j;
- bit testb;
- for(j=1;j<=8;j++)
- {
- testb=dat&0x01;
- dat=dat>>1;
- if(testb) //写 1
- {
- DS=0;
- i++;i++;
- DS=1;
- i=8;while(i>0)i--;
- }
- else
- {
- DS=0; //写 0
- i=8;while(i>0)i--;
- DS=1;
- i++;i++;
- }
- }
- }
复制代码
3.3.4温度转换程序设计温度转换命令子程序主要是发温度转换开始命令,当采用 12 位分辨率时转换时间约为 750ms,在本程序设计中采用 1s 显示程序延时法等待转换的完成。温度转换程序流程如图3-4所示。 图3-4 温度转换程序流程图 代码: void tmpchange() //DS18B20温度变换 { dsreset(); delay(1); tmpwritebyte(0xcc); //跳过读取内存rom tmpwritebyte(0x44); //开始转换 } 3.1.5温度显示程序设计根据用户的键盘选择来显示数据,在普通模式下显示当前温度;在设置模式下,显示设置的限值,显示数据刷新新子程序主要是对显示缓冲器中的显示数据进行刷新操作,温度显示流程如图3-5所示。 图3-5 温度显示流程图 代码: - void displayTemp(uint temp) //显示温度程序
- {
- uchar ge,shi,bai,qian,ser;
- d1=0;
- d1=0;
- d3=0;
- d4=0;
- dsreset();
- ser=temp/10; //分离出三位要显示的数字
- SBUF=ser;
- qian=temp/1000;
- bai=temp/100%10; // 百位数字
- shi=temp/10%10; // 十位数字
- ge=temp%10; // 个位数字
- if(flag==1)
- {
- flag=0;
- P0=0xbf;
- d1=1;
- delay(2);
- d1=0;
- }
- if(qian!=0)
- {
- P0=tab[qian];
- d1=1;
- delay(2);
- d1=0;
- }
- else
- {
- P0=0xff;
- d1=1;
- delay(2);
- d1=0;
- }
- if(temp>99)
- {
- P0=tab[bai];
- d2=1;
- delay(2);
- d2=0;
- }
- P0=tab1[shi];
- d3=1;
- delay(2);
- d3=0;
- P0=tab[ge];
- d4=1;
- delay(2);
- d4=0;
- }
复制代码
|