51单片机数字时钟

合集下载

基于51单片机的数码管时钟(带闹钟调时秒表)

基于51单片机的数码管时钟(带闹钟调时秒表)

基于51单片机的数码管时钟(带闹钟调时秒表)/**************************************************************** ************ ** *********************************************************** ** * * ** * * ** * 基于51单片机的数码管时钟程序* ** ** * * ** * * *********************************************************** ** ** ************************************************************ ****************/#include<stdio.h>#define uint unsigned int#define uchar unsigned charsbit dula=P2^6; //申明u1锁存器的锁存端sbit wela=P2^7; //申明u2锁存器的锁存端sbit key1=P3^0; //功能键sbit key2=P3^1;//增大键sbit key3=P3^2;//减小键sbit key4=P3^3;//秒表查看键sbit beep=P2^3;//蜂鸣端uchar num,num1,num2,numm;uchar numf,num,nums,num;uchar s,s1,f,f1,m,m1;uchar ns,ns1,nf,nf1;uchar numns,numnf;uchar dingshi;void display(uchar m,uchar m1,ucharf,uchar f1,uchar s,uchar s1);void display1(uchar nf,uchar nf1,uchar ns,uchar ns1);void key();void key1();void alram();void di();void delayms(xms);void T0_time() interrupt 1;void miaobiao();uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x77,0x7c,0x39,0x5e,0x79,0x71};/*********************************************************主函数void main()*********************************************************/int main(){TMOD=0X01;TH0=(65536-46080)/256;TL0=(65536-46080)%256;EA=1;ET0=1;TR0=1;nums=12;numf=0;num2=0;num=0;while(1){if(dingshi==0){keyscan();display(m,m1,f,f1,s,s1);alarm();}else{miaobiao();keyscan1();display1(nf,nf1,ns,ns1);}}return 0;}/********************************************************* 蜂鸣器函数di()*********************************************************/ void di(){beep=0;delayms(100);beep=1;}/********************************************************** 按键调时函数key()**********************************************************/ void keyscan(){if(key1==0){delayms(10);display(m,m1,f,f1,s,s1);}}}/********************************************** 按键设定闹钟函数keyscan1();***********************************************/ void keyscan1(){if(key1==0){delayms(10);if(key1==0){ numns++;if(numns==24);numns=0;while(!key1);di();display1(nf,nf1,ns,ns1);}}if(key2==0){delayms(10);if(key2==0){ numnf++;if(numnf==24);numnf=0;while(!key2);di();display1(nf,nf1,ns,ns1);}}if(key3==0){delayms(10);if(key3==0){dingshi=0;while(!key1);di();display1(nf,nf1,ns,ns1);}}}/********************************************************* 闹钟函数alram()*********************************************************/ void alram(){if((nums==numns)&&(numnf==numf))beep=0;}/*********************************************************秒表函数miaobiao()*********************************************************/ void miaobiao(){if(key4==0){delayms(100);if(key4==0){while(!key4);di();displaym(uchar m,uchar m1);}}}/********************************************************* 正常显示函数display()*********************************************************/ void display(uchar m,uchar m1,ucharf,uchar f1,uchar s,uchar s1){dula=1;P0=table[m1]//秒位第1位dula=0;PO=0xff;// 送入位选信号前关闭所有显示,防止打开位选锁存时wela=1;P0=0xef;wela=0;delayms(10);dula=1;P0=table[m]; //秒第2位dula=0;P0=0xff;wela=1;P0=0xdf;wela=0;delayms(100)dula=1;P0=table[f1]; //分第1位dula=0;P0=0xff;wela=1;P0=0xfb;wela=0;delayms(100)dula=1;P0=table[f]; //分第2位dula=0;P0=0xff;wela=1;P0=0xf7;wela=0;delayms(10)dula=1;P0=table[s1]; //时第1位dula=0;P0=0xff;wela=1;P0=0xfe;wela=0;delayms(100)dula=1;P0=table[s]; //时第2位dula=0;P0=0xff;wela=1;P0=0xfd;wela=0;delayms(10)}/********************************************************** ***调时闹钟显示函数display1()*********************************************************** **/void display1(uchar nf,uchar nf1,uchar ns,uchar ns1){nf1=numnf/10;nf=numnf%10;ns1=nums/10;ns=nums%10;dula=1;P0=table[nf1];//分第1位dula=0;P0=0xff;wela=1;P0=0xfb;//待改参数wela=0;delayms(10);dula=1;P0=table[nf];//分第2位dula=0;P0=0xff;wela=1;P0=0xf7;//待改参数wela=0;delayms(10);P0=table[ns1];//时第1位dula=0;P0=0xff;wela=1;P0=0xfe;//待改参数wela=0;delayms(10);dula=1;P0=table[ns];//时第2位dula=0;P0=0xfd;wela=1;P0=0xff;//待改参数wela=0;delayms(10);}/********************************************************** ***秒表显示函数displaym()*********************************************************** **/void displaym(uchar m,uchar m1){dula=1;P0=table[m1];//秒位第一位P0=0xff;wela=1;P0=0Xbf;wela=0;delayms(10);dula=1;P0=table[m];dula=0;P0=0xff;wela=1;P0=0X7f;wela=0;delayms(10);}/**************************************************** 中断服务函数void T0_time() interrupt 1****************************************************/ void T0_time() interrupt 1{TH0=(65536-45872)/256; //46080TL0=(65536-45872)%256;num2++;if(num2==20){num++;num2=0;m=num%10;m1=num/10;f=numf%10;f1=numf/10;s=nums%10;s1=nums/10;if(num==59){num=0;numf++;if(numf==59){numf=0;nums++;}if(nums==24)nums=0;}}}/*************************************************** 延时函数delayms()***************************************************/ void delayms(xms){uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--); }。

基于C51单片机的数字时钟课程设计(C语言,带闹钟).

基于C51单片机的数字时钟课程设计(C语言,带闹钟).

单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词:电子钟 AT89C52 硬件设计软件设计目录一、数字电子钟设计任务、功能要求说明及方案介绍 (4)1.1 设计课题设计任务 (4)1.2 设计课题的功能要求说明 (4)1.3 设计课的设计总体方案介绍及工作原理说明 (4)二、设计课题的硬件系统的设计 (5)2.1硬件系统各模块功能简要介绍 (5)2.1.1 AT89C52简介 (5)2.1.2 按键电路 (6)三、设计课题的软件系统的设计 (6)3.1 使用单片机资源的情况 (6)3.2 软件系统个模块功能简要介绍 (7)3.3 软件系统程序流程框图 (7)3.4 软件系统程序清单 (7)四、设计课题的设计结论、仿真结果、误差分析 (9)4.1 设计结论及使用说明 (9)4.2 仿真结果 (10)结束语 (12)参考文献 (12)附录 (13)附录A:程序清单 (13)一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。

具有时间显示,并有时间设定,时间调整功能。

1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。

基于51单片机的多功能电子钟设计

基于51单片机的多功能电子钟设计

基于51单片机的多功能电子钟设计1. 本文概述随着现代科技的发展,电子时钟已成为日常生活中不可或缺的一部分。

本文旨在介绍一种基于51单片机的多功能电子钟的设计与实现。

51单片机因其结构简单、成本低廉、易于编程等特点,在工业控制和教学实验中得到了广泛应用。

本文将重点阐述如何利用51单片机的这些特性来设计和实现一个具有基本时间显示、闹钟设定、温度显示等功能的电子钟。

