c51单片机电子时钟报告

合集下载

基于51单片机的电子时钟

基于51单片机的电子时钟

1、电子闹钟的硬件系统框架:设计出电子闹钟的基本整体框架。

2、电子闹钟的电源设计:采用交直流供电电源。

电子钟一般采用数码管等显示介质,因而必须以交流供电为主,以直流电源为后备辅助电源。

3、电子闹钟的主机电路设计:主要有1)系统时钟电路设计:对时间要求不是很高,只要能使系统可靠起振并稳定运行就行。

2)系统复位电路设计:本系统采用的是RC复位方式3)按键与按钮电路设计:按键与按钮电路设计中关键要考虑的就是按键的去抖动问题。

本系统采用软件去抖。

考虑到对时和设定闹铃时间操作的使用频率不高,为了精简系统和降低成本,本系统只设置两个按键。

a)SET键,对应系统的不同工作状态,具有3个功能:在复位后的待机状态下,用于启动设定时间参数(对时或定闹);在设定时间参数状态而且不是设定最低位(即分个位)的状态下,用于结束当前位的设定,当前设定位下移;在设定最低位(分个位)的状态下,用于结束本次时间设定。

b)+1键,用于对当前设定位进行加1操作。

4)闹铃声光指示电路设计:本系统采用声音指示,关键元件是蜂鸣器。

4、电子闹钟的显示电路设计:设计一个由LED数码管组成的显示电路,显示采用共阳极数码管,其目的是为了简化限流电路的设计和实现亮度可调的要求。

一功能模、设计指标:1. 显示时、分、秒。

2. 可以24小时制或12小时制。

3. 具有校时功能,可以对小时和分单独校时,对分校时的时候,停止分向小时进位。

校时时钟源可以手动输入或借用电路中的时钟。

4. 具有正点报时功能,正点前10秒开始,蜂鸣器1秒响1秒停地响5次。

5. 为了保证计时准确、稳定,由晶体振荡器提供标准时间的基准信号。

二、设计要求:1. 画出总体设计框图,以说明数字钟由哪些相对独立的块组成,标出各个模块之间互相联系,时钟信号传输路径、方向和频率变化。

并以文字对原理作辅助说明。

2. 设计各个功能模块的电路图,加上原理说明。

3. 选择合适的元器件,在面包上接线验证、调试各个功能模块的电路,在接线验证时设计、选择合适的输入信号和输出方式,在充分电路正确性同时,输入信号和输出方式要便于电路的测试和故障排除。

单片机课程设计报告--电子时钟(2021整理)

单片机课程设计报告--电子时钟(2021整理)

一、设计内容该课程设计是利用MCS-51单片机内部的定时/计数器、中断系统、以及行列键盘和LED显示器等部件,设计一个单片机电子时钟。

设计的电子时钟通过数码管显示,并能通过按键实现设置时间和暂停、启动控制等。

二、电子时钟设计思想:用定时/计数器T0,工作于定时,采用方式1,对12MHZ的系统时钟进行定时计数,初值设为XXYY〔自己计算〕。

形成定时时间为50ms。

用片内RAM的7BH单元对50ms 计数,计20次产生秒计数器78H单元加1,秒计数器加到60那么分计数器79H单元加1,分计数器加到60那么时计数器7AH单元加1,时计数器加到24那么时计数器清0。

然后把秒、分、时计数器分成十位和个位放到8个数码管的显示缓冲区,通过数码管显示出来。

显示格式为小时十位、小时个位---分十位、分个位---秒十位、秒个位。

在处理过程中加上了按键判断程序,能对按键处理。

三、MCS-51单片机系统简介单片机应用系统由硬件系统和软件系统两局部组成。

硬件系统是指单片机以及扩展的存储器、I\O接口、外围扩展的功能芯片以及接口电路。

软件系统包括监控程序和各种应用程序。

在单片机应用系统中,单片机是整个系统的核心,对整个系统的信息输入、处理、信息输出进行控制。

与单片机配套的有相应的复位电路、时钟电路以及扩展的存储器和I\O接口,使单片机应用系统能够运行。

在一个单片机应用系统中,往往都会输入信息和显示信息,这就涉及键盘和显示器。

在单片机应用系统中,一般都根据系统的要求配置相应的键盘和显示器。

配置键盘和显示器一般都没有统一的规定,有的系统功能复杂,需输入的信息和显示的信息量大,配置的键盘和显示器功能相对强大,而有些系统输入/输出的信息少,这时可能用几个按键和几个LED 指示灯就可以进行处理了。

在单片机应用系统在中配置的键盘可以是独立键盘,也可能是矩阵键盘。

显示器可以是LED指示灯,也可以是LED数码管,也可以是LCD显示器,还可以使用CRT显示器。

基于51的电子闹钟设计报告(附原理图、PCB图、程序)

基于51的电子闹钟设计报告(附原理图、PCB图、程序)

基于51的电⼦闹钟设计报告(附原理图、PCB图、程序)成都信息⼯程学院第五届嵌⼊式创新技术⼤赛基于MCS51的智能电⼦闹钟设计报告姓名学院班级实物图⽬录1.电⼦时钟的设计原理和⽅法 (1)1.1设计原理 (1)1.2 硬件电路的设计 (1)1.2.1 STC89C51RC简介 (1)1.2.2 键盘电路的设计 (2)1.2.3蜂鸣器驱动电路 (3)1.2.4 数码管驱动电路 (3)1.2.5 电源电路 (4)1.3软件部分的设计 (4)1.3.1主程序部分的设计 (4)1.3.2中断计时器及时间进位 (5)1.3.3 闹钟⼦函数 (7)1.3.4 按键扫描 (8)1.3.5 时钟闹钟设置 (9)1.3.6 显⽰数字函数 (10)1.3.7 显⽰界⾯函数 (10)1.3.8 闹钟记录及读取 (11)2.硬件调试 (13)附录A:电路原理图 (15)附录B:电路PCB图 (16)附录C:源程序 (17)1.电⼦时钟的设计原理和⽅法1.1设计原理系统框图1.2硬件电路的设计1.2.1 STC89C51RC简介STC89C52R CSTC89C51RC是⼀种带8K闪烁可编程可擦除只读存储器(FPETOM-FlashProgrammabalandErasableReadOnlyMemory )的低电压、⾼性能CMOS8位微型处理器,即单⽚机芯⽚。

单⽚机的可擦除只读存储器可以反复擦除1000次,内部FLASH 擦写次数为100000次以上。

该芯⽚使⽤⾼密度⾮易失存储制造技术,与⼯业标准的MCS-51指令集和输出管脚相兼容。

由于将多功能8位CPU 和闪烁存储器集成在单个芯⽚中,使得STC89C51RC 成为了⼀种性价⽐极⾼的微型处理器芯⽚,在许多电路设计中都得到了应⽤。

