单片机电子时钟程序

合集下载

基于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单片机电子时钟程序

// 本程序实现功能:显示小时和分钟,并以最后一位的小数点闪烁一次表示一秒。

按下INT0键后显示日期。

并在所设定的时间蜂铃器响5次以此为闹钟;// 第二:按下INT1键后,可对时间,日期,闹钟进行设置,再次按下INT1推出设置//// 显示说明:前两位显示小时和月份,后两位显示分钟和日期//#include <reg52.h>/*==========================================宏定义uchar和uint===========================================*/#define uchar unsigned char#define uint unsigned intsbit alarm=P1^4;/*==============================================变量的定义==============================================*/int year=2010;/*初始年份为2010年*/uchar alarm_hour=0,alarm_min=0; /*初始闹钟时间为00:00*/uchar qian=0,bai=0,shi=0,ge=0,key_flag=0,Key=0,num=0,Flag=0; /*定义输出函数变量和按键号*/uchar x,dis_flag=0; /*显示变换标志位*/uchar Key_control=0; /*按键被按下的标志位*/uchar mounth=7,day=25; /*初始日期设为7月25号*/uchar hour=0,t=0,min=0,sec=0,ring=0;/*初始时间为00:00:00*//*=============================================子函数的定义=============================================*/void Init(); /*此函数用于初始化所有需要使用的中断*/void delay(uint z); /*用于数码管显示*/uchar Key_num(void); /*此函数为确定按下的按键输出编号*/void Led_display();void display(uchar cc, uchar dd); /*显示时间的函数,中间的点表示:*/void display_nian(uchar cc, uchar dd); /*显示年份的显示函数,即没有中间的点*/void display_date(uchar cc, uchar dd); /*显示日期的函数,即四个小数点全亮*/void display_alarm(uchar cc, uchar dd); /*显示闹钟的函数,第二个和第四个点*/void Leap_Nonleap(int aa); /*判断是闰年还是平年,并将二月的最大天数赋给Mounth_array[1]*/void Judge_Setting(uchar Key_set); /*所得出的按键号进行对应的设置*//*==========================================所使用数组的定义============================================*/uchar Mounth_array[12]={31,29,31,30,31,30,31,31,30,31,30,31}; /*每个月的最大天数数组*/uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,/*数码管显示编码*/};uchar code table1[]={0xbf,0x86,0xdb,0xcf,0xe6,0xed,0xfd,0x87,0xff,0xef};/*百位及其小数点的段码*//*==============================================主函数部分==============================================*/void main(){Init();while(1){Leap_Nonleap(year); /*进入大循环后首先对年份进行判断*/while(Key_control)/*当P3.3被按下后Key_control=1进入函数进行设置,直到第二次Key_control=0推出循环*/{Flag=Key_num(); /*将按键函数里面是否有按键被按下的标志位赋给Flag*/if(Flag) /*当有按键被按下时,进入设置函数*/{Judge_Setting(num); /*将num值传入函数,并进行设置*/}Led_display(); /*保证在设置的循环时有显示*/}Led_display();/*循环式动态显示*/}}/*===========================================系统初始化函数=============================================*/void Init() /*初始化系统,启动计时器0,1,外部中断0,1*/{TMOD=0x01; /*将计时器0定位工作方式1,将计时器1定为工作方式2*/TH0=(65536-50000)/256;TL0=(65536-50000)%256;ET0=1;TR0=1;// ET1=1;// TR1=1;IE0=1;EX0=1; /*使用外部中断0和1,分别作为显示变换,设置的前戏*/IT0=1;/*为下降沿突发*/IE1=1;EX1=1;IT1=1;/*为下降沿突发*/EA=1;}void Display_flag() interrupt 0 /*使用外部中断0,进行显示时间和日期的转换P3.2口切换显示*/{dis_flag++;if(dis_flag==4) /*当dis_flag=0时,输出时间,当dis_flag=1时,输出日期,当dis_flag=2时,输出闹钟*/dis_flag=0; /*当dis_flag=3时,输出年份。

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

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

