基于时钟芯片的电脑时钟设计.docx
《基于时钟芯片的电脑时钟设计.docx》由会员分享,可在线阅读,更多相关《基于时钟芯片的电脑时钟设计.docx(29页珍藏版)》请在冰豆网上搜索。
基于时钟芯片的电脑时钟设计
目录
一、前言……………………………………………………………………………………3
1.实训目的………………………………………………………………………………3
2.实训内容与要求………………………………………………………………………3
二、主体……………………………………………………………………………………5
1.自己的实习计划………………………………………………………………………5
2.电脑时钟程序用到的STC89C52RC单片机电路图及部分元件原理图……………..5
2.1STC89C52RC单片机电路图…………………………………………………….5
2.2晶振电路电路图………………………………………………………………….6
2.3复位电路电路图………………………………………………………………….6
2.4四个独立按键电路图…………………………………………………………….6
2.5四个数码管显示电路电路图…………………………………………………….7
2.6四个LED指示灯及TTL串口下载电路图..............................................................8
2.7电源开关电路图………………………………………………………………….9
2.8实时时钟模块电路图……………………………………………………………..9
3.电脑时钟软件设计…………………………………………………………………...9
3.1简单时钟的主程序流程图………………………………………………………..9
3.2主程序设计……………………………………………………………………......12
3.3显示函数子程序设计……………………………………………………………..13
3.4按键输入子程序设计……………………………………………………………..14
3.5闹钟子程序设计…………………………………………………………………..16
3.6TO中断服务程序…………………………………………………………………16
4.调试程序及电脑时钟基本功能的实现………………………………………………17
三、实训心得体会…………………………………………………………………………..18
参考文献……………………………………………………………………………………..18
附录一电脑时钟电路图……………………………………………………………………19
附录二电脑时钟程序………………………………………………………………………20
一、前言
1.实训目的
通过《单片机系统综合训练》这一实践教学环节的训练让学生在已有的单片机的基本知识和基本实验能力基础上,让学生初步掌握单片机应用系统的软硬件设计及调试的方法,培养学生工程设计能力和实践创新能力。
2.实训内容与要求
设计题目:
基于时钟芯片的电脑时钟设计
学生姓名
杜天宇
课程名称
单片机系统综合训练
专业班级
电气2011
地点
实验楼I512
起止时间
18-19周
设计内容及要求
采用时钟芯片DS1302实现以下功能:
1.基本功能
①实时显示当前时间
②按设定时间用蜂鸣器报时
③能修改当前时钟。
2.扩展功能
实现室内温度检测功能等。
设计
参数
显示时间时,4位数码管显示,2位显示小时,2位显示分钟,第2位小数点0.5秒亮,0.5秒灭;蜂鸣器报时时间以每生学号最末位确定。
进度
要求
时间
内容
地点
指导教师
12.30
布置设计任务及要求,查资料,程序设计练习
I512、
506
钟、辜
李、吴
12.31
程序设计练习(时钟程序设计)
硬件电路画图练习(课后)
I512、506
钟、翟
李、王
1.1
元旦
1.2
程序设计练习(时钟程序设计)
硬件电路画图练习(课后)
I512、506
辜、钟
吴、王
1.3
总体方案设计,硬件设计、画硬件电路原理图
I512、506
翟、辜
李、吴
1.6
软件方案设计,画软件流程图
I512、506
钟、翟
李、王
1.7
程序设计、调试
I512、506
钟、辜
吴、王
1.8
程序设计、调试,讲解设计报告要求
I512、506
钟、翟
李、吴
1.9
程序设计、调试,撰写设计报告
I512、506
辜、翟
李、王
1.10
设计答辩验收
I512、506
全部参加
参考资料
1.王景景.单片机原理及应用.机械工业出版社
2.自编.单片机应用设计指导书
其它
说明
1.本表应在每次实施前一周由负责教师填写二份,院系审批后交院系办备案,一份由负责教师留用。
2.若填写内容较多可另纸附后。
3.一题多名学生共用的,在设计内容、参数、要求等方面应有所区别。
教研室主任:
指导教师:
钟秉翔/李作进/吴英/王雪/辜小花/翟渊
2013年12月
二、主体
1.自己的实习计划
1.查阅资料将老师布置的时钟程序设计出来,并调试下载至单片机上,实时显示时间,做到可以修改时间。
(2013年12月30----31日)
2.图书馆借一本关于Protel99se软件操作画图的书,并掌握基本作图的方法,做出自己所用单片机(STC89C52RC)的实现时钟功能用到的部件电路图。
(2014年1月2--6日)
3.在之前时钟程序的基础上,完善闹钟功能。
并完善时钟功能所用到的单片机部件电路图。
(2014年1月7—9日)
4.答辩并且完成实习实训总结报告。
(2014年1月10日)
2.电脑时钟程序用到的STC89C52RC单片机电路图及部分元件原理图
图一STC89C52RC单片机电路图
晶振可以说是单片机的时钟,有着固定稳固的频率,是一个标准,没有它的话,单片机的程序会乱跑,也有可能运行不了,反正是不正常。
图二晶振电路电路图
图三复位电路电路图
注释:
以上三幅图的STC89C52RC、晶振电路和复位电路组成单片机的最小系统。
图四四个独立按键电路图
LED数码管(LEDSegmentDisplays)由多个发光二极管封装在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。
数码管实际上是由七个发光管组成8字形构成的,加上小数点就是8个。
这些段分别由字母a,b,c,d,e,f,g,dp来表示。
当数码管特定的段加上电压后,这些特定的段就会发亮,以形成我们眼睛看到的字样了。
如:
显示一个“2”字,那么应当是a亮b亮g亮e亮d亮f不亮c不亮dp不亮。
LED数码管有一般亮和超亮等不同之分,也有0.5寸、1寸等不同的尺寸。
小尺寸数码管的显示笔画常用一个发光二极管组成,而大尺寸的数码管由二个或多个发光二极管组成,一般情况下,单个发光二极管的管压降为1.8V左右,电流不超过30mA。
发光二极管的阳极连接到一起连接到电源正极的称为共阳数码管,发光二极管的阴极连接到一起连接到电源负极的称为共阴数码管。
常用LED数码管显示的数字和字符是0、1、2、3、4、5、6、7、8、9、A、而此次实训所用的STC89C52RC单片机上的数码管有四个,属于共阴极数码管。
电路图如下图五所示。
图五四个数码管显示电路电路图
四个LED灯如下图所示,因为STC89C52RC单片机没有蜂鸣器,所以闹钟提醒的时候用D1闪烁来代替。
TTL串口下载为电脑与单片机连接接收电源和下载程序的端口。
图六四个LED指示灯及TTL串口下载电路图
电源开关关断后再次打开,时钟会重置。
实时时钟模块DS1302芯片是本次实训用到的主要芯片,是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。
采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。
DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。
DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
DS1302的引脚排列,其中Vcc1为后备电源,VCC2为主电源。
在主电源关闭的情况下,也能保持时钟的连续运行。
DS1302由Vcc1或Vcc2两者中的较大者供电。
当Vcc2大于Vcc1+0.2V时,Vcc2给DS1302供电。
当Vcc2小于Vcc1时,DS1302由Vcc1供电。
X1和X2是振荡源,外接32.768kHz晶振。
RST是复位/片选线,通过把RST输入驱动置高电平来启动所有的数据传送。
RST输入有两种功能:
首先,RST接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,RST提供终止单字节或多字节数据传送的方法。
当RST为高电平时,所有的数据传送被初始化,允许对DS1302进行操作。
如果在传送过程中RST置为低电平,则会终止此次数据传送,I/O引脚变为高阻态。
上电运行时,在Vcc>2.0V之前,RST必须保持低电平。
只有在SCLK为低电平时,才能将RST置为高电平。
I/O为串行数据输入输出端(双向),后面有详细说明。
SCLK为时钟输入端。
DS1302有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为BCD码形式,其日历、时间寄存器及其控制字。
DS1302与CPU的连接需要三条线,即SCLK、I/O、RST。
图七电源开关电路图图八实时时钟模块电路图
3.电脑时钟软件设计
3.1简单时钟的主程序流程图
简单时钟的程序流程图
全部代码
#include
#defineTHC00xee
#defineTLC00x00
#defineucharunsignedchar
ucharData_Buffer[4]={1,2,3,4};
ucharcodeDuan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x76};
ucharcount,sec,min,h;
ucharMode=0;
sbitP14=P1^4;
sbitP24=P2^4;
sbitP25=P2^5;
sbitP26=P2^6;
sbitP27=P2^7;
sbitLED1=P3^4;//四个指示灯
sbitLED2=P3^5;
sbitLED3=P3^6;
sbitLED4=P3^7;
sbitK_Mode=P2^0;//按键定义
sbitK_UP=P2^1;
sbitK_DN=P2^2;
voidtime1();
voidmain()
{
P14=0;
count=0;
sec=0;
min=0;
h=0;
TMOD=0x01;
TH0=THC0;
TL0=TLC0;
TR0=1;
ET0=1;
EA=1;
while
(1)
{
time1();
}
}
voidtime1()
{
if(count>=200)
{
count=0;
sec++;
}
if(sec>=60)
{
sec=0;
min++;
}
if(min>=60)
{
min=0;
h++;
}
if(h>=24)
h=0;
}
voidtime(void)interrupt1
{
staticunsignedcharBit=0;//静态变量,退出程序后,值保留
staticunsignedcharK_count=0;
TL0=TLC0;
TH0=THC0;
count++;
Bit++;
if(Bit>=4)Bit=0;
P2|=0xf0;
P0=Duan[Data_Buffer[Bit]];
if(count<100&&Bit==1)P0|=0x80;
switch(Bit)
{
case0:
P24=0;break;
case1:
P25=0;break;
case2:
P26=0;break;
case3:
P27=0;break;
}
Data_Buffer[0]=h/10%10;
Data_Buffer[1]=h%10;
Data_Buffer[2]=min/10%10;
Data_Buffer[3]=min%10;
if(K_Mode==0||K_UP==0||K_DN==0)//有键按下
{
K_count++;
if(K_count>=30)//消抖处理
{
K_count=0;
if(K_Mode==0)//修改Mode,
{
Mode++;
if(Mode>=3)Mode=0;
if(Mode==0){LED1=1;LED2=1;LED3=1;LED4=1;}//实时时间
elseif(Mode==1)LED1=0;//修改小时
elseif(Mode==2){LED1=1;LED2=0;}//修改分钟
}
elseif(K_UP==0)
{
if(Mode==1)//实时时间小时加
{h++;if(h>=24)h=0;}
elseif(Mode==2)//实时时间分钟加
{min++;if(min>=60)min=0;}
}
elseif(K_DN==0)
{
if(Mode==1)//小时减
{
if(h==0)h=23;
elseh--;
}
elseif(Mode==2)//分钟减
{
if(min==0)min=59;
elsemin--;
}
}
}
}
elseK_count=0;
}
3.2主程序设计
主程序流程图
voidmain()
{
DS1302_init();//调用时钟芯片DS1302的初始化函数
init();
while
(1)
{
P0=0x00;//数码管消影
DS1302_read_time();//调用读取DS1302时间参数函数
if(page==0)
display(shi,fen);
if(page==1)//调时时间
display1(nzshi,nzfen);
if(page==2)//调试闹钟
display1(naozhongshi,naozhongfen);
if((naozhongshi==shi)&&(naozhongfen==fen))
LED5=0;
key();
}
}
3.3显示函数子程序设计
子程序流程图
voidDS1302_set_time()//设置时间
{
DS1302_write(0x8e,0x00);//关写保护
DS1302_write(0x80,0x80);//关时间
DS1302_write(0x84,(shi/10<<4)|(shi%10));
DS1302_write(0x82,(fen/10<<4)|(fen%10));
DS1302_write(0x8e,0x80);//开写保护
DS1302_write(0x80,0x00);//关时间
}
3.4按键输入子程序设计
按键输入子程序流程图
voidmain()
{DS1302_init();//调用时钟芯片DS1302的初始化函数
init();
while
(1)
{
P0=0x00;//数码管消影
DS1302_read_time();//调用读取DS1302时间参数函数
if(page==0)
display(shi,fen);
if(page==1)//调时时间
display1(nzshi,nzfen);
if(page==2)//调试闹钟
display1(naozhongshi,naozhongfen);
if((naozhongshi==shi)&&(naozhongfen==fen))
LED5=0;
key();
}
}
3.5闹钟子程序设计
voiddisplay1(uchars,ucharf)
{
ucharh,l,m,n;
m=s/10;
n=s%10;
h=f/10;
l=f%10;
LED1=0;
P0=code1[m];
delay_ms
(2);
LED1=1;
LED2=0;
P0=code1[n];
delay_ms
(2);
LED2=1;
LED3=0;
P0=code1[h];
delay_ms
(2);
LED3=3;
LED4=0;
P0=code1[l];
delay_ms
(2);
LED4=1;
}
3.6TO中断服务程序
voidtimer0(void)interrupt1using3
{TH0=(65536-50000)/256;//定时器0重装初值
TL0=(65536-50000)%256;
count++;
if(count==10)//定时时间为t=50ms*20=1s
{
flag=~flag;
count=0;
}
}
4.调试程序及电脑时钟基本功能的实现
从一开始简单的时钟程序,只能修改时间,没有闹钟,且没有用到STC89C52RC单片机的DS1302芯片,到最后查找资料修改程序,用DS1302芯片实现简单的修改时间、定时、闹铃闪烁这些基本功能,不太容易。
最后做出来的电脑时钟还是有一些性能上的缺陷,即使时间大概15秒为一分钟,而且STC89C52RC单片机的四个按键有些不够用,只能ENT键修改模式,在实时时间、修改时间、调节闹钟定时这三个模式间转换。
而修改时间和闹钟只能往上加而不能减,比较不方便。
且可能是DS1302芯片的原因,数码管显示有一些小问题,隔一段时间或者键按下去的时候会有些显示错乱。
这还待改进。
三、实训体会
在重庆科技学院已经读了两年半了,感触颇深,大一和大二的时候还不怎么觉得累,但是自从大三这第一个学期开了这么多门专业课以后,感觉学习和生活一下子紧张了起来。
其中单片机就感觉很难,自己对这个不是很感兴趣,下的精力少,最后的期末考试马马虎虎的及格,等到期末最后两周单片机系统实训的时候感觉非常的恼火,很简单的一个程序甚至一个语句都搞不明白,数字符号所代表的意思也都忘光了,但是实训要做程序的,所以只好算是从头再来了,不会的就翻书或者XX搜索,这样又通过本次实训捡起了不少单片机及C语言方面的知识。
并且手拿单片机电路板手把手的操作,通过Keiluvision4软件创建工程,写入程序,通过STC-ISp-15xx-v6.60软件来打开工程里的程序并连接下载至单片机上。
操作方面熟练了许多,这些程序也熟练的掌握了一部分,不敢说全部。
最令自己感到满意的是单片机电路板电路图的画法,自学并熟练的掌握了画图软件Protel99se的基本功能,完全是自己将电路图给画了出来。
本来一些原件像四位数码管没有查找到,于是自己新建了一个元件,最后弄在了电路图上。
确实掌握了不少,而且做的过程中,同学们互相帮助,认识了许多新的朋友。
我认为这次实训非常的有意义,让我们对自己这学期甚至是这大学几年的学习来检验一下,看自己知识联系实际能应用多少。
发现并找到自己的不足以及知识上的漏洞,刺激自己及时的改正不足,填补漏洞。
参考文献
1.王景景..单片机原理及应用…….机械工业出版社
2.郭勇…..Protel99se印制电路板设计教程…..机械工业出版社
3.宋戈…..51单片机应用开发范例大全(第二版)…人民邮电出版社
附录一电脑时钟电路图
附录二电脑时钟程序
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitDS1302_SCLK=P3^6;//定义时钟芯片DS1302时钟线
sbitDS1302_IO=P3^7;//定义时钟芯片DS1302数据线
sbitDS1302_RST=P2^3;//定义时钟芯片DS1302复位线
ucharcode1[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
voidDS1302_writebyte(ucharwritebyte);//往DS1302写一个字节
ucharDS1302_readbyte();//往DS1302读一个字节
ucharDS1302_read(ucharDS1302_add);//往DS1302指定地址读数据
voidDS1302_write(ucharDS1302_add,ucharDS1302_data);//往DS1302指定地址写数据
voidDS1302_init();//DS1302初始化函数
voidDS1302_set_time();//设置时间
voidDS1302_read_time();//读取时间
sbitACC0=ACC^0;
sbitACC7=ACC^7;
sbitkey1=P2^0;
sbitkey2=P2^1;
sbitkey3=P2^2;
sbitkey4=P3^2;
sbitLED1=P2^4;
sbitLED2=P2^5;
sbitLED3=P2^6;
sbitLED4=P2^7;
sbitLED5=P3^4;//指示灯
charshi=23,fen=45,key5=0,flag;
charnzshi=0,nzfen=0,page;
charnaozhongshi=0,naozhongfen=1;
ucharcount=0;
/*******************DS1302的初始化**********************************/
//功能:
上电时对时钟芯片DS1302里面的数据全部清零
/****************************************************************