文档库 最新最全的文档下载
当前位置:文档库 › 51单片机时钟程序

51单片机时钟程序

#include

#include

sbit P32=P3^2;

sbit P23=P2^3;

sbit P22=P2^2;

sbit P21=P2^1;

sbit P20=P2^0;

unsigned char x;

unsigned char DisBuf[8]={0,0,0,0,0,0,0,0};

unsigned char DisBuf1[8]={0,0,0,0,0,0,0,0};

code unsigned char Tab[10]={0x81,0xed,0x43,0x49,0x2d,0x19,0x11,0xcd,0x01,0x09}; unsigned char timer0_count1=0,t1=0;

//unsigned char timer0_count3=0,t3=0;

unsigned char timer0_count2=0;

unsigned char Second=0,Minute=0;

unsigned int Year=17;

unsigned int Month=01;

unsigned int Day=02;

unsigned int Hour=14;

unsigned char a1=0;

unsigned int mond=1;//显示模式

unsigned int a=9;//倒计时初试时间

unsigned int b=60;

void mDelay(unsigned int delay)

{

unsigned char i;

for(;delay>0;delay--)

{

for(i=0;i<124;i++)

{

_nop_();

_nop_();

_nop_();

}

}

}

void timer0(void) interrupt 1

{

TH0=0xfc;TL0=0x66;

timer0_count2++;

if(timer0_count2>1000)

{

P32=!P32;

timer0_count2=0;

if(mond==4)

{

b--;

if(b<1)

{

b=60;

a--;

}

if(a==0&b==0)

{

mond=5;

}

}

Second++;

if(Second>59)

{

Second=0;

Minute++;

if(Minute>59)

{

Minute=0;

Hour++;

if(Hour>24)

{

Hour=0;

Day++;

if(Day>30)

{

Day=0;

Month++;

if(Month>12)

{

Month=0;

Year++;

}

}

}

}

}

DisBuf[0]=Minute/10; DisBuf[1]=Minute%10; DisBuf[2]=Second/10; DisBuf[3]=Second%10;

DisBuf[4]=Day/10;

DisBuf[5]=Day%10;

DisBuf[6]=Hour/10;

DisBuf[7]=Hour%10;

DisBuf1[0]=Year/10;

DisBuf1[1]=Year%10;

DisBuf1[2]=Month/10;

DisBuf1[3]=Month%10;

DisBuf1[4]=a/10;

DisBuf1[5]=a%10;

DisBuf1[6]=b/10;

DisBuf1[7]=b%10;

}

if(mond==1)//分秒显示

{

timer0_count1++;

if(timer0_count1>5)

{

timer0_count1=0;

t1++;

if(t1>3) t1=0;

switch(t1)

{

case0:P0=Tab[DisBuf[0]];

P2=P2|0x80;P2=P2&0x8f;

break;

case1:P0=Tab[DisBuf[1]];

P2=P2|0x40;P2=P2&0x4f;

break;

case2:P0=Tab[DisBuf[2]];

P2=P2|0x20;P2=P2&0x2f;

break;

case3:P0=Tab[DisBuf[3]];

P2=P2|0x10;P2=P2&0x1f;

break;

default: break;

}

}

}

else

{

if(mond==2)//天时显示

{

timer0_count1++;

if(timer0_count1>5)

{

timer0_count1=0;

t1++;

if(t1>3) t1=0;

switch(t1)

{

case0: P0=Tab[DisBuf[4]];

P2=P2|0x80;P2=P2&0x8f;

break;

case1:P0=Tab[DisBuf[5]];

P2=P2|0x40;P2=P2&0x4f;

break;

case2:P0=Tab[DisBuf[6]];

P2=P2|0x20;P2=P2&0x2f;

break;

case3:P0=Tab[DisBuf[7]];

P2=P2|0x10;P2=P2&0x1f;

break;

default: break;

}

}

}

else

{

if(mond==3)//年月显示

{

timer0_count1++;

if(timer0_count1>5)

{

timer0_count1=0;

t1++;

if(t1>3) t1=0;

switch(t1)

{

case0:P0=Tab[DisBuf1[0]];

P2=P2|0x80;P2=P2&0x8f;

break;

case1:P0=Tab[DisBuf1[1]];

P2=P2|0x40;P2=P2&0x4f;

break;

case2:P0=Tab[DisBuf1[2]];

P2=P2|0x20;P2=P2&0x2f;

break;

case3:P0=Tab[DisBuf1[3]];

P2=P2|0x10;P2=P2&0x1f;

break;

default: break;

}

}

}

else

{

if(mond==4)//倒计时

{

timer0_count1++;

if(timer0_count1>5)

{

timer0_count1=0;

t1++;

if(t1>3) t1=0;

switch(t1)

{

case0:P0=Tab[DisBuf1[4]];

P2=P2|0x80;P2=P2&0x8f;

break;

case1:P0=Tab[DisBuf1[5]];

P2=P2|0x40;P2=P2&0x4f;

break;

case2:P0=Tab[DisBuf1[6]];

P2=P2|0x20;P2=P2&0x2f;

break;

case3:P0=Tab[DisBuf1[7]];

P2=P2|0x10;P2=P2&0x1f;

break;

default: break;

}

}

}

}

}

}

}

