eda課程設(shè)計數(shù)字時鐘(5篇)

格式:DOC 上傳日期:2023-01-11 17:20:21
eda課程設(shè)計數(shù)字時鐘(5篇)
時間:2023-01-11 17:20:21     小編:zdfb

在日常的學(xué)習(xí)、工作、生活中,肯定對各類范文都很熟悉吧。范文書寫有哪些要求呢?我們怎樣才能寫好一篇范文呢?接下來小編就給大家介紹一下優(yōu)秀的范文該怎么寫,我們一起來看一看吧。

eda課程設(shè)計數(shù)字時鐘篇一

學(xué) 院: 機電工程學(xué)院

題 目: 數(shù)字時鐘電路設(shè)計 課 程: 《電子系統(tǒng)設(shè)計自動化》課程設(shè)計 專業(yè)班級: 電信10級2 班 學(xué)生姓名: 劉星 秦玉杰 王艷艷 學(xué) 號: 1004101035 1004101036 1004101038

完成日期:2013年 12 月 27 日

摘要:

eda(electronic design automation)電子設(shè)計自動化,就是以大規(guī)??删幊唐骷樵O(shè)計載體,以硬件描述語言為系統(tǒng)邏輯描述的主要表達(dá)方式,通過相關(guān)的軟件,自動完成用軟件方式設(shè)計的電子系統(tǒng)到硬件系統(tǒng),最終形成集成電子系統(tǒng)或?qū)S眉尚酒?。本次實?xí)利用quartusii為設(shè)計軟件、vhdl為硬件描述語言,結(jié)合所學(xué)的數(shù)字電路的知識設(shè)計一個24時多功能數(shù)字鐘,具有正常時、分、秒計時,動態(tài)顯示,清零、快速校時校分、整點報時、花樣顯示等功能。利用硬件描述語言vhdl對設(shè)計系統(tǒng)的各個子模塊進(jìn)行邏輯描述,采用模塊化的設(shè)計思想完成頂層模塊的設(shè)計,通過軟件編譯、邏輯化簡、邏輯分割、邏輯綜合優(yōu)化、邏輯布線、邏輯仿真,最終將設(shè)計的軟件系統(tǒng)下載設(shè)計實驗系統(tǒng),對設(shè)計的系統(tǒng)進(jìn)行硬件測試。

一、課程設(shè)計基本要求和任務(wù)

《eda課程設(shè)計》是繼《模擬電子技術(shù)基礎(chǔ)》、《數(shù)字電子技術(shù)基礎(chǔ)》課程后,電信專業(yè)學(xué)生在電子技術(shù)實驗技能方面綜合性質(zhì)的實驗訓(xùn)練課程,是電子技術(shù)基礎(chǔ)的一個部分。1.1 目的和任務(wù)

(1)通過課程設(shè)計使學(xué)生能熟練掌握一種eda軟件(quartusii)的使用方法,能熟練進(jìn)行設(shè)計輸入、編譯、管腳分配、下載等過程,為以后進(jìn)行工程實際問題的研究打下設(shè)計基礎(chǔ)。

(2)通過課程設(shè)計使學(xué)生能利用eda軟件(quartusii)進(jìn)行至少一 個電子技術(shù)綜合問題的設(shè)計,設(shè)計輸入可采用圖形輸入法或vhdl硬件描述語言輸入法。(3)通過課程設(shè)計使學(xué)生初步具有分析、尋找和排除電子電路中常見 故障的能力。

(4)通過課程設(shè)計使學(xué)生能獨立寫出嚴(yán)謹(jǐn)?shù)摹⒂欣碚摳鶕?jù)的、實事求是的、文理通順的字跡端正的課程設(shè)計報告。1.2 功能要求:

(1)具有時、分、秒計數(shù)顯示功能,以24小時循環(huán)計時。(2)時鐘計數(shù)顯示時有l(wèi)ed燈的花樣顯示。(3)具有調(diào)節(jié)小時、分鐘、秒及清零的功能。(4)具有整點報時功能。

1.3 總體方框圖:

本系統(tǒng)可以由秒計數(shù)器、分鐘計數(shù)器、小時計數(shù)器、整點報時、分的調(diào)整以及小時的調(diào)整和一個頂層文件構(gòu)成。采用自頂向下的設(shè)計方法,子模塊利用vhdl語言設(shè)計,頂層文件用原理圖的設(shè)計方法。顯示:小時采用24進(jìn)制,而分鐘均是采用6進(jìn)制和10進(jìn)制的組合。1.4 設(shè)計原理:

數(shù)字鐘電路設(shè)計要求所設(shè)計電路就有以下功能:時、分、秒計時顯示,清零,時、分調(diào)節(jié),整點報時及花樣顯示。分、秒計時原理相似,可以采用60進(jìn)制bcd碼計數(shù)器進(jìn)計時;小時采用24進(jìn)制bcd碼進(jìn)行計時;在設(shè)計時采用試驗電路箱上的模式7電路,不需要進(jìn)行譯碼電路的設(shè)計;所設(shè)計電路具有驅(qū)動揚聲器和花樣顯示的led燈信號產(chǎn)生。試驗箱模式7的電路如圖一所示:圖一模式七實驗電路圖

1.5 性能指標(biāo)及功能設(shè)計:

(1)時鐘計數(shù):完成時、分、秒的正確計時并且顯示所計的數(shù)字;對秒、分——60進(jìn)制計數(shù),即從0到59循環(huán)計數(shù),時鐘——24進(jìn)制計數(shù),即從0到23循環(huán)計數(shù),并且在數(shù)碼管上顯示數(shù)值。

2.2 模塊劃分自頂向下分解

2.3 模塊描述

時鐘計時模塊完成時、分、秒計數(shù),及清零、調(diào)節(jié)時和分鐘的功能。時、分、秒計數(shù)的原理相同,均為bcd碼輸出的計數(shù)器,其中分和秒均為六十進(jìn)制bcd碼計數(shù)器,小時為二十四進(jìn)制bcd碼計數(shù)器。設(shè)計一個具有異步清零和設(shè)置輸出功能的六十進(jìn)制bcd碼計數(shù)器,再設(shè)計一個具有異步清零和設(shè)置輸出功能的二十四進(jìn)制計數(shù)器,然后將它們通過一定的組合構(gòu)成時鐘計時模塊。各個輸入/輸出端口的作用為:

(1)clk為計時時鐘信號,reset為異步清零信號;

(2)sethour為小時設(shè)置信號,setmin為分鐘設(shè)置信號;(3)daout[5?0]為小時的bcd碼輸出, daout[6...0]為秒和分鐘的bcd碼輸出,enmin和enhour為使能輸出信號。