STC89C51RC 单⽚机特点:⼯作电压:5.5V-3.4V ⼯作频率:0-40MHz ⽤户应⽤程序空间:8K ⽚上集成128*8RAMISP (在系统可编程)/IAP (在应⽤可编程),⽆需专⽤编程器/仿真器可通过串⼝(P3.0/P3.1)直接下载⽤户程序EEPROM 功能共3个16位定时器/计数器,其中定时0还可以当成2个8位定时器使⽤外部中断4路通⽤异步串⾏⼝(UART ),还可⽤定时器软件实现多个UART ⼯作温度范围:0-75℃引脚说明:VCC:供电电压 GND :接地P0:P0是⼀个8位漏级开路双向I/O ⼝,低8位地址复⽤总线端⼝。

单片机实验报告数字时钟设计报告

单片机实验报告数字时钟设计报告

单片机实验报告数字时钟设计报告一、实验目的本次单片机实验的目的是设计并实现一个基于单片机的数字时钟。

通过该实验,深入了解单片机的工作原理和编程方法,掌握定时器、中断、数码管显示等功能的应用,提高综合运用知识解决实际问题的能力。

二、实验原理1、单片机选择本次实验选用了常见的 51 系列单片机,如 STC89C52。

它具有丰富的资源和易于编程的特点,能够满足数字时钟的设计需求。

2、时钟计时原理数字时钟的核心是准确的计时功能。

通过单片机内部的定时器,设定合适的定时时间间隔,不断累加计时变量,实现秒、分、时的计时。

3、数码管显示原理采用共阳或共阴数码管来显示时间数字。

通过单片机的 I/O 口控制数码管的段选和位选信号,使数码管显示相应的数字。

4、按键控制原理设置按键用于调整时间。

通过检测按键的按下状态,进入相应的时间调整模式。

三、实验设备与材料1、单片机开发板2、数码管3、按键4、杜邦线若干5、电脑及编程软件(如 Keil)四、实验步骤1、硬件连接将数码管、按键与单片机开发板的相应引脚通过杜邦线连接起来。

确保连接正确可靠,避免短路或断路。

2、软件编程(1)初始化单片机的定时器、中断、I/O 口等。

(2)编写定时器中断服务程序,实现秒的计时。

(3)设计计时算法,将秒转换为分、时,并进行进位处理。

(4)编写数码管显示程序,将时间数据转换为数码管的段选和位选信号进行显示。

(5)添加按键检测程序,实现时间的调整功能。

3、编译与下载使用编程软件将编写好的程序编译生成可执行文件,并下载到单片机中进行运行测试。

五、程序设计以下是本次数字时钟设计的主要程序代码片段:```cinclude <reg52h>//定义数码管段选码unsigned char code SEG_CODE ={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90};//定义数码管位选码unsigned char code BIT_CODE ={0x01, 0x02, 0x04, 0x08, 0x10,0x20, 0x40, 0x80};//定义时间变量unsigned int second = 0, minute = 0, hour = 0;//定时器初始化函数void Timer_Init(){TMOD = 0x01; //定时器 0 工作在方式 1 TH0 =(65536 50000) / 256; //定时 50ms TL0 =(65536 50000) % 256;EA = 1; //开总中断ET0 = 1; //开定时器 0 中断TR0 = 1; //启动定时器 0}//定时器 0 中断服务函数void Timer0_ISR() interrupt 1{TH0 =(65536 50000) / 256;TL0 =(65536 50000) % 256;second++;if (second == 60){second = 0;minute++;if (minute == 60){minute = 0;hour++;if (hour == 24){hour = 0;}}}}//数码管显示函数void Display(){unsigned char i;for (i = 0; i < 8; i++)P2 = BIT_CODEi;if (i == 0){P0 = SEG_CODEhour / 10;}else if (i == 1){P0 = SEG_CODEhour % 10;}else if (i == 2){P0 = 0xBF; //显示“”}else if (i == 3){P0 = SEG_CODEminute / 10;else if (i == 4){P0 = SEG_CODEminute % 10;}else if (i == 5){P0 = 0xBF; //显示“”}else if (i == 6){P0 = SEG_CODEsecond / 10;}else if (i == 7){P0 = SEG_CODEsecond % 10;}delay_ms(1);//适当延时,防止闪烁}}//主函数void main(){Timer_Init();while (1){Display();}}```六、实验结果与分析1、实验结果将程序下载到单片机后,数字时钟能够正常运行,准确显示时、分、秒,并且通过按键可以进行时间的调整。

51单片机电子时钟C语言程序

51单片机电子时钟C语言程序
IT0=0;//电平触发(低电平有效)
EX0=1;
ET0=1;
TR0=1;
yueqh(),riqh();//初始化日月切换
}
void ritiao()//日期的调节函数
{ if(P36==0)//日期加一调节键
{
p36xd();
if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||(numyue==12))
{numyue=1;}
yueqh();
}
if(P37==0)
{
p37xd();
numyue-=1;
if(numyue==0)
{numyue=12;}
yueqh();
}
}
void int0() interrupt 0
{
p32xd();
if(numsec==-1)
{
numsec=59;
}
secqh();
}
}
};
p32xd();
while(P32!=0)//第二次按下p32时,进行分调时
{
for(m=0;m<40;m++)
{
P2=0x00;
P0=table[hou1];
P2=0X20;
delayms(1);
P2=0x00;
P0=table[hou2]&0x7f;
P2=0X10;
delayms(1);
P2=0x00;
P0=table[sec1];

51单片机电子时钟课程设计报告实验报告

51单片机电子时钟课程设计报告实验报告

《单片机原理与应用》课程设计总结报告题目:单片机电子时钟(带秒表)的设计设计人员:张保江江润洲学号:********** **********班级:自动化1211指导老师:***目录1.题目与主要功能要求 (2)2.整体设计框图及整机概述 (3)3.各硬件单元电路的设计、参数分析及原理说明 (3)4.软件流程图和流程说明 (4)5.总结设计及调试的体会 (10)附录1.图一:系统电路原理图 (11)2.图二:系统电路PCB (12)3.表一:元器件清单 (13)4.时钟程序源码 (14)题目:单片机电子时钟的设计与实现课程设计的目的和意义课程设计的目的与意义在于让我们将理论与实践相结合。

培养我们综合运用电子课程中的理论知识解决实际性问题的能力。

让我们对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,同时在软件编程、排错调试、焊接技术、相关仪器设备的使用技能等方面得到较全面的锻炼和提高,为今后能够独立完成某些单片机应用系统的开发和设计打下一个坚实的基础。

课程设计的基本任务利用89C51单片机最小系统,综合应用单片机定时器、中断、数码显示、键盘输入等知识,设计一款单片机和简单外设控制的电子时钟。

主要功能要求最基本要求1)使用MCS-51单片机设计一个时钟。

要求具有6位LED显示、3个按键输入。

2)完成硬件实物制作或使用Pruteus仿真(注意位驱动应能提供足够的电流)。

3)6位LED数码管从左到右分别显示时、分、秒(各占用2位),采用24小时标准计时制。

开始计时时为000000,到235959后又变成000000。

4)使用3个键分别作为小时、分、秒的调校键。

