中断定时器数字钟(51单片机)

合集下载

51单片机串口中断与定时器中断共存同时使用

51单片机串口中断与定时器中断共存同时使用

51单片机串口中断与定时器中断共存同时使用#include#include#define uchar unsigned char#define uint unsigned intsbit led1=P2^0;uchar SerialV alue; //串口接收到的值;uchar i;void main(){smglk=0;smgbitlk=0;ledlk=1;//----- Serial Port Setting -----TMOD=0x21; //设定定时器为方式2 可自动再装入的定时器SM0=0; //设定串口工作方式1 10位异步收发器8位数据SM1=1; //设定串口工作方式1 10位异步收发器8位数据TH1=0xfd;//装入初值TL1=0xfd; //装入初值PCON=0x00; //设定串行口波特率REN=1; //允许串行接收位。

REN=1,启动接收数据;REN=0,禁止接收。

IP=0x10;TH0=(65535-50000)/256;TL0=(65535-50000)%256;TR0=1; //启用T0定时器/计数器ET0=1; //T0定时器中断开关;(开)TR1=1; //启用T1定时器/计数器ET1=1; //T1定时器中断开关;(开)ES=1; //串行中断开关;(开) EA=1; //总中断开关;(开) SerialV alue=0x02;while(1){}}//串口中断void serial() interrupt 4 {SerialV alue=SBUF;RI=0;}void timer0() interrupt 1 {TH0=(65535-50000)/256; TL0=(65535-50000)%256; i++;if(i>SerialV alue){i=0;led1=!led1;}}。

51单片机作的电子钟程序及电路图

51单片机作的电子钟程序及电路图

51单片机作的电子钟程序在很多地方已经有了介绍,对于单片机学习者而言这个程序基本上是一道门槛,掌握了电子钟程序,基本上可以说51单片机就掌握了80%。

常见的电子钟程序由显示部分,计算部分,时钟调整部分构成。

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

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

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

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

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

6个数码管分别显示时、分、秒,一个功能键,可以切换调整时分秒、增加数值、熄灭节电等功能全部集一键。

以下是部分汇编源程序,购买我们产品后我们用光盘将完整的单片机汇编源程序和烧写文件送给客户。

