简易数字钟设计.docx
- 文档编号:11934685
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:18
- 大小:282.71KB
简易数字钟设计.docx
《简易数字钟设计.docx》由会员分享,可在线阅读,更多相关《简易数字钟设计.docx(18页珍藏版)》请在冰豆网上搜索。
简易数字钟设计
信息与电气工程学院
课程设计说明书
(2014/2015学年第二学期)
课程名称:
单片机课程设计
题目:
简易数字钟设计
专业班级:
学生姓名:
学号:
指导教师:
设计周数:
2周
设计成绩:
2015年6月25日
1、课程设计目的
(1)综合利用所学单片机知识完成一个单片机应用系统设计并在实验室实现,从而加深对单片机软硬知识的理解,获得初步的应用经验。
(2)学习AT89C51定时/计数器的原理及基本应用。
(3)掌握多为数码管动态显示方法。
(4)掌握Keil uVision2 IDE的使用方法。
【包括项目文件的建立,给项目添加程序件,
编译、连接项目,形成目标文件,运行调试观察结果,多文件的处理,仿真环境的设置。
】
(5)掌握Keil C51的调试技巧。
【包括如何设置和删除断点,如何查看和修改寄存器的内容,如何观察和修改变量,如何观察存储器区域,并行口的使用,定时器/计数器的使用,串行口的使用,外中断的使用。
】
(6)掌握PROTEUS软件使用过程。
2、简易数字钟的要求及软硬件的分析
2.1简易数字钟的设计要求
利用电子电路构成一个简易数字钟,该数字钟电路主要由C51单片机、4位共阳极数码管、时计数、分计数器、蜂鸣器、LED灯、NPN型和PNP型三极管、按键、若干电阻和导线组成。
其中电路系统的分计数器采用60进制,时计数器采用24进制,。
译码器显示电路将时、分计数器的输出状态通过三个两位共阳数码管显示出来。
整点报时电路根据计时系统的输出状态产生一个脉冲信号,用蜂鸣器输出。
相对机械钟而言,数字钟能达到准确计时,并显示小时、分钟,同时通过不同按键的不同功能对该数字钟进行小时和分钟调整,也可通过按键来接她通蜂鸣器来发出响声。
2.2数字钟的软件分析
2.1.1数字钟软件的系统分析
系统的软件设计也是工具系统功能的设计。
单片机软件的设计主要包括执行软件(完成各种实质性功能)的设计和监控软件的设计。
单片机的软件设计通常要考虑以下几个方面的问题:
(1)根据软件功能要求,将系统软件划分为若干个相对独立的部分,设计出合理的总体结构,使软件开发清晰、简洁和流程合理;
(2)培养良好的编程风格,如考虑结构化程序设计、实行模块化、子程序化。
既便于调试、链接,又便于移植和修改;
(3)建立正确的数学模型,通过仿真提高系统的性能,并选取合适的参数;
(4)绘制程序流程图;
(5)合理分配系统资源;
(6)为程序加入注释,提高可读性,实施软件工程;
(7)注意软件的抗干扰设计,提高系统的可靠性。
系统软件设计流程图这次的数字电子钟设计用到很多子程序,它们的流程图如下所示。
主程序是先开始,然后启动定时器,定时器启动后在进行按键检测,检测完后,就可以显示时间。
按键处理是先检测秒按键是否按下,秒按键如果按下,秒就加1,如果没有按下,就检测分按键是否按下,分按键如果按下,分就加1,如果没有按下,就检测时按键是否按下,时按键如果按下,时就加1,如果没有按下,就把时间显示出来。
2.2.2简易数字钟程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitk1=P3^5;//按键1
sbitk2=P3^4;//按键2
sbitk3=P3^3;//按键3
sbitk4=P3^2;//按键4
sbitLED=P1^0;//LED显示
sbitbeep=P3^6;//蜂鸣器
intm1=0,m2=0,m3=0,m4=0;//数码管要显示的数字
inttime_n=0;//1s时间到标志位
intsmg_n=0;//位选控制哪个数码管闪
intxz_flg=0;//选择键是否被按下
intshi=0,fen=0;miao=0;
intzd_flg=0;//整点标志
charduan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff};//段选编码0~9~null;//-----------------------------------------------------//本文件函数
voidSystem_Init();//初始化函数
voidSmg_Scan();//数码管动态扫描
voidDelay_1ms(uintz);//延时函数
voidBlink(uintwei);//数码管闪烁函数
voidKey_Scan();//按键扫描函数
voidBao_Shi();//整点报时
/**********************************************************************************/
voidmain()
{
System_Init();
while
(1)
{
Smg_Scan();
Key_Scan();
Bao_Shi();
}
}/**********************************初始化子函数
voidSystem_Init()//初始化函数
{
TMOD=0X01;//定时器0工作方式1
TH0=0X4C;//定时50000us
TL0=0X00;
EA=1;
ET0=1;
TR0=1;
}/************************************延时子函数
voidDelay_1ms(uintz)//1ms延时函数
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}/***************************************数码管扫描子函数
voidSmg_Scan()
{
P2_0=0;//数码管1位选通
P0=duan[m1];//送段选
Delay_1ms
(1);//延时1ms
P2_0=1;//数码管1位关断
P2_1=0;//数码管2位选通
P0=(duan[m2]&0x7f);//送段选
Delay_1ms
(1);//延时1ms
P2_1=1;
P2_2=0;//数码管3位选通
P0=duan[m3];//送段选
Delay_1ms
(1);//延时1ms
P2_2=1;
P2_3=0;//数码管4位选通
P0=duan[m4];//送段选
Delay_1ms
(1);//延时1ms
P2_3=1;
}/***************************************中断子函数
voidtime0()interrupt1//yanshizichengxu
{
TH0=0X4C;//定时50000us
TL0=0X00;
time_n++;
if(time_n==10)//0.5s到了吗?
{LED=~LED;
if(xz_flg==1)
{
switch(smg_n)//到了0.5s对应位的数码管灭
{
case0:
m1=10;Delay_1ms(500);break;
case1:
m2=10;Delay_1ms(500);break;
case2:
m3=10;Delay_1ms(500);break;
case3:
m4=10;Delay_1ms(500);break;
}
}
}
if(time_n==20)//1s到了
{
time_n=0;
miao++;
if(miao==60)
{
miao=0;
fen++;
if(fen==60)
{
zd_flg=1;//整点标志
shi++;
if(shi==24)
{
shi=0;
}
}
}
m4=fen%10;//数码管4显示分钟的低位
m3=fen/10;//数码管3显示分钟的高位
m2=shi%10;//数码管2显示小时的低位
m1=shi/10;//数码管1显示小时的高位
}
}/*****************************************************键盘扫描子函数
voidKey_Scan()
{
if(k1==0)//选择键
{
Delay_1ms(21);//延时20ms
if(k1==0)//按键1确实被按下
{
xz_flg=1;//选择键按下
EA=0;
smg_n++;//改变选择的数码管
if(smg_n==4)
{
smg_n=0;
}
while(!
k1)//松手检测
{
Smg_Scan();//使按下键时所有数码管都亮
}
Delay_1ms(21);
while(!
k1);
}
}
if(xz_flg==1)
{
if(k2==0)//加1键
{
Delay_1ms(21);
if(k2==0)
{
switch(smg_n)
{
case0:
m1++;
if(m1==2)
{
m1=0;
}
break;
case1:
m2++;
if(m2==10)
{
m2=0;
}
break;
case2:
m3++;
if(m3==6)
{
m3=0;
}
break;
case3:
m4++;
if(m4==10)
{
m4=0;
}
break;
}
while(!
k2)//松手检测
{
Smg_Scan();
}
Delay_1ms(21);
while(!
k2);
}
}
if(k3==0)//减1键
{
Delay_1ms(21);
if(k3==0)
{switch(smg_n)
{
case0:
m1--;if(m1==-1){m1=2;}break;
case1:
m2--;if(m2==-1){m2=9;}break;
case2:
m3--;if(m3==-1){m3=5;}break;
case3:
m4--;if(m4==-1){m4=9;}break;
}
while(!
k3)
{
Smg_Scan();
}
Delay_1ms(21);
while(!
k3);
}
}
if(k4==0)//确定键
{
Delay_1ms(21);
if(k4==0)
{
xz_flg=0;
EA=1;
while(!
k4)
{
Smg_Scan();
}
Delay_1ms(21);
while(!
k4);
}
}
}
}
/*********************************************************************/
voidBao_Shi()
{
uinti,j;//定义循环变量
if(zd_flg==1)
{
for(j=0;j<3;j++)
{
for(i=0;i { beep=! beep;//蜂鸣器开关 Delay_1ms(80);//延时80ms } Delay_1ms(1000); } zd_flg=0; } } 2.3简易数字钟硬件分析 2.3.1数字钟的总电路图 2.3.2数字钟的硬件单元电路分析 (1)最小系统设计 图1单片机最小系统的结构图 (2)晶体 (3)常用的复位电路如下图所示: 图3常用复位电路图 (4)最常用的显示器数码管,如下图所示。 图4显示器的符号图 (5)显示电路显示模块需要实时显示当前的时间,即时、分,因此需要4个数码管。 采用动态显示方式显示时间,硬件连接如下图所示,时的十位和个位分别显示在第一个和第二个数码管,分的十位和个位分别显示在第四个和第五个数码管,显示器的显示控制方式按驱动方式可分成静态显示方式和动态显示方式两种。 对于多位显示器,通常都是采用动态扫描的方法进行显示,其硬件连接方式如下图所示。 图5数码管的硬件连接示意图 (6)键盘控制电路 该设计需要校对时间,所以用三个按键来实现。 按k1来调节小时的时间,按k2 来调节分针的时间。 下图是按键硬件连接图。 图6按键控制电路的硬件连接图 2.2.3系统调试 各功能模块均调整通过后,进行整机调试,其过程如下: 将调好的各功能模块连接在一起,用函数信号发生器模拟交流电压信号,先用仿真机代AT89C2051单片机进行模拟调试,对每一芯片的片选、启动进行检测,并对数据线和地址线也进行检测。 调试成功后再将程序写到单片机中进行调试。 3、课程设计总结 设计之初没有一点信心,感觉设计复杂没有一丝头绪,但是后来结合所学的数字电子 技术知识,并且与同学进行交流开始逐步构想、设计、运行检测。 现将心得体会总结如下: (1)开始设计之前必须有一个整体的构想,考虑周到,由于接线较多一旦出现错误较难发现和改正,这样可以避免后期调试时出现较少的问题。 (2)列出几个方案进行比较选出最简单易行的方案,并进行理论上的排检 (3)在设计某些模块的时候无法把握住整体,这时可以先进行小部分功能的实现,在此基础上进行改进,虽然可能会多花一些时间,但这比空想要有效的多。 (4)电路连接尽量整洁有序,使各项功能的连接一目了然,方便查看及排查故障 (5)很多难点的突破都来自于与同学的交流,交流使自己获得更多信息,开拓了思路,因此要重视与别人的交流。 (6)应该有较好的理论基础,整个实验都是在理论的指导下完成了,设计过程中使用了许多理论课上学的内容,如真值表、卡诺图等。 本次设计把理论应用到了实践中,同时通过设计,也加深了自己对理论知识的理解和掌握。 总体来说,本设计要求有耐心和细心,有效合了理论与实践,将我们所学的书本知识运用于实践,培养了我们发现和解决问题的能力。 参考文献: [1] 康华光主编.电子技术基础-数字部分(第五版).高等教育出版社,2006,5 (2): 32-34 [2] 数字电子技术《实验指导书》 [3] 杨素行主编.模拟电子技术简明教程 (第三版). 高等教育出版社,2005 [4]谢自美.电子线路设计、实验、测试.华中理工大学出版社,2000 [5]黄继昌,《数字集成电路应用300例》人民邮电出版社,2002.1 [6]凌肇元编著,《集成电路应用实例集锦》。 人民邮电出版社,1998.8 课程设计 评语 课程设计 成绩 指导教师 (签字) 年月日
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 简易 数字 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)