




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
课程设计——单片机应用系统设计——简易数字钟设计姓名:邓玉婷学号:U200713549班级:通信0703指导老师:杨明完成时间:2010-07-07课程设计目的单片计算机即单片微型计算机。(Single-ChipMicrocomputer),是集CPU,RAM,ROM,定时,计数和多种接口于一体的微控制器。它体积小,成本低,功能强,广泛应用于智能产品和工业自动化上。而51单片机是各单片机中最为典型和最有代表性的一种。这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。项目描述该课程设计是利用51系列单片机内部的定时/计数器、中断系统、以及LED显示器等部件,设计一个单片机电子时钟。设计的电子时钟通过数码管显示,并能通过按键实现设置时间和暂停、启动控制等。实验要求1)硬件电路自己设计——芯片选型自定;
2)8个数码管显示日、小时、分钟、秒;
3)2-3个按键用于设定、修改时间;
4)精度要求:1个小时不超过1s。
实验原理该课程设计是利用51系列单片机内部的定时/计数器、中断系统、以及LED显示器等部件,设计的一个单片机电子时钟。设计的电子时钟通过数码管显示,并能通过按键实现设置时间和暂停、启动控制等。用定时/计数器T0,工作于定时,采用方式1,对12MHZ的系统时钟进行定时计数,初值设为XXYY(自己计算)。形成定时时间为50ms。用片内RAM的7BH单元对50ms计数,计20次产生秒计数器78H单元加1,秒计数器加到60则分计数器79H单元加1,分计数器加到60则时计数器7AH单元加1,时计数器加到24则时计数器清0。然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。显示格式为小时十位、小时个位---分十位、分个位---秒十位、秒个位。在处理过程中加上了按键判断程序,能对按键处理。设计过程1、51系列单片机内部结构图2、定时计数器51系列单片机片内有二个十六位定时/计数器:定时器0(T0)和定时器1(T1)。两个定时器都有定时或事件计数的功能,可用于定时控制、延时、对外部事件计数和检测等场合;定时/计数器实际上是16位加1计数器。T0由2个8位持殊功能寄存器TH0和TL0构成,T1由2个8位持殊功能寄存TH1和TL1构成。每个定时器都可由软件设置为定时工作方式或计数工作方式。T0和T1受特殊功能寄存器TMOD和TCON控制。8051采用12MHz晶体时,每个机器周期为1μs。8051定时器的四种工作方式:方式0定时器(T0或T1)工作于13位定时、计数方式。用于计数方式时最大计数值为213=8192个脉冲用于定时工作时,定时时间为:t=(213一T0初值)×时钟周期×12在这种模式下,16寄存器(THX和TLX)只用13位,其中THX占高8位。其中TLX占低5位,TLX的高3位末用。当TLX的低5位溢出时向THX进位,而THX溢出时硬件置位TF0,并申请中断。定时、计数溢出否可查询TF0是否置位,如果开中断则产生溢出中断。方式1当TMOD中M1M0=01时,定时计数器工作在方式1。该模式是一个16位定时/计数方式。寄存器TH0和TL0是以全16位参与操作,计数方式时最大计数216=65536(个外部脉冲),用于定时工作方式时,定时时间为:t=(216一T0初值)×时钟周期×1216寄存器(THX和TLX)中THX提供高8位、TLX提供低8位计数初值方式2当TMOD中M1M0=10时,定时器工作在方式2。方式2是8位的可自动重装载的定时计数方式。16位的计数器被拆成两个8位,其中TL0用作8位计数器,TH0用以保持计数初值。当TL0计数溢出,置位TF0,TH0中的初值自动装入TL0,继续计数,循环重复计数。用于计数工作方式时,最大计数值为:28=256(个外部脉冲)。用于定时工作方式时,其定时时间为;t=(28—TH0初值)×振荡周期×12这种工作方式可省去用户重装常数的程序,并可产生精确的定时时间,特别适用作串行口波待率发生器。方式3当TMOD中M1M0=11时,定时器工作在方式3。若将T0设置为模式3,TL0和TH0被分成为两个互相独立的8位计数器TH0和TL0。TL0可工作为定时方式或计数方式。占用原T0的各控制位、引脚和中断源。即C/T、GATE、TR0、TF0和T0(P3.4)引脚、INT0(P3.2)引脚。TH0只可用作定时功能,占用定时器T1的控制位TR1和T1的中断标志位TF1,其启动和关闭仅受TRl的控制。定时器T1无模式3,可工作于方式0、1、2,但不能使用中断方式。只有将T1用做串行口的波特率发生器时,T0才工作在方式3,以便增加一个定时器。3、中断8051有5个中断源,3个在片内,2个在片外,它们在程序存贮器中有固定的中断入口地址,当CPU响应中断时,硬件自动形成这些地址,由此进入中断服务程序;5个中断源有两级中断优先级,可形式中断嵌套;8051有5个中断源系统流程图详细设计数码管显示模块由于本实验的8051开发板上一共有六位数码管,刚好分别用两位来显示时、分、秒。在程序中定义了一个6个字节长的数组dispnum[6](初始化为全0),分别用来记录当前显示的时、分、秒的十位和个位。再通过查表采用动态扫描(扫描间隔为10ms)的的方式显示各位时间。数码管段码如下:unsignedcharcodetab0[18]=={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};动态扫描显示代码段:P1=0x01;for(;i<=n;i++){ P2=tab0[(time[i])]; for(j=0;j<m;j++);P1=P1<<1; P2=0x00;}定时器模块本实验所用实验板的单片机晶振为12Hz,因此及其周期为1us,要定时1s,需要1000000个机器周期,对于本实验来说,这是一个比较长的定时时间,所以我们采用定时器1,工作在方式1(即16位定时方式),但即使如此,此方式的单次定时时间还是不能达到1s,因此我采用每次定时10ms,然后设置一全局变量k来计数定时的次数,该数值达到100,则说明1s的定时时间已到,然后秒钟+1;设计定时器的初值:10000H–2710H=D8F0H其中10000H是16位定时器溢出时的值,2710H为10000us对应的16进制值因此,定时器的模式为:TMOD=0x10;//定时器1工作于方式1定时器初值:TH1=0xD8;TL1=0xF0;以下是定时器初始化代码:voidTimerInit(void)//时钟中断{ TMOD=0x11; TH1=0x3C; TL1=0xB0; ET1=1;//开定时器T1中断 TR1=1;//启动定时器中断}定时器中断函数如下:voidtimer1(void)interrupt3using2//计数器{ TF1=0; msecond++; if(msecond>=20) { msecond=0; flag=1; } TH1=0x3C; TL1=0xB0;}外部中断校时模块因为要时、分能够分别单独调整,如果全部采用外部中断实现,那至少得2个外部中断,虽然8051单片机提供了两个外部中断,但我们的实验板上却只有一个外部中断的按钮,因此我们只能利用一个外部中断按钮,然后采用额外的标记来分别进行时、分的调整,而刚好在我们的实验板上有8个拨码开关,因此我们可以利用这8个拨码开关的前四个分别控制小时分钟的十、个位的时间校准,哪个拨码开关置ON,则调整相应位的时间,采用外部中断0的沿触发方式,没触发一次,则相应位+1,至于时间的合法性判断则由程序控制。其具体实现代码如下:开外部中断0:EX0=1;//中断0允许中断IT0=1;//下降沿触发内部中断响应函数:voidint0(void)interrupt0using1//内部中断{ int0_mount++; if(int0_mount>3) { int0_mount=0; }}外部中断响应函数:八.软件调试过程ErrorC132:notinformalparameterlist即一个函数中的参数声明并不存在于参数名的列表内,再次检查程序发现在定义变量的时候,有一个变量名拼写错误,导致出现了这个error。九.测试过程使用keiluVision3编译数字钟程序,生成.hex文件,通过RS-232接口及数据线同计算机相连,将生成的.hex文件烧制到SST89E58RD开发板上,KEY0键为高电平时(年月日显示),当按下开发板上的INT0外部中断按键时,可进行时间(KEY0=0)和日期(KEY0=1)的设置时间精度的测量:名称数字钟电脑时钟起始时间00:00:0022:01:50结束时间01:01:0823:02:57时间差3668s3667s可见时间误差在1s内。实验心得这次课程设计是对我们学习微机原理及单片机课程的检验及实际应用能力的一次提高。显示部分是整个系统的核心部分,因此重点集中在这一部分的模块调试上。由于采用的是P0口作为并行输出,但却没有考虑到其内部无上拉电阻,P0口输出电压较低,因此数码管无法显示。程序的编写过程也给了我很大的收获。在编写程序之前,查阅了大量的相关资料,力求做到规范清晰。在把握了整体的思路后,我们先从程序流程图着手,将整个程序分成若干模块,分开编写,一边发现问题一边解决问题,并在实验板上检验程序测试情况,根据现象不断修改。在这个过程中体会到编程的技巧,设置子程序的合理性,同时对单片机最小系统的设计有了整体的理解和深刻的体会,使我们的思维的锻炼与能力培养有了很大的提高和长足的进步。本次课程设计虽然时间很短,但收获却很大。首先我们对单片机最小系统的设计有了整体的把握,对程序编写的合理与规范性有了深刻的理解,建立起程序设计的一般思路。经过两个星期的课程设计,我得到了充分的锻炼,不仅对单片机的学习有了深刻的理解,同时也增强了毅力和处理突发问题的能力。学习是要付出一定的艰辛与努力的,做事情一定要有不怕困难的吃苦精神,唯有坚持不懈,才能取得最后的胜利。相信本次课程设计对以后的学习将会有很大的影响,我一定会积极地总结经验与教训,改进不足,争取在日后做得更好。当然要感谢老师和同学们的帮助,在我束手无策,陷入困境的时候给予热情的帮助,使我顺利渡过难关。课程设计是一次很好的实践动会,通过实践,我的知识得到了应用,真正实现了知识的学以致用,理论联系实际,我会更加注重实践能力的锻炼,注重动手能力的培养。十一.参考文献[1]徐维祥、刘旭敏.单片微型机原理及应用.大连理工大学出版社,1996[2]李光飞、楼然苗、李良儿单片机C程序设计实例指导北京航空航天大学出版社,2005[3]余永权.89系列FLASH单片机原理及应用.电子工业出版社,2002[4]李群芳,黄建.单片机微型计算机与接口技术.电子工业出版社,2001[5]楼然苗、李光飞.51系列单片机设计实例.北京航空航天大学出版社,2003[6]田立、田清、代方震.51单片机C语言程序设计快速入门.人民邮电出版社,2007[7]张世军,李群芳,黄建.单片微型计算机与接口技术.电子工业出版社.2007程序代码#include<reg51.h>unsignedchartime[6];unsignedchardath[6];unsignedcharint0_mount;unsignedchardatamsecond,second,minute,hour; //时分秒unsignedchardataday,month,year; //日期unsignedintj;bitflag;bitset_flag;voidtimer1(void);voidTime1Init(void);voidseg(void);voidVaribleInit(void);voidseg_show(void);sbitKEY0=P0^0;sbitKEY7=P0^7;sbitKEY1=P0^1;voidset_sec(void) //second设置{ second++; if(second>=60) { second=0; //60秒为一循环 } time[5]=second%10; //秒钟的个位数字,第6个键显示 time[4]=second/10; //秒钟的十位数字,第5个键显示}voidset_min(void) //minute设置{ minute++; if(minute>=60) //60分为一循环 { minute=0; } time[3]=minute%10; //分钟的个位数字,第4个键显示 time[2]=minute/10; //分钟的十位数字,第3个键显示}voidset_hou(void) //hour设置{ hour++; if(hour>=24) //24小时为一循环 { hour=0; } time[1]=hour%10; //时钟的个位数字,第2个键显示 time[0]=hour/10; //时钟的十位数字,第1个键显示}voidset_day(void) //day设置{ day++; if(day>31) { day=1; } dath[5]=day%10; //日期的个位数字,第6个键显示 dath[4]=day/10; //日期的十位数字,第5个键显示}voidseg_show(void){ unsignedcharcodetab0[18]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x77,0x7C,0x39,0x5E,0x79,0x71,0x76,0x73};//段码 unsignedinti,n,m; m=300;//动态扫描 if(int0_mount==3) { P1=0x10; i=4; n=5; } elseif(int0_mount==2) { P1=0x04; i=2; n=3; } elseif(int0_mount==1) { P1=0x01; i=0; n=1; } else { P1=0x01; i=0; n=5; } if(KEY0==0) { for(;i<=n;i++) { P2=tab0[(time[i])]; for(j=0;j<m;j++); P1=P1<<1; P2=0x00; } } else { for(;i<=n;i++) { P2=tab0[(dath[i])]; for(j=0;j<m;j++); P1=P1<<1; P2=0x00; } }}voidint0(void)interrupt0using1//内部中断{ int0_mount++; if(int0_mount>3) { int0_mount=0; }}voidVariableInit(void) //初始化设置{ flag=0; int0_mount=0; msecond=0; second=0; minute=0; hour=0; year=0; month=0; day=1;}voidtimer1(void)interrupt3using2//计数器{ TF1=0; msecond++; if(msecond>=20) { msecond=0; flag=1; } TH1=0x3C; TL1=0xB0;}voidTimerInit(void)//时钟中断{ TMOD=0x11; TH1=0x3C; TL1=0xB0; ET1=1;//开定时器T1中断 TR1=1;//启动定时器中断}voidmain(void){ EA=1;//开总中断 EX0=1;//允许INT0中断 IT0=1;//下降沿产生中断 VariableInit(); TimerInit(); while(1) { if(flag==1&&int0_mount==0&&KEY7==0) { second++; if(second==60) { second=0; minute++; } if(minute==60) { minute=0; hour++; } if(hour
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2017年菏泽市中考试题及答案
- 2014江苏安全员b证试题及答案
- 84消毒题库及答案
- 2024年春九年级语文下册第1课国殇赏析长春版
- 【查漏补缺】期末必 备句型学案Unit 3 Could you please clean your room?(含仿写答案)【人教新目标八下英语】
- 建筑能耗经济性研究-洞察及研究
- 环保导向的绿色能源安全研究-洞察阐释
- 镇管网提升改造工程可行性研究报告
- 原料药生产线项目可行性研究报告(参考)
- 办公家具中人机关系的运用分析研究 艺术设计工商管理专业
- AC-10C沥青混合料配合比设计检验报告
- 模具保养记录表
- 形象店加盟管理方案
- 1.《郑人买履》课件PPT
- T∕ZS 0128-2020 既有建筑结构安全智慧监测技术规程
- 发电机定子绕组泄漏电流和直流耐压试验作业指导书
- 冀教版小学美术六年级下册教案
- 甘肃省生态功能区划
- DB22∕T 1073-2011 绿色淫羊藿生产技术规程
- 教练技术LP三阶段教练手册
- 国家开放大学《人文英语3》章节测试参考答案
评论
0/150
提交评论