;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断入口程序 ;; (仅供参考) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ORG 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 ;串行中断程序返回;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 主程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;START: MOV R0,#70H ;清70H-7AH共11个内存单元MOV R7,#0BH;clr P3.7 ;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秒定时用初值(50M S×20)START1: LCALL DISPLAY ;调用显示子程序JNB P3.7,SETMM1 ;P3.7口为0时转时间调整程序SJMP START1 ;P3.7口为1时跳回START1 SETMM1: LJMP SETMM ;转到时间调整程序SETMM; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; 1秒计时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T0中断服务程序INTT0: PUSH ACC ;累加器入栈保护PUSH PSW ;状态字入栈保护CLR TR0 ;关闭定时器T0MOV 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秒时对秒计时单元清0MOV 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 ;清进位标志CJNE A,#24H,HOUR ;HOUR: JC OUTT0 ;小于24小时中断退出ACALL CLR0 ;大于或等于24小时小时计时单元清0OUTT0: MOV 72H,76H ;中断退出时将分、时计时单元数据移MOV 73H,77H ;入对应显示单元MOV 74H,78H ;MOV 75H,79H ;POP PSW ;恢复状态字(出栈)POP ACC ;恢复累加器RETI ;中断返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 闪动调时程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;T1中断服务程序,用作时间调整时调整单元闪烁指示INTT1: PUSH ACC ;中断现场保护PUSH PSW ;MOV TL1, #0B0H ;装定时器T1定时初值MOV TH1, #3CH ;DJNZ R2,INTT1OUT ;0.3秒未到退出中断(50MS中断6次)MOV R2,#06H ;重装0.3秒定时用初值CPL 02H ;0.3秒定时到对闪烁标志取反JB 02H,FLASH1 ;02H位为1时显示单元"熄灭"MOV 72H,76H ;02H位为0时正常显示MOV 73H,77H ;MOV 74H,78H ;MOV 75H,79H ;INTT1OUT: POP PSW ;恢复现场POP ACC ;RETI ;中断退出FLASH1: JB 01H,FLASH2 ;01H位为1时,转小时熄灭控制MOV 72H,7AH ;01H位为0时,"熄灭符"数据放入分MOV 73H,7AH ;显示单元(72H-73H),将不显示分数据MOV 74H,78H ;MOV 75H,79H ;AJMP INTT1OUT ;转中断退出FLASH2: MOV 72H,76H ;01H位为1时,"熄灭符"数据放入小时MOV 73H,77H ;显示单元(74H-75H),小时数据将不显示MOV 74H,7AH ;MOV 75H,7AH ;AJMP INTT1OUT ;转中断退出; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 加1子程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ADD1: MOV A,@R0 ;取当前计时单元数据到ADEC R0 ;指向前一地址SWAP A ;A中数据高四位与低四位交换ORL A,@R0 ;前一地址中数据放入A中低四位ADD A,#01H ;A加1操作DA A ;十进制调整MOV R3,A ;移入R3寄存器ANL A,#0FH ;高四位变0MOV @R0,A ;放回前一地址单元MOV A,R3 ;取回R3中暂存数据INC R0 ;指向当前地址单元SWAP A ;A中数据高四位与低四位交换ANL A,#0FH ;高四位变0MOV @R0,A ;数据放入当削地址单元中RET ;子程序返回; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 清零程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;............. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 时钟调整程序 ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;当调时按键按下时进入此程序SETMM: cLR ET0 ;关定时器T0中断CLR TR0 ;关闭定时器T0LCALL DL1S ;调用1秒延时程序JB P3.7,CLOSEDIS ;键按下时间小于1秒,关闭显示(省电)MOV R2,#06H ;进入调时状态,赋闪烁定时初值SETB ET1 ;允许T1中断SETB TR1 ;开启定时器T1SET2: JNB P3.7,SET1 ;P3.7口为0(键未释放),等待SETB 00H ;键释放,分调整闪烁标志置1SET4: JB P3.7,SET3 ;等待键按下LCALL DL05S ;有键按下,延时0.5秒JNB P3.7,SETHH ;按下时间大于0.5秒转调小时状态MOV R0,#77H ;按下时间小于0.5秒加1分钟操作LCALL ADD1 ;调用加1子程序MOV A,R3 ;取调整单元数据CLR C ;清进位标志CJNE A,#60H,HHH ;调整单元数据与60比较HHH: JC SET4 ;调整单元数据小于60转SET4循环LCALL CLR0 ;调整单元数据大于或等于60时清0CLR C ;清进位标志AJMP SET4 ;跳转到SET4循环CLOSEDIS: SETB ET0 ;省电(LED不显示)状态。

51单片机:中断实现按键按一下数码管从00加到99循环(C语言)

51单片机:中断实现按键按一下数码管从00加到99循环(C语言)

51单⽚机:中断实现按键按⼀下数码管从00加到99循环(C语⾔)51单⽚机:中断实现按键按⼀下数码管从00加到99循环(C语⾔)
题⽬要求:
在51单⽚机上通过C语⾔编写代码,使⽤中断,按键按⼀下数码管上⾯的数字从00开始加1,实现00——99的循环
准备⼯作:
keil建⽴⼯程
proteus仿真验证
代码如下:
/*
*功能:⽤中断实现开关每按⼀次,数码管数字加⼀,
*实现00-99的循环
*/
#include<reg52.h>
sbit SEG1 = P1^0;//定义显⽰⼗位数码管
sbit SEG2 = P2^0;//定义显⽰个位数码管
sbit key = P3^2;//定义按键
int sum =0;
int i,j;
unsigned char code DSY_CODE[]={0xC0,0xF9,0xA4,
0xB0,0x99,0x92,
0x82,0xF8,0x80,0x90};//共阳极数码管
void main()
{
IE =0x81;//使⽤外部中断0
IT0 =1;
while(1);
}
void EX0_INT(void) interrupt 0
{
sum++;
i = sum/10;//⼗位数字
j = sum%10;//个位数字
if(sum ==100)
{
sum =0;
}
P1 = DSY_CODE[i];//数码管显⽰⼗位数字
P2 = DSY_CODE[j];//数码管显⽰个位数字
}
(写的不是很规范,仅供参考)
仿真结果:。