本文的结构安排如下:将详细介绍51单片机的基本原理和特点,为后续的设计提供理论基础。

接着,将分析电子钟的功能需求,包括时间显示、闹钟设定、温度显示等,并基于这些需求进行系统设计。

将详细讨论电子钟的硬件设计,包括51单片机的选型、时钟电路、显示电路、温度传感器电路等。

软件设计部分将介绍如何通过编程实现电子钟的各项功能,包括时间管理、闹钟控制、温度读取等。

本文将通过实验验证所设计的电子钟的功能和性能,并对实验结果进行分析讨论。

通过本文的研究,旨在为电子钟的设计提供一种实用、经济、可靠的方法,同时也为51单片机的应用提供一个新的实践案例。

2. 51单片机概述51单片机,作为一种经典的微控制器,因其高性能、低功耗和易编程的特性而被广泛应用于工业控制、智能仪器和家用电器等领域。

它基于Intel 8051微处理器的架构,具备基本的算术逻辑单元(ALU)、程序计数器(PC)、累加器(ACC)和寄存器组等核心部件。

51单片机的核心是其8位CPU,能够处理8位数据和执行相应的指令集。

51单片机的内部结构主要包括中央处理单元(CPU)、存储器、定时器计数器、并行IO口、串行通信口等。

其存储器分为程序存储器(ROM)和数据存储器(RAM)。

程序存储器通常用于存放程序代码,而数据存储器则用于存放运行中的数据和临时变量。

51单片机还包含特殊功能寄存器(SFR),用于控制IO端口、定时器计数器和串行通信等。

51单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计

51单片机数码管时钟电路的设计设计一个51单片机数码管时钟电路,让我们开始吧。

一、设计思路该数码管时钟电路的设计主要包括以下几个方面:1.使用DS1302时钟芯片获取真实时间;2.使用I2C总线方式将DS1302时钟芯片与51单片机连接;3.使用74HC595芯片驱动数码管显示;4.使用按键控制时钟的设置和调节;5.使用蜂鸣器发出报警声;6.使用LED指示灯显示时钟状态。

二、硬件设计部分数码管显示部分:1.使用4位共阳数码管作为时分显示器,使用1位共阳数码管作为秒显示器;2.使用8片74HC595芯片级联起来,将时分秒数据传输到数码管显示;3.设置共阳数码管的通阳管为P0口,设置74HC595的DS(串行数据输入)、SH(上升沿锁存)、STCP(74HC595的8位锁存输出)引脚接到P1.2、P1.3、P1.4端口;4.设置8个控制引脚接到P1.5~P1.12端口。

实时时钟部分:1.使用DS1302时钟芯片连接到P2.0、P2.1、P2.2、P2.3、P2.4、P2.5、P2.6、P2.7端口;2.设置时钟复位引脚接到P0.1端口,时钟传输使能引脚接到P0.2端口。

按键输入部分:1.设置按键S1接到P3.2端口,按键S2接到P3.3端口;2.设置按键的上拉电阻,使其处于高电平状态;3.设置按键的下降沿触发外部中断,以便检测按键的按下事件。

其他部分:1.设置蜂鸣器接到P0.0端口,并使用普通电阻限流;2.设置LED指示灯接到P0.7端口。

三、软件设计部分1.初始化函数:初始化P0、P1、P2、P3口的状态;2.DS1302驱动函数:包括初始化DS1302芯片和读写DS1302寄存器的函数;3.74HC595驱动函数:包括初始化74HC595芯片,以及向74HC595芯片发送8位数据的函数;4.数码管显示函数:将时分秒数据按位转换为对应的数字和状态,并调用74HC595驱动函数显示;5.按键检测函数:检测按键的按下事件,并根据按键事件的不同触发不同的操作;6.报警函数:当设定时间到达时,将触发报警声,并控制LED灯闪烁;7.主函数:循环读取DS1302时间,并更新数码管显示,检测按键事件,触发报警。

51单片机数字钟设计

51单片机数字钟设计

51单片机数字钟设计是一种常用的电子设计,它使用51单片机作为控制核心,通过数码管显示时间。

以下是一个简单的51单片机数字钟设计步骤:
1. 硬件设计
首先,需要选择一个合适的51单片机型号,如AT89C51、AT89S52等。

然后,需要选择数码管显示模块,可以选择多个数码管显示小时、分钟和秒。

同时,还需要选择适当的电源模块为数码管和单片机提供电源。

2. 软件设计
在软件设计方面,需要编写程序来控制数码管的显示,并实现时间的计数和更新。

可以使用定时器中断来实现时间的计数和更新。

同时,还需要编写程序来读取按键输入,以便用户可以调整时间。

3. 调试
在完成硬件和软件设计后,需要进行调试。

首先,需要检查硬件连接是否正确,然后通过调试程序来检查数码管的显示是否正确,以及时间计数和更新是否正常。

以上是一个简单的51单片机数字钟设计步骤,实际的设计可能需要根据具体需求进行修改和调整。

基于51单片机的数字钟设计

基于51单片机的数字钟设计

基于51单片机的数字钟设计目录1 作品的背景与意义 12 功能指标设计 13 作品方案设计 13.1总体方案的选择 13.1.1方案一:基于单片机的数字钟设计 23.1.1方案二:基于数电实验的数字钟设计 33.1.2两种方案的比较......... (3)3.2控制方案比较 33.3显示方案比较 33.4单片机理论知识介绍 43.4.1单片机型号........ (5)3.4.2硬件电路平台.............. (6)3.4.3内部时钟电路........... . (7)3.4.4复位电路............. . (7)3.4.5按键部分............ (8)4 硬件设计94.1显示模块电路图95 软件设计115.1主程序流程图115.2中断服务以及显示 126 系统测试136.1测试环境136.2测试步骤136.2.1硬件测试6.2.2软件测试1.连接单片机和计算机串接............ ..136.2.3实施过程............. .. (14)6.3测试结果187 实验总结................ . (18)7.1代码编写过程中出现问题........... .. (18)7.2整个实验过程的体会................. . (19)7.3实验误差分析。

19参考文献20附录1 系统电路图21附录2 系统软件代码21附录3 系统器件清单261 作品的背景与意义数字钟是采用数字电路实现对.时,分,秒。

数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表, 而且大大地扩展了钟表原先的报时功能。

基于单片机的数字钟具有功能强,体积小,功耗低,价格便宜,工作可靠,使用方便等特点,因此特别适合于与控制有关的系统,越来越广泛地应用于自动控制,智能化仪器,仪表,数据采集,军工产品以及家用电器等各个领域,生活中诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烘箱、通断动力设备、甚至各种定时电气的自动启用等也可广泛应用,单片机往往是作为一个核心部件来使用,在根据具体硬件结构,以及针对具体应用对象特点的软件结合,以作完善。

基于51单片机的数字电子时钟设计

基于51单片机的数字电子时钟设计

课程设计任务书摘要数字钟因其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,因此得到了广泛的使用。

单片机为基础上设计出来的数字时钟数字钟,在日常生活中最常见,应用也最广泛。

本次课程设计的时钟就是以STC89C52单片机为核心,配备LED显示模块、时钟模块、等功能模块的数字电子钟。

采用24小时制方式显示时间。

文章主要从硬件设计和软件编程两个大的方面。

硬件电路设计主要包括中央处理模块、时钟模块,显示模块等几部分。

时钟电路采用DS1302芯片,并选用LED显示器。

软件方面用keil C语言来实现。

软硬件配合,达到电子时钟精准的显示。