(4)在時鐘整點的時候產(chǎn)生揚聲器驅(qū)動信號和花樣顯示信號。由時鐘計時模塊中分鐘的進(jìn)行信號進(jìn)行控制。當(dāng)contr_en為高電平時,將輸入信號clk送到輸出端speak用于驅(qū)動揚聲器,同時在clk的控制下,輸出端lamp[2..0]進(jìn)行循環(huán)移位,從而控制led燈進(jìn)行花樣顯示。輸出控制模塊有揚聲器控制器和花樣顯示控制器兩個子模塊組成 2.4 頂層電路圖

頂層文件是由四個模塊組成,分別是時、分、秒計數(shù)器和報警的vhdl語言封裝而成。經(jīng)過鎖定引腳再重新編譯獲得如下頂層原理電路圖:

三、方案實現(xiàn)

3.1 各模塊仿真及描述

(1)秒計數(shù)器模塊仿真圖:將標(biāo)準(zhǔn)秒信號送入”秒計數(shù)器”,秒計數(shù)器采用60進(jìn)制計數(shù)器,每累計60秒發(fā)出一個分脈沖信號,該信號將作為分計數(shù)器的時鐘脈沖,daout代表秒輸出。

(2)分計數(shù)器電路仿真圖:也采用60進(jìn)制計數(shù)器,每累計60分鐘,發(fā)出一個時脈沖信號,該信號將被送到時計數(shù)器,daout端口代表分鐘輸出

(3)小時計數(shù)器電路仿真圖:時計數(shù)器采用12進(jìn)制計時器,可實現(xiàn)對24小時累 計。每累計12小時,發(fā)出一個脈沖信號。

引腳配置完成后再進(jìn)行一次全程編譯,無誤則可以下載到試驗箱上進(jìn)行硬件測試。硬件驗證的方法如下:選擇實驗?zāi)J?;時鐘脈沖clk與clock0(1024hz)信號相連;鍵8和鍵5均為低電平,時鐘正常計時,數(shù)碼管1和2顯示秒,數(shù)碼管4和5顯示分鐘,數(shù)碼管7和8顯示小時;鍵8為高電平時,時鐘清零;鍵5為高電平時,按下鍵7和鍵4進(jìn)行調(diào)時調(diào)分操作;當(dāng)時鐘為整點的時候,三個發(fā)光二極管進(jìn)行循環(huán)移位操作,同時揚聲器發(fā)聲。

五、心得體會

經(jīng)過源程序的編輯、邏輯綜合、邏輯適配、編程下載成功后,在eda實驗開發(fā)系統(tǒng)進(jìn)行硬件驗證時卻發(fā)現(xiàn)實驗結(jié)果不正確,揚聲器無法發(fā)聲。經(jīng)檢查,自己設(shè)計的管腳文件有錯。將管腳鎖定文件修改后,重新進(jìn)行邏輯適配、編程下載成功后,實驗結(jié)果仍然不正確,百思不得其解。無奈之下,決定重頭開始排查每一步的細(xì)節(jié),確定各個模塊的功能完全實現(xiàn)并且頂層模塊功能正確。修改之后,重新進(jìn)行邏輯適配、編程下載驗證,實驗結(jié)果完全正確。

這次eda課程設(shè)計歷時兩個星期,在整整兩個星期的日子里,不僅鞏固了以前所學(xué)過的知識,而且學(xué)到了很多書本上學(xué)不到的知識,同時鍛煉了自己的能力,使自己對以后的路有了更加清楚的認(rèn)識,對未來有了更多的信心。這次課程設(shè)計,進(jìn)一步加深了我對eda的了解,使我對quartusii的基本操作有所了解,使我對應(yīng)用軟件的方法設(shè)計硬件系統(tǒng)有了更加濃厚的興趣。通過這次課程設(shè)計,我懂得了理論與實際相結(jié)合的重要性,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合,從實踐中得出結(jié)論,才能真正提高自己的實際動手能力和獨立思考的能力。在設(shè)計的過程中,我遇到許多問題,畢竟是第一次應(yīng)用vhdl進(jìn)行硬件電路系統(tǒng)的設(shè)計,許多eda的知識還沒有充分的掌握,遇到困難也是在所難免的,同時發(fā)現(xiàn)了自己的不足之處:學(xué)習(xí)知識表面化,沒有深入了解它們的原理??偟膩碚f,這次設(shè)計的數(shù)字時鐘電路還是比較成功的,盡管在設(shè)計中遇到了很多問題,最后在老師的辛勤指導(dǎo)、同學(xué)的幫助和自己不斷思考下,終于迎刃而解,有點小小的成就感,覺得平時所學(xué)的知識有了實用的價值,達(dá)到了理論與實際相結(jié)合的目的。最后,對給過我?guī)椭乃型瑢W(xué)和指導(dǎo)老師再次表示忠心的感謝!

參考文獻(xiàn)

[1] 崔健明.《電子電工eda仿真技術(shù)》 高等教育出版社 2000年 [2] 盧杰,賴毅.《vhdl與數(shù)字電路設(shè)計》 科學(xué)出版社 2001年 [3] 潘松,黃繼業(yè).《eda技術(shù)實用教程》 科學(xué)出版社 2002年 [4] 朱運利.《eda技術(shù)應(yīng)用》 電子工業(yè)出版社 2004年 [5] 張明.《vhdl實用教程》 電子科技大學(xué)出版社 1999年

[6] 彭介華.《電子技術(shù)課程設(shè)計與指導(dǎo)》 高等教育出版 1997年

library ieee;