每按一次键,对应的显示值便加1。

分、秒加到59后再按键即变为00;小时加到23后再按键即变为00。

在调校时均不向上一单位进位(例如分加到59后变为00,但小时不发生改变)。

5) 软件设计必须使用MCS-51片内定时器,采用定时中断结构,不得使用软件延时法,也不得使用其他时钟芯片。

51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】

51单片机控制基于1602液晶显示 电子时钟【带闹铃和整点报时】
void buzz_pro(uchar be)//蜂鸣器发声函数
{
switch(be)
{//uint i;
/*用于整点响铃*/case 0:{
buzz=~buzz;
//delay1();
}break;
/*用于闹铃报时*/case 1:{
buzz=~buzz;
//delay(10);
}break;
}
}
void write_com(uchar com)//命令写入函数
{
rs=0;
delay(3);
P0=com;
delay(3);
lcden=1;
delay(3);
lcden=0;
}
void write_date(uchar date)//数据写入函数
{
rs=1;
delay(3);
P0=date;
delay(3);
write_date(0x30+ge);
}
void write_ymd(uchar add,uchar date)//年月日写入子程序
{
uchar sh,ge;
sh=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+sh);
write_date(0x30+ge);
sbit buzz=P1^5; //蜂鸣器控制端
uchar code week0[]="Sun";
uchar code week1[]="Mon";
uchar code week2[]="Tue";

51单片机电子时钟课程设计报告

51单片机电子时钟课程设计报告

第一部分设计任务和要求1.1单片机课程设计内容 (2)1.2单片机课程设计要求 (2)1.3系统运行流程 (2)第二部分设计方案2.1总体设计方案说明 (2)2.2系统方框图 (3)2.3系统流程图 (3)第三部分主要器材及基本简介3.1主要器材 (4)3.2主要器材简介 (4)第四部分系统硬件设计4.1最小系统 (6)4.2LCD显示电路 (6)4.3键盘输入电路 (7)4.4蜂鸣器和LED灯电路 (7)第五部分仿真电路图与仿真结果 (8)第六部分课程设计总结 (8)第七部分参考文献 (9)附录A 实物图附录B 系统源程序第一部分设计任务和要求1.1单片机课程设计内容利用STC89C51单片机和LCD1602电子显示屏实现电子时钟,可由按键进行调时和12/24小时切换。

1.2单片机课程设计要求1.能实现年、月、日、星期、时、分、秒的显示;2.能实现调时功能;3.能实现12/24小时制切换;4.能实现8 : 00—22 : 00整点报时功能。

1.3系统运行流程程序首先进行初始化,在主程序的循环程序中首先调用数据处理程序,然后调用显示程序,在判断是否有按键按下。

若有按键按下则转到相应的功能程序执行,没有按键按下则调用时间程序。

若没到则循环执行。

计时中断服务程序完成秒的计时及向分钟、小时的进位和星期、年、月、日的进位。

调时闪烁中断服务程序用于被调单元的闪烁显示。

调时程序用于调整分钟、小时、星期、日、月、年,主要由主函数组成通过对相关子程序的调用,如图所示。

实现了对时间的设置和修改、LCD显示数值等主要功能。

相关的调整是靠对功能键的判断来实现的。

第二部分设计方案2.1总体设计方案说明1.程序设计及调试根据单片机课程设计内容和要求,完成Protues仿真电路的设计和用Keil软件编写程序,并进行仿真模拟调试。

2.硬件焊接及调试根据仿真电路图完成电路板的焊接,并进行软、硬件的调试,只到达到预期目的。

3.后期处理对设计过程进行总结,完成设计报告。

单片机汇编程序51电子时钟.doc

单片机汇编程序51电子时钟.doc

单片机汇编程序 51电子时钟电子钟设计实验报告一)实验目的:1、进一步掌握定时器的使用和编程方法。

2、进一步掌握中断处理程序的编程方法。

3、进一步掌握数码显示电路的驱动方法。

4、进一步掌握键盘电路的驱动方法。

5、进一步掌握软件数据处理的方法。

二)内容要求:1、利用CPU的定时器和数码显示电路,设计一个电子时钟。

格式如下:XX XX XX 由左向右分别为:时、分、秒。

2、电子时钟有秒表功能。

3、并能用键盘调整时钟时间。

4、电子时钟能整点报时、整点对时功能。

5、能设定电子时钟的闹铃。

三)主要元件:电阻4.7K 10个 2K 1个四位共阳数码管1个二位共阳数码管1个按钮开关4个万用板(中板)1个 9012PNP 7个排线排阵若干电线一捆蜂鸣器1个最小系统一个四)系统说明:按P1.0键,如果按下的时间小于1秒进入省电模式(数码管不显示,开T0计时器),如果按下的时间大于1秒则进入时间调整.。

在时间调整状态:再按P1.0,如果按下时间大于0.5秒转调小时状态,按下时间小于0.5秒加1分钟操作。

在小时调整状态再按P1.0键,如果按下时间大于0.5秒退出时间调整,如果按下时间小于0.5秒加1小时操作。

按P1.1键,进入闹铃调分状态,按P1.2分加1,按P1.0分减1。

若再按P1.3,则进入调整状态,按P1.2时加1,按P1.0分时。

按P1.1键,闹铃有效,显示式样变为00:00:—0;再按P1.1键,闹铃无效,显示式样变为00:00:—。

按P1.3键,调整闹钟时间结束。

按P1.2键,进入秒表计时功能,按P1.2键暂停或清零,按P1.1键退出秒表回到时钟状态。

而且本系统还有整点报时功能,以及按键伴有声音提示。