void main()

{

unsigned char Keynumber=0,Keytemp=0;

TMOD=0x01;

TH0=0xfc;TL0=0x66;

TR0=1;

IE=0x82;

while(1)

{

P1&=0x0f;

if((P2&0x0f)!=0x0f) //有键按下

{

mDelay(5);

if(!P23)

{

P1&=0x7f;P1|=0x70;

if(!P23) Keynumber=1;

else

{

P1&=0xbf;P1|=0xb0;

if(!P23) Keynumber=2;

else

{

P1&=0xdf;P1|=0xd0;

if(!P23) Keynumber=3;

else

{

P1&=0xef;P1|=0xe0;

if(!P23) Keynumber=4;

else Keynumber=20;

}

}

}

}

else if(!P22)

{

P1&=0x7f;P1|=0x70;

if(!P22) Keynumber=5;

else

{

P1&=0xbf;P1|=0xb0;

if(!P22) Keynumber=6;

else

{

P1&=0xdf;P1|=0xd0;

if(!P22) Keynumber=7;

else

{

P1&=0xef;P1|=0xe0;

if(!P22) Keynumber=8;

else Keynumber=20;

}

}

}

}

else if(!P21)

{

P1&=0x7f;P1|=0x70;

if(!P21) Keynumber=9;

else

{

P1&=0xbf;P1|=0xb0;

if(!P21) Keynumber=10;

else

{

P1&=0xdf;P1|=0xd0;

if(!P21) Keynumber=11;

else

{

P1&=0xef;P1|=0xe0;

if(!P21) Keynumber=12;

else Keynumber=20;

}

}

}

}

else if(!P20)

{

P1&=0x7f;P1|=0x70;

if(!P20) Keynumber=13;

else

{

P1&=0xbf;P1|=0xb0;

if(!P20) Keynumber=14;

else

{

P1&=0xdf;P1|=0xd0;

if(!P20) Keynumber=15;

else

{

P1&=0xef;P1|=0xe0;

if(!P20) Keynumber=16;

else Keynumber=0;

}

}

}

}

else Keynumber=0;

}

else {Keynumber=Keytemp;}//无键按下

if(Keynumber!=Keytemp)

{

Keytemp=Keynumber;

switch(Keynumber)

{

}

}

}

}

51单片机计时器

; ; 定时器T0、T1溢出周期为50MS,T0为秒计数用,T1为调整时闪烁用, ; P3.5为调整按钮,P0口为字符输出口,P2口为位选端,采用共阳显示管。 ; 时间调整方法:按3。5未超过1s进入省电模式,数码管不亮,内部时钟计时 ; 按3。5超过1s进入调整模式,要调整的时间会闪动,此时,按下P3。5超过0。5S,进入下位调整 ; 按下P3。5未超过0。5S,当前位加一;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 中断入口程序;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 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 ; 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) START1: LCALL DISPLAY ;调用显示子程序 JNB P3.5,SETMM1 ;P3.5口为0时转时间调整程序 SJMP START1 ;P3.5口为1时跳回START1

基于51单片机LCD1602数字钟

基于51单片机的数字时钟 实训单位: 南耕科技 系别: 工程技术系 专业: 姓名:

摘要 本文介绍了基于AT89C51单片机的数字式时钟的设计,详细叙述了系统硬件、软件的具体实现过程。本文在硬件、软件设计上均采用模块化的方法,使得在设计和调试方面取得很大的方便。软件同样采用模块化的设计,包括中断模块、时间调整模块等设计,并采用简单流通性强的C语言编写实现。本设计实现了时、分、秒的显示和时间修改的功能。通过对比实际的时钟,查找出误差的来源,确定调整误差的方法,尽可能的减少误差,使得系统可以达到实际数字钟的允许误差范围内。 关键字:AT89C51单片机;数字钟;模块化;