use ;use ;entity minute is port(clk,clk1,reset,sethour:in std_logic;enhour:out std_logic;daout:out std_logic_vector(6 downto 0));end entity minute;architecture fun of minute is signal count :std_logic_vector(6 downto 0);signal enhour_1, enhour_2: std_logic;--enmin_1為59分時的進(jìn)位信號 begin--enmin_2由clk調(diào)制后的手動調(diào)時脈沖信號串 daout<=count;enhour_2<=(sethour and clk1);--sethour為手動調(diào)時控制信號,高電平有效 enhour<=(enhour_1 or enhour_2);process(clk,reset,sethour)begin if(reset='0')then--若reset為0,則異步清零 count<=“0000000”;elsif(clk'event and clk='1')then--否則,若clk上升沿到 if(count(3 downto 0)=“1001”)then--若個位計時恰好到“1001”即9 if(count <16#60#)then--又若count小于16#60#,即60 if(count=“1011001”)then--又若已到59d enhour_1<='1';--則置進(jìn)位為1 count<=“0000000”;--count復(fù)0 else count<=count+7;--若count未到59d,則加7,即作“加6校正” end if;--使前面的16#60#的個位轉(zhuǎn)變?yōu)?421bcd的容量 else count<=“0000000”;--count復(fù)0(有此句,則對無效狀態(tài)電路可自啟動)end if;--end if(count<16#60#)elsif(count <16#60#)then count<=count+1;--若count<16#60#則count加1 enhour_1<='0' after 100 ns;--沒有發(fā)生進(jìn)位 else count<=“0000000”;--否則,若count不小于16#60# count復(fù)0 end if;--end if(count(3 downto 0)=“1001”)end if;--end if(reset='0')end process;end fun;

3、時計數(shù)器模塊的vhdl語言:

library ieee;use ;use ;

if(clk'event and clk='1')then if(dain=“0000000”)then speak<=count1(1);if(count1>=“10”)then count1<=“00”;--count1為三進(jìn)制加法計數(shù)器 else count1<=count1+1;end if;end if;end if;end process speaker;lamper:process(clk)begin if(rising_edge(clk))then if(count<=“10”)then if(count=“00”)then lamp<=“001”;--elsif(count=“01”)then lamp<=“010”;elsif(count=“10”)then lamp<=“100”;end if;count<=count+1;else count<=“00”;end if;end if;end process lamper;end fun;

循環(huán)點亮三只燈

eda課程設(shè)計數(shù)字時鐘篇二

數(shù)字鐘

一、設(shè)計要求

設(shè)計一個數(shù)字鐘,具體要求如下:

1、具有時、分、秒計數(shù)顯示功能,以24小時循環(huán)計時。

2、具有清零、校時、校分功能。

3、具有整點蜂鳴器報時以及l(fā)ed花樣顯示功能。

二、設(shè)計方案

根據(jù)設(shè)計要求,數(shù)字鐘的結(jié)構(gòu)如圖8-3所示,包括:時hour、分minute、秒second計數(shù)模塊,顯示控制模塊sel_clock,七段譯碼模塊deled,報時模塊alert。

三、vhdl程序

library ieee;use ;use ;use ;

----uncomment the following library declaration if instantiating----any xilinx primitives in this code.--library unisim;

--use ;

entityddz is port(rst,clk: in std_logic;hour_h: out std_logic_vector(6 downto 0);hour_l: out std_logic_vector(6 downto 0);min_h: out std_logic_vector(6 downto 0);

min_l: out std_logic_vector(6 downto 0);

sec_h: out std_logic_vector(6 downto 0);

sec_l: out std_logic_vector(6 downto 0));endddz;

architecture behavioral of ddz is signalcnt: std_logic_vector(15 downto 0);signalsec_h_in: std_logic_vector(3 downto 0);signalsec_l_in: std_logic_vector(3 downto 0);signalmin_h_in: std_logic_vector(3 downto 0);signalmin_l_in: std_logic_vector(3 downto 0);signalhour_h_in: std_logic_vector(3 downto 0);signalhour_l_in: std_logic_vector(3 downto 0);

signalclk_s,clk_m,clk_h: std_logic;begin process(rst,clk)begin if rst='0' then

sec_h_in<=(others=>'0');

sec_l_in<=(others=>'0');

clk_m<='1';elsifclk'event and clk='1' then ifsec_l_in=9 then

sec_l_in<=“0000”;

ifsec_h_in=5 then

sec_h_in<=“0000”;

clk_m<='0';

else

sec_h_in<=sec_h_in+1;

clk_m<='1';

end if;else sec_l_in<=sec_l_in+1;

clk_m<='1';

end if;end if;end process;

process(rst,clk_m)begin if rst='0' then

--min_h_in<=(others=>'0');

min_l_in<=(others=>'0');--clk_h<='1';elsifclk_m'event and clk_m='1' then ifmin_l_in=9 then

min_l_in<=“0000”;ifmin_h_in=5 then

min_h_in<=“0000”;else min_h_in<=min_h_in+1;

clk_m<='1';

end if;else min_l_in<=min_l_in+1;

end if;end if;end process;

process(rst,clk_n)begin if rst='0' then

--hour_h_in<=(others=>'0');

hour_l_in<=(others=>'0');--clk_h<='1';elsifclk_m'event and clk_n='1' then ifhour_l_in=3 then

hour_l_in<=“0000”;ifmin_h_in=2 then

hour_h_in<=“0000”;else hour_h_in<=hour_h_in+1;

clk_n<='1';

end if;else hour_l_in<=hour_l_in+1;

end if;end if;end process;

process(sec_l_in)begin casesec_l_in is

when “0000” =>sec_l<=“0000001”;when “0001” =>sec_l<=“1001111”;when “0010” =>sec_l<=“0010010”;when “0011” =>sec_l<=“0000110”;when “0100” =>sec_l<=“1001100”;when “0101” =>sec_l<=“0100100”;when “0110” =>sec_l<=“0100000”;when “0111” =>sec_l<=“0001111”;when “1000” =>sec_l<=“0000000”;when “1001” =>sec_l<=“0000100”;when others =>sec_l<=“1111111”;end case;end process;

process(sec_h_in)begin casesec_h_in is

when “0000” =>sec_h<=“0000001”;when “0001” =>sec_h<=“1001111”;when “0010” =>sec_h<=“0010010”;when “0011” =>sec_h<=“0000110”;when “0100” =>sec_h<=“1001100”;when “0101” =>sec_h<=“0100100”;when “0110” =>sec_h<=“0100000”;when “0111” =>sec_h<=“0001111”;when “1000” =>sec_h<=“0000000”;when “1001” =>sec_h<=“0000100”;when others =>sec_h<=“1111111”;end case;end process;

process(min_l_in)begin casemin_l_in is

when “0000” =>min_l<=“0000001”;when “0001” =>min_l<=“1001111”;when “0010” =>min_l<=“0010010”;

when “0011” =>min_l<=“0000110”;when “0100” =>min_l<=“1001100”;when “0101” =>min_l<=“0100100”;when “0110” =>min_l<=“0100000”;when “0111” =>min_l<=“0001111”;when “1000” =>min_l<=“0000000”;when “1001” =>min_l<=“0000100”;when others =>min_l<=“1111111”;end case;end process;

process(min_h_in)begin casemin_h_in is

when “0000” =>min_h<=“0000001”;when “0001” =>min _h<=“1001111”;when “0010” => min _h<=“0010010”;when “0011” =>min _h<=“0000110”;when “0100” =>min _h<=“1001100”;when “0101” => min _h<=“0100100”;when “0110” =>min _h<=“0100000”;when “0111” =>min _h<=“0001111”;when “1000” =>min _h<=“0000000”;when “1001” =>min _h<=“0000100”;when others =>min _h<=“1111111”;

end case;end process;

process(hour_l_in)begin casehour_l_in is

when “0000” =>hour_l<=“0000001”;when “0001” =>hour_l<=“1001111”;when “0010” =>hour_l<=“0010010”;when “0011” =>hour_l<=“0000110”;when “0100” =>hour_l<=“1001100”;when “0101” =>hour_l<=“0100100”;when “0110” =>hour_l<=“0100000”;when “0111” =>hour_l<=“0001111”;when “1000” =>hour_l<=“0000000”;when “1001” =>hour_l<=“0000100”;when others =>hour_l<=“1111111”;end case;end process;

process(hour_h_in)begin casehour_h_in is

when “0000” =>hour_h<=“0000001”;when “0001” =>hour_h<=“1001111”;when “0010” =>hour_h<=“0010010”;when “0011” =>hour_h<=“0000110”;when “0100” => hour _h<=“1001100”;when “0101” => hour _h<=“0100100”;when “0110” => hour _h<=“0100000”;when “0111” => hour _h<=“0001111”;when “1000” => hour _h<=“0000000”;when “1001” =>hour_h<=“0000100”;when others => hour _h<=“1111111”;end case;end process;end behavioral;

四、vhdl仿真結(jié)果

五、課程設(shè)計心得

通過這次課程設(shè)計,有效得鞏固了課本所學(xué)的知識,而且通過上機仿真不斷發(fā)現(xiàn)問題并及時改正,加深了我們對該課程設(shè)計的印象。這次課程設(shè)計,進(jìn)一步加深了我對eda的了解,使我對isp有了更深的了解,使我對應(yīng)用軟件的方法設(shè)計硬件系統(tǒng)有了更加濃厚的興趣。除此之外,我懂得了理論與實際相結(jié)合的重要性,只有理論知識是遠(yuǎn)遠(yuǎn)不夠的,只有把所學(xué)的理論知識與實踐相結(jié)合,從實踐中得出結(jié)論,才能真正提高自己的實際動手能力和獨立思考的能力。

總之,這次課程設(shè)計讓我學(xué)會了很多,對今后的生活工作用處也頗深。

eda課程設(shè)計數(shù)字時鐘篇三

考試序號:28

自動打鈴系統(tǒng)設(shè)計說明書

學(xué) 生 姓 名:周文江

學(xué)

號:14112502521

專 業(yè) 班 級:1102

報告提交日期:2013.11.26

湖 南 理 工 學(xué) 院 物 電 學(xué) 院

目錄

一、題目及要求簡介……………3 1.設(shè)計題目…………………3 2.總體要求簡介……………3

二、設(shè)計方案說明……………3

三、系統(tǒng)采用器件以及模塊說明………3 1.系統(tǒng)框圖…………4 2.選擇的fpga芯片及配置………4 3.系統(tǒng)端口和模塊說明…………5

四、各部分仿真結(jié)果………5

五、調(diào)試及總結(jié)………6

六、參考文獻(xiàn)……7

七、附錄………7

一、題目及要求簡介

1、設(shè)計題目

設(shè)計一個多功能自動打鈴系統(tǒng)

2、總體要求簡介

① 基本計時和顯示功能(24小時制顯示),包括:

1.24小時制顯示 2.動態(tài)掃描顯示; 3.顯示格式:88-88-88 ② 能設(shè)置當(dāng)前時間(含時、分)③ 能實現(xiàn)基本打鈴功能,規(guī)定:

06:00起床鈴,打鈴5s

二、設(shè)計方案說明

本次設(shè)計主要采用verilog hdl硬件描述性語言、分模塊法設(shè)計的自動打鈴系統(tǒng)。由于這次用的開發(fā)板提供的是50m晶振。首先要對時鐘進(jìn)行分頻,當(dāng)計時到2fa_f07f時完成1s分頻,通過計時到60s產(chǎn)生分鐘進(jìn)位信號,再通過60分鐘產(chǎn)生時鐘進(jìn)位信號。最后通過6個寄存器對時分秒進(jìn)行鎖存最終輸出到8個數(shù)碼管上完成顯示。當(dāng)顯示時鐘和默認(rèn)鬧鐘時鐘相等時,驅(qū)動打鈴模塊。通過key_mode,key_turn,key_change查看鬧鐘,時鐘顯示,調(diào)整時鐘。

三、系統(tǒng)采用器件以及模塊說明

1.系統(tǒng)框圖如下:

:下如圖框統(tǒng)系

2.選擇的fpga芯片及配置:本次系統(tǒng)設(shè)計采用的fpga芯片是alter公司生產(chǎn)的cyclone ii ep2c8q208c8。該芯片是208個管腳,138個io,并且具有兩個內(nèi)部pll,而且內(nèi)嵌乘法器,8k的邏輯門,資源相當(dāng)豐富。完成這次自動打鈴系統(tǒng)的設(shè)計總共消耗250個le單元,22個io口,131個寄存器。經(jīng)過綜合后,本系統(tǒng)最高能實現(xiàn)145m的運行速度。通過quartus ii 軟件觀察到內(nèi)部的rtl圖如下

3.系統(tǒng)端口和模塊說明

(1)分頻部分

分頻器的作用是對50mhz的系統(tǒng)時鐘信號進(jìn)行分頻,得到頻率為1hz的信號,即為1s的計時信號。

(2)按鍵部分

按鍵key_mode--0為顯示計時,1為鬧鐘顯示,2為調(diào)整時間。按鍵key_turn—0為調(diào)整小時,1為調(diào)整分鐘。按鍵key_change—每按一次加1(3)計時部分

通過sec_l,sec_h,min_l,min_h,hour_l,hour_h 6個寄存器對時分秒進(jìn)行鎖存然后送入數(shù)碼管顯示

(4)鬧鐘模塊

當(dāng)設(shè)定的鬧鐘時間和數(shù)碼管上顯示的時間相等時驅(qū)動鬧鐘,完成打鈴,持續(xù)時間5s。

(5)數(shù)碼管顯示模塊

顯示模塊是由8個位選8個段選構(gòu)成的顯示模塊,利用人眼的余暉效果完成動態(tài)掃描,顯示時間。

四、各部分仿真結(jié)果

測試文件如下:

module clock_tb;reg sysclk,rst_b;reg key_mode,key_turn,key_change;wire buzzer;

wire [7:0] led_sel,led_data;clock i_clock(.sysclk(sysclk),.rst_b(rst_b),.key_mode(key_mode),.key_change(key_change),.key_turn(key_turn),.buzzer(buzzer),.led_sel(led_sel),.led_data(led_data));initial begin sysclk = 1'b1;rst_b = 1'b0;//復(fù)位信號

#30 rst_b = 1'b1;end always #10 sysclk = ~sysclk;//輸入的系統(tǒng)時鐘,20ns的周期 endmodule

五、調(diào)試及總結(jié)

本次課程設(shè)計總共花費了四天左右的時間,設(shè)計了自動打鈴系統(tǒng)。通過這次的設(shè)計更加熟悉了對eda技術(shù)的了解和認(rèn)識,在中也發(fā)現(xiàn)許多不足的地方。使用了自頂而下的設(shè)計方法,使得設(shè)計更加的簡單和明了。在調(diào)試過程中,有些代碼的設(shè)計不規(guī)范性,導(dǎo)致時序相當(dāng)緩慢,甚至編譯綜合都會報錯。在不斷的修改下,發(fā)現(xiàn)時序電路和組合邏輯最好分開寫,這樣便于查錯,和修改代碼。畢竟verilog hdl語言不同于c語言,不能以軟件的思想來設(shè)計,而是要利用電路的思想來編程,這樣可以更好的節(jié)省資源,使得時序也比較的簡單明了。在以后的學(xué)習(xí)及程序設(shè)計當(dāng)中,我們一定要倍加小心,在程序出現(xiàn)不正常運行的情況下要耐心調(diào)試,盡量做到精益求精。

最后通過這次eda方面的課程設(shè)計,提高了我們對eda領(lǐng)域及通信電路設(shè)計領(lǐng)域的認(rèn)識,有利于培養(yǎng)我們在通信電路eda方面的設(shè)計能力。有利于鍛煉我們獨立分析問題和解決問題的能力。

六、文獻(xiàn)參考

[1].王金明、左自強 編,《eda技術(shù)與verilog設(shè)計》科學(xué)出版社

2008.8 [2].杜慧敏、李宥謀、趙全良 編,《基于verilog的fpga設(shè)計基礎(chǔ)》 西安電子科技大學(xué)出版社 2006.2 [3].韓彬 編,《從零開始走進(jìn)fpga世界》杭州無線電愛好者協(xié)會出版社 2011.8.20

七、附錄(實物圖及源碼)

module clock(//input

sysclk,rst_b,key_mode,key_change,key_turn,//output

buzzer,led_sel,led_data);

input sysclk,rst_b;//sysclk--global system clock,rst_b--global reset signal input key_mode;//mode choose.0--timing function.1--alarm clock function.2--adjust function input key_turn;//choose adjust minute or hour input key_change;//count add 1 output buzzer;//device buzzer output [7:0] led_sel;//led tube bit choose

output [7:0] led_data;//led_tube 8 bit data choose

parameter init_hour = 8'h12;parameter init_min = 8'h59;parameter init_sec = 8'h50;//initial time :12:59:50 parameter init_alarm_hour = 8'h06;parameter init_alarm_min = 8'h30;//initial alarm time : 06:30:0 parameter count_1s = 28'h2fa_f07f;//count time 1s;

reg [7:0] sec;reg [7:0] min;reg [7:0] hour;reg [3:0] min_l;//minute low 4 bit reg [3:0] min_h;//minute high 4 bit reg [3:0] hour_l;//hour low 4 bit reg [3:0] hour_h;//hour high 4 bit reg [23:0] key_time;//press key away shake reg key_mode_n;//press key_mode next state reg key_change_n;//press key_change next state reg key_turn_n;//press key_turn next state wire key_mode_press;//sure button press key_mode wire key_turn_press;//sure button press key_turn wire key_change_press;//sure button press key_change

always @(posedge sysclk)key_mode_n <= key_mode;assign key_mode_press =(!key_mode)&&(key_mode_n);always @(posedge sysclk)key_turn_n <= key_turn;assign key_turn_press =(!key_turn)&&(key_turn_n);always @(posedge sysclk)key_change_n <= key_change;assign key_change_press =(!key_change)&&(key_change_n);

always @(posedge sysclk or negedge rst_b)begin if(!rst_b)key_time <= 24'h0;else if(key_time!= 24'h0)

key_time <= key_time + 24'h1;else if((key_time == 24'h0)&&(key_mode_press || key_change_press || key_turn_press))key_time <= key_time + 24'h1;

