用数码管显示实时日历时钟的应用设计

合集下载

数码管显示万年历时钟

数码管显示万年历时钟

数码管显示万年历时钟数码管显示万年历时钟功能介绍一、功能说明:1.整体功能达到了市售电子日历效果,显示内容包括年、月、日、星期、时、分、秒、室温;2.实时时钟芯片采用了两种:DS12C887+和DS1302。

可供学习和使用过程中进行选择;3.数码管控制采用了MAX7219专用扫描驱动芯片,可通过PS/2键盘对数码管的显示亮度进行15级调节;4.电路板上留有PS/2键盘接口,用于调节当前时间、数码管显示亮度、闹铃时间。

这一点和变通电子日历用明显区别,以达到一个有点专业的电子钟的要求;5.电路板上安装有继电器,可作为简单的时间控制(定时控制)或温度控制装置;二、待改进之处:1.可在板上合适的位置增加几个独立按键,日常使用调节更方便些;2.显示内容可增加农历和湿度;3.可以用光敏电阻配合串行A/D转换芯片实现显示亮度的自动调节,以适应环境光线的变化,这样子就更加具有专业性了。

三、PS/2键盘调整说明:1.使用PS2键盘F1进入运行时间设定、F2进入数码管显示亮度设定、F3进入闹铃时间设定、F4启动闹铃、F5关闭闹铃2.按下F1然后依次设定年、月、日、星期、时、分、秒时间信息,中途可以按小键盘区的ENTER键,退出设定状态3.按下F2然后选择小键盘区0-9和字符A-F可设定16级显示亮度,按下选择参数自动恢复走时状态4.按下F3然后依次设定时、分、秒三个闹铃时间参数,设定好任一参数可按小键盘区的ENTER键退出设定状态5.按下F4开启闹铃,继电器吸合其下方工作指示LED点亮,按下F5关闭闹铃,继电器释放同时LED熄灭,如蜂鸣器已经开始闹铃,可按F6或复位键6.按下F1或F2或F3但不想设定任何参数,都可按ESC退出相应的设定状态。

8位数码管显示时钟

8位数码管显示时钟