#include<AT89X52.H>#define uint unsigned int#define uchar unsigned charunsigned char key2;bit ding=1;unsigned char Getkey(void);uchar a,n=0,shi,fen,miao;void delay01s(void);uchar LED[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};uchar LED1[]={0x40,0x79,0x24,0x30,0x19,0x12,0x02,0x78,0x00,0x10};//有小数点的void init(); //函数声明void Delay(unsigned char z);//函数声明void display(); //函数声明//函数声明void main() //函数声明{P1=0xfe;//对P1口赋初值init(); //函数调用while(1){//函数调用key2=Getkey();switch(key2){case 1:shi++;if(shi==24){shi=0;}break;case 2:fen++;if(fen==60){fen=0;}break;case 3:if(fen!=0)fen--;if(fen==24){fen=0;}break;case 4:ding=~ding;default:break;}display(); //函数调用}}void init(){TMOD=0x01; //定时器工作方式选择和赋初值TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1; //开总中断ET0=1; //开定时器中断TR0=1; //启动定时器}void timer0() interrupt 1 //中断服务程序{if(ding==1){TH0=(65536-50000)/256;//中断时间50msTL0=(65536-50000)%256; //定时器重新赋初值a++;if(a==10){n=~n;}if(a==20){n=~n;a=0;P1=P1<<1|P1>>7;miao++;if(miao==60){miao=0;fen++;if(fen==60){fen=0;shi++;if(shi==24){shi=0;}}}}}}void display()//显示程序{P0=LED[shi/10];P2=((P2&0x0f)|0x70); Delay(4);if(n==0){P0=LED[shi%10];}else{P0=LED1[shi%10];}P2=((P2&0x0f)|0xb0);Delay(4);P0=LED[fen/10];P2=((P2&0x0f)|0xd0);Delay(4);P0=LED[fen%10];P2=((P2&0x0f)|0xe0);Delay(4);}/**********获得键值子程序**********************/ unsigned char bool;//bool 是否松键的标志unsigned char Getkey(void){unsigned char temp,key=0;P2=(P2&0xff)|0x0f;if((P2&0xff)!=((P2&0xff)|0x0f)) // 有键按下{//delay01s();if(((P2&0xff)!=((P2&0xff)|0x0f)) &&(bool==0)) // 有键按下{temp=~(P2|0xf0);if(temp==1) key=1;else if(temp==2) key=2;else if(temp==4) key=3;else if(temp==8) key=4;bool=1;}}if(((P2&0xff)==((P2&0xff)|0x0f)) &&(bool==1)){bool=0;}return key; //返回1~16键值}/********延时程序******/void delay01s(void){unsigned char j,k;for(j=5;j>0;j--) //198{for(k=15;k>0;k--)//248{;}}}void Delay(unsigned char z){unsigned char i,j,k; //定义变量for(i=z;i>0;i--)for(j=25;j>0;j--)for(k=20;k>0;k--);}#include<reg52.h>//头文件#define uchar unsigned char//宏定义#define uint unsigned intsbit P31=P3^1;//位声明sbit P32=P3^2;sbit P33=P3^3;uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴段码表uint hou1,hou2,min1,min2,sec1,sec2,numhou,nummin,numsec,yue1,yue2,ri1,ri2,numyue,numri; uint num,m,n;void delayms(uint xms)//延时函数{uint i,j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void p31xd()//按键P31消抖{ delayms(2);while(P31!=1);delayms(2);}void p32xd()//按键P32消抖{ delayms(1);while(P32!=1);delayms(1);}void p33xd()//按键P33消抖{ delayms(1);while(P33!=1);delayms(1);}void displaysj()//显示时间{P2=0x00;P0=table[hou1];//显示时的第一位P2=0X20;delayms(1);P2=0xff;P0=table[hou2]&0x7f;//显示时的第二位与小数点P2=0X10;delayms(1);P2=0xff;P0=table[min1];//显示分的第一位P2=0X08;delayms(1);P2=0xff;P0=table[min2]&0x7f;//显示时的第二位与小数点P2=0X04;delayms(1);P2=0xff;P0=table[sec1];//显示秒的第一位P2=0X02;delayms(1);P2=0xff;P0=table[sec2];//显示秒的第二位P2=0X01;delayms(1);}void displayrq()//显示日期{ P2=0x00;P0=table[yue1];//显示月的第一位P2=0X20;delayms(1);P2=0x00;P0=table[yue2]&0x7f;//显示月的第二位P2=0X10;delayms(1);P2=0x00;P0=table[ri1];//显示日的第一位P2=0X08;delayms(1);P2=0x00;P0=table[ri2];//显示日的第二位P2=0X04;delayms(1);}void houqh()//时针切换函数{hou1=numhou/10;hou2=numhou%10;}void minqh()//分针切换函数{min1=nummin/10;min2=nummin%10;}void secqh()//秒针切换函数{sec1=numsec/10;sec2=numsec%10;}void yueqh()//月切换函数{yue1=numyue/10;yue2=numyue%10;}void riqh()//日切换函数{ri1=numri/10;ri2=numri%10;}void start()//初始化函数{num=0;TMOD=0x01;TH0=(65532-45872)/256;TL0=(65532-45872)%256;EA=1;IT0=0;//电平触发(低电平有效)EX0=1;ET0=1;TR0=1;yueqh(),riqh();//初始化日月切换}void ritiao()//日期的调节函数{ if(P32==0)//日期加一调节键{p32xd();if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||( numyue==12)){numri+=1;if(numri>=31)//如果是大月,日期有31号,等于符号是防止日期大于31号而乱码{numri=1;}}if((numyue==4)||(numyue==6)||(numyue==9)||(numyue==11)){numri+=1;if(numri>=30)//如果是小月,日期有30号{numri=1;}}if(numyue==2){numri+=1;if(numri>=28)//如果是小月,日期有28号{numri=1;}}riqh();//日期调节后切换一下}if(P33==0)//日期减一调节键{p33xd();if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||( numyue==12)){numri-=1;if(numri==0){numri=31;}}if((numyue==4)||(numyue==6)||(numyue==9)||(numyue==11)){numri-=1;if(numri==0){numri=30;}}if(numyue==2){numri-=1;if(numri==0){numri=28;}}riqh();}}void yuetiao()//月份的调节函数{if(P32==0){p32xd();numyue+=1;if(numyue==13)//月份为12时再加一马上为一月{numyue=1;}yueqh();}if(P33==0){p33xd();numyue-=1;if(numyue==0){numyue=12;}yueqh();}}void int0() interrupt 0{p31xd();while(P31!=0)//第一次按下p31时,进行秒调时{for(m=0;m<40;m++)//此for循环不显示秒,为的是使秒闪烁{P2=0x00;P0=table[hou1];P2=0X20;delayms(1);P2=0x00;P0=table[hou2]&0x7f;P2=0X10;delayms(1);P2=0x00;P0=table[min1];P2=0X08;delayms(1);P2=0x00;P0=table[min2]&0x7f;P2=0X04;delayms(1);if(P32==0)//如果按一下P32,则秒加一{p32xd();numsec+=1;if(numsec==60){numsec=0;}secqh();}if(P33==0)//如果按一下P33,则秒减一{p33xd();numsec-=1;if(numsec==-1){numsec=59;}secqh();}};for(n=0;n<40;n++)//此循环时分秒全显示,也为的是使秒闪烁{ displaysj();if(P32==0){p32xd();numsec+=1;if(numsec==60){numsec=0;}secqh();}if(P33==0){p33xd();numsec-=1;if(numsec==-1){numsec=59;}secqh();}}};p31xd();while(P31!=0)//第二次按下p31时,进行分调时{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];P2=0X02;delayms(1);P2=0x00;P0=table[sec2];P2=0X01;delayms(1);if(P32==0){p32xd();nummin+=1;if(nummin==60){nummin=0;}minqh();}if(P33==0){p33xd();nummin-=1;if(nummin==-1){nummin=59;}minqh();}}for(n=0;n<40;n++){ displaysj();if(P32==0){p32xd();nummin+=1;if(nummin==60){nummin=0;}minqh();}if(P33==0){nummin-=1;if(nummin==-1){nummin=59;}minqh();}}};p31xd();while(P31!=0)//第三次按下p31时,进行时调时{for(m=0;m<40;m++){P2=0x00;P0=table[min1];P2=0X08;delayms(1);P2=0x00;P0=table[min2]&0x7f;P2=0X04;delayms(1);P2=0x00;P0=table[sec1];P2=0X02;delayms(1);P2=0x00;P0=table[sec2];P2=0X01;delayms(1);if(P32==0){p32xd();numhou+=1;if(numhou==24){numhou=0;}}if(P33==0){p33xd();numhou-=1;if(numhou==-1){numhou=23;}houqh();}}for(n=0;n<40;n++){ displaysj();if(P32==0){p32xd();numhou+=1;if(numhou==24){numhou=0;}houqh();}if(P33==0){p33xd();numhou-=1;if(numhou==-1){numhou=23;}houqh();}}}p31xd();while(P31!=0)//第四次按下p31时,进行日期调节{for(m=0;m<50;m++){ P2=0x00;P0=table[yue1];P2=0x20;delayms(1);P2=0x00;P0=table[yue2]&0x7f;P2=0x10;delayms(1);ritiao();}for(n=0;n<50;n++){ displayrq();ritiao();}}p31xd();while(P31!=0)//第五次按下p31时,进行月调节{for(m=0;m<50;m++){P2=0xff;P0=table[ri1];P2=0xf7;delayms(1);P2=0xff;P0=table[ri2];P2=0xfb;delayms(1);yuetiao();}for(n=0;n<50;n++){ displayrq();yuetiao();}}p31xd();}void yuejia(){ numri=1;numyue+=1;if(numyue==13){numyue=1;}}void timer0() interrupt 1{TH0=(65532-46100)/256;TL0=(65532-46100)%256;num++;if(num==20){num=0;TH0=(65532-46100)/256;TL0=(65532-46100)%256;numsec=numsec+1;if(numsec==60){numsec=0;nummin=nummin+1;if(nummin==60){nummin=0;numhou=numhou+1;if(numhou==24){numhou=0;numri+=1;if((numyue==1)||(numyue==3)||(numyue==5)||(numyue==7)||(numyue==8)||(numyue==10)||( numyue==12)){numri+=1;if(numri>=31){numri=1;numyue+=1;if(numyue==13){numyue=1;}}}if((numyue==4)||(numyue==6)||(numyue==9)||(numyue==11)){numri+=1;if(numri>=31){numri=1;numyue+=1;if(numyue==13){numyue=1;}}}if(numyue==2){numri+=1;if(numri>=29){numri=1;numyue+=1;if(numyue==13){numyue=1;}}}}}}}}void main(){numhou=12;//初始化时间设为12点,日期设为1月1日nummin=0;numsec=0;numyue=1;numri=1;start();while(1){if(P32==1)//默认(没有按下p32时)显示时间{houqh(),minqh(),secqh();displaysj();}if(P32==0)//当按下p32键时显示日期{yueqh(),riqh();displayrq();}}}。

