单片机课程设计报告设计题目:简易电子时钟的设计院别:专业班级:学号:姓名:指导教师:摘要通过一学期单片机的学习,对其已经有了初步的了解,但是随着社会的不断发展,单片机的应用正在不断地走向深入,它特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。
我们也借此课程设计的机会,对单片机有更深一步的了解与学习。
本次课程课程设计的目的是设计一个简易的电子时钟,通过一个8位共阴极数码管进行时、分、秒的显示,另外设置7个按键,一个用来调整小时,一个用来调整分钟,一个开关控制是否调整时间。
关键词:AT89C51,数码管,按键,DS1303时钟芯片1.概述本设计是锻炼我们的自学能力合作能力,依靠团队的力量去完成一项具体的任务系统的训练了所学知识,设计的过程必将是难忘的,这也将是大学向社会工作过度的一个重要阶段。
本阶段过后要去能够熟练的运用单片机中的计数器、定时器、中断、数码管显示等参考教材或者相关资料,采用C语言实现数字时钟功能,在数码管上实时显示,并运用Protues软件绘制电路原理图,并进行仿真验证和误差分析。
2.系统总体方案设计2.1系统方案的确定用6位数码管,可以显示出时、分、秒;用P2端口控制位选,由定时器进行时间的控制(秒);当总按键按下时可以进行时间调整;2.2方案分析2.3系统总框图图2.13.系统硬件系统设计3.1复位电路单片机复位电路就好比电脑的重启部分,当电脑在使用中出现死机,按下重启按钮电脑内部的程序从头开始执行。
单片机也一样,当单片机系统在运行中,受到环境干扰出现程跑飞的时候,按下复位按钮内部的程序自动从头开始执行。
复位电路的工作原理:在单片机系统中,系统上电启动的时候复位一次,当按键按下的时候系统再次复位,如果释放后再按下,系统还会复位。
所以可以通过按键的断开和闭合在运行的系统中控制其复位。
单片机复位电路如下图图3.13.2时钟电路单片机运行需要时钟支持——就像计算机的CPU一样,如果没有时钟电路来产生时钟驱动单片机,那单片机就不能执行程序。
单片机可以看成是在时钟驱动下的时序逻辑电路。
以5l单片机为例随明:51单片机为l2个时钟周期执行一条指令。
也就是说单片机运行一条指令,必须要用r2个时钟周期。
没有这个时钟,单片机就跑不起来了,也没有办法定时和进行和时间有关的操作。
时钟电路是微型计算机的心脏,它控制着计算机的二个节奏。
CPU就是通过复杂的时序电路完成不同的指令功能的。
51的时钟信号可以由两种方式产生:一种是内部方式,利用芯片内部的振荡电路,产生时钟信号:另一种为外部方式,时钟信号由外部引入。
如果没有时钟电路来产生时钟驱动单片机,单片机是无法工作的。
单片机时钟电路是用来配合外部晶体实现振荡的电路,这样可以为单片机提供运行时钟,如果运行时钟为0 的话,单片机就不工作,当然超出单片机的工作频率的时钟也会导致单片机不工作。
3.3数码管显示器LED数码显示器是1种由LED发光二极管组合显示字符的显示器件。
它使用了8个LED 发光二极管,其中7个用于显示字符,1个用于显示小数点。
LED数码显示器有两种连接方法:(1)共阳极接法。
把发光二极管的阳极连在一起构成公共阳极,使用时公共阳极接+5V,每个发光二极管的阴极通过电阻与输入端相连。
当阴极端输入低电平时,段发光二极管就导通点亮,而输入高电平时则不点亮。
(2)共阴极接法。
把发光二极管的阴极连在一起构成公共阴极,使用时公共阴极接地。
每个发光二极管的阳极通过电阻与输入端相连。
当阳极端输入高电平时,段发光二极管就导通点亮,而输入低电平时则不点亮。
在本设计中所采用的是共阴极LED数码显示器,其引脚排列如图3.3所示:图3.33.474HC573锁存器74LS245是我们常用的芯片,用来驱动led或者其他的设备,他是8路同相三态双向总线收发器,可双向传输数据。
74LS245还具有双向三态功能,既可以输出,也可以输入数据。
当8051单片机的P0口总线负载达到或超过P0最大负载能力时,必须接入74LS245等总线驱动器。
当片选端/CE低电平有效时,DIR=“0”,信号由 B 向 A 传输;(接收)*DIR=“1”,信号由 A 向 B 传输;(发送)当/CE为高电平时,A、B均为高阻态。
在应用系统中,所有的系统扩展的外围芯片都需要总线驱动,本设计时钟芯片是系统扩展外围芯片,所以就需要总线驱动器,3.5DS1302时钟芯片1.简介DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒分时日日期.月年的信息,每月的天数和闰年的天数可自动调整时钟操作可通过AM/PM 指示决定采用24 或12 小时格式.DS1302 与单片机之间能简单地采用同步串行的方式进4.系统软件设计4.1程序设计思路总体程序主要有主程序,中断定时程序,数码管显示程序,按键扫描程序,74HC595的读写程序,数据更新程序,蜂鸣器程序。
先数码管显示(中断定时,当一秒时间到时,数码管加一),当总按键按下时,计时停止,执行按键扫描程序,等待调时按键的按下,当有按键按下时,进行相应的改变,再次按下总按键,继续显示时间。
特别再有按键按下时,蜂鸣器发声。
4.2主要程序(1)主函数void main(){show();write_ds1302(0x84,0x12); //初始化write_ds1302(0x82,0x00);write_ds1302(0x80,0x00);whil e (1){set_rtc();read_rtc();display();}(2)显示函数void display()//显示时间函数{unsigned int a=1;P2=0x01;P0=data_7seg[hour/16];d elay(a);P2=0x02;P0=data_7seg[hour%16];P0_7=0;delay(a);P2=0x04;P0=data_7seg[min/16];d elay(a);P2=0x08;P0=data_7seg[min%16];P0_7=0;delay(a);P2=0x10;P0=data_7seg[sec/16];d elay(a);P2=0x20;P0=data_7seg[sec%16];d elay(a);}4.3流程图5.调试及仿真软件运行效果和预期一致。
6.总结通过此次电子时钟的设计,我对单片机又进行了复习与巩固,在此过程中,也学到了新的知识,比如时钟芯片的应用。
关于这次课程设计,首先巩固一下课程理论,再一遍熟悉课程知识的构架,然后结合加以理论分析、总结,有了一个清晰的思路和一个完整的的软件流程图之后才着手设计。
在设计程序时,我们不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;养成注释程序的好习惯是非常必要的,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也能为资料的保存和交流提供了方便。
除了对此次设计的准备工作之外,我们还学到了很多平时难得的东西,首先是团队协作,在这次设计当中,难免和同学产生观点和意见的分歧,以及分工明细、时间安排等不合理,通过这次设计,我们体会到了团结合作的重要性及力量之强大,还有让我们处理事情更加有条理,思路更加清晰明了了,发现、提出、分析、解决问题和实践能力的提高都将受益于我在以后的学习、工作和生活中。
此次的设计,其实也是我们所学知识的一次综合运用,让我深深的认识到了学习单片机要有一定的基础,要有电子技术方面的数字电路和模拟电路等方面的理论基础,特别是数字电路;也要有编程语言的汇编语言或C语言。
要想成为单片机高手,我们首先要学好汇编语言,然后转入C语言学习,所以我们不能学到后面就忘了前面的知识,更应该将所学的知识紧紧的结合在一起,综合运用,所谓设计,就是要求创新,只有将知识综合运用起来才能真正的设计好。
7.致谢课程设计是培养我们工作能力的一个实践性的学习环节。
它不但是我们在大学学习中所学知识的一次综合复习与考查,同时也是理论联系实际的一个过程,为以后从事专业技术工作的一次准备。
通过此次课程设计,培养了我综合运用所学的基础理论课、技术基础课、专业课的知识和实践技能去分析和解决实际工作中的一般工程技术问题的能力,使我建立了正确的设计思想,学会了如何把平时所学的理论知识运用到实践当中去。
掌握了单片机的数字时钟设计的一般程序、规范和方法,并进一步巩固、扩大和深化了我所学的基本理论,基本知识和基本技能,提高了我设计计算、计算机制图、设计说明书、正确使用技术资料,标准手册等工具书的能力。
在课程设计的过程中,虽然本人在指导老师的帮助下对所设计的问题有初步的了解。
但由于本人缺少实际工作经验,遇到了一些设计和实际制作中的问题,受到同学和指导老师的指导与帮助,从而得到了全面的解决同时也受到各位老师优良工作作风的影响,培养了我严肃认真、一丝不苟和实事求是的工作作风,并树立了正确的生产观、经济观和全局观。
在设计中,由于个人能力有限,设计中漏洞和错误在所难免,敬请各位老师指正批评,以使我对自己的不足得到及时发现并修正。
通过此次毕业设计,希望能把所学的知识有机的联系起来,培养自己分析问题,解决问题的能力,为充实自己,并在未来工作岗位上好好工作打下坚实的基础。
在这里,向在这次课程设计中给予过帮助我的老师表示衷心的谢意。
8.附件源程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned intuchardata_7seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90 };uchar hour,min,sec;sbit shi=P1^0;sbit fen=P1^1;sbit miao=P1^2;sbit P1_3=P1^3;sbit rst=P1^4;sbit sck=P1^5;sbit io=P1^6;sbit fm=P1^7;sbit P0_7=P0^7;/*函数声明:*/void write_ds1302_byte(uchar dat);void write_ds1302(uchar add,uchar dat); uchar read_ds1302(uchar add);void read_rtc();void set_rtc();void display();void delay(int n);void show();void main(){show();write_ds1302(0x84,0x13); //初始化write_ds1302(0x82,0x00);write_ds1302(0x80,0x00);while (1){set_rtc();read_rtc();display();}}/*DS1302单字节写入:*/void write_ds1302_byte(uchar dat){uchar i;for (i=0;i<8;i++)sck=0;io=dat&0x01;dat=dat>>1;sck=1;}}/*DS1302多字节写入:*/void write_ds1302(uchar add,uchar dat) {rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);write_ds1302_byte(dat);rst=0;_nop_();io=1;sck=1;}/*DS1302读取:*/uchar read_ds1302(uchar add){uchar i,value;rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);for (i=0;i<8;i++){value=value>>1;sck=0;if (io) value=value|0x80;sck=1;rst=0;_nop_();sck=0;_nop_();sck=1;io=1;return value;}void set_rtc() //调整时间{if(P1_3==0){rst=0;//if (shi==0) delay(100);if (shi==0){hour=(hour>>4)*10+(hour&0x0f);hour++;if (hour==24) hour=0;hour=((hour/10)<<4)+(hour%10);write_ds1302(0x84,hour);}if (fen==0) delay(100);if (fen==0){min=(min>>4)*10+(min&0x0f);min++;if (min==60) min=0;min=((min/10)<<4)+(min%10);write_ds1302(0x82,min);}if (miao==0) delay(100);if (miao==0){sec=(sec>>4)*10+(sec&0x0f);sec++;if (sec==60) sec=0;sec=((sec/10)<<4)+(sec%10);write_ds1302(0x80,sec);}}}void read_rtc()//读取时间{hour=read_ds1302(0x85);min=read_ds1302(0x83);sec=read_ds1302(0x81);}void display()//显示时间函数{unsigned int a=1;P2=0x01;P0=data_7seg[hour/16];delay(a);P2=0x02;P0=data_7seg[hour%16];P0_7=0;delay(a);P2=0x04;P0=data_7seg[min/16];delay(a);P2=0x08;P0=data_7seg[min%16];P0_7=0;delay(a);P2=0x10;P0=data_7seg[sec/16];delay(a);P2=0x20;P0=data_7seg[sec%16];delay(a);}void delay(int n) //延时函数{unsigned int i,j;for(i=0;i<n;i++){for(j=0;j<121;j++){;}}}void show()//学号{unsigned int m;for(m=0;m<50;m++){uint a=10;P2=0x08;P0=data_7seg[2];delay(a);P2=0x10;P0=data_7seg[0];delay(a);P2=0x20;P0=data_7seg[4];delay(a);}}。