本人依据AT89C51和8位数码管为素材,以最少的见实现最多的功能!本程序开机流动显示学号可实现时钟,日历,定时闹钟,秒表等功能!C程序:#include <reg51.h>unsigned char led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40,0x00}; //用一维数组定义-9、横杠、全灭unsigned char num[12]={2,0,0,9,3,5,0,7,0,1,2,0} ;unsigned char a[8];unsigned char second=0,minute=0,hour=0,year=0,mon=1,day=1,day1,hsec,sec_m,min_m,N,temp1;unsigned char minute1=0,hour1=0;unsigned char b[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //扫描unsigned char k=0;unsigned int temp; // 记录毫秒为秒的变量unsigned char M,S_flag; //M是模式,更新时间的种模式加上正常模式 S_flag闪烁标志sbit K0=P3^7; //K0是闹钟起停标志位sbit K1=P3^0;sbit K2=P3^1;sbit K3=P3^2;sbit BEEP=P3^3;void delay(unsigned n) //0.2毫秒{int x,y;for(x=0;x<n;x++)for(y=0;y<24;y++);}void init1()S_flag=0; //闪烁标志位TMOD=0x10; //定时器以方式定时TH1=0xfc;TL1=0x18;EA=1; //打开总中断ET1=1; //允许定时器中断TR1=1; //开启定时器(开始定时计数)}void init0(){TMOD=0x01; //定时器以方式定时TH0=0xff;TL0=0xff;EA=1; //打开总中断ET0=1; //允许定时器中断TR0=0; //关闭定时器(关闭定时计数)}void display_led() //流动显示学号{int x;char l,a,m;for(a=0;a<21;a++){x=a-8;for(l=0;l<6;l++){for(m=0;m<8;m++){P2=b[m];if(x>=0&&x<12) P1=led[num[x]];else P1=led[11];delay(10);x++;}x-=8;}}}void display() //显示时钟及显示调节位{switch(M){case 0:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case 1:{if(S_flag==1){a[0]=led[hour/10];a[1]=led[hour%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute/10];a[4]=led[minute%10];a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case 2:{a[0]=led[hour/10];a[1]=led[hour%10];a[2]=led[10];if(S_flag==1)a[3]=led[minute/10];a[4]=led[minute%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[second/10];a[7]=led[second%10];}break;case 3:{if(S_flag==1){a[0]=led[year/10];a[1]=led[year%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[mon/10];a[4]=led[mon%10];a[5]=led[10];a[6]=led[day/10];a[7]=led[day%10];}break;case 4:{a[0]=led[year/10];a[1]=led[year%10];a[2]=led[10];if(S_flag==1){a[3]=led[mon/10];a[4]=led[mon%10];}elsea[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[day/10];a[7]=led[day%10];}break;case 5:{a[0]=led[year/10];a[1]=led[year%10];a[2]=led[10];a[3]=led[mon/10];a[4]=led[mon%10];a[5]=led[10];if(S_flag==1){a[6]=led[day/10];a[7]=led[day%10];}else{a[6]=led[11];a[7]=led[11];}}break;case 6:{if(S_flag==1){a[0]=led[hour1/10];a[1]=led[hour1%10];}else{a[0]=led[11];a[1]=led[11];}a[2]=led[10];a[3]=led[minute1/10];a[4]=led[minute1%10];a[5]=led[10];a[6]=led[11];a[7]=led[11];}break;case 7:{a[0]=led[hour1/10];a[1]=led[hour1%10];a[2]=led[10];if(S_flag==1){a[3]=led[minute1/10];a[4]=led[minute1%10];}else{a[3]=led[11];a[4]=led[11];}a[5]=led[10];a[6]=led[11];a[7]=led[11];}}}void key_prc() //时钟和闹钟调节{if(K1==0){delay(10); //延时去抖if(K1==0) //按K1进行模式切换{ M++;if(M==8)M=0;}while(!K1);//等待按键释放}if(M!=0){switch(M){case 1: //模式--调时{if(K2==0){delay(10); //延时去抖if(K2==0) //加键按下{if(hour<23) hour++;else hour=0;}while(!K2); //等待按键释放}if(K3==0){delay(10);if(K3==0){if(hour> 0) hour--;else hour=23;}while(!K3);}} break;case 2: //模式--调分{if(K2==0){delay(10);if(K2==0){if(minute<59) minute++;else minute=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(minute>0) minute--;else minute=59;}while(!K3);}} break;case 3: //模式--调年{if(K2==0){delay(10);if(K2==0){if(year<99) year++;else year=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(year>0) year--;else year=99;}while(!K3);}} break;case 4: //模式--调月{if(K2==0){delay(10);if(K2==0){if(mon<12) mon++;else mon=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){if(mon>1) mon--;else mon=12;}while(!K3);}if(year%4==0&&mon==2)day1=29;//闰年2月为29天if(year%4!=0&&mon==2)day1=28;//非闰年2月为28天if(mon==4|mon==6|mon==9|mon==11)day1=30;if(mon==1|mon==3|mon==5|mon==7|mon==8|mon==10|mon==12)day1=31;} break;case 5: //模式--调日{if(K2==0){delay(10);if(K2==0){if(day<day1) day++;else{day=1;}}while(!K2);}if(K3==0){delay(10);if(K3==0){if(day>1) day--;else{day=day1;}}while(!K3);}} break;case 6: //模式--闹钟调时{if(K2==0){delay(10);if(K2==0){if(hour1<23)hour1++;else hour1=0;}while(!K2);}if(K3==0){delay(10);if(K3==0){ if(hour1>0)hour1--;else hour1=23;}while(!K3);}} break;case 7: //模式--闹钟调分{if(K2==0){delay(10);if(K2==0){if(minute1<59)minute1++;else minute1=0;}while(!K2);}if(K3==0){delay(10); //延时去抖if(K3==0) //减键按下{ if(minute1>0)minute1--;else minute1=59;}while(!K3);}} break;}}}void display_rq() //年月日显示{if(K2==0){delay(10);if(K2==0){a[0]=led[year/10];a[1]=led[year%10];a[2]=led[10];a[3]=led[mon/10];a[4]=led[mon%10];a[5]=led[10];a[6]=led[day/10];a[7]=led[day%10];}while(!K2); //等待按键释放}void key_prc2() //秒表模式转换{if(M==0){if(K3==0){delay(10); //延时去抖if(K3==0) //按K3进行模式切换{ N++;if(N==2)N=0;}while(!K3);//等待按键释放}}}void display_sec() //秒表显示{if(N==1){a[0]=led[min_m/10];a[1]=led[min_m%10];a[2]=led[10];a[3]=led[sec_m/10];a[4]=led[sec_m%10];a[5]=led[10];a[6]=led[hsec/10];a[7]=led[hsec%10];if(K2==0){delay(10); //延时去抖if(K2==0) //加键按下{TR0=!TR0;}while(!K2); //等待按键释放}}void res_sec() //秒表复位{if(K1==0){delay(10);if(K1==0){min_m=0;sec_m=0;hsec=0;M=0;}while(!K1) ;}}void main() //主程序{display_led();init0();init1();while(1){key_prc();key_prc2();if(N==1){display_sec();res_sec();}else{display_rq();display();}}}void time1() interrupt 3 //定时器中断函数{if(year%4==0&&mon==2)day1=29;//闰年2月为29天if(year%4!=0&&mon==2)day1=28;//非闰年2月为28天if(mon==4|mon==6|mon==9|mon==11)day1=30;if(mon==1|mon==3|mon==5|mon==7|mon==8|mon==10|mon==12)day1=31; TH1=0xfc; //定时msTL1=0x18;temp++;if(temp==1000) //配合定时器定时s{ temp=0;second++;}if(second==60){ second=0;if(minute<59)minute++;else { minute=0;hour++;if(hour==24){hour=0;day++;if(day>day1){day=1;mon++;if(mon>12){mon=1;year++;if(year==99){year=0;}}}}}}if(hour1==hour&&minute1==minute&&K0==0) //闹钟时间到{BEEP=!BEEP;}if(temp%250==0) //每msS_flag=!S_flag; //闪烁标志位取反if(k==8) k=0;P1=a[k];P2=b[k++];delay(1);P2=0xff;}void sec_clo() interrupt 1 //秒表程序中断{TH0=0xff;TL0=0xff;temp1++;if(temp1==150){temp1=0;hsec++;if(hsec==100){hsec=0;sec_m++;if(sec_m==60){sec_m=0;min_m++;if(min_m==100){min_m=0;}}}}}仿真电路图:。

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

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

设计报告设计任务:设计一个智能化万年历时钟电路,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个数码管的位选部分。

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

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

;///////////////////////////////////////////;本程序源代码由湖南工程职业技术学院提供.;专业单片机培训,让你学习单片机更容易.;程序员:蒋庆桥;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,开始走时。

数码管万年历毕业设计(带C语言程序)

数码管万年历毕业设计(带C语言程序)

摘要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡、电子宠物等,这些都离不开单片机。

单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。

它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。

而51系列单片机是各单片机中最为典型和最有代表性的一种。

这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。

本文通过对一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。