end

reg [1:0] mode_num;//key mode..0--timing function.1--alarm clock function.2--adjust function always @(posedge sysclk or negedge rst_b)begin if(!rst_b)mode_num <= 2'b00;else if(mode_num == 2'h3)mode_num <= 2'h0;else if(key_mode_press &&(key_time == 24'h0))

mode_num <= mode_num + 2'h1;end

always @(*)begin if(mode_num == 2'h1)begin

min = init_alarm_min;hour = init_alarm_hour;end else begin

min = {min_h,min_l};hour = {hour_h,hour_l};end end

reg fm;//choose turn hour or minute always @(posedge sysclk or negedge rst_b)begin if(!rst_b)fm <= 1'b0;else if(key_turn_press &&(mode_num == 2'h2)&&(key_time == 24'h0))

fm <= ~fm;end

reg [27:0] time_cnt;///count time reg [27:0] time_cnt_n;//count time next state always @(posedge sysclk or negedge rst_b)begin if(!rst_b)time_cnt <= 28'h0;else time_cnt <= time_cnt_n;end

always @(*)begin if(time_cnt == count_1s)time_cnt_n <= 28'h0;else if(mode_num!= 2'h0)time_cnt_n <= time_cnt;else time_cnt_n <= time_cnt + 28'h1;end