五)程序流程图:开始 TO中断初始化保护现场进入功能调用显示定时初值校正程序子程序N Y键按下, 1S到,Y N加1S处理整点到NY恢复现场,中断返回按时间鸣叫次数主程序流程图 T0中断计时程序流程图T1中断保护现场T1中断服务程序流程图秒表/闪烁,时钟调时闪烁加10MS处理闪烁处理恢复现场,中断返回六)电路图七)程序清单:中断入口程序 ;; DISPFIRST EQU 30H BELL EQU P1.4CONBS EQU 2FHOUTPX EQU P2 ;P2位选OUTPY EQU P0 ;P0段选INP0 BIT P1.0INP1 BIT P1.1INP2 BIT P1.2ORG 0000H ;程序执行开始地址LJMP START ;跳到标号START执行ORG 0003H ;外中断0中断程序入口RETI ;外中断0中断返回ORG 000BH ;定时器T0中断程序入口LJMP INTT0 ;跳至INTTO执行ORG 0013H ;外中断1中断程序入口RETI ;外中断1中断返回ORG 001BH ;定时器T1中断程序入口LJMP INTT1 ;跳至INTT1执行ORG 0023H ;串行中断程序入口地址RETI ;串行中断程序返回;QQQQ:MOV A,#10HMOV B,79HMUL ABADD A,78HMOV CONBS,ABSLOOP:LCALL DS20MSLCALL DL1SLCALL DL1SLCALL DL1SDJNZ CONBS,BSLOOPCLR 08HAJMP START;; 主程序 ;;START:MOV R0,#00H ;清70H-7AH共11个内存单元MOV R7,#80H ;CLEARDISP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARDISP ;MOV 20H,#00H ;清20H(标志用)MOV 7AH,#0AH ;放入"熄灭符"数据MOV TMOD,#11H ;设T0、T1为16位定时器MOV TL0,#0B0H ;50MS定时初值(T0计时用) MOV TH0,#3CH ;50MS定时初值MOV TL1,#0B0H ;50MS定时初值(T1闪烁定时用) MOV TH1,#3CH ;50MS定时初值SETB EA ;总中断开放SETB ET0 ;允许T0中断SETB TR0 ;开启T0定时器MOV R4,#14H ;1秒定时用初值(50MS×20)MOV DISPFIRST ,#70HSTART1: LCALL DISPLAY ;调用显示子程序JNB INP0,SETMM1 ;P1.0口为0时转时间调整程序JNB INP1,FUNSS ; 秒表功能,P1.1按键调时时作减1加能JNB INP2,FUNPT ;STOP,PUSE,CLRJNB P1.3,TSFUNSJMP START1 ;P1.0口为1时跳回START1SETMM1: LJMP SETMM ;转到时间调整程序SETMM FUNSS: LCALL DS20MSJB INP1,START1WAIT11: JNB INP1,WAIT11CPL 03HMOV DISPFIRST,#00H :显示秒表数据单元MOV 70H,#00HMOV 71H,#00HMOV 76H,#00HMOV 77H,#00HMOV 78H,#00HMOV 79H,#00HAJMP START1FUNPT: LCALL DS20MSJB INP2,START1WAIT22: JNB INP2,WAIT21CLR ET0CLR TR0WAIT33: JB INP2,WAIT31 LCALL DS20MSJB INP2,WAIT33WAIT66: JNB INP2,WAIT61 MOV R0,#70H ;清70H-79H共10 个内存单元MOV R7,#0AH ;CLEARP: MOV @R0,#00H ;INC R0 ;DJNZ R7,CLEARP ;WAIT44: JB INP2,WAIT41 LCALL DS20MSJB INP2,WAIT44WAIT55: JNB INP2,WAIT51 SETB ET0SETB TR0AJMP START1WAIT21: LCALL DISPLAY AJMP WAIT22WAIT31: LCALL DISPLAY AJMP WAIT33WAIT41: LCALL DISPLAYAJMP WAIT44WAIT51: LCALL DISPLAYAJMP WAIT55WAIT61: LCALL DISPLAYAJMP WAIT66 TSFUN:LCALL DS20MSWAIT113:JNB P1.3,WAIT113JB 05H,CLOSESPMOV DISPFIRST,#50HMOV 50H,#0CHMOV 51H,#0AHDSWAIT:SETB EALCALL DISPLAYJNB P1.2,DSFINCJNB P1.0,DSDECJNB P1.3,DSSFU AJMP DSWAITCLOSESP:CLR 05HCLR BELLAJMP START1 DSSFU:LCALL DS20MS JB P1.3,DSWAIT LJMP DSSFUNN DSFINC:LCALL DS20MS JB P1.2,DSWAIT DSWAIT12:LCALL DISPLAY JNB P1.2,DSWAIT12 CLR EAMOV R0,#53H LCALL ADD1MOV A,R3CLR CCJNE A,#60H,ADDHH22ADDHH22:JC DSWAITACALL CLR0AJMP DSWAITDSDEC:LCALL DS20MSLCALL DISPLAYDSWAITEE:LCALL DISPLAYJNB P1.0,DSWAITEECLR EAMOV R0,#53HLCALL SUB1LJMP DSWAIT ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR ET0 ;关T0中断允许CLR TR0 ;关闭定时器T0JB 03H,FSSMOV A,#0B7H ;中断响应时间同步修正ADD A,TL0 ;低8位初值修正MOV TL0,A ;重装初值(低8位修正值)MOV A,#3CH ;高8位初值修正ADDC A,TH0 ;MOV TH0,A ;重装初值(高8位修正值)SETB TR0 ;开启定时器T0DJNZ R4, OUTT0 ;20次中断未到中断退出ADDSS: MOV R4,#14H ;20次中断到(1秒)重赋初值MOV R0,#71H ;指向秒计时单元(71H-72H)ACALL ADD1 ;调用加1程序(加1秒操作)MOV A,R3 ;秒数据放入A(R3为2位十进制数组合)CLR C ;清进位标志CJNE A,#60H,ADDMM ;ADDMM: JC OUTT0 ;小于60秒时中断退出ACALL CLR0 ;大于或等于60秒时对秒计时单元清0 MOV R0,#77H ;指向分计时单元(76H-77H)ACALL ADD1 ;分计时单元加1分钟MOV A,R3 ;分数据放入ACLR C ;清进位标志CJNE A,#60H,ADDHH ;ADDHH: JC OUTT0 ;小于60分时中断退出ACALL CLR0 ;大于或等于60分时分计时单元清0MOV R0,#79H ;指向小时计时单元(78H-79H)ACALL ADD1 ;小时计时单元加1小时MOV A,R3 ;时数据放入ACLR C ;清进位标志JB 03H,OUTT0 ;秒表时最大数为99CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;LCALL BAOJPOP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器SETB ET0 ;开放T0中断RETI ;中断返回 ;秒表计时程序(10MS加1),低2位为0.1、0.01秒,中间2位为秒,最高位为分。

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

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

数字钟项目硬件总体设计说明书编制单位:侏罗纪工作室作者发布日期:2011-1-22审核人:批准人:目录1.引言 (1)1.1.编写目的: (1)1.2.背景 (1)1.3.定义 (2)1.4.参考资料 (2)2.总体设计 (3)2.1开发与运行环境 (3)2.2硬件功能描述 (3)2.3硬件结构 (3)3.硬件模块设计 (4)3.1.描述 (4)3.1.1.AT89C51单片机简介 (4)3.1.2. 键盘电路的设计 (5)3.1.3. 段码驱动电路 (5)3.1.4. 显示器的选择 (7)3.1.5. 蜂鸣器驱动电路 (8)3.2.功能 (8)4.嵌入式软件设计 (9)4.1.流程逻辑 (9)4.2.算法 (10)4.2.1. 中断定时器的设置 (26)4.2.2. 闹钟子函数 (27)4.2.1. 计时函数 (28)4.2.2. 键盘扫描函数 (29)4.2.3. 时间和闹钟的设置 (30)5.经验总结 (31)6.附录 (37)1.引言1.1.编写目的:20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。

时间对人们来说总是那么宝贵,工作的忙碌性和繁杂性容易使人忘记当前的时间。

忘记了要做的事情,当事情不是很重要的时候,这种遗忘无伤大雅。

但是,一旦重要事情,一时的耽误可能酿成大祸。

例如,许多火灾都是由于人们一时忘记了关闭煤气或是忘记充电时间等造成的。

