基于FPGA的数字温度计_第1页
基于FPGA的数字温度计_第2页
基于FPGA的数字温度计_第3页
基于FPGA的数字温度计_第4页
基于FPGA的数字温度计_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 题目要求基本要求:基于FPGA设计一个测量室温的温度计,能够实时的显示温度。附加功能:、达到设置的预定温度值可报警;、统计温度测量期内的最高温以及最低温 提供硬件:cyclone EP1C6Q240C8N开发板开发板资源:按键四个;共阳数码管四位;PS2接口;USB接口;蜂鸣器;四位拨码开关;LCD1602;VGA接口;RS232接口;FLASH;SDRAM;2 设计方案(或设计分析)外设:鉴于要测量温度,而开发板没有测量温度的设备,所以最基本是要添加外设数字温度传感器ds18b20。.ds18b20外形与三极管一样,一只脚传输数据,另外两只脚分别接地与高电平使之工作。Ds18b20实时测

2、得的室温将转化成9到2位的串行数据,对串行数据进行“翻译”就可以得出实时室温。传输途径:传输途径是指9到12位的串行数据传输,我们考虑两种传输途径,一种是无线传输,一种是有限传输。如果是无线传输就会使成品温度记的测温更加灵活方便,不局限于线的长度,但必须再增加外设,而且编程肯定会更难更复杂,所以我们的初始方案是第二种,就是有线传输,在实现了基本测温功能之后如果有时间就再设计无线发送接收的模块。连接:开发板上提供了众多的引脚,我们只需选择其中一个接口与ds18b20的传输脚连接,将开发板上的地和+5v与ds18b20的其他两脚连接就可完成外围电路的连接,这个虽然比较简单,但是在调试阶段我们的连接

3、还是忽略了一点问题,这将在设计中遇到的问题中述说。程序的编写:程序的编写我们打算用模块化得方式。总的来说数字温度记程序的设计不算复杂,不分模块写下来应该也不会难以读懂,但模块化的程序编写的一个良好习惯,这样在编写复杂程序的时候才会调理清晰容易读懂,而且模块化有利于组内分工,充分调动大家,积极参与到课程设计中。而程序的分块将在模块实现中分析。附加功能:在实现基本测温功能的前提下,我们考虑使其功能更强大更切合实际,所以打算添加功能,一个是警报功能,就是温度达到某个设定的温度时使蜂鸣器响一声并使灯亮;另一个功能是最高温与最低温的记录,在不按按键的时候显示的是实时室温,在按下一个或者两个按键时可以分别

4、显示温度计启动开始到目前为止的最高室温与最低室温。3 模块实现分析:首先要对DS18B20的外围电路进行配置:Ds18b20的工作方式看似简单,只是单线传输,直接解读,其实初始化与读写操作比较复杂,时序要求非常精确,如下面图片所示:初始化:读写:写时间隙当主机把数据线从逻辑高电平拉到逻辑低电平的时候,写时间隙开始。有两种写时间隙:写1 时间隙和写0 时间隙。所有写时间隙必须最少持续60s,包括两个写周期间至少1s 的恢复时间。I/O 线电平变低后,DS1820 在一个15s 到60s 的窗口内对I/O 线采样。如果线上是高电平,就是写1,如果线上是低电平,就是写0。主机要生成一个写1时间隙,必

5、须把数据线拉到低电平然后释放,在写时间隙开始后的15s内允许数据线拉到高电平。主机要生成一个写 0 时间隙,必须把数据线拉到低电平并保持60s。读时间隙当从 DS1820 读取数据时,主机生成读时间隙。当主机把数据线从高高平拉到低电平时,写时间隙开始。数据线必须保持至少1s;从DS1820 输出的数据在读时间隙的下降沿出现后15s 内有效。因此,主机在读时间隙开始后必须停止把I/O 脚驱动为低电平15s,以读取I/O 脚状态(见图12)。在读时间隙的结尾,I/O 引脚将被外部上拉电阻拉到高电平。所有读时间隙必须最少60s,包括两个读周期间至少1s 的恢复时间。而对DS18B20的操作可以用下表

6、表示:温度转换和插补(外部电源供电且只有一只 DS1820)控制器状态数据(LSB在前)内容TX复位复位脉冲TR存在存在脉冲TXCChSkip ROM 命令TX44hConvert T 命令RX读 8 次忙标志。控制器一字节(或位)接一个字节读下去,直到数据为FFh(所有位都为1)TX复位复位脉冲RX存在存在脉冲TXCChSkip ROM 命令TXBehRead Scratchpad 命令RX读整个暂存器加上CRC;控制器重新计算从暂存读到的8 个数据字节的CRC,把计算的CRC 和读取的CRC 进行比较,如果相同,数据就是有效的。控制器存储温度值并分别存储计数寄存器的内容和每度计数值寄存器的

