ds18B20_FPGA(VHDL語言).doc_第1頁
ds18B20_FPGA(VHDL語言).doc_第2頁
ds18B20_FPGA(VHDL語言).doc_第3頁
ds18B20_FPGA(VHDL語言).doc_第4頁
ds18B20_FPGA(VHDL語言).doc_第5頁
已閱讀5頁,還剩3頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、-VHDL語言編寫 DS18B20 溫度傳感器程序library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity ds18B20 isport(clk : in std_logic;-50MHzdq: inout std_logic;rst: in std_logic;LED : out std_logic;LED2 : out std_logic;LED3 : out std_logic;dataout1,dataout2,dataout3

2、 : out std_logic_vector(6 downto 0 ); - 數(shù) end ds18B20;architecture Behavioral of ds18B20 isTYPE STATE_TYPE is (RESET,CMD_CC,WRITE_BYTE,WRITE_LOW,WRITE_HIGH,READ_BIT, CMD_44,CMD_BE,W AIT800MS,GET_TMP,W AIT4MS); signal STATE: STATE_TYPE:=RESET;signal clk_temp : std_logic:=0;signal clk1m : std_logic; -

3、 分頻后得到的1M 時鐘signal cp: std_logic;- 1ms時鐘signal w : integer range 0 to 2 :=0; - xian shi shun xusignal write_temp : std_logic_vector(7 downto 0):=00000000;signal TMP : std_logic_vector(11 downto 0);signal tmp_bit : std_logic;signal WRITE_BYTE_CNT : integer range 0 to 8:=0;signal WRITE_LOW_CNT : integ

4、er range 0 to 2:=0;signal WRITE_HIGH_CNT : integer range 0 to 2:=0;signal READ_BIT_CNT : integer range 0 to 3:=0;signal GET_TMP_CNT : integer range 0 to 13:=0;signal cnt : integer range 0 to 100_001:=0;-*signal cnt2 : integer range 0 to 4000001:=0;signal temp : std_logic;signal data_temp0 : std_logi

5、c_vector(15 downto 0);signal decimal0 : std_logic_vector(15 downto 0);signal decimal1 : std_logic_vector(15 downto 0);signal decimal2 : std_logic_vector(15 downto 0);signal decimal3 : std_logic_vector(15 downto 0);signal data_temp1 : std_logic_vector(7 downto 0);signal integer0 : std_logic_vector(7

6、downto 0);signal integer1 : std_logic_vector(7 downto 0);signal integer2 : std_logic_vector(7 downto 0);signal integer3 : std_logic_vector(7 downto 0);signal integer4 : std_logic_vector(7 downto 0);signal integer5 : std_logic_vector(7 downto 0);signal integer6 : std_logic_vector(7 downto 0);signal s

7、ign : std_logic_vector(7 downto 0);signal count : integer range 0 to 51:=0;signal WRITE_BYTE_FLAG : integer range 0 to 4:=0;function dis(num: std_logic_vector) return std_logic_vector isbegincase num iswhen 0000 = return 1000000; -0when 0001 = return 1111001; -1when 0010 = return 0100100; -2when 001

8、1 = return 0110000; -3when 0100 = return 0011001; -4when 0101 = return 0010010; -5when 0110 = return 0000010; -6when 0111 = return 1111000; -7when 1000 = return 0000000; -8when 1001 = return 0010000; -9when 1010 = return 0001000; -Awhen 1011 = return 0000011; -bwhen 1100 = return 1000110; -Cwhen 110

9、1 = return 0100001; -dwhen 1110 = return 0000110; -Ewhen 1111 = return 0001110; -Fwhen others = return 1111111; -mieend case;end dis;begin-ClkDivider:process (clk,clk_temp)beginif rising_edge(clk) thenif (count = 24) thencount = 0;clk_temp= not clk_temp;elsecount = count +1;end if;end if;clk1m12000)