而钟表的数字化给人们生产生活带来了极大的方便。

数字钟是通过数字电路实现时,分,秒数字显示的计时装置,广泛用于个人家庭、车站、码头办公室等公共场所,成为人们日常生活中不可少的必需品。

由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表原先的报时功能,诸如定时自动报警、按时自动打铃、时间程序自动控制、定时广播、自动起闭路灯、定时开关烤箱、通断动力设备、甚至各种定时电气的自动启用等。

基于51系列单片机及DS1302时钟芯片的电子时钟_C语言_Proteus仿真_报告

基于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世纪末,电子技术获得了飞速的发展。

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单片机数码管电子时钟C程序

51单片机数码管电子时钟C程序

//**单片机stc89c52, 8位共阴数码管12M晶振//*******P0 位选,P2 段选❖******//#include 〃reg52・ h〃#define uchar unsigned char#define uint unsigned intuchar code tab[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x40, Oxff}; uchar n;uchar hh, mm, ss;uchar nhh, nmm, nss;uint year;uchar day, mon, week;uchar hhs, hhg, mms, mmg, sss, ssg;uchar days,dayg, mons, mong;uchar nhhs, nhhg, nmms, nmmg, nsss, nssg;uchar setl=l, set2=l;sbit dula=P3 3;sbit fm=P3 2;sbit kl二P3"4;sbit k2二P3"5;sbit k3二P3飞;sbit k4二P3"7;uchar tablel[] = {31, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; 〃闰年uchar table2[] = {31, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; //非闰年void jishi ();void baoshi ();void alarm();void set_time();void set_alarm();void set_mdw();void key_change():void key_set ();void delay (int m) 〃延时程序,延时m*0. 5msuint i;uint j;for (i=0;i<m;i++){for(j=0;j<500;j++){}}}void timerO() interrupt 1 {TMOD二0x01;TH0=0x3c;TLO=Oxbl;n++;JishiO;}main()TMOD二0x01;TH0=0x3c;TLO二Oxbl;TRO二1;EA二1;ETO二1;hh=12;mm=00;ss=00;nhh二7;nmm=30;nss=0;year=2012;mon=01;day=01;week=7; while(1){hhs=hh/10%10; // 时分秒hhg=hh%10;mms=mm/10%10;mmg=mm%10;sss=ss/10%10;ssg=ss%10;nhhs=nhh/10%10; 〃闹钟nhhg=nhh%10; nmms=nmm/10%10;nmmg=nmm%10; nsss=nss/10%10;nssg=nss%10; days=day/10%10;//月Hday萨day%10; mons=mon/10%10;mong=mon%10;key_change () ; //kl 按键扫描key_set (); //k2 按键扫描set_time() ; //设置时间set.mdwO ; //设置月日星期set_alarm() ; //设置闹钟辻(setl-1) //正常走时显示dula=l: P2=tab [hhs] ; dula=O: P2=0xff; PO=Oxef; delay (1) ;P0二Oxff; //时十位dula二1;P2二tab[hhg]; dula=0;P2=0xff;PO=Oxdf;delay(1) ; PO二Oxff;//时个位dula=l;P2=tab[10]:dula=0;P2=0xff; PO=Oxbf;delay(1); PO二Oxffdula=l: P2=tab [mms] : dula=0: P2 二Oxff ;P0 二0x7f; delay (1) ;P0 二Oxff; //分十位dula=l; P2=tab [mmg] ; dula=0; P2=0xf f; P0=0xfe; delay (1) ; PO 二Oxff;//分个位dula=l;P2=tab[10]; dula=0:P2=0xff;PO=Oxfd:delay(1); PO二Oxffdula二1;P2二tab[sss]; dula=0;P2=0xff;PO=Oxfb:delay(1) ; PO二Oxff;//秒十位dula二1;P2二tablssg]; dula=0:P2=0xff;P0=0xf7; delay(1) ;P0二Oxff; //秒个位}辻(set 1=2) //设置时间dula=l; P2=tab [hhs] ; dula=0; P2=Oxff; PO=Oxef; delay (1) ;P0二Oxff; //时十位dula二1;P2二tablhhg]; dula=0:P2=0xff;PO=Oxdf;delay(1) ; PO二Oxff;//时个位dula=l:P2=tab[10]:dula=0;P2=0xff; PO=Oxbf;delay(1); PO二Oxffdula=l: P2=tab [mms] : dula=0: P2 二Oxff ;P0 二0x7f; delay (1) ;P0 二Oxff; //分十位dula=l; P2=tab [mmg] ; dula=0: P2=0xf f: P0=0xfe; delay (1) ; PO 二Oxff;//分个位dula=l;P2=tab[10]; dula=0:P2=0xff;PO=Oxfd:delay(1); PO二Oxffdula二1;P2二tab[sss]; dula=0;P2=0xff;PO=Oxfb:delay(1) ; PO二Oxff;//秒十位dula二1;P2二tablssg]; dula=0:P2=0xff;P0=0xf7; delay(1) ;P0二Oxff; //秒个位}辻(set 1-3) //正常显示月日-星期(肆匕诂S )M心T P 鏗\m x o u o 匕(DAPWZJXOUOddxouzdoudnp 二席*〕qpf Zd二 H d n p 创+忌、、d x o u o d - (I )A p w q J x o u o d d x o u z d o H £n p =s 〕q p f z d =%-n p 、、—、、、、QJXOUOd - (I)xp^p&Jxouod2Jxouzdo%w 〔OI 〕qeTzd=%-np 心T p g 'm x o u o d - u)APW*xouoddxouzd oUPTnp 二"App 〕qpfzd二%-np^+、、dxouocr(DAP^PQZXOUOmxouzdou d n p 二 SAPP 〕qpfzd 二%-np 、、—、、、、QJXOUOdJI) A32P cu q x o u o d 世o %I n p 二2〕q e F CN d 二%H T P 鏗\m x o u o 匕(DAPWZJXOUOddxouzdoudnp 二席*〕qpf Zd二 H d n p 创+忌、、d x o u o d - (I )A p w q J x o u o d d x o u z d o H £n p =s 〕q p f z d =%-n p 、、—、、、、心 J x o u o d - (I)xp^p&Jxouod2Jxouzdo%w 〔OI 〕qeTzd=%-np 心T p g 'm x o u o d - u)APW*xouoddxouzd oUPTnp 二"App 〕qpfzd 二%-np ^+0、、d x ouocr(DAP^PQZXOUOmxouzdoudnp二SAPP〕qpfzd二%-np 、、—、、、、QJXOUOd J I ) A32Pcu q x o u o d £0 世dula=l; P2=tab [nhhs]; dula=O; P2二Oxff; PO二Oxef; delay (1) ; PO二Oxff; 〃时十位dula=l;P2=tab[nhhg]; dula=0;P2=0xff;PO=Oxdf; delay (1) ; PO二Oxff;//时个位dula=l;P2=tab[10];dula=0;P2=0xff; PO=Oxbf;delay(1); PO二Oxff dula=l:P2=tab [nmms] : dula=0; P2=0xff ;P0=0x7f; delay (1) ;PO=Oxff; //分十位dula=l;P2=tab[nmmg] :dula=0;P2=0xff;PO=Oxfe; delay (1) ; PO=Oxff;//分个位dula=l;P2=tab[10]; dula=0:P2=0xff;PO=Oxfd:delay(1) ; PO二Oxffdula=l ;P2=tab[nsss] : dula=0;P2=0xff ;PO=Oxfb; delay (1) ; PO二Oxff;//秒十位dula=l;P2=tab[nssg] ; dula=0: P2=0xff; PO=Oxf7; delay (1) ;PO=Oxff; //秒个位} if(setl—6) //设置闹钟定时dula=l; P2=tab [nhhs] ; dula=0; P2二Oxff; PO二Oxef; delay (1) ; PO二Oxff; 〃时十位dula=l;P2=tab[nhhg]; dula=0;P2=0xff;PO=Oxdf; delay (1) ; PO二Oxff;//时个位dula=l;P2=tab[10];dula=0;P2=0xff; PO=Oxbf;delay(1); PO二Oxff dula=l:P2=tab [nmms] : dula=0; P2=0xff ;P0=0x7f; delay (1) ;PO=Oxff; //分十位dula=l;P2=tab[nmmg] :dula=0;P2=0xff;PO=Oxfe;delay(1) ; PO二Oxff;//分个位dula=l;P2=tab[10]; dula=0;P2=0xff;PO=Oxfd:delay(1); PO二Oxff dula=l;P2=tab[nsss]; dula二0;P2二Oxff;P0二Oxfb;delay(l) ; PO二Oxff;//秒十位dula=l;P2=tab[nssg] ; dula=0: P2=0xff; PO=Oxf7; delay (1) ;P0二Oxff; //秒个位}baoshi () : //整点报时alarm () ; //闹钟}}void JishiO 〃计时函数辻(n二二20){n=0;ss++;辻(ss=60){ss二0;mm++;if(mm二二60){mm^O;hh++;辻(hh=24){hh二0;day++;week++;if(week==8){week二0;}if (year%4==0&&year%100! =0 year%400==0) //闰年if(day=二tablel[mon]+l){day=0;mon++;if(mon==13){mon二0;year++;}}else //非闰年{辻(day—table2 [mon]+l){day=0;mon++;辻(mon—13){mon二0;year++;}}}}}}}}uchar incone (uchar n) //加 1 函数{辻(k3=0){delay(20);if(k3==0){n++;while(!k3);}}return(n);}uchar decone(uchar m) //减 1 函数{ if (k4==0){delay(20);if(k4==0)辻(m<0){m 二0;}}}}void key_change() //kl 按键扫描{ if(kl==0){delay(20);if(kl==0){setl++;while(!kl);if(setl==7){setl二1;}}void key_set() //k2 按键扫描{if(k2==0){delay(20);{set2++;while(!k2);辻(set2=4){set2=l;}}}}void baoshi () //整点报时函数{ fm=O;}if(ss==l){fm=l;}}void alarm() //闹钟函数{uchar x;if(nhh==0){goto end;}if(hh==nhh&&mm二二nmm&&ss==nss)fm=O; delay(30); fm=l; delay(20); fm=0; delay(30); fm=l; delay(20); fm=0; delay(30); fm=l; delay(20); fm=0; delay(30); fm=l; delay (180);end:;}void set_time() //设置时间函数{辻(setl==2){辻(set2==l){hh=incone(hh);if(hh==24){hh=0;}if(hh==-l){hh二23;}hh二decone(hh);}mm=incone(mm); if(mm==60) {mm 二0;}if(mm==-l) {mm=59;}mm=decone(mm); }辻(set2=3){ss=incone(ss);辻(ss=60){ss=O;}if (ss—-1){ss=59;}ss二decone (ss);}void set_mdw() //设置月日星期函数{ 辻(setl==4) {辻(set2==l){mon=incone(mon);if(mon二二13){mon=l;}mon=decone(mon);if(mon==0){mon二12;}}if(set2==2)day=incone(day);if(day==32){day=l;} day=decone(day);if (day—0){day=31;}}辻(set2=3){week=incone(week);if(week==8){week二1;}week二decone(week);if(week==0){week=7;}}}void set_alarm() //设置闹钟函数{ if(setl二二6){辻(set2=l){nhh二incone(nhh);辻(nhh二二24) {nhh二0;}辻(nhh—-1){nhh二23;}nhh二decone(nhh); }if(set2==2){nmm二incone(nmm); if (nmm—60) {nmm二0;}nmm二decone(nmm); if (nmm 二二 T){nmm=59;}}辻(set2二二3) {nss=incone (nss); if (nss=60){nss=0;}nss二decone(nss); if(nss==-l){nss二59;}}}。