目录 1 绪论 (1) 1.1 课题背景 (1) 1.2 课题意义 (2) 1.3 数字式时钟的应用 (2) 1.4 本章小结 (3) 2 单片机简介 (3) 2.1 单片机的选择 (3) 2.1.1 单片机的特点 (5) 2.1.2 单片机的应用领域 (5) 2.2 AT89C51单片机的基本结构 (6) 2.3 本章小结 (11) 3 数字式时钟的硬件设计 (12) 3.1 最小系统设计 (13) 3.2 数字式时钟的外围电路设计 (14) 3.3 本章小结 (19) 4 数字式时钟的软件设计 (19) 4.1 系统软件设计内容 (19) 4.2主程序 (20) 4.3时钟设置子程序 (22) 4.4中断子程序 (24) 4.5 LCD显示子程序 (24) 4.6 本章小结 (26) 5 数字式时钟的Protues软件仿真 (26) 5.1 Protues软件的概述 (26) 5.2 Protues软件的功能特点 (27) 5.3 Protues软件具有4大功能模块 (27) 5.4 数字式时钟的Proteus软件仿真 (29) 5.5 本章小结 (35) 结论 (36) 致谢 (37) 单片机介绍 (37) 附录 (41)

51单片机电子时钟

一,总体方案设计 数字钟是一个将“ 时”,“分”,“秒”显示于人的视觉器官的计时装置。它的计时周期为24小时,显示满刻度为23时59分59秒,另外应有校时功能和一些显示星期、报时、停电查看时间等附加功能。因此,一个基本的数字钟电路主要由译码显示器、“时”,“分”,“秒”,“星期”计数器、校时电路、报时电路和振荡器组成。干电路系统由秒信号发生器、“时、分、秒、星期”计数器、译码器及显示器、校时电路、整点报时电路组成。秒信号产生器是整个系统的时基信号,它直接决定计时系统的精度,一般用石英晶体振荡器加分频器来实现。将标准秒信号送入“秒计数器”,“秒计数器”采用60进制计数器,每累计60秒发出一个“分脉冲”信号,该信号将作为“分计数器”的时钟脉冲。“分计数器”也采用60进制计数器,每累计60分钟,发出一个“时脉冲”信号,该信号将被送到“时计数器”。“时计数器”采用24进制计时器,可实现对一天24小时的累计。每累计24小时,发出一个“星期脉冲”信号,该信号将被送到“星期计数器”,“星期计数器” 采用7进制计时器,可实现对一周7天的累计。译码显示电路将“时”、“分”、“秒”、“星期”计数器的输出状态送到七段显示译码器译码,通过七位LED七段显示器显示出来。整点报时电路时根据计时系统的输出状态产生一脉冲信号,然后去触发一音频发生器实现报时。校时电路时用来对“时”、“分”、“秒”、“星期”显示数字进行

校对调整的。但是基于我们是初学者,我们只做一些比较简单的设计,可以显示时分秒,可以计时,还有闹钟提示,还加上温度的测量,即焊接上温度传感器18DS120在P1口进行温度的测量。 数字电子钟主体电路应由以下几部分组成:通过分频器产生标准秒信号;60进制分秒计数器以及24小时计数器;分、时的译码显示部分;校时电路。

(完整word版)51单片机数字钟

目录 1 设计任务与要求................................................... I 2 设计方案 (1) 3 硬件设计 (2) 3.1 AT89C51单片机简介 2 3.2单片机型号的选择 (6) 3.3数码管显示工作原理 (6) 4 软件设计 (7) 4.1主程序模块介绍 (7) 4.2主程序 (7) 5 仿真调试 ........................................ 错误!未定义书签。 5.1K EIL仿真结果................................. 错误!未定义书签。 5.2仿真结果分析 (13) 6 小结 ............................................ 错误!未定义书签。

