设计一个以单片机为核心的数字电子钟。
你好!需要用时钟芯片吗?
自己做的,带年月日的
P1口接8个按键
P2低四位接74ls48P2.4接数码管dp高三位接74ls138
#include //头文件//
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
#define tn0h 0x70
#define tn0l 0x00
#define tn1h 0x70
#define tn1l 0x01
uchar signtime[8]={0x00,0x06,0x0f,0x03,0x00,0x0f,0x00,0x00};
uchar signdate[8]={0x00,0x08,0x0f,0x00,0x04,0x0f,0x02,0x03};
uchar tcount,tflag=0;
uchar flag=1;
//***********10ms延时*************//
void delay10ms(void)
{uchar i=255;
uchar j=255;
while(i>0)
{j=255;
while(j>0)
j--;
i--;
}
}
//***********延时*************//
void delay(uchar s)
{uchar l;
for(l=0;l<=s;l++);
}
//***********键盘扫描 时间修改*************//
void keyscan()
{uchar key=0;
if(P1!=0xff)
{delay10ms();
if(P1==0x7f)flag++;
if(flag>1)flag=0;
if(flag==1)
{if(P1==0xfe)signtime[0]++;
if(P1==0xfd)signtime[1]++;
if(P1==0xfb)signtime[3]++;
if(P1==0xf7)signtime[4]++;
if(P1==0xef)signtime[6]++;
if(P1==0xdf)signtime[7]++;
if(signtime[0]>2)
signtime[0]=0;
if(signtime[1]>9)
signtime[1]=0;
if(signtime[3]>5)
signtime[3]=0;
if(signtime[4]>9)
signtime[4]=0;
if(signtime[6]>5)
signtime[6]=0;
if(signtime[7]>9)
signtime[7]=0;
if(signtime[0]==2&&signtime[1]==4)
{signtime[0]=0;
signtime[1]=0;} }
if(flag==0)
{if(P1==0xfe)signdate[0]++;
if(P1==0xfd)signdate[1]++;
if(P1==0xfb)signdate[3]++;
if(P1==0xf7)signdate[4]++;
if(P1==0xef)signdate[6]++;
if(P1==0xdf)signdate[7]++;
if(signdate[0]>9)
signdate[0]=0;
if(signdate[1]>9)
signdate[1]=0;
if(signdate[3]>1)
signdate[3]=0;
if(signdate[4]>9)
signdate[4]=0;
if(signdate[6]>3)
signdate[6]=0;
if(signdate[7]>9)
signdate[7]=0;
if(signdate[3]==1&&signdate[4]==3)
{signdate[3]=0;
signdate[4]=1;}
if(signdate[6]==3&&signdate[7]==2)
{signdate[6]=0;
signdate[7]=1;} }
}
}
//***********时间刷新*************//
void timechange()
{signtime[7]+=1;
if(signtime[7]==10)//秒
{signtime[7]=0;
signtime[6]+=1;}
if(signtime[6]==6)//秒
{signtime[6]=0;
signtime[4]+=1;}
if(signtime[4]==10)//分
{signtime[4]=0;
signtime[3]+=1;}
if(signtime[3]==6)//分
{signtime[3]=0;
signtime[1]+=1;}
if(signtime[1]==10)//时
{signtime[1]=0;
signtime[0]+=1;}
if(signtime[0]==2&&signtime[1]==4)//时
{signtime[0]=0;
signtime[1]=0;
signdate[7]++;}
//大月31天
if((signdate[3]==0&&signdate[4]==1)||(signdate[3]==0&&signdate[4]==3)||(signdate[3]==0&&signdate[4]==5)||(signdate[3]==0&&signdate[4]==7)||(signdate[3]==0&&signdate[4]==8)||(signdate[3]==1&&signdate[4]==0)||(signdate[3]==1||signdate[4]==2))
{if(signdate[7]==10)//日
{signdate[7]=0;
signdate[6]+=1;}
if(signdate[6]==3&&signdate[7]==2)//日
{signdate[6]=0;signdate[7]=1;
signdate[4]+=1;}
if(signdate[4]==10)//月
{signdate[4]=0;
signdate[3]+=1;}
if(signdate[3]==1&&signdate[4]==2)//月
{signdate[3]=0;signdate[4]=1;
signdate[1]+=1;}
if(signdate[1]==10)//年
{signdate[1]=0;
signdate[0]+=1;} }
//小月30天
if((signdate[3]==0&&signdate[4]==4)||(signdate[3]==0&&signdate[4]==6)||(signdate[3]==0&&signdate[4]==9)||(signdate[3]==1&&signdate[4]==1))
{if(signdate[7]==10)//日
{signdate[7]=0;
signdate[6]+=1;}
if(signdate[6]==3&&signdate[7]==1)//日
{signdate[6]=0;signdate[7]=1;signdate[4]+=1;}
if(signdate[4]==10)//月
{signdate[4]=0;
signdate[3]+=1;}
if(signdate[3]==1&&signdate[4]==3)//月
{signdate[3]=0;signdate[4]=1;signdate[1]++;}
if(signdate[1]==10)//年
{signdate[1]=0;
signdate[0]+=1;} }
//2月28天
if(signdate[3]==0&&signdate[4]==2)
if(signdate[6]==2&&signdate[7]==9)
{signdate[7]=1;signdate[6]=0;signdate[4]+=1; } }
//***********一秒定时 50ms扫描键盘*************//
void t1(void) interrupt 3 using 2
{TR1=0;
TH1=tn1h;
TL1=tn1l;
TR1=1;
tcount++;
if(tcount==50) //一秒定时
{tflag=1;
tcount=0;
timechange();
}
keyscan();
}
//************显示程序************//
void display(void)
{uchar i=0;
uchar a=0;
for(i=0;i<8;i++)
{if(flag==1)
P2=signtime[i]+a;
else
P2=signdate[i]+a;
a+=32;
delay(50);
}
}
//*************主程序*************//
void main()
{TMOD=0x11; //定时器工作模式 方式一
TH0=tn0h; //
TL0=tn0l; //
TH1=tn1h; //
TL1=tn1l; //
TR1=1; //启动定时器一
ET0=0; //允许定时器0中断
ET1=1; //允许定时器1中断
EA=1;
while(1)
{display();
}
}
ORG 0000H
AJMP MAIN // ;跳转到主程序
ORG 000BH // ;T0中断入口
AJMP PTF0 // ;中断处理首地址
//主程序
MAIN:
MOV SP,#05FH
MOV 30H,#0 // ;缓冲单元设置初值12:00:00
MOV 31H,#0
MOV 32H,#0
MOV 36H,#0FH // ; 设置4000次中断计数
MOV 37H,#0A0H
MOV TMOD,#02H // ;定时器启动
MOV TL0,#6
MOV TH0,#6
SETB TR0 // 启动T0计时器
MOV IE,#82H
MOV IP,#20H
//数码管动态显示
LED6:
LCALL DISPLAY
JNB P1.0,CLEAR //;判断键盘输入
JNB P1.1,SET_MINUTE
JNB P1.2,SET_HOUR
AJMP LED6
CLEAR:
LCALL DISPLAY
JNB P1.0,CLEAR
MOV 30H,#12H //;时钟显示复位 A键
MOV 31H,#0
MOV 32H,#0
SJMP LED6
SET_MINUTE:
LCALL DISPLAY
JNB P1.1,SET_MINUTE
MOV A,31H //;调节分加1 B键
CJNE A,#59H,MIN
MOV 31H,#0
SJMP LED6
SET_HOUR:
LCALL DISPLAY
JNB P1.2,SET_HOUR
MOV R1,#30H //;调节时加1 C键
MOV A,@R1
CJNE A,#23H,HOUR // 比较立即数和A,不相等则转移
MOV 30H,#0
MIN:
ADD A ,#1 //将1加到累加器
DA A // 累加器十进制调整
MOV 31H,A
LCALL DELAY1
AJMP LED6
HOUR:
ADD A,#1
DA A
MOV 30H,A
LCALL DELAY1
AJMP LED6
DISPLAY:
MOV DPTR,#TAB //;表的首地址给16位数据指针寄存器DPTR
MOV A,30H // ;时为的十位显示
SWAP A // A的高四位和低四位互换
ANL A,#0FH // A与00001111相与
MOVC A,@A+DPTR // 程序存储器代码字节传送到累加器
MOV P2,#7FH
MOV P0,A
LCALL DELAY //调用延时子程序
MOV A,30H // ;时位的个位显示
ANL A,#0FH
MOVC A,@A+DPTR
MOV P2,#0BFH
MOV P0,A
LCALL DELAY
MOV A,31H // ;分位的十位显示
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P2,#0EFH
MOV P0,A
LCALL DELAY
MOV A,31H //;分位的个位显示
ANL A,#0FH
MOVC A,@A+DPTR
MOV P2,#0F7H
MOV P0,A
LCALL DELAY
MOV A,32H // ;秒位的十位显示
SWAP A
ANL A,#0FH
MOVC A,@A+DPTR
MOV P2,#0FDH
MOV P0,A
LCALL DELAY
MOV A,32H //;秒位的个位显示
ANL A,#0FH
MOVC A,@A+DPTR
MOV P2,#0FEH
MOV P0,A
LCALL DELAY
RET
//中断程序
PTF0:
PUSH PSW ;中断处理
PUSH ACC
MOV PSW,#8
DJNZ 37H,PTF0R
DJNZ 36H,PTF0R
MOV 36H,#0FH
MOV 37H,#0A0H
MOV R0,#32H //;定时到一秒
MOV A,@R0
ADD A,#1
DA A
MOV @R0,A
CJNE A,#60H,PTF0R
MOV @R0,0
DEC R0
MOV A,@R0
ADD A,#1
DA A
MOV @R0,A
CJNE A,#60H,PTF0R
MOV @R0,#0
DEC R0
MOV A,@R0
ADD A,#1
DA A
MOV @R0,A
CJNE A,#24H,PTF0R
MOV @R0,#0
PTF0R:
POP ACC // 保护现场
POP PSW
RETI // 中断返回
DELAY:
MOV R6,#10 //;动态显示延时
L0:
MOV R7,#250
DJNZ R7,$
DJNZ R6,L0 // 寄存器减一,不为0则转移
RET // 子程序返回
DELAY1:
MOV R5,#1BH //;调整时、分显示延时
L1:
MOV R6,#9H
L2:
MOV R7,#19H
DJNZ R7,$
DJNZ R6,L2
DJNZ R5,L1
RET
//数码显示表
TAB: DB 3FH,06H,5BH,4FH,66H // ; 0,1,2,3,4
DB 6DH,7DH,07H,7FH,6FH // ; 5,6,7,8,9
END
急!基于单片机的数字示波器设计
输出两路幅值相等相位相差90°的正弦波形作为物体偏转测量的基准波形;另一路输出测角波形,该波形相对基准波形的相位反映角偏差的方向、幅值反映角偏差量。专用波形发生器就是模拟角位移输出波形的装置,用来进行后续解调电路以及功放电路的检测。它以单片机为核心,经过D\/A转换和放大电路的处理,最后输出反应弹体姿态的基准...
嵌入式与单片机之间的关系是什么?
嵌入式与单片机之间的关系如下:嵌入式系统是一个大类,单片机是其中一个重要的子类。嵌式系统像是一个完整的计算机,而单片机更像是一个没有外设的计算机。以前单片机包括的东西并不算多,两者的硬件区别较为明显。但是,随着半导体技术的突飞猛进,现在各种硬件功能都能被做进单片机之中。所以,嵌入式...
以at89c51为核心,制作一个LED显示的智能电子钟。用C语言或Keil编程,Pro...
我这里有但是和你的功能有差别,你可以看看,在改改!我用的at89c52单片机 程序:include<reg52.h> include<intrins.h> define uchar unsigned char define uint unsigned int sbit T_RST=P1^0; \/\/ds1302复位引脚 sbit T_CLK=P1^1; \/\/ds1302时钟引脚 sbit T_IO=P1^2; \/\/ds1302数据...
基于STC单片机的太阳能控制器设计
那么下方位的第一个电机也将保持不动。那么此时此刻设备的状态将是完全的禁止,STM32单片机将不对电机给出任何的运动指令[14]。三、也可以切换为“手动模式”状态进行使用按键手动来完成设备状态的切换。四个按键对应控制电机完成:上、下、左、右的翻转动作。通过点动的方式来控制驱动步进电机的实际运动[...
高职高专电子技术系列教材·单片机原理及应用内容简介
《单片机原理及应用》是一本内容深入浅出、阐述简洁、系统性强的教材,旨在培养读者的学以致用和实践能力。通过本书的学习,读者能够全面掌握单片机的原理与应用,为从事电子技术领域的工作打下坚实的基础。无论是作为教材辅助学习,还是作为参考书深入研究,本书都是一个不可多得的选择。
什么是质量流量计
三、结构组成:流量计由传感器,变送器及数字指示累积器等三部分组成。传感器由传感管、电磁驱动器、和电磁检测器三部分组成。电磁驱动器使传感器以其固有频率振动,而流量的导入使u形传感器的作用下产生一种扭曲,在它的左右两侧产生一个相位差,该相位差与质量流量成正比。电磁监测器把该相位差转变为...
单片机的基本结构
综上所述,单片机的基本结构是由CPU、ROM、RAM、I\/O口、定时器、中断控制器和片内外设等多个部分构成。每个组件都有其独特的作用,相互协同,从而能够完成各种复杂的任务。同时,单片机的基本结构也非常关键,在设计中必须清楚组成单片机的每个部分是怎样相互配合以达到所需的功能和性能。
什么是单片机?有什么作用?
单片机的主要作用包括:1. 制功能:单片机可以执行预编程的指令,控制与外部设备的交互,实现各种控制功能。这些功能可以包括开关控制、电机控制、传感器数据采集、显示控制等。2. 数据处理:单片机可以处理数据,包括从传感器获取的数据、用户输入的数据以及需要发送到外部设备的数据。它可以执行数学运算、逻辑...
求《单片机温度测量系统设计》的相关资料!
图3为采样中断流程图。数模转换部分使用单片机自带的12位A\/D转换器,能同时实现数模转换和控制,免去使用专用的转换芯片,使系统处理速度更快,精度更高,使电路简化。采样周期为500 μs ,当采集完16个点的数据以后,设置标志“nADCFlag =1”,通知主程序采集完16个点的数据,主程序从全局缓冲区里...
求文档: AT89C2051-24PU中文资料
在现场选择合适的安装位置是避免红外探头误报、求得最佳检测灵敏度极为重要的一环。片机攻击技术 目前,攻击单片机主要有四种技术,分别是: (1)软件攻击 该技术通常使用处理器通信接口并利用协议、加密算法或这些算法中的安全漏洞来进行攻击。软件攻击取得成功的一个典型事例是对早期ATMEL AT89C 系列单片机的攻击...
温穆诺里: 数字钟〔★〕这里用了两种编写方法(即汇编语言与C语言) (1. 开机时,显示12:00:00的时间开始计时;(2. P0.0/AD0控制“秒”的调整,每按一次加1秒; (3. P0.1/AD1控制“分”的调整,每按一次加1分; (4. P0.2/AD2控制“时”的调...
获嘉县15080309528: 基于单片机的电子时钟 - ?
温穆诺里: 去百度文库,查看完整内容> 内容来自用户:啊宝1688 绪论 单片机在多功能数字电子钟中的应用已是非常普遍,人们对电子时钟的功能及工作顺序都已非常熟悉了,但是却很少知道它的内部结构以及工作原理.由单片机作为电子时钟的核心控...
获嘉县15080309528: 基于单片机设计的电子钟 - ?
温穆诺里: 555时基电路+ATM51
获嘉县15080309528: 求一份设计一个以51单片机为核心的数字钟,要求能够实时显示小时、分钟、秒钟三个数据. - ?
温穆诺里: 自己做的,带年月日的 P1口接8个按键 P2低四位接74ls48P2.4接数码管dp高三位接74ls138#include<reg51.h> //头文件//#define uchar unsigned char#define uint unsigned int#define ulint unsigned long int #define tn0h 0x70#define tn0l 0x00#...
获嘉县15080309528: 用单片机设计一个电子时钟 - ?
温穆诺里: MAIN ORG 0000H AJMP MAIN ORG 000BH AJMP CLOCK ORG 0030H PORT EQU 8000H PORTA EQU 8001H PORTB EQU 8002H PORTC EQU 8003H DISP0 EQU 30H DISP1 EQU 31H DISP2 EQU 32H DISP3 EQU 33H DISP4 EQU 34H ...
获嘉县15080309528: 如何利用单片机进行电子钟的设计 - ?
温穆诺里: 你好!电子钟的种类很多,可以LED显示,可以液晶显示可以采用定时器来做,也可以用时钟芯片来完成可以带有年月日和星期的功能具体要实现什么,还请你详细说明
获嘉县15080309528: 基于单片机基础的指针式电子时钟设计 - ?
温穆诺里: 您好,方案一:静态显示.所谓静态显示,就是每个数码管的每一个段码都由一个单片机的I/O埠进行驱动.静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要5*8=40根I/O埠来驱动.故实际应用时...
获嘉县15080309528: 用C语言编写AT89C51单片机程序,设计一个智能数字钟. - ?
温穆诺里: 基本要求:1.C语言程序要求是模块化设计.2.该闹钟基于AT89C51单片机及相关外围电路进行设计.3.该闹钟有6个数码管(共阳极),可分别显示时间(时、分、秒)、及定时时间(分、秒).4.该闹钟有4个按钮,S1是切换显示按键,该键按下时可分别实现切换正常走时显示、设定走时显示、设置定时时间,启动定时,回到正常状态等功能.S2是设定键,即该键按下,将分别选中需要设定的选项.S3键是加键,即按下去表示相应选项加1.S4键是减键,即按下去表示相应的选项减1.5.该闹钟可以定时时间到,LED将发出提示闪光,且持续30s.发挥要求:1.定时时间可被打断,即打断后恢复时继续计时.2.设置闹钟报警功能;3.能切换显示年月日等信息.
获嘉县15080309528: 求 单片机多功能数字钟 毕业设计 - ?
温穆诺里: 89C51 LED电子钟 参考链接: http://www.51picavr.com/news/c8/2009-01/109.htm *APPLICATION NOTE E6000 ICEXPLORER *************** * Title: FOR colk_time * * Version: 00 * * Last Updated: * * MCU: AT89C91 * * FOR: WWW.PICAVR....
获嘉县15080309528: 基于单片机的多功能数字时钟的设计?
温穆诺里: 用DS1302时钟芯片,主控芯片可以采用带有PWM的单片机,不用语音芯片也可以完成