单片机课程设计报告电子钟.docx
- 文档编号:3635881
- 上传时间:2022-11-24
- 格式:DOCX
- 页数:31
- 大小:847.61KB
单片机课程设计报告电子钟.docx
《单片机课程设计报告电子钟.docx》由会员分享,可在线阅读,更多相关《单片机课程设计报告电子钟.docx(31页珍藏版)》请在冰豆网上搜索。
单片机课程设计报告电子钟
中北大学
单片机课程设计说明书
数字钟设计
1设计任务与要求
1.1设计任务
本课题应完成以下设计容:
1)硬件设计
设计数字钟的电路原理图,用PROTEL绘制硬件电路。
制作实物。
2)软件设计
(1)时、分、秒的设置及显示;
(2)画出程序框图;
(3)调试与分析。
用PROTEUS仿真。
3)课程设计说明书
1.2设计要求
本课程设计的基本要使学生全面掌握单片机控制系统设计的基本理论,熟悉掌握MCS-51系列单片机的编程方法,具体要求:
本例利用AT89C51的定时器和6位7段数码管,设计一个电子时钟。
显示格式为“XXXXXX”,由左向右分别是:
时、分、秒。
2单片机简介
2.1单片机的发展历程
单片机是微型计算机的一个重要分支,也是一种非常活跃和颇具生命力的机种,特别适用于工业控制领域。
1971年微处理器研制成功不久,就出现了单片机,但最早的单片机是1位的,处理能力有限。
单片机的发展共分四个阶段:
第一阶段是初级阶段,功能非常简单;第二阶段是低性能阶段,16位定时器/计数器,片ROM、RAM容量加大,直到现在仍被广泛应用,是目前应用数量较多的单片机。
、32位单片机推出阶段,以满足不同的用户需要。
纵观单片机几十年的发展历程,单片机的今后发展方向将向多功能、高性能、高速度、低功耗、低价格、外围电路装化以及存储器容量增加和FLASH存储器化方向发展。
2.2实用价值与理论意义
在单片机模块里比较常见,数字时钟是一种用0数字电路技术实现时、分、秒计时的装置,与机械式时钟相比具有更高的准确性和直观性,且无机械装置,具有更高的使用寿命,新词得到了广泛的应用。
数字时钟是采用数字电路实现对时、分、秒数字显示的计时装置,广泛用于个人家庭、车站、码头、办公室等公用场所,成为人们日常生活中不可少的必需品,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字时钟的精度远远超过老式钟表,钟表的数字化给人们的生产生活带来了极大的方便,而且大扩展了钟表原先的报时功能。
因此研究数字时钟及扩大其应用有着非常现实的意义。
3系统设计思路和方案
3.1系统总体方案
图3.1整体设计思路
针对要实现的功能,拟采用AT89C51单片机进行设计,AT89C51单片机是一款低功耗,高性能CMOS8位单片机,片含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构。
这样,既能做到经济合理又能实现预期的功能。
在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。
程序可分为闹钟的声音程序、显示程序、闹钟显示程序、调时显示、定时程序。
运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。
3.2硬件简介
3.2.1硬件选择
(1)单片机的选择 选用STC89C52单片机,并配备12MHz晶振,复位电路采用上电复位。
(2)显示电路选择 采用软件译码动态显示,P3.0-P3.3作数码管的位选口。
P1.0-P1.6作数码管的段选口。
考虑直接用单片机I/O口作位选时驱动功率不够,
(3)电源选择 采用直流3V电源供电。
(4)STC89C52是一种带8K字节闪烁可编程可檫除只读存储器(FPEROM-Flash
Programable and Erasable Read Only Memory )的低电压,高性能OS8的微处理器,俗称单片机。
该器件采用ATMEL搞密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
3.2.251单片机的构成
STC89C52RC单片机是宏晶科技推出的新一代高速/低功耗/超强抗干扰的单片机,指令代码完全兼容传统8051单片机,12时钟/机器周期和6时钟/机器周期可以任意选择。
主要特性如下:
1、增强型8051单片机,6时钟/机器周期和12时钟/机器周期可以任意选择,指令代码完全兼容传统8051.
2、工作电压:
5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机)
3、工作频率围:
0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz
4、用户应用程序空间为8K字节
5、片上集成512字节RAM
6、通用I/O口(32个),复位后为:
P1/P2/P3/P4是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。
7、ISP(在系统可编程)/IAP(在应用可编程),无需专用编程器,无需专用仿真器,可通过串口(RxD/P3.0,TxD/P3.1)直接下载用户程序,数秒即可完成一片
8、具有EEPROM功能
9、具有看门狗功能
10、共3个16位定时器/计数器。
即定时器T0、T1、T2
11、外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒
12、通用异步串行口(UART),还可用定时器软件实现多个UART
13、工作温度围:
-40~+85℃(工业级)/0~75℃(商业级)
14、PDIP封装
3.2.3STC89C52RC引脚功能说明
VCC(40引脚):
电源电压
VSS(20引脚):
接地
RST(9引脚):
复位输入。
当输入连续两个机器周期以上高电平时为有效,用来完成单片机单片机的复位初始化操作。
看门狗计时完成后,RST引脚输出96个晶振周期的高电平。
特殊寄存器AUXR(地址8EH)上的DISRTO位可以使此功能无效。
DISRTO默认状态下,复位高电平有效。
ALE/
(30引脚):
地址锁存控制信号(ALE)是访问外部程序存储器时,锁存低8位地址的输出脉冲。
在Flash编程时,此引脚(
)也用作编程输入脉冲。
(29引脚):
外部程序存储器选通信号(
)是外部程序存储器选通信号。
当AT89C51RC从外部程序存储器执行外部代码时,
在每个机器周期被激活两次,而访问外部数据存储器时,
将不被激活。
/VPP(31引脚):
访问外部程序存储器控制信号。
为使能从0000H到FFFFH的外部程序存储器读取指令,
必须接GND。
注意加密方式1时,
将部锁定位RESET。
为了执行部程序指令,
应该接VCC。
在Flash编程期间,
也接收12伏VPP电压。
XTAL1(19引脚):
振荡器反相放大器和部时钟发生电路的输入端。
XTAL2(18引脚):
振荡器反相放大器的输入端。
图3.2STC89C52RS
3.2.4LED简介
LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。
图2.7(a)是共阴和共阳极数码管的部电路图,它们的发光原理是一样的,只是它们的电源极性不同而已。
将多只LED的阴极连在一起即为共阴式,而将多只LED的阳极连在一起即为共阳式。
以共阴式为例,如把阴极接地,在相应段的阳极接上正电源,该段即会发光。
当然,LED的电流通常较小,一般均需在回路中接上限流电阻。
假如我们将"b"和"c"段接上正电源,其它端接地或悬空,那么"b"和"c"段发光,此时,数码管显示将显示数字“1”。
而将"a"、"b"、"d"、"e"和"g"段都接上正电源,其它引脚悬空,此时数码管将显示“2”。
其它数字的显示原理与此类同。
LED的7段数码管利用单只LED组合排列成“8”字型的数码管,分别引出它们的电极,点亮相应的点划来显示出0-9的数字。
在这次的设计中采用的均是共阴极的LED显示,当I/O口输出为高电平的时候,对应段就被点亮。
LED数码管的结构图如图2.4(b)所示。
(a)
(b)
图3.3LED分类结构图和结构图
这次设计的显示部分采用AT89C51单片机动态扫描完成, 在多数的应用场合中,我们并不希望使用多I/O端口的单片机,原则上是使用尽量少引脚的器件。
在没有富余端口的情况下,应通过优化设计程序和扩展电路达到预期的目的。
动态扫描的频率有一定的要求,频率太低,LED将出现闪烁现象。
如频率太高,由于每个LED点亮的时间太短,LED的亮度太低,肉眼无法看清,所以一般均取几个ms左右为宜,这就要求在编写程序时,选通某一位LED使其点亮并保持一定的时间,程序上常采用的是调用延时子程序。
3.3Keil调试
启动Keil软件,选择“Project”菜单下的“NewProject”命令,输入项目的文件名,选择存储路径,点击“保存”按钮。
在“SelectDevice”窗口中选择“Atmel”下的“AT89C51”芯片,单击“确定”按钮。
展开“ProjectWorkspace”窗口中的“Target1”,右击“Target1”,选择“OptionsforTarget’Target1’”,选择“Target”选项在Keil(MHZ)右边输入“12m”。
选择“Debug”选项,选择“UseKeilMonitor-51Driver”。
单击“Settings”按钮,串口选择“1”,波特率选择“38400”,单击“OK”按钮。
右击“SourceGroup1”,选择“AddfilestoGroup‘SourceGroup1’,在文件类型中选择“AsmSourcefile”,找到将要编译的程序,单击“ADD”按钮,然后再单击“CLOSE”按钮。
单击“Rebuildalltargetfiles”,在“Build”窗口中观察编译结果,根据提示修改程序,直到没有错误出现。
4、系统实物图
图4.1系统实物图
5、课程设计体会
这次电子技术课程设计,我很用心的去完成,当总原理图绘好的那一刻,心里有说不出的满足感。
从这次课程设计中,我真正学到了很多有用的知识。
拿到课题后,我首先将《单片机原理与应用及C51程序设计》中有关本次设计的容复习了一遍,比如七段译码显示器、计数器、振荡器等等。
然后根据设计要求,我去图书馆查阅了相关的资料,对整体框架做了一个初步的了解。
做完准备工作后就正式开始设计与绘图。
先要将没每一功能模块设计出来,再整体排版、连接。
这次设计让我熟练掌握了课本上的一些理论知识,在这次课程设计中,反复查找资料,发现电路中的错误和改善电路中的错误,让我将课本上的理论知识重新过了一遍。
回过头来一想,其实设计这些电路也并不是很困难,而且还十分有意思,特别是用protues将电路图模拟成功后很有成就感。
课程设计是一个学习新知识、巩固加深所学课本理论知识的过程,它培养了我们综合运用知识的能力,独立思考和解决问题的能力。
它不仅加深了我对单片机课程的理解,还让我感受到了设计电路的乐趣。
在这次设计中,我一点也不怕麻烦,反复设计、绘图与修改,就是希望能把这次课程设计做好。
因此对我来说,这次课程设计是非常有意义的。
参考文献
[1]文龙.单片机原理及应用[M].:
电子科技大学,1993
[2]胡汉才.单片机原理及系统设计[M].:
清华大学,2003
[3]忠煌,黄博俊,.单芯片8051实务与应用[M].:
中国水利水电,2001
[4]王守中,51单片机开发入门与典型实例[M].人民邮电
[5]徐爱钧,单片机原理与应用:
基于Proteus虚拟仿真技术[M].:
机械工业,2010.7
[6]周润景,基于PROTEUS的电路及单片机设计与仿真(第二版)[M].:
航空航天大学,2009.12
[7]肖洪兵.跟我学用单片机[M].:
航空航天大学,2002.8
[8]何立民.单片机高级教程[M].第1版.:
航空航天大学,2001
[9]晓安.MCS-51单片机原理及应用[M].XX:
XX大学,2001.3
[10]广第.单片机基础.第1版[M].:
航空航天大学,1999
[11]涵芳.MCS-51/96系列单片机原理及应用(修订版)[M].航空航天大学,1994
[12]朝青.单片机原理及接口技术(第3版)[M].航空航天大学,2005
[13]夏继强.单片机实验与实践教程[M].:
航空航天大学,2001
[14]小虎.电工实习(I)[M].:
中国电力,1996
[15]焦辎厚.电子工艺实习教程[M].:
工业大学,1993
[16]宋春荣.通用集成电路速查手册[M].科学技术,1995
[17]高吉祥.电子技术基础实验与课程设计[M].电子工业,2002
附录A
硬件原理图
PROTEUS仿真运行结果
附录B
软件设计流程图
附录C
#include
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitdis_bit1=P2^7;//定义数码管控制口
sbitdis_bit2=P2^6;//定义数码管控制口
sbitdis_bit3=P2^4;//定义数码管控制口
sbitdis_bit4=P2^3;//定义数码管控制口
sbitdis_bit5=P2^1;//定义数码管控制口
sbitdis_bit6=P2^0;//定义数码管控制口
sbitled1_bit=P2^2;//定时LED的控制口
sbitled2_bit=P2^5;//定时LED的控制口
sbits1_bit=P1^0;//定义S1控制口
sbits2_bit=P1^1;//定义S2控制口
sbits3_bit=P1^2;//定义S3控制口
sbitspeak=P3^7;//定义蜂鸣器控制口
#definesmg_dataP0//定义数码管数据口
voiddelay_50us(uintt);//延时50*T微妙函数的声明
voiddisplay1(uchardis_data);//数码管1显示子程序
voiddisplay2(uchardis_data);//数码管2显示子程序
voiddisplay3(uchardis_data);//数码管3显示子程序
voiddisplay4(uchardis_data);//数码管4显示子程序
voiddisplay5(uchardis_data);//数码管5显示子程序
voiddisplay6(uchardis_data);//数码管6显示子程序
voidinit_t0();//定时器0初始化函数
voiddis_led();//LED处理函数
voidjudge_s1();//S1按键处理函数
voidjudge_s2();//S2按键处理函数
voidjudge_s3();//S3按键处理函数
voiddis(uchars6,uchars5,uchars4,uchars3,uchars2,uchars1);//显示子程序
voiddis_san(uchars6,uchars5,uchars4,uchars3,uchars2,uchars1,ucharsan);//闪烁显示子程序
voidjudge_dis();//显示处理函数
voidjudge_clock();//显示处理函数
//共阳数码管断码表
constunsignedchartabl1[17]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,
//012345
0x82,0xf8,0x80,0x90,0x86,0x87,0xFF,
//6789ETB
0xc6,0xa1,0x8e,0xb6};//CDF三
uchart0_crycle;
ucharhour_count,minute_count,second_count,msecond_count;
ucharclock_hour,clock_minute;
ucharclock_en;//闹钟关闭和开启的标志,1开启,0关闭
ucharflag1,zancun1,zancun2,zancun3;//,flag2;
ucharclock_flag;
uintspeak_count;
//主程序
voidmain()
{
P3=0x00;
flag1=0;
zancun3=0;
speak=1;//关闭蜂鸣器
speak_count=0;
clock_hour=0;
clock_minute=0;
clock_flag=0;
clock_en=0;//开机时默认关闭闹钟
init_t0();
TR0=1;//
//接下来开始编写让数码管显示的程序
while
(1)
{
judge_dis();//显示处理
judge_s1();
judge_s2();
judge_s3();
judge_clock();//闹钟处理程序
}
}
voidtimer0()interrupt1
{
TH0=(65536-50000)/256;
TL0=(65536-50000)/256;
t0_crycle++;
if(t0_crycle==2)//0.1秒
{
t0_crycle=0;
msecond_count++;
if(msecond_count==10)//1秒
{
msecond_count=0;
second_count++;
if(second_count==60)
{
second_count=0;
minute_count++;
if(minute_count==60)
{
minute_count=0;
hour_count++;
if(hour_count==24)
{
hour_count=0;
}
}
}
}
}
}
//显示处理函数
voidjudge_dis()
{
if(flag1==0)
{
dis(hour_count/10,hour_count%10,minute_count/10,
minute_count%10,second_count/10,second_count%10);
dis_led();
}
if(flag1!
=0)
{
switch(flag1)
{
case1:
dis(5,10,11,1,12,12);//显示SET1
led1_bit=1;
led2_bit=1;
break;
case2:
dis(5,10,11,2,12,12);//显示SET2
break;
case3:
dis(5,10,11,3,12,12);//显示SET3
break;
case4:
dis(5,10,11,4,12,12);//显示SET4
break;
case5:
dis(5,10,11,5,12,12);//显示SET5
break;
case6:
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,12,1);
break;
case7:
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,12,2);
break;
case8:
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,12,3);
break;
case9:
//进入修改时间,时间分位个位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,12,4);
break;
case10:
//进入修改闹钟,闹钟小时十位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,zancun3,1);
break;
case11:
//进入修改闹钟,闹钟小时个位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,zancun3,2);
break;
case12:
//进入修改闹钟,闹钟小时十位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,zancun3,3);
break;
case13:
//进入修改闹钟,闹钟小时个位闪烁
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,zancun3,4);
break;
case14:
//进入修改闹钟的开关
dis_san(zancun1/10,zancun1%10,zancun2/10,
zancun2%10,12,zancun3,6);
break;
default:
break;
}
}
}
//S1按键处理函数
voidjudge_s1()
{
s1_bit=1;//置IO为1,准备读入收据
if(s1_bit==0)//判断是否有按键按下
{
delay_50us
(1);//延时,去除机械抖动
if(s1_bit==0)
{
switch(flag1)
{
case0:
flag1=1;
break;
case1:
flag1=2;
break;
case2:
flag1=3;
break;
case3:
flag1=4;
break;
case4:
flag1=5;
break;
case5:
flag1=0;
break;
case6:
//在修改时间小时十位下按S1键
flag1=7;
break;
case7:
flag1=8;
break;
case8:
flag1=9;
break;
case9:
flag1=6;
break;
case10:
flag1=11;
break;
case11:
flag1=12;
break;
case12:
flag1=13;
break;
case13:
flag1=14;
break;
case14:
flag1=10;
break;
default:
break;
}
while(s1_bit==0)
{
judge_dis();
}//等待按键释放
}
}
}
//S2按键处理函数
voidjudge_s2()
{
s2_bit=1;//置IO为1,准备读入收据
if(s2_bit==0)//判断是否有按键按下
{
delay_50us
(1);//延时,去除机械抖动
if(s2_bit==0)
{
switch(flag1)
{
case1:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 课程设计 报告 电子钟