1 设计任务与要求 1. 设计一个基于单片机的电子时钟,并且能够实现时分秒的现实和调节。 2. 设计出硬件电路。 3. 设计出软件编程方法,并写出源代码。 4. 用PROTEUS进行仿真。 5.用汇方式实现目的。 7.系统的各各功能模块要编语言编实现程序设计。 6.利用查表,中断等清楚,有序。 8.程序运行时有友好的用户界面。 2 设计方案 本设计主要设计了一个基于AT89C51单片机的电子时钟。并在数码管上显示相应的时间。并通过一个控制键用来实现时间的调节和是否进入省电模式的转换。应用Proteus的ISIS软件实现了单片机电子时钟系统的设计与仿真。该方法仿真效果真实、准确,节省了硬件资源。 该设计的硬件部分主要包括89C51多功能接口芯片用于开发电子时钟芯片、LED七段数码显示器用于显示时间、8031集成定时器用于定时、0.125W、8欧姆的扬声器用于定时发声。软件部分包括主程序、定时计数中断程序、时间调整程序、延时程序四大模块。通过中断程序进行定时器计数,时间调整程序是当键按下时间小于1秒,关闭显示(省电)进入调节时间状态,延时程序用于时间的延迟。先设计个秒钟程序,在秒钟程序中先不设计按钮,直接通电运行,使用40H 存放计数值,从00—59,一直循环,把40H中的数值拆分成个位和十位,分别存在30H与31H中,要求动态扫描时,使用21H当标志位,用指令JB控制显示个位与十位,程序中使用中间寄存器R0与R1用于存放拆分后的字型,再传到30H与31H中去,再设计时钟程序。

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

一、设计要求 1、准确计时,以数字形式显示时、分、秒地时间. 2、小时以24小时计时形式,分秒计时为60进位. 3、校正时间功能,即能随意设定走时时间. 4、闹钟功能,一旦走时到该时间,能以声或光地形式告警提示. 5、设计5V直流电源,系统时钟电路、复位电路. 6、能指示秒节奏,即秒提示. 7、可采用交直流供电电源,且能自动切换. 二、设计方案和论证 本次设计时钟电路,使用了ATC89C51单片机芯片控制电路,单片机控制电路简单且省去了很多复杂地线路,使得电路简明易懂,使用键盘键上地按键来调整时钟地时、分、秒,用一扬声器来进行定时提醒,同时使用汇编语言程序来控制整个时钟显示,使得编程变得更容易,这样通过四个模块:键盘、芯片、扬声器、LED显示即可满足设计要求. 2.1、总设计原理框图 如下图所示: 2.2、设计方案地选择 1.计时方案 方案1:采用实时时钟芯片 现在市场上有很多实时时钟集成电路,如DS1287、DS12887、DS1302等.这些实时时钟芯片具备年、月、日、时、分、秒计时功能和多点定时功能,计时数据地更新

每秒自动进行一次,不需要程序干预.因此,在工业实时测控系统中多采用这一类专用芯片来实现实时时钟功能. 方案2:使用单片机内部地可编程定时器. 利用单片机内部地定时计数器进行中端定时,配合软件延时实现时、分、秒地计时.该方案节省硬件成本,但程序设计较为复杂. 2.显示方案 对于实时时钟而言,显示显然是另一个重要地环节.通常LED显示有两种方式:动态显示和静态显示. 静态显示地优点是程序简单、显示亮度有保证、单片机CPU地开销小,节约CPU地工作时间.但占有I/O口线多,每一个LED都要占有一个I/O口,硬件开销大,电路复杂.需要几个LED就必须占有几个并行口,比较适用于LED数量较少地场合.当然当LED数量较多地时候,可以使用单片机地串行口通过移位寄存器地方式加以解决,但程序编写比较麻烦. LED动态显示硬件连接简单,但动态扫描地显示方式需要占有CPU较多地时间,在单片机没有太多实时测控任务地情况下可以采用. 本系统需要采用6位LED数码管来分别显示时、分、秒,因数码管个数较多,故本系统选择动态显示方式. 2.3硬件部分 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接口以及定时控制逻辑电路等.这些部件通过内部总线联接起来,构成一个完整地微型计算机.其管脚图如图所示.

51单片机多功能智能电子钟程序代码