关键字:单片机,时钟模块,精准目录1绪论 (2)1.1设计概述 (2)1.2技术简述 (2)1.3本课题的背景 (3)1.4本课题的意义 (3)2系统设计 (4)2.1设计目的 (4)2.2设计功能及要求 (4)2.3设计思路 (4)2.4硬件方案 (4)2.4.1时钟芯片的选择 (5)2.4.2显示屏的选择 (5)2.4.3单片机的选择 (5)2.5软件方案 (5)2.6整体方案 (6)2.7元器件清单 (6)3硬件设计 (7)3.1单片机最小系统 (7)3.1.1时钟电路 (7)3.1.2复位电路 (8)3.2时钟电路 (8)3.3电源电路 (9)3.4系统整体电路 (9)3.5系统仿真 (10)3.6硬件制作 (10)4软件设计 (11)4.1程序设计步骤 (11)4.2系统主程序 (11)4.3时钟模块子程序 (12)4.4显示模块子程序 (12)4.5主程序 (13)5联机调试 (14)6总结 (15)7参考文献 (16)1绪论1.1设计概述在单片机技术日趋成熟的今天,其灵活的硬件电路和软件程序的设计,使单片机得到广泛的应用,从小的电子产品,到大的工业控制,单片机都起到了举足轻重的作用。

数字电子时钟是基于单片机和DS1302时钟芯片的一种计时工具。

利用51单片机制作六位的电子数字钟

利用51单片机制作六位的电子数字钟

利用51单片机制作六位的电子数字钟关键字:电子钟,数字钟,51单片机摘要:对于学习单片机而言这个程序是一道门槛,掌握了电子钟程序,基本上51单片机就掌握了80%。

常见的电子钟程序由显示部分,计算部分,时钟调整部分构成,这样程序就有了一定的长度和难度。

时钟的基本显示原理:时钟开始显示为0时0分0秒,也就是数码管显示000000,然后每秒秒位加1 ,到9后,10秒位加1,秒位回0。

10秒位到5后,即59秒,分钟加1,10秒位回0。

依次类推,时钟最大的显示值为23小时59分59秒。

这里只要确定了1秒的定时时间,其他位均以此为基准往上累加。

开始程序定义了秒,十秒,分,十分,小时,十小时,共6位的寄存器,分别存在30h,31h,32h,33h,34h,35h单元,便于程序以后调用和理解。

电路原理图:为了节省硬件资源,电路部分采用6位共阳极动态扫描数码管,数码管的段位并联接在51单片机的p0口,控制位分别由6个2N5401的PNP三极管作驱动接在单片机的p2.1,p2.2,p2.3,p2.4,p2.5,p2.6口。

从标号star开始把这些位全部清除为0,从而保证了开始时显示时间为0时0分0秒。

然后是程序的计算部分:inc a_bit(秒位),这里用到了一个inc指令,意思是加1,程序运行到这里自动加1。

然后把加1后的数据送acc:mov a,a_bit (秒位),这时出现了一个问题,如果不断往上加数字不会加爆?所以有了下面的一句话cjne a,#10,stlop; 如果秒位到10那么转到10秒处理程序。

cjne是比较的意思,比较如果a等于10 就转移到10秒处理程序,实际上也就限定了在这里a的值最大只能为9,同时mov a_bit,#00h,这时a_bit(秒位)被强行清空为0,又开始下一轮的计数。

秒位处理完了到下面10秒的处理程序:inc b_bit,把10秒位b_bit加1,由于程序开始对各位的寄存器已经清0,这时10秒位就变成1 ,然后同样送到累加器ACC:mov a,b_bit 现在开始新一轮的10秒位计数cjne a,#6,stlop 如果10秒到了6那么到分位处理程序。

基于51单片机的数字时钟设计_毕业设计

基于51单片机的数字时钟设计_毕业设计

基于51单片机的数字时钟设计目录摘要 (1)Abstract (2)第一章绪论 (3)1.1 数字时钟设计的背景 (3)第二章AT89C51单片机简介 (3)2.1 单片机介绍 (3)2.2 单片机的应用特点 (4)2.3 单片机的应用领域 (4)2.4 单片机的中断与定时系统 (4)2.4.1 MCS-51单片机中断系统 (4)2.4.2 MCS-51 单片机的定时器/计数器 (6)2.4.3 MCS-51定时器/计数器的四种工作方式 (6)2.5 AT89C51引脚功能介绍 (7)第三章设计方案 (8)3.1 主程序 (8)3.2 数码管显示模块 (9)3.3 定时器计数器T0中断服务程序 (9)3.4按键处理模块 (10)第四章硬件电路设计 (10)4.1 复位电路 (10)4.2 时钟电路 (11)4.3 按键电路 (12)4.4 数码管显示电路 (13)4.5 电源电路设计 (13)第五章软件设计与程序代码 (14)5.1 软件选择与介绍 (14)5.1.1 软件介绍 (14)5.1.2 Proteus7.8的特点 (15)5.2 软件仿真电路全图 (15)5.3 源程序代码 (16)第六章结论 (20)参考文献 (21)致谢 (22)摘要近几年,单片机在各个领域得到广泛的应用。

从工业到人们的日常生活,大部分的科技产品都是通过单片机来控制。

在它问世之前,自动控制设备得不到广泛的应用,这是因为控制设备的体积庞大,耗电量大,价格昂贵。

在第一台微处理器成功研制不久,第一个单片机就问世了。

因为其小巧的体积,低功耗,以及高效的性能,单片机受到了大家的欢迎。

本设计利用Atmel公司的AT89C52单片机对电子时钟进行开发,设计了实现所需功能的硬件电路,应用C语言进行软件编程,并用Proteus软件进行演示、验证。

主要介绍用单片机内部的定时/计数器来实现电子时钟的方法,本设计由单片机80C51芯片和LED数码管为核心,辅以必要的电路,构成了一个单片机的数字电子时钟。

基于C51单片机的数字时钟课程设计(C语言带闹钟)

基于C51单片机的数字时钟课程设计(C语言带闹钟)

单片机技术课程设计数字电子钟学院:班级:姓名:学号:教师:摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。

所以设计一个简易数字电子钟很有必要。

本电子钟采用AT89C52单片机为核心,使用12MHz 晶振与单片机AT89C52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。

该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEY5键,进行相应的操作就可实现校时、定时、复位功能。

具有时间显示、整点报时、校正等功能。

走时准确、显示直观、运行稳定等优点。

具有极高的推广应用价值。

关键词:电子钟 AT89C52 硬件设计软件设计目录NO TABLE OF CONTENTS ENTRIES FOUND.一、数字电子钟设计任务、功能要求说明及方案介绍1.1 设计课题设计任务设计一个具有特定功能的电子钟。

具有时间显示,并有时间设定,时间调整功能。

1.2 设计课题的功能要求说明设计一个具有特定功能的电子钟。

该电子钟上电或按键复位后能自动显示系统提示符“d.1004-22”,进入时钟准备状态;第一次按电子钟启动/调整键,电子钟从12时59分0秒开始运行,进入时钟运行状态;按电子钟S5键,则电子钟进入时钟调整状态,此时可利用各调整键调整时间,调整结束后可按S5键再次进入时钟运行状态。

1.3 设计课的设计总体方案介绍及工作原理说明本电子钟主要由单片机、键盘、显示接口电路和复位电路构成,设计课题的总体方案如图1所示:图1-1总体设计方案图本电子钟的所有的软件、参数均存放在AT89C52的Flash ROM和内部RAM 中,减少了芯片的使用数量简化了整体电路也降低了整机的工作电流。