7、内容,做为COUNT_REMAIN 和COUNT_PER_C。TX复位复位脉冲RX存在存在脉冲CPU 按手册中的方法计算温度值以得到更高的分辨力。时钟:为了在初始化程序的编写方面那些延时比较直观准确和七段显示管的显示正常工作,我们设置了两个时钟分频模块。把原开发板上5MHZ的始终频率分成1MHZ和10KHZ,前者为串行数据处理与ds18b20初始化模块提供时钟,后者为并行数据处理与显示模块提供时钟。并行数据处理与显示:数码管的温度显示方面,编程可以比较独立,而且单独编程容易查错,所以独立设置了一个模块。在后期的添加功能阶段,最高温与最低温记录与报警功能没有单独设置一个模块,而是根据实际直接在此

8、模块上稍作改动。数码管的七段的七位输入是一样的,所以要在四个数码管上显示不同的数字需要逐个扫描,每个时钟周期只选通一个数码管,然后输入要显示的数字的七位码,这样由于视觉暂留时间,虽然每个数码管的显示是分别在四个周期的时间段,但看起来是同时显示的,这是显示的基本方式。如下:1 2 3 视觉所见: 123报警功能:报警功能的实现与最高最低温的记录原理差不多,对输入的十二位并行数据(温度的编码)进行检测,如果达到某个设定的温度就给蜂鸣器一个电平使其想一声并给led灯电平使其亮,而温度记录则要比较后一个输入的十二位数据与前一位十二位数据,看其表示的温度,比前一位大就把数据保存取代前一位最高,并设置按钮

9、使其按下就显示此最高温度,比前一位小就把数据保存取代前一位最低,并设置不同按钮使其按下显示此最低温度。 串行数据处理与初始化:由于ds18b20的操作相对比较复杂,所以单独设置一个模块专门处理其初始化,鉴于数码管的显示模块设置时并行输入的,所以此模块兼备ds18b20的传输数据处理,把串行数据处理成并行数据。此模块的输入就一个是时钟,另一个就是ds18b20的串行实时温度代码(12位),其与ds18b20之间就一根线相连,实现对其初始化与数据就收,还要对接收的串行数据进行储存使之可以并行输出,以提供给显示模块。整机模块组合:时钟分频模块2时钟分频模块1时钟并行数据处理与显示模块串行数据处理与初

10、始化模块Ds18b20另附各程序如下:时钟分频模块:1:-分频器生成一个频率为1MHz的时钟信号,- 以供显示及报警模块作为触发信号使用。LIBRARYIEEE;USE IEEE.STD_LOGIC_1164.ALL;entity clk_div isport( clk: in std_logic;clk_div: out std_logic);end entity;architecture behav of clk_div isbeginprocess(clk)variable count:integer range 0 to 50; begin if rising_edge(clk) th

11、encount:=count+1;if count=50 then clk_div=1;count:=0; -开发板内部时钟为50MHz,计数变量count=50 使时钟输出为1MHzelse clk_div=0; -分频器以1MHz的频率置“1”其余保持低电平end if;end if;end process;end behav;2:-分频器生成一个频率为10000Hz的时钟信号,- 以供显示及报警模块作为触发信号使用。LIBRARYIEEE;USE IEEE.STD_LOGIC_1164.ALL;entity clk_div2 isport( clk: in std_logic;clk_d

12、iv2: out std_logic);end entity;architecture behav of clk_div2 isbeginprocess(clk)variable count:integer range 0 to 5000; begin if rising_edge(clk) thencount:=count+1;if count=5000 then clk_div2=1;count:=0;-开发板内部时钟为50MHz,计数变量count=5000 使时钟输出为10000Hzelse clk_div2=0;-分频器以10000Hz的频率置“1”其余保持低电平end if;end