单片机电子时钟课程设计实验报告(1)

单片机电子时钟课程设计实验报告(1)

单片机电子时钟课程设计实验报告(1)单片机电子时钟课程设计实验报告一、实验内容本次实验的主要内容是使用单片机设计一个电子时钟,通过编程控制单片机,实现时钟的显示、报时、闹钟等功能。

二、实验步骤1.硬件设计根据实验要求,搭建电子时钟的硬件电路,包括单片机、时钟模块、显示模块、按键模块等。

2.软件设计通过C语言编写单片机程序,用于实现时钟功能。

3.程序实现(1)时钟显示功能通过读取时钟模块的时间信息,在显示模块上显示当前时间。

(2)报时功能设置定时器,在每个整点时,通过发出对应的蜂鸣声,提示时间到达整点。

(3)闹钟功能设置闹钟时间和闹铃时间,在闹钟时间到达时,发出提示蜂鸣,并在屏幕上显示“闹钟时间到了”。

(4)时间设置功能通过按键模块实现时间的设置,包括设置小时数、分钟数、秒数等。

(5)年月日设置功能通过按键模块实现年月日的设置,包括设置年份、月份、日期等。

三、实验结果经过调试,电子时钟的各项功能都能够正常实现。

在运行过程中,时钟能够准确、稳定地显示当前时间,并在整点时提示时间到达整点。

