单片机电子时钟课程设计.docx
《单片机电子时钟课程设计.docx》由会员分享,可在线阅读,更多相关《单片机电子时钟课程设计.docx(11页珍藏版)》请在冰豆网上搜索。
![单片机电子时钟课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/7/79c24544-6785-44ff-a6c8-e87828207c8f/79c24544-6785-44ff-a6c8-e87828207c8f1.gif)
单片机电子时钟课程设计
郑州航空工业管理学院
单片机课程设计说明书
2008届电子信息工程专业0813081班级
题目基于单片机的数字时钟设计
学号081308125
姓名魏国俊
指导教师程琤
二О一0年12月26日
一、数字时钟的基本原理
数字时钟是用数字集成电路组成,用数码管显示的一种现代化计数器。
数字时钟实际上是一个对标准频率(1Hz)进行计数的计数电路。
振荡器产生的时钟信号经过分频器形成秒脉冲信号,秒脉冲信号输入计数器进行计数,并把累计结果“时”、“分”、“秒”的数字显示出来。
秒计数器电路计满60后触发分计数器电路,分计数器电路计满60后触发时计数器电路,当计满24小时后又开始下一轮的循环计数。
由于计数的起始时间不可能与标准时间(如北京时间)一致,故需在电路上加一个校时电路可以对分和时进行校时。
二、数字时钟的硬件设计
1、数字时钟的电路原理图
2、原器件清单
序号
器件名称
参数
数量
1
USB座
无
1
2
USB线
无
1
3
双排针
(2)
无
1
4
跳帽
无
3
5
电容
0.1uF
7
6
LED灯
无
1
7
电阻
2K
1
8
40针座
无
1
9
STC89C51
无
1
10
晶振
12MHZ
1
11
电容
20pF
2
12
复位键
无
1
13
电阻
10K
1
14
蜂鸣器
无
1
15
三极管9015
无
9
16
电阻
330
9
17
16针座
无
1
18
MAX232
无
1
19
单排针(5)
无
1
20
按键
无
4
21
单排针(3)
无
1
22
4位LED
无
2
23
电阻
4.7K
8
三、数字时钟的软件设计
1、程序流程图
开始
清显示缓冲区
初始化定时计数器
赋时钟初值
开定时器
调整时间
数码管显示当前时钟值
2、源程序
#include
//定义按键端口
sbitkey_1=P3^0;//用于小时增加
sbitkey_2=P3^1;//用于分钟增加
sbitkey_3=P3^2;//用于分钟减少
sbitkey_4=P3^3;//用于秒钟增加
//定义所需变量
unsignedcharshi=12,fen=00,miao=00;//定义十分秒并初始化为12:
00:
00
codeunsignedchartab[]={0xc0,0xf9,0xa4,0xb0,
0x99,0x92,0x82,0xf8,0x80,0x90};//定义共阳极数码管编码表
unsignedcharsbuff[8];//定义数据缓冲数组
voidinit()//定义初始化函数对定时器0和定时器1进行初始化
{
TMOD=0x11;//定时器0和1均为模式1
ET0=1;//开定时器0中断
ET1=1;//开定时器1中断
TH0=0xd8;
TL0=0xf0;//定时10ms
TH1=0xfc;
TL1=0x18;//定时0.1ms
TR1=1;//T1开始计时
TR0=1;//T0开始计时
EA=1;//开总中断
}
//显示数值写入缓冲区函数
voiddisplayset()
{
sbuff[7]=tab[(shi/10)];//显示小时的十位
sbuff[6]=tab[(shi%10)];//显示小时的个位
sbuff[5]=0xbf;//显示'-'号
sbuff[4]=tab[(fen/10)];//显示分钟十位
sbuff[3]=tab[(fen%10)];//显示分钟个位
sbuff[2]=0xbf;//显示'-'号
sbuff[1]=tab[(miao/10)];//显示秒钟十位
sbuff[0]=tab[(miao%10)];//显示秒钟个位
}
//延时子函数
voiddelay(unsignedcharz)
{while(z--)
{unsignedcharj;
for(j=0;j<123;j++);
}
}
voidkey_scan()
{
if(!
key_1)//按键1去抖以及动作
{
delay(100);
if(!
key_1)
{
shi++;
if(shi==24)
shi=0;//正常时间小时加1
displayset();
}
}
if(!
key_2)//按键2去抖以及动作
{
delay(100);
if(!
key_2)
{
fen++;
if(fen==60)
fen=0;//分增加1
displayset();
}
}
if(!
key_3)//按键去抖以及动作
{
delay(100);
if(!
key_3)
{
fen--;
if(fen==255)
fen=59;//分减1
displayset();
}
}
if(!
key_4)//按键去抖以及动作
{
delay(100);
if(!
key_4)
{
miao++;
if(miao==60)
miao=0;//秒增加1
displayset();
}
}
}
//主函数
voidmain()
{
init();//调用初始化定时器函数
displayset();//调用显示设置函数
while
(1)//主循环用于不断检测按键是否被按下
{
key_scan();//调用按键检测函数
}
}
//以下是中断程序///
//T0中断用于计时
voidtimer(void)interrupt1using0
{
staticunsignedcharcounter;//用于计进中断次数,即走过了多少个10毫秒
TH0=0xd8;
TL0=0xf0;//重新装入初值
counter++;
switch(counter)
{
case0:
case20:
case40:
case60:
case80:
displayset();
break;
default:
break;//在一秒内隔一段时间送一次时分秒到缓冲区
}
if(counter==100)
{
counter=0;
miao++;
if(miao==60)
{miao=0;
fen++;
if(fen==60)
{fen=0;
shi++;
if(shi==24)
shi=0;
}
}
}
}
///定时器1服务程序用于扫描显示
voidscan()interrupt3using1
{
staticunsignedcharnumber;
TH1=0xfc;
TL1=0x18;//重新装入初值
switch(number)
{
case0:
P0=0xff;P2=0xfe;P0=sbuff[number];break;
case1:
P0=0xff;P2=0xfd;P0=sbuff[number];break;
case2:
P0=0xff;P2=0xfb;P0=sbuff[number];break;
case3:
P0=0xff;P2=0xf7;P0=sbuff[number];break;
case4:
P0=0xff;P2=0xef;P0=sbuff[number];break;
case5:
P0=0xff;P2=0xdf;P0=sbuff[number];break;
case6:
P0=0xff;P2=0xbf;P0=sbuff[number];break;
case7:
P0=0xff;P2=0x7f;P0=sbuff[number];break;//轮流选中数码管并赋值显示
default:
break;
}
number++;
if(number==8)//扫描8次依次点亮8个数码管
number=0;
}
四、课程设计总结
本次课程设计是用8052单片机CPU及接口电路设计一个数字时钟,经过近一个星期的调试,结果满足设计要求,验证无误。
设计主要用到了多种芯片,程序也比较长比较麻烦,同时也遇到了不少困难,尤其是关于校时模块的设计实现。
关于显示模块,在以前的实验中做过,所以问题很容易解决。
通过本次设计,系统的了解了实时时钟的设计流程,尤其是硬、软件的设计方法,掌握了键盘显示电路的基本功能及编程方法,掌握了键盘电路和显示电路的一般原理,也进一步掌握了定时器的使用和中断处理器程序的编程方法。
开拓了思路,锻炼了实践动手能力,提高了分工协作能力和分析问题,解决问题的能力,达到了本次课程设计的目的。
五、指导教师评语
成绩指导教师签名