电子钟Word文档下载推荐.docx
- 文档编号:16158701
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:15
- 大小:69.19KB
电子钟Word文档下载推荐.docx
《电子钟Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《电子钟Word文档下载推荐.docx(15页珍藏版)》请在冰豆网上搜索。
它把构成计算机的中央处理器CPU、存储器、寄存器、I/O接口制作在一块集成电路芯片中,从而构成较为完整的计算机。
但其内部无模数和数模转化部件,需要用硬件实现,使用时不太方便。
方案二:
选用mega16
相比之下,mega16比51系列单片机有更多的片上资源,功能强大,速度快,易于控制,低功耗等优点,同时达到题目的要求,成本低。
以上两种方案综合考虑,选择方案二。
2、显示方案论证
目前可供选择的显示方式有LED、LCD、CRT等。
它们各有优缺点和各自的应用场合,CRT属于老式淘汰产品。
采用LED数码管显示器。
LED数码管亮度高,醒目,但是其电路复杂,占用资源较多,显示信息量较小。
液晶显屏有低功耗、辐射小以及不闪烁等优点。
方案选择:
综合上述特点和题目要求,比较其优缺点,选用方案二。
3、键盘方案论证
独立式按键(矩阵式键盘)。
独立式按键虽然占用到比较多的I/O口资源,但是考虑到本设计的情况和单片机的可用资源,独立式按键操作简单,快捷,易于编程。
电路简单,价格便宜。
电视遥控。
此方式键盘所需的I/O口少,节省了CPU的容量,反应简单便捷,反应速度快。
但价格相对较高。
以上两种方案综合考虑,选择方案一。
二、总体系统设计及模块实现
1、总体系统设计
本设计采用Atmega16芯片为核心,设计制作了可以设置初始密码和输入密码的功能的液晶显示屏。
系统的总体框图如下图所示:
2、系统各模块的理论分析和实际设计
(1)Atmega16控制电路图
(2)液晶显示屏电路图
(3)独立按键电路图
三、实验结果
1、输入初始的时间、日期、年月以及闹钟。
2、闹钟时间到就会响。
四、附录
1、整体电路图
2、密码锁程序:
#include<
iom16v.h>
#include"
RW_EEPROM.h"
#include"
lcd1602_8bit.c"
#defineGET_BIT(x,y)(x&
=(1<
<
y))
#defineCPL_BIT(x,y)(x^=(1<
#defineSET_BIT(x,y)(x|=(1<
#defineCLR_BIT(x,y)(x&
=~(1<
#defineS14
#defineS25
#defineS36
#defineS47
#defineucharunsignedchar//变量类型的宏定义
#defineuintunsignedint
ucharconsttitle1[]={"
Thisis"
};
ucharconsttitle2[]={"
aclock"
ucharconsttitle3[]={"
//"
ucharconsttitle4[]={"
:
"
ucharconsttitle5[]={"
PressS3"
ucharconsttitle6[]={"
Writeset_time"
ucharoutflag,status;
structtime
{
uintyear;
ucharmonth,day;
ucharhour,minute,second;
structtimerun_time,set_time;
/************************************************/
voidport_init(void)//端口初始化子函数
{//端口初始化子函数开始
PORTA=0xFF;
//PA端口初始化输出11111111
DDRA=0xFF;
//将PA端口设为输出
PORTB=0xFF;
//PB端口初始化输出11111111
DDRB=0xFF;
//将PB端口设为输出
PORTC=0xFF;
//PC端口初始化输出11111111
DDRC=0xFF;
//将PC端口设为输出
PORTD=0xFF;
//PD端口初始化输出11111111
DDRD=0x00;
//将PD端口设为输入
}//端口初始化子函数结束
//***************************
voidtimer1_init(void)
TCCR1B=0x00;
//stop
TCNT1H=0xE1;
//setup
TCNT1L=0x7C;
TCCR1A=0x00;
TCCR1B=0x05;
//startTimer
TIMSK=0x04;
//timerinterruptsources
}
/*********************************************/
voidinit_devices(void)//芯片的初始化子函数
{
port_init();
//调用端口初始化子函数
timer1_init();
//调用定时器0初始化子函数
SREG=0x80;
//使能总中断
}
/************************************/
ucharconv(uintyear,ucharmonth)//101
{ucharlen;
//102
switch(month)//103
{//104
case1:
len=31;
break;
//105
case3:
//106
case5:
//107
case7:
//108
case8:
//109
case10:
//110
case12:
//111
case4:
len=30;
//112
case6:
//113
case9:
//114
case11:
//115
case2:
if(year%4==0&
&
year%100!
=0||year%400==0)len=29;
//116
elselen=28;
//117
default:
return0;
//118
}//119
returnlen;
//120
}//121
voidscan_S4(void)
if(GET_BIT(PIND,S4)==0)
{status++;
Delay_nms(250);
}
/***********************/
voidmain(void)//定义主函数
{
uintw;
init_devices();
//调用芯片初始化子函数
Delay_nms(400);
InitLcd();
ePutstr(0,0,title1);
ePutstr(0,1,title2);
Delay_nms(2000);
SREG=0x00;
set_time.hour=READ_EEPROM(50);
Delay_nms(10);
set_time.minute=READ_EEPROM(60);
if(set_time.hour>
24)set_time.hour=0;
if(set_time.minute>
60)set_time.minute=0;
ePutstr(0,0,title3);
ePutstr(0,1,title4);
while
(1)//无限循环
{
switch(status)
{
case0:
scan_S4();
DisplayOneChar(15,0,status+0x30);
if(GET_BIT(PIND,S3)==0)
{CPL_BIT(outflag,0);
if(GET_BIT(outflag,0)==0)
DisplayOneChar(11,0,'
O'
);
DisplayOneChar(12,0,'
F'
DisplayOneChar(13,0,'
}
else
'
N'
if((run_time.hour==set_time.hour)&
(run_time.minute==set_time.minute))
for(w=0;
w<
1170;
w++)
PORTC=0xfd;
Delay_nms(500);
PORTC=0xff;
}
DisplayOneChar(0,0,run_time.year/1000+0x30);
DisplayOneChar(1,0,(run_time.year/100)%10+0x30);
DisplayOneChar(2,0,(run_time.year%100)/10+0x30);
DisplayOneChar(3,0,run_time.year%10+0x30);
DisplayOneChar(5,0,run_time.month/10+0x30);
DisplayOneChar(6,0,run_time.month%10+0x30);
DisplayOneChar(8,0,run_time.day/10+0x30);
DisplayOneChar(9,0,run_time.day%10+0x30);
DisplayOneChar(0,1,run_time.hour/10+0x30);
DisplayOneChar(1,1,run_time.hour%10+0x30);
DisplayOneChar(3,1,run_time.minute/10+0x30);
DisplayOneChar(4,1,run_time.minute%10+0x30);
DisplayOneChar(6,1,run_time.second/10+0x30);
DisplayOneChar(7,1,run_time.second%10+0x30);
DisplayOneChar(10,1,set_time.hour/10+0x30);
DisplayOneChar(11,1,set_time.hour%10+0x30);
DisplayOneChar(13,1,set_time.minute/10+0x30);
DisplayOneChar(14,1,set_time.minute%10+0x30);
break;
LcdWriteCommand(0x0c);
DisplayOneChar(15,0,status+0x30);
LcdWriteCommand(0x0f);
if(GET_BIT(PIND,S1)==0)
{run_time.year=(run_time.year)+100;
Delay_nms(250);
if(GET_BIT(PIND,S2)==0)
{run_time.year=(run_time.year)-100;
{run_time.year++;
{run_time.year--;
{if(run_time.month<
12)run_time.month++;
{if(run_time.month>
1)run_time.month--;
{if(run_time.day<
31)run_time.day++;
{if(run_time.day>
1)run_time.day--;
{if(run_time.hour<
23)run_time.hour++;
{if(run_time.hour>
1)run_time.hour--;
{if(run_time.minute<
59)run_time.minute++;
{if(run_time.minute>
0)run_time.minute--;
{if(set_time.hour<
23)set_time.hour++;
{if(set_time.hour>
0)set_time.hour--;
{if(set_time.minute<
59)set_time.minute++;
{if(set_time.minute>
0)set_time.minute--;
ePutstr(0,0,title5);
ePutstr(0,1,title6);
WRITE_EEPROM(50,set_time.hour);
WRITE_EEPROM(60,set_time.minute);
K'
Delay_nms(100);
}
ePutstr(0,1,title4);
if(status>
9)status=0;
/********************/
#pragmainterrupt_handlertimer1_isr:
9
voidtimer1_isr(void)
uchartempday;
//TIMER1hasoverflowed
//reloadcounterhighvalue
//reloadcounterlowvalue
tempday=conv
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子钟