在设定的闹铃时间到达时,能够发出提示蜂鸣,并在屏幕上显示“闹钟时间到了”。

同时,在需要设置时间和年月日信息时,也能够通过按键进行相应的设置操作。

四、实验感悟通过本次实验,我深刻体会到了单片机在电子设备中的广泛应用以及C 语言在程序设计中的重要性。

通过实验,我不仅掌握了单片机的硬件设计与编程技术,还学会了在设计电子设备时,应重视系统的稳定性与可靠性,并善于寻找调试过程中的问题并解决。

在今后的学习和工作中,我将继续加强对单片机及其应用的学习与掌握,努力提升自己的实践能力,为未来的科研与工作做好充分准备。

单片机电子时钟设计程序

单片机电子时钟设计程序

单片机电子时钟设计程序
1.引用头文件和定义全局变量
首先需要引用相应的头文件,例如`reg52.h`,并定义全局变量用于
存储时间、闹钟时间以及其他相关参数。

2.初始化时钟
在主函数中,首先进行时钟的初始化。

这包括设置定时器和中断相关
的寄存器,以及初始化显示屏和按钮等外设。

3.时间更新
编写一个中断服务函数,用于根据定时器的中断来更新时间。

在该中
断服务函数中,需要将全局变量中的时间进行递增,并考虑到分钟、小时、日期和星期等的进位和换算。