reg [3:0] sec_l;//second low 4 bit reg [3:0] sec_h;//second high 4 bit wire sec_cb;//second carry bit signal assign sec_cb =(sec_l == 4'h9)&&(sec_h == 4'h5);always @(posedge sysclk or negedge rst_b)begin if(!rst_b)begin

sec_l <= init_sec[3:0];sec_h <= init_sec[7:4];end else if((sec_l == 4'h9)&&(sec_h!= 4'h5)&&(time_cnt == count_1s))begin

sec_l <= 4'h0;sec_h <= sec_h + 4'h1;end else if(sec_cb &&(time_cnt == count_1s))begin

sec_l <= 4'h0;sec_h <= 4'h0;end else if(time_cnt == count_1s)

sec_l <= sec_l + 4'h1;end

wire min_cb;//minute carry bit signal assign min_cb =(min_l == 4'h9)&&(min_h == 4'h5);always @(posedge sysclk or negedge rst_b)begin if(!rst_b)begin

min_l <= init_min[3:0];min_h <= init_min[7:4];end else if((sec_cb)&&(min_l!=4'h9)&&(time_cnt == count_1s))

min_l <= min_l + 4'h1;else if((sec_cb)&&(min_l == 4'h9)&&(min_h!= 4'h5)&&(time_cnt == count_1s))begin

min_l <= 4'h0;min_h <= min_h + 4'h1;end else if((sec_cb)&&(min_cb)&&(time_cnt == count_1s))begin

min_l <= 4'h0;min_h <= 4'h0;end else if((fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(min_l!= 4'h9))

min_l = min_l + 4'h1;else if((fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time ==

24'h0)&&(min_l == 4'h9)&&(min_h!=4'h5))begin

min_l = 4'h0;min_h = min_h + 4'h1;end else if((fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(min_l == 4'h9)&&(min_h ==4'h5))begin

min_l = 4'h0;min_h = 4'h0;end end

always @(posedge sysclk or negedge rst_b)begin if(!rst_b)begin

hour_l <= init_hour[3:0];hour_h <= init_hour[7:4];end else if((sec_cb)&&(min_cb)&&(hour_l!= 4'h9)&&(hour_h!= 4'h2)&&(time_cnt == count_1s))

hour_l <= hour_l + 4'h1;else if((sec_cb)&&(min_cb)&&(hour_l!= 4'h3)&&(hour_h == 4'h2)&&(time_cnt == count_1s))

hour_l <= hour_l + 4'h1;else if((sec_cb)&&(min_cb)&&(hour_l == 4'h9)&&(hour_h!= 4'h2)&&(time_cnt == count_1s))begin

hour_l <= 4'h0;hour_h <= hour_h + 4'h1;end else if((sec_cb)&&(min_cb)&&(hour_l == 4'h3)&&(hour_h == 4'h2)&&(time_cnt == count_1s))begin

hour_l <= 4'h0;hour_h <= 4'h0;end else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(hour_l!= 4'h9)&&(hour_h!=4'h2))

hour_l <= hour_l + 4'h1;else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(hour_l!= 4'h3)&&(hour_h ==4'h2))

hour_l <= hour_l + 4'h1;else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time == 24'h0)&&(hour_l == 4'h9)&&(hour_h!=4'h2))begin

hour_l <= 4'h0;hour_h <= hour_h + 4'h1;end else if((!fm)&&(mode_num == 2'h2)&&(key_change_press)&&(key_time ==

24'h0)&&(hour_l == 4'h3)&&(hour_h ==4'h2))begin

hour_l <= 4'h0;hour_h <= 4'h0;end end

wire buzzer_en;assign buzzer_en =(init_alarm_min == {min_h,min_l})&&(init_alarm_hour == {hour_h,hour_l});

led_tube i_led_tube(.sysclk(sysclk),.rst_b(rst_b),.scan_time(24'h1f090),.data0({1'h1,sec_l}),.data1({1'h1,sec_h}),.data2({1'h1,4'ha}),.data3({1'h1,min[3:0]}),.data4({1'h1,min[7:4]}),.data5({1'h1,4'ha}),.data6({1'h1,hour[3:0]}),.data7({1'h1,hour[7:4]}),.led_data(led_data),.led_sel(led_sel));buzzer i_buzzer(.sysclk(sysclk),.rst_b(rst_b),.buzzer_en(buzzer_en),.buzzer(buzzer));endmodule

eda課程設(shè)計數(shù)字時鐘篇四

課 程 設(shè) 計 報 告

設(shè)計題目:用vhdl語言實現(xiàn)數(shù)字鐘的設(shè)計

班 級:電子1002班 學(xué) 號:20102625 姓 名:于曉 指導(dǎo)教師:李世平、李寧 設(shè)計時間:2012年12月

摘要

數(shù)字鐘是一種用數(shù)字電路技術(shù)實現(xiàn)時、分、秒計時的鐘表。本設(shè)計主要是實現(xiàn)數(shù)字鐘的功能,程序用vhdl語言編寫,整體采用top-to-down設(shè)計思路,具有基本的顯示年月日時分秒和星期的功能,此外還有整點報時功能。該數(shù)字鐘的實現(xiàn)程序分為頂層模塊、年月模塊、日模塊、時分秒定時模塊、數(shù)碼管顯示模塊、分頻模塊、星期模塊,此外還有一個庫。該程序主要是用了元件例化的方法,此外還有進(jìn)程等重要語句。

沒有脈沖時,顯示時分秒,set按鈕產(chǎn)生第一個脈沖時,顯示年月日,第2個脈沖到來時可預(yù)置年份,第3個脈沖到來時可預(yù)置月份,依次第4、5、6、7、8個脈沖到來時分別可預(yù)置日期、時、分、秒、星期,第 9個脈沖到來時設(shè)置星期后預(yù)置結(jié)束,正常工作,顯示的是時分秒和星期。調(diào)整設(shè)置通過up來控制,up為高電平,upclk有脈沖到達(dá)時,預(yù)置位加1,否則減1。當(dāng)整點到達(dá)時,報時器會鳴響,然后手動按鍵停止報時。

關(guān)鍵詞:數(shù)字鐘,vhdl,元件例化,數(shù)碼管

1、課程設(shè)計目的

掌握利用可編程邏輯器件和eda設(shè)計工具進(jìn)行電子系統(tǒng)設(shè)計的方法

2、課程設(shè)計內(nèi)容及要求

設(shè)計實現(xiàn)一個具有帶預(yù)置數(shù)的數(shù)字鐘,具有顯示年月日時分秒的功能。用6個數(shù)碼管顯示時分秒,set按鈕產(chǎn)生第一個脈沖時,顯示切換年月日,第2個脈沖到來時可預(yù)置年份,第3個脈沖到來時可預(yù)置月份,依次第4、5、6、7個脈沖到來時分別可預(yù)置日期、時、分、秒,第 8個脈沖到來后預(yù)置結(jié)束,正常工作,顯示的是時分秒。up為高電平時,upclk有脈沖到達(dá)時,預(yù)置位加1.否則減1,還可以在此基礎(chǔ)上增加其它功能。

3、vhdl程序設(shè)計

3.1整體設(shè)計思路

本設(shè)計采用top-down 模式設(shè)計,分模塊進(jìn)行,各功能都使用元件例化方式設(shè)計,主要有l(wèi)ed顯示模塊、時分秒定時模塊、日期模塊、年月模塊、分頻模塊、星期模塊,此外還創(chuàng)建了一個程序包,用來實現(xiàn)年月日、時分秒的加減調(diào)整。主要運用了過程語句、元件例化語句、信號賦值語句、和順序語句

圖3-1-1 整體結(jié)構(gòu)圖

圖3-1-2 頂層模塊引腳圖

3.2各模塊設(shè)計思路

3.2.1 普通計數(shù)器(時、分、秒、月、年計數(shù)器)設(shè)計

時鐘模塊通過調(diào)用程序包的時分秒加減過程語句實現(xiàn)兩個六十進(jìn)制,一個二十四進(jìn)制,秒的進(jìn)位信號作為分的計數(shù)時鐘信號,分的進(jìn)位信號作為時的時鐘信號。時的進(jìn)位信號通過管腳映射到日期模塊的計數(shù)時鐘信號。

定時功能在時分秒模塊中,是由分計數(shù)器在到達(dá)59時產(chǎn)生一個脈沖,讓speaker產(chǎn)生高電位鳴響。

年月模塊主要實現(xiàn)月份的十二進(jìn)制計數(shù)器,和100進(jìn)制的年份計數(shù)器。月份的計數(shù)信號由日期模塊的進(jìn)位信號傳遞過來,年份的時鐘信號由月份的進(jìn)位信號產(chǎn)生。

圖3-2-1 時分秒引腳圖 圖3-2-2 年月引腳圖 3.2.2 可變進(jìn)制計數(shù)器(天計數(shù)器)模塊設(shè)計

不同月中的天的數(shù)量是不同的,例如“大月”就有31“天”,“小月”有30“天”,平年“二月”有28“天”,而閏年“二月”有29“天”。所以天計數(shù)器應(yīng)該具備進(jìn)制可變的性能。日期模塊主要分為三個部分,預(yù)置日期加,預(yù)置日期減和產(chǎn)生進(jìn)位信號,使月份增加。平閏年的判斷是通過年月模塊傳輸過來年份信號(兩個4位的bcd碼),如果高位的信號為“xxx0”且低位的信號為“xx00”(如20,84等),或高位為“xxx1”且低位為“xx10”(如32等)則判斷為閏年。這種方法的包含了一百年中的所有閏年的情況。然后判斷大月小月可以判斷月份來確定30進(jìn)制還是31進(jìn)制。進(jìn)位信號也是分為大月、小月、平年閏年來確定是否產(chǎn)生。

圖3-2-3 日模塊引腳圖

3.2.3 led顯示模塊

主要通過接受setpin的控制信號來選擇顯示的內(nèi)容,把不同的信號賦給輸出的端口,從而實現(xiàn)時分秒,年月日的切換。3.2.4 星期模塊

通過七進(jìn)制計數(shù)器實現(xiàn),同時帶有預(yù)置的功能,不能同年月調(diào)整聯(lián)動,但是能單獨調(diào)整。

圖3-2-4 星期模塊引腳圖

4、仿真與分析

4.1 日模塊

4.1.1 年份為2000年,月份為2月,有29天,初值設(shè)為2000年2月28日,仿真中日為:28、29、1、2、?

4.1.2 年份為1999年,月份為2月,有28天,初值設(shè)為1999年2月28日,仿真中日為:28、1、2、?

4.1.3 年份為2000年,月份為3月,有31天,初值設(shè)為2000年3月30日,仿真中日為:30、31、1、2、?

4.1.4 年份為2000年,月份為4月,有30天,初值設(shè)為2000年4月30日,仿真中日為:30、1、2、?

4.2 年月模塊

初值設(shè)為1999年12月,lock為1時,顯示年月,lock為3時,預(yù)置月,lock為2時,預(yù)置年

4.3 時分秒定時模塊

lock為0時,顯示時分秒,lock為5時,預(yù)置時,lock為6時,預(yù)置分,lock為7時,預(yù)置秒。當(dāng)分到達(dá)59時,整點報時器響,speaker高電位,隨著手動清零,恢復(fù)原位。

4.4 星期模塊

初值設(shè)為星期1,仿真中顯示為:1、2、3、4、5、6、7、1、?

4.5 分頻模塊

4.6 頂層設(shè)計模塊

5、課程設(shè)計總結(jié)

本次課程設(shè)計歷時兩天半,經(jīng)過自己不斷的努力完成了數(shù)字鐘的設(shè)計,程序代碼的編寫調(diào)試及仿真。以前只是看書或者編一些很小的程序用來仿真,覺得沒怎么難,但當(dāng)進(jìn)行此次課程設(shè)計真正處理一個較大程序時,問題便都顯現(xiàn)出來。雖然在這個過程中遇到了很多的問題,但是最終都得到了很好的解決。

我此次設(shè)計的程序是在課本原有數(shù)字鐘程序的基礎(chǔ)上進(jìn)行添加更改得來的,最初在運行原有程序時很順利,但是隨著加的東西越來越多,程序中出現(xiàn)的問題也就越來越多。很多同學(xué)都覺得在已有程序上再添加?xùn)|西看似簡單,實則很容易混亂,理不清頭緒,而且這個原有程序是用進(jìn)程所寫,比較麻煩。雖然這樣容易出現(xiàn)問題,不過我覺得這是一個鍛煉的好機會。、在處理分頻模塊時,最開始按照老師的要求設(shè)置了頻率,但是當(dāng)運行時,發(fā)現(xiàn)根本出不來,后來與同學(xué)討論后,發(fā)現(xiàn)頻率過大,后來改為八分頻,使得分頻

模塊能夠使用。在一開始加星期模塊時,沒怎么考慮,可是當(dāng)加進(jìn)去后才發(fā)現(xiàn),星期模塊不能與其他模塊很好的相連,不能很好的做到與“日模塊”相合,后來雖有改動,但最終沒能改成功。在加定時器功能時,一開始單獨為定時器列了一個模塊,所寫的程序也很復(fù)雜,錯誤百出,最后程序改好后,仿真卻出不來。后來經(jīng)過同學(xué)的提點,就把程序改簡單了,單純的來個脈沖就出現(xiàn)高電平,但后來仿真發(fā)現(xiàn)高電平一直在高位,沒法給脈沖,最后沒辦法便手動脈沖。與頂層模塊連接后,又發(fā)現(xiàn)分滿59的脈沖沒給,因為我的時分秒全都放在了一起,只能將定時模塊挪到時分秒模塊中,這樣反而使得整個工程簡單了一些。

在各個模塊都能仿真成功后,頂層模塊的程序與仿真卻出現(xiàn)了很多問題。首先是頂層模塊程序有很多警告,例如“second_waver”沒有用到之類的,后來在改動的過程中,便把內(nèi)變量換為了外變量,但是有些原來的警告沒有了,但是新的警告又出現(xiàn)了,原本能夠連好的u3與u4 模塊均不能正常連接,后來與同學(xué)自習(xí)查找,才終于將錯誤找出,由于粗心大意誤動了一些元件例化時的變量,使得時間拜拜浪費。最后在仿真的時候,仿真結(jié)果出不來,經(jīng)過與同學(xué)商量在每個程序中都給年月日等變量均付了初值,才讓仿真出來。

此次課程設(shè)計雖然只有短短的兩天半的時間,但是經(jīng)過前期的查找資料,后來的實驗室實際操作,再到現(xiàn)在的報告總結(jié),我收獲了很多。其實完成一個設(shè)計,編程只是很小的一部分,最主要的在于查找資料以及調(diào)試程序,此次設(shè)計我在查找資料方面做的不是很充分,以至于設(shè)計的面很小,而且在遇到問題后不能很快的找出,以后一定要做好準(zhǔn)備工作。此次課程設(shè)計中遇到的問題看似不大,但都是很好的問題,對我以后的設(shè)計有很大的幫助,一定會牢牢記住。

最后,此次課程設(shè)計的完成很大程度上取決于老師和同學(xué)對我的指導(dǎo)與幫助,這更能說明,一個較大設(shè)計的完成及實現(xiàn),不是僅限于自身,我們要學(xué)會與別人交流溝通,才能做到更好。

6、參考文獻(xiàn)

[1]李景華,杜玉遠(yuǎn).可編程邏輯器件與eda技術(shù).沈陽:東北大學(xué)出版社,2000 [2] 姜如東,vhdl語言程序設(shè)計及應(yīng)用,北京郵電大學(xué)出版社

[3] 康華光.電子技術(shù)基礎(chǔ)(數(shù)字部分)[m].北 京:高等教育出版社,2001.

[4] [5]

eda課程設(shè)計數(shù)字時鐘篇五

《eda課程設(shè)計》

課程設(shè)計題目:

基于單片機的溫濕度采集系統(tǒng)

名:

xxx

學(xué)

號:

xxxx

級:

xxxx

間:

2014.4.21~ 2013.5.5

點:

xxxxx

指 導(dǎo)

師:

xxxxx

目錄

一、電路原理圖..................................................................................2

二、電路pcb圖(或?qū)嵨飯D).........................................................2

三、電路效果圖..................................................................................3

四、設(shè)計總結(jié)......................................................................................3 附錄(單片機源代碼)......................................................................4

一、電路原理圖

二、電路pcb圖(或?qū)嵨飯D)

三、電路效果圖

四、設(shè)計總結(jié)

eda的實驗還是挺有趣的,比較講究動手能力,當(dāng)然也不能忽略團體合作??偟膩碚f本次實驗還是成功了,雖然每個環(huán)節(jié)都遇到了困難。在生成原理圖的過程中,就曾把導(dǎo)線畫成了placeline而不是placewire,還有芯片的引腳應(yīng)該用net符號而不是用文本符號,所以這些錯誤都導(dǎo)致我花在原理圖上的時間多了點。而在生成pcb電路圖的過程中遇到的困難則是自動布線之后,還有電源的幾個腳需要手動布線,所以各個元件之間的位置要布置好,以免發(fā)生短路。腐蝕的時候,由于腐蝕的時間太長了,有些碳都化開了,導(dǎo)致里面的銅被腐蝕掉了,所以又為我的工作增加了困難。在焊接的時候,要注意元件的正負(fù)極,還要檢測錫是否都與那些銅連接上了。最終把led和 dht11的程序燒進(jìn)去就行了。

本次實驗我還是能多多少少學(xué)到點什么的,總的來說還是希望能有多一點這樣的實習(xí)。

附錄(單片機源代碼)

//51單片機控制溫濕度傳感器dht11

lcd1602上顯示當(dāng)前機最小系統(tǒng)。//lcd 讀進(jìn)去 寫出來 #include

#include

typedef unsigned char byte;typedef unsigned int word;#define uint unsigned int

//定義無符號整型 #define uchar unsigned char typedef bit bool;

//此聲明一個布爾型變量即真或假// uchar data_byte,num,i;uchar rh,rl,th,tl,flag;uchar shuzi[4];unsigned char code num1[11]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x7f};

sbit dht=p2^4;

//dht11data端接單片機的p2^4口//

//***************

數(shù)************************************* void delay(uchar ms)//延時模塊//延時1毫秒

{

}

void delay1()

//一個for循環(huán)大概需要8個多機器周期

//一個機器周期為1us晶振為12mhz也就是說本函數(shù)延時8us{

} uchar i;

while(ms--)

for(i=0;i<110;i++);

uchar i;

for(i=0;i<1;i++);void display(void){ // if(flag==0)// {

p2=0x07;

p0=num1[shuzi[2]];delay(1);// }

// if(flag==1)// {

p2=0x0b;

p0=num1[shuzi[3]];delay(1);// } // if(flag==2)// {

p2=0x0d;

p0=num1[shuzi[0]];delay(1);// } // if(flag==3)// {

p2=0x0e;p0=num1[shuzi[1]];delay(1);// } }

//**************************dht11

塊*************************************// void start()//開始信號

{

dht=1;

delay1();

//主機發(fā)出8us高電平,開始信號開始發(fā)出 dht=0;

delay(25);

// 主機把總線拉低必須大于18ms

dht11能檢測到起始信號

dht=1;

//delay1();

//以下三個延時函數(shù)差不多為24usdelay1();delay1();

20-40us

}

uchar receive_byte()

//接收一個字節(jié) 8位// {

uchar i,temp;

for(i=0;i<8;i++)//接收8bit的數(shù)據(jù)

{

while(!dht);

//等待40-50us的低電平開始信號結(jié)束

delay1();

//開始信號結(jié)束之后延時26us-28us

delay1();delay1();

temp=0;

//時間為26us-28usif(dht==1)

temp=1;

//如果26us-28us

'0'

數(shù)據(jù)為'1'

while(dht);

//

'0'為26us-28us

'1'為70us

} data_byte<<=1;

//data_byte|=temp;

//接收每一位的數(shù)據(jù),相或保存數(shù)據(jù)

return data_byte;}

void receive()//接收數(shù)據(jù)// {

uchar t_h,t_l,r_h,r_l,check,num_check,i;start();

//開始信號//調(diào)用開始信號子函數(shù)

dht=1;

//主機設(shè)為輸入判斷從機dht11響應(yīng)信號

if(!dht)

//判斷從機是否有低電平響應(yīng)信號// {

while(!dht);//判斷從機發(fā)出 40us 的低電平響應(yīng)信號是否結(jié)束//

while(dht);

//判斷從機發(fā)出 40us 的高電平是否結(jié)束 如結(jié)束則從機進(jìn)入發(fā)送數(shù)據(jù)狀態(tài),主機進(jìn)入數(shù)據(jù)接收狀態(tài)

數(shù)

//兩個while語句加起來就是dht11的響應(yīng)信號

r_h=receive_byte();//濕度高位

調(diào)用接受一個字節(jié)的子函

r_l=receive_byte();//濕度低位

t_h=receive_byte();//溫度高位

t_l=receive_byte();//溫度低位

check=receive_byte();//校驗位

//結(jié)束信號

dht=0;

//當(dāng)最后一bit數(shù)據(jù)接完畢后主機拉低電平50us// for(i=0;i<7;i++)//差不多8us的延時

delay1();

dht=1;

//總線由上拉電阻拉高進(jìn)入空閑狀態(tài)

num_check=r_h+r_l+t_h+t_l;

if(num_check==check)//判斷讀到的四個數(shù)據(jù)之和是否與校驗位相同

{

rh=r_h;

rl=r_l;

th=t_h;

tl=t_l;

check=num_check;}

shuzi[0]=rh/10;shuzi[1]=rh%10;shuzi[2]=th/10;shuzi[3]=th%10;

} }

void main()//主函數(shù)模塊// { while(1)

//進(jìn)入死循環(huán)

{

receive();

//接收數(shù)據(jù)

display();

} }

【本文地址:http://mlvmservice.com/zuowen/1086901.html】

全文閱讀已結(jié)束,如果需要下載本文請點擊

下載此文檔