新数码管万年历制作详解

合集下载

带温度显示的万年历_数码管显示(附电路图和源代码)

带温度显示的万年历_数码管显示(附电路图和源代码)

设计报告设计任务:设计一个智能化万年历时钟电路,LED数码管作为电路的显示部分,按钮开关作为调时部分,通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期、温度。

并能准确计算闰年闰月的显示。

设计要求:通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,三个个按钮连接P3.0、P3.1、P3.2可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术所连线路和单片机接口仿真图如图3所示:图3 仿真按键4)温度采集部分:DS18B20温度传感器,测温范围-55℃~+125℃,固有测温分辨率0.5℃。

独特的单线接口方式,DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。

DS18B20的采集数据通过DQ传入单片机,单片机读取数据后将数据输出!如图所示:程序如下:ReadOneChar(void){unsigned char i=0;// 定义i用于循环unsigned char dat = 0;// 读取的8位数据for (i=8;i>0;i--)//8次循环{DQ = 0;// 拉低DQ总线开始读时序dat>>=1;// dat左移一位DQ = 1; //释放DQ总线if(DQ)// 如果DQ=1,执dat|=0x80;(0x80即第7位为1,如果DQ为1,即读取的数据为1,将dat的第7为置1,然后dat>>=1,循环8次结束,dat 即为读取的数据)//DQ=0,就跳过dat|=0x80;Tdelay(4);// 延时以完成此次读时序,之后再读下一数据}return(dat); 返回读取的dat}//写一个字节WriteOneChar(unsigned char dat){unsigned char i=0;//for (i=8; i>0; i--)//{DQ = 0;//DQ = dat&0x01;//Tdelay(5);//延时以完成此次读时序,之后再读下一数据DQ = 1;//dat>>=1;//}}//读取温度ReadTemperature(void){unsigned char a=0;unsigned char b=0;unsigned int t=0;float tt=0;//Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0x44);// 启动温度转换Init_DS18B20();WriteOneChar(0xCC);// 写指令,跳过ROM,WriteOneChar(0xBE);// 写指令,读暂存存储器a=ReadOneChar();//读低8位b=ReadOneChar();//读高8位t=b;//t<<=8;//t=t|a;//tt=t*0.0625;//t= tt*10+0.5;//return(t); //获得0.01°C 的精度并返回}LED数码管的选择LED数码管分为共阴和共阳两种,以利用STC89C51的P0口作为LED显示的数据部分,以P2口的七个口作为显示部分的位选,通过三八译码器和4-16译码器扩展为17位的位选分别接在一个四位数码管和13个数码管的位选部分。

DS1302设计的可调万年历(实测正常,附有程序)

DS1302设计的可调万年历(实测正常,附有程序)

DS1302设计的可调万年历(本制作所用数码管全为共阳数码管)我刚开始想做万年历的时候是上网找别人的程序,可是发现找了很多都不理想,要不就没日历和时间一起显示,要不就不能调时间的,后来我研究了两天,自己终于把程序编了出来。

好了,废话我就不多说,本制作我已经把实物做了出来,保证没问题!下面附有仿真图和实物图。

拍摄的效果不够好,但实物是不错的,本人实物中用三级管代替了仿真图的74HC04非门,用哪个都是可以的……请注意:本程序分两个C文件的,如果不会编,可以Q我:1107588997 我直接发程序过去给你……软件源程序:(初始化程序只在开始时用一次,之后要把它屏蔽掉)#include<reg52.h>#include<intrins.h>#include<zichengxu.c>uchar time_data[7]={0,0,0,0,0,0,0};uchar write_add[7]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};uchar read_add[7]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};void write_ds1302_byte(uchar dat){uchar i;for(i=0;i<8;i++){sck=0;io=dat&0x01;dat=dat>>1;sck=1;}}void write_ds1302(uchar add,uchar dat){rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);write_ds1302_byte(dat);rst=0;_nop_();io=1;sck=1;}uchar read_ds1302(uchar add){uchar i,value;rst=0;_nop_();sck=0;_nop_();rst=1;_nop_();write_ds1302_byte(add);for(i=0;i<8;i++){value=value>>1;sck=0;if(io)value=value|0x80;sck=1;}rst=0;_nop_();sck=0;_nop_();sck=1;io=1;return value;}void read_rtc(void){uchar i;for(i=0;i<7;i++){time_data[i]=read_ds1302(read_add[i]);}}void time_pros(void){nian=time_data[0]/16*10+time_data[0]%16;yue=time_data[2]/16*10+time_data[2]%16;ri=time_data[3]/16*10+time_data[3]%16;xi=time_data[1]/16*10+time_data[1]%16;shi=time_data[4]/16*10+time_data[4]%16;fen=time_data[5]/16*10+time_data[5]%16;miao=time_data[6]/16*10+time_data[6]%16;}void main(){// Init_DS1302();//初始化while(1){read_rtc();time_pros();display();button();}}//---------------------------- zichengxu.c ----------------------------------------------#define DUAN1 P2#define DUAN2 P3#define WEI P0#define uint unsigned int#define uchar unsigned charsbit sck = P1^1;sbit io = P1^0;sbit rst = P1^2 ;sbit k1=P1^4;sbit k2=P1^5;sbit k3=P1^6;sbit k4=P1^7;uchar shi,fen,miao,nian,yue,ri,xi,menu,y;unsigned char code quan[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};void write_ds1302_byte(uchar dat);void write_ds1302(uchar add,uchar dat);uchar read_ds1302(uchar add);//void Init_DS1302(void); // 初始化void read_rtc(void);void time_pros(void);void display(void);void button(void);void delay(uint z){uchar x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}/*(void Init_DS1302(void) //初始化{write_ds1302(0x8e,0x00);write_ds1302(0x80,0x00);write_ds1302(0x82,0x20);write_ds1302(0x84,0x09);write_ds1302(0x86,0x25);write_ds1302(0x88,0x12);write_ds1302(0x8a,0x06);write_ds1302(0x8c,0x10);write_ds1302(0x90,0x01);write_ds1302(0xc0,0xf0);write_ds1302(0x8e,0x80);} */void display(void){WEI=0;DUAN1=quan[2];if(menu==3&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN2=0xff; }else DUAN2=quan[shi/10];delay(2);DUAN1=0xff;DUAN2=0xff;WEI=1;DUAN1=quan[0];if(menu==3&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN2=0xff; }else DUAN2=quan[shi%10];delay(2);DUAN1=0xff;DUAN2=0xff;WEI=2;if(menu==7&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN1=0xff; }else DUAN1=quan[nian/10];if(menu==2&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN2=0xff; }else DUAN2=quan[fen/10];delay(2);DUAN1=0xff;DUAN2=0xff;WEI=3;if(menu==7&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN1=0xff; }else DUAN1=quan[nian%10];if(menu==2&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN2=0xff; }else DUAN2=quan[fen%10];delay(2);DUAN1=0xff;DUAN2=0xff;WEI=4;if(menu==6&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN1=0xff; }else DUAN1=quan[yue/10];if(menu==1&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN2=0xff; }else DUAN2=quan[miao/10];delay(2);DUAN1=0xff;DUAN2=0xff;WEI=5;if(menu==6&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN1=0xff; }else DUAN1=quan[yue%10];if(menu==1&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN2=0xff; }else DUAN2=quan[miao%10];delay(2);DUAN1=0xff;DUAN2=0xff;WEI=6;if(menu==5&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN1=0xff; }else DUAN1=quan[ri/10];DUAN2=0xff;delay(2);DUAN1=0xff;WEI=7;if(menu==5&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN1=0xff; }else DUAN1=quan[ri%10];if(menu==4&&y<80&&k1!=0&&k2!=0&&k3!=0&&k4!=0) {DUAN2=0xff; }else DUAN2=quan[xi%10];delay(2);DUAN1=0xff;DUAN2=0xff;}void button(void){if(k4==0){delay(10);if(k4==0){menu++;if(menu>=8){menu=0;}while(!k4){display();}}}if(menu==1){if(k2==0){delay(10);if(k2==0){miao++;if(miao==60){miao=0;}while(!k2){display();}}}if(k3==0){delay(10);if(k3==0){miao--;if(miao==255){miao=59;}while(!k3){display();}}}write_ds1302(0x8e,0x00);write_ds1302(0x80,miao/10*16+miao%10);write_ds1302(0x8e,0x80);y++; if(y>=160){y=0;}}if(menu==2){if(k2==0){delay(10);if(k2==0){fen++;if(fen==60){fen=0;}while(!k2){display();}}}if(k3==0){delay(10);if(k3==0){fen--;if(fen==255){fen=59;}while(!k3){display();}}}write_ds1302(0x8e,0x00);write_ds1302(0x82,fen/10*16+fen%10);write_ds1302(0x8e,0x80);y++; if(y>=160){y=0;}}if(menu==3){if(k2==0){delay(10);if(k2==0){shi++;if(shi==24){shi=0;}while(!k2){display();}}}if(k3==0){delay(10);if(k3==0){shi--;if(shi==255){shi=23;}while(!k3){display();}}}write_ds1302(0x8e,0x00);write_ds1302(0x84,shi/10*16+shi%10);write_ds1302(0x8e,0x80);y++; if(y>=160){y=0;}}if(menu==4){if(k2==0){delay(10);if(k2==0){xi++;if(xi==8){xi=1;}while(!k2){display();}}}if(k3==0){delay(10);if(k3==0){xi--;if(xi==0){xi=7;}while(!k3){display();}}}write_ds1302(0x8e,0x00);write_ds1302(0x8a,xi/10*16+xi%10);write_ds1302(0x8e,0x80);y++; if(y>=160){y=0;}}if(menu==5){if(k2==0){delay(10);if(k2==0){ri++;if(ri==32){ri=1;}while(!k2){display();}}}if(k3==0){delay(10);if(k3==0){ri--;if(ri==0){ri=31;}while(!k3){display();}}}write_ds1302(0x8e,0x00);write_ds1302(0x86,ri/10*16+ri%10);write_ds1302(0x8e,0x80);y++; if(y>=160){y=0;}}if(menu==6){if(k2==0){delay(10);if(k2==0){yue++;if(yue==13){yue=1;}while(!k2){display();}}}if(k3==0){delay(10);if(k3==0){yue--;if(yue==0){yue=12;}while(!k3){display();}}}write_ds1302(0x8e,0x00);write_ds1302(0x88,yue/10*16+yue%10);write_ds1302(0x8e,0x80);y++; if(y>=160){y=0;}}if(menu==7){if(k2==0){delay(10);if(k2==0){nian++;if(nian==100){nian=0;}while(!k2){display();}}}if(k3==0){delay(10);if(k3==0){nian--;if(nian==255){nian=99;}while(!k3){display();}}}write_ds1302(0x8e,0x00);write_ds1302(0x8c,nian/10*16+nian%10);write_ds1302(0x8e,0x80);y++; if(y>=160){y=0;} }if(k1==0){menu=0;while(!k1){display();} }}。

万年历制作

万年历制作

万年历的设计一、功能要求电子万年历能够显示阳历年,月,日,星期,时,分,秒和阴历月,日。

在显示阴历时间时,能标明是否是闰年。

二、方案论证按照系统的设计功能要求,初步确定设计系统由主控模块,时钟模块,显示模块,键盘接口模块4个部分组成,电路系统构成图1所示。

主控芯片使用80C51系列单片机。

时钟芯片使用的是一种高性能,低功耗,带RAM的实时时钟DS1302。

采用DS1302作为主要计时芯片,可以做到计时准确。

更重要的是DS1302可以在很小电流的后备电源(2.5~5.5V电源,在2.5V是耗电小于300nA)下继续计时,并可编程选择多种充电电流来对后备电源进行慢速充电,可以保证后备电源基本不耗电。

图1 万年历电路系统构成框图显示模块采用普通的共阳LED数码管,键输入采用查询法实现调整功能。

三、系统硬件电路的设计系统由主控制器A T89C52,时钟芯片DS1302,串口显示电路及键扫描电路组成。

其电路图如2图所示。

图2 万年历电路设计原理图3.1 主控器A T89C51ATMEL公司生产的AT89C52单片机采用高性能的静态80C51设计,欲先进工艺制造,并带有非易失性FLASH程序储存器。

它是一它是一种高性能,低功耗的8位CMOS微处理芯片,。

主要性能特点有:(1)8KB Flash ROM,可以擦除1000次以上。

数据保存10年,(2)256字节内部RAM(3)电源控制模式:时钟可停止和恢复;空闲模式;掉电模式。

(4)6个中断源(5)4个中断优先级(6)4个8位I/O 口(7)全双工增强型UART(8)3个16位定时/计数器,T9,T1和增加的T2(9)全静态工作方式:0~24MHz3.1.1单片机的引脚功能VCC(40脚):接电源+5V。

VSS(20脚):接地也就是GND。

XTAL1 (19 脚)和XATL2(18 脚):接振荡电路单片机是一种时序电路必须有脉冲信号才能工作在它的内部有一个时钟产生电路有两种振荡方式:一种是内部振荡方式只要接上两个电容和一个晶振即可;另一种是外部振荡方式采用外部振荡方式时需在XTL2 上加外部时钟信号详细的内容将在以后的课程中专门介绍PSEN(29 脚):片外ROM 选通信号低电平有效ALE/PROG(30 脚):地址锁存信号输出端/EPROM 编程脉冲输入端。

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

(汇编)实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历

;///////////////////////////////////////////;本程序源代码由湖南工程职业技术学院提供.;专业单片机培训,让你学习单片机更容易.;程序员:蒋庆桥;QQ:xxxxxxxxx;本程序用汇编实现数码管显示年,月,日,时,分,秒,星期,温度,按键可调万年历,H_ADJ BIT P3.0 ;时/年调整M_ADJ BIT P3.1 ;分/月调整S_ADJ BIT P1.4 ;秒/日调整DT_SET BIT P1.6 ;时间/日期选择STR BIT P1.5;启动走时T_RST BIT P1.0 ;实时时钟复位线引脚T_CLK BIT P1.1 ;实时时钟时钟线引脚T_IO BIT P1.2 ;实时时钟数据线引脚HH_BIT EQU 40H ;时高位HL_BIT EQU 41H ;时低位MH_BIT EQU 42H ;分高位ML_BIT EQU 43H ;分低位SH_BIT EQU 44H ;秒高位SL_BIT EQU 45H ;秒低位TEMPER_L EQU 46HTEMPER_H EQU 47HYH_BIT EQU 48H ;年高位YL_BIT EQU 49H ;年低位MOH_BIT EQU 4aH ;月高位MOL_BIT EQU 4bH ;月低位DH_BIT EQU 4cH ;日高位DL_BIT EQU 4dH ;日低位SEC EQU 30HMIN EQU 31HHOUR EQU 32HDAY EQU 33HMONTH EQU 34HWEEK EQU 35HYEAR EQU 36HTEMPER equ 37hFLAG1 BIT 20h.0 ;DS18B20存在标志位DQ BIT P1.3A_BIT EQU 55HB_BIT EQU 56HDS1302_ADDR EQU 5EHDS1302_DATA EQU 5FHORG 00HLJMP STARTSTART:MOV SP,#60HMOV TMOD,#11HMOV TH0,#3CHMOV TL0,#0B0HMOV R0,#10SETB EASETB ET0SETB TR0MOV R1,37HMOV YEAR,#13H ;上电预置日期、时间MOV WEEK,#03H ;周1 MONMOV MONTH,#07H ;2011 04 25 12:00:00MOV DAY,#05HMOV HOUR,#23HMOV MIN,#00HMOV SEC,#00HMOV 50H,#0/////////////////////////////////////////////////////////////////////// ////MAIN:LCALL KEY//MAIN2:CALL FENLILCALL INIT_18B20LCALL GET_TEMPERcall CHANGEcall dispcall displayAJMP MAINFENLI:MOV A,YEARMOV B,#10HDIV ABMOV YL_BIT,BMOV YH_BIT,AMOV A,MONTHMOV B,#10HDIV ABMOV MOL_BIT,BMOV MOH_BIT,AMOV A,DAYMOV B,#10HDIV ABMOV DL_BIT,BMOV DH_BIT,AMOV A,HOURMOV B,#10HDIV ABMOV HL_BIT,BMOV HH_BIT,AMOV A,MINMOV B,#10HDIV ABMOV ML_BIT,BMOV MH_BIT,AMOV A,SECMOV B,#10HDIV ABMOV SL_BIT,BMOV SH_BIT,ARETKEY: ;按键子程序JB F0,MAIN10 ;F0=1,开始走时。

电子万年历的设计与制作设计Word

电子万年历的设计与制作设计Word

天津电子信息职业技术学院课程设计课题名称电子万年历的设计与制作班级通信S11-1班专业通信技术所在系电子技术系电子万年历的设计与制作摘要单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。

单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。

将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。

本设计就是应用单片机强大的控制功能制作而成的电子万年历关键词:单片机;时钟电路;动态扫描;目录一、设计要求与方案论证 (6)1.设计要求: (6)2.系统基本方案选择: (7)(1)单片机芯片的选择方案和论证: (7)(2)显示模块选择方案和论证: (7)(3) 显示器的结构 (8)3.键盘模块的选择: (8)4.方案论证: (9)(1)技术可行性: (9)二、系统的硬件设计与实现 (9)1.电路设计框图: (9)2.系统硬件概述: (10)(1)控制模块 (10)(2)结构 (10)3.脚定义及功能 (10)(1)源及时钟引脚 (10)(2)控制引脚 (10)(3)I/O口引脚 (11)3.片外总线结构 (11)4.要单元电路的设计: (11)(1)控制模块的设计: (11)(2)模块器件 (12)(3)电路模块的设计 (14)(4)电路原理及说明 (15)(5)数据的输出与输入(I/O) (16)(6) DS1302的寄存器 (16)5.显示模块的设计 (17)三、系统的软件设计 (18)1.程序流程框图: (18)2.子程序的设计: (21)(1) 键盘子程序的实现: (21)(2).读写DS1302子程序 (21)3.系统硬件电路设计: (23)4.系统硬件PROTEUS仿真原理图: (24)5.主要单元电路的设计: (24)(1)显示4.1 显示部分设计 (24)(2)键盘接口: (25)(3)按键开关去抖动问题: (25)(4)查询式按键及其接口: (26)(5)矩阵式键盘及其接口 (26)(6)键盘扫描控制方式: (26)四、测试结果分析与结果 (27)1.测试结果分析 (27)(1)在测试中遇到LEDLCD16824不显示 (27)(2)按键调整时,不是按单位递增和递减 (28)五、系统评价 (28)六、系统程序清单 (28)七、谢辞 (31)八、参考文献 (31)绪论随着人们生活水平的提高和生活节奏的加快,对时间的要求越来越高,精准数字计时的消费需求也是越来越多。

基于VHDL的万年历设计

基于VHDL的万年历设计

摘要 (1)Abstract (2)绪论 (3)第1章基本概念简介 (4)1。

1 EDA技术和FPGA/CPLD简介 (4)1。

2 VHDL的简介 (4)1。

3 Quartus II的简介 (5)第2章系统设计 (6)2.1 设计思想 (6)2。

2 设计原理图 (7)2.3 设计流程图 (8)第3章模块分析 (9)3.1 计数器模块分析 (9)3.1。

1 秒和分计数器模块 (9)3.1。

2 时计数器模块 (10)3。

1。

3 日计数器模块 (12)3.1。

4 月计数器模块 (16)3.1.5 年计数器模块 (19)3.2 校时模块 (22)3。

3 显示及显示方式切换模块 (25)3。

4 顶层原理图 (26)第4章引脚设定与验证 (29)4。

1 引脚设定 (29)4。

2 下载验证 (31)总结 (33)参考文献 (34)致谢...................................... (错误!未定义书签。

)随着EDA(电子设计自动化)技术的发展和应用领域的扩大,EDA技术在电子信息、通信、自动化控制及计算机应用领域的重要性日益突出。

EDA技术作为现代电子设计技术的核心,它依赖功能强大的计算机,在EDA工具软件平台上,对以硬件描述语言HDL(Hardware Description language)为系统逻辑描述手段完成的设计文件,自动完成逻辑化简、逻辑分割、逻辑综合(布局布线)、逻辑优化和仿真测试等项功能,直至实现既定性能的电子线路系统功能。

EDA的关键技术之一是用形式化方法来描述数字系统的硬件电路、即用所谓的硬件描述语言来描述硬件电路。

本设计是基于VHDL语言的万年历。

在设计中,首先介绍了万年历的设计思路,且在Quartus II开发环境中编译和仿真所设计各个模块的程序,并逐一调试程序使各模块达到设计目的。

其次,利用各元器件生成顶层文件,进行系统仿真。

最后,对顶层原理图进行引脚设定,并下载到试验箱验证,证明系统的可行性.关键字:VHDL 万年历 Quartus IIAbstractWith the development of EDA (electronic design automation)technology and expansion of application fields ,the importance of EDA technology in electronic information, communication, auto control, and computer applications is becoming increasingly prominent. EDA technology is the core of the modern electronic design techniques, which rely on powerful computers 。

基于单片机的数码管万年历

基于单片机的数码管万年历

.c文件#include<reg52.h>#include<intrins.h>#include<1302.h>#include<18B20.h>#include<nl_week.h>uchar code digit[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x8f,0x00}; uchar mode,TH,TL,TN,seconds,minutes,hours,years,months,days,WEEK,n;uchar count=0;uchar nz;sbit SET=P3^7;sbit ADD=P3^6; //增加sbit RED=P3^5; //减小sbit CANL=P3^4;sbit le=P2^6;sbit oe=P2^7;sbit en=P1^4;sbit beep=P2^4;void delay1ms( int x){unsigned char i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);}void display_Year(unsigned char year) //显示年{unsigned char i,j;i=year/10;j=year%10;P0=digit[2];P1=0;delay1ms(2);P0=digit[0];P1=1;delay1ms(2);P0=digit[i];P1=2;delay1ms(2);P0=digit[j];P1=3;delay1ms(1);}void display_Month(unsigned char month) //显示月{unsigned char i,j;i=month/10;j=month%10;P0=digit[i];P1=4;delay1ms(3);P0=digit[j];P1=5;delay1ms(1);}void display_Day(unsigned char day) //显示日{unsigned char i,j;i=day/10;j=day%10;P0=digit[i];P1=6;delay1ms(3);P0=digit[j];P1=7;delay1ms(1);}void display_Hour(unsigned char hour) //显示时{unsigned char i,j;i=hour/10;j=hour%10;P0=digit[i];P1=8;delay1ms(2);P0=digit[j]+n*0x80;P1=9;delay1ms(1);}void display_Minute(unsigned char minute) //显示分{unsigned char i,j;i=minute/10;j=minute%10;P0=digit[i];P1=10;delay1ms(3);P0=digit[j];P1=11;delay1ms(1);}void display_Week(void){unsigned char i=0;WEEK=GetWeekFromDay(years,months,days); P1=12;switch(WEEK){case 1:P0=digit[1];// P1=12;delay1ms(2);break;case 2:P0=digit[2] ;// P1=12;delay1ms(2);break;case 3:P0=digit[3];// P1=12;delay1ms(2);break;case 4:P0=digit[4];// P1=12;delay1ms(2);break;case 5:P0=digit[5];// P1=12;delay1ms(2);break;case 6:P0=digit[6];// P1=12;delay1ms(2);break;case 7:P0=digit[8];// P1=12;delay1ms(2);break;}}void display_Time(void) //显示实时时间{unsigned char value;value=ReadSet1302(0x83);minutes=(((value&0x70)>>4)*10+(value&0x0f));display_Minute(minutes);value=ReadSet1302(0x85);hours=(((value&0x70)>>4)*10+(value&0x0f));display_Hour(hours);value=ReadSet1302(0x87);days=(((value&0x70)>>4)*10+(value&0x0f));display_Day(days);value=ReadSet1302(0x89);months=(((value&0x70)>>4)*10+(value&0x0f));display_Month(months);value=ReadSet1302(0x8D);years=(((value&0xf0)>>4)*10+(value&0x0f));display_Year(years);display_Week();}/*****************时间调整部分*********************/void hourset(void) //调时{unsigned char timevalue,hour;delay1ms(500); //防止多次触发WriteSet1302(0x8e,0x00);//将写保护去掉,确保能正常将调整后的数值写入DS1302timevalue=ReadSet1302(0x85); //读取此时的数值hour=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){hour++;delay1ms(100);while(ADD==0);}}if(RED==0){delay1ms(20);if(RED==0){hour--;delay1ms(100);if(hour==0) hour=23;while(RED==0);}}if(hour>=24) hour=0;timevalue=(((hour)/10)<<4|(hour%10));WriteSet1302(0x84,timevalue);delay1ms(2);display_Hour(hour);delay1ms(10);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void minuteset(void) //调分{unsigned char timevalue,minute;delay1ms(500);WriteSet1302(0x8e,0x00);timevalue=ReadSet1302(0x83);minute=(((timevalue&0x70)>>4)*10+(timevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){minute++;if(minute>=60) timevalue=0;while(ADD==0);}}if(RED==0){delay1ms(10);if(RED==0){minute--;if(minute==0) minute=59;delay1ms(300);while(RED==0);}}if(minute>=60) minute=0;timevalue=((minute/10)<<4|(minute%10));WriteSet1302(0x82,timevalue);delay1ms(2);display_Minute(minute);delay1ms(10);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void yearset(void) //调年{unsigned char datevalue,year;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x8d);year=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){year++;while(ADD==0);}}if(RED==0){delay1ms(20);if(RED==0){year--;delay1ms(100);while(RED==0);}}datevalue=((year/10)<<4|(year%10));WriteSet1302(0x8c,datevalue);delay1ms(5);display_Year(year);delay1ms(5);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void monthset(void) //调月{unsigned char datevalue,month;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x89);month=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){if(ADD==0){delay1ms(20);if(ADD==0){month++;if(month>12) month=1;while(ADD==0);}}if(RED==0){delay1ms(20);if(RED==0){month--;delay1ms(100);if(month==0) month=12;while(RED==0);}}datevalue=((month/10)<<4|(month%10));WriteSet1302(0x88,datevalue);delay1ms(5);display_Month(month);delay1ms(5);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void dayset(void) //调日{unsigned char datevalue,day;delay1ms(500);WriteSet1302(0x8e,0x00);datevalue=ReadSet1302(0x87);day=(((datevalue&0x70)>>4)*10+(datevalue&0x0f));while(1){if(ADD==0){delay1ms(10);if(ADD==0){day++;if(day>31) day=1;while(ADD==0);}}if(RED==0){delay1ms(10);if(RED==0){if(day==0) day=31;day--;delay1ms(300);while(RED==0);}}datevalue=((day/10)<<4|(day%10));WriteSet1302(0x86,datevalue);delay1ms(5);display_Day(day);delay1ms(5);if(CANL==0){mode=0;break;}if(SET==0) break;}WriteSet1302(0x8e,0x80);}void TimeSet(void) //时间调整函数{display_Time();if(SET==0){delay1ms(20);if(SET==0){ while (!SET) ;mode++;delay1ms(20);switch(mode){case(1):{hourset(); delay1ms(20);} break;case(2):{minuteset();delay1ms(20);} break;case(3):{yearset();delay1ms(20);} break;case(4):{monthset();delay1ms(20);} break;case(5):{dayset();delay1ms(20 );} break;}if(mode==6) mode=0;}}}/***************显示温度模块********************/unsigned char flag;/*********************显示温度整数部分*************************/ void Display_Integer(unsigned char x){unsigned char s,g;s=x%100/10;g=x%10;P0=digit[s];P1=13;delay1ms(3);P0=digit[g];P1=14;delay1ms(3) ;P0=digit[10];P1=15;delay1ms(1);}void display_Temperature(void){ReadyreadDS18B20();TL=ReadDS18B20();TH=ReadDS18B20();if((TH&0XF8)!=0X00){flag=1;TL=~TL;TH=~TH;TL+=1;if(TL>255) TH+=1;TN=TH*16+TL/16;// TD=(TL%16)*10/16;}TN=TH*16+TL/16;// TD=(TL%16)*10/16;Display_Integer(TN);}/**************** 设置模块******************/ void Set(void){if(SET==0){delay1ms(5);if(SET==0){delay1ms(50);while (!SET) ;while(1){TimeSet();if(CANL==0){break;}}}}}void InitTimer0(void){TMOD = 0x01;TH0 = 0x3C;TL0 = 0x0B0;EA = 1;ET0 = 1;TR0 = 1;}/***************主函数**********************/ void main(){int i;P0=0;// beep=0;InitTimer0();InitTimer0();IntDS1302(); //初始化DS1302delay1ms(5);le=1;oe=0;en=0;delay1ms(200);beep=1;while(1){for (i=1000;i>0;i--){Set( );display_Time( );Display_Integer(TN);if(hours==7||hours==8||hours==9||hours==10||hours==11||hours==12||hours==14||hours==15||hours==16||hours==17||hours==18||hours==19||hours==20||hours==21||hours==22||hours==23){if(minutes==0x00){uchar value;value=ReadSet1302(0x81);seconds=(((value&0x70)>>4)*10+(value&0x0f));if(seconds>0&&seconds<2)beep=0;else beep=1;}}}display_Temperature();}}void t0() interrupt 1{TH0 = 0x3C;TL0 = 0x0B0;count++;if(count==10){n=0;}if(count==20){ count=0;n=1;}}.h文件/*******DS1302模块*************/#define uchar unsigned char#define uint unsigned intsbit SCLK=P2^0; //DS1302时钟输入sbit DATE=P2^1; //DS1302数据输入sbit REST=P2^2; //DS1302复位端口void delaynus(unsigned char n) //延时若干微秒{unsigned char i;for(i=0;i<n;i++);}void Write1302(unsigned char date)//向1302写数据{unsigned char i;SCLK=0;delaynus(2);for(i=0;i<8;i++){DATE=date&0x01;SCLK=1;delaynus(2);SCLK=0;delaynus(2);date>>=1;}}void WriteSet1302(unsigned char cmd,unsigned char date) //根据相应的命令输入相应的数据{REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(5);Write1302(date);SCLK=1;REST=0;}unsigned char Read1302(void) //读取1302数据{unsigned char i,date;delaynus(2);for(i=0;i<8;i++){date>>=1;if(DATE==1) /////////////////////////////////////date|=0x80;SCLK=1;delaynus(2);SCLK=0;delaynus(2);}return date;}unsigned char ReadSet1302(unsigned char cmd)//根据命令读取1302相应的值{unsigned char date;REST=0;SCLK=0;REST=1;Write1302(cmd);delaynus(2);date=Read1302();SCLK=1;REST=0;return date;}void IntDS1302(void) //DS1302初始化{unsigned char flag;flag= ReadSet1302(0x81);if(flag&0x80) { //判断时钟芯片是否关闭WriteSet1302(0x8E,0x00); //根据写状态寄存器命令字,写入不保护指令WriteSet1302(0x80,((0/10)<<4|(0%10))); //根据写秒寄存器命令字,写入秒的初始值WriteSet1302(0x82,((0/10)<<4|(0%10))); //根据写分寄存器命令字,写入分的初始值WriteSet1302(0x84,((0/10)<<4|(0%10))); //根据写小时寄存器命令字,写入小时的初始值WriteSet1302(0x86,((0/10)<<4|(0%10))); //根据写日寄存器命令字,写入日的初始值WriteSet1302(0x88,((0/10)<<4|(0%10))); //根据写月寄存器命令字,写入月的初始值WriteSet1302(0x8c,((10/10)<<4|(10%10))); //根据写年寄存器命令字,写入年的初始值// WriteSet1302(0x90,0xa5); //打开充电功能选择2K电阻充电方式WriteSet1302(0x8E,0x80); //根据写状态寄存器命令字,写入保护指令}}sbit DQ=P2^3;unsigned char time;void delayms(unsigned char x){ unsigned char i,j;for(i=x;i>0;i--)for(j=124;j>0;j--);}/**********************DS18B20初始化****************************/ bit IntDS18B20(void){bit temp;DQ=1;for(time=0;time<2;time++);DQ=0;for(time=0;time<200;time++);DQ=1;for(time=0;time<10;time++);temp=DQ;for(time=0;time<200;time++);return temp;}/**************************读DS18B20**********************/ unsigned char ReadDS18B20(void){unsigned char i;unsigned char dat;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;_nop_();DQ=1;for(time=0;time<2;time++);dat>>=1;if(DQ==1)dat=dat|0x80;elsedat=dat|0x00;for(time=0;time<10;time++);}return dat;}void WriteDS18B20(unsigned char date){unsigned char i;for(i=0;i<8;i++){DQ=1;_nop_();DQ=0;DQ=date&0x01;for(time=0;time<10;time++);DQ=1;for(time=0;time<1;time++);date>>=1;}for(time=0;time<4;time++);}/*******************为读取温度做好准备************************/ void ReadyreadDS18B20(void){IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0X44);IntDS18B20();WriteDS18B20(0XCC);WriteDS18B20(0XBE);}// 计算2000~2099年任一天星期几 // year : 00-99 // month: 01-12 // day : 01-31unsigned char GetWeekFromDay(unsigned char year,unsigned char month,unsigned char day) {if( month == 1 || month == 2 ) {month += 12; if( year> 0 ) year--; elseyear = 4; }// 返回星期几(星期一用1表示,而星期天用7表示)return 1+(( day + 2*month + 3*(month+1)/5 + year + year/4 ) %7); }///////////////////////////////////////////////////////////////////////////////以上程序 你懂得////////////////////////////////////////////1234567ab cd ef g 8dp9GND a bf cg de dp 时1234567ab cd ef g 8dp9GNDa bf cg de dp 分1234567a b cd ef g 8dp9GNDa b f c g d e dp WEE K1234567a b cd e f g 8d p9G N Dabf cg de d p1234567ab cd ef g 8dp9GNDa b f c gde dp 温度1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567ab cd ef g 8dp9GNDa bf cg de dp 1234567ab cd ef g 8dp9GND a bf cg de dp 1234567ab cd ef g 8dp9GNDa bf cg de dp 月1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567ab cd ef g 8dp9GNDa bf cg de dp 日1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567a b cd ef g 8dp9GNDa b f c g d e dp 1234567ab cd ef g 8dp9GNDa bf cg de dp 年1234567a b cd ef g 8dp9GNDa b f c g d e dp A B C D E F G DPA B C D E F G DP A B C D E F G DP A B C D E F G DPA B C D E F G DPA B C D E F G DPW1W2W3W4W5W6W7W8W9W10W11W12W13W14W15W16A B C D E F G DPDP G F E D C B AVcc21X12X23GND 4RST 5I/O6SCL K 7Vcc8DS1302EA/VPP 31XT AL119XT AL218RST /VPD 9P3.7/RD 17P3.6/WR 16P3.2/INT 012P3.3/INT 113P3.4/T 014P3.5/T 115P1.0/T 1P1.1/T 2P1.23P1.34P1.45P1.56P1.67P1.78P0.039P0.138P0.237P0.336P0.435P0.534P0.633P0.732P2.021P2.122P2.223P2.324P2.425P2.526P2.627P2.728PSEN29AL E/PROG30P3.1/T XD 11P3.0/RXD 10Vcc 40Gnd20STC89C52RE SETRE DSETADDCANL10K2001K30pf 10uf 30pf10uf10ufOC 1C 111D 22D 33D 44D 55D 66D 77D 88D91Q 192Q 183Q 174Q 165Q 156Q 147Q 138Q1274HC573A 23B 22C 21D20G118G21901122334455667788991010111112121313141415151674LS15412MHz 32768HzVCCA B C D E F G DPP2_6P2_7P2_7P2_6VCC3V8550BUZZE RVCCV C C3D Q2G N D1DS18b20VCCW1W2W3W4W5W6W7W8W9W10W11W12W13W14W15W16VCC仅供参考 谢谢合作另外本人还有 中断刷屏的万年历程序 包含时间显示阴历农历 温度显示功能 实物也制作出来 !!。

TG2518万年历原理图

TG2518万年历原理图

A B C D E F G
A B C D E F G
A B C D E F G
A B C D E F G
A B C D E F G
A B C D E F G
A B C D E F G
LED11 LED12 LED13
A F G E C E B F
A B G C E F
A B G C E F
A B G C E F
TG2518基本+生肖+星座原理图
深圳市南方泰科软件技术有限公司 XBW20050702
A
OUT
A P1 2 1 AC9V
C6 47 0u
C7 10 4
C8 47 0u
注意: 1. 此图适合1英寸以下的数码管,如有1.2英寸数码管以上的原理图要做调整。 2. P24接30K电阻到地,上电初始显示12小时制;否则为24小时制。 3. R10为10K的热敏电阻,B值为3550;R9为10K精密电阻,其精度为1%。 4. P16接30K电阻到地,星期为7个LED显示,不用数码管U19,有和弦,无中文报时。 5. P19接30K电阻到地,为越南版,星期为数码管显示2—8,不用7个LED,有和弦,无中文报时。 6. P19和P16各接30K电阻到地,为俄文版,星期为数码管显示1—7,不用7个LED,有和弦,无中文报时。 7. 如果用5V供电,喇叭应接到5V上。 8. 如果不要流水鸟叫功能,此原理图也适合经济型的TG2488芯片。
1
2 VCC
3
4
5
6
7
8
IC2 SER
VC C
VCC
P1 2 P1 1
14 11 10
16
O0 O1 O2 O3 O4 O5 O6 O7
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数码管万年历制作详解
安装前先将元件放入元件盒, 防止丢失
电路板元件面
电路板焊面
首先焊接5根跳线,可用剪 下的元件引脚作跳线。
这两根是作电 池夹的负极用
焊接10K(棕黑橙金) 电阻两个
焊接4.7Ω(黄紫金金) 电阻两个,
焊接四个二 极管 1N4007
二极管注意正负极, 二极管有白色标记 一端是负极
安装电池夹,注意 方向,电池的入口 要朝下,便于电池 安装
安装11个0.5英寸,4个0.8英寸的数码 管,注意方向,小数点均应在右下角
所有元件 的安装高 度均不能 超过数码 管高度
准备安装芯片,先要 把晶振和插脚焊到芯 片上
先把晶振焊到芯 片上
把插脚焊到芯片上, 请注意晶振和插脚 都要从芯片反面插 入
焊接二个三 端稳压7805
焊接插脚时间要短, 7805的方向不 防止损坏芯片,
要装错
发光管长 脚正极, 短脚负极 左侧半圆 端接发光 管正极, 右侧直线 端接发光 管负极
发光管安装尽量贴 近板面
安装两个电解电容, 注意极性,电路板上 阴影一侧接负极,电 解电容的长脚是正极, 短脚是负极
两个电解电容都要 横过来安装,贴在 板子上
这条是公共线,通 过排线要焊到主板 公共端,不能反了
将按钮小板固定到外壳上,注 意1号设置按钮在这个位置
1号设置 按钮
1号设置按钮 正好对应外 壳设置字样
将变压器次级 接到主板上
将电源线通 过这个孔穿 到机壳内, 这里打个结, 可以防止电 源线拉脱
将电源线接在变 压器的初级,绝 缘胶布一定要包 好。
焊接插脚时间要短, 防止损坏芯片,
把焊好晶振和插脚 的芯片焊到电路板, 注意方向,缺口在 这里
缺口在这里
焊锡不要过度 防止脚间短路
准备安装按钮小板
1号设置按钮
3号下调按 钮
4号退出 按钮
2号上调按钮
反过来后1号设 置按钮是这个,
焊上排线和按钮
喇叭焊上引 线
将按钮小板和喇 叭焊到主板上
变压器用螺 丝固定住
喇叭用螺丝 固定住
用四个螺丝把主板固 定到机壳上
检查无误后, 安装前盖,通 电。
具体调时方向请参考说 明书,这里不再重复。
珍惜时光的装 饰条贴在这里源自谢谢观赏
相关文档
最新文档