4.按钮输入
设置一个子函数用于读取按钮输入,并根据按钮的状态来进行相应的
操作,比如切换时钟显示模式、设置闹钟等。

5.显示时间
编写一个子函数用于将时间信息显示在数码管上。

这需要先将时间信
息转换为数码管的显示格式,然后通过IO口输出控制数码管的显示。

6.闹钟设置
使用按钮输入的功能,可以设置闹钟时间和开关闹钟功能。

当闹钟时
间到达时,可以通过控制蜂鸣器发声或点亮LED等方式来进行提醒。

7.主函数
在主函数中,循环执行按钮输入的检测和相应操作,以及时间的更新和显示等功能。

可以通过一个状态机来控制整个程序的流程。

以上是一个简要的单片机电子时钟设计程序的概述。

实际的程序设计过程中,还需要考虑到各个模块之间的交互、错误处理、电源管理以及代码的优化等细节问题。

具体的程序实现可以根据具体需求和硬件平台的差异进行适当的修改和扩展。

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

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

基于51单片机的电子时钟的设计电子时钟已经成为我们日常生活中不可或缺的设备之一。

随着科技的不断发展,电子时钟也越来越智能化,功能也越来越强大。

然而,简单的电子时钟也非常实用,可以帮助我们准确地把握时间,安排生活。

本文将基于51单片机,介绍一个简单的电子时钟的设计。

第一步,硬件设计。

要实现电子时钟,我们需要用到一个时钟模块,它可以为我们提供一个准确的时间基准。

同时,我们还需要将时间显示在一个数码管上,所以在硬件设计中我们需要使用数码管。

此外,为了方便调试,我们需要一个串口模块,它可以将调试信息输出到PC端,供我们观察。

具体的硬件设计如下:1.时钟模块我们使用的是DS1302时钟模块,它可以提供准确的时间计算。

DS1302时钟模块有六个引脚,分别是:VCC、GND、CLK、DAT、RST、DS。

其中,VCC和GND分别连接电源正负极,CLK是时钟,DAT是数据,RST是复位,DS是时钟数据存储器。

2.数码管我们使用共阴数码管,它有12个引脚,其中11个引脚是段选线,另外一个引脚是位选线。

为了方便连接,我们可以使用数码管驱动芯片,如74HC595。

它可以将51单片机的串行数据转为并行数据,以驱动数码管。

3.串口模块串口模块是用于通信的模块,它有4个引脚,分别是:VCC、GND、TX、RX。

其中,VCC 和GND连接电源正负极,TX是发送端口,RX是接收端口。

第二步,软件设计。

软件设计主要包括三个部分,分别是时钟模块的驱动程序、数码管的驱动程序和主程序。

我们需要编写一个DS1302时钟模块的驱动程序。

通过驱动程序,我们可以读取当前时间,并将其设置为时钟模块的初始时间。

同时,我们还需要实现定时器中断,以更新时钟显示。

数码管驱动程序是通过74HC595芯片实现的。

我们需要编写一个函数,将当前时间转换为段选数据,再通过74HC595芯片输出到数码管上。

3.主程序主程序主要包括时钟的初始化、时钟的设置、时钟的显示等功能。

基于单片机的电子时钟控制系统

基于单片机的电子时钟控制系统

基于单片机的电子时钟控制系统
电子时钟控制系统是一种利用单片机技术来实现时间的
显示和控制的电子设备。

电子时钟控制系统主要由单片机、时钟芯片、LCD液晶
显示屏、按键等组成。

其中单片机作为系统的核心控制器,时钟芯片提供准确的时间信号,LCD液晶显示屏显示时间信息,按键用于修改时间和控制系统。