AT89C51单片机电子时钟设计

AT89C51单片机电子时钟设计

AT89C51单片机电子时钟设计目录1 电子时钟 (4)1.1 电子时钟简介 (4)1.2 电子时钟的基本特点 (4)1.3 电子时钟的原理 (4)2 单片机识的相关知识 (4)2.1单片机简介 (4)2.2 单片机的特点 (5)2.3 AT89C51单片机介绍 (5)3 设计方案的选择 (7)3.1计时方案 (7)3.2 显示方案 (7)3.3 数码管显示工作原理 (8)3.4 键盘电路设计 (9)3.5 主控模块AT89C51 (9)4 系统软件设计 (9)附录 (12)摘要:单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注。

单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。

由于具有上述优点,单片机已广泛地应用在工业自动化控制、自动检测、智能仪器仪表、家用电器、电力电子、机电一体化设备等各个方面,而51单片机是各单片机中最为典型和最有代表性的一种。

这次设计通过对它的学习、应用,以AT89C51芯片为核心,辅以必要的电路,设计了一个简易的电子时钟,它由4.5V直流电源供电,通过数码管能够准确显示时间,调整时间,从而到达学习、设计、开发软、硬件的能力。

关键词:单片机;电子时钟;AT89C511 电子时钟1.1 电子时钟简介本设计采用AT89C51单片机,以汇编语言为程序设计的基础,设计一个用六位数码管显示时、分、秒的时钟。

现代的电子时钟是基于单片机的一种计时工具,采用延时程序产生一定的时间中断,用于一秒的定义,通过计数方式进行满六十秒分钟进一,满六十分小时进一,满二十四小时小时清零,从而达到计时的功能,是人民日常生活不可缺少的工具。

1.2 电子时钟的基本特点现在高精度的计时工具大多数都使用了石英晶体振荡器,由于电子钟、石英钟、石英表都采用了石英技术,因此走时精度高,稳定性好,使用方便,不需要经常调试,数字式电子钟用集成电路计时时,译码代替机械式传动,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时、分、秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。

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口线,提高设计的可靠性。

单片机制作时钟实训报告

单片机制作时钟实训报告

随着科技的不断发展,单片机作为一种集计算机技术、微电子技术和自动控制技术于一体的综合性技术,已经在各个领域得到了广泛的应用。