10、 then n:=0;cp=not cp;end if;end if;end Process;STATE_TRANSITION:process(STATE,clk1m)beginif rising_edge(clk1m) thenif(rst=0) thenSTATE-*LED2=0;-*-LED3=0 and cnt500) then - 500 s 的復(fù)位低電平dq=0;-dq 作為輸出cnt=cnt+1;STATE=500 and cnt510) then - 高阻態(tài)再輸入下一級電路的話,對下級電路無任何影響,和沒接一樣 ,高阻態(tài)可以應(yīng)用在 inout 端口里面, 這樣在 inout 沒

11、有輸出的時候就弄個高阻態(tài),這樣就其電平就可以由外面的輸入信號決定了dq=Z;cnt=cnt+1;STATE=510 and cnt750) then- 240 stemp=dq; -dqif(cnt=580) thentemp=dq;if(temp=1) thenLED=0;else LED=1;end if;end if;作為輸入cnt=cnt+1;STATE=750) thencnt=0; - 計數(shù)器清零STATE-跳躍 rom 指令“ CC”LED2=1;LED3=0;write_temp=11001100;STATEcase WRITE_BYTE_CNT iswhen 0 to 7=i

12、f (write_temp(WRITE_BYTE_CNT)=0) thenSTATE=WRITE_LOW;LED3=1;elserom指令“CC”STATE=WRITE_HIGH;end if;WRITE_BYTE_CNTif (WRITE_BYTE_FLAG=0) then - 第一次寫 0XCC 完畢 STATE=CMD_44;WRITE_BYTE_FLAG=1;elsif (WRITE_BYTE_FLAG=1) then -寫 0X44完畢(寫溫度轉(zhuǎn)換指令后沒有讀數(shù)據(jù)?)STATE=RESET;WRITE_BYTE_FLAG=2;elsif (WRITE_BYTE_FLAG=2) the

13、n -第二次寫0XCC完畢STATE=CMD_BE;WRITE_BYTE_FLAG=3;elsif (WRITE_BYTE_FLAG=3) then -寫 0XBE完畢STATE=GET_TMP;WRITE_BYTE_FLAG=0;end if;WRITE_BYTE_CNTSTATELED3dq=0;if (cnt=70) thencnt=0;WRITE_LOW_CNT=1;elsecntdq=Z;if (cnt=5) thencnt=0;WRITE_LOW_CNT=2;elsecntSTATE=WRITE_BYTE;WRITE_LOW_CNTWRITE_LOW_CNTcase WRITE_H

14、IGH_CNT iswhen 0=dq=0;if (cnt=8) thencnt=0;WRITE_HIGH_CNT=1;elsecntdq=Z;if (cnt=72) thencnt=0;WRITE_HIGH_CNT=2;elsecntSTATE=WRITE_BYTE;WRITE_HIGH_CNTWRITE_HIGH_CNTwrite_temp=01000100;STATEwrite_temp=10111110;STATEcase READ_BIT_CNT iswhen 0=dq=0;-4 s 的低電平if (cnt=4) thenREAD_BIT_CNT=1;cnt=0;elsecntdq=

15、Z; -4 s 的高電平if (cnt=4) thenREAD_BIT_CNT=2;cnt=0;elsecntdq=Z;TMP_BIT=dq; -12 s 讀出數(shù)據(jù)if (cnt=4) thenREAD_BIT_CNT=3;cnt=0;elsecnt-dq=Z;-控制器拉高總線-if (cnt=50) then - 讀出數(shù)據(jù)后,等待cnt=0;READ_BIT_CNT=0;STATE=GET_TMP;elsecntREAD_BIT_CNTcase GET_TMP_CNT iswhen 0 =STATE=READ_BIT;GET_TMP_CNTSTATE=READ_BIT;TMP(GET_TMP_CNT-1)=TMP_BIT;-將讀出的每一位數(shù)據(jù)按順序存進(jìn)TMP ( 0 to11)里面GET_TMP_CNTGET_TMP_CNT=0;STATEif (cnt=4000) then-STATE=WAIT4M

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論