系统由主控制器AT89C51、时钟电路DS1302、显示电路、按键电路、和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。

目录第一章引言 (3)第二章设计方案论证 (3)2.1 方案论证与设计……………………………………………………………………….错误!未定义书签。

2.1.1 控制部分的方案选择 (6)2.1.2 显示部分的方案选择 (6)2.1.3系统基本方案选择和论证 (6)2.2单片机原理 (7)2.3LED显示数码管 (7)第三章计算部分 (8)3.1 主要单元电路的器件 (8)3.1.1 单片机主控制模块 (9)3.1.2 时钟电路模块 (10)3.2 其他模块器件 (10)3.2.1 74hc573 (10)3.2.3其他元器件 (10)第四章结构设计部分 (11)4.1显示部分设计 (11)4.1.1万年历优化算法 (12)4.2.1 DS1302 的寄存器 (13)4.2.2 DS1302 实时显示时间的软硬件 (14)4.2.3 DS1302 与CPU 的连接 (14)4.3整体设计 (15)4.4系统软件设计 (15)4.4.1程序流程框图 (15)第五章实验测试部分 (18)5.1软件测试 (18)5.2测试结果分析与结论 (18)5.3 测试结果分析 (18)5.4 测试结论 (19)第一章引言随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。

《智能仪器设计》课程设计--实时日历时钟显示系统的制作

《智能仪器设计》课程设计--实时日历时钟显示系统的制作

《智能仪器设计》课程设计--实时日历时钟显示系统的制作河南农业大学《智能仪器设计实习》设计说明书题目:学院:专业:班级:学号:姓名:指导教师:成绩:时间:年月日至年月日实时日历时钟显示系统的制作一、背景及意义在当前繁忙的生活,学习,工作中,时间与每个人都有密切的关系,每个人都受到时间的影响,随着生活水平的提高,传统时钟已不能满足人们的需求,因此实时日历时钟面市了,应用于日常日历时间显示方面,并得到广泛推广。

本设计的实时日历时钟显示系统,共可以显示计时万年,最小时间单位是1s;其基本功能如下:(一)在51单片机系统中设置、获取、记录实时的日历时钟信息并通过LCD显示。

(二)能够进行长时间的记录,并且存储的时间信息在掉电情况下能长期保存。

(三)初始的时间信息用户可用键盘输入来设置。

二、系统分析系统框图及部分程序流程图:(一)系统框图:矩阵键盘:用于调节时间主控电路STC89C52AT24C02:数据存蜂鸣器模块:LCD1602液晶显示:显示时间(二)主函数(三) 键盘扫描子函数:开始 时间初始化键盘扫键盘扫开不停的检测按键不停的检测按键是否被按下,若有蜂鸣器发出滴声, 终止s1ns1s1s2=m+h+f+s2=s2光标光标光标m=h=m=结结结束S1nu结三、系统硬件设计(一) 矩阵键盘模块:用于调节时间和日期S3=m--m==S3=S3f--;h-f==h=结结结结结结S9:时间功能键与P3.0相连S13:增加键与P3.1相连S17:减少键与P3.2相连S9:日期功能键与P3.3相连RD:置低电平,按键有效(二)L CD1602液晶显示模块:显示时间和日期RS:读控制与P3.5相连WR:写控制与P3.6相连D0-D7:数据端口(三)A T24C02:数据存储芯片,用于断电存储数据。

SCL:控制总线与P2.1相连SDA:数据总线与P2.0相连(四)主控电路STC89C52模块:作为主控芯片,并用其内部定时器记时。

基于51单片机 和 DS12C887的日历时钟显示系统设计

基于51单片机 和 DS12C887的日历时钟显示系统设计

基于DS12C887的日历时钟显示系统设计在银行或者其他的公共场合中,经常会看到显示实时信息的显示屏,其中包括年、月、日、星期、时间等,本例子的功能是在51单片机系统中设置、获取、记录实时的日历时钟信息并通过数码管显示,选用日历时钟芯片DS12C887作为实时时钟芯片,为系统提供详细的时间信息,次款芯片内部有锂电池,可以带掉电的情况下保存10年以上。

主要器件:1、AT89C52单片机芯片,用于对时钟芯片的控制和初始化,并控制数码管显示。

2、日历时钟芯片DS12C887。

试验流程图;试验电路图:试验程序代码://CalendarClk.h程序#ifndef _CALENDARCLK_H // 防止CalendarClk.h被重复引用#define _CALENDARCLK_H#include <reg52.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned int/* DS12C887 内部专用寄存器宏定义 */#define MIN XBYTE[0x0102]#define HOUR XBYTE[0x0104]#define DAYOFWEEK XBYTE[0x0106]#define DAYOFMONTH XBYTE[0x0107]#define MONTH XBYTE[0x0108]#define YEAR XBYTE[0x0109]#define REG_A XBYTE[0x010a]#define REG_B XBYTE[0x010b]/* 由串口获得的日历时钟信息变量,用于对芯片时间的设置 */uchar year1,month1,dayofweek1,dayofmonth1,hour1,min1;/* 芯片DS12C887提供的日历时钟信息变量 */uchar year2,month2,dayofweek2,dayofmonth2,hour2,min2;#endif//CalendarClk.c程序#include "CalendarClk.h"/* 从串行口获取数据函数,数据包括:year1,month1,dayofweek1, dayofmonth1,hour1,min1。

关于数码管日历以及流水灯功能实现设计报告

关于数码管日历以及流水灯功能实现设计报告

关于数码管日历以及流水灯功能实现设计报告1.设计内容:利用Quartus II 13.0建立CPU软核,同时用NIOS II 生成相应的驱动程序。