键盘采用动态扫描方式。

利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据,同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。

基于51单片机多功能数字时钟任务书

基于51单片机多功能数字时钟任务书
教研室(学科组)主任签字:
第八~九周
第十周
收集资料并对课题做深入的了解,撰写开题报告;
学习单片机AT89S52、时钟芯片DS1302的相关知识;
完成基于AT89S52和DS1302设计的研究总体方案设计;
完成系统软件各模块设计,并且购买元器件;
对电路板进行焊接,仿真和烧写,并进行整体调试;
翻译资料,并撰写毕业设计论文;
修改毕业论文,为毕业论文答辩作准备。
毕业设计任务书
题目
(包括副标题)
电子万年历设计与制作
教师姓名
XXX
职称
XXX
系别
XXX
学生姓名
XXX
学号
XXX
班级
XXX
成果形式
A论文B设计说明书C实物D软件E作品
■□■□□
任务下达时间
2006年11月
1.毕业设计课题任务的内容和要求:
1、毕业设计的主要内容:
1)设计并制作电子万年历
2)完成相关的技术文档和毕业设计论文பைடு நூலகம்
2、毕业设计的主要技术指标
1)显示阳历年、月、日、时、分、秒、星期及阴历年、月、日,能标明是否闰月
2) 用液晶进行显示,用按键进行调整
3) 实现闹铃功能
3、毕业设计的基本要求:
1)完成电子系统的方案设计,技术调试,硬件实现
2.毕业设计工作进度计划:
周 次
工作内容
早进入阶段
第一周
第二周
第三~五周
第六~七周

51单片机电子时钟

51单片机电子时钟

一,总体方案设计数字钟是一个将“ 时”,“分”,“秒”显示于人的视觉器官的计时装置。

它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和一些显示星期、报时、停电查看时间等附加功能。

因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”,“星期”计数器、校时电路、报时电路和振荡器组成。

干电路系统由秒信号发生器、“时、分、秒、星期”计数器、译码器及显示器、校时电路、整点报时电路组成。

秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。

将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。

“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。

“时计数器”采用24进制计时器,可实现对一天24小时的累计。

每累计24小时,发出一个“星期脉冲”信号,该信号将被送到“星期计数器”,“星期计数器” 采用7进制计时器,可实现对一周7天的累计。

译码显示电路将“时”、“分”、“秒”、“星期”计数器的输出状态送到七段显示译码器译码,通过七位LED七段显示器显示出来。

整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。

校时电路时用来对“时”、“分”、“秒”、“星期”显示数字进行校对调整的。

但是基于我们是初学者,我们只做一些比较简单的设计,可以显示时分秒,可以计时,还有闹钟提示,还加上温度的测量,即焊接上温度传感器18DS120在P1口进行温度的测量。

数字电子钟主体电路应由以下几部分组成:通过分频器产生标准秒信号;60进制分秒计数器以及24小时计数器;分、时的译码显示部分;校时电路。

(电子钟的总体电路)二,单元模块设计1)晶体振荡器电路晶体振荡器电路给数字钟提供一个频率稳定准确的32768Hz 的方波信号,此外还有一校正电容可以对温度进行补偿,以提高频率准确度和稳定度,使稳定度优于10-4,可保证数字钟的走时准确及稳定。

基于51单片机的数字时钟设计

基于51单片机的数字时钟设计

一设计要求及方案证 (1)二系统基本方案选择和论证 (2)2.1单片机芯片的选择方案和论证 (2)2.2显示模块选择方案和论证 (3)2.3时钟芯片的选择方案和论证 (4)三系统的硬件设计和实现 (5)3.1电路设计框图 (5)3・2主要单元电路的设计 (5)3.2. 1晶体振荡电路 (5)3. 2.2分频器电路 (6)3. 2.3时间计数器电路 (6)3. 2.4内部时钟电路 (6)3. 2. 5复位电路 (7)3. 2.6按键部分 (8)3. 2.7声光报警电路 (8)四、电路原理分析 (9)4・1显示原理 (9)4.2键盘及读数原理 (9)4.3连击功能的实现 (9)五、程序设计思想和相关指令介绍 (9)5.1数据和代码转换 (9)5・2计时功能的实现和中断服务程序 (10)5.3时间控制功能和比较指令...................................10六、系统的软件设计................................................106.1主程序部分 (11)6.2计时显示中断子程序部分 (13)6. 3调时功能流程图 (14)6. 4程序.....................................................15七设计心得........................................................24一设计要求及方案证设计制作和调试一个由8051MCU单片机组成的数字时钟系统。

通过这个过程学习熟悉键盘控制和七段数码管得使用,掌握 51系列单片机控制和测试的方法。

设计以89S51单片机为核心,以 LED为显示方式的万年历时钟显示,完成基本要求。

1)数码管显示:年月日时分秒。

2)键盘输入修改时间、日期设置。

系统基本方案选择和论证2. 1单片机芯片的选择方案和论证方案采用89C51芯片作为硬件核心,其内部采用Flash ROM,具有 4KB ROM存储空间,能于3V的超低压工作,但运用于电路设计中时由于不具备ISP在线编程技术,烧入程序时需要专门的C编程器(当前可用的实验烧写开发板只支持具有 ISP在线编程功能的AT89S**系列的芯片),当在对电路进行调试时,更显麻烦,并且增加了造价,采用89S51芯片作为主控模块,AT89S51是MCS-51系列单片机目前运用较多的一种芯片,采用Flash ROM,内部具有4KB ROM 存储空间,能于3V的超低压工作,而且具备ISP在线编程技术,方便对电路进行调试•但由于程序的错误修改或对程序的新增功能需要烧入程序时,对芯片的多次拔插会对芯片造成一定的损坏。

(完整word版)51单片机数字钟

(完整word版)51单片机数字钟

目录1 设计任务与要求 (I)2 设计方案 (1)3 硬件设计 (2)3.1 AT89C51单片机简介 2 3.2单片机型号的选择 (6)3.3数码管显示工作原理 (6)4 软件设计 (7)4.1主程序模块介绍 (7)4.2主程序 (7)5 仿真调试 ......................................... 错误!未定义书签。

5.1K EIL仿真结果.................................. 错误!未定义书签。

5.2仿真结果分析 (13)6 小结 ............................................. 错误!未定义书签。

1 设计任务与要求1. 设计一个基于单片机的电子时钟,并且能够实现时分秒的现实和调节。

2. 设计出硬件电路。

3. 设计出软件编程方法,并写出源代码。

4. 用PROTEUS进行仿真。

5.用汇方式实现目的。

7.系统的各各功能模块要编语言编实现程序设计。

6.利用查表,中断等清楚,有序。

8.程序运行时有友好的用户界面。

2 设计方案本设计主要设计了一个基于AT89C51单片机的电子时钟。

并在数码管上显示相应的时间。

并通过一个控制键用来实现时间的调节和是否进入省电模式的转换。

应用Proteus的ISIS软件实现了单片机电子时钟系统的设计与仿真。

该方法仿真效果真实、准确,节省了硬件资源。

该设计的硬件部分主要包括89C51多功能接口芯片用于开发电子时钟芯片、LED七段数码显示器用于显示时间、8031集成定时器用于定时、0.125W、8欧姆的扬声器用于定时发声。

软件部分包括主程序、定时计数中断程序、时间调整程序、延时程序四大模块。

