单片机大全程序电子闹钟
单片机电子闹钟程序亲自编写-可用
单片机电子闹钟程序(亲自编写-可用)————————————————————————————————作者:————————————————————————————————日期:学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。
其中正常时间显示和闹钟时间显示可用一个开关来调整。
芯片选择STC89C52程序:#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int//定义显示段码uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};uchar codebbtime[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; uchar clock[]={0,0,0,0};uchar clock1[]={12,30,0};uchar weikong[6];uchar bbduration=4;uchar lingtime=9;//学校打铃时间组uchar shangwu1[]={8,30};uchar shangwu2[]={10,0};uchar shangwu3[]={10,20};uchar shangwu4[]={11,50};uchar xiawu1[]={13,30};uchar xiawu2[]={15,00};uchar xiawu3[]={15,15};uchar xiawu4[]={16,45};//按键定义sbit mode=P1^7;sbit sec_clr=P1^0;sbit min_set_add=P1^3;sbit min_set_sub=P1^4;sbit hour_set_add=P1^1;sbit hour_set_sub=P1^2;sbit bb_set_add=P1^5;sbit bb_set_sub=P1^6;sbit speaker=P2^6;//延时函数void delay(unsigned int t){while(t--);//时钟进位函数void clockjinwei(){clock[0]++;if(clock[0]==20){clock[1]++;clock[0]=0;if(clock[1]==60){clock[2]++;clock[1]=0;if(clock[2]==60){clock[3]++;clock[2]=0;if(clock[3]==24)clock[3]=0;}}}}//定时器0中断服务函数void timer0(void) interrupt 1 using 1 {TMOD=0x01;TH0=0x3c;TL0=0xb0;clockjinwei();}//时钟分位显示函数void fenwei(){weikong[0]=clock[3]/10;weikong[1]=clock[3]%10;weikong[2]=clock[2]/10;weikong[3]=clock[2]%10;weikong[4]=clock[1]/10;weikong[5]=clock[1]%10;}//闹钟分位显示函数void naofen(){weikong[0]=clock1[0]/10;weikong[1]=clock1[0]%10;weikong[2]=clock1[1]/10;weikong[3]=clock1[1]%10;weikong[4]=clock1[2]/10;weikong[5]=clock1[2]%10; }//闹钟定时显示函数void naozhongdisplay(){uchar z,s;uchar x=0x01;naofen();for(z=0;z<6;z++){P2=0;P0=table[weikong[z]];P2=x;x=_crol_(x,1);for(s=0;s<255;s++);}}//时钟显示函数void display(){uchar i,j;uchar x=0x01;fenwei();for(i=0;i<6;i++){P2=0;P0=table[weikong[i]];P2=x;x=_crol_(x,1);for(j=0;j<255;j++);}}//总显示函数void zhongxian(){if(mode==1)delay(100);if(mode==1)display();if(mode==0)delay(100);if(mode==0)naozhongdisplay();}//按键处理程序void key_set(){zhongxian();P1=0xff;if(min_set_add==0){delay(100);if(min_set_add==0){if(mode==1){clock[2]++;if(clock[2]==60){clock[2]=0;}while(min_set_add==0)zhongxian();}}if(mode==0){clock1[1]++;if(clock1[1]==60){clock1[1]=0;}while(min_set_add==0)zhongxian();}}//if(min_set_sub==0){delay(100);if(min_set_sub==0){if(mode==1){clock[2]--;if(clock[2]==0)clock[2]=59;}while(min_set_sub==0)zhongxian();if(mode==0){clock1[1]--;if(clock1[1]==0)clock1[1]=59;}while(min_set_sub==0)zhongxian();}}//if(hour_set_add==0){delay(100);if(hour_set_add==0){if(mode==1){clock[3]++;if(clock[3]==24){clock[3]=0;}while(hour_set_add==0)zhongxian();}if(mode==0){clock1[0]++;if(clock1[0]==24){clock1[0]=0;}while(hour_set_add==0)zhongxian();}}}//if(hour_set_sub==0){delay(100);if(hour_set_sub==0){if(mode==1){clock[3]--;if(clock[3]==0)clock[3]=23;}while(hour_set_sub==0)zhongxian();if(mode==0){clock1[0]--;if(clock1[0]==0)clock1[0]=23;}while(hour_set_sub==0)zhongxian();}}//if(sec_clr==0){delay(100);if(sec_clr==0){clock[1]=0;}while(sec_clr==0)zhongxian();}}//闹钟响铃函数void bb(){if(clock[1]<=bbduration){speaker=1;delay(100);speaker=0;}else speaker=0;}//打铃函数void daling(){if(clock[1]<=lingtime){speaker=1;delay(100);speaker=0;}else speaker=0;}//时间比较函数void bijiao(){if(clock[3]==shangwu1[0]){if(clock[2]==shangwu1[1])daling();}if(clock[3]==shangwu2[0]){if(clock[2]==shangwu2[1])daling();}if(clock[3]==shangwu3[0]){if(clock[2]==shangwu3[1])daling();}if(clock[3]==shangwu4[0]){if(clock[2]==shangwu4[1])daling();}if(clock[3]==xiawu1[0]){if(clock[2]==xiawu1[1])daling();}if(clock[3]==xiawu2[0]){if(clock[2]==xiawu2[1])daling();}if(clock[3]==xiawu3[0]){if(clock[2]==xiawu3[1])daling();}if(clock[3]==xiawu4[0]){if(clock[2]==xiawu4[1])daling();}}//闹钟比较void naobijiao(){if(clock[3]==clock1[0]){if(clock[2]==clock1[1]||clock[2]==clock1[1]+1||clock[2]==clock1[1]+2) bb();}}//响铃时长显示函数void bbtimeshow(){P3=bbtime[bbduration];if(bbduration>15)bbduration=0;}//响铃按键处理函数void bbtime_set(){bbtimeshow();if(bb_set_add==0){delay(100);if(bb_set_add==0)bbduration++;while(bb_set_add==0)bbtimeshow();}if(bb_set_sub==0){delay(100);if(bb_set_sub==0)bbduration--;while(bb_set_sub==0)bbtimeshow();}}//主程序void main(){EA=1;ET0=1;TR0=1;while(1){key_set();bijiao();bbtime_set();naobijiao();}}电路图:分四部分显示:如果在学习这个程序过程中有什么问题,可以发邮件到询问。
基于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单片机的工作原理基于冯诺伊曼体系结构,即程序指令和数据存储在同一块存储器中,通过总线系统进行传输。
单片机课程设计(电子闹钟)
《单片机原理及应用》课程设计报告电子记忆闹钟专 业 : 电气工程及其自动化班 级 : 10电工一班学 号 : 2010401020102姓 名 : 张 祥指导教师 : 邹 云 峰提交日期 : 2013-06-13JINGCHU UNIVERSITY OF TECHNOLOGY目录一:设计题目及要求二:设计方案2.1 方案论证2.2 系统各器件简介2.3 各部分电路设计仿真2.4 成品图片秀三:电子时钟程序设计与调试3.1 程序设计思路3.2软件调试及解决的问题3.3 附加功能四:课程设计总结五:参考文献附录:源程序一、设计任务和要求。
单片机课程设计题目:电子闹钟。
设计要求:1、能实现时、分、秒的显示;2、能实现12和24小时制的切换;3、能设定时间;4、能设定闹钟。
二:设计方案2.1 方案论证显示电路的设计方案一:LCD1602液晶屏:LCD1602液晶屏是16*2的字符型液晶,可以显示英文26个字母的大小写,阿拉伯数字0—9,及一些简单的符号。
该液晶屏操作简单,显示功能强大。
方案二:数码管:虽然数码管的显示位数有限,且只能显示一些简单的字符。
综上所述,我们选择了LCD1602作为显示模块。
时钟芯片:方案一:ds12c887由于DS12C887能够自动产生世纪、年、月、日、时、分、秒等时间信息,DS12C887中自带有锂电池,外部掉电时,其内部时间信息还能够保持10年之久;对于一天内的时间记录,带有128字节RAM.性能优异,但价格相对较贵。
方案二:ds1302美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟电路DS1302的结构、工作原理及其在实时显示时间中的应用。
它可以对年、月、日、周、日、时、分、秒进行计时,且具有闰年补偿等多种功能,价格便宜,但是没有闹钟中断功能。
综上所述,我们选择了ds12c887作为时钟芯片。
单片机芯片方案一:89c52基于标准的MCS-51单片机体系结构和指令系统,集成了时钟输出和向上或向下计数器等更多的功能,适合于类似马达控制等应用场合。
C51单片机实现电子闹钟
课程名称:单片机原理与接口技术实践设计课题:基于MCS 51单片机实现电子闹钟功能的设计学院:电子与信息工程学院专业:通信工程小组成员:电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。
本文给出了一种基于MCS51单片机实现电子闹钟功能的设计方法,从而给人们带来更为方便的工作与生活。
一.电子闹钟简介我们设计的电子闹钟是以MCS 51单片机中的计时器作为时钟,用8位数码管显示当前时间,并且可以设置闹钟时间,并在设置的时间点发出闹铃。
简易闹钟具有以下功能:1.时钟能准确地走时,并可以通过数码管进行显示2.复位后可以进行当前时间的设置3.可以随意设置闹钟时间,闹钟会在设置时间响铃整个系统的任务要求:1)输入数字按键的功能。
保证数字的输入。
2)复位电路的功能。
所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间);3)显示电路的功能。
当输入数字时显示24小时时间功能。
4)闹铃功能设置闹铃的时间后.能按设置好的时间准时闹铃。
二.系统方案的设计要求根据以上各模块并结合显示屏的功能及元器件材料的情况,决定采用AT89C51为核显示设计方案。
先进行系统的整体规划确定整个系统的功能,然后按照每个功能的具体要求,进行各个模块的实物设计并逐个调试,待全部通过后,进行整个系统的联调,最终实现一个完整的系统。
整个系统的设计步骤如下:在单片机最小系统的基础上,完成按键电路和复位电路的设计。
完成显示电路、数字按键、单片机时钟电路。
Ⅰ硬件设计系统硬件的设计可以根据系统的各个功能,把整个系统划分成若干个模块,分别对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能的调度。
本系统涉及到的硬件模块有:按键电路、数码管显示电路、单片机时钟电路、蜂鸣器电路。
各部分实现功能如下:按键电路:提供按键信号。
单片机时钟电路、复位电路:提供部时钟。
单片机实训 ——基于单片机的电子闹钟设计
单片机实训——基于单片机的电子闹钟设计学院:电子与通信工程学院专业:电子信息工程技术班级:信息122姓名:冯健学号:22指导老师:邬志锋、香永辉实训时间:2013年6月30日-7月5日目录绪论 (3)第一章总体设计方案 (3)1.1 目的 (3)1.2 要求 (3)1.3 工作原理 (4)1.4 思路 (4)第二章系统硬件设计 (4)2.1 系统的硬件设计框 (4)2.2 主要单元的电路设计 (4)2.2.1 单片机最小系统 (4)2.2.2 DS1302时钟电路 (5)2.2.3 LCD1602液晶显示电路 (5)2.2.4 键盘电路 (6)第三章系统的软件设计 (6)3.1 主程序流程图 (6)3.2 时钟程序流程图 (7)第四章结束语 (7)附录 (8)绪论时钟的数字化,大力推动了计时的准确性和可靠性。
在单片机构成的装置中,实时时钟是必不可少的部件。
时钟芯片DS1302与单片机同步通信构成数字时钟电路。
DS1302的后背电源及对后背电源进行涓细电流充电功能保证电路断电后仍能保存时间和数据信息等。
该时钟电路强大的功能和优越的性能,在很多领域的应用中,尤其是某些自动化控制、长时间无人看守的测控系统等对时钟精确性和可靠性有较高的场合,具有很高的使用价值。
第一章总体设计方案1.1目的1)加深了对ds1302时钟芯片及其应用;2)了解了lcd1602液晶显示屏的工作原理和内部结构;3)能够熟练的应用lcd1602来做一些小制作。
1.2 要求1)根据系统设计的要求和设计思路,确定该系统的系统设计结构如图1所示。
电路整体上分为控制和显示部分,以单片机最小系统为核心电路,控制LCD显示,具体的显示内容和方式由软件来完成;图(1)2)由于有时钟和日期的调节功能需要校准电路和基本的复位电路,复位电路采用按键复位,调节键、加1键、确定键,闹钟调节键,共五键,计时功能由DS1302完成,显示功能则由LCD1602液晶完成。
基于51单片机,电子显示时钟带闹钟、整点报时、日期、星期
{ StrTab[1]=second/10; //秒十位
StrTab[0]=second%10; //秒个位
StrTab[2]=10; //间隔符-
StrTab[4]=minute/10; //分十位
StrTab[3]=minute%10; //分个位
StrTab[5]=10; //间隔符-
void display(uchar w[32])
{ unsigned int i,j,c=0;
if(a==0)//正常时间显示
{ for(i=0;i<8;i++) //依次将数组w中八个数取出,并显示
{ P2=weikong_code[i]; //位选
j=w[i]; //取出要显示的数码
P0=tab[j]; //取出段选编码
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}
week++;//星期走
if(week==8)
week=1;
data1();
week1();
while(second==err);
}
}
/**********************键盘扫描子程序*************************/
{if(dБайду номын сангаасy==30); //闰年29天
{day=1; month++;
if(month==13)
{month=1; year++;
if(year==10000)
year=0;}}}
基于单片机控制的智能定时闹钟设计(含完整程序仿真图)
摘要本设计是定时闹钟的设计,由单片机AT89C51芯片和LED数码管为核心,辅以必要的电路,构成的一个单片机电子定时闹钟。
电子钟设计可采用数字电路实现,也可以采用单片机来完成。
数字电子钟是用数字集成电路构成的,用数码管显示“时”,“分”,“秒”的现代计时装置。
若用数字电路完成,所设计的电路相当复杂,大概需要十几片数字集成块,其功能也主要依赖于数字电路的各功能模块的组合来实现,焊接的过程比较复杂,成本也非常高。
若用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,所以在该设计中采用单片机利用AT89C51,它是低功耗、高性能的CMOS型8位单片机。
片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。
另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。
AT89C51单片机结合七段显示器设计的简易定时闹铃时钟,可以设置现在的时间及显示闹铃设置时间,若时间到则发出一阵声响,进—步可以扩充控制电器的启停。
设计内容包括了秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分的设计。
采用四个开关来控制定时闹钟的工作状态,分别为:K1、设置时间和闹钟的小时;K2、设置小时以及设置闹钟的开关;K3、设置分钟和闹钟的分钟;K4、设置完成退出。
课设准备中我根据具体的要求,查找资料,然后按要求根据已学过的时钟程序编写定时闹钟的程序,依据程序利用proteus软件进行了仿真试验,对出现的问题进行分析和反复修改源程序,最终得到正确并符合要求的结果。
设计完成的定时闹钟达到课程设计的要求,在到达定时的时间便立即发出蜂鸣声音,持续一分钟。
显示采用的六位数码管电路,如果亮度感觉不够,可以通过提升电阻来调节,控制程序中延迟时间的长短,可以获得不同的效果。
单片机汇编程序电子闹钟
电子闹钟课程设计摘要:本课程设计主要就是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟。
它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。
硬件设计的主要任务就是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。
合理的软件结构就是设计出一个性能优良的单片机应用性系统软件的基础,因此必须充分重视。
编写完程序后在用Proteus软件仿真检查设计就是否合理。
一.课程设计的概况通过对51单片机的扩展,接键盘,显示器等相应的外围器件。
在LED显示器中分成静态显示与动态显示两类,在本设计中主要用了它的动态显示功能,动态显示利用了人视觉的短暂停留,在数据的传输中就是一个一个传输的,且先传输低位。
键盘就是由若干个按键组成的开关矩阵,就是一种廉价的输入设备。
键盘通常包括有数字键,字母键以及一些功能键。
操作人员可以通过对键盘向计算机输入数据,地址,指令或其她的控制命令,实现简单的人机对话。
这里采用非编码式键盘。
通过51单片机的P1口扩展出独立连接式键盘。
外围扩展复位,时钟电路,利用软件源程序代码实现相应的功能。
二.课程设计实现的功能:1.能显示时时-分分-秒秒。
2、能够设定定时时间,修改定时时间。
3、定时时间到能发出警报声或者启动继电器,从而控制电器的起停。
三.设计方案使用就是单片机作为核心的控制元件,使得电路的可靠性比较高,功能也比较强大, 而且可以随时的更新系统,进行不同状态的组合。
本系统采用单片机AT89C51作为本设计的核心元件,利用7段共阴LED作为显示器件。
接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器的起停时间到,从而控制电器的起停。
电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示,报警电路,芯片选用AT89C51 单片机。
单片机电子闹钟的设计与制作
目录1 . 绪论 (1)1.1概述 (1)1.1.1 51电子闹钟发展趋势 (1)1.1.2 本课题研究的主要内容 (1)1.251电子闹钟简介 (1)1.2.1 开发的目的和意义 (2)1.2.2 51电子闹钟的优点 (2)1.2. 3 51电子闹钟的特点 (2)2. 系统方案的设计 (3)2.1系统概述 (3)2.1.1系统方案的确定 (3)2.1.2系统设计思路与步骤 (3)2.2芯片基本工作原理及其应用 (5)2.2.1引脚介绍 (4)2.2.2电源 (5)2.2.3存储器 (5)2.2.4应用 (5)2.3.1 LM386介绍 (6)2.3.2 LM386特点..................................... 错误!未定义书签。
3.系统的设计 (8)3.1.1单片机系统的设计 (8)3.1.2 按键电路的设计 (9)3.1.3复位电路的设计 (10)3.1.4显示电路的设计 (9)3.2系统软件的设计 (10)3.2.1软件设计 (10)3.2.2整个系统软件部分的总体设计 (16)4.系统的调试和性能分析 (16)4.1系统的调试方法 (16)4.1.1输入按键的调试 (16)4.1.2复位电路的调试 (17)4.1.3显示电路的调试 (17)4.1.4整个系统的联调 (17)参考文献 (19)附录1 原理图 (16)附录3 (程序) (17)1 .绪论1.1概述电子闹钟在科学技术高度发展的今天,千家万户都少不了它,所以很多家庭个人都需要有一个电子闹钟,为人们提供报时方便,但普通电子闹钟不够方便实用。
本文给出了一种以51芯片电子闹钟设计方法,从而给人们带来更为方便的工作与生活。
1.1.1 51电子闹钟发展趋势现代的快节奏生活给人们的精神上带来了很大压力。
如何排解或缓解这些压力已经成为很多人关心的问题。
单片机电子闹钟是具发前闹钟创新性的系统,它代表了时代的发展趋势。
单片机汇编程序电子闹钟
电子闹钟课程设计摘要:本课程设计主要就是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时得电子钟.它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。
硬件设计得主要任务就是根据总体设计要求,以及在所选机型得基础上,确定系统扩展所要用得存储器,I/O电路及有关外围电路等然后设计出系统得电路原理图。
合理得软件结构就是设计出一个性能优良得单片机应用性系统软件得基础,因此必须充分重视.编写完程序后在用Proteus软件仿真检查设计就是否合理. 一。
课程设计得概况通过对51单片机得扩展,接键盘,显示器等相应得外围器件。
在LED显示器中分成静态显示与动态显示两类,在本设计中主要用了它得动态显示功能,动态显示利用了人视觉得短暂停留,在数据得传输中就是一个一个传输得,且先传输低位。
键盘就是由若干个按键组成得开关矩阵,就是一种廉价得输入设备。
键盘通常包括有数字键,字母键以及一些功能键。
操作人员可以通过对键盘向计算机输入数据,地址,指令或其她得控制命令,实现简单得人机对话。
这里采用非编码式键盘。
通过51单片机得P1口扩展出独立连接式键盘。
外围扩展复位,时钟电路,利用软件源程序代码实现相应得功能。
二.课程设计实现得功能:1。
能显示时时-分分-秒秒。
2、能够设定定时时间,修改定时时间。
3、定时时间到能发出警报声或者启动继电器,从而控制电器得起停.三。
设计方案ﻩ使用就是单片机作为核心得控制元件,使得电路得可靠性比较高,功能也比较强大,而且可以随时得更新系统,进行不同状态得组合.本系统采用单片机AT89C51作为本设计得核心元件,利用7段共阴LED作为显示器件。
接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器得起停时间到,从而控制电器得起停。
电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示,报警电路,芯片选用AT 89C51 单片机。
51单片机设置的电子闹钟(可调时间和闹钟)
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0 // 数码管的段选#define LIGHT P1 // 时分秒位的指示灯#define WS P2 // 数码管的位选sbit key1=P3^0; // 时间暂停/开始sbit key2=P3^1; // 时间/闹钟设置sbit key3=P3^2; // 增加sbit key4=P3^3; // 减少sbit alarm=P3^6; // 闹铃uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9 uchar tab_dp[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 0.-9.(带小数点)uchar data1[]={0,0,0,0,0,0};uchar data2[]={0,0,0,0,0,0};uint t,k,kk,k1,flag;uint bbh,bbm,bbs,bbh1,bbm1,bbs1;uint sec,min,hour,sec1,min1,hour1; // 定义秒,分,时void init();void display();void display_bb();void delay( uint );void keyscan();void main(){init();while(1){keyscan();if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if((bbh==hour)&&(bbm==min)&&data1[4]==0&&data1[5]==5) // 5s报时{alarm=~alarm;delay(1);}if((bbs==sec)&&(bbm==min)&&(bbh==hour)) // 可调报时{alarm=~alarm;delay(1);}}}void init(){WS=LIGHT=flag=0;sec=min=hour=0; // 将0赋给时分秒TMOD=0x01; // 方式1 P129(见课本)TH0=0x3c; // 65536-50000=15536=0x3cb0(50ms) P128(见课本)TL0=0xb0;EA=1; // 开总中断 P161(见课本)TR0=1; // 定时/计数器0开启ET0=1; // 定时器/计数器0溢出中断启动 P161(见课本)}void delay( unsigned int t) // 延时函数{unsigned int i;while(t--)for(i=0;i<125;i++);}void display() // 显示时间函数{if(TF0==1) // 定时器/计数器溢出 P130(见课本){TF0=0; // 清中断标志位t++;if(t==20) // (50ms*20=1s){t=0;sec++; // 秒加1if(sec==60) // 秒为60,则清零,分加1 {sec=0;min++;}if(min==60) // 分为60,则清零,时加1{min=0;hour++;}if(hour==24)// 时为24,则清零{hour=0;}}}data1[5]=sec%10;data1[4]=sec/10;data1[3]=min%10;data1[2]=min/10;data1[1]=hour%10;data1[0]=hour/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data1[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data1[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data1[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data1[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data1[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data1[0]];delay(1);}void display_bb() // 显示闹钟函数{data2[5]=bbs%10;data2[4]=bbs/10;data2[3]=bbm%10;data2[2]=bbm/10;data2[1]=bbh%10;data2[0]=bbh/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data2[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data2[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data2[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data2[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data2[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data2[0]];delay(1);}void keyscan() // 键盘扫描{if(key1==0) // 暂停/开始{++kk;while(!key1){display();if(kk==1){TR0=0;if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if(key2==0) // 模式选择(调节时间/闹钟){k1++;while(!key2){if(k1==1) // 第1次按下{sec1=sec; // 保存秒的数值sec=88; // 显示88,表示可以调节秒的数值了display(); // 显示88sec=sec1; // 恢复前一刻秒的数值}if(k1==2){min1=min;min=88;display();delay(1);min=min1;}if(k1==3){hour1=hour;hour=88;display();delay(1);hour=hour1;}if(k1==4){sec1=bbs; // 保存秒的数值bbs=66; // 显示66,表示可以调节秒的数值了display_bb(); // 显示66bbs=sec1; // 恢复前一刻秒的数值}if(k1==5){min1=bbm;bbm=66;display_bb();delay(10);bbm=min1;}if(k1==6){hour1=bbh;bbh=66;display_bb();delay(10);bbh=hour1;}if(k1==7){k1=0;display();}}}if(key3==0) // 时间/闹钟增加设置{while(!key3){if(k1==1){sec++; // 秒加1delay(60);if(sec==60)sec=0;display();}if(k1==2){min++;delay(60);if(min==60)min=0;display();}if(k1==3){hour++;delay(60);if(hour==24)hour=0;display();}if(k1==4){bbs++; // 秒加1delay(60);if(bbs==60)bbs=0;display_bb();}if(k1==5){bbm++;delay(60);if(bbm==60)bbm=0;display_bb();}if(k1==6){bbh++;delay(60);if(bbh==24)display_bb();}if(k1==7){k1=0;display();}}}if(key4==0) // 时间/闹钟减少设置 {while(!key4){if(k1==1){sec--; // 秒加1delay(60);if(sec==0)sec=60;display();}if(k1==2){min--;delay(60);if(min==0)min=60;display();}if(k1==3){hour--;delay(60);if(hour==0)hour=24;display();}if(k1==4){bbs--; // 秒减1delay(60);if(bbs==0)display_bb();}if(k1==5){bbm--;delay(60);if(bbm==0)bbm=60;display_bb();}if(k1==6){bbh--;delay(60);if(bbh==0)bbh=24;display_bb();}if(k1==7){k1=0;display();}}}}}if(kk==2){kk=0;k1=0;TR0=1;}}}。
单片机实验报告(闹钟)
单片机实验(闹钟部分修改版)注:第一个是利用延时程序做的定时,循环太多定时不够精确;这一个用的是出栈和入栈的算法进行的定时,可以增加定时的精度。
程序目的说明:这是一个闹钟程序,当按下K1的时候,开始计时(说明:为了方便观察,我以10s 中作为基本定时进行演示,如果需要其他定时可以通过修改部分程序得到),时间达到后,7段显示器和LED 灯同时闪烁,若序号归零,则按下K2计时则停止。
然后再按下K1计时又从新开始,以此类推。
电路图:LED6位七段码显示灯,从左到往右两位一组,分别显示HOUR, MINUTE,SECOND.因为P0口内部没有上拉电阻,不能输出高电平,所以要接上拉电阻。
排阻就是好多电阻连载一起,他们有一个公共端.由于是上拉电阻,所以1接VCC 。
晶振电路,帮助减小计时过程中产生的误差。
K1开关和P1.1口相连,K2和P2.2口相连,分别用于控制计时的开启和关闭LED 灯,计时到达的时候LED 灯闪烁,计时t 停止时LED 灯熄灭。
程序段:程序说明:1.直接将开关定义为各个接口,可以方便之后程序中利用各个开光的状态进行跳转。
2.利用了计数/定时器0作为外部中断,当中断产生,自动跳入计时状态;3.此段定义的是而二进制的时间存储单元。
4.此段定义的是需要计时(亮灯)的时间,我设定的10s亮灯,所以s为0ah,其他的均为00h5.此段定义的是BCD码得时间,为了可以在七段显示器上面显示6.主程序中要调用闹钟程序timebear检测设定时间是否到达和显示时间的子程序display1.7.timebear程序段用于检测闹铃设定的时间是否达到,依次从second(s),minute(m),hour (h)检测,出现不匹配的就不再向下执行,若时间匹配就跳转至timecome。
8.timecome程序段主要控制P3.7口,时间达到的时候,使LED灯和7短码显示器点亮并闪烁,如果要不要灯和七段码显示器闪烁则删除:mov r7,#250t2:mov r6,#124t3:djnz r6,t3djnz r7,t2setb p3.7这一段程序即可,这一段相当于机器周期,是灯的闪亮延时,就出现了闪烁的状态。
单片机汇编程序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单片机设置的电子闹钟(可调时间和闹钟)
#include<reg52.h>#define uint unsigned int#define uchar unsigned char#define LED P0 // 数码管的段选#define LIGHT P1 // 时分秒位的指示灯#define WS P2 // 数码管的位选sbit key1=P3^0; // 时间暂停/开始sbit key2=P3^1; // 时间/闹钟设置sbit key3=P3^2; // 增加sbit key4=P3^3; // 减少sbit alarm=P3^6; // 闹铃uchar tab[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; // 0-9uchar tab_dp[10]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef}; // 0.-9.(带小数点)uchar data1[]={0,0,0,0,0,0};uchar data2[]={0,0,0,0,0,0};uint t,k,kk,k1,flag;uint bbh,bbm,bbs,bbh1,bbm1,bbs1;uint sec,min,hour,sec1,min1,hour1; // 定义秒,分,时void init();void display();void display_bb();void delay( uint );void keyscan();void main(){init();while(1){keyscan();if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if((bbh==hour)&&(bbm==min)&&data1[4]==0&&data1[5]==5) // 5s报时{alarm=~alarm;delay(1);}if((bbs==sec)&&(bbm==min)&&(bbh==hour)) // 可调报时{alarm=~alarm;delay(1);}}}void init(){WS=LIGHT=flag=0;sec=min=hour=0; // 将0赋给时分秒TMOD=0x01; // 方式1 P129(见课本)TH0=0x3c; // 65536-50000=15536=0x3cb0(50ms) P128(见课本)TL0=0xb0;EA=1; // 开总中断P161(见课本)TR0=1; // 定时/计数器0开启ET0=1; // 定时器/计数器0溢出中断启动P161(见课本)}void delay( unsigned int t) // 延时函数{unsigned int i;while(t--)for(i=0;i<125;i++);}void display() // 显示时间函数{if(TF0==1) // 定时器/计数器溢出P130(见课本){TF0=0; // 清中断标志位t++;if(t==20) // (50ms*20=1s){t=0;sec++; // 秒加1if(sec==60) // 秒为60,则清零,分加1{sec=0;min++;}if(min==60) // 分为60,则清零,时加1{min=0;hour++;}if(hour==24)// 时为24,则清零{hour=0;}}}data1[5]=sec%10;data1[4]=sec/10;data1[3]=min%10;data1[2]=min/10;data1[1]=hour%10;data1[0]=hour/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data1[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data1[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data1[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data1[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data1[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data1[0]];delay(1);}void display_bb() // 显示闹钟函数{data2[5]=bbs%10;data2[4]=bbs/10;data2[3]=bbm%10;data2[2]=bbm/10;data2[1]=bbh%10;data2[0]=bbh/10;WS=0xdf; // 1101 1111 ,低电平显示LED=tab[data2[5]];delay(1);WS=0xef; // 1110 1111LED=tab[data2[4]];delay(1);WS=0xf7; // 1111 0111LED=tab_dp[data2[3]];delay(1);WS=0xfb; // 1111 1011LED=tab[data2[2]];delay(1);WS=0xfd; // 1111 1101LED=tab_dp[data2[1]];delay(1);WS=0xfe; // 1111 1110LED=tab[data2[0]];delay(1);}void keyscan() // 键盘扫描{if(key1==0) // 暂停/开始{++kk;while(!key1){display();if(kk==1){TR0=0;if(k1==0||k1==1||k1==2||k1==3) // 显示调节时间{display();}if(k1==4||k1==5||k1==6) // 显示调节闹钟{display_bb();}if(key2==0) // 模式选择(调节时间/闹钟){k1++;while(!key2){if(k1==1) // 第1次按下{sec1=sec; // 保存秒的数值sec=88; // 显示88,表示可以调节秒的数值了display(); // 显示88sec=sec1; // 恢复前一刻秒的数值}if(k1==2){min1=min;min=88;display();delay(1);min=min1;}if(k1==3){hour1=hour;hour=88;delay(1);hour=hour1;}if(k1==4){sec1=bbs; // 保存秒的数值bbs=66; // 显示66,表示可以调节秒的数值了display_bb(); // 显示66bbs=sec1; // 恢复前一刻秒的数值}if(k1==5){min1=bbm;bbm=66;display_bb();delay(10);bbm=min1;}if(k1==6){hour1=bbh;bbh=66;display_bb();delay(10);bbh=hour1;}if(k1==7){k1=0;display();}}}if(key3==0) // 时间/闹钟增加设置{while(!key3){if(k1==1){sec++;// 秒加1if(sec==60)sec=0;display();}if(k1==2){min++;delay(60);if(min==60)min=0;display();}if(k1==3){hour++;delay(60);if(hour==24)hour=0;display();}if(k1==4){bbs++; // 秒加1delay(60);if(bbs==60)bbs=0;display_bb();}if(k1==5){bbm++;delay(60);if(bbm==60)bbm=0;display_bb();}if(k1==6){bbh++;delay(60);if(bbh==24)bbh=0;display_bb();if(k1==7){k1=0;display();}}}if(key4==0) // 时间/闹钟减少设置{while(!key4){if(k1==1){sec--; // 秒加1delay(60);if(sec==0)sec=60;display();}if(k1==2){min--;delay(60);if(min==0)min=60;display();}if(k1==3){hour--;delay(60);if(hour==0)hour=24;display();}if(k1==4){bbs--; // 秒减1delay(60);if(bbs==0)bbs=60;display_bb();if(k1==5){bbm--;delay(60);if(bbm==0)bbm=60;display_bb();}if(k1==6){bbh--;delay(60);if(bbh==0)bbh=24;display_bb();}if(k1==7){k1=0;display();}}}}}if(kk==2){kk=0;k1=0;TR0=1;}}}。
C51单片机实现电子闹钟
整个系统得设计步骤如下:
在单片机最小系统得基础上,完成按键电路与复位电路得设计.
完成显示电路、数字按键、单片机时钟电路。
Ⅰ硬件设计
系统硬件得设计可以根据系统得各个功能,把整个系统划分成若干个模块,分别对这些模块来进行设计,然后在通过单片机程序来实现对各个硬件模块功能得调度。
数码管主要包括位选与段选信号线。位选就是用来选通数码管得,只有位选信号有效该数码管才会亮并显示要现实得数字;段选就是选择数码管7段得那一笔亮,从而显示不同得数字。
本设计中单片机P0口输出段选数据,P3口输出位选数据.
数码管与单片机相连得电路如下图所示:
电路中使用了芯片74ls245,该芯片用来驱动LED。其片选引脚要接地,使其一致为低电平,芯片一直可以工作。
1)输入数字按键得功能.
保证数字得输入。
2)复位电路得功能.
所有时间回到初始化状态,用于启动设定时间参数(调时或设定闹钟时间);
3)显示电路得功能。
当输入数字时显示24小时时间功能。
4)闹铃功能
设置闹铃得时间后、能按设置好得时间准时闹铃.
二、系统方案得设计要求
根据以上各模块并结合显示屏得功能及元器件材料得情况,决定采用AT89C51为内核显示设计方案.
本题画出得虽然就是独立按键,但就是内部驱动依然就是行列式按键得驱动,这里只就是为了画图方便。
(4)复位电路
当按下复位键时单片机进入复位状态,可以进行时间得设置等。
电路图如下所示:
四、系统软件部分得设计
本设计得软件系统用来配合硬件电路实现特定得功能。程序主要包含键盘扫描模块、时间处理模块、与数码管显示程序3大部分.
基于单片机C语言电子时钟完整版(闹钟,整点报时)
《单片机技术》课程设计说明书数字电子钟系、部:电气与信息工程学院学生姓名:指导教师:职称专业:班级:完成时间:2013-06-07摘要电子钟在生活中应用非常广泛,而一种简单方便的数字电子钟则更能受到人们的欢迎。
所以设计一个简易数字电子钟很有必要。
本电子钟采用ATMEL公司的AT89S52单片机为核心,使用12MHz 晶振与单片机AT89S52 相连接,通过软件编程的方法实现以24小时为一个周期,同时8位7段LED数码管(两个四位一体数码管)显示小时、分钟和秒的要求,并在计时过程中具有定时功能,当时间到达提前定好的时间进行蜂鸣报时。
该电子钟设有四个按键KEY1、KEY2、KEY3、KEY4和KEU5键,进行相应的操作就可实现校时、定时、复位功能。
具有时间显示、整点报时、校正等功能。
走时准确、显示直观、运行稳定等优点。
具有极高的推广应用价值。
关键词电子钟;AT89S52;硬件设计;软件设计ABSTRACTClock is widely used in life, and a simple digital clock is more welcomed by people. So to design a simple digital electronic clock is necessary.The system use a single chip AT89S52 of ATMEL’s as its core to control The crystal oscillator clock,using of E-12MHZ is connected with the microcontroller AT89S52, through the software programming method to achieve a 24-hour cycle, and eight 7-segment LED digital tube (two four in one digital tube) displays hours, minutes and seconds requirements, and in the time course of a timing function, when the time arrived ahead of scheduled time to buzz a good timekeeping. The clock has four buttons KEY1, KEY2, KEY3,KEY4 and KEY5 key, and make the appropriate action can be achieved when the school, timing, reset. With a time display, alarm clock settings, timer function, corrective action. Accurate travel time, display and intuitive, precision, stability, and so on. With a high application value.Key words Electronic clock;;AT89S52;Hardware Design;Software Design目录1设计课题任务、功能要求说明及方案介绍 (1)1.1设计课题任务 (1)1.2功能要求说明 (1)1.3设计总体方案介绍及原理说明 (1)2设计课题硬件系统的设计 (2)2.1设计课题硬件系统各模块功能简要介绍 (2)2.2设计课题电路原理图、PCB图、元器件布局图 (2)2.3设计课题元器件清单 (5)3设计课题软件系统的设计 (6)3.1设计课题使用单片机资源的情况 (6)3.2设计课题软件系统各模块功能简要介绍 (6)3.3设计课题软件系统程序流程框图 (6)3.4设计课题软件系统程序清单 (10)4设计结论、仿真结果、误差分析、教学建议 (21)4.1设计课题的设计结论及使用说明 (21)4.2设计课题的仿真结果 (21)4.3设计课题的误差分析 (22)4.4设计体会 (22)4.5教学建议 (22)结束语 (23)参考文献 (24)致谢 (25)附录 (26)1 设计课题任务、功能要求说明及方案介绍1.1 设计课题任务设计一个具有特定功能的电子钟。
单片机电子闹钟的设计汇编语言
ORG 00HAJMP START ;程序开始ORG 0BH ;TimEr0中断向量地址AJMP TimEInt ;跳到中断处理程序ORG 0020HSTART: MOV sp,#70HSETB P3.0 ;输出高电平,闹钟服务程序驱动口SETB P3.5 ;输出高电平,闹钟服务程序驱动口MOV 39H,#40 ;1秒钟中断次数MOV 3AH,#00 ;开机时间MOV 3BH,#00MOV 3CH,#00 ;设置上电时时钟显示的初值MOV 2EH,#06 ;开机时闹钟默认时间MOV 2FH,#00 ;设置上电时闹时时间的初值CLR 20H.1 ;上点复位后闹时功能处于关闭状态CLR 20H.0 ;正常走时模式CLR 20H.2 ;闹钟时间还没有到SETB P3.0; 清闹时输出SETB P3.5; 清闹时输出;************************************; 定时器初始化,定时器0方式1,25ms;TH0=9EH TL0=58H;************************************MOV TMOD ,#01HMOV TH0,#9EHMOV TL0,#58HMOV IE,#82H ;开全局中断SETB TR0 ;开定时中断,启动定时器;*****************************************; 以下为主程序,按键扫描;*****************************************MainLoop:JB P3.2,CheckPP ;闹时设置键按下了吗?没有则转去检测秒设置键篇p3.2 LCALL Delay2JB P3.2,CheckPPSETB 20H.0 ;置为闹时设置模式CALL AlarmSetCheckPP:JB P3.4,CheckPQ ;分设置键按下了吗?没有则转去检测小时设置键CALL Delay2JB P3.4,CheckPQMOV A,3BHADD A,#1 ; 如果按下则将分钟加一MOV 3BH,A;CJNE A,#3CH,NotOver1 ;到60分钟了吗?MOV 3BH,#0NotOver1: ;以下等待按键释放及防抖动JNB P3.4,$CheckPQ:JB P3.3,CheckAlarm ;小时设置键按下了吗?没有则转去闹时状态检测CALL Delay2JB P3.3,CheckAlarm ;按下的时间超过15ms吗?如按下调用蜂鸣器发音程序MOV A,3AHADD A,#1 ;如果按下则将小时加1MOV 3AH,ACJNE A,#18H,NotOver2MOV 3AH,#0 ;到24小时则将小时清0NotOver2: ;以下等待按键释放及防抖动JNB P3.3,$CheckAlarm:JNB 20H.2,ToReturn ;闹钟时间到没有CALL AlarmProcess ;闹钟子程序ToReturn:AJMP MainLoop;**********************************************; 定时器TimEr0中断服务程序(此程序每8ms执行一次);**********************************************TimeInt:MOV TH0,#9EH ;重新加载定时参数MOV TL0,#58HPUSH ACCPUSH PSW ;保护累加器及程序状态字的内容SETB RS0CLR RS1DJNZ 39H,Notone3CH ;中断了40次了吗?即够1秒了吗?MOV 39H,#40 ;如够1秒则重新设置"39H"计数器CALL Clock ;调用将时钟内容加1秒的子程序CALL ConvertoBuffer ;调用将时钟内容转换到显示缓冲区子程序Notone3CH:CALL ScanDisplay ;调用扫描显示子程序POP PSWPOP ACC ;恢复累加器及程序状态字的内容RETI;*********************************************;扫描显示子程序,将缓冲区的数值显示在对应的数码管上;*********************************************ScanDisplay:MOV R1,#30H ;指向显示数据首址,利用c语言指针原理读取缓冲区的数值;子程序ConvErtoBuffEr已经将相应的值存放在30H的缓冲区中MOV R4,#10111111b ;扫描控制字初值,显示右边第一个数码管PLAY: MOV A,R4 ;扫描字放入AMOV P2,A ;从P2口输出,p2口的低六位分别控制对应的六个数码管的显示MOV A,@R1 ;取显示数据到AMOV DPTR,#TAB ;取段码表地址MOVC A,@A+DPTR ;查显示数据对应段码MOV P0,A ;段码放入P0口,具体显示位INC R1 ;指向下一地址MOV A,R4 ;扫描控制字放入A;显示时分秒分隔位JB ACC.1,LPP1 ;显示时分位CLR P0.7CALL DelaySETB P0.7LPP1:JB ACC.3,LPP2 ;显示秒分位CLR P0.7CALL DelaySETB P0.7LPP2: JNB ACC.7,ENDOUT ;扫到第六位时结束RR A ;A中数据循环左移MOV R4,A ;放回R4内LCALL Delay ;每位数码管显示间隔时间为2msSETB P0.7 ;关闭分位显示点AJMP PLAY ;跳回PLAY循环ENDOUT:MOV P0,#0FFH ;P0口复位RETTAB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H,7FH,0B7H,0FFH;共阳段码表"0""1""2" "3""4""5""6""7" "8""9"".""=""不亮";****************************************************; 时钟内容加1秒的子程序(1秒时间到);****************************************************Clock:MOV A,3CH ;将原秒值送入aADD A,#1 ;加1秒MOV 3CH,aCJNE A,#3CH,NotOverFlowMOV 3CH,#0MOV A,3BHADD A,#1MOV 3BH,A;CJNE A,#3CH,NotOverFlowMOV 3BH,#0MOV A,3AHADD A,#1MOV 3AH,ACJNE A,#18H,NotOverFlowMOV 3AH,#0NotOverFlow:JNB 20H.1,NotAlarm ;闹钟开启了吗?如没有开启则无需理会是否到闹时时间MOV A,3CHJNZ NotAlarm ;秒为零吗?MOV A,3BHCJNE A,2FH,NotAlarm ;时间分钟值和闹时设置分钟值相等吗?MOV A,3AHCJNE A,2EH,NotAlarm ;时间小时值和闹时设置小时值相等吗?SETB 20H.2 ;到了闹时时间则将"闹时时间到"标志设为1NotAlarm:RET;**************************************************************************; 将时钟内容或闹时设置值转换到显示缓冲区子程序;************************************************************************** ConvertoBuffer:MOV R1,#30HJB 20H.0,DispAlarmSet ;判断时钟模式,以决定是显示实时时间还是闹时时间,20H.0,0为正常走时,1为闹钟设定MOV A,3CHMOV 23H,AMOV A,3BHMOV 22H,AMOV A,3AHMOV 21H,AAJMP Convert ;在数码管显示缓冲区的数值DispAlarmSet: ;闹钟设定JB 20H.1,AlarmOn ;闹钟开关,0为关,1为开MOV 23H,#00HAJMP NextAlarmOn:MOV 23H,#1 ;显示闹时时间及显示闹钟状态:显示"00"表示关闭闹钟,NExt: ;"01"表示开启闹钟MOV a,2FH;MOV 22H,A;MOV A,2EH;MOV 21H,A ;将数值显示到数码管Convert:MOV A,23H ;取秒值,将待显示的数值存储到缓冲区MOV B,#10DIV ABMOV @R1,BINC R1 ;缓冲寄存器的地址加1MOV @R1,AINC R1MOV A,22HMOV B,#10DIV ABMOV @R1,B;INC R1 ;缓冲寄存器的地址加1MOV @R1,A ;将秒值的十位值存入缓冲区INC R1MOV A,21HMOV B,#10DIV ABMOV @R1,B;INC R1 ;缓冲寄存器的地址加1MOV @R1,A ;将秒值的十位值存入缓冲区RET;**************************************************; 闹钟时间设置子程序;**************************************************AlarmSet:JNB P3.2,$CALL Delay2 ;等待"P3.2"键释放CheckArmPM: ;JB P3.4,CheckArmPN ;分设置键按下了吗?没有则转去检测小时设置键p3.5 CALL Delay2JB P3.4,CheckArmPNSETB 20H.1 ;闹钟开MOV A,2FHADD A,#1 ;如果按下则将分钟加1,MOV 2FH,ACJNE A,#3CH,ArmNotOver1 ;到60分钟了吗?MOV 2FH,#0 ;到60分钟则将分钟清0ArmNotOver1: ;以下等待按键释放及防抖动JNB P3.4,$ ;等待对应设置时间的按键释放CheckArmPN:JB P3.3,AlarmSetEnd ;小时设置键按下了吗?没有则返回反复检测CALL Delay2JB P3.3,AlarmSetEndSETB 20H.1MOV A ,2EHADD A,#1 ;如果按下则将小时加1MOV 2EH,ACJNE A,#18H,ArmNotOver2MOV 2EH,#0 ;到24小时则将小时清0ArmNotOver2: ;以下等待按键释放及防抖动JNB P3.3,$AlarmSetEnd:JB P3.2,AlarmSet ;闹钟设置完毕了吗?CALL Delay2JB P3.2,AlarmSetJNB P3.2,$CLR 20H.0 ;从设置模式转为走时模式RET;**************************************************; 闹时服务子程序;************************************************** AlarmProcess:MOV R2,#10loop2:CPL P3.0CPL P3.5CALL Delay1JB P3.2,AlarmReturn ;停止闹时键(即闹时设置键)按下了吗?CALL Delay2JB P3.2,AlarmReturnCLR 20H.1 ;关闭闹钟JNB P3.2,$SETB P3.0 ;如停止闹时键按下则停止闹时SETB P3.5CLR 20H.2AJMP loop6AlarmReturn:DEC R2MOV A,R2CJNE A,#00H,loop2SETB P3.0 ;如停止闹时键按下则停止闹时SETB P3.5CLR 20H.1 ;关闭闹钟CLR 20H.2loop6:RET;**************************************************; 延时子程序;**************************************************Delay:MOV R6,#2 ;延时产生1ms,数码管动态显示间隔时间del: MOV R7,#249DJNZ R7,$DJNZ R6,delRETDelay1:MOV R5,#2 ;延时间产生1s,扬声器的震动间隔时间de3:MOV R6,#200de2:MOV R7,#250DJNZ R7,$DJNZ R6,dE2DJNZ R5,dE3RETDelay2:MOV R6,#10 ;延时产生15ms,按键防止抖动时间de4:MOV R7,#245DJNZ R7,$DJNZ r6,de4RETEnd。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
电子闹钟课程设计
摘要:本课程设计主要是通过单片机系统,综合运用定时器、中断、数码显示等知识设计一个可定时的电子钟。
它包括系统总体方案及硬件设计,软件设计,Proteus软件仿真等部分。
硬件设计的主要任务是根据总体设计要求,以及在所选机型的基础上,确定系统扩展所要用的存储器,I/O电路及有关外围电路等然后设计出系统的电路原理图。
合理的软件结构是设计出一个性能优良的单片机应用性系统软件的基础,因此必须充
1
2.
3.
而
本系统采用单片机AT89C51作为本设计的核心元件,利用7段共阴LED作为显示器件。
接入共阴LED显示器,可显示时,分钟,秒,单片机外围接有定时报警系统,定时时间到,扬声器发出报警声,提示预先设定时间电器的起停时间到,从而控制电器的起停。
电路由下列部分组成:时钟电路、复位电路、控制电路、LED显示,报警电路,
芯片选用AT89C51 单片机。
系统框图:
四.硬件设计
1.单片机AT89C51
AT89C51是一个低电压,高性能CMOS型 8位单片机,片内含4KB的可反复擦写的Flash 只读程序存储器(ROM)和128 B的随机存取数据存储器(RAM),器件采用ATMEL公司的高
8 Array位器和
内置功能
实
的I/O
几个特殊管脚:
XTAL1:反向振荡放大器的输入及内部时钟工作电路的输入。
XTAL2:来自反向振荡器的输出。
RST:复位输入。
当振荡器复位器件时,要保持RST脚两个机器周期的高电平。
2.时钟电路
单片机的时钟产生方法有两种:内部时钟方式和外部时钟方式。
本系统中AT89C51单片机采用内部时钟方式。
最常用的内部时钟方式是采用外接晶体和电容组成的并联谐振回路。
振荡晶体可在1.2MHz~12MHz之间。
电容值无严格要求,但电容取值对振荡频率输出的稳
定性、大小和振荡电路起振速度有少许影响,一般可在20pF~100pF之间取值。
时钟电路
图如下:
3.数码管显示电路
单片机中通常使用7段LED,LED是发光二极管显示器的缩写。
LED显示器由于结构简单,价格便宜,体积小,亮度高,电压低,可靠性高,寿命长,响应速度快,颜色鲜艳,配置灵活,与单片机接口方便而得到广泛应用。
LED显示器是由若干个发光二极管组成显示字段的显示部件,当发光二极管导通时,相应的一个点或一个笔划发光,控制不同组合的二极管导通,就能显示出各种字符。
LED显示器有多种形式,在单片机系统中使用最多的是七段数码显示器。
LED
LED
2.程序模块 ORG 0000H
LJMP MAIN
ORG 000BH
LJMP TIME
//主程序部分
ORG 0100H
MAIN:MOV SP,#50H
MOV 20H,#00H ;秒钟BIN MOV 21H,#00H ;分钟BIN MOV 22H,#00H ;小时BIN
MOV 23H,#01H
MOV 24H,#01H
MOV 25H,#00H
MOV 30H,#00H
MOV 31H,#00H
MOV 32H,#00H
MOV 33H,#00H
MOV 34H,#00H
MOV 35H,#00H
MOV 36H,#01H
M4:LJMP LOOP
DELAY:MOV R4,#030H ;延时时间 DL00:MOV R5,#0FFH
DL11:MOV R6,#9H
DL12:DJNZ R6,DL12
DJNZ R5,DL11
DJNZ R4,DL00
RET
//设定时间程序
SETTIME:
L0:LCALL DISPLAY1 ;调用时间允许程序
MM1: JB P1.2,L1
MOV C,P1.2
JC MM1
LCALL DELAY1 ;调用延时
JC MM1
MSTOP1: MOV C,P1.2
JNC MSTOP1 ;判断P1.2是否释放?释放则继续 LCALL DELAY1 ;调用延时
MOV A,21H
CJNE A,#3CH,GO11
MOV 21H,#00H ;分钟复位
MOV 32H,#00H
MOV 33H,#00H
LJMP L0
GO11:MOV B,#0AH ;将A中的内容分成高低两部分 DIV AB
MOV 32H,B
MOV 33H,A
LJMP L0
GO12: MOV B,#0AH
DIV AB
MOV 34H,B
MOV 35H,A
LJMP L0
L2:JB P1.4,L0
MOV C,P1.4
JC L2
MOV A,24H
CJNE A,#24,GO22
MOV 24H,#00H ;时钟复位
MOV 38H,#00H
MOV 39H,#00H
LJMP N0
N1:JB P1.1,N2 ;判断P1.1是否按下? MOV C,P1.1
JC N1
LCALL DELAY1
JC N1
MSTOP4: MOV C,P1.1 ;判断P1.1是否释放?
JNC MSTOP4
LCALL DELAY1
MOV C,P1.1
JNC MSTOP4
INC 23H ;设定闹钟分钟增加1
MOV A,23H
CJNE A,#60,GO21 ;判断A是否到60分?
STOP2: MOV C,P1.4 ;判断P1.4是否释放?
JNC STOP2
LCALL DELAY1
MOV C,P1.4
JNC STOP2
LJMP LOOP
TIMEPRO:MOV A,21H
MOV B,23H
CJNE A,B,BK ;判断分钟是否运行到设定的闹钟的分钟?
MOV A,22H
MOV B,24H
CJNE A,B,BK ;判断时钟是否运行到设定的闹钟的时钟?
SETB 25H.0
MOV C,25H.0
JC XX
XX: LCALL TIMEOUT ;调用时间闹钟响应程序
BK:RET
TIMEOUT:
X1:LCALL BZ ;调用喇叭响应程序
STOP3: MOV C,P1.4
JNC STOP3
LCALL DELAY1
MOV C,P1.4
JNC STOP3
LJMP LOOP
DELAY1: MOV R4,#14H ;时间延时
DL001: MOV R5,#0FFH
DL111: DJNZ R5,DL111
DJNZ R4,DL001
RET
//延时时间
DL1: MOV R7,#02H ;延时时间
DL: MOV R6,#0200H
DL6: DJNZ R6,$
DJNZ R7,DL
RET
DSEG1:DB 3FH,06H,5BH,4FH,66H
DB 6DH,7DH,07H,7FH,6FH
,k3与
1;按
1;按一下
2.
了起来。
我相信这过程对我今后的学习和工作给与积极的影响,搭好了平台。
通过这次设计,我对这门课有了更好的理解,尤其结合了所学习的相关的知识,对各门课都有了一个较全面的理解。
这必将对我以后的学习和工作有很大的帮助。
本次课程设计的定时闹钟电路,可以满足人们的基本要求,但因为水平有限,此电路中存在一定的问题,虽可以通过增加电路解决,但过于复杂和现有水平有限,本次设计就未深入涉及,想要更好的改进电路,需要进一步的努力,,如果有好的意见,希望老师给以支持。