本人利用8个七段数码管作为日历显示器,同时以4个按键作为控制器,用6个LED灯显示四个按键状态,另外额外添加了8个LED实现流水灯。

2.设计要求:能实现日期显示,并且能够实现日期的修改,用key3控制程序是否运行,用key2控制修改的项目,初始状态默认为修改年份,按下key2状态变为修改月份,再按下key2状态变为修改天数,之后重复。

Key1和key0分别为增加和减少。

同时添加一个流水灯显示。

3.软核建立:利用Quartus II 13.0建立软核,在Qsys中分别添加以下相应器件:a.CPU使用的是f型的cpub.SDRAM位宽16,64Mbits,基地址保证为0x00000000c.CLOCK 内部时钟,频率为50MHzd.EPCS串行存储器,代码被从EPCS控制器的片内搬到RAM中执行e.SYSID系统基地址分配f.JTAG UART深度64位,用于内部测试和在线编程g.LIGHTS加入一个位宽为8的PIO控制8个LED灯用于流水灯显示h.SEG添加了8个七段数码管用于显示年月日i.KEY 添加了四个key输入管脚,分别为key1、key2、key3、key4,使用上升沿触发。

输入管脚经非门之后输入。

j.KEY_STATEPIO输出管脚控制LED等,显示按键目前数值状态:Generate之后,添加一个PLL,两个时钟输出,一个相位偏移为0,另外一个是75o。

将相位不变的时钟作为cpu时钟,另外一个作为sdram时钟。

Re_set接vcc,pll的输入接外接时钟,输入接非门进入,然后自动生成其他pins。

将I/O设置为普通的I/O,然后分配管脚。

编译,通过之后软核就生成完毕。

图 1 软核框图示意图4.NIOS II驱动程序编写:本实验设想是利用七段数码管显示日期,日期可以更改,并且能够显示流水灯。

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序

用数码管(8位)显示的数字时钟程序
一、程序概述
本程序使用单片机AT89S52,通过数码管(8位)显示当前时间,支持12小时制和24小时制切换,精度为秒。

二、程序实现
程序首先定义了数码管的连接方式和每个数字的位图数据,然后定义了时间变量和函数,包括:
1.初始化函数:设置数码管端口和时钟计数器的计数方式。

2.读时钟函数:读取时钟计数器及寄存器,返回当前时间的小时、分钟和秒数。

3.显示函数:将当前时间转化为8个数码管显示的位图数据,用数字和符号映射表将数字和符号的位图数据与数码管连接方式对应起来,输出到数码管上。

在主函数中,程序初始化后循环执行读时钟函数和显示函数,实现时钟的实时显示。

三、程序特点
1.采用8位数码管显示,时间更加直观。

2.支持12小时制和24小时制切换,适用于不同场景。

3.实现精度为秒的实时显示,更加准确。

四、程序优化
1.增加闹钟功能,提醒用户打卡或者起床。

2.加入温度传感器模块,实现显示温度的功能。

3.优化显示效果,增加字体和颜色等选项。

五、程序应用
本程序可应用于家庭、办公室、学校等场合,用于显示时间,提醒用户合理安排时间和时间管理,也可作为DIY电子制作的教学和实验材料,提高学生的动手实践能力和电子信息技术水平。

单片机C语言模块化编程之数码管显示电子万年历篇

单片机C语言模块化编程之数码管显示电子万年历篇

单片机C语言模块化编程之数码管显示电子万年历篇————————————————————————————————作者:————————————————————————————————日期:数码管显示模块化显示电子万年历数码管共阳极7407驱动共阴极max7221/7419驱动Ds1302 实时时间显示Ds18b20 温度显示芯片/*delay.h*/#ifndef _DELAY_H#define _DELAY_H_#define uint unsigned int#define uchar unsigned charvoid delay(uint xms); //秒级延时void delayms(uint xms); //毫秒级延时,不可以更改,若更改,DS18B20将显示异常#endif/*delay.c*/#include "delay.h"void delay(uint xms){uint i;uchar j;for(i=xms;i>0;i--)for(j=110;j>0;j--);}void delayms(uint xms) //毫秒级别延时{while(xms--);}/*ds1302.h*/#ifndef _DS1302_H_#define _DS1302_H_#include <reg51.h>#define uint unsigned int#define uchar unsigned charsbit IO=P1^0; //ds1302跟单片机接口sbit SCLK=P1^1;sbit RST=P1^2;extern unsigned char datetime[7]; //存储获得的时间值extern void gettime(); //读取时间值函数#endif/*ds1302.c*/#include <intrins.h>#include "ds1302.h"uchar datetime[7]={0,0,0,0,0,0,0}; //用来接收获得的时间值void write_a_byte_to_ds1302(uchar X){uchar i;for(i=0;i<8;i++){IO=X&0X01;SCLK=1;SCLK=0;X>>=1;}}uchar get_a_byte_from_ds1302(){uchar i,b=0x00;for(i=0;i<8;i++){b|=_crol_((uchar )IO,i);SCLK=1;SCLK=0;}//return b/16*10+b%16; //返回的BCD码转换为十进制return (b>>4)*10+(b&0x0f); //注意运算的优先级}uchar read_data(uchar add){uchar dat;RST=0;SCLK=0;RST=1;write_a_byte_to_ds1302(add);dat=get_a_byte_from_ds1302();SCLK=1;RST=0;return dat;}void gettime() //ds1302读取当前时间存储在datetime中{uchar i,add=0x81;for(i=0;i<7;i++){datetime[i]=read_data(add);add+=2;}}/*max7221.h*/#ifndef _MAX7221_H_ //注:Max7221只能用来驱动共阴数码管,对共阳的没效#define _MAX7221_H_#include <reg51.h>#define uint unsigned int#define uchar unsigned charsbit DIN=P2^0; //max7221与单片机接口DIN..CSB..CLK..sbit CSB=P2^1;sbit CLK=P2^2;sbit DIN1=P2^3;sbit CSB1=P2^4;sbit CLK1=P2^5;extern void write(unsigned char addr , unsigned char dat); //max7221写数据,转换数据函数,num的值为1,或者2,当num为1时,片选的是第一块Max7221,同理亦然。