基于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单片机电子闹钟程序(亲自编写,可用)

学校电子钟,有闹钟功能,按键可调时间,可调打铃时间,打铃时间长短显示,每个模块有功能注释。

其中正常时间显示和闹钟时间显示可用一个开关来调整。

芯片选择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单片机的简易电子钟设计

基于51单片机的简易电子钟设计一、设计目的现代社会对于时间的要求越来越精确,电子钟成为家庭和办公场所不可缺少的设备之一、本设计基于51单片机,旨在实现一个简易的电子钟,可以显示当前的时间,并且能够通过按键进行时间的调整和设置闹钟。

二、设计原理本设计主要涉及到51单片机的IO口、定时器、中断、LCD显示技术等方面知识。

1.时钟模块时钟模块采用定时器0的中断进行时间的累加和更新。

以1秒为一个时间单位,每当定时器0中断发生,就将时间加1,并判断是否需要更新小时、分钟和秒的显示。

同时,根据用户按键的操作,可以调整时间的设定。

2.显示模块显示模块采用16x2字符LCD显示屏,通过51单片机的IO口与LCD连接。

可以显示当前时间和设置的闹钟时间。

初次上电或者重置后,LCD显示时间为00:00:00,通过定时器中断和键盘操作,实现时间的更新和设定闹钟功能。

3.键盘模块键盘模块采用矩阵键盘连接到51单片机的IO口上,用于用户进行时间的调整和设置闹钟。

通过查询键盘的按键状态,根据按键的不同操作,实现时间的调整和闹钟设定功能。

4.中断模块中断模块采用定时器0的中断,用于1秒的定时更新时间。

同时可以添加外部中断用于响应用户按键操作。

三、主要功能和实现步骤1.系统初始化。

2.设置定时器,每1秒产生一次中断。

3.初始化LCD显示屏,显示初始时间00:00:00。

4.查询键盘状态,判断是否有按键按下。

5.如果按键被按下,根据不同按键的功能进行相应的操作:-功能键:设置、调整、确认。

-数字键:根据键入的数字进行时间的调整和闹钟设定。

6.根据定时器的中断,更新时间的显示。

7.判断当前时间是否与闹钟设定时间相同,如果相同,则触发闹钟,进行提示。

8.循环执行步骤4-7,实现连续的时间显示和按键操作。

四、系统总结和改进使用51单片机设计的简易电子钟可以显示当前时间,并且实现时间的调整和闹钟设定功能。

但是由于硬件资源有限,只能实现基本的功能,不能进行其他高级功能的扩展,例如闹铃的音乐播放、温度、湿度的显示等。

用51单片机和1602液晶做的数字钟

用51单片机和1602液晶做的数字钟

用51单片机和1602液晶做的数字钟数字钟是人们日常生活中常见的时间显示设备,它能够精确显示当前的时间,并且兼具简约和实用性。

本文将介绍使用51单片机和1602液晶屏幕制作自己的数字钟的方法。

所需材料在开始制作之前,我们需要准备以下材料: - 51单片机开发板 - 1602液晶屏幕 - 数字时钟芯片RTC(Real-Time Clock) - 面包板和导线 - 电阻和电容 - 编程器和烧录器硬件连接首先,我们需要将51单片机、1602液晶屏幕和RTC芯片连接起来。

