多功能数据钟课程设计.docx
《多功能数据钟课程设计.docx》由会员分享,可在线阅读,更多相关《多功能数据钟课程设计.docx(17页珍藏版)》请在冰豆网上搜索。
多功能数据钟课程设计
微型计算机技术专业方向设计
任务书
题目名称:
多功能数字钟
专业班级
姓名学号
课程设计任务书
课程名称:
微型计算机技术
设计题目:
多功能数字钟
系统硬件要求:
1、配置单片机的外部程序ROM空间,容量为16K(使用27128芯片)。
2、使用51单片机内部时钟信号为系统提供计时信号。
3、配置LED数码管或液晶显示器显示时间,设置操作按键。
系统功能要求:
1、在LED数码显示器或液晶显示器上显示:
时:
分:
秒。
2、按键功能自定义,实现按键调整时间功能。
3、具有闹钟功能(选做)。
4、具有秒表功能(选做)。
其他要求:
1、每位同学独立完成本设计。
2、依据题目要求,提出系统设计方案。
3、设计系统电路原理图。
5、调试系统硬件电路、功能程序。
6、编制课程设计报告书并装订成册,报告书内容(按顺序)
(1)报告书封面
(2)课程设计任务书
(3)系统设计方案的提出、分析
(4)系统中典型电路的分析
(5)系统软件结构框图
(6)系统电路原理图
(7)源程序
(8)课设字数不少于2000字
成绩
评语
一、系统方案选择
①数字时钟选择:
方案一:
本方案采用Dallas公司的专用时钟芯片DS12887A。
该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。
为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。
当电网电压不足或突然掉电时,系统自动转换到内部锂电池供电系统。
而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。
方案二:
本方案完全用软件实现数字时钟。
原理为:
利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将十字节清零。
该方案具有硬件电路简单的特点。
但由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。
而且,由于是软件实现,当单片机不上电,程序不执行时,时钟将不工作。
基于硬件电路的考虑,本设计采用方案二完成数字时钟的功能。
②显示方案选择:
方案一:
采用6段数码管动态显示,数码管动态扫描时,是利用人的视觉暂留使显示看起来连续变化,优点是程序操作简单缺点:
可操作性不强,并不美观。
方案二:
采用液晶1602,1602的特点是有两行显示,每行显示16个字符,显示比较清晰美观,缺点是操作较为复杂。
出于显示的考虑,本实验选择方案二。
③键盘方案选择:
方案一:
采用独立按键,独立按键的特点是检测较为简单,比较容易知道哪个按键被按下了,但是后续的键值处理较为复杂.。
方案二:
采用矩阵键盘,矩阵键盘的特点是检测较为复杂,但便于后续程序使用键值比较简单。
出于硬件的考虑本实验采用方案一。
二、系统典型电路分析
①
复位电路:
单片机复位的条件是:
必须使RST/VPD或RST引(9)加上持续两个机器周期(即24个振荡周期)的高电平。
例如,若时钟频率为12MHz,每机器周期为1μs,则只需2μs以上时间的高电平,在RST引脚出现高电平后的第二个机器周期执行复位。
单片机常见的复位如图所示。
电路为上电复位电路,它是利用电容充电来实现的。
在接电瞬间,RESET端的电位与VCC相同,随着充电电流的减少,RESET的电位逐渐下降。
只要保证RESET为高电平的时间大于两个机器周期,便能正常复位。
该电路除具有上电复位功能外,若要复位,只需按图中的RESET键,此时电源VCC经电阻R1、R2分压,在RESET端产生一个复位高电平。
②晶振电路:
右图所示为时钟电路原理图,在AT89S51芯片内部有一个高增益反相放大器,其输入端为芯片引脚XTAL1,输出端为引脚XTAL2。
而在芯片内部,XTAL1和XTAL2之间跨接晶体振荡器和微调电容,从而构成一个稳定的自激振荡器。
时钟电路产生的振荡脉冲经过触发器进行二分频之后,才成为单片机的时钟脉冲信号。
③液晶电路:
右图为液晶电路,将电源地和背光地连在一起,将电源和背光电源连在一起,数据口与51单片机的p0口相连,作为数据的传送口,而液晶的读写和使能则采用其它普通IO口来连接
④按键电路:
采用4个独立按键分别用P1口的0,1,2,3来进行连接
,通过
检测这四个管脚的电平的变化,来确定按键是否被按下。
三、系统软件结构图:
开始
启动T0中断
设置中断允许
设中断100次
设置定时
10ms初值
设置显示初值为
00:
00:
00
定时器T0初始化
按键4?
按键2?
Flag=1,用于模式选择
按键1?
进入秒表模式
进入时钟模式,默认
进入闹钟模式
液晶进行显示
结束
四、系统总体硬件电路图:
五、源程序代码:
#include"reg52.h"
#include"stdio.h"
#include"string.h"
#definerssbitp1^4
#definerwsbitp1^5
#defineesbitp1^6
sbitkey1=P1^0;
sbitkey2=P1^1;
sbitkey3=P1^2;
sbitkey4=P1^3;
sbitbell=P1^7;
unsignedcharnum;
unsignedintm=0;
unsignedintsh=0;
unsignedintfen=0;
unsignedintt1=0;
unsignedintt2=0;
unsignednfalg=0;
voiddelay(unsignedintz)
{
unsignedintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
////////////////////////////////////////////////////液晶初始化/////////////////////////////////////////////////////////////////////
voidwrite_com(unsignedcharcom)
{
rs=0;
P0=com;
delay(5);
e=1;
delay(5);
e=0;
}
write_data(unsignedchardata)
{
rs=1;
P0=data;
delay(5);
e=1;
delay(5)
e=0
}
voidds(unsignedchardzunsignedcharshu)
{
unsignedcharge,shi;
ge=shu%10;
shi=shu/10;
wirte_com(dz+0x80);
write_data(0x30+shi);
write_data(0x30+ge);
delay(5);
}
voidlcd_init()
{
e=0;
write_com(0x38);//设置1602正常显示
write_com(0x0c);//设置开显示,不显示光标
write_com(0x06);//写一个字符后,指针加1
write_com(0x01);//显示清0,数据指针清0;
write_com(0x80);//首地址
}
//////////////////////////////////////////////////////////////////////////////定时器初始化////////////////////////////////////////////////
voidshizhong(void)
{
ds(0x06,m)
if(m==60)
{m=0;
fen++;
ds(0x03,f);
if(fen==60)
{fen=0;
sh++;
ds(0,sh);
if(sh==24)
{sh=0;}
}
}
if(sh=t2;)
{if(fen=t1)
{
bell=1;
}
}
nflag++;
if(nflag=10)
{bell=0;
nfalg=0;}
}
voidmiaobiao(void)
{
ds(0x06,m)
if(m==60)
{m=0;
fen++;
ds(0x03,f);
if(fen==60)
{fen=0;
sh++;
ds(0,sh);
if(sh==60)
{sh=0;}
}
}
}
voidnaozhong()
{
if(key3=0)
{delay(5);
if(key3=0)
{write_com(0x0f);//显示光标
write_com(0x04);//光标左移一次
}
}
if(key1=0)
{delay(5);
if(key1=0)
{
fen++;
ds(0x03,fen);
if(fen==60)
{fen=0;}
}}
if(key2=0)
{delay(5);
if(key2=0)
{
fen--;
ds(0x03,fen);
if(fen==0)
{fen=60;}
}
}
if(key1=0)
{delay(5);
if(key1=0)
{
sh++;
ds(0,sh);
if(sh==24)
{sh=0;}
}}
if(key2=0)
{delay(5);
if(key2=0)
{sh--;
ds(0,sh);
if(sh==0)
{sh=24;}
}
}
t1=fen;
t2=sh;
}
voidmain()
{
unsignedinti=0;
unsignedcharflag;
unsignedcharm1[]="00:
00:
00";
lcd_init();//液晶初始化
TMOD=0x01;//设置定时器工作在方式1
TH0=(65536-9174)/256;
TL0=(65536-9174)%256;//10ms时间间隔,便于正常时钟和秒表通用
EA=1;//开总中断
ET0=1;//开定时器0中断
TR0=1;//启动定时器0
write_com(0x80);
for(i=0;i<8;i++)
{
write_data(m1[i]);
delay(5);
}
while
(1)
{
shizhong();
if(key4=0)
{
delay(5);
if(key4=0)
{
flag=1;
}
}
if(flag=1)
{if(key1=0)
{
delay(5);
if(key4=0)
{
flag1=1;
}
}
if(key2=0)
{
delay(5);
if(key2=0)
{
flag1=2;
}
}
if(key3=0)
{
delay(5);
if(key3=0)
{
flag1=0;
}
}
flag=0;
}
switch(flag1)
{case0:
{shizhong();falg2=0;break;}
case1:
{naozhong();break;}
case2:
{miaobiao();flag2=1;break;}
}
}
}
voidT0_tmie()interrupt1
{
TH0=(65536-9174)/256;
TL0=(65536-9174)%256;//10ms时间间隔,便于正常时钟和秒表通用
if(flag2=0)
{num++;
if(num=100)
{
num=0;
m++;
}
}
if(flag2=1)
{m++;
}
}