【精品】毕业设计-基于51系列的单片机进行的实时日历和时钟显示设计

【精品】毕业设计-基于51系列的单片机进行的实时日历和时钟显示设计

XXXXXXX毕业论文摘要本设计是基于51系列的单片机进行的实时日历和时钟显示设计,可以显示年月日时分秒及周信息,具有可调整日期和时间功能。

在设计的同时对单片机的理论基础和外围扩展知识进行了比较全面准备。

实时日历和时钟显示的设计过程在硬件与软件方面进行同步设计。

硬件部分主要由AT89S52单片机,LED显示电路,以及调时按键电路等组成,系统通过LED显示数据,所以具有人性化的操作和直观的显示效果。

软件方面主要包括时钟程序、键盘程序,显示程序等。

本系统以单片机的汇编语言进行软件设计,为了便于扩展和更改,软件的设计采用模块化结构,使程序设计的逻辑关系更加简洁明了,以便更简单地实现调整时间及日期显示功能。

所有程序编写完成后,在wave软件中进行调试,确定没有问题后,在Proteus软件中嵌入单片机内进行仿真。

关键词:AT89S52; DS1302; LEDAbstractThis design is based on 51 series monolithic integrated circuits of a real-time calendar and the clock shows the design, you can show how and when a week, has may adjust the date and time functions. in the design for monolithic integrated circuits, and peripheral to expand the basic theories of knowledge was fairly comprehensive preparation.Real-time calendar and the clock shows the design in hardware and software design of hardware that is synchronized. the led display at89s52 monolithic integrated circuits, and when should the electrical circuits, the system through the led display data so be humanized operate and intuitive that effect. including the software application programs, the keyboard, the program, etc. This system to monolithic integrated circuits of the assembly language for easily developing software design, and changes, software design to use modular design, the programming logical relationship with more and more so as to realize the time and date display the functions. all procedures in writing after wave of debugging the software and make no question of the proteus software embedded monolithic integrated circuits.Key Words:AT89S52; DS1302; LED目录1概述 (1)2设计方案论证 (2)2.1功能要求 (2)2.2方案确定 (2)2.2.1单片机芯片的选择方案和论证 (2)2.2.2显示模块选择方案和论证 (3)2.2.3时钟芯片的选择方案和论证 (3)2.2.4电路设计最终方案确定 (3)3主控制器和外围器件 (4)3.1AT89S52单片机 (4)3.2DS1302时钟芯片 (4)3.2.1DS1302芯片介绍 (4)3.2.2DS1302的应用 (8)3.3数码管LED (8)3.4译码器74HC138 (9)3.5锁存器74LS244 (9)4硬件设计 (10)4.1电路设计框图 (10)4.2系统概述 (10)4.3电源设计 (10)4.4单片机的复位电路 (11)4.5单片机系统的晶振电路 (11)4.6主电路设计 (12)5软件设计 (13)5.1主程序设计 (13)5.2键盘子程序设计 (14)5.3日历时钟子程序设计 (16)5.4显示子程序设计 (18)6系统调试 (18)6.1软件调试 (18)6.2硬件调试 (19)7结论 (20)致谢 (22)参考文献 (23)附录 (24)附录Ⅰ硬件电路图 (24)附录Ⅱ主程序源代码 (25)附录Ⅲ外文翻译原文.......................................................... 错误!未定义书签。

十五位数码管电子钟万年历设计 c编写

十五位数码管电子钟万年历设计    c编写

十五位数码管电子钟万年历设计c编写后带原理设计图供参考(本人已验证可正常工作)我们以一个实际的时钟电路来说明定时器的软件编程方法,时钟就是我们最为常见的显示时、分、秒为单位的计时工具,它是典型的应用代表。

时钟的最小计时单位是秒,但使用单片机定时器来进行计时,若使用 6.0MHz的晶振,即使按工作方式1工作,最大的计时时间也只能到131ms,所以我们可把每个定时时间取125ms,这样定时器溢出8次(125ms╳8=1000ms)就得到最小的计时单位秒。

而要实现8次计数用软件方法实现是轻而易举的。

我们使用定时器1,以工作方式1工作,定时器进行125ms定时。

采用中断方法进行溢出次数的累计,当计满8次即得到1秒的计时。

一个时钟的计时累加,要实现分、时的进位,要用到多种进制,秒、分、时中的进位是十进制,秒向分进位和分想时进位却是六十进制,而每天又有十二小时制或二十四小时制,它们分别又是十二进制和二十四进制。

从秒到分和从分到小时可以通过软件累加和数值比较方法实现。

在单片机的内部RAM中,需要设置显示缓冲区,显示的时、分、秒值是从显示缓冲区中取出的,在RAM中设置四个单元作为显示缓冲区,分别是7AH、7BH、7CH。

为使电路和原理叙述方便,我们这里不显示秒值,秒的进位我们通过闪烁分值实现。

这样我们一共有四位LED分别显示时和分值。

同时时钟都需要校准的。

在程序中还需设置显示码表,要显示的数值通过查表指令将显示用的真正码值送到LED上。

我们用单片机AT89C2051的PP3.4和P3.5两个I/O口外接微动开关来实现时和分的校正,每按一次小时或分值加1,连续按下数值累计下去,实现时钟的校准。

