第一篇: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课程设计》