系统的具体实现流程
如下:
1. 时钟芯片提供时钟信号并进行预处理,将时钟信号
转换为单片机所需要的信号格式;
2. 单片机初始化,配置I/O口、时钟、中断等相关参数;
3. 单片机通过时钟芯片获取当前时间,并将时间信息
显示在LCD液晶显示屏上;
4. 按键操作时,单片机根据按键输入的信号对时间进
行修改或者对系统进行控制;
5. 单片机不断更新时间,保证系统的时间显示准确性;
6. 单片机在系统启动时同步时间信息,保证系统时间
的一致性;
7. 单片机可以通过外部接口与计算机进行数据通信,
从而实现系统的远程监测和控制。

电子时钟控制系统广泛应用于各种场合,如家庭、学校、车站等。

具有结构简单、使用可靠、精度高、显示清晰、
易于维护等优点。

电子时钟控制系统在使用过程中需要注意以下几点:
1. 系统使用的时钟芯片应该具有高精度和可靠性,避免时间误差和系统故障;
2. 系统应该具有防止电源干扰和防雷击的措施,保证系统的安全性;
3. 系统应该具有较好的抗干扰性,避免外部干扰对系统正常运行的影响;
4. 系统的硬件、软件设计应该符合相关标准和规范,保证系统的稳定性和可靠性。

总之,电子时钟控制系统是一种应用广泛的电子设备,在实际应用中具有重要的意义和价值。

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

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

基于单片机的电子时钟的设计基于单片机的电子时钟是一种采用单片机作为主控芯片的数字显示时钟。

它能够准确显示时间,并可以通过编程实现其他功能,如闹钟、倒计时、温湿度显示等。

本文将介绍基于单片机的电子时钟的设计原理、硬件电路和软件编程等内容。

1.设计原理基于单片机的电子时钟的设计原理是通过单片机的计时器和定时器模块来实现时间的计数和显示。

单片机的计时器可以通过设定一个固定的时钟频率进行计数,而定时器可以设定一个固定的计数值,当计数到达设定值时,会触发一个中断,通过中断服务程序可以实现时间的更新和显示。

2.硬件电路基于单片机的电子时钟的硬件电路主要包括单片机、显示模块、按键模块和时钟模块。

其中,单片机作为主控芯片,负责控制整个电子时钟的运行;显示模块一般采用数字管或液晶屏,用于显示时间;按键模块用于设置和调整时间等功能;时钟模块用于提供稳定的时钟信号。

3.软件编程基于单片机的电子时钟的软件编程主要分为初始化和主程序两个部分。

初始化部分主要是对单片机进行相关寄存器的设置,包括计时器和定时器的初始化、中断的使能等;主程序部分是一个循环程序,不断地进行时间的计数和显示。

3.1初始化部分初始化部分首先要设置计时器模块的时钟源和计数模式,一般可以选择内部时钟或外部时钟作为时钟源,并设置计时器的计数模式,如自动重装载模式或单次模式;然后要设置定时器模块的计数值,一般可以通过设定一个固定的计数值和计数频率来计算出定时时间;最后要设置中断使能,使得当定时器计数器达到设定值时触发一个中断。

3.2主程序部分主程序部分主要是一个循环程序,通过不断地读取计时器的计数值,并计算得到对应的时间,然后将时间转换成显示的格式,并显示在显示模块上。

同时,还可以通过按键来实现时间的设置和调整功能,如增加和减少小时和分钟的值,并保存到相应的寄存器中。

4.功能扩展-闹钟功能:设置闹钟时间,并在设定的时间到达时触发报警;-温湿度显示:通过连接温湿度传感器,实时显示当前的温度和湿度数据;-倒计时功能:设置一个倒计时的时间,并在计时到达时触发相应的动作。

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