在电路中我们还设置了一个蜂鸣器,用作简单报时用,如可设早上7:30分起床,中午1点30分再有起床报时,每次响时1分钟,响1秒,停2秒的方式,而不是连续响铃。

这个程序我们采用12小时制,为此,要在程序中设置相应的标志,以利于主程序识别。

基于51单片机电子万年历设计

基于51单片机电子万年历设计

一、引言电子万年历是一种以数字形式实时显示日期、星期和时间等信息的电子设备。

在现代人日常生活中,万年历是一种常见的小型电子产品。

本文将基于51单片机设计一款简单实用的电子万年历。

二、设计原理1.时钟模块:采用DS1302实时时钟模块。

DS1302通过三线式串行接口与51单片机进行通信,可以实时获取日期、星期和时间等信息。

2.显示模块:使用数码管显示日期、星期和时间等信息。

共使用四块共阳数码管,采用数码管模块进行驱动,通过IO口进行数据传输。

3.按键模块:设计四个按键,分别为设置、上、下和确定。

通过按键来调整日期、星期和时间等信息。

4.闹钟功能:加入闹钟功能,可以设定闹钟时间,到达设定时间时,会有提示音。

5.温湿度传感器:加入温湿度传感器,可以实时监测环境温湿度,并在数码管上进行显示。

6.外部电源:由于51单片机工作电压较高,需要使用外部电源进行供电。

三、硬件设计1.电源电路:使用稳压电源芯片LM7805进行5V稳压,将稳压后的电压供给单片机和各个模块。

2.时钟模块:DS1302模块与单片机通过串行通信进行连接。

时钟模块上的时钟信号、数据信号和复位信号分别与单片机的IO口相连。

3.数码管显示模块:共有四块共阳数码管,通过595芯片进行驱动。

单片机的IO口与595芯片的串行、时钟和锁存引脚相连,595芯片的输出引脚与数码管的各段相连。

4.按键模块:通过电阻分压来实现按键功能,按下按键时,相应的IO口会被拉低。

5.闹钟功能:使用蜂鸣器来产生提示音,通过IO口与单片机相连。

6.温湿度传感器:使用DHT11温湿度传感器。

传感器的数据引脚通过IO口与单片机相连。

四、软件设计1.时钟显示:通过DS1302获取日期、星期和时间等信息,将其转化为数码管需要的编码格式,并通过595芯片进行显示。

2.按键操作:对按键进行扫描,根据按键的不同操作进行相应的处理。

例如按下设置键进行日期和时间的设置,按下上下键进行数值的变化,按下确定键进行数值的确认。

基于51数码管显示的万年历(仿真+程序【完整】)

基于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;}}。

用数码管显示实时日历时钟的应用设计备课讲稿

用数码管显示实时日历时钟的应用设计备课讲稿

用数码管显示实时日历时钟的应用设计(用数码管显示实时日历时钟的应用设计)摘要本课题通过MCS-51单片机来设计电子时钟,采用汇编语言进行编程,可以实现以下一些功能:小时,分,秒和年,月,日的显示。

本次设计的电子时钟系统由时钟电路,LED显示电路三部分组成。

51单片机通过软件编程,在LED数码管上实现小时,分,秒和年,月,日的显示;利用时钟芯片DS1302来实现计时。

本文详细介绍了DS1302 芯片的基本工作原理及其软件设计过程,运用PROTEUS软件进行电路连接和仿真,同时还介绍了74LS164,通过它来实现I|O口的扩展。

关键词:时钟芯片,仿真软件,74LS164目录前言0.1设计思路 (8)0.2研究意义 (8)一、时钟芯片1.1 了解时钟芯片……………………………………………….8-91.2 掌握时钟芯片的工作原理………………………………….10-11二、74LS1642.1 了解74LS164………………………………………………..11-122.2 掌握的74LS164工作原理 (12)三、数码管3.1 熟悉常用的LED数码管.……………………………………12-133.2 了解动态显示与静态显示 (13)四、程序设计4.0 程序流程图 (14)4.1 DS1392的驱动.......................................................15-16 4.2 PROTUES实现电路连接. (17)4.3 数码管的显示:小时;分;秒 (18)4.4 数码管显示:年;月;日 (19)五、总结…………………………………………………………………..20-21六、附页程序………………………………………………………………22-31前言单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。

单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。

基于数码管的电子时钟设计

基于数码管的电子时钟设计

基于数码管的电子时钟设计电子时钟是一种通过电子控制来显示时间的设备,它通常使用数码管来显示时间。

数码管是一种特殊的显示器件,它由七段LED组成,可以显示数字和一些特殊字符。

在设计基于数码管的电子时钟时,需要考虑如何获取时间信号、如何控制数码管显示以及如何进行时钟的设置和调整。

首先,我们需要确定使用哪种类型的数码管来显示时间。

常见的数码管有共阳极和共阴极两种类型,它们的工作原理有所不同。

共阳极数码管的LED为高电平时亮,共阴极数码管的LED为低电平时亮。

在本设计中,我们选择使用共阳极数码管。

其次,我们需要确定使用哪种类型的时钟芯片来获取时间信号。

常见的时钟芯片有DS1302、DS3231等,它们能够提供准确的时间信号。

在本设计中,我们选择使用DS3231时钟芯片。

接下来,我们需要设计电路来连接数码管和时钟芯片。

首先,我们将数码管的七个LED分别连接到控制芯片的七个IO口。

其次,我们将时钟芯片的时钟信号、数据信号和使能信号分别连接到控制芯片的IO口。

通过控制芯片的IO口,我们可以控制数码管的亮灭,实现数字的显示。

