单片机智能电子钟设计模板.docx
- 文档编号:27536781
- 上传时间:2023-07-02
- 格式:DOCX
- 页数:39
- 大小:379.82KB
单片机智能电子钟设计模板.docx
《单片机智能电子钟设计模板.docx》由会员分享,可在线阅读,更多相关《单片机智能电子钟设计模板.docx(39页珍藏版)》请在冰豆网上搜索。
单片机智能电子钟设计模板
机械工艺学激光加工论文课程设计
一、设计任务
1)计时:
秒、分、时、天、周、月、年。
(2)闰年自动判别。
(3)五路定时输出,可任意关断(最大可到16路)。
(4)时间、月、日交替显示。
(5)自定任意时刻自动开/关屏。
(6)计时精度:
误差≤1秒/月(具有微调设置)。
(7)键盘采用动态扫描方式查询。
所有的查询、设置功能均由功能键K1、K2完成。
二、方案与论证
2.1、多功能电子钟计时方案
方案一:
采用实时时钟芯片
实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据的更新每秒自动进行一次,不需程序干预。
计算机可通过中断或查询方式读取计时数据进行显示,因此计时功能的实现无需占用CPU的时间,程序简单。
此外,实时时钟芯片多数带有锂电池做后备电源,具备永不停止的计时功能;具有可编程方波输出功能,可用做实时测控系统的采样信号等;有的实时时钟芯片内部还带有非易失性RAM,可用来存放需长期保存但有时也需变更的数据。
由于功能完善,精度高,软件程序设计相对简单,且计时不占用CPU时间,因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能。
方案二:
软件控制
利用单片机内部的定时/计数器进行中断定时,配合软件延时实现时、分、秒的计时及秒表计时。
该方案节省硬件成本,且能使设计者对单片机的指令系统能有更深入的了解,从而掌握单片机应用技术MCS-51汇编语言程序设计方法,因此,本系统设计采用此种软件控制方法来实现计时。
而由于ATMEL公司的AT89S52单片机是低功耗的具有4KB在线可编程Flash存储器的单片机。
它与通用80C51系列单片机的指令系和引脚兼容。
片内的Flash可允许在线重新编程,也可使用通用非易失性存储器编程。
它将通用CPU和在线可编程Flash集成在一个芯片上,形成了功能强大、使用灵活和具有较高性能价格比的微控制器。
它的功能强大,而且也较容易购买,故本设计中所选的单片机为AT89S52单片机。
2.2、多功能电子钟键盘显示方案
方案一:
8279扩展。
该方案方框图如图1.2.1所示,8279是一种可编程的键盘/显示接口专用芯片,它含有键盘输入和显示输出两种功能,键扫描程序和动态显示程序全由8279硬件自动完成,此种方案能以比较简单的硬件电路和较少的软件开销实现单片机与键盘、LED显示器的接口。
方案二:
8155扩展,LED动态显示。
该方案方框图如图1.2.2所示,8155是一块可编程的接口芯片,与单片机的接口非常简单,它的键盘、显示共用一个接口电路,可节省I/O口。
但动态扫描方式需占用CPU较多的时间,在单片机没有太多实时测控任务的情况下可以采用。
方案三:
串口扩展,LED静态显示。
该方案方框图如图1.2.3所示,独立式键盘配置灵活,软件结构简单,按键较多时不宜采用。
静态显示占用口资源少,采用串口传输实现静态显示,LED数码管与单片机之间通过6个移位寄存器相连,显示亮度有保证,但此方案的硬件开销大,电路复杂,信息刷新速度慢,比较适用于并行口资源较少的场合。
方案四:
独立式按键,LED动态显示。
该方案方框图如图1.2.4所示,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,因本系统用到的按键比较少,采用独立式键盘不会浪费I/O口线,所以本系统采用独立式键盘。
动态显示的亮度虽然不如静态显示,但其硬件电路较简单,可节省硬件成本,虽然动态扫描需占用CPU较多的时间,但本系统中的单片机没有很多实时测控任务,因此,本系统采用此种方案。
三、系统硬件设计
(一)系统总框图
(二)原理图设计
3.2、多功能电子钟电路原理图
四、系统软件设计
4.1、电源电路工作原理图
图4.1所示为集成电源电路的原理图
4.2、复位电路工作原理
复位是单片机的初始化操作,其主要功能是把PC初始化为0000H,使单片机从0000H单元开始执行程序,并使其它功能单元处于一个确定的初始状态。
本复位电路采用的是按键复位,它是通过复位端经电阻与VCC电源接通而实现的,它兼具上电复位功能。
因本系统的晶振的频率为12MHz,所以,复位信号持续时间应当超过2μS才能完成复位操作。
4.3、键盘工作原理
图4.3所示为键盘原理图
图4.3所示为键盘原理图,本系统采用的是独立式键盘结构,每个按键的工作不会影响其它I/O口线的状态。
软件是采用查询式结构,首先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。
4.4、显示器工作原理
图4.4所示为键盘原理图
系统采用动态显示方式,动态显示通常都是采用动态扫描的方法进行显示,即循环点亮每一个数码管,这样虽然在任何时刻都只有一位数码管被点亮,但由于人眼存在视觉残留效应,只要每位数码管间隔时间足够短,就可以给人以同时显示的感觉。
由图4.4可知,要想让数码管那一段亮,在该数码管位控段为高电平的情况下给这段送低电平就可以了。
五、总结与展望
课题设计是培养学生综合运用所学知识,发现、提出、分析和解决实际问题,锻炼实践能力的重要环节,是对学生实际工作能力的具体训练和考察过程。
随着科学技术发展的日新月异,单片机已经成为当今计算机应用中空前活跃的领域,在生活中可以说得是无处不在,作为二十一世纪的大学生来说掌握单片机的开发技术是十分重要的。
本次课题设计是利用AT89C51单片机设计的有实时显示、时间校准、定时闹钟和整点报时功能的电子时钟。
并详细说明了软件和硬件设计方法及硬件实现。
通过本次设计单片机原理及应用课题设计使我充分认识到了课题设计的重要性和必要性,本次设计使我对以学过的基础知识有了更深入的理解,学会了独立思考、独立工作以及对应用所学基本理论分析和解决实际问题的能力有了很大的提高。
在此次单片机课题设计之后,我不仅加深了对单片机理论的理解,将理论很好地应用到实践当中去,而且我们还学会了如何去创新精神和严谨的科学作风,从而不断地战胜自己,超越自己。
更正要的是,我在这一设计过程中,学会了坚持不懈,不轻易言弃。
当然,改电子时钟还有很多不足之处,比如闹钟只能定一个。
在今后的学习过程中,我们需要继续努力,锻炼自己。
六、参考文献
1李群芳单片微型计算机与接口技术(第三版):
电子工业出版社,2008
2刘强51单片机含Protel实验指导书:
四川师范大学成都学院实验中心,2011
3郭天祥新概念51单片机C语言教程 电子工业出版社
4周广兴,张子红单片机原理及应用教程北京大学出版社
5浏览
附录一:
系统总电路
电路原理仿真图:
附录二:
源代码
#include
#include
//----------------------------------------
#defineuintunsignedint
#defineucharunsignedchar
//----------------------------------------
/*ucharcodetable[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x98,0x88,0x83,0xc6,0xa1,0x86,0x8e};//共阳极数码管代码*/
ucharcodexingqi[8]={0x00,0x07,0x01,0x02,0x03,0x04,0x05,0x06};//星期显示代码
ucharmiao,shi,fen,date,month,day,year,year10,set,mun,set_shi,set_fen,time_flag;//全局定义
uintyear_data,t;
//---------------------------------------------
sbitSCLK=P3^5;//DS1302通讯线定义
sbitDIO=P3^6;
sbitRST=P3^7;
sbitspeak=P0^0;
sbitDS=P2^0;//595通讯线定义
sbitSH_CP=P2^1;
sbitST_CP1=P2^2;
sbitST_CP2=P2^3;
sbitST_CP3=P2^4;
sbitST_CP4=P2^5;
sbitST_CP5=P2^6;
sbitST_CP6=P2^7;
sbitST_CP7=P3^0;
sbitST_CP8=P3^1;
sbitOE1=P1^0;
sbitOE2=P1^1;
sbitOE3=P1^2;
sbitOE4=P1^3;
sbitOE5=P1^4;
sbitOE6=P1^5;
sbitOE7=P1^6;
sbitOE8=P1^7;
sbitK1=P3^2;//按键接口定义
sbitK2=P3^3;
sbitK3=P3^4;
sbitK4=P0^1;
sbitK5=P0^2;
//-------------------------------------
voidwrite_595(uchartemp)//写74HC595一个字节
{
uchartemp_595,i;
temp_595=temp;
for(i=0;i<8;i++)
{
SH_CP=0;
_nop_();_nop_();_nop_();
if(temp_595&0x80)
{
DS=1;
}
else
{
DS=0;
}
_nop_();_nop_();_nop_();
SH_CP=1;
temp_595<<=1;
}
}
//----------------------------------------------
voiddelay(uintz)//Nms延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=112;y>0;y--);
}
//---------------------------------------------
voiddelaynus(uintz)//ums延时
{
uintx,y;
for(x=z;x>0;x--)
for(y=10;y>0;y--);
}
//-----------------------------------------------
voidwrite(uchardate)//写入DS1302一个字节
{
uchartemp,i;
RST=1;
SCLK=0;
temp=date;
for(i=0;i<8;i++)
{
SCLK=0;
if(temp&0x01)
DIO=1;
else
DIO=0;
SCLK=1;
temp>>=1;
}
}
//-------------------------------------
ucharread()//读出DS1302一个字节
{
uchara,temp;
RST=1;
for(a=8;a>0;a--)
{
temp>>=1;
SCLK=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SCLK=0;
if(DIO)
{
temp=temp|0x80;
}
else
{
temp=temp|0x00;
}
}
return(temp);
}
//-----------------------------------
voidwrite_1302(ucharadd,uchardat)//写DS1302数据
{
RST=0;
SCLK=0;
RST=1;
write(add);
write(dat);
SCLK=1;
RST=0;
}
//------------------------------------------
ucharread_1302(ucharadd)//读DS1302数据
{
uchartemp;
RST=0;
SCLK=0;
RST=1;
write(add);
temp=read();
SCLK=1;
RST=0;
return(temp);
}
//--------------------------------------------
voiddisplay()//显示子程序
{
miao=read_1302(0x81);//读秒
fen=read_1302(0x83);//读分
shi=read_1302(0x85)&0x3f;//读时
date=read_1302(0x87);//读日
month=read_1302(0x89);//读月
year=read_1302(0x8d);//读年
day=read_1302(0x8B);//读星期
write_595(miao);//显示秒
ST_CP1=0;
ST_CP1=1;
ST_CP1=0;
delaynus(10);
write_595(fen);//显示分
ST_CP2=0;
ST_CP2=1;
ST_CP2=0;
delaynus(10);
write_595(shi);//显示时
ST_CP3=0;
ST_CP3=1;
ST_CP3=0;
delaynus(10);
write_595(date);//显示日
ST_CP4=0;
ST_CP4=1;
ST_CP4=0;
delaynus(10);
write_595(month);//显示月
ST_CP5=0;
ST_CP5=1;
ST_CP5=0;
delaynus(10);
write_595(year);//显示年
ST_CP6=0;
ST_CP6=1;
ST_CP6=0;
delaynus(10);
write_595(xingqi[day]);//显示星期
ST_CP7=0;
ST_CP7=1;
ST_CP7=0;
delaynus(10);
}
//------------------------------------------
voidds1302_init()//1302初始化
{
RST=0;
SCLK=0;
/*write_1302(0x80,0x00);//设置初始值SEC
write_1302(0x82,0x00);//设置初始值MIN
write_1302(0x84,0x00);//设置初始值HR
write_1302(0x86,0x00);//设置初始值DATE
write_1302(0x88,0x00);//设置初始值MONTH
write_1302(0x8A,0x00);//设置初始值DAY*/
write_1302(0x8C,0x10);//设置初始值YEAR
}
//----------------------------------------------
voidPORT_INIT()//端口初始化
{
P0=0XFE;
P1=0X00;
P2=0X00;
P3=0XFC;
}
voidtime_init()//定时器初始化
{
TMOD=0x11;//设置定时器0\1都为工作方式1
TH0=(65536-50000)/256;//装入初值
TL0=(65536-50000)%256;
TH1=(65536-10000)/256;//装入初值
TL1=(65536-10000)%256;
PT0=1;//T0定时器优先级最高
EA=1;//开总中断
ET0=1;//开定时器0中断
ET1=1;//开定时器1中断
TR0=1;//启动定时器0
TR1=1;//启动定时器1
}
//----------------------------------------------
voidmain(void)//主程序
{
PORT_INIT();
ds1302_init();
time_init();
year=read_1302(0x8d);//读年数据
year_data=0x2000|year;
write_595(year_data>>8);//显示2010年的20字样
ST_CP8=0;
ST_CP8=1;
ST_CP8=0;
set_shi=0x09;//闹钟初始值设定
set_fen=0x39;
time_flag=0;//标志位
set=0;
while
(1)
{
switch(set)
{
case0:
//设置秒
{
display();//显示子程序
if((shi==set_shi)&&(fen==set_fen)&&(time_flag==0))//闹钟设定只设定小时和分钟
{
speak=~speak;
if((K2==0)&&(time_flag==0))//按键K2停止闹钟响
{
P0&=0XFE;
time_flag=1;
}
delay(10);
}
}break;
}
if(fen==set_fen+1)//当不按下闹钟停止按键,一分钟后自动停止闹钟
{
P0&=0XFE;
time_flag=0;
}
}
}
//----------------------------------------
voidtime0()interrupt1//定时器0中断
{
TR0=0;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
mun++;
if(mun==15)
{
mun=0;
switch(set)
{
case1:
//设置秒闪烁
{
OE1=1;
delay(300);
OE1=0;
}break;
case2:
//设置分闪烁
{
OE2=1;
delay(300);
OE2=0;
}break;
case3:
//设置时闪烁
{
OE3=1;
delay(300);
OE3=0;
}break;
case4:
//设置日闪烁
{
OE4=1;
delay(300);
OE4=0;
}break;
case5:
//设置月闪烁
{
OE5=1;
delay(300);
OE5=0;
}break;
case6:
//设置年闪烁
{
OE6=1;
OE8=1;
delay(300);
OE6=0;
OE8=0;
}break;
case7:
//设置星期闪烁
{
OE7=1;
delay(200);
OE7=0;
}break;
case8:
//设置闹钟闪烁
{
OE2=1;
OE3=1;
delay(200);
OE2=0;
OE3=0;
}break;
}
}
TR0=1;
}
//-------------------------------------------
voidtime1()interrupt3//定时器1中断
{
TR1=0;//先关定时器
TH1=(65536-20000)/256;
TL1=(65536-20000)%256;
//---------------------------------
if(K1==0)
{
delay(10);
if(K1==0)
{
set++;
if(set==9)
{
set=0;
write_1302(0x80,miao);//设置初始值SEC
write_1302(0x82,fen);//设置初始值MIN
write_1302(0x84,shi);//设置初始值HR
write_1302(0x86,date);//设置初始值DATE
write_1302(0x88,month);//设置初始值MONTH
write_1302(0x8A,day);//设置初始值DAY
write_1302(0x8C,year_data);//设置初始值YEAR
}
t=50000;
while((!
K1)&&t)
{
t--;
}
}
}
//---------------------------------------
if(K2==0)
{
delay(10);
if(K2==0)
{
switch(set)
{
case1:
{
miao++;
if((miao&0x0f)>0x09)
{
miao+=0x10;
miao&=0xf0;
}
if(miao==0x60)
{
miao=0x00;
}
write_595(miao);
ST_CP1=0;
ST_CP1=1;
ST_CP1=0;
}break;
case2:
{
fen++;
if((fen&0x0f)>0x09)
{
fen+=0x10;
fen&=0xf0;
}
if(fen==0x60)
{
fen=0x00;
}
ST_CP2=0;
ST_CP2=1;
ST_CP2=0;
}break;
case3
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 智能 电子钟 设计 模板