完整word版基于C51单片机的数字时钟课程设计C语言带闹钟Word文档下载推荐.docx
- 文档编号:17829046
- 上传时间:2022-12-11
- 格式:DOCX
- 页数:20
- 大小:164.24KB
完整word版基于C51单片机的数字时钟课程设计C语言带闹钟Word文档下载推荐.docx
《完整word版基于C51单片机的数字时钟课程设计C语言带闹钟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《完整word版基于C51单片机的数字时钟课程设计C语言带闹钟Word文档下载推荐.docx(20页珍藏版)》请在冰豆网上搜索。
(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按键图
三、设计课题的软件系统的设计
3.1使用单片机资源的情况
设计课题使用单片机资源的情况如下:
P0口输出数码管段选信号,P2口输出数码管位选信号;
晶振12MHz;
调整选择键KEY1:
P1.0;
通过选择键选择调整位,选中位闪烁;
增加键KEY2:
P1.1;
按一次使选中位加1;
减少键KEY3:
P1.2;
按一次使选中位减1;
此数字钟可实现基本的走时和显示时间时、分、秒;
时间的调整;
闹钟的设定和调整;
闹钟的开启和关闭功能,具体如下:
(1)实现基本的走时和显示时间的时、分、秒,上电自动显示初始时间12-59-00,且控制闹钟状态的的红色led灯为亮的状态;
(2)当第一次按下第一个弹性按键时进入时间的调节状态,此时实现对显示时间的小时调节,按下第二个按键时实现小时的加一调节,按下第三个按键时实现小时的减一调节;
(3)当第二次按下第一个弹性按键时进入显示时间的分钟调节状态,按下第二个按键时实现分钟的加一调节,按下第三个按键时实现分钟的减一调节;
(4)当第三次按下第一个弹性按键时进入闹钟的小时调节状态,按下第二个按键时实现闹钟小时的加一调节,按下第三个按键时实现闹钟小时的减一调节;
(5)当第四次按下第一个弹性按键时进入闹钟的分钟调节状态,按下第二个按键时实现闹钟分钟的加一调节,按下第三个按键时实现闹钟分钟的减一调节;
(6)当第五次按下第一个弹性按键时返回正常的显示时间走时状态;
(7)当同时按下第二和第三个弹性按键时,关闭闹钟,且此时蓝色led灯为灭,及定时时间到蜂鸣器并不响,若再次同时按下第二和第三个弹性按键,则开启闹钟,且此时红色led灯为亮,定时时间到蜂鸣器发出滴滴的闹铃声,同时按下第二和第三个弹性按键即可关闭闹铃。
闹铃状态默认为开启。
3.2软件系统个模块功能简要介绍
本设计的软件系统主要采用以下基本模块来实现,主程序、中断服务程序、键盘输入程序模块、数码管及其驱动模块和延时模块。
主程序:
主要是用于对输入信号的处理、输出信号的控制和对各个功能程序模块的运用及其控制。
中断服务程序:
主要是用于电子钟的准确运行、数据输入过程中的闪烁。
键盘输入程序模块:
主要是用于确定按键并得到特定的键码值。
数码管及其驱动模块:
主要是用于驱动数码管及利用数码管显示时间。
延时模块:
程序中有两种延时子程序,一种是短延时用于判键按下等,一种是长延时。
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):
闪烁;
晶振12MHz。
图3-1主程序流程框图
图3-2显示时钟数组子程序图3-3中断服务程序程序
四、设计课题的设计结论、仿真结果、误差分析
4.1设计结论及使用说明
本设计为基于单片机的电子钟的设计。
刚开始,我们很多地方理不清头绪,无从下手,但通过认真研究设计课题,找书上网查资料,确定基本设计方案,对所用芯片功能进行查找、调试,然后画电路图等,积累了很多宝贵的经验。
本设计用2个四位一体的共阳数码管做为显示器,它显示时间值;
设计中有三个按键,其中KEY1为启动键,KEY2为加控制键KEY3为减控制键。
图4—1结果图
4.2仿真结果
在ProteusISIS的Debug菜单中选择Execute,运行程序,系统仿真结果如图所示。
实现功能:
可调整运行的电子钟具有三种工作状态:
“d.1004-22”状态、运行状态、调整状态。
图4-2“d.1004-22”上电初始化运行状态仿真结果
图4-3时钟正常运行状态仿真结果
图4-4闹钟定时调整状态仿真结果
图4-5小时调整状态仿真结果
图4-6分钟调整状态仿真结果
结束语
单片机课程设计是一门很实用,很复杂的设计。
这个设计用到了单片机,电路等方面的知识,通过这次课程设计,使我对单片机及其附属电路有了一定的了解,对课本上的知识有了近一步的掌握,也深刻明白了自己的不足。
完成本次课程设计的过程,是一个从无到有的过程,经历了兴奋、所悟、完成几个过程。
刚做做课程设计时,仔细阅读设计的题目和要求,以为没什么困难的,所用的知识书上都有。
可是当我动手开始做的时候,才发现其中的算法,设计是那么繁琐。
经过一天的努力,再到图书馆和网上查找资料,在经过借鉴很多类似的资料,文献后,总算是有点眉目了。
埋头苦干的过程是痛苦的,在思考算法和程序框架时,迷茫,烦躁,也参考别人的思路,不断循环中,终于最后完善了程序。
其中的煎熬是很痛苦的,深刻明白攻克自己“未知领域”的困难。
但当课程设计完成时,那感觉是甜蜜的,没有耕耘,哪来得收获的喜悦,就在这样的痛与快乐的交换中,我学到了知识。
通过这短短一周的实践,我感觉到自己从课本上学到的理论知识和实践仍有很大的差距。
知道了很多元器件有什么功效,在仿真仪器中是什么代码。
有的知识,自己感觉已经掌握得差不多了,但是实际操作起来就有问题出现了。
我遇到了不少问题,花费了很多的时间。
这让我重新反思我们的学习,深刻领悟到我们这个专业动手,实践的重要性。
理论不经过实践考验,是没法实施的,就像我们编的程序,很多方面考虑的都不够,几乎没有涉及到实际应用时的防范方法措施。
这次的课程设计,让我学到了很多书本上学不到的东西,学到了实际应用时。
最大的收获是:
对键盘,显示器,C51语言的应用有了深刻的了解。
参考文献
[1]XX文库,基于C51单片机的程序设计.
[2]XX百科,AT89C52简介
附录
附录A 程序清单
#include<
reg51.h>
absacc.h>
intrins.h>
#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<
z;
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)
if(KEY2==0)
hour++;
//正常时间小时加1
if(hour==24)hour=0;
while(!
KEY2)//释放按键
{
dispaly(StrTab);
if(KEY3==0)
if(KEY3==0)
{
hour--;
//正常时间小时减1
if(hour==0)hour=23;
KEY3)
{
if(flag==2)
{
if(KEY2==0)//按键去抖以及动作
if(KEY2==0)
minute++;
//分加1
if(minute==60)minute=0;
while(!
KEY2)
{
}
}
if(flag==3)//秒表的加1
if(KEY3==0)
{
second++;
//秒加1
if(second==0)second=59;
}
while(!
}
if(flag==3)//闹钟对时
if(KEY2==0)
hour1++;
if(hour1==24)hour1=0;
//闹钟时间小时加1
alarm();
hour1--;
if(hour1==0)hour1=23;
//闹钟时间小时减
while(!
alarm();
if(flag==4)
if(KEY2==0)//按键去抖以及动作
delay(10);
if(KEY2==0)
minute1++;
if(minute1==60)minute1=0;
//闹钟分加1
if(KEY3==0)//按键去抖以及动作
delay(10);
minute1--;
if(minute1==0)minute1=59;
//闹钟分减1
}
KEY3)
/*******************蜂鸣器子程序****************************/
voidbeng()
bear=1;
P3=0xfd;
delay(100);
bear=0;
P3=0XFf;
/*****************整点报警子程序***************************/
voidzhengdian(void)
uchari=0;
if((second==0)&
(minute==0))//整点报时
for(i=0;
10;
i++)
TR0=1;
beng();
dispaly(ms);
}
/********************************定时闹钟*******************************/
voidalarm()
uinti;
if((hour==hour1&
&
second1==minute1&
(second>
=second1&
second<
second1+5))||(minute==0&
1))
3;
{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;
//0.5ms重新送初值
TL0=(65536-50000)%256;
if(count==20)//定时器计数,定时50ms,count满20,秒加1
count=0;
if(second==60)//秒值等于60,秒清零,分加1
second=0;
minute++;
if(minute==60)//分值等于60,分清零,时加1
minute=0;
hour++;
if(hour==24)//时值等于24,时清零,返回,全部归零
hour=0;
/***********************数字电子钟主函数***************************/
voidmain()
P1=0XFF;
TMOD=0x11;
//time0为定时器,方式1
//预置计数初值,50ms
EA=1;
//总中断开
ET0=1;
//允许定时器0中断
TR0=1;
//开启定时器0
while
(1)//主循环
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按第二次或第二次定时器开始,电子钟和整点报时正常显示
if(flag==3||flag==4){TR0=0;
//按KEY1第三或第四次闹钟开始显示,分时的调整
if(flag==5){dispaly(StrTab);
//按KEY1第五次返回电子钟正常显示
if(flag==6){TR0=0;
flag=0;
//按KEY1第六次定时器关闭,切换标志请零,显示d.1004-22
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 完整 word 基于 C51 单片机 数字 时钟 课程设计 语言 闹钟