新数码管万年历制作详解
带温度显示的万年历_数码管显示(附电路图和源代码)
设计报告设计任务:设计一个智能化万年历时钟电路,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设计的可调万年历(本制作所用数码管全为共阳数码管)我刚开始想做万年历的时候是上网找别人的程序,可是发现找了很多都不理想,要不就没日历和时间一起显示,要不就不能调时间的,后来我研究了两天,自己终于把程序编了出来。
好了,废话我就不多说,本制作我已经把实物做了出来,保证没问题!下面附有仿真图和实物图。
拍摄的效果不够好,但实物是不错的,本人实物中用三级管代替了仿真图的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
天津电子信息职业技术学院课程设计课题名称电子万年历的设计与制作班级通信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的万年历设计
摘要 (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万年历原理图
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
电子万年历(数码管显示)
程序#include<reg51.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define jump_ROM 0xCC#define start 0x44#define readdata 0xBEsbit dq=P1^7;sbit w1=P0^6;sbit w2=P0^5;sbit w3=P0^4;sbit w4=P0^7;sbit wela=P0^3;sbit A=P0^0;sbit b=P0^1;sbit C=P0^2;sbit SCLK=P1^0; //DS1302通讯线定义sbit DIO=P1^1;sbit RST=P1^2;sbit k1=P1^6;sbit k2=P1^5;sbit add=P1^4;sbit sub=P1^3;uchar code smgw[]={0,1,2,3,4,5,6,7};uchar code smgd[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x00};//uchar code tab[]={0x077,0x12,0x0c7,0x0d3,0x0b2,0x0f1,0x0f4,0x13,0x0f7,0x0b3,0x00}; uchar temperature[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};uchar code xingqi[] ={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x7f};uchar tab1[9];uchar tab2[9];uchar nian,yue,ri,zhou,shi,fen,miao,a,shan,tt,shan;uchar knum;uchar q,j,tempp;void display();void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=55;y>0;y--);}void delay1(int useconds){int s;for(s=0;s<useconds;s++);}uchar resetds(void){uchar presencesignal;dq=0;delay1(30);dq=1;delay1(3);presencesignal=dq;delay1(30);return presencesignal;}void writebit(char val){ dq=0;if(val==1)dq=1;elsedq=0;delay1(5);dq=1;}void writebyte(char val) {uchar i;uchar temp;for(i=0;i<8;i++){temp=val>>i;temp&=0x01;writebit(temp);}delay1(5);}uchar readbit(void) {uchar i;dq=0;dq=1;for(i=0;i<3;i++)return dq;}uchar readbyte(void) {uchar i;uchar value=0;for(i=0;i<8;i++) {if(readbit())value|=0x01<<i;delay1(7);}return (value);}void temper(){uchar get[9];uchar k,lsb,msb,n;int m;float t;m=0;resetds();writebyte(jump_ROM);writebyte(start);delay1(5);resetds();writebyte(jump_ROM);writebyte(readdata);display();for(k=0;k<9;k++){get[k]=readbyte();}msb=get[1];lsb=get[0];if((msb&0x80)!=0) // /取补码/ {m=1;msb=~msb;lsb=( ~lsb)+1;if(lsb==0){msb++;}}display();n=lsb;msb=msb<<4;lsb=lsb>>4;tempp=msb|lsb;n=n&0x0f;t=(float )(n);t=t*0.0625;j=(int)(t*100);P2=temperature[j%10];w4=1;w1=0;delay(2);P2= temperature[j/10];w1=1;w2=0;delay(2);P2=temperature[tempp%10]+0x80;w2=1;w3=0;delay(2);P2= temperature[tempp/10];w3=1;w4=0;delay(2);w4=1;}void write(uchar date) //写入DS1302一个字节{uchar temp,i;RST=1;SCLK=0;temp=date;for(i=0;i<8;i++){SCLK=0;if(temp&0x01)DIO=1;elseDIO=0;SCLK=1;temp>>=1;}}uchar read() //读出DS1302一个字节{uchar a,temp;RST=1;for(a=8;a>0;a--){temp>>=1;SCLK=1;_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();SCLK=0;if(DIO){temp=temp|0x80;}else{temp=temp|0x00;}}return (temp);}void write_1302(uchar add,uchar dat) //写DS1302数据{RST=0;SCLK=0;RST=1;write(add);write(dat);SCLK=1;RST=0;}uchar read_1302(uchar add) //读DS1302数据{uchar dat1,dat2;RST=0;SCLK=0;RST=1;write(add);dat1=read();SCLK=1;RST=0;dat2=dat1/16; //数据进制转换dat1=dat1%16;dat1=dat1+dat2*10; //十六进制转十进制return(dat1);}void ds1302_init() //1302初始化{RST=0;SCLK=0;write_1302(0x8e,0x00); //允许写入write_1302(0x80,0x00);//设置初始值SECwrite_1302(0x82,0x59);//设置初始值MINwrite_1302(0x84,0x23);//设置初始值HRwrite_1302(0x86,0x20);//设置初始值DA TEwrite_1302(0x88,0x4);//设置初始值MONTH write_1302(0x8A,0x03);//设置初始值DAYwrite_1302(0x8C,0x12);//设置初始值YEARwrite_1302(0x8e,0x80);}void display(){ P2=temperature[j%10];w4=1;w1=0;delay(2);P2= temperature[j/10];w1=1;w2=0;delay(2);P2=temperature[tempp%10]+0x80;w2=1;w3=0;delay(2);P2= temperature[tempp/10];w3=1;w4=0;delay(2);w4=1;miao=read_1302(0x81); //读秒fen=read_1302(0x83); //读分shi=read_1302(0x85);//&0x3f; //读时ri=read_1302(0x87); //读日yue=read_1302(0x89); //读月nian=read_1302(0x8d); //读年zhou=read_1302(0x8B); //读星期if(knum==7){wela=0; //年A=0;b=1;C=1;P2=0x5b&shan;delay(2);A=1;b=1;C=1;P2=0x3f&shan;delay(2);wela=1;A=0;b=0;C=0;P2=smgd[nian/10]&shan;delay(2);A=1;b=0;C=0;P2=smgd[nian%10]&shan;delay(2);}else{wela=0; //年A=0;b=1;C=1;P2=0x5b;delay(2);A=1;b=1;C=1;P2=0x3f;delay(2);wela=1;A=0;b=0;C=0;P2=smgd[nian/10];delay(2);A=1;b=0;C=0;P2=smgd[nian%10];delay(2);}if(knum==6){ wela=1;A=0;b=1;C=0; // 月P2= smgd [yue/10]&shan;delay(2);A=1;b=1;C=0;P2= smgd [yue%10]&shan;delay(2);}else{ wela=1;A=0;b=1;C=0; // 月P2=smgd [yue/10];delay(2);A=1;b=1;C=0;P2= smgd [yue%10];delay(2);}if(knum==4){ wela=1;A=0;b=1;C=1; // 星期P2=xingqi[zhou%10]&shan;delay(2);}else{A=0;b=1;C=1; // 星期P2=xingqi[zhou%10];delay(2);}if(knum==5){wela=1;A=0;b=0;C=1; // 日P2= smgd [ri/10]&shan;delay(2);A=1;b=0;C=1;P2= smgd [ri%10]&shan;delay(2);}else{ wela=1;A=0;b=0;C=1; // 日P2= smgd [ri/10];delay(2);A=1;b=0;C=1;P2= smgd [ri%10];delay(2);}if(knum==3){ wela=0;A=0;b=0;C=0; // 时P2= smgd [shi/10]&shan;delay(2);A=1;b=0;C=0;P2= smgd [shi%10]&shan;delay(2);}else{ wela=0;A=0;b=0;C=0; // 时P2= smgd [shi/10];delay(2);A=1;b=0;C=0;P2= smgd [shi%10];delay(2);}if(knum==2){ wela=0;A=0;b=1;C=0; // 分P2= smgd [fen/10]&shan;delay(2);A=1;b=1;C=0;P2= smgd [fen%10]&shan;delay(2);}else{ wela=0;A=0;b=1;C=0; // 分P2= smgd [fen/10];delay(2);A=1;b=1;C=0;P2= smgd [fen%10];delay(2);}if(knum==1){ wela=0;A=0;b=0;C=1; // 秒P2= smgd [miao/10]&shan;delay(2);A=1;b=0;C=1;P2= smgd [miao%10]&shan;delay(2);wela=1;A=1;b=1;C=1;}else{ wela=0;A=0;b=0;C=1; //秒P2= smgd [miao/10];delay(2);A=1;b=0;C=1;P2= smgd [miao%10];delay(2);wela=1;A=1;b=1;C=1;}}void key(){uchar temp;display();if(k1==0){delay1(20);if(k1==0){while(!k1);knum++;if(knum==8){knum=1;}}}if(k2==0){delay1(20);if(k2==0){while(!k2);knum--;if(knum==0){knum=7;}}}if(knum!=0){if(add==0){delay1(20);if(add==0){while(!add);switch(knum){case 1: miao++;if(miao==60){miao=0;}temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x80,temp);write_1302(0x8e,0x80); //打开写保护break;case 2:fen++;if(fen==60)fen=0;temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x82,temp);write_1302(0x8e,0x80); //打开写保护}break;case 3: shi++;if(shi==24){shi=0;}temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x84,temp);write_1302(0x8e,0x80); //打开写保护break;case 5:ri++;switch(yue){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri==32)ri=1;break;case 4:case 6:case 9:case 11:if(ri==31)ri=1;break;case 2:if(nian%4==0||nian%400==0){if(ri==30)ri=1;}elseif(ri==29)ri=1;}break;}temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x86,temp);write_1302(0x8e,0x80); //打开写保护break;case 4:zhou++;if(zhou==8)zhou=1;temp=(zhou)/10*16+(zhou)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8a,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 6: yue++;if(yue==13)yue=1;temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x88,temp);write_1302(0x8e,0x80); //打开写保护break;case 7:nian=(((nian>>4)&0x0f)*10+(nian&0x0f))+1;if(nian==99)nian=0;//temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8c,((nian/10)<<4)+((nian%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;}}if(sub==0){delay1(20);if(sub==0){while(!sub);switch(knum){case 1: miao--;if(miao==-1)miao=59;temp=(miao)/10*16+(miao)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x80,temp);//write_1302(0x80,((miao/10)<<4)+((miao%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 2:fen--;if(fen==-1)fen=59;temp=(fen)/10*16+(fen)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x82,temp);//write_1302(0x82,((fen/10)<<4)+((fen%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护}break;case 3:shi--;if(shi==-1)shi=23;temp=(shi)/10*16+(shi)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x84,temp);//write_1302(0x84,((shi/10)<<4)+((fen%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 5:ri--;switch(yue){case 1:case 3:case 5:case 7:case 8:case 10:case 12:if(ri==0)ri=31;break;case 4:case 6:case 9:case 11:if(ri==0)ri=30;break;case 2:if(nian%4==0||nian%400==0){if(ri==0)ri=29;}else{if(ri==0)ri=28;}break;}temp=(ri)/10*16+(ri)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x86,temp);//write_1302(0x86,((ri/10)<<4)+((ri%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 4:zhou--;if(zhou==0)zhou=7;temp=(zhou)/10*16+(zhou)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8a,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 6: yue--;//yue=(((yue>>4)&0x01)*10+(yue&0x0f))-1;if(yue==0)yue=12;temp=(yue)/10*16+(yue)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x88,temp); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;case 7:nian=(((nian>>4)&0x0f)*10+(nian&0x0f))-1;if(nian==-1)nian=99;//temp=(nian)/10*16+(nian)%10;//十进制转换成DS1302要求的DCB码write_1302(0x8e,0x00); //允许写,禁止写保护write_1302(0x8c,((nian/10)<<4)+((nian%10)&0x0f)); //向DS1302内写秒寄存器80H写入调整后的秒数据BCD码write_1302(0x8e,0x80); //打开写保护break;}}}}}void main(){ds1302_init();IT0=1;EX0=1;TMOD=1;TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;shan=0x00;temper();while(1){temper();for(q=0;q<230;q++)key();display();}}void int0() interrupt 0{TR0=~TR0;knum=0;shan=0x0ff;}void time0() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;tt++;if(tt==9){tt=0;shan=~shan;}}。
项目四数字万年历制作与调试
项目四数字万年历的制作与调试一、项目要求:⑴熟悉元器件的特点、规格,性能指标、外形尺寸、识别标志以及包装形式。
⑵分析电路原理,绘图设计PCB板。
⑶注意元件的极性,合理调试。
二、项目目标:⑴熟练掌握焊接技术,保证质量,了解自动焊接技术。
⑵掌握手工焊接SMT元器件的要求与条件步骤、SMT元器件的焊接与手工拆焊工艺。
⑶掌握浸焊、波峰焊、回流焊SMT焊接检查设备及工艺方法。
⑷掌握电子产品生产操作的基本技能及其调试方法。
⑸培养自身安全意识。
二.知识链接1.集成电路:定义:集成电路是利用半导体工艺、厚薄膜工艺、薄膜工艺,将有源器件、无源器件按照设计要求连接起来,制作在同一硅片上,形成具有特定功能的电路,并封装在管壳之中,英文为缩写为IC,也俗称芯片。
特点:体积小,重量轻,功耗低,成本低,可靠性低,性能稳定。
分类:按照制作工艺分为:半导体集成电路,薄膜集成电路,厚膜集成电路,混合集成电路;按照功能分为:模拟集成电路,数字集成电路,微波集成电路;按照集成规模分为:小规模(SSI),中规模(MSI),大规模(LSI),超大规模(VLSI);按照电路中晶体管的类别分为:双极型集成电路,单极性集成电路。
封装:封装形式:指安装半导体集成电路芯片用的外壳封装作用:起着安装、固定、密封、保护芯片等方面的作用常用的封装材料:塑料,陶瓷,金属。
金属封装特点:散热性好,可靠性高,但安装使用不方便,成本高。
一般高精密度集成电路或大功率器件均以此形式封装。
按国家标准有T和K型两种;陶瓷封装特点:散热性差,但体积小,成本低。
陶瓷封装的形式可分为扁平型和双列直插式型;塑料封装特点:这是目前使用最多的封装形式。
)圆形分装:将管底对准集成电路,引脚编号按顺时针方向排列(现应用较少)单列直插式封装(SIP):集成电路引脚朝下,以缺口、凹槽或色点作为引脚参考标记,引脚编号顺序一般从左到右排列双列直插是封装(DIP):集成电路引脚朝上,以缺口或色点等标记为参考标记,引脚编号按顺时针方向排列;反之,引脚按逆时针方向排列三脚封装:正面(印有型号商标的一面)朝向集成电路,引脚编号顺序自左向右方向排列。
电子万年历
基于STC单片机综合控制系统的设计与制作电子万年历的制作一、设计任务1、设计任务:利用单片机、时钟芯片DS1302、温度传感器DS18B20、1602液晶等实现日期、时间、温度的显示即一个简单的万年历。
2、设计要求(1)通过DS1302能够准确的计时,时间可调并在液晶上显示出来。
(2)通过DS18B20能够实时、准确的检测当前环境温度。
(3)利用单片机自身功能实现闹钟。
二、设计方案及选材1、液晶显示模块方案(1):数码管是利用发光二极管的特性组合而成数字显示器件,通过控制相应的二极管的状态显示相应的数字。
要使数码管正常显示就得有驱动电路驱动相应的段码,数码管的现实方式可分为静态显示和动态显示,静态显示方式只适合显示单个的数字,因此本设计应采用动态显示方式。
由于动态显示方式利用的是人眼视觉暂留的特性,扫描的时间应不大于20毫秒,占用系统资源大,而且显示的个数和字型有限,在本设计中不易采用。
方案(2):1602液晶也叫1602字符型液晶它是一种专门用来显示字母、数字、符号等的点阵型液晶模块它有若干个5X7或者5X11等点阵字符位组成,每个点阵字符位都可以显示一个字符。
每位之间有一个点距的间隔,每行之间也有也有间隔,起到了字符间距和行间距的作用。
1602的驱动电路带有11条指令,可以很方便的控制液晶的现实效果如:清屏、左移右移、光标显示。
而且1602显示的字符在下一条指令为到来之前不会改变,也就是能够维持显示的字符,1602液晶占用的系统资源也少。
综合比较上述两种方案,应采用1602液晶组成本设计的显示模块。
2、实时时间计算模块方案(1):AT89S52单片机内部带有定时/计数功能,此定时功能是通过对外部晶振的脉冲进行计数,从而达到计时功能,只要使用11.0592的晶振就能实现零误差的计时,因此可以利用此功能实现计时,但因为只有单一的计时功能要实现“万年历”的功能需要较复杂的程序,而且如果单片机掉电无法继续进行计时,所以使用不便。
数码管万年历
目录引言 (1)第一章智能化万年历时钟电路设计仿真 (2)1.1设计思路 (2)1.2构成框图 (2)第二章系统硬件电路的设计 (3)2.1单片机的选择与参数介绍 (3)2.2时钟功能的实现选择 (5)2.3复位电路的选择 (5)2.4时间调整电路的设计 (6)2.5时间显示电路的设计 (7)2.5.1 扫描方式的选择 (7)2.5.2 LED数码管的选择 (7)2.5.3 显示电路的整体实现 (9)第三章系统程序设计与软件仿真 (10)3.1主程序的设计 (10)3.2仿真实验 (11)第四章实物的制作与调试 (12)4.1原理图的绘制与PCB的制作 (12)4.1.1 原理图的绘制 (12)4.1.2 PCB的绘制 (13)4.2元件安装焊接 (14)4.3系统的调试 (15)结论............................................................................................................. 错误!未定义书签。
参考文献 ................................................................................................... 错误!未定义书签。
附录一 PROTEL 99SE原理图 (16)附录二 PCB板图 (17)附录三元器件清单 (18)附录四实物图........................................................................................ 错误!未定义书签。
附录五系统源程序 .. (18)致谢 (28)引言电子科技日新月异,人们对现代电子设备的智能化和微型化及其精度提出了更高的要求,而单片机因其具有稳定可靠、体积小、价格低廉等特点,成为设计智能化仪器仪表的首选微控制器,因此本次我们没有选用传统的专用的时钟芯片,而是采用了A T89C51芯片,此款单片机可以使用软件对其进行在线编程,其灵活性和可靠性都相对提高。
数码管显示万年历附源程序不使用DS1302
南阳理工学院电子系周渴望功能:这里的万年历使用数码管显示,并且不使用DS1302芯片,自己动手切切实实的做一个纯有单片机控制的万年历,通过定时器准确定时。
按键有选择位按键进行某位选择,选择某位某位闪烁并且此时可以对此位进行加减操作,不闪烁则不可以进行加减操作。
加按键,减按键,显示切换按键,显示按键没有按下时默认显示时分秒,按第一次显示时分秒,按下第二次显示年夜日,按下第三次年月日时分秒进行轮流显示。
本次设计是真正的万年历,其中年分平年闰年,月份有31天,30天,29天(平年),28天(闰年)之分,用定时器进行精确的秒计时。
下面是仿真图(实物已作出)下面上程序(由于程序自己写的想到哪写到哪有点乱,请慢慢看)#include <reg52.h>#define uchar unsigned char#define uint unsigned intsbit button1=P1^0; /*定义选择位按钮*/sbit button2=P1^1; /*定义加数按钮*/sbit button3=P1^2; /*定义减数按钮*/sbit button4=P1^3; /*定义显示切换按钮按钮*/sbit SPK=P3^5;uchar code duan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; /*这里是段选,共阴极数码管*/uchar fen,shi,shi1,shi2,fen1,fen2,miao1,miao2;uchar ri,yue,ri1,ri2,yue1,yue2,nian1,nian2,nian3,nian4; /*定义几个字符型变量*/uchar miao,temp,run,moshi;uint nian,num,num1; /*定义几个int型变量*/void display(uchar,uchar,uchar,uchar,uchar,uchar,uchar,uchar); /*前面几个函数声明*/ void server_jia();void button();void zhengdian();void dingshi() /*初始化定时器0*/{TMOD=0x01;TH0=(65536-1000)/256;TL0=(65536-1000)%256;TH1=(65536-1000)/256;TL1=(65536-1000)%256;TR0=1;TR0=1;EA=1;ET0=1;ET1=1;}void server_miao() interrupt 1 /*做时间,每次中断时间是1秒。
基于51数码管显示的万年历(仿真+程序【完整】)
基于数码管显示的万年历(proteus仿真+C程序)Proteus仿真图C语言程序/****************************************************** ***TITLE: 万年历设计FUNCTION: 显示:年-月-日-星期-时-分-秒WRITER: LINLIANHUOTIME: 2014-07-24REMARK: 译码扫描时间不能过长,否则无法实现调整**********************************************************/#include<reg51.h>#define uint unsigned int#define uchar unsigned char/***********码表***************/uchar code smg_table[]={0xBF,0x86,0xDB,0xCF,0xE6,0xED,0xFD,0xA7,0xFF,0xEF,0xC0}; uchar code months_days[]={31,28,31,30,31,30,31,31,30,31,30,31};uchar code transcode[]={0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed, 0xee,0xef,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd};uchar buffer[22]={0};/**********数据定义*********/uchar add_sub;uchar key_detection=0;uchar count=0;typedef struct{uchar year[2];uchar month;uchar day;uchar week;}date;typedef struct{uchar hour;uchar minute;uchar second;}moment;date today={{14,20},7,25,5};moment now={16,52,45};/**********延时子程序*************/ void delay(){uchar i,j;for(i=0;i<=8;i++)for(j=0;j<40;j++);}/**********数码管显示子程序***********/ void smg_display(){uchar i;buffer[0]=now.second%10;buffer[1]=now.second/10;buffer[2]=10;buffer[3]=now.minute%10;buffer[4]=now.minute/10;buffer[5]=10;buffer[6]=now.hour%10;buffer[7]=now.hour/10;buffer[8]=today.week%10;buffer[9]=today.week/10;buffer[10]=10;buffer[11]=today.day%10;buffer[12]=today.day/10;buffer[13]=10;buffer[14]=today.month%10;buffer[15]=today.month/10;buffer[16]=10;buffer[17]=today.year[0]%10;buffer[18]=today.year[0]/10;buffer[19]=today.year[1]%10;buffer[20]=today.year[1]/10;buffer[21]=10;for(i=0;i<22;i++){P0=smg_table[buffer[i]];P2=transcode[i];delay();P2=0xff;}}/***********初始化子程序************/void init(){TMOD=0X01;TH0=55535/256;TL0=55535%256;EA=1;ET0=1;TR0=1;P1=0XFF;}/**********按键扫描子程序********/void key_scan(){key_detection=P1&0xff;add_sub=key_detection&0x80;switch(add_sub){case 0x80:switch(key_detection){case 0xfe:{EA=1;EX0=1;IT0=1;}break;case 0xfd:{EA=1;EX0=1;IT0=1;}break;case 0xfb:{EA=1;EX0=1;IT0=1;}break;case 0xf7:{EA=1;EX0=1;IT0=1;}break;case 0xef:{EA=1;EX0=1;IT0=1;}break;case 0xdf:{EA=1;EX0=1;IT0=1;}break;case 0xbf:{EA=1;EX0=1;IT0=1;}break;default: {EA=1;EX0=0;TR0=1;}break;}break;case 0x00:switch(key_detection){case 0x7e:{EA=1;EX0=1;IT0=1;}break;case 0x7d:{EA=1;EX0=1;IT0=1;}break;case 0x7b:{EA=1;EX0=1;IT0=1;}break;case 0x77:{EA=1;EX0=1;IT0=1;}break;case 0x6f:{EA=1;EX0=1;IT0=1;}break;case 0x5f:{EA=1;EX0=1;IT0=1;}break;case 0x3f:{EA=1;EX0=1;IT0=1;}break;default: {EA=1;EX0=0;TR0=1;}break;}break;}}/***********闰年计算子程序***********/ uchar leap_year(uchar a,uchar b){uchar x,y;x=a*100+b;if((x%4==0)&&(x%100!=0)||(x%400==0)) y=1;elsey=0;return y;}/***********主程序************/void main(){init();while(1){key_scan();}}/**********T0中断服务子程序************/ void T0_int() interrupt 1 using 0{uchar l;TH0=55535/256;TL0=55535%256;count++;if(count==30){count=0;now.second++;if(now.second>=60){now.second=0;now.minute++;if(now.minute>=60){now.minute=0;now.hour++;if(now.hour>=24){now.hour=0;today.day++;today.week++;if(today.week>=8){today.week=1;}l=leap_year(today.year[1],today.year[0]);if((l==1)&&(today.month==2)){if(today.day>=30){today.day=1;today.month++;}}elseif(today.day>=months_days[today.month-1]+1){today.day=1;today.month++;if(today.month>=12){today.month=1;today.year[0]=today.year[0]+1;if(today.year[0]>=100){today.year[0]=0;today.year[1]=today.year[1]+1;if(today.year[1]==100){today.year[1]=0;}}}}}}}}smg_display();}/*************INT0中断服务子程序*****************/void int0_int() interrupt 0 using 1{uchar k;switch(add_sub){case 0x80:switch(key_detection){case 0xfe:{now.second++;if(now.second>=60) now.second=0;smg_display();}break;case 0xfd:{now.minute++;if(now.minute>=60) now.minute=0;smg_display();}break;case 0xfb:{now.hour++;if(now.hour>=24) now.hour=0;smg_display();}break;case 0xf7:{today.week++;if(today.week>=8) today.week=1;smg_display();}break;case 0xef:{today.day++;k=leap_year(today.year[1],today.year[0]);if((k==1)&&(today.month==2)){if(today.day>=30) today.day=1;}elseif(today.day>=months_days[today.month-1])today.day=1;smg_display();}break;case 0xdf:{today.month++;if(today.month>=13)today.month=1;smg_display();}break;case 0xbf:{today.year[0]=today.year[0]+1;if(today.year[0]>=100){today.year[0]=0;today.year[1]=today.year[1]+1;if(today.year[1]==100)today.year[1]=0;}smg_display();}break;default:{EA=1;EX0=0;TR0=1;}break; }break;case 0x00:switch(key_detection){case 0x7e:{//now.second++;if(now.second>0) now.second--;else now.second=59;smg_display();}break;case 0x7d:{//now.minute++;if(now.minute>0) now.minute--;else now.minute=59;smg_display();}break;case 0x7b:{//now.hour++;if(now.hour>0) now.hour--;else now.hour=23;smg_display();}break;case 0x77:{//today.week++;if(today.week>1) today.week--;else today.week=1;smg_display();}break;case 0x6f:{//today.day++;k=leap_year(today.year[1],today.year[0]);if((k==1)&&(today.month==2)){if(today.day>1) today.day--;else today.day=29;}else{if(today.day>1) today.day--;elsetoday.day=months_days[today.month-1];}smg_display();}break;case 0x5f:{//today.month++;if(today.month>1)today.month--;else today.month=12;smg_display();}break;case 0x3f:{//today.year[0]=today.year[0]+1;if(today.year[0]>0)today.year[0]=today.year[0]-1;else{today.year[0]=99;today.year[1]=today.year[1]-1;}smg_display();}break;default:{EA=1;EX0=0;TR0=1;}break;}break;}}。
万年历
万年历第一组:郑建锋、叶泽兵、王海林摘要本设计由STC89C52RC为控制芯片,DS1302为时钟芯片,74LS138译码,8个三极管9012输出低电平控制2个共阳4位数码管,5个按键等来实现万年历的基本功能,再由程序来实现用按键来调节万年历的年月日、时分秒的功能。
关键字:STC89C52RC、DS1302、74LS138一、方案论证与比较方案一:用STC89C51RC来作为控制芯片,NE555做为时钟芯片,74LS138译码,8个三极管9012输出低电平控制2个共阳4位数码管,5个按键等来实现万年历的基本功能。
方案二:用STC89C52RC来作为控制芯片,DS1302做为时钟芯片,74LS138译码,8个三极管9012输出低电平控制2个共阳4位数码管,5个按键等来实现万年历的基本功能。
STC89C52RC是由STC89C51RC改进而来,有STC89C51RC的所有功能,故选择STC89C52RC作为控制芯片。
DS1302作为时钟芯片具有计算2100年前的年月日、时分秒的能力,还有闰年的调整能力,而NE555适合作为定时器,不适合做时钟芯片,故选择DS1302作为时钟芯片。
所以选择方案二。
二、原理分析和说明信号从STC89C52RC的PO口经过10K的上拉电阻来控制数码管的显示和P2口控制74LS138译码,三极管9012产生低电平来控制共阳4位数码管。
P2口控制DS1302作为时钟芯片,用程序来实现数码管的年月日、时分秒显示和用程序来控制按键调节年月日、时分秒。
过反复比较与论证,最终确定的系统方框图如图1所示。
下图为程序系统方框图42、DS1302DS1302 是由DS1202 改进而来增加了以下的特性双电源管脚用于主电源和备份电源供应Vcc1 为可编程涓流充电电源附加七个字节存储器它广泛应用于电话传真便携式仪器以及电池供电的仪器仪表等产品领域下面将主要的性能指标作一综合实时时钟具有能计算2100 年之前的秒分时日日期星期月年的能力还有闰年调整的能力31 8 位暂存数据存储RAM串行I/O 口方式使得管脚数量最少宽范围工作电压2.0 5.5V工作电流2.0V 时,小于300nA读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配简单3 线接口与TTL 兼容Vcc=5V可选工业级温度范围-40 +85与DS1202 兼容在DS1202 基础上增加的特性对Vcc1 有可选的涓流充电能力双电源管用于主电源和备份电源供应备份电源管脚可由电池或大容量电容输入附加的7 字节暂存存储器五、调试1、检查电路是否能正常工作。
数字电子万年历的设计(最新整理)
4、有优异的性能、价格比。 可以说,对于广大的电子应用专业技术人员,目前国和内国外面临的单片机 应用技术,如同 60 年代面临晶体管技术,70 年代面临数字集成电路一样。单片 机和可编程门阵列相结合,构成新一代电子应用技术是不可能回避的一项新型的 工程应用技术。 单片机是微型计算机的一个重要分枝,单片机是把中央处理器、随机存储器、 只读存储器、定时器/计数器、并行接口接口、串行接口、A/D 转换器等主要计 算机部件,集中在一块集成电路芯片上。虽然只是一个芯片,但从功能上它就相 当于一台完整的微机。随着科学技术的迅猛发展,单片计集成度高、体积小、运 算速度快、功耗低、运行可靠、价格低廉等诸多优点,越来越显现出来。目前可
8052 是标准的 40 引脚双列直插式集成电路芯片,引脚分布请参照----单片 机引脚图图 1:
图 1 8052 引脚 P0.0~P0.7 P0 口 8 位双向口线(在引脚的 39~32 号端子)。 P1.0~P1.7 P1 口 8 位双向口线(在引脚的 1~8 号端子)。 P2.0~P2.7 P2 口 8 位双向口线(在引脚的 21~28 号端子)。 P3.0~P3.7 P2 口 8 位双向口线(在引脚的 10~17 号端子)。 8052 芯片管脚说明: VCC:供电电压。
单片机的出现,并在各个技术领域中得到如此迅猛的发展,与单片机构成计 算机应用系统所形成的下述特点有关:
1、单片机构成的应用系统有较大的可靠性。这些可靠性的获得除了依靠单 片机芯片本身的高可靠性以及应用有最少的联接外,还可以方便地采用软、硬件 技术。
2、系统扩展、系统配置较典型、规范,容易构成各种规模的应用系统,应 用系统有较高的软、硬件利用系数。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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号设 置按钮是这个,
焊上排线和按钮
喇叭焊上引 线
将按钮小板和喇 叭焊到主板上
变压器用螺 丝固定住
喇叭用螺丝 固定住
用四个螺丝把主板固 定到机壳上
检查无误后, 安装前盖,通 电。
具体调时方向请参考说 明书,这里不再重复。
珍惜时光的装 饰条贴在这里源自谢谢观赏