安徽工程大学本科课程设计说明书专业:计算机科学与技术题目:电子时钟课程设计学生姓名: (hch)指导教师:老师年月日前言本课程设计为电子时钟设计,在设计过程中,关键的难题就是接口的设计和AT89C51芯片内部的时钟电路以及它的中断系统。
在当今时代,人们不时地就关注周围发生的一切。
而一个好的电子时钟,被安置在各种器件上。
所以,电子时钟应用面极广。
《单片微型计算机及接口技术》是一门应用性较强的计算机专业课程,是设计与开发各种计算机应用系统的基础。
从硬件的角度看,微型计算机、单片机、嵌入式系统的开发和应用,很大程度上都是接口电路的开发与应用。
因此,本课程设计的成功的关键也在接口设计上。
本设计的大致结构为:第一章,主要介绍设计的总思想和原理;第二章,对系统功能模块的设计;第三章,对硬件系统的设计;第四章,画出了时钟的操作流程图;第五章,部分功能模块的详细代码设计;第六章,演示最后的设计结果。
目录前言 (2)目录 (3)课程设计任务书 (4)第一章概述 (6)1.1基本设计思想 (6)1.2设计原理 (6)第二章系统功能模块设计 (7)2.1 系统的主要功能模块 (7)2.2 系统的组成框图 (7)2.3接口设计 (7)第三章硬件系统的设计 (10)3.1 器件简介 (10)3.2 软件简介 (12)第四章时钟的操作流程 (14)第五章代码设计 (15)第六章程序调试及结果 (19)课程设计小结 (22)参考文献 (23)课程设计图纸 (24)附录:(完整代码) (24)课程设计任务书安徽工程大学本科课程设计任务书2009 届计算机与信息学院计算机科学技术与工程092 专业Ⅰ课程设计题目:电子钟设计Ⅱ原始资料本程序设计中有几个要点:A、设计一个1s时钟,作为时间的基准。
可通过定时器来实现,由于定时限制,我们可以设定定时时钟为50ms中断一次,然后用一个计数器计数20次,即50ms*20=1000ms=1s。
B、分与时都可采用软件计数器来实现。
60秒为1分,60分为1小时。
C、由于实际应用中要求显示为十进制数,而在程序中处理的数据都为十六进制,因此在程序中要对显示缓冲区的数据进行十进制调整。
Ⅲ课程设计任务内容1.课程设计的目的意义:通过课程设计培养同学们的系统设计能力,使同学们达到以下能力训练:⑴、调查研究、分析问题的能力;⑵、使用设计手册、技术规范的能力;⑶、查阅中外文献的能力;⑷、制定设计方案的能力;⑸、计算机应用的能力;⑹、设计计算和绘图的能力;⑺、技术经济指标的分析能力;⑻、语言文字表达的能力。
2.本课题研究的主要内容:设计一个电子钟,利用四个数码管,在其上显示分、秒;用4个小键盘分别进行分+1、分-1、秒+1、秒-1改变时间值。
基本要求:⑴、设计实验电路(要求利用实验仪的硬件资源)⑵、分析实验原理⑶、列出实验接线表⑷、采用汇编语言编写实验程序⑸、通过实验验证功能的实现⑹、编写课程设计说明书指导教师(签字)完成日期年月日接受任务书学生(签字)第一章概述1.1基本设计思想用定时器T0和定时器T1,都采用工作方式1,对12MHZ的系统时钟进行定时计数,初值设为 TH0 = (65536-1000)/256; TL0 =(65536-1000)%256; TH1 = 0xdc; TL1 = 0; 形成定时时间为50ms。
用片内RAM的7BH单元对50ms计数,计20次产生秒计数器7BH单元加1,秒计数器加到60则分计数器79H单元加1,分计数器加到60则时计数器7AH单元加1,时计数器加到24则时计数器清0。
然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。
显示格式为“小时十位、小时个位、分十位、分个位、秒十位、秒个位”。
在处理过程中加上了按键判断程序,能对按键处理。
比如相应的“时+”“时-”“分+”“分-”“秒+”“秒-”六个按钮,对应控制显示的数据。
增加功能:加一个“设置时间”开关K1(1)当开关K1按下时,调用控制位TR1,使TR1=0,中断计数器。
使得时钟显示当前的时间,此时可以通过六个加减按钮改变时间值;(2)当开关K1断开,TR1=1,把当前的显示时间送回寄存器,并且恢复中断,计数时钟继续自动跳转。
1.2设计原理一般电子钟是一个将“时”,“分”,“秒”显示于人的视觉器官的计时装置。
它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和报时功能。
因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”计数器、校时电路、报时电路和振荡器组成。
主电路系统由秒信号发生器、“时、分、秒”计数器、译码器及显示器、校时电路、电路组成。
秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。
将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。
“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。
“时计数器”采用24进制计时器,可实现对一天24小时的累计。
译码显示电路将“时”、“分”、“秒”计数器的输出状态用七段显示译码器译码,通过七段显示器显示出来。
校时电路时用来对“时”、“分”、“秒”显示数字进行校对调整。
而该电子时钟由AT89C51,74LS245,BUTTON,六段数码管等构成,采用晶振电路作为驱动电路,由延时程序和循环程序产生的一秒定时,达到时分秒的计时,六十秒为一分钟,六十分钟为一小时,满二十四小时为一天。
电路中六个按钮控制对应的数码管显示。
按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;每按一次对应数字加1。
第二章 系统功能模块设计2.1 系统的主要功能模块由系统的基本功能,可以设定系统主要由:按钮模块,T0中断模块,T1中断模块构成。
● 按钮模块:用户的进行时钟的加减变化来设置时间● T0中断模块:动态扫描数码管显示● T1中断模块:控制时钟运行2.2 系统的组成框图2.3接口设计(1)开关及按钮控制电路,如图2-1,六个按钮分别接P1.0~ P1.6口,设置开关接P2.7口。
图2-1AT89C51 单片机 开关及按钮控制电路 74LS245 芯片 六位七段LED晶振(2)晶振电路与AT89C51的接口如图2-2图2-2(3)74LS245芯片的A0~A7接P2.0~P2.7口,如图;B0~B7接数码管的A~G、DP,如图2-3和图2-5图2-3(4)数码管的段选端口123456分别接P3.0~P3.6,如图2-4和图2-5图2-4 图2-5第三章硬件系统的设计3.1 器件简介本课程设计所需元件清单:AT89C51 单片机一个74LS245 芯片一个7SEG-MPX6-CC(六位七段数码管)一个CRYSTAL(晶振)一个CAP(无极性电容)两个CAP-ELEC(电解电容)BUTTON(按钮)六个SWITH(开关)一个RES(电阻)一个(1)AT89C51简介芯片功能介绍及设计:AT89C51是一种带4K字节闪烁可编程可擦除只读存储器的低电压,高性能CMOS8位微处理器,俗称单片机。
该器件采用ATMEL高密度非易失存储器制造技术制造,与工业标准的MCS-51指令集和输出管脚相兼容。
由于将多功能8位CPU和闪烁存储器组合在单个芯片中,ATMEL的AT89C51是一种高效微控制器,为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。
此外,AT89C51设有稳态逻辑,可以在低到零频率的条件下静态逻辑,支持两种软件可选的掉电模式。
在闲置模式下,CPU停止工作。
但RAM,定时器,计数器,串口和中断系统仍在工作。
在掉电模式下,保存RAM的内容并且冻结振荡器,禁止所用其他芯片功能,直到下一个硬件复位为止。
AT89C51芯片图如下:(2)74LS245芯片简介74LS245是我们常用的芯片,用来驱动led或者其他的设备,它是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
当片选端/CE低电平有效时,DIR=“0”,信号由 B 向 A 传输;(接收)DIR=“1”,信号由 A 向 B 传输;(发送)当CE为高电平时,A、B均为高阻态。
由于P2口始终输出地址的高8位,接口时74LS245的三态控制端1G和2G接地,P2口与驱动器输入线对应相连。
P0口与74LS245输入端相连,E端接地,保证数据线畅通。
8051的/RD和/PSEN相与后接DIR,使得RD且PSEN有效时,74LS245输入(P0.1←D1),其它时间处于输出(P0.1→D1)。
74LS245芯片及其功能说明3.2 软件简介本课程设计采用Keil uVision编程和以及调试源代码、Proteus软件进行硬件仿真4.2.1 在Keil uVision中编程和调试代码4.2.2 注意事项在Proteus ISIS中进行放置元件、设置电路参数、连接各元件,经几次修改布线错误, 画出电子时钟总电路,并进行检查。
然后加载用keil编译生成的XX.HEX(XX为文件名)进行功能测试,仿真。
在仿真时注意用适合仿真功能的元器件。
要注意本设计用的是7段共阴极LED数码管的驱动芯片。
在放置六位数码管LED时要选择7SEG-MPX6-CC(共阳极)而不是7SEG-MPX6-CA(共阴极)。
Keil软件是一款程序编辑软件,是目前最流行开发MCS-51系列单片机的软件,通过一个集成开发环境(uVision)将这些部份组合在一起。
运行Keil软件需要Pentium或以上的CPU,16MB或更多RAM、20M以上空闲的硬盘空间、WIN98、NT、WIN2000、WINXP等操作系统,本实验中需要将Proteus和keil联调,在keil 上输入程序,编译并运行正确,然后将其下载到Proteus中,配合其电路图进行仿真。
4.2.2仿真步骤(1)在Proteus上连接实验所需的电路,首先把所需要的元器件都找到,如下图4-1,点击P;会弹出图4-2的搜索器件框,在关键字搜索栏里对照元器件名,全部添加到如图4-1的器件列表中。
图4-1图4-2(2)根据第二章的接口设计,将电路连接好。
最后完成的效果图如下:第四章时钟的操作流程根据时钟的特性,以及设计的原理,可以确定用户操作的流程如下图:时钟流程图第五章代码设计代码的设计主要为以下几个部分:(1)延时程序:***************************************************************** //-------延时----------void Delay(uchar x){uchar i;w hile(x--) for(i=0; i<120;i++);}*****************************************************************(2)T0、T1中断控制部分***************************************************************** //----------T0中断-动态扫描数码管显示-----------void T0_int() interrupt 1 //interrupt 1 这里的1表示中断源编号{TH0 = (65536-1000)/256;T L0 = (65536-1000)%256;P3 =Scan_bit; //选通相应数码管i f(K1 == 0) {TR1 =0; //当“设置时间”K1按下时,关闭中断}else {TR1 =1; //恢复中断}P0 =~DSY_buffer[DSY_idx]; //段码送P0(进行共阴共阳转换)S can_bit = _crol_(Scan_bit,1); //准备下次将选通的数码管D SY_idx = (DSY_idx + 1)%8; //索引在0~7内循环}//T1中断控制时钟运行void T1_int() interrupt 3{T H1 = (65536-50000)/256; //定时50毫秒T L1 = (65536-50000)%256;i f( ++s100 > 20) //50ms*20=1s 延时{s100 = 0; increase_second();}}*****************************************************************(3)时、分、秒函数处理:***************************************************************** //-------小时处理函数--------void increase_hour(){if(++h > 23) h=0;D SY_buffer[0] = DSY_code[h / 10]; //对数字进行整除,取小时的十位上的数D SY_buffer[1] = DSY_code[h % 10]; //对数字进行求余,取小时的十位上的数}//-------分钟处理函数--------void increase_minute(){if(++m >59){m=0; increase_hour();}DSY_buffer[2] = DSY_code[m / 10];DSY_buffer[3] = DSY_code[m % 10];}//-------秒处理函数--------void increase_second(){if(++s >59){s=0; i ncrease_minute();}DSY_buffer[4] = DSY_code[s / 10];DSY_buffer[5] = DSY_code[s % 10];}*****************************************************************(4)逻辑总控制部分,包括按钮以及开关的触发使得数码管显示相应的改变*****************************************************************//-----------主程序-------------void main(){P0 = P3 =0xFF; //P1,P3口全置1T MOD = 0x11; //设置T0,T1工作在模式1T H0 = (65536-1000)/256;T L0 = (65536-1000)%256;T H1 = 0xdc; // 设定初始值T L1 = 0;T CON = 0x01;E A = 1; //cpu开放中断E T0 = 1; //允许T0中断E T1 = 1; //允许T1中断h =0; m=s=s100=0; //设启动后初值显示为120000//-----将(时-分-秒)段码放入显示缓冲-------D SY_buffer[0] = DSY_code[h / 10];D SY_buffer[1] = DSY_code[h % 10];D SY_buffer[2] = DSY_code[m / 10];D SY_buffer[3] = DSY_code[m % 10];D SY_buffer[4] = DSY_code[s/ 10];D SY_buffer[5] = DSY_code[s % 10];S can_bit = 0xfe; //扫描位设初始值D SY_idx = 0;T R0 = TR1 = 1; //启动两个定时器k ey_state = 0xff;w hile(1){if(P1 ^ key_state){Delay(10);if(P1 ^ key_state){key_state = P1; EA = 0;switch(key_state) //P1端口的值为高电平,当按钮按下时,对于的pi.n端口值变为低电平{case 0xfe: increase_hour(); //时+ 如:0xfe,转为二进制(1111 1110)即代表P1.1口接地,就是“时+”按钮按下break;case 0xfd: //时-if(h--<1){ h=23; }DSY_buffer[0] = DSY_code[h / 10];DSY_buffer[1] = DSY_code[h % 10];break;case 0xfb: //分+m = (m+1)%60;DSY_buffer[2] = DSY_code[m / 10];DSY_buffer[3] = DSY_code[m % 10];break;case 0xf7: //分-if(m--<1){m=59; h=(h-1)%24; //在“时值”为正数时,当按(分-)从00变为59时,对应使“时值”减1}DSY_buffer[2] = DSY_code[m / 10];DSY_buffer[3] = DSY_code[m % 10];DSY_buffer[0] = DSY_code[h / 10];DSY_buffer[1] = DSY_code[h % 10];break;case 0xef: //秒+s = (s+1)%60;DSY_buffer[4] = DSY_code[s / 10];DSY_buffer[5] = DSY_code[s % 10];break;case 0xdf: //秒-if(s--<1){s=59; m = (m-1)%60; //在“分值”为正数时,当按(秒-)从00变为59时,对应使“分值”减1}DSY_buffer[4] = DSY_code[s / 10];DSY_buffer[5] = DSY_code[s % 10];DSY_buffer[2] = DSY_code[m / 10];DSY_buffer[3] = DSY_code[m % 10];break;}EA = 1;}}}}*****************************************************************第六章程序调试及结果1. 通过第四章的中,用Proteus软件将电路图画好;第五章把代码设计好后;在Keil uVision 软件调试,测试语法逻辑等没有错误后。