通过中断程序进行定时器计数,时间调整程序是当键按下时间小于1秒,关闭显示(省电)进入调节时间状态,延时程序用于时间的延迟。

先设计个秒钟程序,在秒钟程序中先不设计按钮,直接通电运行,使用40H 存放计数值,从00—59,一直循环,把40H中的数值拆分成个位和十位,分别存在30H与31H中,要求动态扫描时,使用21H当标志位,用指令JB控制显示个位与十位,程序中使用中间寄存器R0与R1用于存放拆分后的字型,再传到30H与31H中去,再设计时钟程序。

基于C51单片机的数字可调时钟

基于C51单片机的数字可调时钟

河南机电高等专科学校《C51程序设计》大作业设计题目:数字可调时钟班级:通技091学号:090413128姓名:成绩:2011年11月1 设计任务制作数字可调时钟,要求可以分开调节分、时、年、月、日,能够显示温度。

2电路原理图以下为protel99se画的的原理图3 系统流程图数字可调时钟分以下四个部分构成:显示部分:此次显示采用了动态扫描显示,采用74ls573进行数据锁存。

温度采集:温度采集采用了18b20采集的,18b20转化温度较快,精度高。

时钟:采用普通的ds1302芯片。

数据运算:单片机用普通的8051单片机(12M晶振)。

4 源程序/*******************************数字可调时钟*********************************/ /*******************************by:lhc****************************************/ #include<reg51.h> #define DataPort P0void delayms(unsigned char i); sbit DQ=P1^3; sbit sclk=P1^4;sbit date=P1^5; sbit rst=P1^6;sbit LATCH1=P2^2;//定义锁存使能端口 段锁存 sbit LATCH2=P2^3;// 位锁存unsigned char time[8]={20,11,11,27,11,30,00,7}; //年 月日 时 分 秒 周 unsigned char time1[8],readtemflag;unsigned char code DuanMa[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};// 显示段码值0~9unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码unsigned char code pingnian[13]={ 0,31,28,31,30,31,30,31,31,30,31,30,31};//平年的月份天数 unsigned char code yunnian[13]= { 0,31,29,31,30,31,30,31,31,30,31,30,31};//闰年的月份天数 unsigned char TempData[8]; //存储显示值的全局变量 void delay(unsigned char i) {while(--i); //us 延时函数}void delayms(unsigned char i) //ms 延时函数 {while(i--) { delay(245); delay(245); } }bit rest(void)//18b20重启函数{ bit k=0; DQ=1; delay(5); DQ=0; delay(150); delay(200); DQ=1; delay(40); k =DQ; delay(25); r eturn(k); }unsigned char read()//18b20读数据函数{ unsigned char i=0; unsigned char dat=0;for(i=0;i<8;i++) {DQ=0; dat>>=1; DQ=1;if(DQ) dat|=0x80; delay(25); }return (dat);}void write(unsigned char dat)//18b20写数据函数{unsigned char i=0; for(i=0;i<8;i++){ DQ = 0; DQ = dat&0x01; delay(25); DQ = 1; dat>>=1;} delay(25);}unsigned int ReadTemperature(void) //读取温度函数{ unsigned char a=0; unsigned int kk=0,b=0;LOOP:if(rest()==0){ write(0xCC); //跳过ROM w rite(0x44); //初始化温度转换delayms(20); rest();TH1=0XFa; TL1=0Xff; write(0xCC); write(0xBE); //读取温度a=read(); b=read(); b<<=8; kk=a+b; return(kk);} else goto LOOP;}void restds1302(void){sclk=0; rst=0; //ds1302重启 }void writebyte(unsigned char addr,unsigned char byte) //写入ds1302一个字节数据{ unsigned char i;rst=1;addr=addr&0xfe;for(i=0;i<8;i++){ date=addr&0x01; sclk=1; sclk=0; addr>>=1;}for(i=0;i<8;i++){ date=byte&0x01; sclk=1; sclk=0; byte>>=1;}rst=0;}unsigned char readbyte(unsigned char addr) //读取一个字节的数据{ unsigned char i,temp;rst=1; addr=addr|0x01;for(i=0;i<8;i++) //读函数{ date=addr&0x01;sclk=1; sclk=0;addr=addr>>1;}for(i=0;i<8;i++){temp=temp>>1;if(date) temp|=0x80;else temp&=0x7f; sclk=1; sclk=0;}rst=0;return temp;}void writetime(void) //调时函数{unsigned char i,tmp;for(i=0;i<8;i++){ //BCD处理tmp=time[i]/10;time1[i]=time[i]%10;time1[i]=time1[i]+tmp*16;}writebyte(0x8e,0x00);//关闭写保护writebyte(0x80,0x80);// 暂停writebyte(0x8c,time1[1]);// 年写入writebyte(0x88,time1[2]);//月写入writebyte(0x86,time1[3]);// 日写入//些时间writebyte(0x84,time1[4]);// 时写入writebyte(0x82,time1[5]);// 分写入writebyte(0x80,time1[6]);// 秒写入writebyte(0x8a,time1[7]);// 周写入//writebyte(0x80,0x00);// 秒写入writebyte(0x8e,0x80);//打开写保护}void readtime(void) //读取时间函数{ unsigned char i,tmp;time1[1]=readbyte(0x8d);// 年读time1[2]=readbyte(0x89);// 月读time1[3]=readbyte(0x87);// 日读// 读时间time1[4]=readbyte(0x85);// 时time1[5]=readbyte(0x83);// 分time1[6]=readbyte(0x81);// 秒time1[7]=readbyte(0x8b);// 周for(i=0;i<8;i++) //BCD处理{ tmp=time1[i]/16;time[i]=time1[i]%16;time[i]=time[i]+tmp*10;}}void Display(unsigned char FirstBit,unsigned char Num) //动态显示函数{ static unsigned char i=0;DataPort=0; //清空数据,防止有交替重影LATCH1=1; //段锁存LATCH1=0;DataPort=WeiMa[i+FirstBit]; //取位码LATCH2=1; //位锁存LATCH2=0;DataPort=TempData[i]; //取显示数据,段码LATCH1=1; //段锁存LATCH1=0; i++;if(i==Num) i=0;}unsigned char key(void) //键盘读取函数{ unsigned char i;if(P3!=0xff){ delay(10); if(P3!=0xff){ i=P3; while(P3!=0xff) ;switch(i){case 0xfe:return 1;break;case 0xfd:return 2;break;case 0xfb:return 3;break;default:return 0;break;}}}return 0;}void T1_rest() //定时器1的初始化函数{TMOD|=0X10;TH1=0XF8;TL1=0X30;EA=1 ;ET1= 1;TR1=1;}void isr0(void) interrupt 3{static unsigned char qq;TR1=0; TH1=0XF8; TL1=0X30;Display(0,8); //送去显示qq++;if(qq==200){ qq=0,readtemflag=1; } TR1=1; }void main(){unsigned char bian=0,k=0;unsigned char num=6;unsigned int h,l,tempp,year;bit nianflag; restds1302(); writetime(); T1_rest();while(1){readtime(); year=time[1]*200;if(year%4==0&&year%100!=0||year%400==0) nianflag=1;else nianflag=0; k=key();if(k!=0){ if(k==1){ bian++;num=6; k=0; }//调节显示的内容if(bian==3) bian=0;if(k==2){ num--;if(num<4) bian=1;if(num>3) bian=0; //选着调节对象分,时,年月日if(num==0) num=6; k=0;}if(k==4&&num!=6) //调节对象(分时年月日)加一{ time[num]++;if(num==5&&time[num]==60) time[num]=0;if(num==4&&time[num]==24) time[num]=0;if(num==3&&nianflag){if(time[3]>yunnian[time[2]]) time[3]=1;}else if(num==3){ if(time[3]>pingnian[time[2]])time[3]=1;}if(num==2&&time[num]==13) time[num]=1;if(num==1&&time[num]==99) time[num]=0; k=0;}if(k==3&&num!=6) //调节对象(分时年月日)减一{ time[num]--;if(time[num]==-1&&num==5) time[num]=59;if(time[num]==-1&&num==4) time[num]=23;if(num==3&&nianflag){ if(time[3]==0) time[3]=yunnian[time[2]]; }else if(num==3){ if(time[3]==0) time[3]=pingnian[time[2]]; }if(time[num]==0&&num==2) time[num]=12;if(time[num]==-1&&num==1) time[num]=99; k=0;}if(nianflag){ if(time[3]>yunnian[time[2]]) time[3]=1;}else { if(time[3]>pingnian[time[2]]) time[3]=1; }writetime();}if(bian==0) //对时,分,秒,显示数据分离处理{TempData[0]=DuanMa[time[4]/10];TempData[1]=DuanMa[time[4]%10];TempData[2]=0x40; //加入"-"TempData[3]=DuanMa[time[5]/10];//分TempData[4]=DuanMa[time[5]%10];TempData[5]=0x40;TempData[6]=DuanMa[time[6]/10];//秒TempData[7]=DuanMa[time[6]%10];if(num!=6){ delayms(30);if(num==4){ TempData[0]=0; TempData[1]=0; delayms(30); }if(num==5){ TempData[3]=0; TempData[4]=0; delayms(30); }}}else if(bian==1) //对年月日的显示数据分离处理{ TempData[0]=DuanMa[time[1]/10]; TempData[1]=DuanMa[time[1]%10];TempData[2]=0x40;//加入"-"TempData[3]=DuanMa[time[2]/10];//月TempData[4]=DuanMa[time[2]%10];TempData[5]=0x40;TempData[6]=DuanMa[time[3]/10];//日TempData[7]=DuanMa[time[3]%10];if(num!=6){ delayms(30);if(num==1){ TempData[0]=0;TempData[1]=0;delayms(30); }if(num==2){ TempData[3]=0;TempData[4]=0;delayms(30); }if(num==3){ TempData[6]=0;TempData[7]=0;delayms(30); }}}else if(bian==2) //对温度和星期的显示数据分离处理{if( readtemflag==1){ tempp=ReadTemperature();readtemflag=0;}if(tempp&0x8000){ TempData[0]=0x40;//负号标志tempp=~tempp; tempp +=1;}elseTempData[0]=0;h=tempp>>4; l=tempp&0x0F; l=l*6/10;//小数近TempData[1]=DuanMa[(h%100)/10]; //十位温度TempData[2]=DuanMa[(h%100)%10]|0x80; //个位温度,带小数点TempData[3]=DuanMa[l];TempData[4]=0x39; TempData[5]=0;TempData[6]=DuanMa[time[7]/10];TempData[7]=DuanMa[time[7]%10];}}}参考文献【1】Brian W.Kernighan,Dennis M.Ritchie.C.程序设计语言.机械工业出版社,机械工业出版社,2004.1.【2】祁伟,杨婷.单片机C51程序设计教程与实验,北京航空航天大学出版社,2006.1. 【3】梅丽凤,郝万新.单片机原理及应用,清华大学出版社,2009.7.【4】18B20数据手册.【5】DS1302数据手册.。

