1、 单片机技术课程设计 数字电子钟 学院: 班级: 姓名: 学号: 教师: 摘 要 电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。所以设计一个简易数字电子钟很有必要。本电子钟采用AT89C52单片机
2、为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。具有时间显示、整点报时、校正等功能。走时准确、显示直观、运行稳定等优点。具有极高的推广应用价值。 关键词: 电子钟 AT89C52 硬件设计 软件设计
3、 目 录 一、数字电子钟设计任务、功能要求说明及方案介绍 4 1.1 设计课题设计任务 4 1.2 设计课题的功能要求说明 4 1.3 设计课的设计总体方案介绍及工作原理说明 4 二、设计课题的硬件系统的设计 5 2.1硬件系统各模块功能简要介绍 5 2.1.1 AT89C52简介 5 2.1.2 按键电路 6 三、设计课题的软件系统的设计 6 3.1 使用单片机资源的情况 6 3.2 软件系统个模块功能简要介绍 7 3.3 软件系统程序流程框图 7 3.4 软件系统程序清单 7 四、设计课题的设计结论、仿真结果、误差分
4、析 9 4.1 设计结论及使用说明 9 4.2 仿真结果 10 结 束 语 12 参考文献 12 附 录 13 附录A:程序清单 13 一、数字电子钟设计任务、功能要求说明及方案介绍 1.1 设计课题设计任务 设计一个具有特定功能的电子钟。具有时间显示,并有时间设定,时间调整 功能。 1.2 设计课题的功能要求说明 设计一个具有特定功能的电子钟。该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”, 进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行
5、进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。 1.3 设计课的设计总体方案介绍及工作原理说明 本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示: 图1-1总体设计方案图 本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。键盘采用动态扫描方式。利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理
6、的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。 二、设计课题的硬件系统的设计 2.1硬件系统各模块功能简要介绍 2.1.1 AT89C52简介 (1) 兼容MCS51指令系统; (2)8kB可反复擦写(大于1000次)Flash ROM; (3)32个双向I/O口; (4)256x8bit内部RAM; (5)3个16位可编程定时/计数器中断; (6)时钟频率0-24MHz; (7)2个串行中断,可编程UART串行通道; (8)2个外部中断源,共8个中断源; (9)2个读写中断口线,3级加密位; (10)低功耗空闲
7、和掉电模式,软件设置睡眠和唤醒功能; (11)有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。 它的价格便宜,功能强大,能耗低。很大程度上减少总电路的复杂性,提高了所设计系统的稳定性。其芯片引脚图如图2-1所示。 图2-1 单片机AT89S52引脚图 2.1.2 按键电路 图2—2 按键图 三、设计课题的软件系统的设计 3.1 使用单片机资源的情况 设计课题使用单片机资源的情况如下: P0口输出数码管段选信号,P2口输出数码管位选信号;晶振12MHz;调整选择键KEY1:P1
8、0;通过选择键选择调整位,选中位闪烁;增加键KEY2:P1.1;按一次使选中位加1;减少键KEY3:P1.2;按一次使选中位减1;此数字钟可实现基本的走时和显示时间时、分、秒;时间的调整;闹钟的设定和调整;闹钟的开启和关闭功能,具体如下: (1)实现基本的走时和显示时间的时、分、秒,上电自动显示初始时间12-59-00,且控制闹钟状态的的红色led灯为亮的状态; (2)当第一次按下第一个弹性按键时进入时间的调节状态,此时实现对显示时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时实现小时的减一调节; (3)当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第
9、二个按键时实现分钟的加一调节,按下第三个按键时实现分钟的减一调节; (4)当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节; (5)当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节; (6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态; (7)当同时按下第二和第三个弹性按键时,关闭闹钟,且此时蓝色led灯为灭,及定时时间到蜂鸣器并不响,若再次同时按下第二和第三个弹性按键,则开启闹钟,且此时红色led灯为亮,定时时间
10、到蜂鸣器发出滴滴的闹铃声,同时按下第二和第三个弹性按键即可关闭闹铃。闹铃状态默认为开启。 3.2 软件系统个模块功能简要介绍 本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、数码管及其驱动模块和延时模块。 主程序:主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控制。 中断服务程序:主要是用于电子钟的准确运行、数据输入过程中的闪烁。 键盘输入程序模块:主要是用于确定按键并得到特定的键码值。 数码管及其驱动模块:主要是用于驱动数码管及利用数码管显示时间。 延时模块:程序中有两种延时子程序,一种是短延时
11、用于判键按下等,一种是长延时。 3.3 软件系统程序流程框图 系统软件采用汇编语言按模块化方式进行设计,然后通过Keil软件开发平台将程序转变成十六进制程序语言,接着使用Proteous 进行仿真,读出显示数据。 3.4 软件系统程序清单 本电子钟实现24小时制,8位数码管显示时分秒,显示式:12-59-00。 通过4只按键来调整时间: KEY1(P1.0):调整选择键,选中位闪烁; KEY2(P1.1):增加键,按一次使选中位加1; KEY3(P1.2):减少键,按一次使选中位减1; Bear(P3.1):到了整点和闹钟就会响; Led (P1.2):闪烁;
12、 P0口输出数码管段选信号,P2口输出数码管位选信号; 晶振12MHz。 图3-1主程序流程框图 图3-2显示时钟数组子程序 图3-3中断服务程序程序 四、设计课题的设计结论、仿真结果、误差分析 4.1 设计结论及使用说明 本设计为基于单片机的电子钟的设计。刚开始,我们很多地方理不清头绪,无从下手,但通过认真研究设计课题,找书上网查资料,确定基本设计方案,对所用芯片功能进行查找、调试,然后画电路图等,积累了很多宝贵的经验。 本设计用2个四位一体的共阳数码管做为显示器,它显示时间值;设计中有三
13、个按键,其中KEY1为启动键,KEY2为加控制键 KEY3为减控制键 。 图4—1 结果图 4.2 仿真结果 在Proteus ISIS的Debug菜单中选择Execute,运行程序,系统仿真结果如图所示。 实现功能: 可调整运行的电子钟具有三种工作状态:“d.1004-22”状态、运行状态、调整状态。 图4-2“d.1004-22”上电初始化运行状态仿真结果 图4-3时钟正常运行状态仿真结果 图4-4闹钟定时调整状态仿真结果 图4-5小时调整状态仿真结果 图4-6分钟调整
14、状态仿真结果 结 束 语 单片机课程设计是一门很实用,很复杂的设计。这个设计用到了单片机,电路等方面的知识,通过这次课程设计,使我对单片机及其附属电路有了一定的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的不足。 完成本次课程设计的过程,是一个从无到有的过程,经历了兴奋、所悟、完成几个过程。刚做做课程设计时,仔细阅读设计的题目和要求,以为没什么困难的,所用的知识书上都有。可是当我动手开始做的时候,才发现其中的算法,设计是那么繁琐。经过一天的努力,再到图书馆和网上查找资料,在经过借鉴很多类似的资料,文献后
15、总算是有点眉目了。埋头苦干的过程是痛苦的,在思考算法和程序框架时,迷茫,烦躁,也参考别人的思路,不断循环中,终于最后完善了程序。其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域”的困难。但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜悦,就在这样的痛与快乐的交换中,我学到了知识。 通过这短短一周的实践,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。知道了很多元器件有什么功效,在仿真仪器中是什么代码。有的知识,自己感觉已经掌握得差不多了,但是实际操作起来就有问题出现了。我遇到了不少问题,花费了很多的时间。这让我重新反思我们的学习,深刻领悟到我们这个专业动手,实践的重
16、要性。理论不经过实践考验,是没法实施的,就像我们编的程序,很多方面考虑的都不够,几乎没有涉及到实际应用时的防范方法措施。这次的课程设计,让我学到了很多书本上学不到的东西,学到了实际应用时。最大的收获是:对键盘,显示器,C51语言的应用有了深刻的了解。
参考文献
[1] 百度文库,基于C51单片机的程序设计.
[2] 百度百科,AT89C52简介
附录
附录A 程序清单
#include
17、nt #define uchar unsigned char sbit KEY1=P1^1; //切换键 sbit KEY2=P1^2; //minute ,hour调整加1定义 sbit KEY3=P1^7; //minute ,hour调整减1定义 sbit bear=P3^1; //闹铃 sbit led=P1^2; //闹钟,整时灯闪烁 code unsigned char tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8, 0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21};
18、 //段码控制 char code weikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar ms[8]={2,2,10,4,0,0,1,14}; uchar StrTab[8]; uchar minute=59,hour=12,second=0; //正常时钟 秒,分,时 定义 uchar minute1=00,hour1=00; second1=00; //闹钟时钟 秒,分,时 定义 uchar flag=0, flag1=0; //切换标志 uchar num=0;
19、
uint count=0; //定时器计数,定时50ms,count满20,秒加1
/***********子函数声明*******************************************/
void xianshishuzu(); //显示数组子程序
void alarm(); //闹钟子程序
/********************** 延时子程序*****************************/
void delay(uint z)
{
uint x,y;
for(x=0;x 20、)
for(y=0;y<110;y++);
}
/**********************显示时钟子函数***************************/
void dispaly(uchar w[8])
{
unsigned int i,j,aa;
aa=0xfe; //位选初值1111 1110
for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示
{
P2=aa; //位选
j=w[i]; //取出要显示的数码
P0 21、tab[j]; //取出段选编码
aa=_crol_(aa,1); //位选信号循环右移
delay(1); //显示延时
P0=0xff; //消影
}
}
/***********************显示时钟数组子程序***********************/
void xianshishuzu()
{
StrTab[1]=second/10; //秒个位
StrTab[0]=second%10; //秒十位
StrTab[2 22、]=10; //间隔符 -
StrTab[4]=minute/10; //分个位
StrTab[3]=minute%10; //分十位
StrTab[5]=10; //间隔符 -
StrTab[7]=hour/10; //时个位
StrTab[6]=hour%10; //时十位
}
/**********************键盘扫描子程序*************************/
void keycan()
{
23、 if(KEY1==0) //按一次,正常显示,按第二次,时调整,按第三次,分调这整,
{
delay(10); //按键1去抖以及动作
if(KEY1==0) //确认按键是否按下
{
flag++; //切换标志
}
while(!KEY1); //释放按键
}
if(flag==1)
{
if(KEY2==0)
{
delay(10);
if(KEY2==0)
{
hour++; 24、 //正常时间 小时 加1
if(hour==24)hour=0;
}
while(!KEY2) //释放按键
{
dispaly(StrTab);
}
}
if(KEY3==0)
{
delay(10);
if(KEY3==0)
{
hour--; //正常时间小时 减1
if(hour==0)hour=23;
dispaly(StrTab);
}
while(!KEY3)
{
d 25、ispaly(StrTab);
}
}
}
if(flag==2)
{
if(KEY2==0) //按键去抖以及动作
{
delay(10);
if(KEY2==0)
{
minute++; //分加1
if(minute==60)minute=0;
}
while(!KEY2)
{
dispaly(StrTab);
}
}
if(flag==3) 26、 //秒表的加1
{
if(KEY3==0)
{
delay(10);
if(KEY3==0)
{
second++; //秒加1
if(second==0)second=59;
}
while(!KEY3)
{
dispaly(StrTab);
}
}
}
}
if(flag==3) //闹钟对时
{
if(KEY2==0)
{
delay(10);
27、
if(KEY2==0)
{
hour1++;
if(hour1==24)hour1=0; //闹钟时间 小时 加1
}
while(!KEY2)
{
alarm();
}
}
if(KEY3==0)
{
delay(10);
if(KEY3==0)
{
hour1--;
if(hour1==0)hour1=23; //闹钟时间 小时 减
}
while( 28、KEY3)
{
alarm();
}
}
}
if(flag==4)
{
if(KEY2==0) //按键去抖以及动作
{
delay(10);
if(KEY2==0)
{
minute1++;
if(minute1==60)minute1=0; //闹钟分加1
}
while(!KEY2)
{
alarm();
}
}
if(KEY3==0) //按键去抖以及 29、动作
{
delay(10);
if(KEY3==0)
{
minute1--;
if(minute1==0)minute1=59; //闹钟分减1
}
}
while(!KEY3)
{
alarm();
}
}
}
/*******************蜂鸣器子程序****************************/
void beng()
{
bear=1;
P3=0xfd;
delay(100);
bear=0;
P3=0XFf;
30、 delay(100);
}
/*****************整点报警子程序***************************/
void zhengdian (void)
{
uchar i=0;
if((second==0)&(minute==0)) //整点报时
{
for(i=0;i<10;i++)
{
TR0=1; beng();dispaly(ms);
}
}
}
/********************************定时闹钟******* 31、/
void alarm()
{
uint i;
if((hour==hour1&&second1==minute1&&(second>=second1&&second 32、[2]=10; //间隔符 -
StrTab[4]=minute1/10; //分个位
StrTab[3]=minute1%10; //分十位
StrTab[5]=10; //间隔符 -
StrTab[7]=hour1/10; //时个位
StrTab[6]=hour1%10; //时十位
TR0=0;
dispaly(StrTab);
xianshishuzu( 33、);
}
/**************************中断子程序*********************************/
void time_() interrupt 1 //中断程序
{
count++;
TH0=(65536-50000)/256; //0.5ms重新送初值
TL0=(65536-50000)%256;
if(count==20) //定时器计数,定时50ms,count满20,秒加1
{
second++; coun 34、t=0;
if(second==60) //秒值等于60,秒清零,分加1
{
second=0;minute++;
if(minute==60) //分值等于60,分清零,时加1
{
minute=0; hour++;
if(hour==24) //时值等于24,时清零,返回,全部归零
{
hour=0;
}
}
}
}
xianshishuzu();
}
/***********************数字电子钟主函数**** 35、/
void main()
{
P1=0XFF;
TMOD = 0x11; //time0为定时器,方式1
TH0=(65536-50000)/256; //预置计数初值,50ms
TL0=(65536-50000)%256;
EA=1; //总中断开
ET0=1; //允许定时器0中断
TR0=1; //开启定时器0
while(1) 36、 //主循环
{
if(flag==0)
{
TR0=0; dispaly(ms); //上电初始化就显示bad.1004-22
}
if(P1!=0XFF)
{
keycan(); //按键提前扫描
}
if(flag>0)
{
if(flag==1||flag==2) { TR0=1; dispaly(StrTab); zhengdian ();}
//KEY1按第二次或第二次定时器开始,电子钟和整点报时正 37、常显示
if(flag==3||flag==4) { TR0=0;alarm(); }
//按KEY1第三或第四次闹钟开始显示,分时的调整
if(flag==5) { dispaly(StrTab); }
//按KEY1第五次返回电子钟正常显示
if(flag==6) { TR0=0; flag=0; dispaly(ms); }
//按KEY1第六次定时器关闭,切换标志请零,显示d.1004-22
}
}
}其中专业理论知识内容包括:保安理论知识、消防业务知识、职业道德、法律常识、保安礼仪、救护知识。作技能训练内容包括:岗位操作指引、勤务技能、消防 38、技能、军事技能。
二.培训的及要求培训目的
安全生产目标责任书
为了进一步落实安全生产责任制,做到“责、权、利”相结合,根据我公司2015年度安全生产目标的内容,现与财务部签订如下安全生产目标:
一、目标值:
1、全年人身死亡事故为零,重伤事故为零,轻伤人数为零。
2、现金安全保管,不发生盗窃事故。
3、每月足额提取安全生产费用,保障安全生产投入资金的到位。
4、安全培训合格率为100%。
二、本单位安全工作上必须做到以下内容:
1、对本单位的安全生产负直接领导责任,必须模范遵守公司的各项安全管理制度,不发布与公司安全管理制度相抵触的指令,严格履行本人的安全职责,确保安全 39、责任制在本单位全面落实,并全力支持安全工作。
2、保证公司各项安全管理制度和管理办法在本单位内全面实施,并自觉接受公司安全部门的监督和管理。
3、在确保安全的前提下组织生产,始终把安全工作放在首位,当“安全与交货期、质量”发生矛盾时,坚持安全第一的原则。
4、参加生产碰头会时,首先汇报本单位的安全生产情况和安全问题落实情况;在安排本单位生产任务时,必须安排安全工作内容,并写入记录。
5、在公司及政府的安全检查中杜绝各类违章现象。
6、组织本部门积极参加安全检查,做到有检查、有整改,记录全。
7、以身作则,不违章指挥、不违章操作。对发现的各类违章现象负有查禁的责任,同时要 40、予以查处。
8、虚心接受员工提出的问题,杜绝不接受或盲目指挥;
9、发生事故,应立即报告主管领导,按照“四不放过”的原则召开事故分析会,提出整改措施和对责任者的处理意见,并填写事故登记表,严禁隐瞒不报或降低对责任者的处罚标准。
10、必须按规定对单位员工进行培训和新员工上岗教育;
11、严格执行公司安全生产十六项禁令,保证本单位所有人员不违章作业。
三、 安全奖惩:
1、对于全年实现安全目标的按照公司生产现场管理规定和工作说明书进行考核奖励;对于未实现安全目标的按照公司规定进行处罚。
2、每月接受主管领导指派人员对安全生产责任状的落
其中专业理论知识内容包括:保安理论 41、知识、消防业务知识、职业道德、法律常识、保安礼仪、救护知识。作技能训练内容包括:岗位操作指引、勤务技能、消防技能、军事技能。
二.培训的及要求培训目的
安全生产目标责任书
为了进一步落实安全生产责任制,做到“责、权、利”相结合,根据我公司2015年度安全生产目标的内容,现与财务部签订如下安全生产目标:
一、目标值:
1、全年人身死亡事故为零,重伤事故为零,轻伤人数为零。
2、现金安全保管,不发生盗窃事故。
3、每月足额提取安全生产费用,保障安全生产投入资金的到位。
4、安全培训合格率为100%。
二、本单位安全工作上必须做到以下内容:
1、对本单位的安全生产负直接领导责任 42、必须模范遵守公司的各项安全管理制度,不发布与公司安全管理制度相抵触的指令,严格履行本人的安全职责,确保安全责任制在本单位全面落实,并全力支持安全工作。
2、保证公司各项安全管理制度和管理办法在本单位内全面实施,并自觉接受公司安全部门的监督和管理。
3、在确保安全的前提下组织生产,始终把安全工作放在首位,当“安全与交货期、质量”发生矛盾时,坚持安全第一的原则。
4、参加生产碰头会时,首先汇报本单位的安全生产情况和安全问题落实情况;在安排本单位生产任务时,必须安排安全工作内容,并写入记录。
5、在公司及政府的安全检查中杜绝各类违章现象。
6、组织本部门积极参加安全检查,做到有 43、检查、有整改,记录全。
7、以身作则,不违章指挥、不违章操作。对发现的各类违章现象负有查禁的责任,同时要予以查处。
8、虚心接受员工提出的问题,杜绝不接受或盲目指挥;
9、发生事故,应立即报告主管领导,按照“四不放过”的原则召开事故分析会,提出整改措施和对责任者的处理意见,并填写事故登记表,严禁隐瞒不报或降低对责任者的处罚标准。
10、必须按规定对单位员工进行培训和新员工上岗教育;
11、严格执行公司安全生产十六项禁令,保证本单位所有人员不违章作业。
三、 安全奖惩:
1、对于全年实现安全目标的按照公司生产现场管理规定和工作说明书进行考核奖励;对于未实现安全目标的按照公司规定进行处罚。
2、每月接受主管领导指派人员对安全生产责任状的落






