第一篇:EDA萬年歷課程設計報告
《EDA技術及其應用》
實 訓 報 告
班 級 姓 名 學 號 指導教師
目 錄
一 設計要求......................................2
1.0 設計目的及意義.................................2 1.1 設計要求.......................................2
二 設計流程:....................................2
2.0 原理框圖.......................................2 2.1 VHDL設計思路...................................3
三 VHDL程序......................................3
3.0 天計數模塊......................................6 3.1 月計數模塊.....................................7 3.2 年計數模塊......................................9 3.3 調時控制模塊..................................11 3.4 譯碼模塊......................................12 3.5 掃描模塊........................................12
四 心得體會.....................................14 4.0................................................14 五 附錄...........................................15 5.0 頂層文件......................................15
一、設計目的及意義
1.0 設計目的及意義
在掌握EDA理論知識的基礎上進一步了解EDA開發軟件QuartusII的使
entity tian is port(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1:out std_logic_vector(6 downto 0);cout:out std_logic);end tian;
architecture one of tian is
signal q1:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);signal ab:std_logic_vector(1 downto 0);begin
process(clk,pan)
begin
if clk'event and clk='1'
then q1<=q1+1;
if q1=9 then q1<=“0000”;q2<=q2+1;
end if;case pan is when “00”=> if q2=3 and q1=1 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when “01”=> if q2=3 and q1=0 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when “10”=> if q2=2 and q1=8 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when “11”=> if q2=2 and q1=9 then q2<=“000”;q1<=“0001”;cout<='1';else cout<='0';
end if;when others=>null;end case;end if;end process;T1(3 downto 0)<=q1;T1(6 downto 4)<=q2;end one;3.1 月計數模塊
when others=>null;end case;end if;Y1(3 downto 0)<=q1;Y1(6 downto 4)<=q2;end process;end behav;
3.2 年計數模塊
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity nian is port(clk :in std_logic;n1:out std_logic_vector(6 downto 0);
run:out std_logic);end entity;
architecture one of nian is signal q1,q3:std_logic_vector(3 downto 0);signal q2:std_logic_vector(2 downto 0);
begin process(clk)
begin if clk'event and clk='1' then
q1<=q1+1;q3<=q3+1;
if q1=9 then q2<=q2+1;q1<=“0000”;end if;if q3=3 then q3<=“0000”;run<='1';else run<='0';end if;
if q1=9 and q2<=7 then q1<=“0001”;q2<=“000”;end if;
end if;end process;
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(clk1)begin if(clk1'event and clk1='1')then if(count>=“101”)then count<=“000”;else count<=count+1;end if;end if;case count is when “000”=>daout<=tian(3 downto 0);dp<='0';when“001”=>daout(3)<='0';daout(2 downto 0)<=tian(6 downto 4);dp<='0';when “010”=>daout<=yue(3 downto 0);dp<='1';when“011”=>daout(3)<='0';daout(2 downto 0)<=yue(6 downto 4);dp<='0';when “100”=>daout<=nian(3 downto 0);dp<='1';when others=>daout(3 downto 2)<=“00”;daout(2 downto 0)<=nian(6 downto 4);dp<='0';end case;end process;end fun;
3.5 譯碼模塊
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;
entity led is port(ledi:in std_logic_vector(3 downto 0);ledo:out std_logic_vector(6 downto 0));
次萬年歷實訓我們是四個人作為一個團隊,在實訓過程中,有時候一個人在編寫程序時出現一點很小的錯誤(例如:程序中少了一個分號或者少了一個字母)就會導致整個程序編譯不能通過,而四個人在一起,出現錯誤時一起去尋找,總會有一個人及時發現錯誤的,發現后及時糾正錯誤,然后繼續開展下面的工作。這樣三個人互相協作,共同努力,各自發揮自身的優勢,這樣工作便能順利的進行下去,如果是一個人單獨去完成,在出現錯誤的時候自己要想發現錯誤便需要很長的時間才能發現,這樣很浪費時間,浪費時間的結果就是直接導致工作效率低。而在如今的社會工作中,許多公司企業都要求應聘者要有很好的團隊合作精神,工作時要有高效的工作效率。因此,在這次實訓中我也切身體會到了團隊合作的重要性。
實訓是對每個學生綜合能力的檢驗是讓我們能夠更好的鞏固專業知識,積累工作經驗,掌握工作技能。通過這次實訓,讓我深深的體會到要想做好每一件事情,除了自己平時要有一定的專業知識外,還需要一定的實踐動手能力,操作能力,說實話,這次實訓讓我學到了很多東西,也明白了很多事情。在此還要感謝王老師耐心、認真的指導。謝謝薛老師!
五、附錄
5.0 頂層文件
library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity nianli is port(clk,clkdsp:in std_logic;k1,k2:in std_logic;dpout,d10,d20:out std_logic;ledout :out std_logic_vector(6 downto 0);sel1:out std_logic_vector(2 downto 0));
end entity;architecture one of nianli is component tian port(clk:in std_logic;pan:in std_logic_vector(1 downto 0);T1:out std_logic_vector(6 downto 0);cout:out std_logic);end component;component yue port(clk,run:in std_logic;cout:out std_logic;pan:out std_logic_vector(1 downto 0);
第二篇:萬年歷單片機課程設計報告
課程設計報告 任務和設計要求
首先要學會安裝軟件,要熟悉會使用。系統設計 系統框圖 硬件設計 3.1 電路原理圖
課程設計報告
課程設計報告
課程設計報告
3.2 主要單元電路
3.3 元件清單 軟件設計 4.1 程序流程圖
課程設計報告
4.2程序清單
TIME_WEEK DATA 52H TIME_YEAR DATA 5DH TIME_MONTH DATA 5EH TIME_DATA DATA 5FH YEARH DATA 36H YEAR DATA 35H MONTH DATA 34H DAY DATA 33H HOUR DATA 32H MINUTE DATA 31H SEC DATA 30H
課程設計報告
AAA BIT P3.0 BBB BIT P3.1 AA BIT P3.3 BB BIT P3.4 CC BIT P3.5 BL BIT P3.2 BZ1 BIT 21H.0 TIMES DATA
20H COM
DATA
P1 ORG
0000H LJMP
START ORG
0003H RETI ORG
000BH LJMP INTT0 ORG
0013H RETI ORG
001BH RETI ORG
0023H RETI START:
課程設計報告
MOV
R0,#30H MOV
R7,#9 CLEETE: MOV
@R0,#00H INC
R0 DJNZ
R7,CLEETE MOV
TIMES,#00H MOV
TMOD,#01H MOV
TL0,#0C0H MOV
TH0,#63H MOV
SEC,#0 MOV
MINUTE,#0H MOV
HOUR,#0H MOV
DAY,#01H MOV
MONTH,#01H MOV
YEAR,#01H MOV
YEARH,#20H SETB
EA SETB
ET0 SETB
TR0 MOV
R4,#19 START1:
課程設計報告
CALL
DISP JNB
AA,SETMM1 JMP
START1 SETMM1: CALL
SETMM JMP START1 SETMM: CALL
DISP CALL
DISP JB AA,SETMM0 SETMM2: JNB AA,SETMM3 CLR ET0 CLR TR0 MOV
SEC,#0 MOV
TIMES,#01H MOV
R0,#MINUTE SETMM4: NOP INC22: CALL
OFFL CALL
INC11
課程設計報告
CALL
DISP JB AA,INC22 CALL DISP JB AA,INC22 INC R0 MOV A,TIMES RL A MOV TIMES,A JNB
TIMES.5, SETMM4 SETMM12: JNB AA , SETMM11 SETMM0: SETB
TR0 SETB
ET0 RET SETMM11: CALL DISP JMP
SETMM12 SETMM3: CALL
DISP JMP
SETMM2 INC11:
課程設計報告
MOV
R3,#40 INC111: MOV A,@R0 JB
BB,INC17 ADD
A,#1 DA A CALL INC000 INC13: JNB BB , INC14 INC17: MOV
@R0,A CALL
DISP DJNZ R3,INC111 RET INC14: CALL
DISP JMP
INC13 OFFL: MOV
22H,@R0 MOV
R6,#10 OFF1: MOV
R7,#10
課程設計報告
OFF2: MOV
@ R0, # 0AAH CALL
DISP DJNZ R7 , OFF2 DJNZ R6 , OFF1 MOV
@ R0 , 22H RET INC000: JB
TIMES.0, INC001 JB
TIMES.1, INC002 JB
TIMES.2, INC003 JB
TIMES.3, INC004 JB
TIMES.4, INC005 JMP
INCOUT INC005: CJNE A, #99H, INCOUT MOV
A,#00H JMP
INCOUT INC004: CJNE A, # 13H, INCOUT MOV
A,#01H JMP
INCOUT
課程設計報告
INC003: CJNE A,# 32H ,INCOUT MOV
A,#01H JMP
INCOUT INC002: CJNE A,#24H,INCOUT MOV
A,#00H JMP
INCOUT INC001: CJNE A,# 60H , INCOUT MOV
A,#00H INCOUT: RET INTT0: PUSH
ACC PUSH
PSW ORL TL0,#0C0H MOV
TH0,#63H DJNZ R4 , CLKE111 JMP
LOOP11 CLKE111: JMP
CLKE
課程設計報告
LOOP11: MOV
R4,#19H MOV
A,SEC ADD
A,#1 DA A MOV
SEC,A CJNE A, #60H , CLKE99 MOV
SEC,#0 MOV
A,MINUTE ADD
A,#1 DA A MOV
MINUTE,A CLK0: CJNE A, # 60H, CLKE MOV
MINUTE,#0 MOV
A,HOUR ADD
A,#1 DA
A MOV
HOUR,A CJNE A, # 24H, CLKE MOV
HOUR,#0 MOV
A,DAY
課程設計報告
ADD
A,#1 DA A MOV
DAY,A MOV
A,MONTH INC
A MOVC A, @A + PC SJMP
CLK1 DB
31H,28H,31H DB
30H,31H,30H DB
31H,31H,30H DB
00H,00H,00H DB
00H,00H,00H DB
31H,30H,31H CLK1: CLR C SUBB A,DAY JNC
CLKE MOV
A,MONTH CJNE A,#2,CLK3 MOV
A,YEAR ANL A,#13H JNB
ACC.4,CLK2
課程設計報告
ADD
A,#2 CLK2: ANL A,#3 JNZ
CLK3 MOV
A,DAY XRL A,#29H JZ
CLKE CLK3: MOV
DAY,#1 MOV
A,MONTH ADD
A,#1 DA
A MOV
MONTH,A CJNE A,#13H,CLKE MOV
MONTH,#1 MOV
A,YEAR ADD
A,#1 DA
A MOV
YEAR,A CLKE99: CALL
CONVERT CLKE:
課程設計報告
POP
PSW POP
ACC RETI DISP: PUSH
PSW PUSH
ACC MOV
23H,R0 DISP99: MOV
R1,#40H MOV
R0,#30H MOV
R2,#9 DISP1: MOV A,@R0 ANL A,#0FH MOV @R1,A MOV A,@R0 SWAP A ANL A,#0FH INC R1 MOV @R1,A DJNZ R2,DISP2 CALL DISPLAY
課程設計報告
MOV R0,23H POP ACC POP PSW RET DISP2: INC R1 INC R0 JMP DISP1 DISPLAY: MOV R1,#40H MOV R5,#19 SETB AAA PLAY: SETB BBB NOP CLR BBB CLR AAA MOV A,@R1 MOV DPTR,#TAB MOVC A,@A+DPTR MOV COM,A CALL DL1MS
課程設計報告
MOV COM,#0FFH DJNZ R5,PLAY1 CLR BBB SETB AAA RET PLAY1: INC R1 JMP PLAY TAB: DB 0C0H,0F9H,0A4H, 0B0H,99H,92H,82H,0F8H,80H,90H,0FFH,0A3H,8EH,0ABH DL1MS: MOV 25H,R7 MOV 24H,R6 MOV R7,#20 DS1: MOV R6,#10 DJNZ R6,$ DJNZ R7,DS1 MOV R7,25H MOV R6,24H RET
課程設計報告
START_YEAR EQU 01 CONVERT_YEAR DATA 5CH CONVERT_MONTH DATA 38H CONVERT_DATE DATA 37H TEMP_BYTE1 DATA 57H TEMP_BYTE2 DATA 58H TEMP_BYTE3 DATA 59H TEMP_BYTE4 DATA 5AH TEMP_BYTE5 DATA 5BH CONVERT: MOV A, YEAR MOV TIME_YEAR,A MOV A,MONTH MOV TIME_MONTH,A MOV A,DAY MOV TIME_DATA,A MOV A,TIME_YEAR MOV B,#16 DIV AB MOV CONVERT_YEAR,B MOV B,#10 MUL AB
課程設計報告
ADD A,CONVERT_YEAR MOV CONVERT_YEAR,A MOV A,TIME_MONTH JNB ACC.4,CON_02 CLR ACC.4 ADD A,#10 CON_02:MOV CONVERT_MONTH,A MOV A,TIME_DATA MOV B,#16 DIV AB MOV CONVERT_DATE,B MOV B,#10 MUL AB ADD A,CONVERT_DATE MOV CONVERT_DATE,A MOV DPTR,#MONTH_DATA MOV A,CONVERT_YEAR CON_06:CLR C SUBB A,#START_YEAR MOV B,#3 MUL AB ADD A,DPL
課程設計報告
MOV DPL,A MOV A,B ADDC A,DPH MOV DPH,A MOV A, #2 MOVC A, @A+DPTR CLR ACC.7 MOV B, #32 DIV AB MOV TEMP_BYTE1,A MOV TEMP_BYTE2,B MOV TEMP_BYTE3,#0 MOV A,CONVERT_MONTH CJNE A,#10,CON_08 CON_08:JC CON_09 MOV TEMP_BYTE3,#1 CON_09:MOV A,CONVERT_YEAR ANL A,#03H JNZ CON_10 MOV A,CONVERT_MONTH LCALL GET_RUN_DAYS_LOW SJMP CON_12
課程設計報告
CON_10:MOV A,CONVERT_MONTH LCALL GET_DAYS_LOW CON_12:MOV B,CONVERT_DATE DEC B ADD A,B MOV TEMP_BYTE4,A JNC CON_14 INC TEMP_BYTE3 CON_14:MOV A,TEMP_BYTE1 LCALL GET_DAYS_LOW DEC A ADD A,TEMP_BYTE2 MOV TEMP_BYTE5,A MOV A,CONVERT_MONTH CJNE A,TEMP_BYTE1,CON_20 MOV A,CONVERT_DATE CJNE A,TEMP_BYTE2,CON_20 CON_20:JC CON_22 LJMP CON_60 CON_22:MOV A,CONVERT_YEAR JNZ CON_24 MOV A,#100
課程設計報告
CON_24:DEC A MOV CONVERT_YEAR,A MOV A,DPL CLR C SUBB A,#3 MOV DPL,A JNC CON_26 DEC DPH CON_26:MOV A,TEMP_BYTE5 CLR C SUBB A,TEMP_BYTE4 MOV TEMP_BYTE3,A MOV CONVERT_MONTH,#12 CLR F0 CLR A MOVC A,@A+DPTR ANL A,#0F0H SWAP A;MOV TEMP_BYTE4,A JZ CON_30 MOV A, #2 MOVC A , @A+DPTR
課程設計報告
MOV C, ACC.7 MOV A, #1 MOVC A, @A+DPTR RLC A SJMP CON_34 CON_30:MOV A, #1 MOVC A, @A+DPTR CON_34:MOV TEMP_BYTE5, A CON_40:MOV A, TEMP_BYTE5 RRC A MOV TEMP_BYTE5, A JC CON_42 MOV B, #29 SJMP CON_44 CON_42:MOV B, #30 CON_44:MOV A, TEMP_BYTE3 CLR C SUBB A, B JZ CON_46 JNC CON_50 CPL A INC A
課程設計報告
CON_46: INC A MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_DATE, A MOV A, CONVERT_MONTH MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_MONTH, A MOV A, CONVERT_YEAR MOV B, #10 DIV AB SWAP A ORL A, B MOV CONVERT_YEAR, A CALL WEEK RET CON_50:MOV TEMP_BYTE3, A JB F0, CON_52
課程設計報告
DEC CONVERT_MONTH CON_52:MOV A, CONVERT_MONTH CJNE A, TEMP_BYTE4, CON_54 CPL F0 CON_54:SJMP CON_40 CON_60:MOV A, TEMP_BYTE4 CLR C SUBB A, TEMP_BYTE5 MOV TEMP_BYTE4, A JNC CON_62 DEC TEMP_BYTE3 CON_62:MOV CONVERT_MONTH, #1 CLR A MOVC A, @A+DPTR MOV TEMP_BYTE5, A ANL A, #0F0H SWAP A XCH A, TEMP_BYTE5 CLR F0 ANL A, #0FH MOV TEMP_BYTE1, A MOV A, #1
課程設計報告
MOVC A, @A+DPTR MOV TEMP_BYTE2, A ANL A, #0F0H ORL A, TEMP_BYTE1 SWAP A MOV TEMP_BYTE1, A MOV A, #2 MOVC A, @A+DPTR MOV C, ACC.7 MOV A, TEMP_BYTE2 ANL A, # 0FH SWAP A MOV ACC.3, C MOV TEMP_BYTE2, A CON_70:MOV A, TEMP_BYTE2 RLC A MOV TEMP_BYTE2, A MOV A, TEMP_BYTE1 RLC A MOV TEMP_BYTE1, A JC CON_72 MOV B, #29
課程設計報告
SJMP CON_74 CON_72:MOV B, #30 CON_74:MOV A, TEMP_BYTE4 CLR C SUBB A,B JNC CON_78 MOV B, A MOV A, TEMP_BYTE3 JZ CON_76 DEC TEMP_BYTE3 MOV TEMP_BYTE4, B SJMP CON_80 CON_76:MOV A, TEMP_BYTE4 LJMP CON_46
CON_78:MOV TEMP_BYTE4, A CON_80:MOV A, CONVERT_MONTH CJNE A, TEMP_BYTE5, CON_82 CPL F0 JNB F0, CON_82 SJMP CON_70 CON_82:INC CONVERT_MONTH SJMP CON_70
課程設計報告
GET_DAYS_LOW: MOVC A, @A+PC RET DB 0,31,59,90,120,151,181,212,243,17,48,78 GET_RUN_DAYS_LOW: MOVC A, @A+PC RET DB 0,31,60,91,121,152,182,213,244,18,49,79 MONTH_DATA:
DB 04DH,04AH,0B8H;2001 DB 00DH,04AH,04CH;2002 DB 00DH,0A5H,041H;2003 DB 025H,0AAH,0B6H;2004 DB 005H,06AH,049H;2005 DB 07AH,0ADH,0BDH;2006 DB 002H,05DH,052H;2007 DB 009H,02DH,047H;2008 DB 05CH,095H,0BAH;2009 DB 00AH,095H,04EH;2010 DB 00BH,04AH,043H;2011
課程設計報告
DB 04BH,055H,037H;2012 DB 00AH,0D5H,04AH;2013 DB 095H,05AH,0BFH;2014 DB 004H,0BAH,053H;2015 DB 00AH,05BH,048H;2016 DB 065H,02BH,0BCH;2017 DB 005H,02BH,050H;2018 DB 00AH,093H,045H;2019 DB 047H,04AH,0B9H;2020 DB 006H,0AAH,04CH;2021 DB 00AH,0D5H,041H;2022 DB 024H,0DAH,0B6H;2023 DB 004H,0B6H,04AH;2024 DB 069H,057H,03DH;2025 DB 00AH,04EH,051H;2026 DB 00DH,026H,046H;2027 DB 05EH,093H,03AH;2028 DB 00DH,053H,04DH;2029 DB 005H,0AAH,043H;2030 DB 036H,0B5H,037H;2031 DB 009H,06DH,04BH;2032 DB 0B4H,0AEH,0BFH;2033
課程設計報告
DB 004H,0ADH,053H;2034 DB 00AH,04DH,048H;2035 DB 06DH,025H,0BCH;2036 DB 00DH,025H,04FH;2037 DB 00DH,052H,044H;2038 DB 05DH,0AAH,038H;2039 DB 00BH,05AH,04CH;2040 DB 005H,06DH,041H;2041 DB 024H,0ADH,0B6H;2042 DB 004H,09BH,04AH;2043 DB 07AH,04BH,0BEH;2044 DB 00AH,04BH,051H;2045 DB 00AH,0A5H,046H;2046 DB 05BH,052H,0BAH;2047 DB 006H,0D2H,04EH;2048 DB 00AH,0DAH,042H;2049 DB 035H,05BH,037H;2050 DB 009H,037H,04BH;2051 DB 084H,097H,0C1H;2052 DB 004H,097H,053H;2053 DB 006H,04BH,048H;2054 DB 066H,0A5H,03CH;2055
課程設計報告
DB 00EH,0A5H,04FH;2056 DB 006H,0B2H,044H;2057 DB 04AH,0B6H,038H;2058 DB 00AH,0AEH,04CH;2059 DB 009H,02EH,042H;2060 DB 03CH,097H,035H;2061 DB 00CH,096H,049H;2062 DB 07DH,04AH,0BDH;2063 DB 00DH,04AH,051H;2064 DB 00DH,0A5H,045H;2065 DB 055H,0AAH,0BAH;2066 DB 005H,06AH,04EH;2067 DB 00AH,06DH,043H;2068 DB 045H,02EH,0B7H;2069 DB 005H ,02DH, 04BH;2070 DB 08AH, 095H, 0BFH;2071 DB 00AH, 095H, 053H;2072 DB 00BH, 04AH, 047H;2073 DB 06BH, 055H, 03BH;2074 DB 00AH, 0D5H, 04FH;2075 DB 005H, 05AH, 045H;2076 DB 04AH, 05DH, 038H;2077
課程設計報告
DB 00AH, 05BH, 04CH;2078 DB 005H, 02BH, 042H;2079 DB 03AH, 093H, 0B6H;2080 DB 006H, 093H, 049H;2081 DB 077H, 029H, 0BDH;2082 DB 006H, 0AAH, 051H;2083 DB 00AH, 0D5H, 046H;2084 DB 054H, 0DAH, 0BAH;2085 DB 004H, 0B6H, 04EH;2086 DB 00AH, 057H, 043H;2087 DB 045H, 027H, 038H;2088 DB 00DH, 026H, 04AH;2089 DB 08EH, 093H, 03EH;2090 DB 00DH, 052H, 052H;2091 DB 00DH, 0AAH, 047H;2092 DB 066H, 0B5H, 03BH;2093 DB 005H, 06DH, 04FH;2094 DB 004H, 0AEH, 045H;2095 DB 04AH, 04EH, 0B9H;2096 DB 00AH, 04DH, 04CH;2097 DB 00DH, 015H, 041H;2098 DB 02DH, 092H, 0B5H;2090
課程設計報告
DB 00DH, 053H, 049H;2100 TIME_WEEK1 DATA 52H WEEK: MOV A, TIME_YEAR MOV B, #16 DIV AB MOV TEMP_BYTE1, B MOV B, #10 MUL AB ADD A, TEMP_BYTE1 MOV TEMP_BYTE1, A MOV A, TIME_MONTH JB ACC.7, GETW02 MOV A, #100 ADD A, TEMP_BYTE1 MOV TEMP_BYTE1, A MOV A, TIME_MONTH CLR ACC.7 GETW02: JNB ACC.4, GETW04 ADD A , #10 CLR ACC.4 GETW04: MOV TEMP_BYTE2,A
課程設計報告
MOV A, TIME_DATA MOV B, #16 DIV AB MOV TEMP_BYTE3, B MOV B, #10 MUL AB ADD A, TEMP_BYTE3 MOV TEMP_BYTE3, A MOV A ,TEMP_BYTE1 ANL A, #03H JNZ GETW10 MOV A, TEMP_BYTE2 CJNE A, #3,GETW06 GETW06: JNC GETW10 DEC TEMP_BYTE3 GETW10: MOV A,TEMP_BYTE2 LCALL GET_CORRECT ADD A, TEMP_BYTE1 MOV B, #7 DIV AB
MOV A, TEMP_BYTE1
課程設計報告
ANL A, #0FCH RR A RR A ADD A, B ADD A, TEMP_BYTE3 MOV B, #7 DIV AB MOV A, B CJNE A, #0,OUTOUT MOV B, #8 OUTOUT: MOV TIME_WEEK, B RET GET_CORRECT: MOVC A, @A+PC RET DB 0,3,3,6,1,4,6,2,5,0,3,5 END 系統仿真及調試
課程設計報告 仿真結果及分析
課程設計報告
上圖為運行時的顯示,左邊兩個數碼管顯示器顯示的是年、月、日,中間的顯示的是時、分、秒,右邊顯示的是農歷日期以及星期。若想要調試時間,可通過右下方兩個并聯開關調試,左邊開關調試數碼管顯示位置,右邊的調試增1。此刻是2013年11月29日下午15:02,星期五,時間準確。訓練體會
在整個單片機課程設計中,想要做出這個完整的設計過程,必須突破幾個難點:
1、元件得找準卻,6路驅動可以用74LS244代替。
2、連線不能連錯,對應的輸入輸出端標上序號。
3、程序代碼不能敲錯。
4、由于單管顯示的星期數不穩定,可以采用雙管顯示。參考文獻:單片機課程設計指導。
第三篇:萬年歷C語言課程設計報告
程序實踐報告
任務分配:
1、頭文件,定義常量,全局變量,自定義函數和打印輸出模塊。即1~50和140~290
2、功能控制模塊和一部分日歷顯示模塊,即50~140和290~400
3、一部分日歷顯示模塊和鍵值獲取模塊,即400~
1、基本思路
功能模塊圖
本系統包括4個模塊,分別是功能控制模塊、打印輸出模塊、日歷顯示模塊和鍵值獲取模塊。(1)功能控制模塊。該模塊用于實現日期有效性檢查、判斷是否是閏年和返回指定日期對應的星期。
(2)打印輸出模塊。該模塊主要是進行輸出顯示,包括打印指定個數的空格、打印分隔線、打印用戶使用手冊、打印當前日期對應的星期以及打印給定的星期。
(3)日歷顯示模塊。該模塊是系統的核心模塊,是用來顯示指定日期所在月份的月歷。(4)鍵值獲取模塊。該模塊接受鍵盤操作,獲取鍵值,來進行日期調整,并調用日歷顯示模塊中的函數來顯示調整后的日歷。
日歷顯示模塊
日歷顯示是系統的核心模塊,它控制著日歷的生成和顯示。其實現流程如圖所示。程序輸入的是包含年月日(year,month和day)的日期,輸出month所在月份的月歷,并突出顯示day所在的日期和year是否是閏年的標識。程序首先根據year判斷其是否是閏年,如果是則需要將該年2月份的天數設置為29天,接著判斷day是否超過month所在月份的最大天數,如果超過則顯示系統日期所在的月歷。然后進行星期輸出的判斷,如果輸出的是該月的第一個星期,則判斷該星期中還有幾天在本月(如,該月1號是星期五,則表示該月第一個星期中只有兩天在本月,星期一到星期四在上月,則星期一到星期四在本月就不輸出,僅有空格表示),輸出空格。輸出完第一周后,接著輸出第二到第五(或者六)周,每周7天。在輸出過程中,如果遇到了day所在的日期,則突出顯示。
鍵值獲取流程圖
鍵值獲取實現的是從鍵盤調整日期并顯示調整后的月歷。其實現流程如圖所示。系統首先判斷從鍵盤輸入的值,如果是右移鍵,表示增加月份。此時,如果當前月份是12月,則增加月份后就進入下一年的一月;如果是左移鍵,表示減少月份。此時,如果當前月份是1月,則減少月份后就進入上一年的12月;如果是上移鍵表示增加年份,直接年份加1即可;如果是下移鍵表示減少奶奶分,直接年份減1即可;如果是向上翻頁鍵表示減小日期。如果是1月1號,則減少日期后進入上一年的12月31號,如果是某一個月的1號,則減小日期后進入上一月的最后一天;如果是向下翻頁鍵表示增加日期。如果是12月31號,則增加日期后進入到下一年的1月1號,如果是某一個月的最后一天,則增加日期后進入到下一個月的第一天;如果是Q/q鍵表示查詢日期,此時將輸出提示信息,提示用戶輸入查詢日期。在用戶輸入查詢日期后,系統就愛那個調用日期檢查函數對輸入日期的合法性進行檢測,如果輸入日期不合格,則提示錯誤信息并顯示當前系統日期所在月的月歷;如果是空格鍵表示重置,顯示當前系統日期所在月的月歷;如果是Esc鍵表示退出系統,按此鍵后,系統將詢問用戶是否確定退出,在得到確定回答(用戶輸入Y/y)后將退出系統。
2、函數功能描述
1)checkDate()函數原型:void checkDate()checkDate()函數用于檢查輸入日期的合法性,包括檢查輸入日期中的年、月、日部分。對于
年,檢查其是否是負數或者是0;對于月,檢查其是否是范圍在1~12中的值;對于日,檢查其是否是范圍在1~31中的值。如果有一個部分不合法,則程序提示用戶。2)isLeapyear()函數原型:int isLeapyear(int year)isLeapyear()函數用于判斷制定月份是否是閏年。參數year為待判斷的年份。3)getWeek()函數原型:int getWeek(int year,int month,int day)getWeek()函數用于計算并返回給定日期對應的星期。其中參數year、month和day都為整型,分別表示輸入的年、月和日。4)printSpace()函數原型:void printSpace(int n)printSpace()函數用于輸出制定個數的空格。其中整型參數n表示需要輸出的空格的個數。5)printSepatator()函數原型:void printSeparator()printSeparator()函數用于在制定位置輸出用戶使用手冊。輸出位置在函數中已經設定。7)printWeek()函數原型:void printWeek()printWeek()函數用于輸出當前日期對應的星期,即由 currentYear,currentMonth和currentDay確定的日期對應的星期。該函數首先調用getWeek()函數返回當前日期對應的星期。8)printWeek2()函數原型:void printWeek2(int week)printWeek2()函數用于根據制定值輸出星期。參數week是一個整型變量,其值可取0到6,分別表示星期一到星期日。8)showCalendar()函數原型:void showCalendar(int year,int month,int day)showCalendar()函數用于顯示日歷。參數year,month和day分別表示年、月和日。該函數顯示year所在年是否是閏年,顯示month所在月的月歷,突出顯示day所在日的日期。
10)getKeyValue()函數原型:void getKeyValue()getKeyValue()函數用于獲取鍵盤的輸入。根據鍵盤的輸入(上下移鍵、左右移鍵、上下翻頁鍵、Q/q鍵)調整當前日期,并顯示當前日期所在月的月歷等。
4、遇到的問題和相應的解決措施
1.dos.h頭文件不能在常用的Visual C++里使用。若使用Turbo C,則鍵入的漢字無法顯示,且無法復制粘貼。
解決措施:經過上網查詢和詢問同學,知道了導致問題的原因,但若把dos.h在visual c++中換成time.h,過程太復雜,很難實現。最后,我們跟同學借了一個win-TC,是C語言程序,且可以使用中文和進行復制粘貼;2.鍵入程序代碼的時候顯示“非法字符’?(0xa3)在showCalender函數中”
解決措施:把showCalender函數全部檢查一遍也沒有找出問題所在,然后咨詢老師,經驗豐富的老師一眼看出函數中的一個左括號是用拼音輸出的,不是英文;3.程序可以運行,但應該只顯示一個向下箭頭的地方顯示了三行,且覆蓋了其他的字符。
解決措施:認真的又檢查了一遍,發現“指定輸出字符為向下的箭頭”的函數中,_CX=01,寫成了_CH=01;4.萬年歷需要獲取系統時間,不知從何下手。
解決措施:經查閱資料,得知應用:currentYear=sysTime.da_year;
currentMnth=sysTime.da_mon;
currentDay=sysTime.da_day;
5、心得體會
經歷了這次課程設計的設計和制作的整個過程,我們才發現我們知識的貧乏和知識面的狹窄,原本以為不就是一個小小的課程設計,小case,很容易就可以搞定,可是到了后來實際的操作的時候可是花費了我們九牛二虎之力,不說其他的,只說時間上面,我們就花費了大把的時間,當然我們也從中體會了很多平時不能收獲的東西。經過一個多月的自主上機和三個多星期的大作業編寫,我們一隊三人的齊心努力,查閱書籍,上網查詢等各種途徑,完成了這次的大作業編寫。其中遇到了很多問題,一一解決的過程讓我們學會了很多,當然有很多最初的構想沒有實現,這也是我們的遺憾之處。
這次作課程設計我們也是收獲很大,我們更深入的體會到團隊的重要性,通過自學學到了更多C語言的編譯,如插入顏色,讀取系統時間等,這會是我們終身的財富。
首先,我們對C語言有了更深的了解,使用起來也更加的熟練,原來有一些不知道和不熟悉的函數,我們學會用了。其次,我們這一次找了不少的資料,找專業的書籍、上網找各方面的資料,也使我們學到了一些書本中學不到的知識,讓我們長了見識。同時我們同學之間也互相的探討,也增進了我們同學之間的感情。這次的萬年歷設計,雖然我們自己覺的很有的成就感,但是這必竟是我們第一次C語言的課程設計,必然會有很多的不足之處有待改進,相信以后我們一定會做的更好。
同時也感謝老師們的耐心講解與指導,我們期待下一次可以做的更好!
【程序代碼】 /*加載頭文件*/ #include
/*定義常量*/ /*左移鍵*/ #define LEFT 0x4b00 /*右移鍵*/ #define RIGHT 0x4d00 /*下移鍵*/ #define DOWN 0x5000 /*上移鍵*/
#define UP 0x4800 /*向上翻頁鍵*/ #define PAGEUP 0x4900 /*向下翻頁鍵*/ #define PAGEDOWN 0x5100 /*小寫字母q*/ #define QLOWER 0x1071 /*大寫字母Q*/ #define QUPPER 0x1051 /*空格鍵*/ #define SPACE 0x3920 /*Esc鍵*/ #define ESC 0x011b
/*定義全局變量*/ struct date sysTime;int currentYear;int currentMonth;int currentDay;int n_currentMon;int n_lastMon;
/*--------------------------自定義函數-------------------------*/ void checkDate();int isLeapyear(int year);int getWeek(int year,int month,int day);void printSpace(int n);void printSaparator();void printUsage();void printWeek();void printWeek2(int week);void showCalendar(int year,int month,int day);void getKeyValue();
welcome(){ int i, graphdriver,graphmode,size,page;char s[30];graphdriver=DETECT;initgraph(&graphdriver,&graphmode,“");cleardevice();setbkcolor(BLUE);
setviewport(40,40,600,440,1);setfillstyle(1,2);setcolor(YELLOW);rectangle(1,1,560,400);floodfill(50,50,14);rectangle(20,20,540,380);setfillstyle(1,13);
/*
開圖視口
*/ /*
用綠色填畫出的矩形框
*/
floodfill(2l,300,14);setcolor(BLACK);settextstyle(1,0,6);/*
用淡洋紅色填畫出的矩形框
*/ /*
設要顯示字符串的字形方向,尺寸
*/ outtextxy(100,60,”Welcom you“);setviewport(100,150,540,380,0);/*
又開一窗口 */ setcolor(14);setfillstyle(1,10);rectangle(20,20,420,120);settextstyle(2,0,9);floodfill(21,100,14);/*
用深藍色填充
*/ sprintf(s,”Hey girl!Do you want to know?“);
/*
將字符串存到 s 字符數組*/
setcolor(1);settextstyle(10,0,10);/*
設選用字形 4,放大 3 倍,水平設置
*/ outtextxy(110,80,s);
/*
顯示 s 字符串
*/ getch();closegraph();} /*功能控制模塊*/ /*檢查日期有效性函數*/ void checkDate(){ /*如果給定的日期中年份部分為負數或者0*/ if(currentYear<=0){ gotoxy(1,27);printf(”The year should be a positive number!n“);gotoxy(1,28);printf(”Press any key to comtinue.......“);getchar();
getchar();/*以當前系統時間重新賦值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} /*如果給定的日期中月份部分為負數,為0或者大于12*/ if(currentMonth>12||currentMonth<1){gotoxy(1,27);printf(”The month should be a number between 1 and 12!n“);gotoxy(1,28);printf(”Press any key to continue......“);getchar();getchar();/*以當前系統時間重新賦值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} /*如果給定的日期中天數部分為負數,為0或者大于31*/ if(currentDay>31||currentDay<1){ gotoxy(1,27);printf(”The day should be a number between 1 and 31!n“);gotoxy(1,28);printf(”Press any key to continue......“);getchar();getchar();/*以當前系統時間重新賦值*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;} }
/*判斷是否是閏年函數*/ int isLeapyear(int year){
/*閏年的判斷:(1)year被4整除,并且year不被100整除
或(2)year被4整除,并且被400整除*/
if(year%4==0&&year%100||year%400==0)
return 1;
else
return 0;} /*根據給定日期計算星期函數*/ int getWeek(int year,int month,int day){
int leapFlag;
int week;
int i;
/*該數組用于保存每個月的天數*/
int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int count=0;
/*判斷給定年份是否是閏年*/
leapFlag=isLeapyear(year);
/*如果是閏年則2月份的日期應該為29天*/
if(leapFlag==1)
a[2]++;
/*計算從給定年份的1月1日到給定月份的1號之間的天數*/
for(i=1;i { count+=a[i]; } /*計算從給定年份的1月1日到給定日期之間的天數*/ count+=day; /*計算星期*/ week=(year+1+(year-1)/4+(year-1)/100+(year-1)/400+count)%7; return week;} /*打印輸出模塊*/ /*輸出指定個數空格函數*/ void printSpace(int n){ int i; for(i=0;i printf(” “);} /*輸出分割線函數*/ void printSeparator(){ int i; for(i=0;i<38;i++) { printf(”=“); } printf(”n“);} /*輸出使用方法函數*/ void printUsage(){ gotoxy(45,3); /*設定字體顏色*/ textcolor(YELLOW); /*送格式化輸出至屏幕*/ cprintf(”-----------Usage-----------“); gotoxy(45,5); textcolor(YELLOW); cprintf(”YEAR“); gotoxy(50,5); printf(” Up key()to increase;n“); gotoxy(50,7); printf(” Down key()to decrease.n“); gotoxy(45,9); textcolor(YELLOW); cprintf(”MONTH:“); gotoxy(50,9); printf(” Right key()to increase;n“); gotoxy(50,11); printf(” Left key()to decrease.n“); gotoxy(45,13); textcolor(YELLOW); cprintf(”DAY“); gotoxy(50,13); printf(” PageDown key to increase;n“); gotoxy(50,15); printf(” PageUp key to decrease.n“); gotoxy(45,17); textcolor(YELLOW); cprintf(”QUERY“); gotoxy(50,17); printf(” Q/q keyn“); textcolor(YELLOW); gotoxy(45,19); cprintf(”RESET“); gotoxy(50,19); printf(” SPACE key.n“); gotoxy(45,21); textcolor(YELLOW); cprintf(”EXIT“); gotoxy(50,21); printf(” Esc keyn“); gotoxy(59,5); /*設置寄存器,表示在指定位置輸出一次指定的字符*/ _CX=01; _AH=0xa; /*指定輸出字符為向上的箭頭*/ _AL=24; /*產生一次中斷,輸出向上的箭頭*/ geninterrupt(0x10); gotoxy(61,7); _CX=01; _AH=0xa; /*指定輸出字符為向下的箭頭*/ _AL=25; geninterrupt(0x10); gotoxy(62,9); _CX=01; _AH=0xa; _AL=26; /*指定輸出字符為向右的箭頭*/ geninterrupt(0x10); gotoxy(61,11); _CX=01; _AH=0xa; /*指定輸出字符為向左的箭頭*/ _AL=27; geninterrupt(0x10); /*還原字體顏色*/ textcolor(7);} /*根據系統日期輸出星期函數*/ void printWeek(){ int day; /*根據日期獲得星期*/ day=getWeek(currentYear,currentMonth,currentDay); textcolor(11); /*輸出星期,0表示星期天,1表示星期一??6表示星期六*/ if(day==0) cprintf(”%d-%d-%d,Sunday!“,currentYear,currentMonth,currentDay); if(day==1) cprintf(”%d-%d-%d,Monday!“,currentYear,currentMonth,currentDay); if(day==2) cprintf(”%d-%d-%d,Tuesday!“,currentYear,currentMonth,currentDay); if(day==3) cprintf(”%d-%d-%d,Wednesday!“,currentYear,currentMonth,currentDay); if(day==4) cprintf(”%d-%d-%d,Thursday!“,currentYear,currentMonth,currentDay); if(day==5) cprintf(”%d-%d-%d,Friday!“,currentYear,currentMonth,currentDay); if(day==6) cprintf(”%d-%d-%d,Saterday!“,currentYear,currentMonth,currentDay); textcolor(7);} /*輸出指定星期函數*/ void printWeek2(int week){ if(week==0) cprintf(”,Sunday“); if(week==1) cprintf(”,Monday“); if(week==2) cprintf(”,Tuesday“); if(week==3) cprintf(”,Wendesday“); if(week==4) cprintf(”,Thursday“); if(week==5) cprintf(”,Friday“); if(week==6) cprintf(”,Staturday“);} /*日歷顯示模塊*/ /*顯示日歷函數*/ void showCalendar(int year,int month,int day){ int i; int j; /*輸出的日期*/ int outDay; int leapFlag; /*本月第一個星期中,在上月的天數*/ int dayLastMon; int week; /*該數組用于保存每個月的天數*/ int a[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; outDay=0; dayLastMon=0; week=0; /*判斷給定年份是否是閏年*/ leapFlag=isLeapyear(year); /*如果是閏年則2月應該是29天*/ if(leapFlag==1) { a[2]++; } /*如果給定的日期中,天數大于該月的最大天數*/ if(day>a[month]) { printf(”The number of this month's day is %d at most!n“,a[month]); printf(”press any key to continue.....n“); getchar(); getchar(); /*以當前系統時間重新賦值*/ year=sysTime.da_year; month=sysTime.da_mon; day=sysTime.da_day; currentYear=sysTime.da_year; currentMonth=sysTime.da_mon; currentDay=sysTime.da_day; } /*當前月的天數*/ n_currentMon=a[month]; /*上一月的天數*/ n_lastMon=a[month-1]; /*根據給定日期,獲取給定月份1號的星期*/ week=dayLastMon=getWeek(year,month,1); /*清除文本模式窗口*/ clrscr(); printf(”nThe calendar of %d:“,year); textcolor(10); /*顯示給定是否是閏年*/ if(leapFlag==1) cprintf(”[leap year]“,year); if(leapFlag==0) cprintf(”[not leap year]“,year); printf(”n“); textcolor(7); printSeparator(); textcolor(YELLOW); /*輸出月份提示,1~12分別表示1月到12月*/ switch(month) { case 1: cprintf(”January 1“); break; case 2: cprintf(”Fabruary 2“); break; case 3: cprintf(”March 3“); break; case 4: cprintf(”April 4“); break; case 5: cprintf(”May 5“); break; case 6: cprintf(”June 6“); break; case 7: cprintf(”July 7“); break; case 8: cprintf(”August 8“); break; case 9: cprintf(”September 9“); break; case 10: cprintf(”October 10“); break; case 11: cprintf(”November 11“); break; case 12: cprintf(”December 12“); break; } textcolor(7); printf(”nn“); textcolor(13); cprintf(”Sun Mon Tue Wed Thu Fri Sat“); textcolor(7); printf(”nn“); /*因為一個月中最多跨度6個星期,所以循環從0到5*/ for(i=0;i<6;i++) { /*如果是該月的第一星期*/ if(i==0) { /*第一個星期中還要7-daylastmon天本月,有daylastmon天在上個月,所以輸出 daylastmon*4個空格符,每個日期在日歷中占用4個空格*/ printSpace(dayLastMon*4); /*剩余在本月的第一個星期中的天數為7-dayLastmon*/ for(j=0;j<7-dayLastMon;j++) { /*到達day的前一天時,輸出++outDay*/ if(outDay==day-1) { /*黃色字體突出顯示*/ textcolor(YELLOW); cprintf(”[%d]“,++outDay); textcolor(7); } /*到達day當天時,并且不是星期天*/ else if(outDay==day&&week!=0) { printf(”%3d“,++outDay); } /*到達day當天時,并且是星期天*/ else { printf(”%4d“,++outDay); } /*計算當天的星期,如果前一天時星期六(6),當天時星期天(0),其他情況則直 接星期加1*/ week=(week<6)?week+1:0; } printf(”nn“); } /*如果不是該月的第一個星期*/ else { /*則輸出該星期中的7天*/ for(j=0;j<7;j++) { /*輸出的天數小于該月的最大天數*/ if(outDay { /*到達day的前一天時,輸出++outDay*/ if(outDay==day-1) { /*輸出一位數字*/ if(outDay<9) { textcolor(YELLOW); cprintf(”[%d]“,++outDay); textcolor(7); } /*輸出兩位數字*/ else { textcolor(YELLOW); cprintf(”[%2d]“,++outDay); textcolor(7); } } /*到達day當天時,并且不是星期天*/ else if(outDay==day && week!=0) { printf(”%3d“,++outDay); } /*到達day當天時,并且是星期天*/ else { printf(”%4d“,++outDay); } } /*計算當天星期*/ week=(week<6)?week+1:0; } printf(”nn“); if(outDay==a[month])break;} } /*輸出分割線*/ printSeparator(); /*輸出當前選擇的日期和星期*/ printf(”The day you choose is:nn“);printWeek();gotoxy(1,22);textcolor(10);cprintf(”--------------------n“);textcolor(7); /*輸出系統日期和星期*/ printf(”nToday is: %d-%d-%d“,sysTime.da_year,sysTime.da_mon,sysTime.da_day);printWeek2(getWeek(sysTime.da_year,sysTime.da_mon,sysTime.da_day));printf(”nn“);/*顯示按鍵操作*/ printUsage();gotoxy(1,25);} /*鍵值獲取模塊*/ /*通過鍵盤調整日期函數*/ void getKeyValue() { int key;char ch;/*默認顯示當前系統日期和星期*/ currentYear=sysTime.da_year;currentMonth=sysTime.da_mon;currentDay=sysTime.da_day;showCalendar(currentYear,currentMonth,currentDay); while(1){ /*獲取鍵值,根據鍵值調整日歷輸出*/ key=bioskey(0); /*右移鍵,增加月份*/ if(key==RIGHT) { /*月份值在1~12之間,則直接加1*/ if(currentMonth<12 && currentMonth>=1) { currentMonth++; } /*如果月份為12,則加1后進位,即年份加1,月份變為1*/ else { currentYear++; currentMonth=1; } } /*左移鍵,減少月份*/ if(key==LEFT){ /*月份值在1~12之間,則直接減1*/ if(currentMonth<=12 && currentMonth>1) { currentMonth--; } /*如果月份為1,則減1后,到上一年,月份變為12*/ else { currentYear--; currentMonth=12; } } /*上移鍵,增加年份*/ if(key==UP){ currentYear++;} /*下移鍵,減少年份*/ if(key==DOWN){ currentYear--;} /*上移鍵,減少天數*/ if(key==PAGEUP){ /*當前日不是該月的第一天,則天數直接減1*/ if(currentDay!=1) { currentDay--; } /*當前日是該月的第一天,并且是該年的第一個月(即1月1日),則天數減1后,變為上一年的最后一個月的最后一天(即12月31日)*/ else if(currentDay==1 && currentMonth==1) { currentYear--; currentMonth=12; currentDay=31; } /*當前日是該年中某一個月的第一天,則天數減一后,變為上個月的最后一天*/ else { currentMonth--; currentDay=n_lastMon; } } /*下移鍵,增加天數*/ if(key==PAGEDOWN){ /*當前日不是該月的最后一天,則天數直接加1*/ if(n_currentMon!=currentDay) { currentDay++; } /*當前日是該年的最后一天(即12月31日),則天數加1后,變為下一年的第一個月的第一天(即1月1日)*/ else if(n_currentMon==currentDay && currentMonth==12) { currentYear++; currentMonth=1; currentDay=1; } /*當前日是該年中某一個月的最后一天,則天數加1后,變為下個月的第一天*/ else { currentMonth++; currentDay=1; } } /*Q或者q鍵,表示查詢指定日期的星期*/ if(key==QLOWER||key==QUPPER){ { printf(”Input date(eg,%d-%d-%d):“,sysTime.da_year,sysTime.da_mon,sysTime.da_day); scanf(”%d-%d-%d“,¤tYear,¤tMonth,¤tDay); checkDate(); } } /*空格鍵,重置到系統日期*/ if(key==SPACE) { currentYear=sysTime.da_year; currentMonth=sysTime.da_mon; currentDay=sysTime.da_day; } /*Esc鍵退出系統*/ if(key==ESC) { printf(”Do you really want to quit?(Y/N)“); ch=getchar(); if(ch=='y'||ch=='Y') break; } showCalendar(currentYear,currentMonth,currentDay); } } void printtext(unsigned char *temp[],int i){ setcolor(4); /*設置顏色*/ settextstyle(TRIPLEX_FONT,HORIZ_DIR,3);/*設置字符的字體,方向和大小*/ outtextxy(100,40+i*50,temp[i]); /*在所指定的坐標出顯示字符串*/ } /*主函數*/ void main(){ int i,graphdriver,graphmode; unsigned char *temp[4]; int freq[96]={659,587,659,587,659,494,587,523,440,330,440,494,330,494,523,659,587,659,587,659,494,587,523,440,330,440,494,330,523,494,440,440,494,523,587,659,659,330,699,659,587,587,330,659,587,523,523,330,587,523,494,494}; int dely[96]={50,50,50,50,50,50,50,50,100,50,50,100,50,50,100,50,50,50,50,50,50,50,50,100,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100,50,50,50,50,100}; graphdriver=DETECT; graphmode=0; temp[0]=”Welcome!“; temp[1]=”Please press any key to start the music......“; temp[2]=”Do you like it?“; temp[3]=”Press any key to end the music!“; temp[4]=”Welcome to calendar“; initgraph(&graphdriver,&graphmode,”"); /*系統初始化*/ cleardevice(); /*清除屏幕*/ settextjustify(LEFT_TEXT,CENTER_TEXT); /*設置字符排列方式*/ for(i=0;i<2;i++) printtext(temp,i); getch(); for(i=2;i<4;i++) printtext(temp,i); i=0; while(i<96&&!kbhit()) { sound(freq[i]); /*揚聲器根據頻率發聲*/ delay(1100*dely[i]); /*聲音延時*/ i++; } nosound(); /*關閉揚聲器*/ printtext(temp,4); getch(); closegraph(); welcome(); window(1,1,80,25); textbackground(0); textcolor(WHITE); /*清除文本模式窗口*/ clrscr(); /*設置屏幕顯示方式*/ _AL=03; _AH=0; geninterrupt(0x10); getdate(&sysTime); getKeyValue();} /*關閉圖形模式*/ 《電子系統設計自動化》課程設計報告 學 院: 機電工程學院 題 目: 數字時鐘電路設計 課 程: 《電子系統設計自動化》課程設計 專業班級: 電信10級2 班 學生姓名: 劉星 秦玉杰 王艷艷 學 號: 1004101035 1004101036 1004101038 完成日期:2013年 12 月 27 日 摘要: EDA(Electronic Design Automation)電子設計自動化,就是以大規模可編程器件為設計載體,以硬件描述語言為系統邏輯描述的主要表達方式,通過相關的軟件,自動完成用軟件方式設計的電子系統到硬件系統,最終形成集成電子系統或專用集成芯片。本次實習利用QuartusII為設計軟件、VHDL為硬件描述語言,結合所學的數字電路的知識設計一個24時多功能數字鐘,具有正常時、分、秒計時,動態顯示,清零、快速校時校分、整點報時、花樣顯示等功能。利用硬件描述語言VHDL對設計系統的各個子模塊進行邏輯描述,采用模塊化的設計思想完成頂層模塊的設計,通過軟件編譯、邏輯化簡、邏輯分割、邏輯綜合優化、邏輯布線、邏輯仿真,最終將設計的軟件系統下載設計實驗系統,對設計的系統進行硬件測試。 一、課程設計基本要求和任務 《EDA課程設計》是繼《模擬電子技術基礎》、《數字電子技術基礎》課程后,電信專業學生在電子技術實驗技能方面綜合性質的實驗訓練課程,是電子技術基礎的一個部分。1.1 目的和任務 (1)通過課程設計使學生能熟練掌握一種EDA軟件(QUARTUSII)的使用方法,能熟練進行設計輸入、編譯、管腳分配、下載等過程,為以后進行工程實際問題的研究打下設計基礎。 (2)通過課程設計使學生能利用EDA軟件(QUARTUSII)進行至少一 個電子技術綜合問題的設計,設計輸入可采用圖形輸入法或VHDL硬件描述語言輸入法。(3)通過課程設計使學生初步具有分析、尋找和排除電子電路中常見 故障的能力。 (4)通過課程設計使學生能獨立寫出嚴謹的、有理論根據的、實事求是的、文理通順的字跡端正的課程設計報告。1.2 功能要求: (1)具有時、分、秒計數顯示功能,以24小時循環計時。(2)時鐘計數顯示時有LED燈的花樣顯示。(3)具有調節小時、分鐘、秒及清零的功能。(4)具有整點報時功能。 1.3 總體方框圖: 本系統可以由秒計數器、分鐘計數器、小時計數器、整點報時、分的調整以及小時的調整和一個頂層文件構成。采用自頂向下的設計方法,子模塊利用VHDL語言設計,頂層文件用原理圖的設計方法。顯示:小時采用24進制,而分鐘均是采用6進制和10進制的組合。1.4 設計原理: 數字鐘電路設計要求所設計電路就有以下功能:時、分、秒計時顯示,清零,時、分調節,整點報時及花樣顯示。分、秒計時原理相似,可以采用60進制BCD碼計數器進計時;小時采用24進制BCD碼進行計時;在設計時采用試驗電路箱上的模式7電路,不需要進行譯碼電路的設計;所設計電路具有驅動揚聲器和花樣顯示的LED燈信號產生。試驗箱模式7的電路如圖一所示:圖一模式七實驗電路圖 1.5 性能指標及功能設計: (1)時鐘計數:完成時、分、秒的正確計時并且顯示所計的數字;對秒、分——60進制計數,即從0到59循環計數,時鐘——24進制計數,即從0到23循環計數,并且在數碼管上顯示數值。 2.2 模塊劃分自頂向下分解 2.3 模塊描述 時鐘計時模塊完成時、分、秒計數,及清零、調節時和分鐘的功能。時、分、秒計數的原理相同,均為BCD碼輸出的計數器,其中分和秒均為六十進制BCD碼計數器,小時為二十四進制BCD碼計數器。設計一個具有異步清零和設置輸出功能的六十進制BCD碼計數器,再設計一個具有異步清零和設置輸出功能的二十四進制計數器,然后將它們通過一定的組合構成時鐘計時模塊。各個輸入/輸出端口的作用為: (1)clk為計時時鐘信號,reset為異步清零信號; (2)sethour為小時設置信號,setmin為分鐘設置信號;(3)daout[5?0]為小時的BCD碼輸出, daout[6...0]為秒和分鐘的BCD碼輸出,enmin和enhour為使能輸出信號。 (4)在時鐘整點的時候產生揚聲器驅動信號和花樣顯示信號。由時鐘計時模塊中分鐘的進行信號進行控制。當contr_en為高電平時,將輸入信號clk送到輸出端speak用于驅動揚聲器,同時在clk的控制下,輸出端lamp[2..0]進行循環移位,從而控制LED燈進行花樣顯示。輸出控制模塊有揚聲器控制器和花樣顯示控制器兩個子模塊組成 2.4 頂層電路圖 頂層文件是由四個模塊組成,分別是時、分、秒計數器和報警的VHDL語言封裝而成。經過鎖定引腳再重新編譯獲得如下頂層原理電路圖: 三、方案實現 3.1 各模塊仿真及描述 (1)秒計數器模塊仿真圖:將標準秒信號送入”秒計數器”,秒計數器采用60進制計數器,每累計60秒發出一個分脈沖信號,該信號將作為分計數器的時鐘脈沖,daout代表秒輸出。 (2)分計數器電路仿真圖:也采用60進制計數器,每累計60分鐘,發出一個時脈沖信號,該信號將被送到時計數器,daout端口代表分鐘輸出 (3)小時計數器電路仿真圖:時計數器采用12進制計時器,可實現對24小時累 計。每累計12小時,發出一個脈沖信號。 引腳配置完成后再進行一次全程編譯,無誤則可以下載到試驗箱上進行硬件測試。硬件驗證的方法如下:選擇實驗模式7;時鐘脈沖clk與clock0(1024Hz)信號相連;鍵8和鍵5均為低電平,時鐘正常計時,數碼管1和2顯示秒,數碼管4和5顯示分鐘,數碼管7和8顯示小時;鍵8為高電平時,時鐘清零;鍵5為高電平時,按下鍵7和鍵4進行調時調分操作;當時鐘為整點的時候,三個發光二極管進行循環移位操作,同時揚聲器發聲。 五、心得體會 經過源程序的編輯、邏輯綜合、邏輯適配、編程下載成功后,在EDA實驗開發系統進行硬件驗證時卻發現實驗結果不正確,揚聲器無法發聲。經檢查,自己設計的管腳文件有錯。將管腳鎖定文件修改后,重新進行邏輯適配、編程下載成功后,實驗結果仍然不正確,百思不得其解。無奈之下,決定重頭開始排查每一步的細節,確定各個模塊的功能完全實現并且頂層模塊功能正確。修改之后,重新進行邏輯適配、編程下載驗證,實驗結果完全正確。 這次EDA課程設計歷時兩個星期,在整整兩個星期的日子里,不僅鞏固了以前所學過的知識,而且學到了很多書本上學不到的知識,同時鍛煉了自己的能力,使自己對以后的路有了更加清楚的認識,對未來有了更多的信心。這次課程設計,進一步加深了我對EDA的了解,使我對QuartusII的基本操作有所了解,使我對應用軟件的方法設計硬件系統有了更加濃厚的興趣。通過這次課程設計,我懂得了理論與實際相結合的重要性,只有理論知識是遠遠不夠的,只有把所學的理論知識與實踐相結合,從實踐中得出結論,才能真正提高自己的實際動手能力和獨立思考的能力。在設計的過程中,我遇到許多問題,畢竟是第一次應用VHDL進行硬件電路系統的設計,許多EDA的知識還沒有充分的掌握,遇到困難也是在所難免的,同時發現了自己的不足之處:學習知識表面化,沒有深入了解它們的原理。總的來說,這次設計的數字時鐘電路還是比較成功的,盡管在設計中遇到了很多問題,最后在老師的辛勤指導、同學的幫助和自己不斷思考下,終于迎刃而解,有點小小的成就感,覺得平時所學的知識有了實用的價值,達到了理論與實際相結合的目的。最后,對給過我幫助的所有同學和指導老師再次表示忠心的感謝! 參考文獻 [1] 崔健明.《電子電工EDA仿真技術》 高等教育出版社 2000年 [2] 盧杰,賴毅.《VHDL與數字電路設計》 科學出版社 2001年 [3] 潘松,黃繼業.《EDA技術實用教程》 科學出版社 2002年 [4] 朱運利.《EDA技術應用》 電子工業出版社 2004年 [5] 張明.《VHDL實用教程》 電子科技大學出版社 1999年 [6] 彭介華.《電子技術課程設計與指導》 高等教育出版 1997年 LIBRARY IEEE; USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;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分時的進位信號 BEGIN--enmin_2由clk調制后的手動調時脈沖信號串 daout<=count;enhour_2<=(sethour and clk1);--sethour為手動調時控制信號,高電平有效 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';--則置進位為1 count<=“0000000”;--count復0 ELSE count<=count+7;--若count未到59D,則加7,即作“加6校正” END IF;--使前面的16#60#的個位轉變為8421BCD的容量 ELSE count<=“0000000”;--count復0(有此句,則對無效狀態電路可自啟動)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;--沒有發生進位 ELSE count<=“0000000”;--否則,若count不小于16#60# count復0 END IF;--END IF(count(3 DOWNTO 0)=“1001”)END IF;--END IF(reset='0')END process;END fun; 3、時計數器模塊的VHDL語言: LIBRARY IEEE;use IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL; IF(clk'event and clk='1')THEN IF(dain=“0000000”)THEN speak<=count1(1);IF(count1>=“10”)THEN count1<=“00”;--count1為三進制加法計數器 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; 循環點亮三只燈 《EDA課程設計》 課程設計題目: 基于單片機的溫濕度采集系統 姓 名: xxx 學 班 時 地 號: xxxx 級: xxxx 間: 2014.4.21~ 2013.5.5 點: xxxxx 指 導 老 師: xxxxx 目錄 一、電路原理圖..................................................................................2 二、電路PCB圖(或實物圖).........................................................2 三、電路效果圖..................................................................................3 四、設計總結......................................................................................3 附錄(單片機源代碼)......................................................................4 一、電路原理圖 二、電路PCB圖(或實物圖) 三、電路效果圖 四、設計總結 EDA的實驗還是挺有趣的,比較講究動手能力,當然也不能忽略團體合作。總的來說本次實驗還是成功了,雖然每個環節都遇到了困難。在生成原理圖的過程中,就曾把導線畫成了Placeline而不是Placewire,還有芯片的引腳應該用NET符號而不是用文本符號,所以這些錯誤都導致我花在原理圖上的時間多了點。而在生成PCB電路圖的過程中遇到的困難則是自動布線之后,還有電源的幾個腳需要手動布線,所以各個元件之間的位置要布置好,以免發生短路。腐蝕的時候,由于腐蝕的時間太長了,有些碳都化開了,導致里面的銅被腐蝕掉了,所以又為我的工作增加了困難。在焊接的時候,要注意元件的正負極,還要檢測錫是否都與那些銅連接上了。最終把LED和 DHT11的程序燒進去就行了。 本次實驗我還是能多多少少學到點什么的,總的來說還是希望能有多一點這樣的實習。 附錄(單片機源代碼) //51單片機控制溫濕度傳感器DHT11 LCD1602上顯示當前機最小系統。//LCD 讀進去 寫出來 #include //定義無符號整型 #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口// //*************** 延 時 函 數************************************* void delay(uchar ms)//延時模塊//延時1毫秒 { } void delay1() //一個for循環大概需要8個多機器周期 //一個機器周期為1us晶振為12MHz也就是說本函數延時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(); //主機發出8us高電平,開始信號開始發出 dht=0; delay(25); // 主機把總線拉低必須大于18ms DHT11能檢測到起始信號 dht=1; //delay1(); //以下三個延時函數差不多為24usdelay1();delay1(); 20-40us } uchar receive_byte() //接收一個字節 8位// { uchar i,temp; for(i=0;i<8;i++)//接收8bit的數據 { while(!dht); //等待40-50us的低電平開始信號結束 delay1(); //開始信號結束之后延時26us-28us delay1();delay1(); temp=0; //時間為26us-28usif(dht==1) temp=1; //如果26us-28us '0' 數據為'1' while(dht); // '0'為26us-28us '1'為70us } data_byte<<=1; //data_byte|=temp; //接收每一位的數據,相或保存數據 return data_byte;} void receive()//接收數據// { uchar T_H,T_L,R_H,R_L,check,num_check,i;start(); //開始信號//調用開始信號子函數 dht=1; //主機設為輸入判斷從機DHT11響應信號 if(!dht) //判斷從機是否有低電平響應信號// { while(!dht);//判斷從機發出 40us 的低電平響應信號是否結束// while(dht); //判斷從機發出 40us 的高電平是否結束 如結束則從機進入發送數據狀態,主機進入數據接收狀態 數 //兩個while語句加起來就是DHT11的響應信號 R_H=receive_byte();//濕度高位 調用接受一個字節的子函 R_L=receive_byte();//濕度低位 T_H=receive_byte();//溫度高位 T_L=receive_byte();//溫度低位 check=receive_byte();//校驗位 //結束信號 dht=0; //當最后一bit數據接完畢后主機拉低電平50us// for(i=0;i<7;i++)//差不多8us的延時 delay1(); dht=1; //總線由上拉電阻拉高進入空閑狀態 num_check=R_H+R_L+T_H+T_L; if(num_check==check)//判斷讀到的四個數據之和是否與校驗位相同 { 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()//主函數模塊// { while(1) //進入死循環 { receive(); //接收數據 display(); } }第四篇:EDA 課程設計
第五篇:《EDA課程設計》