51单片机电子时钟(C语言)

51单片机电子时钟(C语言)

#include <reg51.h>#include <intrins.h>#define uchar unsigned char //宏定义#define uint unsigned intuchar sec,min,hour,sec50,jishu,dtp2; //sec、min、hour、为显示单元,sec50为60秒计数单元,jishu为扫描数码管计数单元uchar sec1,min1,hour1; //时间中介单元uchar nzmin,nzhour,nzjishu=0,dispjishu=0; //闹钟分、时定义uchar data nzbit=0; //闹钟标志位,闹钟默认为开启uchar data dispbit=0; //显示标志位,默认显示当前时间uchar data disp[8]; //秒、分、时个位与十位存放数组及‘—’uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //数字0-9sbit KEYmin=P3^2; //分加1按钮sbit KEYhour=P3^3; //时加1按钮sbit LABA=P1^0; //闹钟输出I/O口sbit NZdisplay=P3^4; //闹钟显示按钮,按住不放显示闹钟时间,放开则显示当前时间sbit KEYnzmin=P3^5; //闹钟分加1按钮sbit KEYnzhour=P3^6; //闹钟时加1按钮sbit KEYoff=P3^7; //关闭闹钟按钮,按第一次为关闭,第二次为开启void display(); //显示函数声明void keyscan(); //按键扫描函数声明void naozhong(); //闹钟判别函数声明void keynz(); //闹钟按键函数声明void main(){sec=0; //时间初始化为00—00—00min=0;hour=0;sec1=0; //显示单元初始化为00—00—00min1=0;hour1=0;nzmin=01; //闹钟初始时间为01:01nzhour=01;jishu=0;dtp2=0xfe;P0=0xff;TMOD=0x11; //设T0、T1为模式1IE=0x8a;TH0=0xb8; //T0定时20msTL0=0x0;TH1=0xfc; //T1定时1msTL1=0x66;TR0=1;TR1=1;while(1){display(); //调用显示子程序keyscan(); //调用按键子程序keynz(); //调用闹钟按键子程序}}void t0int() interrupt 1 //T0定时中断程序{TH0=0xb8;TL0=0x0;sec50++;if(sec50==50) //对20ms计数50次即1s{sec50=0; //清秒计数器,为下次做准备naozhong(); //调用闹钟判别子程序sec1++; //秒加1}if(sec1==60) //对秒计数60次即1min{sec1=0;min1++; //分加1}if(min1==60) //对分计数60次即1hour{min1=0;hour1++; //时加1}if(hour1==24){hour1=0;}if(dispbit==0) //判断显示标志位是否为0,为0显示当前时间{sec=sec1;min=min1;hour=hour1;}else //显示标志位为1,显示闹钟时间{min=nzmin; //将闹钟时间给显示单元hour=nzhour;}}void t1int() interrupt 3 //T1中断程序{TH1=0xfc;TL1=0x66;P2=0xff; //关闭所有数码管P2=dtp2;dtp2=_crol_(dtp2,1);P0=disp[jishu];jishu++;if(jishu==8) //扫描完8位数码管清0,重新从第一位开始扫描{jishu=0;}}void delay(uint x) //延时函数uchar i;while(x--){for(i=0;i<120;i++);}}void display() //显示子程序{disp[7]=table[sec%10]; //秒个位显示disp[6]=table[sec/10]; //秒十位显示disp[4]=table[min%10]; //分个位显示disp[3]=table[min/10]; //分十位显示disp[1]=table[hour%10]; //时个位显示disp[0]=table[hour/10]; //时十位显示disp[2]=0xbf; //显示‘_’disp[5]=0xbf;}void keyscan() //按键子程序{delay(20); //延时消抖if(KEYmin==0)//时间分加1按钮{min1++; //时间分加1if(min1==60){min1=0;hour1++; //分加到60对时加1}if(hour1==24){hour1=0;}while(!KEYmin); //等待按键放开}delay(20); //延时消抖if(KEYhour==0) //时间时加1按钮{hour1++; //时间时加1if(hour1==24){hour1=0;}while(!KEYhour); //等待按键放开}void naozhong() //闹钟判断{if(nzbit==0) //判断闹钟标志位,0为开启闹钟判断,1为关闭闹钟{if(min1==nzmin) //闹钟与时间分的判别if(hour1==nzhour) //闹钟与时间时的判别LABA=0; //时间分、时与闹钟分、时相等就打开蜂鸣器}elseLABA=1;}void keynz() //闹钟加、减及闹钟关闭、开启按键处理子程序{delay(20); //延时消抖if(KEYnzmin==0) //判别闹钟分加1按键{nzmin++; //闹钟分加1if(nzmin==60){nzmin=0;nzhour++; //闹钟分加到60对闹钟时加1if(nzhour==24)nzhour=0;}while(!KEYnzmin); //等待按键放开}delay(20); //延时消抖if(KEYnzhour==0) //判别闹钟时加1按键{nzhour++; //闹钟时加1if(nzhour==24)nzhour=0;while(!KEYnzhour); //等待按键放开}if(KEYoff==0)//判断关闭闹钟按键是否按下{delay(20); // 延时消抖nzjishu++;if(nzjishu==1) //判断是否为第一次按下{nzbit=1; //第一次按下关闭闹钟if(nzjishu==2) //判断是否为第二次按下{nzjishu=0; //第二次按下清计数单元nzbit=0; // 第二次按下开启闹钟判别}while(!KEYoff); //等待按键放开}if(NZdisplay==0) //判别显示切换闹钟按键是否按下{dispjishu++;if(dispjishu==1) //第一次按下显示闹钟时间{dispbit=1; //第一次按下,把标志位置1,显示切换为闹钟时间}if(dispjishu==2) //第二次按下显示为当前时间{dispjishu=0; //清零,重新计数dispbit=0; //第二次按下清零显示标志位,显示切换为当前时间}while(!NZdisplay); //等待按键放开}}。

