基于51单片机的数字钟C语言程序设计及protuse仿真
基于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单片机的多功能电子时钟设计报告及其protel仿真电路及效果

单片机课程设计报告多功能电子数字钟姓名:学号:班级:指导教师:目录一课程设计题目-------------------------------- 3 二电路设计--------------------------------------- 4 三程序总体设计思路概述------------------- 5 四各模块程序设计及流程图---------------- 6 五课程设计心得及体会---------------------- 12 六程序、仿真电路效果见附录------------ 41一题目及要求本次单片机课程设计在Proteus软件仿真平台下实现,完成电路设计连接,编程、调试,仿真出实验结果。
具体要如下:用8051单片机设计扩展6位数码管的静态或动态显示电路,再连接几个按键和一个蜂鸣器报警电路,设计出一个多功能电子钟,实现以下功能:(1)走时(能实现时分秒,年月日的计时)(2)显示(分屏切换显示时分秒和年月日,修改时能定位闪烁显示)(3)校时(能用按键修改和校准时钟)(4)定时报警(能定点报时)本次课程设计要求每个学生使用Proteus仿真软件独立设计制作出电路图、完成程序设计和系统仿真调试,验收时能操作演示。
最后验收检查结果,评定成绩分为:(1)完成“走时+显示+秒闪”功能----及格(2)完成“校时修改”功能----中等(3)完成“校时修改位闪”----良好(4)完成“定点报警”功能,且使用资源少----优秀二电路设计(电路设计图见附件电路图)(1)采用89C51型号单片机(2)采用8位共阴数码管(3)因为单片机输出高电平时输出的电流不足以驱动数码管,所以在P0口与8位数码管之间加74LS373来驱动数码管(4)P2口与数码管选择位直接加74LS138译码器(5)蜂鸣器接P3.7口。
因为单片机输出高电平时输出的电流不足以驱动蜂鸣器所以蜂鸣器,所以P3.7口与蜂鸣器直接接反相器再接蜂鸣器的一端,蜂鸣器的另一端接5V电源。
基于51单片机的数字电子钟keil+Proteus7

Proteus7Keil3(8位数码管电子钟程序)其功能:时分秒有点区分;另外加有启动键、暂停键、清零键、调时、分、秒。
#include<reg51.h>unsigned char codetab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0~9数码管显示段码tab1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 0~9数码管显示段码(带小数点)unsigned char dat[]={0,0,0,0,0,0,0,0};unsigned char j,temp;unsigned char hour = 0;unsigned char minute = 0;unsigned char second = 0;unsigned char irp_count =0;sbit k1=P3^0;//启动键sbit k2=P3^1;//暂停键sbit k3=P3^6;//清零键sbit k4=P3^3;//调时键sbit k5=P3^4;//调分键sbit k6=P3^5;//调秒键//****************延时函数******************************* void delay(){unsigned char i;for(i=0;i<20;i++);}//********************按键函数************************** void k(){if(k1==0)//启动键{if(k1==0);{TR0=1;}delay();}//******************暂停**********************else if(k2==0){if(k2==0);{TR0=0;}delay();}//***************清零*************************if(k3==0){delay();if(k3==0){dat[7]=0,dat[6]=0,dat[5]=0,dat[4]=0,dat[3]=0,dat[2]=0,dat[1]=0,dat[0]=0;TR0=0;hour=0;minute=0;second=0;}delay();}//****************调时************************else if(k4==0){while(k4==0);hour++;if(hour>=24){hour=0;}delay();}//****************调分************************else if(k5==0){while(k5==0);minute++;if(minute>=60){minute=0;}delay();}//****************调秒************************else if(k6==0){while(k6==0);second++;if(second>=60){second=0;}delay();}}//************************* 主程序********************** void main(){EA=1; EX0=1;//初值TMOD=0x01;//初值TH0=0x3c; //初值TL0=0xb0; //初值TR0=0; //初值ET0=1; //初值IT0=1; //初值while(1){k();//按键函数temp=0x01;for(j=0;j<8;j++){if(j==2||j==4||j==6)P0=tab1[dat[j]];//个位带点elseP0=tab[dat[j]];//十位不带点P1=~temp;temp=temp<<1;delay();P1=0xff;}}}/*定时计数器0的中断服务子程序*/void timer0(void) interrupt 1 using 1 //50ms中断一次{TH0=0x3c; //晶振:12MHz TL0=0xB0; //晶振:12MHz irp_count++;if (irp_count>=20) //1s{irp_count=0;second++;if (second>=60){second=0;minute++;if (minute>=60){minute=0;hour++;if (hour>=24)hour=0;} //end if(minute>=60)}} //end if(second>=60)dat[7]=hour/10;dat[6]=hour%10;dat[5]=minute/10;dat[4]=minute%10;dat[3]=second/10;dat[2]=second%10;dat[1]=irp_count/10;dat[0]=irp_count%10;//end if (irp_conut>=20) }。
AT8951单片机带闹钟数字时钟 C语言编程