程序开始
ORG 0000H
AJMP MAIN
ORG 000BH
AJMP CLOCK
ORG 0100H
主程序开始:
MAIN: MOV SP,#70H
MOV 6EH,#00H ;显示缓存器初始值设定
MOV 6DH,#00H
MOV 6CH,#00H
MOV 6BH,#00H
MOV 6AH,#00H
MOV 69H,#00H
MOV 50H,#00H ;秒,分,小时初始值设定
MOV 51H,#00H
MOV 52H,#00H
MOV DPTR,#0F003H ;8255端口定义,PA,PB为输出
MOV A,#80H
MOVX @DPTR,A
MOV 4FH,#00H
MOV TMOD,#01H ;定时器T0及TL0,TH0初始值设定
MOV TH0,#3CH
MOV TL0,#0B0H
SETB EA ;开总中断
SETB ET0 ;开定时器中断
SETB TR0
循环程序开始,并显示时间:
START: MOV A,50H
LCALL BCD
MOV 6AH,A ;显示秒十位
MOV 69H,B ;显示秒个位
MOV A,51H
LCALL BCD
MOV 6CH,A ;显示分十位
MOV 6BH,B ;显示分个位
MOV A,52H
LCALL BCD ;调用十六进制至BCD码转换子程序
MOV 6EH,A
MOV 6DH,B
LCALL DIS ;调用显示子程序
LCALL KEY ;调用键盘子程序
AJMP START
;主程序结束
BCD: MOV B,#0AH ;BCD码转换子程序
DIV AB
RET
CLOCK: PUSH ACC ;保护现场
PUSH PSW
CLR TR0
MOV TH0,#3CH ;定时参数重新设置
MOV TL0,#0B0H
SETB TR0
INC 4FH ;100ms单元加1
MOV A,4FH
CJNE A,#0AH,D0 ;100ms单元=10,就秒单元加1
MOV 4FH,#00H ;100ms单元内容清0
MOV A,50H
ADD A,#01H ;秒单元加1
MOV 50H,A
CJNE A,#3CH,D0 ;秒单元内容=60,则秒单元清0
MOV 50H,#00H
MOV A,51H ;分,时单元代码
ADD A,#01H
MOV 51H,A
CJNE A,#3CH,D0
MOV 51H,#00H
MOV A,52H
ADD A,#01H
LCALL RING ;报警子程序
MOV 52H,A
CJNE A,#18H,D0
MOV 52H,#00H
D0: POP PSW ;出栈,退出中断子程序
POP ACC
RETI
RING: MOV R3,A
CLR P1.0
LCALL DELL50
SETB P1.0
LCALL DELL50
DJNZ R3,RING
RET
键盘子程序:
KEY: JB P1.7,MSET ;秒设定子程序
LCALL DELL ;防抖动延时
JB P1.7,MSET
INC 50H
MOV A,50H
CJNE A,#3CH,SDIS
MOV 50H,#00H
SDIS: MOV A,50H
LCALL BCD
MOV 69H,B
MOV 6AH,A
SREP: LCALL DIS
JNB P1.7,SREP
MSET: JB P1.6,HSET ;分设定子程序
LCALL DELL
JB P1.6,HSET
INC 51H
MOV A,51H
CJNE A,#3CH,MDIS
MOV 51H,#00H
MDIS: MOV A,51H
LCALL BCD
MOV 6BH,B
MOV 6CH,A
MREP: CALL DIS
JNB P1.6,MREP
HSET: JB P1.5,SETEND ;小时设定子程序LCALL DELL
JB P1.5,SETEND
INC 52H
MOV A,52H
CJNE A,#18H,HDIS
MOV 52H,#00H
HDIS: MOV A,52H
LCALL BCD
MOV 6DH,B
MOV 6EH,A
HREP: LCALL DIS
JNB P1.5,HREP
SETEND: RET ;键盘设定子程序结束
显示子程序:
DIS: MOV R0,#69H ;建立显示首地址
MOV R3,#01H ;从右边开始显示
MOV A,R3 ;位控码初值
YB: MOV DPTR,#0F001H ;位控口地址,PB口MOVX @DPTR,A
MOV A,@R0
MOV DPTR,#TAB
MOVC A,@A+DPTR
MOV DPTR,#0F000H
MOVX @DPTR,A ;输出段控码
LCALL DELL ;延时
INC R0 ;转向下一单元
MOV A,R3
JB ACC.5,EEND ;判断是否到最高位,到则返回
RL A
MOV R3,A
SJMP YB ;继续扫描
EEND: RET
TAB: DB 3FH,06H,5BH,4FH,66H,6DH ;字形代码表
DB 7DH,07H,7FH,6FH,77H,7CH
DB 39H,5EH,79H,71H,73H,3EH
DB 31H,6EH,1CH,23H,40H,03H
DELL: MOV R5,#0AH 延时10ms
LP1: MOV R6,#32H
DJNZ R6,$
DJNZ R5,LP1
RET
DELL50: MOV R7,#0AH 延时50 MS
LCALL DELL
DJNZ R7,DELL50
RET
END。

相关文档
最新文档