为了提高我们的实践能力和创新意识,我们选择了单片机制作时钟这一实训项目,通过实际操作来深入了解单片机的应用和编程技巧。

二、实训目的1. 熟悉单片机的基本原理和结构。

2. 掌握单片机的编程方法和技巧。

3. 学会使用常用电子元器件,如数码管、按键等。

4. 培养团队合作精神和动手能力。

三、实训内容1. 硬件设计(1)选用MCS-51单片机作为核心控制器;(2)使用8位LED数码管显示时间,包括时、分、秒;(3)设计按键模块,实现时间设置、闹钟设定等功能;(4)设计电源模块,保证系统稳定运行。

2. 软件设计(1)编写时钟计数程序,实现时间的精确计数;(2)编写按键扫描程序,实现时间设置、闹钟设定等功能;(3)编写显示控制程序,实现时间信息的实时显示。

3. 系统调试(1)对硬件电路进行连接和调试,确保电路正常运行;(2)对软件程序进行调试,修正错误,优化性能;(3)进行功能测试,验证系统功能的正确性和稳定性。

1. 需求分析根据实训要求,分析时钟功能,确定硬件和软件设计方案。

2. 硬件选型与电路设计根据需求分析,选择合适的单片机、数码管、按键等元器件,并设计电路图。

3. 软件编程使用C语言编写时钟计数、按键扫描、显示控制等程序。

4. 实物制作与调试按照电路图焊接电路板,组装元器件,进行实物制作。

然后对硬件电路和软件程序进行调试,确保系统正常运行。

5. 功能测试与优化对系统进行功能测试,验证时钟的准确性、按键功能的可靠性、显示的清晰度等。

根据测试结果对系统进行优化,提高性能。

五、实训成果1. 成功制作了一款基于单片机的电子时钟,具有实时显示、时间设置、闹钟设定等功能;2. 掌握了单片机的基本原理和编程方法,提高了实践能力;3. 学会了使用常用电子元器件,为以后的学习和工作打下了基础。

六、实训总结通过本次单片机制作时钟实训,我们深入了解了单片机的应用和编程技巧,提高了实践能力和创新意识。

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. 学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。

2. 设计任务及要求利用实验平台上4个LED数码管,设计带有闹铃功能的数字时钟二,实验要求1、准确计时,以数字形式显示时、分、秒的时间。

2、小时以24小时计时形式,分秒计时为60进位。

3、校正时间功能,即能随意设定走时时间。

4、设计5V直流电源,系统时钟电路、复位电路。

三,实验基本原理1、STC89C51单片机介绍STC89C51单片机是由深圳宏晶公司代理销售的一款MCU,是由美国设计生产的一种低电压、高性能CMOS 8位单片机,片内含8kbytes的可反复写的FlashROM和128bytes的RAM,2个16位定时计数器[5]。

STC89C51单片机内部主要包括累加器ACC(有时也简称为A)、程序状态字PSW、地址指示器DPTR、只读存储器ROM、随机存取存储器RAM、寄存器、并行I/O接口P0~P3、定时器/计数器、串行I/O接口以及定时控制逻辑电路等。

这些部件通过内部总线联接起来,构成一个完整的微型计算机。

其管脚图如图所示。

STC89C51单片机管脚结构图VCC:电源。

GND:接地。

P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。

当P1口的管脚第一次写1时,被定义为高阻输入。

P0能够用于外部程序数据存储器,它可以被定义为数据/地址的第八位。

在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须被拉高。

P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。

P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。

在FLASH 编程和校验时,P1口作为第八位地址接收。

P2口:P2口为一个内部上拉电阻的8位双向I/O口,P2口缓冲器可接收,输出4个TTL门电流,当P2口被写“1”时,其管脚被内部上拉电阻拉高,且作为输入。

并因此作为输入时,P2口的管脚被外部拉低,将输出电流。

这是由于内部上拉的缘故。

P2口当用于外部程序存储器或16位地址外部数据存储器进行存取时,P2口输出地址的高八位。

在给出地址“1”时,它利用内部上拉优势,当对外部八位地址数据存储器进行读写时,P2口输出其特殊功能寄存器的内容。

P2口在FLASH编程和校验时接收高八位地址信号和控制信号。

P3口:P3口管脚是8个带内部上拉电阻的双向I/O口,可接收输出4个TTL门电流。

当P3口写入“1”后,它们被内部上拉为高电平,并用作输入。

作为输入,由于外部下拉为低电平,P3口将输出电流(ILL)这是由于上拉的缘故。

P3口也可作为AT89C51的一些特殊功能口,如下表所示:口管脚备选功能P3.0 RXD(串行输入口)P3.1 TXD(串行输出口)P3.2 /INT0(外部中断0)P3.3 /INT1(外部中断1)P3.4 T0(记时器0外部输入)P3.5 T1(记时器1外部输入)P3.6 /WR(外部数据存储器写选通)P3.7 /RD(外部数据存储器读选通)P3口同时为闪烁编程和编程校验接收一些控制信号。

RST:复位输入。

当振荡器复位器件时,要保持RST脚两个机器周期的高电平时间。

ALE/PROG:当访问外部存储器时,地址锁存允许的输出电平用于锁存地址的地位字节。

在FLASH编程期间,此引脚用于输入编程脉冲。

在平时,ALE 端以不变的频率周期输出正脉冲信号,此频率为振荡器频率的1/6。

因此它可用作对外部输出的脉冲或用于定时目的。

然而要注意的是:每当用作外部数据存储器时,将跳过一个ALE脉冲。

如想禁止ALE的输出可在SFR8EH地址上置0。

此时, ALE 只有在执行MOVX,MOVC指令是ALE才起作用。

另外,该引脚被略微拉高。

如果微处理器在外部执行状态ALE禁止,置位无效。

PSEN:外部程序存储器的选通信号。

在由外部程序存储器取指期间,每个机器周期两次/PSEN有效。

但在访问外部数据存储器时,这两次有效的/PSEN信号将不出现。

EA/VPP:当/EA保持低电平时,则在此期间外部程序存储(0000H-FFFFH),不管是否有内部程序存储器。

注意加密方式1时, /EA将内部锁定为RESET;当/EA端保持高电平时,此间内部程序存储器。

在FLASH编程期间,此引脚也用于施加12V编程电源(VPP)。

2、上电按钮复位电路本设计采用上电按钮复位电路:首先经过上电复位,当按下按键时,RST直接与VCC相连,为高电平形成复位,同时电解电容被电路放电;按键松开时,VCC 对电容充电,充电电流在电阻上,RST依然为高电平,仍然是复位,充电完成后,电容相当于开路,RST为低电平,单片机芯片正常工作。

其中电阻R2决定了电容充电的时间,R2越大则充电时间长,复位信号从VCC回落到0V的时间也长。

3、晶振电路本设计晶振电路采用12M的晶振。

晶振的作用是给单片机正常工作提供稳定的时钟信号。