/* * 演示数码管的动态扫描显示,用dpj8.dll仿真模块。* P0口接段,低电平亮,高电平灭。 * P2口接位,低电平亮,高电平灭。 */ #include "regx52.h" #define uint8 unsigned char code uint8 LED[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e}; unsigned char riqi[8]; static uint8 keyReleas; uint8 disptmp; uint8 pos; uint8 buffer[8]; code uint8 BIT[8] = {0xfe, 0xfd, 0xfb, 0xf7, 0xef, 0xdf, 0xbf, 0x7f}; uint8 flag2ms; // uint8 t2msCnt; // uint8 halfSecCnt; // uint8 IsTimerRun; // 控制时钟是否运转 uint8 mode; // date or clock unsigned char KeyScan(); void GlobalvarInit(); void T0Init(); void TimeRun(); unsigned char KeyScan(); void Command(); void T0IntSvr() interrupt 1 using 1 { // 1, 4ms定时初值 TL0 = (65536-2000)%256; TH0 = (65536-2000)/256; switch(mode) { case 0: disptmp=LED[buffer[pos]];

51单片机带字库液晶12864ds1302数字时钟c源程序(无按键修改功能)

51单片机+带字库液晶12864+DS1302数字时钟C 源程序(无按键修改功 能)过两天的搜索与调试,在别人程序的基础上,不断修改,终于调试成功了 这个程序。目前还不能修改时间与日期,只是以预定时间以始。 适用于开发板:51单片机(AT89S52 +带字库液晶 12864(ST7920)+DS1302实时时钟) 实现功能: 简单,数字时钟 +日期(以后会不断完美)。 C 语言源程序如下: #include #include #define uchar unsigned char #define uint unsigned int /*DS1302 端 口设置 */ sbit SCK=P3A 6; sbit SDA=P3A4; sbit RST = P3A5; bit ReadRTC_Flag; /* 12864 端口定义 */ #define LCD_data P0 sbit LCD_RS = P2A4; sbit LCD_RW = P2A5; sbit LCD_EN = P2A 6; //液晶使能控制 sbit PSB 二卩2八1; //并口控制 //DS1302 时钟 //DS1302 IO // DS1302 复位 //读DS1302全局变量 //带字库液晶 12864数据口 // 寄存器选择输入 // 液晶读/写控制

sbit RES=P2A3; uchar code dis1[] = {"电子设计天地"};// 液晶显示的汉字uchar code dis2[] = {"有志者,事竟成!"}; uchar code dis4[] = {'0','1','2','3','4','5','6','7','8','9'};unsigned char temp; #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();}; void lcd_pos(uchar X,uchar Y); //确定显示位置 unsigned char l_tmpdate[7]={0,7,16,19,10,1,9};〃秒分时日月周年09-10-19 16:07:00 code unsigned char write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分时日月周年最低位读写位 code unsigned char read_rtc_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; void Write_Ds1302_byte(unsigned char temp); void Write_Ds1302( unsigned char address,unsigned char dat );unsigned char Read_Ds1302 ( unsigned char address ); void Read_RTC(void);//read RTC void Set_RTC(void); //set RTC void InitTIMER0(void);//inital timer0 /***************************************************************** **//*

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

//**单片机stc89c52, 8位共阴数码管12M晶振 //*******P0 位选,P2 段选❖******// #include 〃reg52・ h〃 #define uchar unsigned char #define uint unsigned int uchar 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. 5ms uint i; uint j; for (i=0;i

51单片机24小时简易时钟程序

#include unsigned char seg[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; unsigned char con[6]={0x1,0x2,0x4,0x8,0x10,0x20}; unsigned char mm=0; unsigned char ss=0; unsigned char hh=0; unsigned char count=100; main() { TMOD=1; TH0=-10000>>8;TL0=-10000; EA=1;ET0=1;TR0=1; while(1); } void isr_time0() interrupt 1 { unsigned int i=0,j; unsigned char time[6]; TH0=-10000>>8;TL0=-10000; count--; if(count==0) { count=100; ss++; if(ss==60) { ss=0;mm++; if(mm==60) { mm=0;hh++; if(hh==24) hh=0; } } } time[0]=hh/10;time[1]=hh%10; time[2]=mm/10;time[3]=mm%10; time[4]=ss/10;time[5]=ss%10; for(i=0;i<6;i++) { P2=con[i]; if(i==1||i==3) P1=seg[time[i]]&0x7f; else P1=seg[time[i]];

for(j=100;j>0;j--); } }

基于C51单片机的多功能电子时钟设计(完美实现版)

作业名: 单片机课程设计报告——电子时钟****: *** 学生姓名: lycaner 班级: 北京交通大学电子信息工程学院自动化 学号: XXXXXXXX

