单片机课程设计 -可调数字钟 (来自河北大学)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、绪论
单片机正朝着高性能和多品种的方向发展,下一步的趋势将是继续向着CMOS化、低功耗、小体积、大容量、高性能、低价格和外围电路内装化等几个方面发展。单片机应用的重要意义还在于,它从根本上改变了传统控制系统的设计思想和设计方法。以前必须由模拟电路或数字电路实现的大部分功能,现在已经能用单片机通过软件方法来实现了。
用单片机设计制作数字钟是单片机的一个典型应用。通过设计制作一个数字钟,我们可以充分了解单片机的工作原理,学会如何用单片机实现数据的处理以及设备的控制等。设计制作一个数字钟虽然简单,但涉及到的内容却十分广博。
本课程设计是基于单片机时钟的LED显示,通过单片机产生计数功能,经由LED数码管显示,显示时间时、分、秒,并用按键进行时间调整,同时带有整点报时功能。
本课程设计只是设计制作一个功能简单的数字钟,旨在通过对简单的硬件和软件的操作和应用以实现用数码管显示的数字钟,尝试基本的电路设计和单片机的C语言编程以及锻炼实践动手能力。
二、整体设计
本设计采用51单片机内部定时器产生时钟来进行准确计时,时分秒由3个变量来记录,定义按键功能,来实现时钟的调节,最终是由LED数码管来动态显示时间。
三、硬件电路设计
3.1 总体电路设计
3.2信号处理电路
3.3单片机最小系统电路
单片机外围电路有时钟电路和复位电路等,时钟电路采用的是内部时钟方式,在单片机内部有一振荡电路,在外部的XTAL1和XTAL2引脚外接石英石英晶体(晶振)就构成了自激振荡器课在单片机内部产生时钟脉冲信号,两电容作用是稳定频率和快速起振,晶振的振荡频率我们采用的是经典值12MHz。
复位电路采用的是上电复位和按键复位均有效的方式,单片机执行复位操作后进入初始化状态。
主要功能引脚能能如下:
P0的8位引脚产生8位段选信号,用于数码管显示;
P1.0口控制着电路板上的绿色指示灯的亮灭,其中1为灭,0为亮;
P2口各引脚功能:
P2.0~ P2.2分别连接3-8译码器的A、B、C输入端,编程时需要写P2.0~ P2.2口来实现控制六个数码管的逐个显示;
P2.3连接3-8译码器的使能端,编程时需要对P2.3写入0;
P2.7~ P2.4分别连接K1~K4按键,编程时,需要通过读取P2.7~ P2.4的值获取按键状态;
3.4 显示电路设计
3.5 串口通信电路设计
3.6 电源电路设计
3.7 按键控制电路设计
本次设计采用了4个独立的按键K1,K2,K3,K4用于后期时间的调整,其分别与单片机的P2.7~ P2.4引脚连接,编程时,需要通过读取P2.7~ P2.4的值获取按键状态。各按键经由上拉电阻与VCC相连,当按键按下时,与按键相连接的引脚为低电平,按键弹起时是高电平,即一次按键按下,为一个下降沿和一个上升沿。
四、软件设计
4.1 程序设计总体思路
本次设计要实现数字钟的可调功能,我把程序分化为五个模块分别进行编写,分别为时间处理子程序、显示子程序、按键扫描子程序、整点报时子程序以及中断子程序。
4.2 各模块程序设计
4.2.1 时间处理子程序
在此模块中把秒sec设置为六十进制,分钟min设置为六十进制,小时hour设置为二十四进制,即当时间增加1s时,将显示部分的“秒”位加一,加到60以后进位为“分”,“秒”位清零;当“分”累加到60后进位为“时” ,“分” 位清零;当“时”位为24以后,所有位清零后重新开始记时。
时间处理子程序如下:
void proc() //时间处理子程序
{
if(sec==60) //秒变量满60进一
{sec=0;min++;
if( min==60) //分变量满60进一
{min=0;hour++;
if(hour==24) //时变量满24进一
{hour=0;}
}
}
}
4.2.2 时钟显示子程序
此段子程序用于实现数码管的动态显示,分为段选和片选。当系统处于正常计时状态时,数码管正常显示时钟,时与分之间和分与秒之间的小数点以1Hz的频率闪烁;当调节按键按下时,adjust_flag==1,小数点停止闪烁,当调节哪一位时(时、分、秒),哪一位的个位的小数点常亮,便于显示哪一位正在处于调节
状态。
时钟显示子程序如下:
void display() //时钟显示子程序
{
a=0;b=0;c=0; //位选,刷新小时的十位
P0=zixing[hour/10]; //段选,将小时的十位数的字形赋给P0输出显示
delay(3); //延时3ms
a=1;b=0;c=0; //位选,刷新小时的个位
if(adjust_flag==0&TR0==1) //正常计时时,时的个位的小数点闪烁
{if(dot==1)
P0=(zixing[(hour%10)]);
else
P0=(zixing[(hour%10)])|0X80; } //字形码的第一位是小数点的亮暗控制位,与0x80相与使小数点点亮
else if(adjust_selc==3) //如果处于调节状态下的调时模式
P0=(zixing[(hour%10)])|0X80; //时的个位,小数点常亮
else
P0=(zixing[(hour%10)]);//调节其他位时,小数点则不亮
delay(3);
a=0;b=1;c=0; //位选,刷新分的十位
P0=zixing[min/10];
delay(3);
a=1;b=1;c=0; //位选,刷新分的个位
if(adjust_flag==0&TR0==1) //正常计时时,分的个位的小数点闪烁
{if(dot==1)
P0=(zixing[(min%10)]);
else
P0=(zixing[(min%10)])|0X80; }
else if(adjust_selc==2) //如果处于调节状态下的调分模式
P0=(zixing[(min%10)])|0X80; //分的小数点常亮
else
P0=(zixing[(min%10)]); //调节其他位时小数点则不亮
delay(3);
a=0;b=0;c=1;//位选,刷新秒的十位
P0=zixing[sec/10];
delay(3);
a=1;b=0;c=1; //位选,刷新秒的个位
if(adjust_selc==1) //如果处于调节状态下的调秒模式