收藏 分销(赏)

proteus_仿真大作业--数字时钟.doc

上传人:xrp****65 文档编号:7421429 上传时间:2025-01-03 格式:DOC 页数:24 大小:338.50KB 下载积分:10 金币
下载 相关 举报
proteus_仿真大作业--数字时钟.doc_第1页
第1页 / 共24页
proteus_仿真大作业--数字时钟.doc_第2页
第2页 / 共24页


点击查看更多>>
资源描述
实 验 报 告 Proteus 仿 真 大 作 业 课题:数字时钟实验报告 系部:电子工程系 班级:xxxx 姓名:xxx 指导老师:xxx 2011.6.10 24 前 言 数字电子钟具有走时准确,一钟多用等特点,在生活中已经得到广泛的应用。另外数字钟还具备秒表和闹钟的功能,且闹钟铃声可自选,使一款电子钟具备了多媒体的色彩。单片机AT89C51在Proteus软件中实现数字时钟的定时、时间调整、闹正设置等功能。具有体积小、功能强可靠性高、价格低廉等一系列优点,不仅已成为工业测控领域普遍采用的智能化控制工具,而且已渗入到人们工作和和生活的各个角落,有力地推动了各行业的技术改造和产品的更新换代,应用前景广阔。时钟电路在计算机系统中起着非常重要的作用,是保证系统正常工作的基础。在一个单片机应用系统中,时钟有两方面的含义:一是指为保障系统正常工作的基准振荡定时信号,主要由晶振和外围电路组成,晶振频率的大小决定了单片机系统工作的快慢;二是指系统的标准定时时钟,即定时时间。 Protues软件不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件),从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等,它也支持IAR、Keil和MPLAB等多种编译器。 本文主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机AT89C51芯片和LED1602液晶显示屏为核心,辅以必要的电路,构成了一个单片机电子时钟。 目录 第一章 电子时钟、单片机简介 4 1、电子时钟工作原理 4 2、单片机简介 4 第二章 数字时钟电路设计 5 2.1 设计要求 5 2.2 数字电路模块图: 6 2.3 6 2.2 模块简介: 6 2.3 系统功能操作实现 7 2.4 方案设计元件清单 8 第三章 Protues仿真电路 9 3.1 绘制数字时钟电路Protues仿真原理图: 9 3.1.1 启动ISIS 7 Professional软件 9 3.1.2 仿真电路绘制 9 3.1.3 数字时钟原理图 10 3.1.4 电路检测 11 3.2 软件设计: 12 3.2.1 运行keil软件编写程序 12 3.2.2 编译、连接 12 3.2.3 将程序烧入单片机 13 3.2.4、程序运行 13 附录 14 程序: 14 总结 24 参考资料 25 第一章 电子时钟、单片机简介 1、电子时钟工作原理 电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零。从而达到计时的功能,是人民日常生活补课缺少的工具。 现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有年、月、时、分、秒以及星期、温度等显示功能,还可以进行时和分的校对以及定时闹钟功能,片选的灵活性好。 该电子时钟由89C51,BUTTON,7SES六段数码管等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。而电路中唯一的一个控制键却拥有多种不同的功能,按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。 2、单片机简介 1972年,美国Intel公司首先推出8位微处理器8008,并于1976年9月率先推出MCS-48系列单片机。在这以后,8位单片机纷纷面市。例如,莫斯特克和仙童公司合作生产的3870系列,摩托罗拉公司生产的6801系列等。随着集成电路工艺水平的提高,一些高性能的8位单片机相继问世。例如,1978年摩托罗拉公司的MC6801系列及齐洛格公司的Z8系列,1979年NEC公司的UPD78XX系列。这类单片机的寻址能力达64KB,片内ROM容量达4--8KB,片内除带有并行I\O口外,还有串行I\O口,甚至还有A\D转化器功能。8位单片机由于功能强,被广泛用于自动化装置、智能仪器仪表、智能接口、过程控制、通信、家用电器等各个领域。单片机全称为单片机微型计算机(Single Chip Microsoftcomputer)。从应用领域来看,单片机主要用来控制,所以又称为微控制器(Microcontroller Unit)或嵌入式控制器。单片机是将计算机的基本部件微型化并集成在一块芯片上的微型 AT89C51是一个低功耗,高性能CMOS 8位单片机,片内含4k Bytes ISP(In-system programmable)的可反复擦写1000次的Flash只读程序存储器,器件采用ATMEL公司的高密度、非易失性存储技术制造,兼容标准MCS-51指令系统及80C51引脚结构,芯片内集成了通用8位中央处理器和ISP Flash存储单元,功能强大的微型计算机的AT89C51可为许多嵌入式控制应用系统提供高性价比的解决方案。 综上所诉,数字时钟设计方案采用单片机机型:AT89C51;计时方案设计采用单片机内部计数/定时功能,利用软件控制单片机实现数字时钟时间设置功能;显示方案中利用单片机并行I/O端口,实现LED动态显示; 第二章 数字时钟电路设计 2.1 设计要求 设计并制作出具有以下功能的数字钟: (1)自动计时,由六位LED显示器显示时、分、秒 (2)具备校准功能,可以设置当前时间。 (3)具备定时启闹功能,可以设置启闹时间,启闹10s后自动关闭闹铃 2.2 数字电路模块图: 主程序函数 LED 显示 函数 键盘 检测 函数 查键 值函 数 闹钟 设置 函数 时钟 设置 函数 闹钟 判断 启动 函数 定时 器中 断函 数 加1 修改 功能 函数 2.3 2.2 模块简介: (1)主程序函数main:完成系统初始化,包括时钟、闹铃初始参数及初始标志的设定;I/O端口、定时/计数器初始状态的设定:更新显示时间,循环扫描按键,根据案件分别进行闹铃和时钟的设置管理。 (2)LED显示函数dispiay:根据显示单元首地址显示时钟(或闹铃)时间,实现6位LED的动态显示功能。 (3)键盘检测函数keytest和查键值函数search:这两个函数都属于键盘扫描模块,函数keytest判断是否有按键输入,函数search识别并返回行列式按键的键号。 (4)时钟设置函数ftion0:根据用户按下0#键的次数,依次选择设置时钟的秒、分、时的修改标志位。加1修改功能函数将根据该标志位进行时钟时间的设置修改。 (5)闹铃设置函数ftion1:根据用户按下:1#键的次数,依次选择设置闹铃的分、时的修改标志位。加1修改功能函数将根据该标志位进行时钟闹铃的设 (6)加1修改功能函数cum:用户按下2#键后,根据时钟和闹铃设置函数设置的标志位将时钟(或闹铃)相应的时、分、秒计数单元加1。 (7)闹铃判断启动函数alarm:半段闹铃启动时间到否,若时间到,则启动闹铃,延时10s后自动关闹铃,并清除闹铃设置标志。 (8)定时器中断函数clock:定时修改时钟参数中断服务子程序。 综上各模块功能,数字时钟设计方案采用单片机机型:AT89C51;计时方案设计采用单片机内部计数/定时功能,利用软件控制单片机实现数字时钟时间设置功能;显示方案中利用单片机并行I/O端口,实现LED动态显示; 2.3 系统功能操作实现 (1)键盘功能定义。系统采用4*3矩阵键盘。共计12个按键任务中使用了三个按键,0#、1#和2#键,其余按键为系统功能扩展预留。 0#键:时钟参数表修改功能选择键。按一次修改秒,按二次修改分,按三次修改小时,按四次确认修改完毕。 1#键:闹铃时间设置功能选择键。按一次修改分,按两次修改小时,按三次确认修改完成。 2#键:增1功能键,每按一次该键,根据0#、1#键的选择结果将相应单元内容加1。修改“小时”时,加到23后再加1“清零”;修改“分”时,加到59后再加1“清零”。 (2)显示定义。6位LED从左到右依次显示时、分、秒,采用24小时计时。 (3)系统工作流程设计 时间显示:上电后,系统自动进入时钟显示,从00:00:00开始计时。 时间调整:按下0#键,系统停止计时,进入时间设定状态,保持原有显示。按一次修改秒表,按二次修改分,按三次修改小时,直至按四次确认修改完成,系统由设定后的时间开始计时显示。 闹铃设置/启闹/停闹:按下1#键,数码管显示00:00:00,进入闹铃设置状态。等待键入启闹时间,按一次设置分,按两次设置小时,按三次确认设置完毕。将启动定时启闹功能,并恢复时间显示。当定时时间到,蜂鸣器鸣叫10s后停闹。在闹铃设置过程中,系统继续计时。 在时间调整和闹铃设置状态下,均可以按2#键,采用增1方式修改相应的参数。 2.4 方案设计元件清单 元件名称 数量 参数 名称 所属库 单片机 1 AT89C51 AT89C51 MCS8051 按钮 1.2*1.2 12 BUTTON ACTIVE 晶振 1 12MHZ CRYSTLE DEVICE 电 阻 8 200/0.25W RES DEVICE 1 1K/0.25W 3 5.1K/0.25 电阻排 1 10K RESPACK-8 电解电容 1 10uF/16V GENELECT10U16V CAPACITORS 瓷片电容 2 30pF CERAMIC33P CAPACITORS 或非门 1 - 71LS02 DEVICE 蜂鸣器 1 - BUZZER ACTIVE 第三章 Protues仿真电路 3.1 绘制数字时钟电路Protues仿真原理图: 3.1.1 启动ISIS 7 Professional软件 元件的加载:找到原件后双击原件即可完成加载原件。 3.1.2 仿真电路绘制 放置元件→调整原布局→连线→绘制总线→放置网络标号 网络标号放置如下图所示。 3.1.3 数字时钟原理图 连线后最终数字时钟电路原理图如下 3.1.4 电路检测 电路连接完毕后,单击运行按钮(如下图)检测电路是否有误, 如果电路如果无误进行软件检测。 3.2 软件设计: 3.2.1 运行keil软件编写程序 3.2.2 编译、连接 3.2.3 将程序烧入单片机 3.2.4、程序运行 附录 程序: /***************数字钟程序***************/ #pragma SMALL #include <reg51.h> #include <absacc.h> #define uchar unsigned char sbit P2_7=P2^7; //定义蜂鸣器控制端口 /**************函数声明*************/ void delay(uchar x); void display(uchar *p); uchar keyscan(); //扫描键盘有无键按下 uchar search(); //按键识别 void alarm(); //闹钟判断启动 void ftion0(); //时钟修改 void ftion1(); //闹钟修改 void cum(); //加1修改 /***************全局变量定义****************/ uchar clockbuf[3]={0,0,0}; //存放时钟时分秒的十进制数 uchar bellbuf[3]={0,0,0}; //存放闹钟时分秒的十进制数 uchar msec1; //10ms中断次数 uchar msec2; //1s循环次数 uchar timdata,rtimdata; //时钟和闹钟修改位置标志 uchar count; //闹钟启动后10s计时单元 uchar *dis_p; //显示缓冲区指针 bit armbit; //闹钟标志,为0闹钟未设定,为1已设定 bit rtimbit; //闹钟是否启动标志,为1已启动 bit rhourbit; //闹钟小时修改标志,为1正在修改闹钟小时 bit rminbit; //闹钟分修改标志,为1正在修改闹钟分 bit hourbit; //时钟小时修改标志,为1正在修改时钟小时 bit minbit; //时钟分修改标志,为1正在修改时钟分 bit secbit; //时钟秒修改标志,为1正在修改时钟秒 /****************主函数****************/ void main() { uchar a; armbit=0; //清零闹钟标志位 msec1=0; //设置10ms中断次数初值 msec2=0; //设置1s中断次数初值 timdata=0; //时钟内容修改位置记忆单元清零 rtimdata=0; //闹钟内容修改位置记忆单元清零 count=0; //闹钟启动后保持10s计时单元清零 TMOD=0x02; //定时器T0为工作方式2 TL0=0x06; //定时初始值为250us TH0=0x06; EA=1; //中断总允许位开启 ET0=1; //定时器0开中断 TR0=1; //启动定时器T0 dis_p=clockbuf; //将时钟值所在地址送入显示指针 while(1) { a=keyscan(); //调用键盘扫描子程序 if(a==0x0f) { display(dis_p); //无键输入调用显示程序 if(armbit==1)alarm(); //判断闹钟设定否,若设定则调用闹钟启动函数 } else { display(dis_p); //调用显示子函数作为延时去抖动 a=keyscan(); if(a!=0x0f) //没有抖动,表示有键按下 { a=search(); //调用查键值子函数 switch(a) { case 0x00:ftion0(); break; //是时钟参数修改功能键,调用时钟设置子函数 case 0x01:ftion1(); break; //是闹钟参数修改功能键,调用闹钟设置子函数 case 0x02:cum(); break; //是加1功能键,调用加1修改功能子函数 default:break; } } } } } void delay(uchar x) { char j; while(x--) for(j=0;j<123;j++); } //***************6位LED显示函数***************/ void display(uchar *p) { uchar buffer[]={0,0,0,0,0,0}; uchar k,i,j,temp; uchar led[]={0x3f,0x06,0x58,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f }; buffer[0]=p[0]/10; buffer[1]=p[0]%10; buffer[2]=p[1]/10; buffer[3]=p[1]%10; buffer[4]=p[2]/10; buffer[5]=p[2]%10; for(k=0;k<3;k++) { temp=0xfe; for(i=0;i<6;i++) { P1=0xff; //关显示 j=buffer[i]; P1=led[j]; //P1送断码 P0=~temp; //P0对应端口低电平选位 temp<<=1; delay(5);//每一位显示延时 } } } /**************键盘扫描函数************/ uchar keyscan() { uchar c; P0=0xf0; c=P2; c=c&0x07; //按键行输入为P2.0-P2.2,屏蔽无关位 return(c); } /**************查键值函数*************/ uchar search() { uchar a,b,c,d,e; c=0xfe; //首列扫描字送变量c a=0; //首列号送a while(1) { P0=c; //列扫描字送P0口 d=P2; //读入P2口的行状态 if(d&0x01==0){b=0;break;} //第0行有键按下,第0行行首号送b else if(d&0x02==0){b=4;break;} //第1行有键按下,第1行行首号送b else if(d&0x04==0){b=8;break;} //第2行有键按下,第2行行首号送b a++; //扫描列号加1 c<<=1; //修改列扫描字,扫描下一列 } e=a+b; //将行首号与列号相加,求键号 do{display(dis_p); } while((d=keyscan())!=0x07); //等待释放按键 return(e); } /***********闹钟判断启动函数*************/ void alarm() { if((clockbuf[0]==bellbuf[0])&& (clockbuf[1]==bellbuf[1])) { P2_7=0;rtimbit=1; } //设置闹钟计时标志,时钟将进行10s计时标志 else { if(count==10) //判断闹钟保持10s时间到否 { count=0; //清除闹钟保持10s计时 P2_7=1; //清除闹钟 armbit=0; //清闹钟标志,否则闹钟设置将继续有效 rtimbit=0; } } } /*************时钟设置函数*************/ void ftion0() { TR0=0; //关定时器 rhourbit=0; //禁止闹钟时间参数修改,请闹钟修改标志 rminbit=0; dis_p=clockbuf; //将时钟缓冲区首地址送显示指针 rtimdata=0; //清闹钟修改位置标志记录 timdata++; //将时钟修改记录值加1 switch(timdata){ case 0x01:secbit=1;break; //记录值为1,则将时钟秒修改标志置1 case 0x02:secbit=0;minbit=0;break; //记录值为2,则将时钟分修改标志置1 case 0x03:minbit=0;hourbit=1;break; //记录值3,则将时钟时修改标志置1 case 0x04:timdata=0;hourbit=0;TR0=1;break; //按4次则清时钟单元修改位置 //记录,定时器重新开启 default:break; } } /***************闹钟设置函数**************/ void ftion1() { secbit=0; //禁止时钟时间修改 minbit=0; hourbit=0; dis_p=bellbuf; //设置闹钟显示标志 timdata=0; //清时钟修改位置标志记录 rtimdata++; //将闹钟修改记录值加1 switch(rtimdata) { case 0x01:rminbit=1;break ;//记录值为1,将闹钟分修改标志置1 case 0x02:rminbit=0;rhourbit=1;break; //记录值为2,将时钟分修改标志置1 case 0x03:rtimdata=0;rhourbit=0; //按3次则清闹钟单元修改位置记录 armbit=1; //设置闹钟已设置标志位 dis_p=clockbuf; //恢复时钟显示标志 break; default: break; } } /*************加1修改功能函数**************/ void cum() { if(secbit==1) { //时钟秒修改标志为1,秒单元内容加1 if(clockbuf[2]==59) clockbuf[2]=0; else clockbuf[2]++;} else if(minbit==1) { //时钟分修改标志为1,分单元内容加1 if(clockbuf[1]==59) clockbuf[1]=0; else clockbuf[1]++; } else if(hourbit==1) { //时钟小时修改标志为1,小时单元内容加1 if(clockbuf[0]==23) clockbuf[0]=0; else clockbuf[0]++;} else if(rtimbit==1) { //闹钟分修改标志为1,分单元内容加1 if(bellbuf[1]==59) bellbuf[1]=0; else bellbuf[1]++;} else if(rhourbit==1) { //闹钟小时修改标志为1,小时单元内容加1 if(bellbuf[0]==23) bellbuf[0]=0; else bellbuf[0]++; } } /************定时器中断函数*************/ void clock() interrupt 1 { EA=0; //关中断 if(msec1!=40) msec1++; else { msec1=0; //到10ms否,不到则msec1加1 if(msec2!=100)msec2++; //到1s否,不到则msec2加1 else { if(rtimbit==1)count++;msec2=0; if(clockbuf[2]!=59)clockbuf[2]++; //到1min否,不到则clockbuf[2]加1 else { clockbuf[2]=0; if(clockbuf[1]!=59)clockbuf[1]++; //到1h否,不到则clockbuf[1]加1 else { clockbuf[1]=0; if(clockbuf[0]!=23) clockbuf[0]++; //到24h否,不到则clockbuf[0]加1 else clockbuf[0]=0; } } } } EA=1; //开中断 } 总结 历时一周的Protues仿真大型作业经过自己努力终于告一段落,在这次电子时钟电路大型作业仿真电路设计中自己学到了很多知识,同时对以前自己所学知识也进行了巩固,对知识的掌握更加牢固。 一周实训自己进一步认识到Protues仿真在电子电路仿真中的重要性,尤其在模拟电路、数字电路、单片机控制电路中应用方面,作为我们主要的专业课程之一,我觉得Protues仿真在单片机课程设计很有必要,而且很有意义。在这次课程设计中,运用到了很多以前的专业知识,虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的一大收获。另外,要做好一个课程设计,就必须做到:在设计程序之前,对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计硬件电路时仿真时,不能妄想一次就将整个电路设计好,也可能需要反复修改、不断改进是;程序设计也是如此,都需要反复修改,要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在设计课程过程中遇到问题是很正常德,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题的课程设计结束了,但是从中学到的知识会让我受益终身。发现、提出、分析、解决问题和实践能力的提高都会受益于我在以后的学习、工作和生活中。设计过程,好比是我们人类成长的历程,常有一些不如意,但毕竟这是第一次做,难免会遇到各种各样的问题。在设计的过程中发现了自己的不足之处,对以前所学过的知识理解得不够深刻,掌握得不够牢固,不能灵活运用。 通过这次设计,我懂得了学习的重要性,进一步掌握了解到理论知识与实践相结合的重要意义,学会了坚持、耐心和努力,这将为自己今后的学习和工作做出了最好的榜样。 参考资料 ● 张文涛 PROTEUS仿真软件应用 华中科技大学出版社 ● 王静霞 单片机应用技术 (C语言版) 电子工业出版社 ● 王东峰 等 单片机C语言设计100例 电子工业出版社
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 应用文书 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服