{
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;
}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];
基于8051和Proteus的数字时钟 程序的编写和仿真

//显 示 函 数
weilock=1; P0=~(1<<2); weilock=0; dualock=1;
P0=(bb==2)?duacode[mint%10]|0x80:duacode[mint%10]; dualock=0; delay(); weilock=1; P0=~(1<<3); weilock=0; dualock=1; P0=(bb==2)?duacode[mint/10]|0x80:duacode[mint/10]; dualock=0; delay();
本程序功能及特点:通过 8051 芯片及数码管实现数字时钟,并可以通过如下图中的两个按键对 时钟进行调节,其中 “PAUSE”按键的作用是暂停/启动时钟并选择要修改的时间参数“时”,
“分”,“秒”,被选择参数例如下图中从左到右依次为“时,分,秒”,当小时被选中并被修
改 时 会 有 最 下 面 两 点 的 点 亮 以 作 为 提 示 , “ CHANGE”按 键 用 来 对 被 选 中 的 参 数 进 行 修 改 , 只 能
进行加法修改,超过参数的上限会自动归零, 注:本程序仅供本人日后学习参考使用,不足之处请见谅,
#include <reg52.h> sbit dualock=P2^0; sbit weilock=P2^1; unsigned char code duacode[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; unsigned char aa=0,hour=0,mint=0,sec=0,bb=0,*choose; void display(unsigned char,unsigned char,unsigned char); void delay(); void init(); void main() { init(); while(1)
基于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系列单片机及DS1302时钟芯片的电子时钟-C语言-Proteus仿真-报告