51单片机数字钟设计实习报告

51单片机数字钟设计实习报告

51单片机数字钟设计实习报告目录一.设计方案: (3)二.设计内容: (3)三.相关总线及芯片介绍: (3)1.SPI总线: (3)2.74LS595芯片: (4)3. 实验箱电路图: (6)四.系统软件程序设计: (6)五.设计程序: (8)六.程序调试及显示: (11)七.实习心得: (12)八.参考文献: (13)一.设计方案:通过单片机内部的计数/定时器,采用软件编程来实现时钟计数,一般称为软时钟,这种方法的硬件线路简单,系统的功能一般与软件设计相关,通常用在对时间精度要求不高的场合。

二.设计内容:这里采用应用广泛的C51作为时钟控制芯片,利用单片机内部的定时/计数器T0 实现软时钟的目的。

首先将T0设定工作于定时方式,对机器周期计数形成基准时间(50ms),然后用另一个定时/计数器T1对基准时间计数形成秒,秒计60次形成分,分计60形成小时,小时计到12或者24。

通过外部中断实现12进制与24进制的切换。

最后通过数码管把它们的内容在相应的位置显示出来,达到时、分、秒计时的功能。

三.相关总线及芯片介绍:1.SPI总线:SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息。

外围设置FLASHRAM、网络控制器、LCD显示驱动器、A/D转换器和MCU等。

SPI 总线系统可直接与各个厂家生产的多种标准外围器件直接接口,该接口一般使用4条线:串行时钟线(SCK)、主机输入/从机输出数据线MISO、主机输出/从机输入数据线MOSI和低电平有效的从机选择线SS(有的SPI接口芯片带有中断信号线INT或INT、有的SPI接口芯片没有主机输出/从机输入数据线MOSI)。

由于SPI系统总线一共只需3~4位数据线和控制即可实现与具有SPI总线接口功能的各种I/O器件进行接口,而扩展并行总线则需要8根数据线、8~16位地址线、2~3位控制线,因此,采用SPI总线接口可以简化电路设计,节省很多常规电路中的接口器件和I/O口线,提高设计的可靠性。

51时钟设计实训报告

51时钟设计实训报告

51时钟设计实训报告一、项目背景随着社会的发展与科技的进步,电子产品在我们日常生活中扮演着越来越重要的角色。

而钟表作为一种时间显示工具,也不断得到升级与创新。

本项目旨在设计一种基于51单片机的数字时钟,通过数字显示屏实时显示时间,并具备设置闹钟功能,以方便人们更好地了解和掌握时间。

二、项目原理本项目采用基于51单片机的设计方案,并通过数字显示屏显示时间。

其工作原理如下:1. 单片机工作频率设置为12MHz;2. 通过外部晶振将时钟信号输入到单片机的时钟引脚;3. 使用数码管显示时钟的小时、分钟和秒数;4. 通过按键实现时间的设置和闹钟的设置功能;5. 利用定时器中断实现时间的自动更新,保证时钟的准确性;6. 在需要闹钟响铃时,通过蜂鸣器发出声音提醒用户。

三、硬件设计1. 硬件元件清单- 51单片机- 12MHz晶振- 数码管- 按键- 电阻- 蜂鸣器- 杜邦线- 面包板2. 电路连接示意图![电路连接示意图](circuit.png)3. 数码管显示原理数码管将十进制数字通过多段共阴/共阳的LED管显示出来。

由于本项目中使用的是共阳数码管,因此需要在控制单元中采用共阴极接法。

通过依次给不同的数码管段加电,即可显示相应的数字。

四、软件设计1. 软件流程图软件的设计使用C语言进行编程,主要包括以下步骤:1. 初始化:设置单片机工作频率、端口输入输出状态,打开定时器中断;2. 显示时间:获取当前的小时、分钟和秒数,将其转换为相应的数码管段码,通过IO口输出到数码管上进行显示;3. 设置时间:通过按键输入,修改单片机内部存储的时间;4. 闹钟设置:通过按键输入,设置闹钟的小时和分钟;5. 定时器中断:在定时器中断函数中进行时间的更新和闹钟的判断;6. 响铃:当闹钟时间与当前时间相同时,通过蜂鸣器发出声音提醒用户。

2. 核心代码以下是部分核心代码的示例:cinclude <reg52.h>定义数码管段码与显示端口的对应关系unsigned char segTable[12] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99,0x92, 0x82, 0xF8, 0x80, 0x90, 0xBF, 0xFF};定义全局变量unsigned char hour, min, sec, setHour, setMin;unsigned char alarmHour, alarmMin;bit isAlarmOn;初始化函数void init() {设置单片机工作频率TMOD = 0x01;设置数字管段码端口为输出P2 = 0x00;P0 = 0x00;打开定时器中断ET0 = 1;EA = 1;初始化全局变量hour = 0;min = 0;sec = 0;setHour = 0;setMin = 0; alarmHour = 0; alarmMin = 0;isAlarmOn = 0;}主函数void main() {init();while (1) {showTime();setTime();setAlarm();}}定时器中断函数void timer0() interrupt 1 { TH0 = (65536 - 50000) / 256; TL0 = (65536 - 50000) % 256; sec++;if (sec == 60) {sec = 0;min++;if (min == 60) {min = 0;hour++;if (hour == 24) {hour = 0;}}}if (isAlarmOn && alarmHour == hour && alarmMin == min) { ring();}}数码管显示函数void showNumber(unsigned char num) {P0 = segTable[num];delay();P0 = 0xFF;}数码管显示时间函数void showTime() { unsigned char temp; temp = hour / 10; showNumber(temp); P2 = 0x10;delay();temp = hour % 10; showNumber(temp); P2 = 0x20;delay();temp = min / 10; showNumber(temp); P2 = 0x40;delay();temp = min % 10; showNumber(temp);P2 = 0x80;delay();P2 = 0x00;}五、实训心得通过本次实训,我深入了解和学习了51单片机的原理和使用方法,掌握了数字时钟的设计与实现。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