13、 if;end process;end behav;DS18B20初始化与串行数据处理模块:-温度传感器初始化以及命令的读写、温度检测library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity wendu_chuangan isport(clk:in std_logic; dq:inout std_logic; wendu:out std_logic_vector(15 downto 0);end wendu_chuangan;archi

14、tecture behav of wendu_chuangan istype state_type is(s0,s1,s2,s3,s4,s5,s6,s7,write_0,write_1,write_01,write_11,read0,read1,read2,read3);signal state:state_type;signal reset:std_logic;signal i:integer range 0 to ;signal date:std_logic_vector(15 downto 0);beginwendu=date;-内部暂存数据赋给“wendu”输出一个16位的数值proc

15、ess(clk,reset)-通常作用实现是变量i=i+1,而当reset=1,则i置“0” begin if (reset=1)then i=0; elsif rising_edge(clk) then i -对传感器输入一个拉低电平 dq=0; reset=1; state -保持低电平500s,之后释放传感器的数据I/O管脚并置高阻态 reset=0; if(i=500)then dq=Z; state=s2; reset -等待45s reset=0; if(i=45)then reset=1; state -如果检测到DQ输出低电平则跳转到s4,如果为高电平则跳转到s0 if(dq=

16、0)then state=s4; elsif(dq=1)then state -保持存在低电平200s,之后跳转到s5reset=0; if(i=200)then reset=1; state -命令写入 if(j=0 or j=1)then -写入命令CCh,即Skip ROM 命令 state=write_0; j:=j+1; elsif(j=2 or j=3)then state=write_1; j:=j+1;dq=0; elsif(j=4 or j=5)then state=write_0; j:=j+1; elsif(j=6 or j=7)then state=write_1; j

17、:=j+1;dq=0; elsif(j=8 or j=9)then -写入命令44h,即Convert T 命令 state=write_0; j:=j+1; elsif(j=10)then state=write_1; j:=j+1;dq=0; elsif(j=11)then state=write_0; j:=j+1; elsif(j=12 or j=13)then state=write_0; j:=j+1; elsif(j=14)then state=write_1; j:=j+1;dq=0; elsif(j=15)then state=write_0; j:=j+1; elsif (

18、j=16)then j:=20; state=s6; dq=Z; elsif(j=20 or j=21)then -写入命令CCh,即 Skip ROM 命令 state=write_0; j:=j+1; elsif(j=22 or j=23)then state=write_1; j:=j+1;dq=0; elsif(j=24 or j=25)then state=write_0; j:=j+1; elsif(j=26 or j=27)then state=write_1; j:=j+1;dq=0; elsif(j=28)then -写入命令BEh, 即Read Scratchpad 命令

19、state=write_0; j:=j+1; elsif(j=29 or j=30 or j=31)then state=write_1; j:=j+1;dq=0; elsif(j=32 or j=33)then state=write_1; j:=j+1;dq=0; elsif(j=34)then state=write_0; j:=j+1; elsif(j=35)then state=write_1; j:=j+1;dq=0; elsif(j=36)then state -写入命令44h后,释放DQ管脚,并等待750ms reset=0; if (i= or dq=1)then state

20、=s0; reset -主机生成一个写 0 时间隙,必须把数据线拉到低电平并保持70s。dq=0; reset=0; if (i = 70) then dq=Z; -释放DQ管脚,使其有1s的恢复时间 reset=1; state state -主机生成一个写“1”时间隙,必须把数据线拉到低电平然后释放,1s后把数据线DQ拉到高电平,并保持70s state dq=1; reset=0; if (i = 70) then reset=1; state -从DQ管脚读出连续串行的16个数值if (j 55 ) then j:=j+1; state=read0;cnt:=cnt+1; dq=0;

21、elsif (j = 55 ) then j:=60; state=read0;cnt:=15;dq=0; elsif (j = 60 ) then j:=0;state -DQ写入一个低电平,此处等待1sstate -释放DQ,当10s后转到read2把读出的数值赋给寄存器datedq = Z; reset=0; if (i = 10) then reset=1; state date(cnt)= dq; state -读时间隙再保持55s,合67sreset=0; if (i = 55) then reset=1; statestate=s0;end case;end if;end pro

22、cess;end behav;七段数码管显示外加温度记录与报警功能模块:-并行数据处理与显示模块LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_unsigned.all;USE ieee.std_logic_arith.all;entity d18b20 isGENERIC(LED_0:STD_LOGIC_VECTOR (7 DOWNTO 0):=; -LED驱动不包括小数点LED_1:STD_LOGIC_VECTOR (7 DOWNTO 0):=;LED_2:STD_LOGIC_VECTOR (7 DOWNTO 0):=

23、;LED_3:STD_LOGIC_VECTOR (7 DOWNTO 0):=;LED_4:STD_LOGIC_VECTOR (7 DOWNTO 0):=;LED_5:STD_LOGIC_VECTOR (7 DOWNTO 0):=; LED_6:STD_LOGIC_VECTOR (7 DOWNTO 0):=; LED_7:STD_LOGIC_VECTOR (7 DOWNTO 0):=; LED_8:STD_LOGIC_VECTOR (7 DOWNTO 0):=; LED_9:STD_LOGIC_VECTOR (7 DOWNTO 0):=; LED0:STD_LOGIC_VECTOR (7 DOW

24、NTO 0):=; -LED驱动包括小数点LED1:STD_LOGIC_VECTOR (7 DOWNTO 0):=;LED2:STD_LOGIC_VECTOR (7 DOWNTO 0):=;LED3:STD_LOGIC_VECTOR (7 DOWNTO 0):=;LED4:STD_LOGIC_VECTOR (7 DOWNTO 0):=;LED5:STD_LOGIC_VECTOR (7 DOWNTO 0):=; LED6:STD_LOGIC_VECTOR (7 DOWNTO 0):=; LED7:STD_LOGIC_VECTOR (7 DOWNTO 0):=; LED8:STD_LOGIC_VE

25、CTOR (7 DOWNTO 0):=; LED9:STD_LOGIC_VECTOR (7 DOWNTO 0):=); port(clk,dip1,dip2:in std_logic; temp:in std_logic_vector(15 downto 0); led77:out std_logic_vector(7 downto 0); led44:out std_logic_vector(3 downto 0); led:out std_logic_vector(7 downto 0); beep:out std_logic);end entity;architecture behav

26、of d18b20 issignal j:std_logic_vector(1 downto 0);signal led71:std_logic_vector(7 downto 0);signal led72:std_logic_vector(7 downto 0);signal led73:std_logic_vector(7 downto 0);signal led74:std_logic_vector(7 downto 0);type state_type is(s0,s1,s2,s3);signal state:state_type;signal r:std_logic_vector(

27、15 downto 0);type state_type_first is(w0,w1,w2);signal state_first:state_type_first; begin counter:process(clk) begin if(clkevent and clk=1) then jled44=0111; led77led44=1011; led77led44=1101; led77led44=1110; led77 -等待1s后把从温度传感器的DQ管脚读入的16位数值,赋给me1,以及me2 i:=i+1; if(i=10000)then i:=0; me1:=temp;me2:=

28、temp; state_first -me1为检测通电时间内检测到的最高温,me2则为最低温 if(me1temp)then me2:=temp; else me2:=me2; end if; if(dip1=1)then -当dip1为高电平则数码管显示实时温度,当dip2为高电平则显示最高温,dip2为低电平则显示最低温r=temp;elsif(dip2=1)thenr=me1;elsif(dip2=0)thenr=me2;end if;state_first - case r(11 downto 4)is -穷举读入数值temp的第511位,并置第一、二个数码管为相应的数字 when =

29、led71=led_0;led72led71=led_0;led72led71=led_0;led72led71=led_0;led72led71=led_0;led72led71=led_0;led72led71=led_0;led72led71=led_0;led72led71=led_0;led72led71=led_0;led72led71=led_1;led72led71=led_1;led72led71=led_1;led72led71=led_1;led72led71=led_1;led72led71=led_1;led72led71=led_1;led72led71=led_1

30、;led72led71=led_1;led72led71=led_1;led72led71=led_2;led72led71=led_2;led72led71=led_2;led72led71=led_2;led72led71=led_2;led72led71=led_2;led72led71=led_2;led72led71=led_2;led72led71=led_2;led72led71=led_2;led72led71=led_3;led72led71=led_3;led72led71=led_3;led72led71=led_3;led72led71=led_3;led72led71

31、=led_3;led72led71=led_3;led72led71=led_3;led72led71=led_3;led72led71=led_3;led72led71=led_4;led72led71=led_4;led72led71=led_4;led72led71=led_4;led72led71=led_4;led72led71=led_4;led72led71=led_4;led72led71=led_4;led72led71=led_4;led72led71=led_4;led72led71=led_5;led72led71=led_5;led72led71=led_5;led7

32、2led71=led_5;led72led71=led_5;led72led71=led_5;led72led71=led_0;led72led73=led_0;led74led73=led_2;led74led73=led_5;led74led73=led_7;led74led73=led_0;led74=led_0; end case; state_first state_firstif(q(10 downto 2)=or q(10 downto 2)=)thenstate=s1;elsif(q(10 downto 2)=)thenstate=s3;else stateif(q(10 do

33、wnto 2)= or q(10 downto 2)=)thenstate=s2;else statei:=i+1;if(i=1)thenbeep=0;led=;elsif(i=1875)thenled=;elsif(i=3750)thenled=;elsif(i=5000)thenbeep=Z;elsif(i=5625)thenled=;elsif(i=7500)thenled=;elsif(i=9575)thenled=;elsif(i=11250)thenled=;elsif(i=13125)thenled=;elsif(i=15000)thenled=;elsif(i=16875)thenled=ZZZZZZZZ;i:=

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论