根据硬件接口的定义和引脚功能的规定,我们可以进行以下连接: - 将51单片机的VCC 引脚连接到1602液晶屏幕的VCC引脚,用于提供电源。

- 将51单片机的GND引脚连接到1602液晶屏幕的GND引脚,用于地线连接。

- 将51单片机的P0口连接到1602液晶屏幕的数据线D0-D7,用于数据传输。

- 将51单片机的P2口连接到1602液晶屏幕的RS引脚,用于选择数据和命令传输。

- 将51单片机的P3口连接到1602液晶屏幕的EN引脚,用于启用LCD。

此外,还需要将RTC芯片连接到51单片机上,以实现时间的准确显示。

具体的连接方式可以参考RTC芯片的规格说明书。

软件编程完成硬件连接后,我们需要进行软件编程,以便控制51单片机、1602液晶屏幕和RTC芯片的功能。

初始化首先,我们需要对51单片机和1602液晶屏幕进行初始化设置。

这包括设置引脚的功能模式、初始化1602液晶屏幕的显示模式和清空显示区域。

读取时间接下来,我们需要通过RTC芯片来读取当前的时间。

这通常包括读取RTC芯片存储的年、月、日、时、分和秒的数据。

显示时间读取时间后,我们可以将其显示在1602液晶屏幕上。

这可以通过更新特定的LCD显示区域来实现。

我们可以在指定的位置、特定的行和列上显示时间。

更新时间为了实现实时的时间显示,我们需要定期更新显示的时间。

可以使用定时器中断来定期更新时间,并根据需要刷新液晶屏幕上的显示。

51单片机的时钟电路原理

51单片机的时钟电路原理

51单片机的时钟电路原理
51单片机的时钟电路原理如下:
1. 外部晶振电路:51单片机的时钟电路主要由一个晶体振荡电路组成,晶体振荡电路由一个晶体谐振器和两个电容组成。

晶体振荡电路产生的正弦信号被送入单片机内部,用于驱动时钟周期。

2. 时钟源选择:51单片机的时钟源可以选择外部晶振电路提供的晶振信号或者内部RC振荡电路提供的振荡信号。

3. 预分频器:51单片机内部有一个12位的预分频器,用于将时钟信号进行分频。

预分频器的分频比可以通过程序设置,可以将时钟信号分频为1、2、4、8、12等倍数,可根据需要选择合适的分频比。

4. 定时器:51单片机内部有一个定时器/计数器,用于实现定时和计数功能。

定时器可以根据程序设置的计数值产生中断信号,以实现定时中断和计数中断功能。

5. 中断控制:51单片机的时钟电路中包含一个中断控制模块,用于实现对定时器中断信号的处理。

中断控制模块可以根据程序的设置,决定是否接受定时器中断信号,以及如何响应中断。

总之,51单片机的时钟电路利用外部晶振电路提供的晶振信号作为时钟源,通过预分频器进行分频,再经过定时器和中断控制模块的处理,最终实现定时和计数功能。

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

多功能数字钟(A)
一、任务
设计制作一个24小时制多功能数字钟。

示意图如下(仅供参考):
二、要求
(1)具有时间设置(小时和分钟)、闹钟时间设置、闹钟开、闹钟关功能。

(2)数字显示小时、分钟,有AM、PM指示器,闹钟就绪灯,蜂鸣器。

