eda課程設計多功能數字鍾
❶ 用eda設計一個多功能數字鍾,要求顯示時分秒,整點前5秒報時持續5秒,可以設置小時,分鍾,
我有,可能報時稍有差異
❷ 基於QUARTUS II 的EDA多功能數字鍾 附加管腳配置 用學校的模擬試驗箱。
需要知道你們學校試驗箱的型號。。。要不然不好配置
❸ 急求,EDA課程設計。
基於VHDL的多功能數字鍾的設計
EDA課程設計
資料類別
課程(專業)
EDA
適用年級
大學版
文件格式
word+DLS
文件大小
1725K
上傳時權間
2008-10-10
20:57:00
預覽文件
無(只能預覽文件中的部分內容)
下載次數
0
內容簡介:
EDA課程設計
基於VHDL的多功能數字鍾的設計,共11頁,6086字,附源程序。
摘要:介紹了利用VHDL硬體描述語言設計的多功能數字鍾的思路和技巧。在MAX+PLUSII開發
環境中編譯和模擬了所設計的程序,並在可編程邏輯器件上下栽驗證。模擬和驗證結果表明,該設計方法切實可行。
關鍵詞:數字鍾;硬體描述語言;VHDL;MAX+PLUSII。
相關說明:
1、欲下載本站資料,必須成為本站會員。如果你尚未注冊或登錄,請首先注冊或登錄。
2、48小時內下載同一文件,不重復扣金幣。
3、下載後請用WinRAR或
WinZIP解壓縮後使用。
4、下載後仍有問題,請看常見問題解答。
❹ 求eda數字鍾設計程序
1.Topclock(元件例化 頂層文件)
Library ieee;
Use ieee.std_logic_1164.all;
Use ieee.std_logic_arith.all;
Use ieee.std_logic_unsigned.all;
Entity topclock is
Port(clk,clr,en,m1,h1:in std_logic;
alarm:out std_logic;
secs,secg,mins,ming,hours,hourg:buffer std_logic_vector(3 downto 0));
End;
2. 秒模塊程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity SECOND is
port(clk,clr:in std_logic;
sec1,sec0:out std_logic_vector(3 downto 0);
co:out std_logic);
end SECOND;
architecture SEC of SECOND is
begin
process(clk,clr)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clr='1' then
cnt1:="0000";
cnt0:="0000";
elsif clk'event and clk='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
sec1<=cnt1;
sec0<=cnt0;
end process;
end SEC;
3.分模塊程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity MINUTE is
port(clk,en:in std_logic;
min1,min0:out std_logic_vector(3 downto 0);
co:out std_logic);
end MINUTE;
architecture MIN of MINUTE is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0101" and cnt0="1000" then
co<='1';
cnt0:="1001";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
else
cnt0:="0000";
if cnt1<"0101" then
cnt1:=cnt1+1;
else
cnt1:="0000";
co<='0';
end if;
end if;
end if;
end if;
min1<=cnt1;
min0<=cnt0;
end process;
end MIN;
4.時模塊程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity HOUR is
port(clk,en:in std_logic;
h1,h0:out std_logic_vector(3 downto 0));
end HOUR;
architecture hour_arc of HOUR is
begin
process(clk)
variable cnt1,cnt0:std_logic_vector(3 downto 0);
begin
if clk'event and clk='1' then
if en='1' then
if cnt1="0010" and cnt0="0011" then
cnt1:="0000";
cnt0:="0000";
elsif cnt0<"1001" then
cnt0:=cnt0+1;
end if;
end if;
end if;
h1<=cnt1;
h0<=cnt0;
end process;
end hour_arc;
----5.掃描模塊程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity SELTIME is
port(
clk:in std_logic;
sec1,sec0,min1,min0,h1,h0:in std_logic_vector(3 downto 0);
ut:out std_logic_vector(3 downto 0);
sel:out std_logic_vector(2 downto 0));
end SELTIME;
architecture fun of SELTIME is
signal count:std_logic_vector(2 downto 0);
begin
sel<=count;
process(clk)
begin
if(clk'event and clk='1') then
if(count>="101") then
count<="000";
else
count<=count+1;
end if;
end if;
case count is
when"000"=>ut<= sec0;
when"001"=>ut<= sec1;
when"010"=>ut<= min0;
when"011"=>ut<= min1;
when"100"=>ut<=h0;
when others =>ut<=h1;
end case;
end process;
end fun;
6.顯示模塊程序
library ieee;
use ieee.std_logic_1164.all;
entity DISPLAY is
port(d:in std_logic_vector(3 downto 0);
q:out std_logic_vector(6 downto 0));
end DISPLAY;
architecture disp_are of DISPLAY is
begin
process(d)
begin
case d is
when"0000" =>q<="0111111";
when"0001" =>q<="0000110";
when"0010" =>q<="1011011";
when"0011" =>q<="1001111";
when"0100" =>q<="1100110";
when"0101" =>q<="1101101";
when"0110" =>q<="1111101";
when"0111" =>q<="0100111";
when"1000" =>q<="1111111";
when others =>q<="1101111";
end case;
end process;
end disp_are;
-----7.定時鬧鍾模塊程序
library ieee;
use ieee.std_logic_1164.all;
entity ALERT is
port(m1,m0,s1,s0:in std_logic_vector(3 downto 0);
clk:in std_logic;
q500,qlk:out std_logic);
end ALERT;
architecture sss_arc of ALERT is
begin
process(clk)
begin
if clk'event and clk='1' then
if m1="0101" and m0="1001" and s1="0101" then
if s0="0001" or s0="0011" or s0="0101" or s0="0111" then
q500<='1';
else
q500<='0';
end if;
end if;
if m1="0101" and m0="1001" and s1="0101" and s0="1001" then
qlk<='1';
else
qlk<='0';
end if;
end if;
end process;
end sss_arc;
Architecture one of topclock is
Component second1
Port( clks,clr:in std_logic;
secs,secg: buffer std_logic_vector(3 downto 0);
cout1: out std_logic);
End Component;
Component min1
Port(clkm,clr:in std_logic;
mins,ming:buffer std_logic_vector(3 downto 0);
enmin,alarm: out std_logic);
End Component;
Component hour1
Port(clkh,clr:in std_logic;
hours,hourg:buffer std_logic_vector(3 downto 0));
End Component;
Component madapt
Port(en,m1,clk,secin:in std_logic;
minset:out std_logic);
End Component;
Component hadapt
Port(en,h1,clk,minin:in std_logic;
hourset:out std_logic);
End Component;
signal a,b,c,d: std_logic;
begin
u1:second1 port map(clr=>clr,
secs=>secs,secg=>secg,clks=>clk, cout1=>a);
u2:min1 port map(clr=>clr,alarm=>alarm,
mins=>mins,ming=>ming,clkm=>b,enmin=>c);
u3:hour1 port map(clr=>clr,
hours=>hours,hourg=>hourg,clkh=>d);
u4:madapt port map(en=>en,m1=>m1,clk=>clk,secin=>a,minset=>b);
u5:hadapt port map(en=>en,h1=>h1,clk=>clk,minin=>c,hourset=>d);
end;
❺ EDA課程設計——數字電子鍾
1、基本要求:能利用現有的硬體系統設計一個至少能顯示分、秒的控制電路。分和秒均用兩位數碼管指示,並具有調時、復位功能;
2、擴展要求:能同時顯示小時(兩位數碼管)並能調節小時功能;具有鬧鍾定時功能。
3、設計方法:採用模塊化描述方法,可分為分頻模塊、調時控制模塊、數碼顯示模塊、復位等模塊,每個模塊既可以編輯成獨立的HDL文件或GDF文件,也可以作為HDL程序中的一個進程模塊,最後進行系統模擬加以驗證,在此基礎上下載到硬體上進行現場測試。
4、輸入、輸出埠描述:輸入信號——時鍾信號clk、復位信號clr、時間設置鍵set、時間上調鍵tup、時間下調鍵tdown;輸出信號——掃描式七段數碼管段選輸出端led[7..0]、位選輸出端ctrlbit[3..0]。
我來幫他解答
2011-6-1 17:06
滿意回答
設計原理
計數時鍾由模為60的秒計數器模塊、模為60的分計數模塊、模為24的小時計數器模塊、指示燈與報警器的模塊、分/小時設定模塊及輸出顯示模塊等組成。秒計數器模塊的進位輸出為分計數器模塊的進位輸入,分計數器模塊的進位輸出為小時計數器模塊的進位輸入。其中秒計數器模塊中應有分鍾的設定,分計數器模塊中應有小時的設定。
內容
設計一個計數時鍾,使其具有24小時計數功能。通過「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意引線插孔可設置小時和分鍾的值,並具有整點報時的功能。
電路原理圖
模塊說明:計數時鍾由60秒計數器模塊XSECOND、60分計數器模塊XMINUTE、24小時計數器模塊XHOUR等六個模塊構成。秒計數器模塊的進位輸出為分計數器模塊的進位輸入,分計數器模塊中有小時的設定。通過SW1、SW2、SW3、SW4可設定小時和分鍾的值,並具有整點報時的功能。
輸入信號:SETMIN為分鍾設置信號;SETHOUR為小時設置信號;RESET為全局復位信號;CLK為全局時鍾信號;CKDSP為數碼管動態掃描信號。
輸出信號:SPEAK為蜂鳴器報時信號;LAMP[2..0]為指示燈信號;A~G為數碼管七個段位信號;SS[2..0]為數碼管段位解碼控制信號。
說明與電路連線
指示燈信號LAMP2~LAMP0為獨立擴展下載板上CPLD器件的第11、10、9腳,內部已連接並已鎖定,無需外接連線。
蜂鳴器報時信號SPEAK為獨立擴展下載板CPLD器件的第31腳,內部已連接並已鎖定,無需外接連線。
撥碼開關SW1~SW7內部已連接並已鎖定,無需外接連線。
數碼管七個段位信號A~G為獨立擴展下載板上CPLD器件的第86、87、88、89、90、92、93腳,應接數碼管段位引線接線組KPL_AH,從左到右依次對應的A、B、C、D、E、F、G引線插孔。
數碼管段位解碼控制信號SS0、SS1、SS2為獨立擴展下載板上CPLD器件的第68、69、70腳,為數碼管的位選掃描信號,分別接信號接線組DS1-8A(T)的SS0、SS1、SS2引線插孔(即在電源引線插孔組GND孔處)。
復位信號RESET為獨立擴展下載板上CPLD器件的第71腳,應接「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意一個插孔。
小時設置信號SETHOUR為獨立擴展下載板CPLD器件的第73腳,應接「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意一個插孔。
分鍾設置信號SETMIN為獨立擴展下載板上CPLD器件的第74腳,應接「多功能復用按鍵F1-F12」信號接線組「F1_12(T)」的F9~F12的任意一個插孔。
時鍾信號CLK為獨立擴展下載板上CPLD器件的183腳(即GCLK2),應接時鍾信號接線組「CLOCK(T)」的「FRQ(21)」引線插孔。
數碼管動態掃描信號CKDSP為獨立擴展下載板上CPLD器件的79腳(即GCLK1),應接時鍾信號接線組「CLOCK(T)」的「FRQ(11)」引線插孔。
參考源程序
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xsecond is
port (
clk: in STD_LOGIC;
clkset: in STD_LOGIC;
setmin: in STD_LOGIC;
reset: in STD_LOGIC;
secout: out STD_LOGIC_VECTOR (6 downto 0);
enmin: out STD_LOGIC
);
end xsecond;
architecture xsecond_arch of xsecond is
signal sec : std_logic_vector(6 downto 0);
signal emin : std_logic;
signal sec1 : std_logic;
begin
-- <<enter your statements here>>
process(reset,sec,emin,setmin,clkset)
begin
if reset='0' then
enmin<='0';
secout<="0000000";
sec1<='1';
else
sec1<='0';
secout<=sec;
if clkset='1' and clkset'event then
if setmin='0' then
enmin<='1';
else
enmin<=emin;
end if;
end if;
end if;
end process;
process(clk,sec1)
alias lcount : std_logic_vector(3 downto 0) is sec(3 downto 0);
alias hcount : std_logic_vector(2 downto 0) is sec(6 downto 4);
begin
if sec1='1' then
sec<="0000000";
else
if (clk='1' and clk'event) then
if lcount=9 then
lcount<="0000";
if hcount/=5 then
hcount<=hcount+1;
emin<='0';
else
hcount<="000";
emin<='1';
end if;
else
lcount<=lcount+1;
emin<='0';
end if;
end if;
end if;
end process;
end xsecond_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xminute is
port (
clkmin: in STD_LOGIC;
reset: in STD_LOGIC;
sethour: in STD_LOGIC;
clk: in STD_LOGIC;
minout: out STD_LOGIC_VECTOR (6 downto 0);
enhour: out STD_LOGIC
);
end xminute;
architecture xminute_arch of xminute is
signal min : std_logic_vector(6 downto 0);
signal ehour : std_logic;
signal min1 : std_logic;
begin
-- <<enter your statements here>>
process(reset,clk,sethour,min,ehour)
begin
if reset='0' then
enhour<='0';
minout<="0000000";
min1<='0';
else
min1<='1';
minout<=min;
if clk='1' and clk'event then
if sethour='0' then
enhour<='1';
else
enhour<=ehour;
end if;
end if;
end if;
end process;
process(clkmin,min1)
alias lcountm : std_logic_vector(3 downto 0) is min(3 downto 0);
alias hcountm : std_logic_vector(2 downto 0) is min(6 downto 4);
begin
if min1='0' then
min<="0000000";
else
if (clkmin='1' and clkmin'event) then
if lcountm=9 then
lcountm<="0000";
if hcountm/=5 then
hcountm<=hcountm+1;
ehour<='0';
else
hcountm<="000";
ehour<='1';
end if;
else
lcountm<=lcountm+1;
ehour<='0';
end if;
end if;
end if;
end process;
end xminute_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xhour is
port (
clkhour: in STD_LOGIC;
reset: in STD_LOGIC;
hourout: out STD_LOGIC_VECTOR (5 downto 0)
);
end xhour;
architecture xhour_arch of xhour is
signal hour : std_logic_vector(5 downto 0);
begin
-- <<enter your statements here>>
process(reset,clkhour,hour)
alias lcount : std_logic_vector(3 downto 0) is hour(3 downto 0);
alias hcount : std_logic_vector(1 downto 0) is hour(5 downto 4);
begin
if reset='0' then
hourout<="000000";
hour<="000000";
else
if (clkhour='1' and clkhour'event) then
if lcount=9 then
lcount<="0000";
hcount<=hcount+1;
else
if hour="100011" then
hour<="000000";
else
lcount<=lcount+1;
end if;
end if;
end if;
hourout<=hour;
end if;
end process;
end xhour_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xalert is
port (
clk: in STD_LOGIC;
d_in: in STD_LOGIC_VECTOR (6 downto 0);
speak: out STD_LOGIC;
d_out: out STD_LOGIC_VECTOR (2 downto 0)
);
end xalert;
architecture xalert_arch of xalert is
type state is (s1,s2,s3,s4);
signal next_state,current_state : state;
begin
-- <<enter your statements here>>
process(clk,current_state,d_in)
begin
if d_in/="0000000" then
speak<='0';
next_state<=s1;
current_state<=s1;
d_out<="000";
else
if clk='1' and clk'event then
speak<='1';
current_state<=next_state;
end if;
case current_state is
when s1 =>
d_out<="000";
next_state<=s2;
when s2 =>
d_out<="001";
next_state<=s3;
when s3 =>
d_out<="010";
next_state<=s4;
when s4 =>
d_out<="100";
next_state<=s1;
when others =>
d_out<="000";
null;
end case;
end if;
end process;
end xalert_arch;
library IEEE;
use IEEE.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;
entity xsettime is
port (
hour: in STD_LOGIC_VECTOR (5 downto 0);
min: in STD_LOGIC_VECTOR (6 downto 0);
sec: in STD_LOGIC_VECTOR (6 downto 0);
reset: in STD_LOGIC;
clk: in STD_LOGIC;
sel: out STD_LOGIC_VECTOR (2 downto 0);
d_out: out STD_LOGIC_VECTOR (3 downto 0)
);
end xsettime;
architecture xsettime_arch of xsettime is
signal sel1 : std_logic_vector(2 downto 0);
begin
-- <<enter your statements here>>
process(clk,reset,sel1,hour,min,sec)
begin
if reset='0' then
sel<="000";
d_out<="0000";
sel1<="000";
else
if (clk='1' and clk'event) then
if sel1<5 then
sel1<=sel1+1;
else
sel1<="000";
end if;
end if;
sel<=sel1;
case sel1 is
when "000" =>
d_out(3)<='0';
d_out(2)<='0';
d_out(1)<=hour(5);
d_out(0)<=hour(4);
when "001" =>
d_out<=hour(3 downto 0);
when "010" =>
d_out(3)<='0';
d_out(2)<=min(6);
d_out(1)<=min(5);
d_out(0)<=min(4);
when "011" =>
d_out<=min(3 downto 0);
when "100" =>
d_out(3)<='0';
d_out(2)<=sec(6);
d_out(1)<=sec(5);
d_out(0)<=sec(4);
when "101" =>
d_out<=sec(3 downto 0);
when others =>
null;
end case;
end if;
end process;
end xsettime_arch;
library IEEE;
use IEEE.std_logic_1164.all;
entity xdeled is
port (
d_in: in STD_LOGIC_VECTOR (3 downto 0);
a: out STD_LOGIC;
b: out STD_LOGIC;
c: out STD_LOGIC;
d: out STD_LOGIC;
e: out STD_LOGIC;
f: out STD_LOGIC;
g: out STD_LOGIC
);
end xdeled;
才五分啊,太少了吧
哥剛的
❻ 設計多功能數字鍾
這個課程設計的題目比較簡單,有時間我可以幫你寫寫程序。
❼ 急求EDA數字鍾設計程序,我有原理圖
功 能: 數碼管顯示的電子鍾
;------------------------------------------------------------------------------
ORG 0000H
AJMP START
ORG 000BH
AJMP TIME
ORG 0100H
START: MOV 30H, #00H ;半秒標志
MOV 31H, #00H ;狀態標志,0FFH表示設置狀態
MOV 32H, #00H ;閃爍顯示控制,位為0對應的數碼管
;在調時狀態下時閃爍
MOV 20H, #00H ;1/20秒計數
MOV 21H, #00H ;秒計數
MOV 22H, #00H ;分計數
MOV 23H, #00H ;時計數
MOV IP, #02H ;IP,IE初始化
MOV IE, #82H
MOV TMOD, #01H ;設定定時器工作方式
MOV TL0, #0B0H ;定時器初值
MOV TH0, #3CH
SETB TR0 ;啟動定時器0
MOV SP, #40H ;重設堆棧指針
MAIN: LCALL DISP ;調用顯示子程序
LCALL KEYPR ;調用按鍵處理子程序
SJMP MAIN ;循環
;定時器0中斷處理程序
TIME: PUSH ACC ;保護現場
PUSH PSW
MOV TL0, #0B4H ;賦定時初值
MOV TH0, #03CH
INC 20H ;1/20秒計數器加1
MOV A, 20H
CJNE A, #10, IRET ;未到半秒,返回
MOV 20H, #00H
MOV A, 30H ;修改半秒標志
CPL A
MOV 30H, A
JZ IRET
MOV A, 31H ;狀態標志,為0FFH停止計時
JNZ IRET
MOV 20H, #00H ;一秒鍾時間到
MOV A, 21H ;秒加1
INC A
MOV 21H, A
CJNE A, #60, IRET
MOV 21H, #00H ;一分鍾時間到
MOV A, 22H ;分加1
INC A
MOV 22H, A
CJNE A, #60, IRET
MOV 22H, #00H ;一小時時間到
MOV A, 23H ;小時加1
INC A
MOV 23H, A
CJNE A, #24, IRET
MOV 23H, #00H ;24小時到,小時清零
IRET: POP PSW ;恢復現場
POP ACC
RETI ;中斷返回
;顯示子程序 ;顯示緩沖區2AH - 2FH
DISP: MOV A, 21H ;處理秒 21H-->2FH,2EH
MOV B, #10
DIV AB
MOV 2FH, B
MOV 2EH, A
MOV A, 22H ;處理分鍾22H-->2CH,2DH
MOV B, #10
DIV AB
MOV 2DH, B
MOV 2CH, A
MOV A, 23H ;處理小時23H-->2AH,2BH
MOV B, #10
DIV AB
MOV 2BH, B
MOV 2AH, A
MOV DPTR, #DISPTAB ;段碼表首地址
MOV R0, #2AH ;緩沖區首地址
MOV R6, #20H ;數碼管位選擇
DISP1: MOV A, @R0
MOVC A, @A+DPTR
MOV P2, #00H
MOV B, A
MOV A, 30H ;半秒標志
JNZ VIS1 ;半秒標志不為0,處理閃爍
MOV A, B
JMP VIS3 ;半秒標志為0,不處理閃爍
VIS1: MOV A, B
MOV B, A
MOV A, R6
ANL A, 32H
JNZ VIS2 ;當前位不閃爍
MOV A, #00H ;當前位閃爍
JMP VIS3
VIS2: MOV A, B
VIS3: MOV B, A
MOV A, R6
ANL A, #14H ;處理點的位置,點用來分隔時,分,秒
JNZ D1 ;顯示點
MOV A, B
JMP D2 ;不顯示點
D1: MOV A, B
ORL A, #80H ;顯示點
D2: MOV P0, A
MOV P2, R6
CALL DELAY ;延時
DISP2: INC R0
MOV A, R6
RRC A
MOV R6, A
JNZ DISP1 ;R6不為0,繼續顯示
MOV P2, #00H
RET
;按鍵判斷程序
KEYPR: SETB P3.5 ;檢測S31
JB P3.5, EXITKEY
LCALL DISP
JB P3.5, EXITKEY
MOV 21H, #00H ;進入設定狀態
MOV 31H, #0FFH
MOV 32H, #33H
KW1: LCALL DISP
JNB P3.5, KW1
SETMIN: LCALL DISP
SETB P3.5
JB P3.5, SETMIN1
LCALL DISP
JB P3.5, SETMIN1
KW2: LCALL DISP
JNB P3.5, KW2
JMP SETHR ;進入小時設定狀態
SETMIN1:SETB P3.6 ;設定分鍾
JB P3.6, SETMIN
LCALL DISP
JB P3.6, SETMIN
KW3: LCALL DISP
JNB P3.6, KW3
MOV A, 22H
INC A
CJNE A, #60, INCMIN
MOV A, #00H
INCMIN: MOV 22H, A
JMP SETMIN
SETHR: MOV 32H, #0FH
LCALL DISP
SETB P3.5
JB P3.5, SETHR1
LCALL DISP
JB P3.5, SETHR1
KW4: LCALL DISP
JNB P3.5, KW4
JMP EXITKEY ;退出設定狀態
SETHR1: SETB P3.6 ;設定小時
JB P3.6, SETHR
LCALL DISP
JB P3.6, SETHR
KW5: LCALL DISP
JNB P3.6, KW5
MOV A, 23H
INC A
CJNE A, #24, INCHR
MOV A, #00H
INCHR: MOV 23H, A
JMP SETHR
EXITKEY:MOV 31H, #00H
MOV 32H, #3FH
RET
DELAY: MOV R7, #0FFH
DJNZ R7, $
RET
;共陰數碼管顯示代碼,最低位對應段a
;0,1,2,3,4,5,6,7,8,9
DISPTAB:DB 3FH, 06H, 5BH, 4FH, 66H
DB 6DH, 7DH, 07H, 7FH, 6FH
END
❽ 單片機課程設計 設計製作一個24小時制多功能數字鍾
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>#define INT8U unsigned char
#define INT16U unsigned int
#define k1() ((PIND & (1<<PD0))==0x00)
#define k2() ((PIND & (1<<PD1))==0x00)
#define k3() ((PIND & (1<<PD2))==0x00)
#define k4() ((PIND & (1<<PD3))==0x00)
#define k5() ((PIND & (1<<PD4))==0x00)
#define k6() ((PIND & (1<<PD5))==0x00)
#define k7() ((PIND & (1<<PD6))==0x00)
#define k8() ((PIND & (1<<PD7))==0x00)const INT8U seg[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00};
INT8U seg11[]={0,0,0x40,0,0,0x40,0,0};
INT8U ja;
INT8U key=0xff;
INT8U h,m,s,y,m1,d;
void hour1()
{
if (++h>23) {h=0;day();}
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
} void minute1()
{
if (++m>59)
{m=0;<br> hour1();<br> }
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
} void second1() {
if (++s>59)
{ s=0;
minute1();
}
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
}
void year()
{if (++y>99) y=0;<br> <br> <br> seg11[0]=seg[y/10];<br> seg11[1]=seg[y%10];<br> } void month1()
{
if (++m1>12)
{m=10;<br> year();<br> }
seg11[3]=seg[m1/10];
seg11[4]=seg[m1%10];
} void day() {
if (++d>30)
{ d=0;
month1();
}
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
} //時間函數
void time()
{
seg11[0]=seg[h/10];
seg11[1]=seg[h%10];
seg11[3]=seg[m/10];
seg11[4]=seg[m%10];
seg11[6]=seg[s/10];
seg11[7]=seg[s%10];
PORTA=0x00;
PORTA=seg11[ja]; PORTB=~(1<<ja);
ja=(ja+1)&0x07;
_delay_ms(5); }
//日期
void date()
{ seg11[0]=seg[y/10];
seg11[1]=seg[y%10];
seg11[3]=seg[m1/10];
seg11[4]=seg[m1%10];
seg11[6]=seg[d/10];
seg11[7]=seg[d%10];
seg11[2]=seg11[5]=0x00;
PORTA=0x00;
PORTA=seg11[ja];
PORTB=~(1<<ja);
ja=(ja+1)&0x07;
_delay_ms(3);
}
int main()
{ INT8U ja=0;
DDRA=0xff; PORTA=0xff;
DDRB=0xff; PORTB=0xff;
DDRD=0x00; PORTD=0xff;PIND=0x00;
MCUCR=0X0A;//MCU 控制寄存器- MCUCR
GICR=0XC0; //通用中斷控制寄存器- GICR ASSR=0x08;
TCCR2=0x04;
TCNT2=0;
TIMSK=_BV(TOIE2)|_BV(TOIE0); d=y=m1=06;
h=m=s=12;
sei();
while(1)
{ time();
// if(k1())
// { while(k1()); hour1(); }
// if(k7())
//{ while(k7());
//
// while(2)//日期循環
// {
// date();
// if(k7())
// {while(k7());break;} // }
// }
}}
ISR(TIMER2_OVF_vect) {
if( seg11[2]==0x40)
{
seg11[2]=seg11[5]=0x00;
}
else
{ seg11[2]=seg11[5]=0x40;
second1();
}
}
ISR(INT1_vect)
{ switch (PIND)
{ case 0b10000111 : minute1();break;
case 0b10010111 : hour1();break;
case 0b10100111 : second1();break;
} }
❾ EDA課程設計——《數字鍾》體會怎麼寫啊
課程設計感悟
通過這次設計,既復習了以前所學的知識,也進一步加深了對EDA的了解,讓我對它有了更加濃厚的興趣。特別是當每一個子模塊編寫調試成功時,心裡特別的開心。但是在畫頂層原理圖時,遇到了不少問題,最大的問題就是根本沒有把各個模塊的VHD文件以及生成的器件都全部放在頂層文件的文件夾內,還有就是程序設計的時候考慮的不夠全面,沒有聯系著各個模式以及實驗板的情況來編寫程序,以至於多考慮編寫了解碼電路而浪費了很多時間。在波形模擬時,也遇到了一點困難,想要的結果不能在波形上得到正確的顯示:在分頻模塊中,設定輸入的時鍾信號後,卻只有二分頻的結果,其餘三個分頻始終沒反應。後來,在數十次的調試和老師的指點之後,才發現是因為規定的信號量范圍太大且信號的初始值隨機,從而不能得到所要的結果。還有的模擬圖根本就不出波形,怎麼調節都不管用,後來才知道原來是路徑不正確,路徑中不可以有漢字。真是細節決定成敗啊!
總的來說,這次設計的數字鍾還是比較成功的,有點小小的成就感,終於覺得平時所學的知識有了實用的價值,達到了理論與實際相結合的目的,不僅學到了不少知識,而且鍛煉了自己的能力,使自己對以後的路有了更加清楚的認識,同時,對未來有了更多的信心。