电子时钟实验报告 一,实验目的 1. 学习8051定时器时间计时处理、按键扫描及LED数码管显示的设计方法。 2. 设计任务及要求利用实验平台上4个LED数码管,设计带有闹铃功能的数字时钟 二,实验要求 A.基本要求: 1. 在4位数码管上显示当前时间。显示格式“时时分分” 2. 由LED闪动做秒显示。 3. 利用按键可对时间及闹玲进行设置,并可显示闹玲时间。当闹玲时间到蜂鸣器发出声响, 按停止键使可使闹玲声停止。 4.实现秒表功能(百分之一秒显示) B.扩展部分: 1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整) 2.音乐闹铃(铃音可选择,闹铃被停止后,闪烁显示当前时刻8秒后,或按键跳入正常时间显示状态) 3.定时功能(设定一段时间长度,定时到后,闪烁提示) 4.倒计时功能(设定一段时间长度,能实现倒计时显示,时间长减到0时,闪烁提示) 5.闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间隔可调) 三,实验基本原理 利用单片机定时器完成计时功能,定时器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定时1秒的中断计数初值为100,每中断一次中断计数初值减1,当减到0时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。 为了将时间在LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使对应数码管亮,同时向该数码管送对应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。

51单片机时钟代码(带秒表闹钟功能)

51单片机时钟代码(带秒表闹钟功能)#include #include #defineucharunignedchar#defineuintunignedint bitbeep=P1^5;//蜂鸣器bitLED1=P1"6;//LED灯bitep=P2"7;//1602使能端bitr=P2八6;//1602bitrw=P2八5;//1602 bit0二P3八4;//停止闹铃和小灯bit1二P3八5;//功能键bit2二P3飞;//增 大键bit3二P3X;//减小键bit4二P3「;//bit5=P3^2;bit6二P3八3; bit7=P3^0; uchar1num,4num,count,count1,judge=0; charec,min,hour,miao,fen,hi,ec1,min1,diwei;voiddelay(uintz){ uint某,y; for(某二z;某〉0;某--)for(y=100;y〉0;y—);}voiddi(){ beep=0;delay(50);beep=1; } bitlcd_bz()//测试LCD忙碌状态{ bitreult; r=0;rw=1;ep=1;_nop_();_nop_();_nop_();_nop_(); reult=(bit)(P0&0某80);ep=0;

returnreult; } _nop_();_nop_(); _nop_();ep=1;_nop_();_nop_();_nop_();_nop_();ep=0; } voidwrite_data(uchardat)//写入字符显示数据到LCD{ while(lcd_bz());//等待LCD空闲 r=1;rw=0;ep=0;P0=dat;_nop_();_nop_();_nop_();_nop_();ep=1;_nop_( );_nop_(); _nop_();_nop_(); ep=0; } ucharhi,ge; hi=dat/10;ge=dat; write_data(0某30+hi); write_data(0某30+ge);} voidwrite_alarm(ucharadd,uchardat){ ucharhi1,ge1;hi1=dat/10; ge1=dat;

51单片机数字时钟的实现程序

数字时钟的显示(不可设置) #include #include #include unsigned char code table[11]={0x18,0x7b,0x2c,0x29,0x4b,0x89,0x88,0x3b,0x08,0x09,0xff}; //这里的数组放的是0-9的显示编码和全灭的编码 int flag=0;m=0;n=0;k=0;dpt=0;s=0; intdpbuf[4]={0,0,0,0}; sbit dp0=P2^4; //分别控制4个数码管的开和关 sbit dp1=P2^5; sbit dp2=P2^6; sbit dp3=P2^7; void display(); void display() { TH0=0xee; //5mS TL0=0x00; if(dpt<3) dpt++; else dpt=0; //动态显示计数器 P0 = table[dpbuf[dpt]]; switch(dpt) { case 0: dp1 = dp2 = dp3 = 1; dp0=0; break; case 1: dp0 = dp2 = dp3 = 1; dp1=0; break; case 2: dp0 = dp1 = dp3= 1; dp2=0; break; case 3: dp0 = dp1 = dp2 = 1; dp3=0; } } void Timer0() interrupt 1 //通过中断来循环扫描,实现动态显示{ TH0=0xee; //5ms TL0=0; if(k>200) { k=0; s++; } if(flag==0) { k++;

单片机时钟程序设计代码

