基于C单片机的数字时钟课程设计C语言带闹钟.docx

上传人:b****8 文档编号:12105495 上传时间:2023-06-04 格式:DOCX 页数:20 大小:150.43KB
下载 相关 举报
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第1页
第1页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第2页
第2页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第3页
第3页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第4页
第4页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第5页
第5页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第6页
第6页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第7页
第7页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第8页
第8页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第9页
第9页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第10页
第10页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第11页
第11页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第12页
第12页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第13页
第13页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第14页
第14页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第15页
第15页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第16页
第16页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第17页
第17页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第18页
第18页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第19页
第19页 / 共20页
基于C单片机的数字时钟课程设计C语言带闹钟.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

基于C单片机的数字时钟课程设计C语言带闹钟.docx

《基于C单片机的数字时钟课程设计C语言带闹钟.docx》由会员分享,可在线阅读,更多相关《基于C单片机的数字时钟课程设计C语言带闹钟.docx(20页珍藏版)》请在冰点文库上搜索。

基于C单片机的数字时钟课程设计C语言带闹钟.docx

基于C单片机的数字时钟课程设计C语言带闹钟

单片机技术课程设计

数字电子钟

学院:

班级:

姓名:

学号:

教师:

摘要

电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用AT89C52单片机为核心,使用12MHz晶振与单片机AT89C52相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词:

电子钟AT89C52硬件设计软件设计

 

一、数字电子钟设计任务、功能要求说明及方案介绍

设计课题设计任务

设计一个具有特定功能的电子钟。

具有时间显示,并有时间设定,时间调整功能。

设计课题的功能要求说明

设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。

设计课的设计总体方案介绍及工作原理说明

本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:

图1-1总体设计方案图

本电子钟的所有的软件、参数均存放在AT89C52的FlashROM和内部RAM中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。

键盘采用动态扫描方式。

利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

二、设计课题的硬件系统的设计

硬件系统各模块功能简要介绍

2.1.1AT89C52简介

(1)兼容MCS51指令系统;

(2)8kB可反复擦写(大于1000次)FlashROM;

(3)32个双向I/O口;

(4)256x8bit内部RAM;

(5)3个16位可编程定时/计数器中断;

(6)时钟频率0-24MHz;

(7)2个串行中断,可编程UART串行通道;

(8)2个外部中断源,共8个中断源;

(9)2个读写中断口线,3级加密位;

(10)低功耗空闲和掉电模式,软件设置睡眠和唤醒功能;

(11)有PDIP、PQFP、TQFP及PLCC等几种封装形式,以适应不同产品的需求。

它的价格便宜,功能强大,能耗低。

很大程度上减少总电路的复杂性,提高了所设计系统的稳定性。

其芯片引脚图如图2-1所示。

图2-1单片机AT89S52引脚图

2.1.2按键电路

图2—2按键图

三、设计课题的软件系统的设计

使用单片机资源的情况

设计课题使用单片机资源的情况如下:

P0口输出数码管段选信号,P2口输出数码管位选信号;晶振12MHz;调整选择键KEY1:

;通过选择键选择调整位,选中位闪烁;增加键KEY2:

;按一次使选中位加1;减少键KEY3:

;按一次使选中位减1;此数字钟可实现基本的走时和显示时间时、分、秒;时间的调整;闹钟的设定和调整;闹钟的开启和关闭功能,具体如下:

(1)实现基本的走时和显示时间的时、分、秒,上电自动显示初始时间12-59-00,且控制闹钟状态的的红色led灯为亮的状态;

(2)当第一次按下第一个弹性按键时进入时间的调节状态,此时实现对显示时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时实现小时的减一调节;

(3)当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第二个按键时实现分钟的加一调节,按下第三个按键时实现分钟的减一调节;

(4)当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节;

(5)当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节;