单片机的晶振并不是只能用12M,只要不超过20M就行,在准许的范围内,晶振越大,单片机运行越快,还有用12M的就是好算时间,因为一个机器周期为1/12时钟周期,所以这样用12M的话,一个时钟周期为12us,那么定时器计一次数就是1us了,电容范围在20-40pF之间,这里连接的是30pF的电容。

机器周期=10*晶振周期=12*系统时钟周期四,实验设计分析设计用到的STC89C52单片机芯片的ISP下载线是通过单片机的TXD,RXD 引脚把程序烧进去的。

管脚TXD和RXD用于异步串行通信。

其实STC89C52单片机的ISP下载线就是一个max232芯片连接STC和计算机的串行通信口。

计算机把程序从九针串口送到max232芯片,电平转换后送进单片机的串行口,也就是TXD和RXD。

然后单片机的串行模块把数据送到程序区。

五,实验要求实现A.电路设计1. 整体设计此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用8个共阴数码管分别显示,星期(年份),小时、分钟(月份)和秒(日),通过动态扫描进行显示,从而避免了译码器的使用,同时节约了I/0端口,使电路更加简单。

单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。

电路的总体设计框架如下:输入部分单输出部分片机晶振和复位2. 分块设计模块电路主要分为:输入部分、输出部分、复位和晶振电路。

2.1 输入部分输入信号主要是各种模式选择和调整信号,由按键开关提供。

以下为输入部分样例:在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。

对于P0口,由于其存在高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示:2.2 输出部分本电路的输出信号为7段数码管的位选和段选信号,闹铃脉冲信号,提示灯信号。

本实验的数码管是共阴的,为了防止段选信号不能驱动数码管,故在P1口连接上拉电阻后,再送段选信号,以提高驱动,位选信号直接从P2口接入,如下图:闹铃由P2.6端输出,模块如下:2.3 晶振与复位电路本实验单片机时钟用内部时钟,模块如下:复位电路为手动复位构成,模块如下:各模块拼接组合,电路总体设计图如下:B.程序设计B.1 程序主要模块B.1.1 延时模块数码管显示动态扫描时,用到延时程序,这里使用延迟1ms的程序,此程序需要反复调用程序如下:D_1MS:MOV R7,#2D_5:MOV R2,#250DJNZ R2,$DJNZ R7,D_5RET除数码管动态扫描外,数码管的闪烁提示,以及音乐模块也用到了延时,只是延时的长短不同罢了,在此不再赘述。

B.1.2中断服务程序本实验中,计数器T0,T1中断都有运用,其中T0中断为时钟定时所用,T1中断用于音乐播放。

T0的定时长度为0.01s,工作于方式1,计数1次,时长1us,故计数器计数10000次,进入中断,计数初值为65536-10000=55536=#0D8F0,装满定时器需要0.01s的时间,从而100次中断为一秒,一秒之后,判断是否到60秒,若不到则秒加一,然后返回,若到,则秒赋值为0,分加一,依次类推。

包括日期显示的功能也是如此。

另外,由于要实现倒计时功能,因此在中断程序中还要加入减一的寄存器,需要时将其进行显示。

基于以上考虑,以R3为倒计时中的秒,R4为倒计时的分,当秒加1时R3减一,减到0之后,秒赋值为59,分减一,直到分为0。

本实验用8个数码管,刚好能显示年,月,日,扫描显示与时间的扫描显示类似。

年比较特殊,由两个寄存器存储,个位,十位为0时,表明年数能被100整除,若此时千位,百位组成两位数能被4整除,则年数被400整除,为闰年。

若十位,个位组成两位数能被4整除,则年数能被4整除,为闰年。

B.1.3主程序主程序主要对按键进行扫描,以及判断定时和闹铃时间是否已到,若到则调用相关程序,该段程序如下:MAIN:JNB P3.0,DATETZ ;按下0键,显示日期并可对日期进行调整JNB P3.1,ZSTZ1 ;按下1键,显示时间,并可调时JNB P3.2,NLTZZ ;按下2键,进行闹铃设置JNB P3.3,DSTZ ;按下3键,进行定时设置JNB P3.4,CESHI ;闹铃测试JNB P3.6,STOPWATCHTZ ;按下6键,进入秒表方式ACALL DISP ;调用时钟显示子程序JNB P0.6,RERING ;判断是否开启闹铃重响功能RE: JNB P2.7,DSPDKQ ;判断是否开启闹铃功能,没开则去判断定时FMQPD: ;判断定时值R4,R3是否到零、闹铃时刻是否已到MOV A,HOUR;SUBB A,38H;JZ FEN ;判断小时数是否到闹铃所定时间,若到,则对分进行判断;若不到,则对定时进行判断AJMP DSPDKQFEN:MOV A,MINUTE;SUBB A,37H;JZ MIAO ;判断分是否到闹铃所定时间,若到,则对秒进行判断;若不到,则对定时进行判断AJMP DSPDKQMIAO:MOV A,SECONDSUBB A,#0JZ SHENGYIN1 ;判断秒是否到闹铃所定时间,若到,则时,分,秒都到达闹铃时刻,进入响铃子程序;若不到则判断定时RERING: ;闹铃重响判断程序JNB F0, RE ;标志位F0为0,不进行闹铃重响设定CPL F0MOV 3CH,#1 ;定时判断标志位赋1,定时判断功能开启JNB P0.7,M1 ;闹铃重响间隔时间选取MOV R4,#0 ;闹铃重响间隔30秒MOV R3,#30AJMP MAINM1: ;闹铃重响间隔60秒MOV R4,#1MOV R3,#0AJMP MAINDSPDKQ: ;判断是否应该进行定时判断MOV A,3CH ;3CH是引入的判断因子,当其为0时,不对定时时间是否到0进行判断JNZ DSPD2 ;当3CH不是0时,跳转到定时判断程序AJMP MAINDSPD2:MOV A,R4;JZ S_PD ;R4所存定时分数为0,则转而判断R3所存定时秒数AJMP MAIN;S_PD:MOV A,R3;JNZ MAIN ;R4,R3所存参数减为0,定时长度已到JNB P0.6,SHENGYIN2 ;闹铃重响功能开启时,跳入响铃程序AJMP TISHI ;不是闹铃重响定时,则定时时间到时,跳入提示程序CESHI:ACALL RINGAJMP MAINSHENGYIN1: ;调用响铃子程序LCALL RINGAJMP MAINSHENGYIN2:SETB F0 ;闹铃重响标志位设定LCALL RING ;响铃CLR F0 ;标志位复位AJMP MAINNLTZZ:AJMP NLTZ1 ;跳入闹铃调整程序DSTZ:AJMP DSTZ1 ;跳入定时调整程序DATETZ:AJMP DATETZ1 ;跳入日期调整程序STOPWATCHTZ:AJMP STOPWATCHTZ1 ;跳入秒表程序B.1.4 显示子程序8个数码管轮流进行显示,分别显示1ms,依赖人的视觉暂留效应,给人以数码管持续高亮的错觉。

相关文档
最新文档