计算机硬件综合课程设计报告课目:学院:班级:姓名:指导教师:目录1 设计要求功能需求设计要求2 硬件设计及描述总体描述系统总体框图Proteus仿真电路图3 软件设计流程及描述程序流程图函数模块及功能4 心得体会附:源程序1设计要求1.1功能需求(1)实现数字时钟准确实时的计时与显示功能;(2)实现闹钟功能,即系统时间到达闹钟时间时闹铃响;(3)实现时间和闹钟时间的调时功能;(4)刚启动系统的时候在数码管上滚动显示数字串(学号)。

1.2设计要求(1)应用MCS-51单片机设计实现数字时钟电路;(2)使用定时器/计数器中断实现计时;(3)选用8个数码管显示时间;(4)使用3个按钮实现调时间和闹钟时间的功能。

按钮1:更换模式(模式0:正常显示时间;模式1:调当前时间的小时;模式2;调当前时间的分钟;模式3:调闹钟时间的小时;模式4:调闹钟时间的分钟);按钮2:在非模式0下给需要调节的时间数加一,但不溢出;按钮3:在非模式0下给需要调节的时间数减一,但不小于零;(5)在非0模式下,给正在调节的时间闪烁提示;(6)使用扬声器实现闹钟功能;(7)采用C语言编写程序并调试。

2 硬件设计及描述2.1总体描述(1)单片机采用AT89C51型;(2)时间显示电路:采用8个共阴极数码管,P1口驱动显示数字,P2口作为扫描信号;(3)时间设置电路:、、分别连接3个按键,实现调模式,时间加和时间减;(4)闹钟:口接扬声器。

2.2系统总体框图2.3Proteus仿真电路图3 软件设计流程及描述(1)void display_led()学号的滚动显示函数;(2)void display()显示时间以及显示调节时间和闹钟时间的闪烁;(3)void key_prc()键盘功能函数,实现3个按键有关的模式转换以及数字加一减一;(4)void init()初始化设置中断;(5)void time1() interrupt 3定时器1中断函数,实现计时功能。

4 心得体会首先在做本次课程设计的过程中,我感触最深的当属查阅大量的设计资料了。

为了让自己的设计更加完善,查阅这方面的设计资料是十分必要的,同时也是必不可少的。

我们是在做单片机实习,我们一切都要有据可依,有理可寻,不切实际的构想永远只能是构想,永远无法升级为设计。

其次,在这次课程设计中,我们运用到了以前所学的专业课知识,如:C语言、模拟和数字电路知识等。

虽然过去从未独立应用过它们,但在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获。

最后,在设计之前,我们要对所用单片机的内部结构有一个系统的了解,知道该单片机内有哪些资源;要有一个清晰的思路和一个完整的的软件流程图;在设计程序时,不能妄想一次就将整个程序设计好,反复修改、不断改进是程序设计的必经之路;要养成注释程序的好习惯,一个程序的完美与否不仅仅是实现功能,而应该让人一看就能明白你的思路,这样也为资料的保存和交流提供了方便;在实习过程中遇到问题是很正常的,但我们应该将每次遇到的问题记录下来,并分析清楚,以免下次再碰到同样的问题。

但是从中学到的知识会让我受益终身。

发现、提出、分析、解决问题和实践能力提高都会受益于我在以后的学习、工作和生活中。

附:源程序#include<>unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一维数组定义-9、横杠、全灭unsigned char num[10]={2,0,0,8,0,1,1,6,6,8} ;unsigned char a[8];unsigned char second=0,minute=0,hour=0;unsigned char minute1=0,hour1=0;unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //扫描unsigned char k=0;unsigned int temp; // 记录毫秒为秒的变量unsigned char M,S_flag; //M是模式,更新时间的种模式加上正常模式S_flag闪烁标志sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^2;sbit BEEP=P3^3;void delay(unsigned n) //毫秒{int x,y;for(x=0;x<n;x++)for(y=0;y<24;y++);}void init(){M=0;S_flag=0; //闪烁标志位TMOD=0x10; //定时器以方式定时TH1=0xfc;TL1=0x18;EA=1; //打开总中断ET1=1; //允许定时器中断TR1=1; //开启定时器(开始定时计数)}void display_led(){int x;char l,a,m;for(a=0;a<26;a++){x=a-8;for(l=0;l<50;l++){for(m=0;m<8;m++){P2=b[m];if(x>=0&&x<10) P1=led[num[x]];else P1=led[11];delay(10);x++;}x-=8;}}}void time1() interrupt 3 //定时器中断函数{TH1=0xfc; //定时msTL1=0x18;temp++;if(temp==1000) //配合定时器定时s{ temp=0;second++;}if(second==59){ second=0;if(minute<59)minute++;else { minute=0;hour++;hour%=24;}}if(hour1==hour&&minute1==minute&&second<10) //闹钟时间到 {BEEP=!BEEP;}if(temp%250==0) //每msS_flag=!S_flag; //闪烁标志位取反if(k==8) k=0;P1=a[k];P2=b[k++];delay(1);P2=0xff;}void display(){switch(M){case 0:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case 1:{if(S_flag==1){a[0]=led[hour/10];a[1]=led[hour%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case 2:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];if(S_flag==1){a[3]=led[minute/10];a[4]=led[minute%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case 3:{if(S_flag==1){a[0]=led[hour1/10];a[1]=led[hour1%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute1/10];a[4]=led[minute1%10];a[5]=led[10];a[6]=led[11];a[7]=led[11];}break;case 4:{a[0]=led[hour1/10];a[1]=led[hour1%10];a[2]=led[10];if(S_flag==1){a[3]=led[minute1/10];a[4]=led[minute1%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[11];a[7]=led[11];}}}void key_prc(){if(K1==0){delay(10); //延时去抖if(K1==0) //按K1进行模式切换{ M++;if(M==5)M=0;}while(!K1);//等待按键释放}if(M!=0){switch(M){case 1: //模式——调时{if(K2==0){delay(10); //延时去抖if(K2==0) //加键按下{if(hour<23) hour++;else hour=0;}while(!K2); //等待按键释放}if(K3==0){delay(10);if(K3==0){if(hour> 0) hour--;else hour=23;}while(!K3);}} break;case 2: //模式——调分{if(K2==0){delay(10);if(K2==0){if(minute<59) minute++;else minute=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(minute>0) minute--;else minute=59;}while(!K3);}} break;case 3: //模式——闹钟调时{if(K2==0){delay(10);if(K2==0){if(hour1<23)hour1++;else hour1=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){ if(hour1>0) hour1--;else hour1=23;}while(!K3);}} break;case 4: //模式——闹钟调分 {if(K2==0){delay(10);if(K2==0){if(minute1<59)minute1++;else minute1=0;}while(!K2);}if(K3==0){delay(10); //延时去抖if(K3==0) //减键按下{ if(minute1>0)minute1--;else minute1=59;}while(!K3);}} break;}}}void main(){display_led();init();while(1){key_prc();display();}}。

相关文档
最新文档