功多能旋转电子钟课程设计大学毕设论文.docx
- 文档编号:24053476
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:39
- 大小:554.02KB
功多能旋转电子钟课程设计大学毕设论文.docx
《功多能旋转电子钟课程设计大学毕设论文.docx》由会员分享,可在线阅读,更多相关《功多能旋转电子钟课程设计大学毕设论文.docx(39页珍藏版)》请在冰豆网上搜索。
功多能旋转电子钟课程设计大学毕设论文
1.工作原理
1.1功能说明
1.本旋转LED电子钟采用STC89C52单片机作为控制芯片,DS1302时钟芯片为走时根据,确保了走时的精确度。
24小时制走时,60个发光二极管模拟石英钟的秒针走时,一秒亮一个,60秒走完一圈,走完一圈则分钟位数数码管加1,时时同步。
主数码管为4位时钟数码管,显示时、分,结合功能按键,可显示闹钟时间和实时温度(需加装18B20);3个2位数码管分别显示年、月、日;1个1位数码管显示星期。
2.整点报时功能,每天7—20点整点报时,报时时蜂鸣器响,同时秒灯高速旋转。
3.有一路闹钟功能,开机闹钟默认关闭。
S3位闹钟的开关键。
默认闹钟时间为6:
35。
闹钟响时为30秒钟。
4.掉电继续走时,数码管不显示。
来电时间继续走时,不用调整。
5.S1键为调整按键。
开机显示时分00:
08。
首次使用一定要启动时钟芯片走时,不然时钟一直为00:
08,不走时。
按S1键一次,时位数码管闪烁,这时按S2数值加1,按S3数值就会减1。
再按一次S1键,分位数码管闪烁,同理按S2、S3键来进行调整分的时间。
调整完后数码管还在闪烁,同理在按S1(S2,S3),分别调整年、月、日、星期,调整完后再按S1一次(或等待5秒),进入走时状态。
6.S2键为时间、闹钟、温度(安装18B20)切换键。
正常显示时间模式下,按S2一次则可显示闹钟时间,按二次显示当前温度(如29.6℃),按第三次则显示正常显示模式(即走时时间)。
在显示闹钟时,按S1键一次则闹钟的时位数码管会闪烁,这时可以按S2键和S3键进行调整。
按S1键二次则闹钟的分位数码管会闪烁,同理可按S2和S3键进行闹钟时间调整。
7.S3为闹钟的开关键。
正常显示时间模式下,按S3一次则打开闹钟,同时红色指示灯(D73)点亮,按二次则关闭闹钟,同时关闭红色指示灯(D73)。
工作原理
1.2.160个发光二极管驱动原理
采用了两片CD4017进行六十进制计数译码,实现60个发光二极管的驱动。
CD4017芯片是十进制计数/时序译码器,共有10个译码输出Q0~Q9;每个译码输出一般处于低电平,且在时钟脉冲由低到高的上升沿输出高电平;每个高电平输出维持一个时钟周期;每输入10个时钟脉冲,输出一个进位脉冲,因此进位输出信号可作为下一级计数器的时钟信号。
在清零输入端(R)加高电平或正脉冲时,只有输出端Q0为高电平,其余为低电平。
为实现对应的发光二极管点亮,应将每一个译码输出口对应的接一个发光二极管,每10个一组接限流电阻后接地。
当译码端口Q0~Q9中任一端口为高电平,则对应的发光二极管点亮。
在这次多功能旋转电子钟我们采用了两片CD4017来实现60个发光二级管的旋转点亮。
1.2.2时、分、年、月、日、星期显示部件驱动原理
LED数码管通常由7段译码集成电路组成,完成从数字到显示码的译码驱动。
本系统中采用的是软件译码,可以减少该实物的体积,降低成本和功耗,比硬件译码有更大的灵活性。
软件译码就是从数字到显示码的转换全由单片机完成。
从LED数码管的原理和结构可知,为了显示字符,要为LED显示数码管提供显示段码,组成一个“8”字形字符的7段,再加上1个小数点位,共计8段,因此提供给LED显示数码管的显示段码为一个字节。
系统的时、分显示部件由1个4只7段共阳LED数码管组成,前两只显示时,后两只用于分的显示;年、月、日的显示部件由3个2只7段共阳LED数码管组成;星期的显示部件由1个1只7段共阳LED数码管组成。
2.电路图
3.程序流程图
3.1时钟LED显示函数程序流程图
图3.1.1主程序流程图
3.2电子钟数显示日期函数程序流程图
图3.2.1按键检测程序流程图
图3.2.2写数据函数
图3.2.3读数据函数
图3.2.4读时间函数
图3.2.5初始化函数
图3.2.6数码管显示函数
图3.2.7主函数
3.3电子钟显示时间函数程序流程图
图3.3.1写数据和地址函数
图3.3.2读地址函数
图3.3.3初始化时和分函数
图3.3.4读取时和分函数
图3.3.5按键扫描函数
图3.3.6显示函数
图3.3.7主函数
3.4电子钟显示星期函数程序流程图
图3.4.1主函数
图3.4.2写函数
图3.4.3读函数
图3.4.4初始化时间函数
图3.4.5按键扫描函数流
4.仿真图
图4.1时钟LED显示
图4.2数码管日期显示
图4.3数码管时间显示
图4.4数码管星期显示
5.总结
经过这次的嵌入式课程设计,基本上完成了课题的要求,功能基本完善:
时钟显示,整点报时,闹钟功能。
时钟显示功能其精确度基本可以满足要求,调时功能方便快捷,报时闹钟准确。
硬件设施符合要求,软件设计可以配合硬件实现要求功能。
此次课程设计使我更进一步地熟悉了STC89C52芯片的结构及掌握了芯片的工作原理和其具体的使用方法。
也锻炼了自己独立思考问题的能力和通过查看相关资料来解决问题的习惯。
设计中遇到了很多意想不到的问题,从一开始的通过Protel设计原理图,到Proteus仿真与编写程序,最后是PCB板子的焊接,一直都是在发现问题和解决问题中度过。
还好自己一路坚持了下来,把问题一一解决。
其实这些都不是问题,只要有耐心,够细心,都可以把它们解决。
此次课程设计中出现的主要问题有如下几个:
1 在用Protel画电路图之前完全没有看懂图纸。
后面通过王文虎老师给我们讲述才能大概理解电路图每个模块的功能。
2 用Proteus仿真时不能出现正确的结果,比如所有的发光二极管都不能点亮、某些数码管显示不了时间等等。
后面更据王老师的建议分块仿真解决了这些问题。
3 在PCB板子焊接的时候,错放了元器件电阻,幸运的是即使从新焊接过正确的器件。
总的来说,通过这次课程设计我了解了课程设计的一般步骤,和设计中应注意的问题。
设计本身并不是有很重要的意义,而是在于个人对待问题时的态度和处理事情的能力。
6.参考文献
[1]曾屹.单片机原理与应用(第二版)[M].长沙:
中南大学出版社,2009
[2]周润景.基于Proteus的电路及单片机系统设计与仿真[M].北京:
北京航空航天大学出版社,2006
[3]周润景.Proteus入门实用教程[M].北京:
机械工业出版社,2007
[4]林立等.单片机原理及应用—基于Proteus和KeilC[M].北京:
电子工业出版社,2012
[5]孙育才等.Atmel新型AT89S52系列单片机及其应用[M].北京:
清华大学出版社,2005
[6]
[7]
7.致谢
时光飞逝,转眼间大学生活即将过去,大学生活中有苦、有乐。
我想这将是我以后最值得回念的一段时光。
此次课程设计能够顺利的完成,还得感谢父母、老师和同学的帮助。
首先,我要感谢的是养育了我20年的父母,是他们给予了我生命,给了我美好的人生开端,现在让我有机会进入大学,开拓视野,增长见识。
为了供养我读书,他们每天起早贪黑,辛勤劳作,在生活上非常节俭。
每次回家,当我还在睡梦中的时候,他们已经出去上班了,而且经常需要上晚班,工作很辛苦。
对我来说父亲是位睿智的良师,在我小时候他就教诲我“得意时淡然、失意时坦然”。
母亲对我来说是位难得的益友,她会在我不开心的时候,听我述说烦恼,并鼓励我继续向前。
对此我非常感谢他们对我的理解与支持。
最后,我再次对所有帮助我、关心我和支持我的老师、家人、同学、朋友致以最崇高的敬意!
谢谢大家!
8.附录一:
器件清单
序号
代号
名称
型号或规格
数量
备注
1
PCB板
15.6X15.6
1
硬板
2
DS1
数码管
4位
1
3
DS2、3、4
数码管
2位
3
4
DS5
数码管
1位
1
5
U1
单片机
STC89C52
1
6
U1
插座
DIP40
1
7
U2
时钟芯片
DS1302,SSOP8
1
8
U4、U5
计数器
CD4017,DIP16
2
9
D5,D10,D15,D20
D25,D30,D35
D40,D45,D50,D55
D60
发光二极管
方形、绿色
12
10
D61~D72
发光二极管
方形、红色
12
11
D1~4,D6~9,D11~D14,D16~D19,D21~D24,D26~D29,D31~D34,D36~39,D41~D44,D46~D49,D51~D54,D56~D59
发光二极管
Φ5、绿色
48
12
D73
发光二极管
Φ3、红色
1
13
Q0
二极管
IN4148
1
14
Q1~Q13
三极管
S8550
13
15
Q14~Q19
三极管
S8050
6
16
BELL
蜂鸣器
5V
1
17
Y1
晶振
11.0592MHz
1
18
Y2
晶振
32.768kHz
1
19
C3,C4
瓷片电容
6p
2
20
C1,C2
瓷片电容
30p
2
21
C8
瓷片电容
104
2
22
C5
电解电容
10μF/25V
1
23
C6,C7
电解电容
220μF/16V
1
24
S1,S2,S3
按键
4脚按键
3
25
R1~R19,R21~R33
电阻
3kΩ/0.25W
37
26
R34~R39
电阻
510Ω/0.25W
6
27
R20
电阻
62Ω/0.25W
1
短接
28
BTi
电池
3V
1
29
BTi
电池座
CR2032-2
1
30
DC5V
电源插座
5.5×2.1
1
31
DS1
电源线
USB接头,80cm
1
9.附录二:
源代码
1.时钟LED显示函数
#include
#defineuintunsignedint
#defineucharunsignedchar
sbitclk=P1^4;
ucharnum;
voidmain()
{
TMOD=0x01;//设置定时器0为工作方式1
TH0=(65536-45872)/256;//装初值11.0592M晶振定时50ms为45872
TL0=(65536-45872)%256;
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
while
(1)
{
if(num>=10)
{
num=0;
clk=~clk;
}
}
}
voidT0_time()interrupt1//中断函数
{
TH0=(65536-45872)/256;
TL0=(65536-45872)%256;
num++;
}
2.数码管显示日期
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitSCLK=P1^2;
sbitSDA=P1^1;
sbitRST=P1^0;//DS1302复位
sbitset1=P1^3;//定义按键端口
sbitset2=P1^4;
sbitset3=P1^5;
uintnian=16,yue=6,ri=19,xingqi,fen,shi,miao;
ucharcodeJD[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};//共阳极数码管显示0-9数字16进制编码
voidwrite(ucharadd,uchardate);
voidkey();
voidinit_time();
voiddelay(unsignedchari);
voidget_time();
voiddisplay();
voiddelayms(uintxms);//延时xms函数
voidmain()//主函数
{init_time();
while
(1)
{key();
get_time();
display();
}
}
voidwrite(ucharadd,uchardate)
{
uchartemp,t;
RST=0;
SCLK=0;
RST=1;
temp=add;
for(t=0;t<8;t++)//写地址命令
{
if((temp&0x01)==1)
SDA=1;
else
SDA=0;
SCLK=1;
delay(5);
SCLK=0;
temp=temp>>1;
}
temp=date;
for(t=8;t>0;t--)//写数据
{
if((temp&0x01)==1)
SDA=1;
else
SDA=0;
SCLK=1;
delay(5);
SCLK=0;
temp=temp>>1;
}
}
ucharread(ucharadd)
{
uchartemp,t;
RST=0;
SCLK=0;
RST=1;
temp=add;
for(t=0;t<8;t++)
{
if((temp&0x01)==1)
SDA=1;
else
SDA=0;
SCLK=1;
delay(5);
SCLK=0;
temp>>=1;
}
temp=0;
for(t=0;t<7;t++)
{
if(SDA==1)
temp=temp|0x80;
else
temp=temp&0x7f;
SCLK=1;
delay(5);
SCLK=0;
temp>>=1;
}
//传送一个字节需要16个时钟
returntemp/16*10+temp%16;//将BCD码转换成10进制码
}
voidinit_time()
{
write(0x8e,0x00);//写保护,相当于初始化或者缓冲
write(0x86,(ri/10<<4)|(ri%10));//写日
write(0x88,(yue/10<<4)|(yue%10));//写月
write(0x8c,(nian/10<<4)|(nian%10));//写年
}
//显示时间
voidget_time()
{
nian=read(0x8d);//读出时间年
yue=read(0x89);//读出时间月
ri=read(0x87);//读出时间日
}
voidkey()
{if(set1==0)
{delayms(20);
if(set1==0)
nian++;
if(nian==100)
nian=0;
while(set1==0);
write(0x8c,(nian/10<<4)|(nian%10));
}
if(set2==0)
{delayms(20);
if(set2==0)
yue++;
if(yue==13)
yue=0;
while(set2==0);
write(0x88,(yue/10<<4)|(yue%10));
}
if(set3==0)
{delayms(20);
if(set3==0)
ri++;
if(ri==32)
ri=0;
while(set3==0);
write(0x86,(ri/10<<4)|(ri%10));
}
}
voiddelayms(uintxms)//延时xms函数
{
uinti,j;
for(i=xms;i>0;i--)
for(j=110;j>0;j--);
}
voiddelay(unsignedchari)
{
while(i--==0);
}
voiddisplay()
{P3=0x00;//将P3^6和P3^7值低电平
P0=0xff;//...................//
P2=0x08;//第一个数码管显示为0//
P0=JD[nian/10];//....................//
delayms(6);//延时6ms
P0=0xff;//将P0口置高电平,消影
P2=0x04;//...................//
P0=JD[nian%10];//第二个数码管显示为1//
delayms(6);//....................//
P0=0xff;
P2=0x02;//...................//
P0=JD[yue/10];//第三个数码管显示为2//
delayms(6);//...................//
P0=0xff;
P2=0x01;//...................//
P0=JD[yue%10];//第四个数码管显示为3//
delayms(6);//...................//
P2=0x00;
P0=0xff;//...................//
P3=0x80;//第五个数码管显示为4//
P0=JD[ri/10];//...................//
delayms(6);
P0=0xff;//...................//
P3=0x40;//第六个数码管显示为5//
P0=JD[ri%10];//...................//
delayms(6);
}
3.数码管显示时间
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitSCLK=P1^2;
sbitSDA=P1^1;
sbitRST=P1^0;
sbitkey1=P1^4;
sbitkey2=P1^5;
uintfen,shi;
ucharcodetable[]={
0xc0,0xf9,0xa4,0xb0,0x99,
0x92,0x82,0xf8,0x80,0x90};//共阳极数码管显示0-9码表
voiddelayms(uintx)//延时ms函数
{
uinti,j;
for(i=x;i>0;i--)
for(j=110;j>0;j--);
}
voidwrite(ucharadd,uchardate)//写数据和地址
{
uchartemp,t;
RST=0;
SCLK=0;
RST=1;
temp=add;
for(t=0;t<8;t++)//写地址命令
{
if((temp&0x01)==1)
SDA=1;
else
SDA=0;
SCLK=1;
delayms
(1);
SCLK=0;
temp=temp>>1;
}
temp=date;
for(t=8;t>0;t--)//写数据
{
if((temp&0x01)==1)
SDA=1;
else
SDA=0;
SCLK=1;
delayms
(1);
SCLK=0;
temp=temp>>1;
}
}
ucharread(ucharadd)//读地址
{
uchartemp,t;
RST=0;
SCLK=0;
RST=1;
temp=add;
for(t=0;t<8;t++)
{
if((temp&0x01)==1)
SDA=1;
else
SDA=0;
SCLK=1;
delayms
(1);
SCLK=0;
temp>>=1;
}
temp=0;
for(t=0;t<7;t++)//读数据
{
if(SDA==1)
temp=temp|0x80;
else
temp=temp&0x7f;
SCLK=1;
delayms
(1);
SCLK=0;
temp>>=1;
}
returntemp/16*10+temp%16;//将16进制转换成10进制
}
voidinit_time()//初始化时和分
{
write(0x8e,0x00);//写保护,相当于初始化或者缓冲
write(0x82,0x00);//写分
write(0x84,0x12);//写时
}
voidget_time()//读取显示时间
{
shi=read(0x85);//读出时间时
fen=read(0x83);//读出时间分
}
voidkey()//按键扫描函数
{if(key1==0)
{delayms(10);
if(key1==0)
shi++;
if(shi==24)
shi=0;
while(key1==0);
write(0x84,(shi/10<<4)|(shi%10));//写时
}
if(key2==0)
{delayms(10);
if(key2==0)
fen++;
if(fen==60)
fen=0;
while(key2==0);
write(0x82,(fen/10<<4)|(fen%10));//写分
}
}
voiddisplay()//数码管显示函数
{
P0=0xff;
P2=0x80;
P0=table[shi/10];//第一个数码管显示小时的十位
delayms(6);//延时6ms
P0=0xff;//将P0口置高电平,消影
P2=0x40;
P0=table[shi%10];//第二个数码管显示小时的个位
delayms(6);
P0=0xff;
P2=0x20;
P0=table[fen/10];//第三个数码管显示分钟的十位
delayms(6);
P0=0xff;
P2=0x10;
P0=table[fen%10];//第四个数码管显示分钟的个位
delayms(6);
}
v
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 多能 旋转 电子钟 课程设计 大学 论文