基于7279的数字电子时钟.docx
- 文档编号:23993260
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:19
- 大小:144.23KB
基于7279的数字电子时钟.docx
《基于7279的数字电子时钟.docx》由会员分享,可在线阅读,更多相关《基于7279的数字电子时钟.docx(19页珍藏版)》请在冰豆网上搜索。
基于7279的数字电子时钟
单片机技术课程设计报告
数字电子时钟
学院:
高职学院
学生姓名:
童水良
专业:
应用电子技术
班级:
099041
学号:
09904103
同组人:
温东长
摘要
数字电子钟广泛应用于生活生产中,对其深入了解很有必要,在此用单片机设计了一个简单的数字电子钟。
本设计为基于AT89C52单片机,辅以必要的外围电路,用自制单片机实验板设计了一个简单的数字电子时钟。
在硬件方面,除了单片机外,用数码管来进行显示,LED采用动态扫描显示。
通过LED能够比较准确显示年、月、日、时、分、秒,八个简单的按键实现对时间的调整。
软件方面采用C51汇编语言编程。
整个电子钟系统能完成时间的显示,调时,调分,调秒,复位功能。
本次设计的电子钟采用独立式键盘,用共阴数码管显示,因为LED亮度较高,显示醒目所以此电子钟在部分场所推广很大。
关键词数字电子钟、AT89C52、C51程序设计
目录
一、课题设计任务、功能要求及总体方案
1.1、课题设计任务
1.2、功能要求
1.3、设计总体方案介绍及工作原理说明
二、数字电子时钟系统的设计
2.1、数字电子时钟使用89C52及HD7279A芯片
2.1.1、89C52简介
2.1.2、HD7279芯片简介
三、数字电子时钟软件系统各模块功能简要介绍
3.1、显示模块
3.2、中断服务程序模块
3.3、键盘模块
四、设计结论及心得体会
4.1、数字电子钟的设计结论及使用说明
4.2、设计体会
参考文献
附录(程序及电路图、工作照片)
1、课题设计任务、功能要求及总体方案
1.1课题设计任务
本课程设计选题目为:
数字电子钟。
设计一个具有特定功能的电子钟。
1.2功能要求
设计的数字电子钟上电或按键复位后能自动显示系统初始化时间,进入时钟准备状态;第一次按数字电子钟启动,数字电子钟从0时0分0秒开始运行,进入时钟运行状态;再次按数字电子钟调整键,则数字电子钟进入时钟调整状态,(闪烁状态),此时可分别利用各调整键调整年、月、日、时、分、秒,调整结束后可按调整键再次进入时钟运行状态。
1.3设计总体方案介绍及工作原理说明
本课程设计采用AT89S52单片机设计一个数字电子钟,通过两个4位LED数码管显示时、分、秒,并设有8个按键。
八个都可以作为加减键使用,
电路分为5部分,分别为复位电路、键盘电路、时钟电路、显示电路和控制电路。
复位电路采用按键复位方式。
键盘电路采用独立式键盘。
时钟电路用12MHz的晶振产生时钟信号。
显示电路采用8个三极管驱动两个4位LED显示。
控制电路采用8位的AT89S52单片机作为CPU;原理是:
时钟用T0为时钟秒加1中断,时间常数位50ms,每20次加1s,T0用为时间加1中断。
其设计框图如图1.1所示:
图1.1设计方案框图
2、数字电子时钟系统的设计
2.1数字电子时钟使用89C52及HD7279A芯片
2.2.189C52简介
89C52是INTEL公司MCS-51系列单片机中基本的产品,它采用INTEL公司可靠的CHMOS工艺技术制造的高性能8位单片机,属于标准的MCS-51的HCMOS产品。
它结合了HMOS的高速和高密度技术及CHMOS的低功耗特征,它基于标准的MCS-51单片机体系结构和指令系统,属于80C51增强型单片机版本,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。
89C52内置8位中央处理单元、256字节内部数据存储器RAM、8k片内程序存储器(ROM)32个双向输入/输出(I/O)口、3个16位定时/计数器和5个两级中断结构,一个全双工串行通信口,片内时钟振荡电路。
此外,89C52还可工作于低功耗模式,可通过两种软件选择空闲和掉电模式。
在空闲模式下冻结CPU而RAM定时器、串行口和中断系统维持其功能。
掉电模式下,保存RAM数据,时钟振荡停止,同时停止芯片内其它功能。
89C52有PDIP(40pin)和PLCC(44pin)两种封装形式。
2.2.2HD7279A芯片简介
HD7279A是一片具有串行接口的,可驱动8位共阴式数码管(或64只独立LED)的智能显示驱动芯片,该芯片同时还可连接多达64键的键盘矩阵,单片即可完成LED显示、键盘接口的全部功能。
产品特点:
串行接口,无需外围元件可直接驱动LED
各位独立控制译码/不译码及消隐和闪烁属性
(循环)左移/(循环)右移指令
具有段寻址指令,方便控制独立LED
64键键盘控制器,内含去抖动电路
有DIP和SOIC两种封装形式供选择
3、数字电子时钟软件系统各模块功能简要介绍
3.1显示模块
此处将显示程序编成一个子程序,要显示时调用显示子程序即可,显示程序中显示的是缓冲区中的内容再调数据表格中显示代码,程序中只要将要显示的内容在数据表中的位置送往显示缓冲区即可,就可以显示你所需要显示的内容。
3.2中断服务程序模块
程序中用了个定时器中断,所以有中断服务程序,是为了使秒自加而使用定时器中断,定时50ms循环20次到一秒以后,向CPU申请中断,使秒自加1。
秒满60秒分加1,分满60分时加1,时满24天加1,根据当月大小月情况判断30还是31月加1,月满12年加1。
3.3键盘模块
运用7279芯片编成键盘扫描程序,来完成用键盘监控程序的功能,总共用了八个键,使用键盘能够很准确的、快速的监控系统。
4、设计结论及心得体会
4.1数字电子钟的设计结论及使用说明
本课程设计的目的是设计一个电子钟,通过原理图的绘制,PCB板的制作,最终做出的实物是成功的,能够达到预期的目的,以下本次所作电子钟的具体的使用说明:
电子钟上电后,显示初始化时间,电子钟从0时0分0秒开始自动运行,再次按下调整键,电子时钟钟持续运行,处于调整状态,按下加减键,可以实现时、分、秒加键1,这样可以实现时、分、秒的累加调整,再次按下调整键,电子时钟自动运行起来,处于运行状态,调整结束。
4.2设计体会
本次做课程设计,从硬件方面说,我认为本次设计的重点在于单片机的最小系统及7279的显示及键盘程序模块,若单片机的最小系统不能正常工作,那后面一切都免谈;从软件方面说,我编程的思路就是从简单到难,一步一步实现各个功能。
这个电子时钟的程序重点在于调整键功能程序和中断服务程序的编写,这两个小模块编好了,就很容易了。
在做课程设计的过程中,学到很多东西,比如说,自己通过编电子钟的程序,使自己对C语言指令的应用越来越熟练,编程的能力也有了较大提高。
在制作电子钟的过程中,遇到的问题都能尝试去自己解决,比如说调试程序,检查线路等等,使自己发现问题、解决问题的能力大大提高。
参考文献
[1]李广第,朱月秀,冷祖祁.单片机基础[M].第三版.北京:
航空航天大学出版社,2007.18-152
LiGuangdi,ZhuYuexiu,LengZuqi.Scmcbasis[M].Thethirdedition.Beijing:
Aerospaceuniversitypress,2007.18-152
[2]邱丽芳,彭志刚,胡汉辉.单片机原理与应用.第二版.北京:
人民邮电出版社,2009.7-259
QiuLifang,PengZhigang,HuHanhui.Single-chipmicrocomputerprincipleandapplication.Thesecondedition.Beijing:
Beijingpeople'stelephoneandpostalpress,2009.7-259
[3]夏宽理.程序设计[M].上海:
复旦大学出版社,2000.7.26~44
XiaKuangli.Programming[M].Shanghai:
FudanUniversityPress,2000.7.26~44
附录(程序)
#include
typedefunsignedcharBYTE;//自定义字节类型
#defineSet_Bit(BIT)(BIT=1)//定义置1函数
#defineClear_Bit(BIT)(BIT=0)//定义清0函数
/*7279指令*/
#defineHD7279_TEST0xbf//测试
#defineHD7279_RLC0xa3//循环左移
#defineHD7279_RRC0xa2//循环右移
#defineHD7279_RL0xa1//左移
#defineHD7279_RR0xa0//右移
#defineDECODE00x80//译码方式0
#defineHD7279_DECODE10xc8//译码方式1
#defineUNDECODE0x90//译码方式2:
不译码
#defineHD7279_HIDE0x98//消隐
#defineHD7279_FLASH0x88//闪烁
#defineHD7279_SEGON0xe0//段亮
#defineHD7279_SEGOFF0xc0//段灭
#defineCMD_READ0x15//读键盘指令
/*函数定义*/
voidwrite7279(BYTE,BYTE);//定义HD7279写函数
BYTEread7279(BYTE);//定义HD7279读函数
voidSend_Byte(BYTE);//定义HD7279发送字节函数
BYTEReceive_Byte(void);//定义HD7279接收字节函数
voidShort_Delay(void);//定义短延时函数
voidLong_Delay(void);//定义长延时函数
voidMcu_Init(void);//定义MCU初始化函数
voiddistime(void);//显示时间
voiddiscalendar(void);//显示日历
voidHD7279key(void);//按键控制
BYTEKey_number;//定义键值变量
unsignedcharsecond=0,minute=0,hour=0,F;//秒、分、时变量
unsignedintday=5,month=12,year=2011,mark=0,i,j,clock,wait=0;//年月日等变量
sbitkey=P1^7;//定义HD7279中断硬件连接--->INT1
sbitHD7279_Clk=P1^5;//定义HD7279时钟硬件连接
sbitHD7279_Data=P1^6;//定义HD7279数据硬件连接
sbitHD7279_CS=P1^4;//片选
/*主函数*/
voidmain(void)
{
Mcu_Init();
F=1;
while
(1)
{while(!
key)
{HD7279key();}
if(clock>19)
{clock=0;
second++;}//一秒计时
if(second>59)
{second=0;
minute++;}//分进位
if(minute>59)
{minute=0;
hour++;}//时进位
if(hour>23)
{hour=0;//日进位
day++;}
if(((month%2)==0&&month<=6)||month==9||month==11)//2,4,6,9,11月
{if(month==2)
if(month==2)
{
if(day==29)//非闰年的进位
{
if(year%4==0&&year%100!
=0||year%400==0)
mark=1;//mark闰年标志位
elsemark=2;
}
if(mark==2)//2月为28天的
{
day=1;
month++;
if(month==13)
{
month=1;
year++;}
}
else//2月为29天的
{
if(day==30)
{
day=1;
month++;}
if(month==13)
{
month=1;
year++;}
}
}
if(day==31)
{day=1;
month++;}
if(month==13)
{month=1;
year++;}
}
if(((month+1)%2==0&&month<8)||month==8||month==10||month==12)//1,3,5,7,8,10,12月大
{if(day==32)
{day=1;
month++;}
if(month==13)
{month=1;
year++;}
}
if(F==0)//显示日历
{discalendar();}
if(F==1)//显示时间
{distime();}
}
}
/*MCU初始化函数*/
voidMcu_Init(void)
{
Set_Bit(ET0);//定时器
Set_Bit(TR0);
Set_Bit(EA);//中断使能
TMOD=0x01;//工作在方式一
TH0=0x3C;//晶振=12MHZ,定时时间50ms
TL0=0xb0;
HD7279_CS=0;
Send_Byte(0xa4);//HD7279复位指令
}
/*按键操作*/
voidHD7279key(void)
{Key_number=read7279(CMD_READ);//读取键盘的值
while(key==0);
if(F==0)
{
switch(Key_number)
{
case0x04:
write7279(HD7279_FLASH,0xfc);write7279(DECODE0,(day+=1)%10);write7279(DECODE0+1,day/10);break;//调节日
case0x05:
write7279(HD7279_FLASH,0xf3);write7279(DECODE0+2,(month+=1)%10);write7279(DECODE0+3,month/10);break;//调节月
case0x06:
write7279(HD7279_FLASH,0xf0);write7279(DECODE0+4,(year+=1)%10);write7279(DECODE0+5,year/10);break;//调节年
case0x0C:
write7279(HD7279_FLASH,0xfc);write7279(DECODE0,(day-=1)%10);write7279(DECODE0+1,day/10);break;//调节日
case0x0D:
write7279(HD7279_FLASH,0xf3);write7279(DECODE0+2,(month-=1)%10);write7279(DECODE0+3,month/10);break;//调节月
case0x0E:
write7279(HD7279_FLASH,0xf0);write7279(DECODE0+4,(year-=1)%10);write7279(DECODE0+5,year/10);break;//调节年
case0x07:
F=1;break;
case0x0f:
write7279(HD7279_FLASH,0xff);break;
default:
break;
}
if(month==13)month=1;
if(month==0)month=12;
if((((month+1)%2==0&&month<8)||month==8||month==10||month==12)&&day==0)//1,3,5,7,8,10,12月
day=31;
if(((month%2)==0&&month<=6)||month==9||month==11)//2,4,6,9,11月
{if(month==2)
{if(mark=1&&day==0)day=29;//闰年
if(mark=2&&day==0)day=28;}
elseif(day==0)day=30;
}
}
else
{
switch(Key_number)
{
case0x04:
write7279(HD7279_FLASH,0xfc);write7279(DECODE0,(second+=1)%10);write7279(DECODE0+1,second/10);break;//调节秒
case0x05:
write7279(HD7279_FLASH,0xe7);write7279(DECODE0+3,(minute+=1)%10);write7279(DECODE0+4,minute/10);break;//调节分
case0x06:
write7279(HD7279_FLASH,0x3f);write7279(DECODE0+6,(hour+=1)%10);write7279(DECODE0+7,hour/10);break;//调节时
case0x0C:
write7279(HD7279_FLASH,0xfc);write7279(DECODE0,(second-=1)%10);write7279(DECODE0+1,second/10);break;//调节秒
case0x0D:
write7279(HD7279_FLASH,0xe7);write7279(DECODE0+3,(minute-=1)%10);write7279(DECODE0+4,minute/10);break;//调节分
case0x0E:
write7279(HD7279_FLASH,0x3f);write7279(DECODE0+6,(hour-=1)%10);write7279(DECODE0+7,hour/10);break;//调节时
case0x07:
F=0;break;
case0x0f:
write7279(HD7279_FLASH,0xff);break;
default:
break;
}
}
}
/*定时中断0函数*/
voidint_HD7279key(void)interrupt1
{TH0=0x4C;
TL0=0x00;
clock++;
}
voidShort_Delay(void)/*短延时函数*/
{
BYTEi;
for(i=0;i<0x08;i++);
}
voidLong_Delay(void)/*长延时函数*/
{
BYTEi;
for(i=0;i<0x30;i++);
}
voidwrite7279(BYTECommand,BYTEData)/*HD7279写函数*/
{
Send_Byte(Command);
Send_Byte(Data);
}
BYTEread7279(BYTECommand)/*HD7279读函数*/
{
Send_Byte(Command);
return(Receive_Byte());
}
/*HD7279发送字节函数*/
voidSend_Byte(BYTEData_Out)
{
BYTEi;
Long_Delay();
for(i=0;i<8;i++)
{
if(Data_Out&0x80)
Set_Bit(HD7279_Data);
elseClear_Bit(HD7279_Data);
Set_Bit(HD7279_Clk);
Short_Delay();
Clear_Bit(HD7279_Clk);
Short_Delay();
Data_Out=Data_Out<<1;
}
Clear_Bit(HD7279_Data);
}
BYTEReceive_Byte(void)/*HD7279接收字节函数*/
{
BYTEi,Data_In;
Set_Bit(HD7279_Data);
Long_Delay();
for(i=0;i<8;i++)
{
Set_Bit(HD7279_Clk);
Short_Delay();
Data_In=Data_In<<1;
if(HD7279_Data)
Data_In=Data_In|0x01;
Clear_Bit(HD7279_Clk);
Short_Delay();
}
Clear_Bit(HD7279_Data);
return(Data_In);
}
/*日期显示*/
voiddiscalendar(void)
{
write7279(DECODE0,day%10);
write7279(DECODE0+1,day/10);
write7279(DECODE0+2,month%10);
write7279(DECODE0+3,month/10);
write7279(DECODE0+4,year%10);
write7279(DECODE0+5,(year/10)%10);
write7279(DECODE0+6,(year/100)%10);
write7279(DECODE0+7,year/1000);
}
/*时间显示*/
voiddistime(void)
{
write7279(DECODE0,second%10);
write7279(DECODE0+1,second/10);
write7279(UNDECODE+2,0x01);
write7279(DECODE0+3,minute%10);
write7279(DECODE0+4,minute/10);
write7279(UNDECODE+5,0x01);
write7279(DECODE0+6,hour%10);
write7279(DECODE0+7,hour/10);
}
电路图
时间显示照片
日期显示照片
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 7279 数字 电子 时钟