六、结论
通过本次课程设计,我学习到了很多,也收获了很多。总结如下: 一、我对单片机的理论知识有了进一步的掌握,对单片机的原理和实际应用有了更多地理解和掌握。
二、我对单片机的C语言编程有了更深刻的认识和更扎实的掌握,我们不断修改,不断尝试,对源代码各个模块的函数都有了一个非常深入的掌握。
三、理论与实践相结合才能更好的理解和掌握所学的知识。
七、课程总结
通过本次设计,让我很好的锻炼了理论联系实际,与具体项目、课题相结合开发、设计产品的能力。既让我们懂得了怎样把理论应用于实际,又让我们懂得了在实践中遇到的问题怎样用理论去解决。 在本次设计中,我们还需要大量的以前没有学到过的知识,于是图书馆和INTERNET成了我们很好的助手。在查阅资料的过程中,我们
6
要判断优劣、取舍相关知识,不知不觉中我们查阅资料的能力也得到了很好的锻炼。我们学习的知识是有限的,在以后的工作中我们肯定会遇到许多未知的领域,这方面的能力便会使我们受益非浅。 在设计过程中,总是遇到这样或那样的问题。有时发现一个问题的时候,需要做大量的工作,花大量的时间才能解决。自然而然,我的耐心便在其中建立起来了。为以后的工作积累了经验,增强了信心
八、附录(源程序)
1、小时计数器VHDL语言源程序(底层文件) LIBRARY IEEE;
use IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY hour IS
PORT(clk,reset:IN STD_LOGIC;
daout:out STD_LOGIC_VECTOR(5 DOWNTO 0)); END ENTITY hour;
ARCHITECTURE fun OF hour IS
SIGNAL count:STD_LOGIC_VECTOR(5 DOWNTO 0); BEGIN
daout<=count; PROCESS(clk,reset) BEGIN
IF(reset='0')THEN count<=\——若reset=0,则异步清零
ELSIF(clk'event and clk='1')THEN ——否则,若clk上升沿到 IF(count(3 DOWNTO 0)=\——若个位计时恰好到“1001”即9 IF(count<16#23#)THEN ——23进制
count<=count+7; ——若到23D则 else
count<=\——复0 END IF;
ELSIF (count<16#23#)THEN ——若未到23D,则count进1 count<=count+1;
ELSE ——否则清零 count<=\
END IF; ——END IF(count(3 DOWNTO 0)=“1001”) END IF; ——END IF(reset=‘0’)
7
END PROCESS; END fun;
2、分钟计数器VHDL语言源程序(底层文件) 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<=\
ELSIF(clk'event and clk='1')THEN ——否则,若clk上升沿到
IF(count (3 DOWNTO 0) =\——若个位计时恰好到“1001”即9 IF(count <16#60#) THEN ——又若count小于16#60#,即60 IF(count=\——又若已到59D enhour_1<='1'; ——则置进位为1 count<=\——count复0 ELSE
count<=count+7; ——若count未到59D,则加7,即作“加6校正” END IF; ——使前面的16#60#的个位转变为8421BCD的容量 ELSE
count<=\——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<=\——否则,若count不小于16#60# count复0 END IF; ——END IF(count(3 DOWNTO 0)=“1001”) END IF; ——END IF(reset=‘0’) END process; END fun;
8
3、秒钟计数器VHDL语言源程序(底层文件) LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL; USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY second IS
PORT( clk,reset,setmin:STD_LOGIC; enmin:OUT STD_LOGIC;
daout:OUT STD_LOGIC_VECTOR(6 DOWNTO 0)); END ENTITY second;
ARCHITECTURE fun OF second IS
SIGNAL count:STD_LOGIC_VECTOR(6 DOWNTO 0);
SIGNAL enmin_1,enmin_2:STD_LOGIC; ——enmin_1为59秒时的进位信号
BEGIN ——enmin_2由clk调制后的手动调分脉冲信号串 daout<=count;
enmin_2<=(setmin and clk); ——setmin为手动调分控制信号,高电平有效 enmin<=(enmin_1 or enmin_2); ——enmin为向分进位信号 PROCESS(clk,reset,setmin) BEGIN
IF(reset='0')THEN count<=\——若reset为0,则异步清零 ELSIF(clk 'event and clk='1')then ——否则,若clk上升沿到
IF(count(3 downto 0)=\——若个位计时恰好到“1001”即9 IF(count<16#60#)then ——又若count小于16#60#,即60H IF(count=\——又若已到59D
enmin_1<='1';count<=\——则置进位为1及count复0 ELSE ——未到59D
count<=count+7; ——则加7,而+7=+1+6,即作“加6校正” END IF;
ELSE ——若count不小于16#60#(即count等于或大于16#60#) count<=\——count复0
END IF; ——END IF(count<16#60#)
ELSIF(count<16#60#)then ——若个位计数未到“1001”则转此句再判 count<=count+1; ——若count<16#60#则count加1 enmin_1<='0'after 100 ns; ——没有发生进位
ELSE ——否则,若count不小于16#60# count<=\——则count复0
END IF; ——END IF(count(3 DOWNTO 0)=“1001”) END IF; ——END IF(reset=‘0’) END PROCESS; END fun;
4、整点报时报警模块VHDL语言源程序(底层文件) LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
9
USE IEEE.STD_LOGIC_UNSIGNED.ALL; ENTITY alert IS
PORT(clk:IN STD_LOGIC;
dain:IN STD_LOGIC_VECTOR(6 DOWNTO 0); speak:OUT STD_LOGIC;
lamp:OUT STD_LOGIC_VECTOR(2 DOWNTO 0)); END alert;
ARCHITECTURE fun OF alert IS
SIGNAL count:STD_LOGIC_VECTOR(1 DOWNTO 0); SIGNAL count1:STD_LOGIC_VECTOR(1 DOWNTO 0); BEGIN
speaker:PROCESS(clk) BEGIN
speak<=count1(1);
IF(clk'event and clk='1')THEN
IF(dain=\ IF(count1>=\
count1<=\——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<=\ IF(count=\
lamp<=\——循环点亮三只灯 ELSIF(count=\ lamp<=\
ELSIF(count=\ lamp<=\ END IF;
count<=count+1; ELSE
count<=\ END IF; END IF; END PROCESS lamper; END fun;
10