在电路设计完成后,我们需要编写程序来控制数码管的显示。

首先,我们需要初始化时钟芯片,获取当前时间。

然后,我们需要设计一个循环,不断读取当前时间并显示在数码管上。

为了让数字在数码管上切换显示,我们可以使用定时器中断来实现,定时器中断可以每隔一段时间触发一次,通过改变显示的位数或者数码管的亮灭状态来实现数字显示的切换。

最后,我们需要设计一些按键来实现时钟的设置和调整功能。

通过按键,我们可以改变时钟的小时、分钟和秒数,实现时间的调整功能。

另外,我们还可以设计一些按键来切换时间的显示模式,例如切换显示日期或者闹钟等。

综上所述,基于数码管的电子时钟设计需要考虑数码管的选择、时钟芯片的选择、电路设计、程序编写以及按键设计等方面。

通过合理的设计和实现,我们可以制作出一个功能完善、稳定可靠的电子时钟。

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

(用数码管显示实时日历时钟的应用设计)摘要本课题通过MCS-51单片机来设计电子时钟,采用汇编语言进行编程,可以实现以下一些功能:小时,分,秒和年,月,日的显示。

本次设计的电子时钟系统由时钟电路,LED显示电路三部分组成。

51单片机通过软件编程,在LED数码管上实现小时,分,秒和年,月,日的显示;利用时钟芯片DS1302来实现计时。

本文详细介绍了DS1302 芯片的基本工作原理及其软件设计过程,运用PROTEUS软件进行电路连接和仿真,同时还介绍了74LS164,通过它来实现I|O 口的扩展。

关键词:时钟芯片,仿真软件,74LS164目录前言0.1设计思路 (8)0.2研究意义 (8)一、时钟芯片1.1 了解时钟芯片……………………………………………….8-91.2 掌握时钟芯片的工作原理………………………………….10-11二、74LS1642.1 了解74LS164........................................................11-12 2.2 掌握的74LS164工作原理. (12)三、数码管3.1 熟悉常用的LED数码管...........................................12-13 3.2 了解动态显示与静态显示. (13)四、程序设计4.0 程序流程图 (14)4.1 DS1392的驱动.......................................................15-16 4.2 PROTUES实现电路连接. (17)4.3 数码管的显示:小时;分;秒 (18)4.4 数码管显示:年;月;日 (19)五、总结…………………………………………………………………..20-21六、附页程序………………………………………………………………22-31前言单片机自20世纪70年代问世以来,以其极高的性能价格比,受到人们的重视和关注,应用很广、发展很快。

单片机体积小、重量轻、抗干扰能力强、环境要求不高、价格低廉、可靠性高、灵活性好、开发较为容易。

由于具有上述优点,单片机的使用领域已十分广泛,已经远远超出了计算机科学的领域,小到玩具,信用卡,大到航天器,机器人,从实现数据采集,过程控制,模糊控制等智能控制到人类的日常生活,可以说,在人们的生活生产中都离不开单片机,又如智能仪表、实时工控、通讯设备、导航系统、家用电器,电子万年历,到计时器,定时器,计数器,频率计,电子秤,电子血压表等。

各种产品一旦用上了单片机,就能起到使产品升级换代的功效,常在产品名称前冠以形容词——“智能型”,“电脑型”,如智能型洗衣机,电脑温控冰箱等0.1研究思路电子时钟的理论基础主要涉及了51单片机应用中的数据转换显示,数码管显示原理。

另外,也涉及到了单片机的动态扫描显示原理等一些内容。

单片机体积小、重量轻、可靠性高、灵活性好、开发较为容易。

它功能强大,提供了相当多的相关功能模块,所以使用非常方便,用51单片机和DS1302来设计电子时钟是完全可行的,基于MCS-51的电子时钟设计,首先要有明确的设计目的和设计方案,要设计出硬件总体框架图,经过资料的查找,得到流程图。

0.2 研究的意义通过MCS-51电子时钟的设计,可以对51单片机有了更加深刻的认识,对其各个引脚功能掌握的更为透彻。

也再次认识到单片机的应用具有使用范围广的特点,对各个行业的技术改造和产品智能化的更新换代起着重要的推动作用。

由于设计的电子时钟起定时,计时作用,所以在设计过程中,可以很好的了解其原理,掌握时钟芯片的结构和实现方法。

在设计电子时钟的过程中,需要完成硬件设计和软件设计,所以需要设计电路硬件原理图。

在绘制原理图过程中,再次对PROTEL 99软件进行了熟悉和复习,对软件中的各个文件编辑器进行了掌握,并且知道了在原理图设计和绘制时,要对元件有合理的布局和放置。

另外,通过这次研究,在自己动手设计硬件原理图和软件编程的过程中,可以很好的了解到电子时钟的总体设计过程和功能的实现过程,自己着手硬件和软件的制作,一定程度上提高了自己的动手能力和解决问题的能力。

1.1 了解时钟芯片DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周日、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.5V~5.5V。

采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。

DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。

DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后背电源双电源引脚,同时提供了对后背电源进行涓细电流充电的能力2.1 引脚功能及结构,下图为DS1302的引脚功能图(1):DS1302的内部结构DS1302的外部引脚功能说明如图3所示:X1,X232.768kHz 晶振引脚GND 地 RST 复位I/O 数据输入/输出 SCLK 串行时钟 VCC1电池引脚图(1)DS1302有下列几组寄存器:① D S1302有关日历、时间的寄存器共有12个,其中有7个寄存器 (读时81h ~8D h ,写时80h ~8,存放的数据格式为 BCD 码形式, 如表(2)所示。

表(2) ②DS1302有关 R AM 的地址 DS1302中附加31字节静态 R AM 的地址如表(3)所示。

表(3)③D S1302的工作模式寄存器所谓突发模式是指一次传送多个字节的时钟信号和R AM 数据,突发模式寄存器如表(4)所示。

表(4)1.2 掌握时钟芯片的工作原理DS1302工作时为了对任何数据传送进行初始化,需要将复位脚(RST)置为高电平且将8位地址和命令信息装入移位寄存器。

数据在时钟(SCLK)的上升沿串行输入,前8位指定访问地址,命令字装入移位寄存器后,在之后的时钟周期,读操作时输出数据,写操作时输出数据。

时钟脉冲的个数在单字节方式下为8+8(8位地址+8位数据),在多字节方式下为8加最多可达248的数据。

DS1302的寄存器和控制命令对 DS1302的操作就是对其内部寄存器的操作,DS1302内部共有12个寄存器,其中有7个寄存器与日历、时钟相关,存放的数据位为B CD 码形式。

此外,DS1302还有年份寄存器、控制寄存器、充电寄存器、时钟突发寄存器及与R AM相关的寄存器等。

时钟突发寄存器可一次性顺序读写除充电寄存器以外的寄存器。

DS1302内部的RAM 分为两类,一类是单个RAM 单元,共31个,每个单元为一个8位的字节,其命令控制字为C OH~FDH,其中奇数为读操作,偶数为写操作;再一类为突发方式下的RAM,此方式下可一次性读写所有的R AM 的31个字节,命令控制字为F EH(写)、 FFH(读)。

我们现在已经知道了控制寄存器和R AM 的逻辑地址,接着就需要知道如何通过外部接口来访问这些资源。

单片机是通过简单的同步串行通讯与DS1302通讯的,每次通讯都必须由单片机发起,无论是读还是写操作,单片机都必须先向DS1302写入一个命令帧,这个帧的格式如表所示,最高位BIT7固定为1,BIT6决定操作是针对RAM 还是时钟寄存器,接着的5个BIT 是RAM 或时钟寄存器在DS1302的内部地址,最后一个BIT表示这次操作是读操作抑或是写操作。

物理上,DS1302的通讯接口由3个口线组成,即RST,SCLK,I/O。

其中RST 从低电平变成高电平启动一次数据传输过程,SCLK 是时钟线,I/O 是数据线。

具体的读写时序参考下图,但是请注意,无论是哪种同步通讯类型的串行接口,都是对时钟信号敏感的,而且一般数据写入有效是在上升沿,读出有效是在下降沿(DS1302正是如此的,但是在芯片手册里没有明确说明),如果不是特别确定,则把程序设计成这样:平时SCLK保持低电平,在时钟变动前设置数据,在时钟变动后读取数据,即数据操作总是在 SCLK保持为低电平的时候,相邻的操作之间间隔有一个上升沿和一个下降沿。

二、74LS1642.1 了解74LS164在单片机系统中,如果并行口的IO资源不够,而串行口又没有其他的作用,那么我们可以用74LS164来扩展并行IO口,节约单片机资源。

74LS164是一个串行输入并行输出的移位寄存器。

并带有清除端。

其中; Q0—Q7 并行输出端。

A,B串行输入端。

MR 清除端,为0时,输出清零。

CP 时钟输入端。

74LS164 引脚定义74LS164逻辑表表(5)74LS164 电路原理:74ls164参考实验照片:表(6)2.2 掌握的74LS164工作原理当清除端(CLEAR)为低电平时,输出端(QA-QH)均为低电平。

串行数据输入端(A,B)可控制数据。

当 A、B任意一个为低电平,则禁止新数据输入,在时钟端(CLOCK)脉冲上升沿作用下Q0 为低电平。

当A、B 有一个为高电平,则另一个就允许输入数据,并在CLOCK 上升沿作用下决定Q0 的状态。

三、数码管3.1 熟悉常用的LED数码管LED数码管(LED Segment Displays)是由多个发光二极管封在在一起组成“8”字型的器件,引线已在内部连接完成,只需引出它们的各个笔划,公共电极。

LED数码管常用段数一般为7段有的另加一个小数点,还有一种是类似于3位“+1”型。

位数有半位,1,2,3,4,5,6,8,10位等等....,LED数码管根据LED的接法不同分为共阴和共阳两类,了解LED 的这些特性,对编程是很重要的,因为不同类型的数码管,除了它们的硬件电路有差异外,编程方法也是不同的。

右图什阴和共阳极数码管的内部电路,它们的发光原理是一样的,只是它们的电源极性不同而已。

颜色有红,绿,蓝,黄等几种。

常用LED数码管内部引脚图片图1这是一个7段两位带小数点10引脚的LED数码管。

图1 这是一个7段两位带小数点10引脚的LED数码管图2 引脚定义每一笔划都是对应一个字母表示DP是小数点3.2 了解动态显示与静态显示LED数码管要正常显示,就要用驱动电路来驱动数码管的各个段码,从而显示出我们要的数位,因此根据LED数码管的驱动方式的不同,可以分为静态式和动态式两类。

A、静态显示驱动:静态驱动也称直流驱动。

静态驱动是指每个数码管的每一个段码都由一个单片机的I/O埠进行驱动,或者使用如BCD码二-十进位解码器解码进行驱动。

静态驱动的优点是编程简单,显示亮度高,缺点是占用I/O埠多,如驱动5个数码管静态显示则需要5×8=40根I/O埠来驱动,要知道一个89S51单片机可用的I/O埠才32个呢。

故实际应用时必须增加解码驱动器进行驱动,增加了硬体电路的复杂性。

相关文档
最新文档