(3)220V供电。

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code tab[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳极数码管数字定义
uint clock[2]={58,23}; //初始化时间
uint alarm[2]={0,23}; //初始化闹铃时间
uint i,miao,flag;
sbit rd=P1^3;
sbit key4=P1^4; //只有摁下这个才可以调整时间
sbit key3=P1^5; //摁下这个可以切换出闹铃设置时间以便调整
sbit key2=P1^6; //增加小时的个位数,开闹铃
sbit key1=P1^7; //增加分钟的个位数,关闹铃
sbit didi=P3^7; //闹铃接口
void delay(uint t) //延时代码
{
uint x,y;
for(x=t;x>0;x--)
for(y=120;y>0;y--);
}
void initial() //初始化
{
TMOD=0x01; //T0方式1计时0.05S
TH0=(65536-50000)/256;//定时器T0的高四位赋值
TL0=(65536-50000)%256;//定时器T0的低四位赋值
EA=1; //中断允许
ET0=1; //允许计数器T0中断
TR0=1; //开中断,启动定时器
}
void timer0() interrupt 1 //定时器启动1模式
{
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
i++;
if(i==18)
{
i=0;
miao++; //根据振荡频率计算时间增加秒
if(miao==60) //如果秒=60了归为零且分钟增加一分钟
{
miao=0;
clock[0]=clock[0]+1;
if(clock[0]==60) //如果分钟为60,小时增加1
{
clock[0]=0;
clock[1]=clock[1]+1;
if(clock[1]==24) //小时为24小时制,如果24即为0
{
clock[1]=0;
}
}
}
}
}
void display(uint *p) //LED显示代码
{
P2=0xbf;
P0=tab[*p/10];
delay(2);
P2=0xff;
P2=0x7f;
P0=tab[*p%10];
delay(2);
p++;
delay(2);
P2=0xff;
P2=0xdf;
P0=0xbf; //显示"-"
delay(2);
P2=0xff;
P2=0xfb;
P0=0xbf; //显示"-"
delay(2);
P2=0xff;
if(*p<=12)
{
P2=0xfd;
P0=0x88; //如果是上午时间,从左数第二个LED显示A(AM)
delay(2);
}
if(*p>12)
{
P2=0xfd;
P0=0x8c; //如果是下午时间,LED上显示P(PM)
delay(2);
}
P2=0xf7;
P0=tab[*p/10];
delay(2);
P2=0xff;
P2=0xef;
P0=tab[*p%10];
delay(2);
}
void keyscan() //键盘控制时间改变的代码
{
if(key2==0)
{
delay(5);
if(key2==0)
{
clock[1]=clock[1]+1;
if(clock[1]==24)
{
clock[1]=0;
}
}
while(!key2);
}
if(key1==0)
{
delay(5);
if(key1==0)
{
clock[0]=clock[0]+1;
if(clock[0]==60)
{
clock[0]=0;
}
}
while(!key1);
}
display(clock); //显示时间
}
void alarm_control() //闹铃时间控制代码
{
if(key2==0) //key2摁下表示闹铃初始值小时增加1 {
delay(5);
if(key2==0)
{
alarm[1]=alarm[1]+1;
if(alarm[1]==24)
{
alarm[1]=0;
}
}
while(!key2);
}
if(key1==0) //key1摁下表示闹铃初始值分钟增加1
{
delay(5);
if(key1==0)
{
alarm[0]=alarm[0]+1;
if(alarm[0]==60)
{
alarm[0]=0;
}
}
while(!key1);
}
display(alarm);
P2=0xfe;
P0=0x88; //LED上显示A,说明模式为闹铃模式
delay(2);
}
void time_control() //时间控制代码,选择闹铃模式还是时间模式
{
if(key2==0)
{
flag=1;
}
if(key1==0)
flag=0;
if(flag==1&&clock[0]==alarm[0]&&clock[1]==alarm[1])
{
while(key1)
{
didi=0;
display(alarm);
P2=0xfe;
P0=0x88; //LED最左端显示A,即为闹铃模式
delay(2);
}
flag=0;
didi=1;
}
}
void main() //主函数
{
initial(); //初始化
flag=0; //闹铃模式开,进入循环
while(1)
{
display(clock); //显示主时间
if(key4==0)
{
while(!key4)
{
keyscan();
}
}
if(key3==0) //切换出闹铃时间,以便于调整以及查看{
while(!key3)
{
delay(8);
display(alarm); //显示闹铃时间
alarm_control(); //闹铃键盘控制
}
}
time_control();
}
}
//flag=0为闹钟模式,flag=1为时钟模式。

相关文档
最新文档