(6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态;

(7)当同时按下第二和第三个弹性按键时,关闭闹钟,且此时蓝色led灯为灭,及定时时间到蜂鸣器并不响,若再次同时按下第二和第三个弹性按键,则开启闹钟,且此时红色led灯为亮,定时时间到蜂鸣器发出滴滴的闹铃声,同时按下第二和第三个弹性按键即可关闭闹铃。

闹铃状态默认为开启。

软件系统个模块功能简要介绍

本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、数码管及其驱动模块和延时模块。

主程序:

主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控制。

中断服务程序:

主要是用于电子钟的准确运行、数据输入过程中的闪烁。

键盘输入程序模块:

主要是用于确定按键并得到特定的键码值。

数码管及其驱动模块:

主要是用于驱动数码管及利用数码管显示时间。

延时模块:

程序中有两种延时子程序,一种是短延时用于判键按下等,一种是长延时。

软件系统程序流程框图

系统软件采用汇编语言按模块化方式进行设计,然后通过Keil软件开发平台将程序转变成十六进制程序语言,接着使用Proteous进行仿真,读出显示数据。

软件系统程序清单

本电子钟实现24小时制,8位数码管显示时分秒,显示式:

12-59-00。

通过4只按键来调整时间:

KEY1:

调整选择键,选中位闪烁;

KEY2:

增加键,按一次使选中位加1;

KEY3:

减少键,按一次使选中位减1;

Bear:

到了整点和闹钟就会响;

Led:

闪烁;

P0口输出数码管段选信号,P2口输出数码管位选信号;

晶振12MHz。

图3-1主程序流程框图

图3-2显示时钟数组子程序图3-3中断服务程序程序

四、设计课题的设计结论、仿真结果、误差分析

设计结论及使用说明

本设计为基于单片机的电子钟的设计。

刚开始,我们很多地方理不清头绪,无从下手,但通过认真研究设计课题,找书上网查资料,确定基本设计方案,对所用芯片功能进行查找、调试,然后画电路图等,积累了很多宝贵的经验。

本设计用2个四位一体的共阳数码管做为显示器,它显示时间值;设计中有三个按键,其中KEY1为启动键,KEY2为加控制键KEY3为减控制键。

图4—1结果图

仿真结果

在ProteusISIS的Debug菜单中选择Execute,运行程序,系统仿真结果如图所示。

实现功能:

可调整运行的电子钟具有三种工作状态:

“”状态、运行状态、调整状态。

图4-2“”上电初始化运行状态仿真结果

图4-3时钟正常运行状态仿真结果

图4-4闹钟定时调整状态仿真结果

图4-5小时调整状态仿真结果

图4-6分钟调整状态仿真结果

结束语

单片机课程设计是一门很实用,很复杂的设计。

这个设计用到了单片机,电路等方面的知识,通过这次课程设计,使我对单片机及其附属电路有了一定的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的不足。

  完成本次课程设计的过程,是一个从无到有的过程,经历了兴奋、所悟、完成几个过程。

刚做做课程设计时,仔细阅读设计的题目和要求,以为没什么困难的,所用的知识书上都有。

可是当我动手开始做的时候,才发现其中的算法,设计是那么繁琐。

经过一天的努力,再到图书馆和网上查找资料,在经过借鉴很多类似的资料,文献后,总算是有点眉目了。

埋头苦干的过程是痛苦的,在思考算法和程序框架时,迷茫,烦躁,也参考别人的思路,不断循环中,终于最后完善了程序。

其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域”的困难。

但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜悦,就在这样的痛与快乐的交换中,我学到了知识。

  通过这短短一周的实践,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。

知道了很多元器件有什么功效,在仿真仪器中是什么代码。

有的知识,自己感觉已经掌握得差不多了,但是实际操作起来就有问题出现了。

我遇到了不少问题,花费了很多的时间。

这让我重新反思我们的学习,深刻领悟到我们这个专业动手,实践的重要性。

理论不经过实践考验,是没法实施的,就像我们编的程序,很多方面考虑的都不够,几乎没有涉及到实际应用时的防范方法措施。

这次的课程设计,让我学到了很多书本上学不到的东西,学到了实际应用时。

最大的收获是:

对键盘,显示器,C51语言的应用有了深刻的了解。

参考文献

[1]XX文库,基于C51单片机的程序设计.

[2]XX百科,AT89C52简介

附录

附录A 程序清单

#include<>

#include<>

#include<>

#defineuintunsignedint

#defineucharunsignedchar

sbitKEY1=P1^1;//切换键

sbitKEY2=P1^2;//minute,hour调整加1定义

sbitKEY3=P1^7;//minute,hour调整减1定义

sbitbear=P3^1;//闹铃

sbitled=P1^2;//闹钟,整时灯闪烁

codeunsignedchartab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,

0x80,0x90,0xbf,0xc8,0x8e,0xff,0x21};//段码控制