单片机时钟程序设计代码 好的,由于你没有给出具体的单片机型号,下面是一个基于 51 单片机的时钟程序设计示例: ```c #include #include #include #include #include // 定义变量 char str[20]; int i=0; int j=0; int k=0; int time=0; int flag=0; int h=0,m=0,s=0; void delay(int xms) { int i,j; for(i=xms;i>0;i--) for(j=110;j>0;j--); } void time0() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; time++;

if(time==20) { time=0; s++; if(s==60) { s=0; m++; if(m==60) { m=0; h++; } } } // 将时间数据转换为字符串 sprintf(str," %02d:%02d:%02d",h,m,s); // 输出时间字符串 for(i=0;i<16;i++) { P0=str[i]; delay(1000); } } void main() { // 初始化定时器 0 为 16 位定时器模式,计数初值为 50000 TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256;

手把手教学51单片机 - 第四节 动态数码管,用6位数码管做一个时钟

手把手教学51单片机| 第四节动态数码管,用6位数码管做一个时钟 1.利用定时器做一个流水灯的程序//流水灯从上到下一次点亮,然后让全部灯闪烁两次,依次循环#include #define uchar unsigned char #define uint unsigned int uchar temp,a; void Time0_delay(); void main() { temp=0xfe; P1=temp; while(1) { Time0_delay(); temp=_crol_(temp,1); P1=temp; if(temp==0x7f) { for(a=0;a #define uchar unsigned char #define uint unsigned int uint n; uint sec, min, hour; sbit dula=P2^6; sbit wela=P2^7; uchar code table_dula[]={ 0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f}; uint time[6]={0,0,0,0,0,0}; void reset()//初始化函数{ sec=0;//自定义时间min=0; hour=0; TMOD=0x01; EA=1; ET0=1; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; } void delay(uint z) { uchar x,y; for(x=z;x>0;x--) for(y=50;y>0;y--); } void main() { reset(); while(1) { //h 十位

51单片机时钟程序设计

51单片机时钟程序设计 51单片机时钟程序设计是基于51单片机的一种程序,用于控制和显示时间的各个参数,如小时、分钟、秒等。在计时、计数、算术运算、控制输出、中断处理等领域都起到 重要的作用。本文将简单介绍51单片机时钟程序设计的基本框架和其实现方法。 1. 硬件准备 在进行51单片机时钟程序设计之前,需要先准备好相关的硬件,包括51单片机芯片、晶振、LCD液晶显示屏等。其中晶振是时钟源,用来产生稳定的时钟信号,LCD液晶显示屏则用于显示时钟相关信息。 2. 时钟程序的设计框架 (1)初始化程序:此步骤的主要作用是设置相关的寄存器和标志位,为后续程序的正常运行做好准备。 (2)计时程序:此步骤的主要作用是对秒、分、时等时间参数进行计数,并将结果存储到相应的寄存器里。 (3)中断程序:此步骤的主要作用是设置中断触发条件和相应的处理程序,用来处理一些紧急事件。 (4)显示程序:此步骤的主要作用是将计时程序的结果以数字形式显示到LCD液晶显示屏上,同时可以进行一些特殊字符的显示。 (5)调试程序:此步骤的主要作用是用于调试程序代码,检测是否存在问题,比如程序写错了等等。 3. 时钟程序的实现方法 (1)初始化程序 初始化程序是开发52单片机时钟程序的第一步,可以根据实际需求进行相应的设置。在本程序中,初始化程序需要进行以下设置: a. 定义输入输出端口; b. 配置定时器; c. 设置中断源; d. 初始化LCD液晶显示屏等相关参数;

(2)计时程序 计时程序是时钟程序的核心,其主要作用是计算并更新当前的时间参数。在本程序中,计时程序需要进行以下操作: a. 设置定时器的时钟源和计数频率; b. 定义中断触发条件; c. 设置中断处理程序并对时间参数进行计数,并存储到相应的寄存器里; d. 根据时间参数更新液晶显示屏的显示内容。 (3)中断程序 中断程序主要用于响应一些紧急事件,比如硬件异常、按键输入等。在52单片机时钟程序中,中断程序需要以下操作: a. 定义中断触发条件; b. 检测中断源; c. 判断中断类型,并调用相应的处理程序; d. 清除中断标志位。 (4)显示程序 a. 清空LCD液晶显示屏; b. 将时间参数转换为数字格式,并存储到相应的缓存区里; c. 将数字格式的时间参数显示到液晶显示屏上。 (5)调试程序 调试程序主要用于程序的调试和测试,通过将程序的输出结果与预期结果进行比较, 确定程序是否正确。在52单片机时钟程序中,调试程序需要进行以下操作: a. 输出调试信息到串口; b. 将时间参数输出到LED指示灯; c. 使用示波器检测程序的运行状态。 4. 总结

简单的51单片机时钟程序

简单的51单片机时钟程序,可以通过按键来设置时间,按键可以自己更改。 #include #define uint unsigned int #define uchar unsigned char #define tt 46080 //设置时间间隔,对应11.0592MHZ的晶振 uchar code table[]="Happy every day!"; uchar code table1[]="00:00:00"; uchar num,hh,mm,ss,t,s1num=0; sbit en=P3^4; sbit rs=P3^5; sbit rw=P3^6; sbit s1=P3^0; sbit s2=P3^1; sbit s3=P3^2;//按键所用的端口 sbit s4=P3^3;

void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); //大约是1ms,因为单片机的时钟周期为11.0592mhz。 } void write_com(uchar com) { rs=0; //指令 P0=com; //写指令函数 delay(1); en=1; delay(1); en=0; } void write_data(uchar dat) {

rs=1; //数据 P0=dat; //写指令函数 delay(1); en=1; delay(1); en=0; } void init() { en=0; //初始时使能为0 rw=0; write_com(0x38); //显示屏模式设置为1602方案write_com(0x0c); write_com(0x06); //显示开关/光标设置 write_com(0x01); //清屏 write_com(0x80); //指针置零 for(num=0;num<16;num++) write_data(table[num]); write_com(0xc3); for(num=0;num<8;num++)

51单片机实现的音乐闹钟程序代码

功能描述:产品可以显示时间和日期,时间格式为 hh mm ss 日期格式为yy.mm.dd 时间和日期轮流显示。时间显示5S 日期显示3S。 可以设置5个闹铃,闹铃音乐可以设置两种:毛驴和童年。 三个按键对时间和闹铃进行设置,六个LED进行显示。 计时采用DS1307。继电时间不丢失,设置过的闹铃也不丢失。 闹铃音乐由单片机的两个定时器去产生频率实现。 部分程序如下: //************************************************* //************************************************ //*********************************************** //程序名:DS1307 时钟程序 //功能描述:用六个八段LED 轮流显示时间 // 和日期。有6个闹钟。上电时从DS1307中读出 // 当前时间、日期、闹钟。 // // // // // #include #include #define uchar unsigned char #define uint unsigned int #define LED P2 #define LEDBit P0 #define nop _nop_()

#define LightCount 40 #define LightMax 80 sbit SCL=P3^1; sbit SDA=P3^0; sbit ModeKey=P1^0; sbit UpKey=P1^1; sbit DownKey=P1^2; sbit Speak=P3^6; code uchar LCD_NUM[10]={0x03,0x9f,0x25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x09}; //0x25, //uchar Clock[]={0x88,0x88,0x88}; code uint Music_Sound_Long1[]={4,8,4,8,8,4,8,4,4,4, /*童年*/ 8,4,8,4,4,4,4,4,16,4, 4,8,4,4,4,4,4,8,4,4, 4,8,4,4,4,4,4,4,16,4, 4,8,4,4,4,4,4,8,4,4, 4,8,4,4,4,4,4,4,16,4, 8,4,8,4,4,4,8,8,4,4, 4,4,4,4,4,4,4,4,4,16, 4,8,4,8,8,4,8,4,4,4, 8,4,8,4,4,4,4,4,16,4, 8,4,8,8,4,8,4,4,4,8, 4,8,4,4,4,4,4,16,0}, Music_Sound_Long2[]={4,4,4,4,4,4,4,4,4,4, /*小毛驴*/ 4,4,16,4,4,4,4,4,4 ,4, 4,4,4,4,4,8,4,4,4,4, 4,4,4,4,4,4,4,4,4,16, 4,4,4,4,2,2,2,2,4,4, 4,4,4,4,16,0}, Music_Sound_Tone1[]={379,379,379,379,425,477,477,477,425,477, 568,637,637,637,568,637, 425,379,477,719, 637,637,719,637,568,568, 506,568,568,568, 637,477,477,477,477,568,477,568,637,719, 637,637,719,637,568,568,506,568,568,568,

相关文档
相关文档 最新文档