基于单片机的电子时钟姓名:班级:学号:指导教师:完成日期:目录摘要一、引言 (1)二、基于单片机的电子时钟硬件选择分析 (2)2.1主要IC芯片选择 (2)2.1.1微处理器选择 (2)2.1.2 DS1302简介 (4)2.1.3 DS1302引脚说明 (4)2.2电子时钟硬件电路设计 (5)2.2.1时钟电路设计 (6)2.2.2整点报时功能 (7)三、Protel软件画原理图 (8)3.1系统工作流程图 (8)3.2原理图 (9)四、proteus软件仿真及调试 (9)4.1电路板的仿真 (9)4.2软件调试 (9)五、源程序 (10)六、课设心得 (13)七、参考文献 (13)基于单片机电子时钟设计摘要电子时钟主要是利用电子技术将时钟电子化、数字化,拥有时钟精确、体积小、界面友好、可扩展性能强等特点,被广泛应用于生活和工作当中。
另外,在生活和工农业生产中,也常常需要温度,这就需要电子时钟具有多功能性。
本设计主要为实现一款可正常显示时钟/日历、带有定时闹铃的多功能电子时钟。
本文对当前电子钟开发手段进行了比较和分析,最终确定了采用单片机技术实现多功能电子时钟。
本设计应用AT89C52芯片作为核心,6位LED数码管显示,使用DS1302实时时钟日历芯片完成时钟/日历的基本功能。
这种实现方法的优点是电路简单,性能可靠,实时性好,时间精确,操作简单,编程容易。
该电子时钟可以应用于一般的生活和工作中,也可通过改装,提高性能,增加新功能,从而给人们的生活和工作带来更多的方便。
关键词:电子时钟;多功能;AT89C52;时钟日历芯片一、引言时间是人类生活必不可少的重要元素,如果没有时间的概念,社会将不会有所发展和进步。
从古代的水漏、十二天干地支,到后来的机械钟表以及当今的石英钟,都充分显现出了时间的重要,同时也代表着科技的进步。
致力于计时器的研究和充分发挥时钟的作用,将有着重要的意义。
1.1 多功能电子时钟研究的背景和意义20世纪末,电子技术获得了飞速的发展。
(完整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中去,再设计时钟程序。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实践教学报告2011-2012 学年第二学期项目名称基于51单片机的数字钟设计所属课程电子产品开发设计与实践教程班级电子10A1姓名赵祥琨学号1006013145指导教师张亚实训时间2012 . 6电子钟摘要本系统以MCS-51单片机为核心,以8位8段数码管显示时间,可以通过键盘设定时间和闹钟时间,并具备整点报时功能。
系统特色:1)使用定时器产生节拍,程序运行采用轮循机制,分时复用CPU 资源,增强系统可靠性。
2)采用采用三个按键设置时钟时间和闹钟时间,使用一个按键关闭闹钟,电路结构简单,使用方便。
关键词:电子钟;C语言;MCS-51;电子ELECTRONIC CLOCKAbstract:The system takes the MCS-51 single chip as the core,display time on 8X7seg,Through the keyboard to set the time and alarm time, and with the whole point timekeeping function.System characteristics:1)Use timer produces beats, running the round-robin mechanism, time division multiplexing CPU resources, improve the reliability of the system.2)Using three key clock set time and alarm time, the use of a button to turn off the alarm, the circuit structure is simple, easy to use.Keywords:…electronic ;C language;electronics目录1、方案设计与论证 (4)1、需求分析 (4)2 程序执行方案 (4)2. 系统框图 (4)2、电路设计 (6)a) 预处理、预定义、变量声明 (7)b) 显示节拍定时器初始化 (9)c) 走时计数定时器初始化 (9)d) 外部中断0 的初始化 (10)e) 软件延时 (11)f) 走时进位计数 (11)g) 显示译码 (12)h) 闹钟设定显示 (14)i) 闹铃 (16)j) 按键扫描译码 (17)k) 主函数 (21)l) 定时器0服务程序 (21)m) 定时器1服务程序 (22)n) 中断0服务程序 (23)4、测试方法与数据 (24)5、结论 (25)1、方案设计与论证1、需求分析时、分、秒正常走时。
时、分、秒在6个数码管上显示。
可调十、分。
可设置闹钟。
整点报时。
2 程序执行方案2.1 子函数顺序结构方案将各个模块放入main()函数顺序执行优点:结构简单,代码量少,层次清晰。
缺点:实时性差,用户体验较差,2.2 中断加顺序方案关键模块采用中断结构,如显示模块,以保证其实时性,对于实时性要求不高的模块采用循环结构嵌套顺序结构。
优点:实时性好,运行稳定,抗干扰性能好缺点:结构复杂综合比较后,选择方案2.2. 系统框图2、电路设计电路采用上电复位方式,设置三个校时按键和一个关闹铃按键,鉴于时钟通常不会人为复位,且主要用软件提高系统稳定性,正常使用不会出现程序崩溃,因此不设置手动复位按键。
P1口通过74HC541缓冲器向数码管发送段码,P2口发送位码,按键“set”接外部中断0,以确保设置选择急事响应并保证正确,加、减按键采用扫描方式接P0.5、P0.6,P3.7接蜂鸣器。
当依次按下set键时,分别对应的设置秒、分、时、闹铃秒、分、时和退出设置7个状态,当超过一定时间没有设置时,自动退出设置状态。
当时间到设定闹铃时间后响铃1分钟,当到59分50秒时,整点报时10秒。
3、软件设计a)预处理、预定义、变量声明#include<reg52.h>#include<intrins.h>#define uint unsigned int#define uchar unsigned char#define th0 TH0 = 0x3d;#define tl0 TL0 = 0xff;#define th1 TH1 = 0xec;#define tl1 TL1 = 0x78;sbit P3_0=P3^0;sbit P0_5=P0^5;sbit P0_6=P0^6;sbit P0_7=P0^7;uchar count = 0,shan=0;//count:计时器累加器,shan:设置闪烁标志位uchar ss=0,s=0,dd=0,d=0,hh=0,h=0;uint t_flag=0; //定时器溢出标志位uchar nh=0,nd=1,ns=0; //时分秒和闹钟时分秒uchar flag=0,key1=0,key2=0,key3=0,key4=0;uchar code table[18] = {0x3f, //00x06, //10x5b, //20x4f, //30x66, //40x6d, //50x7d, //60x07, //70x7f, //80x6f, //90x77, //a0x7c, //b0x39, //c0x5e, //d0x79, //e0x71, //f0x40, //-0x00 //消隐};/********下一行的数组可以显示数值外,还可以显示数码管的点*********/ uchar code table_d[17]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef,0xf7,0xfc,0xb9,0xde,0xf9,0xf1,0xc0};/*********数码管位选***************************/uchar code led[9] = {0xfe,0xFD,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff};b)显示节拍定时器初始化/****************显示定时器*********************** 名称 : Time1_Init()* 功能 : 定时器的初始化,12MZ晶振,5ms* 输入 : 无* 输出 : 无*************************************************/void Time1_Init(){TMOD = 0x11;th1tl1EA = 1;ET1 = 1;TR1 = 1;}c)走时计数定时器初始化/**************定时器0初始化************************ 名称 : Time0_Init()* 功能 : 定时器的初始化,12MZ晶振,50ms* 输入 : 无* 输出 : 无****************************************************/void Time0_Init(){TMOD = 0x11;th0tl0EA = 1;ET0 = 1;TR0 = 1;}d)外部中断0 的初始化/************外部中断0 的初始化*********************** * 名称 : Outside_Init()* 功能 : 外部中断0 的初始化* 输入 : 无* 输出 : 无*******************************************************/ void Outside_Init(void){EX0 = 1; //开外部中断0IT0 = 1; //负边沿触发EA = 1; //开总中断}e)软件延时/**************软件延时****************************** 名称 : delay()* 功能 : 延时。
* 输入 : uchar* 输出 : 无****************************************************/void delay(uchar k){int i,j;for(i=0; i<=k; i++)for(j=0; j<=200; j++);}f)走时进位计数/************************走时****************************** 名称 : time()* 功能 : 时分秒各位数字运算。
* 输入 : 无* 输出 : 无************************************************************/ void time(){if(h<=23){if(d<=59){if(s<=59){if(t_flag==1){s++;t_flag=0;}elses=s;}else{s=0;key1=0;d++;}}else{d=0;h++;}}elseh=0;}g)显示译码/***********************显示******************************* * 名称 : display()* 功能 : 将数字转换成相应的段码和位码,有定时器1控制。
* 输入 : 无* 输出 : 无************************************************************/ void display(){ flag++;switch(flag){case 1:P2=led[0];P1=table[s%10];break;case 2:P2=led[1];P1=table[s/10];break;case 3:P2=led[2];P1=table[16];break;case 4:P2=led[3];P1=table[d%10];break;case 5:P2=led[4];P1=table[d/10];break;case 6:P2=led[5];P1=table[16];break;case 7:P2=led[6];P1=table[h%10];break;case 8:P2=led[7];P1=table[h/10];break;default:flag=0;break;}}h)闹钟设定显示/*******************闹钟设定显示*************************** 名称 : ndisplay()* 功能 : 将数字转换成相应的段码和位码,有定时器1控制,区别于时间的是所有位均在下方多一点。