charcodeweikong_code[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

ucharms[8]={2,2,10,4,0,0,1,14};

ucharStrTab[8];

ucharminute=59,hour=12,second=0;//正常时钟秒,分,时定义

ucharminute1=00,hour1=00;second1=00;//闹钟时钟秒,分,时定义

ucharflag=0,flag1=0;//切换标志

ucharnum=0;

uintcount=0;//定时器计数,定时50ms,count满20,秒加1

/***********子函数声明*******************************************/

voidxianshishuzu();//显示数组子程序

voidalarm();//闹钟子程序

/**********************延时子程序*****************************/

voiddelay(uintz)

{

uintx,y;

for(x=0;x

for(y=0;y<110;y++);

}

/**********************显示时钟子函数***************************/

voiddispaly(ucharw[8])

{

unsignedinti,j,aa;

aa=0xfe;//位选初值11111110

for(i=0;i<8;i++)//依次将数组w中八个数取出,并显示

{

P2=aa;//位选

j=w[i];//取出要显示的数码

P0=tab[j];//取出段选编码

aa=_crol_(aa,1);//位选信号循环右移

delay

(1);//显示延时

P0=0xff;//消影

}

}

/***********************显示时钟数组子程序***********************/

voidxianshishuzu()

{

StrTab[1]=second/10;//秒个位

StrTab[0]=second%10;//秒十位

StrTab[2]=10;//间隔符-

StrTab[4]=minute/10;//分个位

StrTab[3]=minute%10;//分十位

StrTab[5]=10;//间隔符-

StrTab[7]=hour/10;//时个位

StrTab[6]=hour%10;//时十位

}

/**********************键盘扫描子程序*************************/

voidkeycan()

{

if(KEY1==0)//按一次,正常显示,按第二次,时调整,按第三次,分调这整,

{

delay(10);//按键1去抖以及动作

if(KEY1==0)//确认按键是否按下

{

flag++;//切换标志

}

while(!

KEY1);//释放按键

}

if(flag==1)

{

if(KEY2==0)

{

delay(10);

if(KEY2==0)

{

hour++;//正常时间小时加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)

{

dispaly(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)//秒表的加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);

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(!

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)//按键去抖以及动作

{

delay(10);

if(KEY3==0)

{

minute1--;

if(minute1==0)minute1=59;//闹钟分减1

}

}

while(!

KEY3)

{

alarm();

}

}

}

/*******************蜂鸣器子程序****************************/

voidbeng()

{

bear=1;

P3=0xfd;

delay(100);

bear=0;

P3=0XFf;

delay(100);

}

/*****************整点报警子程序***************************/

voidzhengdian(void)

{

uchari=0;

if((second==0)&(minute==0))//整点报时

{

for(i=0;i<10;i++)

{

TR0=1;beng();dispaly(ms);

}

}

}

/********************************定时闹钟*******************************/

voidalarm()

{

uinti;

if((hour==hour1&&second1==minute1&&(second>=second1&&second

for(i=0;i<3;i++)

{beng();}

StrTab[1]=second1/10;//闹钟秒个位

StrTab[0]=second1%10;//秒十位

StrTab[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();

}

/**************************中断子程序*********************************/

voidtime_()interrupt1//中断程序

{

count++;

TH0=(65536-50000)/256;//重新送初值

TL0=(65536-50000)%256;

if(count==20)//定时器计数,定时50ms,count满20,秒加1

{

second++;count=0;

if(second==60)//秒值等于60,秒清零,分加1

{

second=0;minute++;

if(minute==60)//分值等于60,分清零,时加1

{

minute=0;hour++;

if(hour==24)//时值等于24,时清零,返回,全部归零

{

hour=0;

}

}

}

}

xianshishuzu();

}

/***********************数字电子钟主函数***************************/

voidmain()

{

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)//主循环

{

if(flag==0)

{

TR0=0;dispaly(ms);//上电初始化就显示

}

if(P1!

=0XFF)

{

keycan();//按键提前扫描

}

if(flag>0)

{

if(flag==1||flag==2){TR0=1;dispaly(StrTab);zhengdian();}

//KEY1按第二次或第二次定时器开始,电子钟和整点报时正常显示

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第六次定时器关闭,切换标志请零,显示

}

}

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 农林牧渔

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2