单片机课程设计报告秒表设计Word下载.docx
《单片机课程设计报告秒表设计Word下载.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告秒表设计Word下载.docx(15页珍藏版)》请在冰豆网上搜索。
本设计分为时钟电路、按钮电路、显示电路和单片机四大部分,这些模块中单片机占主控地位。
b)HT48F50E的芯片结构的构造图及目标板的键盘分布:
本目标板上有一个4*4键盘。
引脚KA0—KA3用于选择键盘的列,引脚KB0—KB3用于选择键盘的行。
通常检测哪一个按键被按下的方法是:
利用单片机依次向KA0—KA3输出0,然后再去读KB0—KB3的值。
如果读回的值为”1111”,则表示没有键被按下。
KA0—KA3,KB0—KB3行列对应关系如下:
KB0
KB1
KB2
KB3
KA0KA1KA2KA3
在本次试验中,我们用了三个键和reset键。
reset键为开始和暂停。
按SW13键暂停计时,SW14键存储当前时间,查看存储过的时间则利用SW16进行下翻,浏览查看。
c)本次设计的电路连线图:
其中PA设计为输出端,输出七段码。
PB4-7为输出端,接入com0-com3,作为片选。
PB前四为输出,PC为输入。
其中PB0-3接到LED上用于,显示状态。
其余用作键盘输入。
3.程序流程图。
程序流程图如图所示,上电后按reset键开始计时,当LED显示屏中的时间满一分钟时,屏幕显示即时间清零,并且分钟数加一,不满一分钟则继续判断。
(分钟数由红灯以二进制显示。
)
图中按SW13键暂停计时,SW14键存储当前时间,查看存储过的时间则利用SW16进行下翻,浏览查看。
4.源代码及注释。
#include"
HT48F50E.h"
//头文件
#defineucharunsignedchar
#defineuintunsignedint
constuchartable[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
//数码管0—9的编码表,存储在ROM中
#definecom0_pb4//控制四个数码管
#definecom1_pb5
#definecom2_pb6
#definecom3_pb7
#definet1m1_11_7//定时器1的寄存器
#definet1m0_11_6
#definet1on_11_4
#definet1e_11_3
#definekey1_pc4//对键盘的申明
#definekey2_pc3
#definekey3_pc2
#definekey4_pc1
#defineT_cout20//能保留多少
ucharfen,sec,tms,lamp,Tlamp;
//定义变量tms,sec,lamp
uintmin,direction;
//定义变量min,direction
ucharstop,SSave;
charNowposition,count;
ucharT_fen,T_sec,T_tms,T_lamp;
voidintial();
//申明初始化函数
voiddelay(unsignedlongt);
//申明延迟函数
voiddisplay();
//申明数码管显示函数
voidkeyscan();
//申明键盘扫描函数
voidsaom();
//申明流水灯函数
voidSsaom();
structTimerS
{
ucharfen;
uintfshi;
uintfge;
uinthshi;
uinthge;
}TSave[T_cout];
voidmain()
intial();
//调用初始化函数
min=0;
//变量初始化
count=0;
direction=0;
_pbc=0;
//pb口设为输出口
lamp=0x01;
//给lamp赋初值
fen=0;
Nowposition=-1;
stop=0;
SSave=0;
while
(1)
{
while(min<
=0)//当秒表计数到达一分钟时结束循环,即min就是秒表的第一位,取值范围是0-5
{
display();
//调用display函数显示结果
keyscan();
//调用keyscan函数扫描键盘
}
saom();
//调用saom函数执行流水灯
sec=0;
tms=0;
min=0;
}
}
voidintial()//函数初始化
_pcc=0x1F;
//pc口第五位设为输入口,其余设为输出
com0=1;
//数码管全部关闭
com1=1;
com2=1;
com3=1;
_pac=0x00;
//pa口设为输出
_emi=1;
//开总中断
_et1i=1;
//开定时器1中断
_tmr1l=55536%256;
_tmr1h=55536/256;
//定时器赋初值,必须先赋低8位再赋高8位
t1m1=1;
t1m0=0;
//设置定时器1为定时模式
t1e=0;
//定时器1在时钟上升沿加1
tms=0;
//秒表后两位清零
sec=0;
//秒表前两位清零
_pc5=0;
voiddelay(unsignedlongt)//延迟函数,没有精确值,随意设的,延迟单位在1ms左右
unsignedlongi;
for(i=t;
i>
0;
i--)
_delay(900);
voiddisplay()//数码管动态显示。
uintge,shi;
if(!
stop)
if(tms>
=100)//秒表后两位
sec++;
tms=0;
if(sec>
=100){//秒表前两位
sec=0;
ge=tms%10;
//显示秒表的最后一位
shi=tms/10;
//显示秒表的第三位,最后一位与倒数第二位的进制是10
if(SSave)
TSave[count].fen=fen;
TSave[count].hge=ge;
TSave[count].hshi=shi;
_pa=table[ge];
//秒表的最后两位的显示范围是0-9
com3=0;
//开启数码管的第四位
_delay(50);
com3=1;
//关闭数码管的第四位
_pa=table[shi];
com2=0;
//开启数码管的第三位
com2=1;
//关闭数码管的第三位
ge=sec%10;
//显示秒表的第二位
shi=sec/10;
//秒表的第一位
min=shi;
TSave[count].fge=ge;
TSave[count].fshi=shi;
if(count<
T_cout)
count++;
else
count=0;
SSave=0;
//秒表第二位的显示范围是0-9
com1=0;
com1=1;
//秒表第一位的显示范围是0-9
com0=0;
com0=1;
else
_pa=table[TSave[Nowposition].hge];
//秒表的最后两位的显示范围是0-9
//开启数码管的第四位
//关闭数码管的第四位
_pa=table[TSave[Nowposition].hshi];
//开启数码管的第三位
_pa=table[TSave[Nowposition].fge];
_pa=table[TSave[Nowposition].fshi];
lamp=TSave[Nowposition].fen;
Ssaom();
voidkeyscan()//按键扫描
key1)
_delay(20000);
if(!
t1on=!
t1on;
//开定时器或者关定时器,就是停止键
while(!
voidsaom()//流水灯扫描程序
Tlamp=~lamp;
Tlamp=Tlamp&
0x0F;
_pb=_pb&
0xF0|Tlamp;
_delay(50000);
direction)//direction=0时
lamp++;
//流水灯的左移
if(lamp>
15)
lamp=0x00;
fen=0;
fen++;
voidSsaom()
_delay(50);
#pragmavectortimer@0x0c//定时器1中断函数,0x0c为定时器1中断向量
voidtimer()
uinti;
tms++;
key2)
SSave=1;
for(i=0;
i<
4;
i++)
_delay(20000);
key3)
if(stop)
fen=T_fen;
lamp=T_lamp;
sec=T_sec;
tms=T_tms;
stop=0;
_delay(50000);
key4)
stop=1;
T_fen=fen;
T_lamp=lamp;
T_sec=sec;
T_tms=tms;
Nowposition=-1;
6;
if(Nowposition<
(count-1))
Nowposition++;
else
Nowposition=0;
5.实验结果:
烧制过程:
最终结果:
说明:
a)红灯为分钟数,以二进制显示,左边为低位右边为高位,‘1’为亮,‘0’为灭。
图中显示为1分钟。
b)LED显示屏显示秒和毫秒,图中为02秒51分秒。
c)即总计时数为1分2秒51。
6.在设计中出现的问题及解决的方法。
本次试验是本小组这学期在老师的指导下运用本专业课程知识以及新学习的单片机方面的知识所设计的电子秒表,它经过多次修改和整理,已是一个可以实现课程所要求功能并加入了我们自己特有功能的设计。
但因为我们两个都选修的软件方面的知识,对单片机及电子电路方面的知识比较欠缺,所以此次课程设计过程我们都是合作进行的,其中有很多设计模块的相关理论知识都是在网上或其他同学、老师交流获得,真的很感谢同学好老师对我们的耐心帮助与指导。
我们经过多次修改和整理,最终实现了电子秒表清零、暂停、继续、计时状态显示等功能,并且由于只有四位,无法计分钟数,所以我们还实现了用流水灯来计算分钟数电子秒表功能。
它可以较好的实现设计要求。
一开始的我们是无从下手的,因为从来没有接触过HT-IDE集成开发环境以及单片机的相关领域,数字电路课程中浅显的电路知识让我们对秒表的功能实现也是一头雾水,后来我们通过网络和书本知识寻找了许多单片机的相关资料,熟悉了电子秒表的各个功能以及输入输出形式,对电子秒表的各个模块有了系统且深入的了解。
然后在大体上大概设计出了电子秒表各个模块以及各模块要实现的相应功能,并对输入输出进行了设计,也对键盘分布进行了初步设计。
在总体设计完成后,我们用软件开始进行实际的编程。
再深入阅读过HT-IDE集成开发环境的使用指导后我们了解到HT-IDE集成开发环境可使用ASM和C两种程序设计语言,于是我们就选择了较为熟悉的C语言进行我们的程序编写。
程序编写的我们的本专业知识,所以完成得较为顺利,只是在按键、显示的各个接口上下了很大功夫,我们对硬件都不是很熟悉,这次试验让我们更加深刻的熟悉了数字电路方面的知识。
完成所有程序的编写。
最后将程序下载到开发板进行调试,通过实际的硬件进行找出软件的问题和时序的错误,最终通过修改软件使软件硬件较好的结合起来。
7.设计体会及收获。
通过这一次的课程设计,我感觉有很大的收获。
首先,通过学习使自己对单片机和C语言的知识有了更加深入的了解,使课本上的知识可以应用于实际,使得理论与实际相结合,加深自己对课本知识的更好理解,同时锻炼了我个人的动手能力,也锻炼了我和同学之间的合作能力;
能够充分利用图书馆去查阅资料,增加了许多课本以外的知识。
对我们学生来说,理论与实际同样重要,这是我们以后在工作中说明自己能力的一个重要标准。
在动手编程下板中,我不仅学会将理论知识运用到实践当中,更是感受到了同学一起潜心研究课题的充实感,每天我们很多人一起学习一起设计,相互帮助与进步,老师对我们的各种问题也是耐心回答细心指点,最终完成了整个课题的设计要求。
看着最后的共同努力的成果,我们都感觉非常骄傲。