基于ARM9的电子时钟万年历的设计与实现
- 格式:pdf
- 大小:184.75 KB
- 文档页数:3
数字钟、万年历制作(基于单片机)电路原理图:程序://********************20131206****数字钟程序#pragma SMALL#include <reg51.h>#include <absacc.h>#include <intrins.h>//********************************************************* *********编译预处理void display(unsigned char *p); //显示函数,P为显示数据首地址unsigned char keytest(); //按键检测函数unsigned char search(); //按键识别函数void alarm(); //闹钟判断启动函数void ftion0(); //始终修改函数void ftion1(); //闹钟修改函数void ftion3(); //日期修改函数void cum(); //加1修改函数void minus(); //减1修改函数void jinzhi(); //进制修改函数void riqi(); //日期void stopwatch(); //秒表函数//********************************************************* *******函数声明sbit P2_7=P2^7;//********************************************************* *******端口定义unsigned char clockbuf[3]={0,0,0};unsigned char bellbuf[3]={0,0,0};unsigned char date[3]={1,1,1}; //日期存放数组unsigned char stop[3]={0,0,0};unsigned char msec1,msec2;unsigned char timdata,rtimdata,dtimdata;unsigned char count;unsigned char *dis_p;unsigned char or; //12进制控制标志unsigned char ri; //日期显示控制标志位unsigned char mb; //秒表控制标志位bit arm,rtim,rhour,rmin,hour,min,sec,day,mon,year; //定义位变量//********************************************************* *****全局变量定义void main(){unsigned char a;or=0; //12进制修改标志清零ri=0;mb=0;P2_7=0;arm=0;msec1=0;msec2=0;timdata=0;rtimdata=0;count=0;TMOD=0x12;TL0=0x06;TH0=0x06;TH1=(65536-10000)/256;TL1=(65536-10000)%256;EA=1;ET0=1;ET1=1;TR0=1;TR1=0;dis_p=clockbuf;while(1){a=keytest();if(a==0x78) //判断是否有键按下{display(dis_p);if(arm==1) alarm();}else{display(dis_p);a=keytest();if(a!=0x78){a=search();switch(a){case 0x00:ftion0();break;case 0x01:ftion1();break;case 0x02:cum();break;case 0x06:jinzhi();break;case 0x03:riqi();break;case 0x04:ftion3();break;case 0x05:minus();break;case 0x07:stopwatch();break;case 0x09:TR1=1;break;case 0x0a:TR1=0;break;case 0x0b:stop[0]=0;stop[1]=0;stop[2]=0;break;default:break;}}}}}//********************************************主函数【完】void display(unsigned char *p){unsigned char buffer[]={0,0,0,0,0,0};unsigned char k,i,j,m,temp;unsigned char led[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};buffer[0]=p[0]/10;buffer[1]=p[0]%10;buffer[2]=p[1]/10;buffer[3]=p[1]%10;buffer[4]=p[2]/10;buffer[5]=p[2]%10;if((sec==0)&&(min==0)&&(hour==0)&&(rmin==0)&&(rhour==0)&&( day==0)&&(mon==0)&&(year==0)) //没有修改标志,正常显示{for(k=0;k<3;k++){temp=0x01;for(i=0;i<6;i++){P0=0x00; //段选端口j=buffer[i];P0=led[j];P1=~temp; //位选端口temp<<=1;for(m=0;m<200;m++);}}}else //若有修改标志,则按以下标志分别显示{if(sec==1||day==1){P1=0x1f;i=buffer[5];P0=led[i];for(m=0;m<200;m++);P1=0x2f;j=buffer[4];P0=led[j];for(m=0;m<200;m++);}if(min==1||rmin==1||mon==1){P1=0x3b;i=buffer[2];P0=led[i];for(m=0;m<200;m++);P1=0x37;j=buffer[3];P0=led[j];for(m=0;m<200;m++);}if(hour==1||rhour==1||year==1) {P1=0x3e;i=buffer[0];P0=led[i];for(m=0;m<200;m++);P1=0x3d;j=buffer[1];P0=led[j];for(m=0;m<200;m++);}}}//**********************************LED显示函数【完】unsigned char keytest(){unsigned char c;P2=0x78; //检测是否有键按下c=P2;c=c&0x78;return(c);}//******************************************键盘检测函数【完】unsigned char search(){unsigned char a,b,c,d,e;c=0x3f;a=0; //行号while(1){P2=c;d=P2;d=d&0x07;if(d==0x03){b=0;break;} //列号else if(d==0x05){b=1;break;}else if(d==0x06){b=2;break;}a++;c>>=1;if(a==5){a=0;c=0x3f;}}e=a*3+b;do{display(dis_p);}while((d=keytest())!=0x78);return(e);}//***********************************************查键值函数【完】void alarm(){if((clockbuf[0]==bellbuf[0])&&(clockbuf[1]==bellbuf[1])){P2_7=1;rtim=1;if(count==10){count=0;P2_7=0;arm=0;rtim=0;}}}//****************************************闹钟判断启动函数【完】void ftion0(){TR0=0;rhour=0;rmin=0;dis_p=clockbuf;rtimdata=0;timdata++;switch(timdata){case 0x01:sec=1;break;case 0x02:sec=0;min=1;break;case 0x03:min=0;hour=1;break;case 0x04:timdata=0;hour=0;TR0=1;break;default:break;}}//*********************************************时钟设置函数【完】void ftion1(){if(TR0==0) TR0=1;sec=0;min=0;hour=0;dis_p=bellbuf;timdata=0;rtimdata++;switch(rtimdata){case 0x01:rmin=1;break;case 0x02:rmin=0;rhour=1;break;case 0x03:rtimdata=0;rhour=0;arm=1;dis_p=clockbuf;break;default:break;}}//*********************************************闹钟设置函数【完】void ftion3(){if(TR0==0) TR0=1;day=0;mon=0;year=0;dis_p=date;timdata=0;rtimdata=0;dtimdata++;switch(dtimdata){case 0x01:day=1;break;case 0x02:day=0;mon=1;break;case 0x03:mon=0;year=1;break;case 0x04:dtimdata=0;year=0;dis_p=clockbuf;break;default:break;}}//*************************************************日期修改函数【完】void minus(){if(sec==1){if(0==clockbuf[2]) clockbuf[2]=59;else clockbuf[2]--;}else if(min==1){if(0==clockbuf[1]) clockbuf[1]=59;else clockbuf[1]--;}else if(hour==1){if(or==0) //判断进制{if(0==clockbuf[0]) clockbuf[0]=23;else clockbuf[0]--;}if(or==1){if(1==clockbuf[0]) clockbuf[0]=12;else clockbuf[0]--;}}else if(rmin==1){if(bellbuf[1]==0) bellbuf[1]=59;else bellbuf[1]--;}else if(rhour==1){if(or==0){if(bellbuf[0]==0) bellbuf[0]=23;else bellbuf[0]--;}if(or==1){if(bellbuf[0]==1) bellbuf[0]=12;else bellbuf[0]--;}}else if(day==1){if(date[2]==1) date[2]=31;else date[2]--;}else if(mon==1){if(date[1]==1) date[1]=12;else date[1]--;}else if(year==1){if(date[0]==1) date[0]=99;else date[0]--;}}//*************************************减1修改功能函数【完】void cum(){if(sec==1){if(59==clockbuf[2]) clockbuf[2]=0;else clockbuf[2]++;}else if(min==1){if(59==clockbuf[1]) clockbuf[1]=0;else clockbuf[1]++;}else if(hour==1){if(or==0) //判断进制{if(23==clockbuf[0]) clockbuf[0]=0;else clockbuf[0]++;}if(or==1){if(12==clockbuf[0]) clockbuf[0]=1;else clockbuf[0]++;}}else if(rmin==1){if(bellbuf[1]==59) bellbuf[1]=0;else bellbuf[1]++;}else if(rhour==1){if(or==0){if(bellbuf[0]==23) bellbuf[0]=0;else bellbuf[0]++;}if(or==1){if(bellbuf[0]==12) bellbuf[0]=1;else bellbuf[0]++;}}else if(day==1){if(date[2]==31) date[2]=1;else date[2]++;}else if(mon==1){if(date[1]==12) date[1]=1;else date[1]++;}else if(year==1){if(date[0]==99) date[0]=0;else date[0]++;}}//*************************************加1修改功能函数【完】void jinzhi(){if(or==0) or=1;else or=0;}//***********************************进制修改控制函数【完】void riqi(){if(ri==0){dis_p=date;}if(ri==1){dis_p=clockbuf;}ri++;if(ri==2) ri=0;}//********************************日期控显示函数【完】void stopwatch(){if(mb==0){dis_p=stop;mb=1;}else{mb=0;dis_p=clockbuf;}}//************秒表**********秒表**********秒表函数【完】void clock() interrupt 1{EA=0;if(msec1!=0x14) msec1++; //6MHz晶振定时10mselse{msec1=0;if(msec2!=100) msec2++; //定时1selse{if(rtim==1) count++; //闹钟启动标志计时10smsec2=0;if(clockbuf[2]!=59) clockbuf[2]++;else{clockbuf[2]=0;if(clockbuf[1]!=59) clockbuf[1]++;else{clockbuf[1]=0;if(or==0){if(clockbuf[0]!=23) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}if(or==1){if(clockbuf[0]!=12) clockbuf[0]++;else{clockbuf[0]=0;if((date[1]==1)||(date[1]==1)||(date[1]==1)||(date[1]==3)||(date[ 1]==5)||(date[1]==7)||(date[1]==8)||(date[1]==10)||(date[1]==12)){if(date[2]!=30) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if((date[1]==4)||(date[1]==6)||(date[1]==9)||(date[1]==11)){if(date[2]!=29) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}if(date[1]==2){if((((date[0]%4==0)&&(date[0]%100!=0))||(date[0]%400==0))){if(date[2]!=28) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}else{if(date[2]!=27) date[2]++;else{date[2]=1;if(date[1]!=11) date[1]++;else{date[1]=1;date[0]++;}}}}}}}}}}EA=1;}//*******************************定时器0中断函数【完】void miaobiao() interrupt 3{TH1=(65536-10000)/256;TL1=(65536-10000)%256;if(stop[2]!=99) stop[2]++;else{stop[2]=0;if(stop[1]!=59) stop[1]++;else{stop[1]=0;if(stop[0]!=59) stop[0]++;else stop[0]=0;}}}//***********************************定时器1中断函数【完】。
(2)31 8 位暂存数据存储RAM(3)串行 I/O 口方式使得管脚数量最少(4)宽范围工作电压2.0 5.5V(5)工作电流 2.0V 时,小于300nA(6)读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式(7)8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配(8)简单 3 线接口(9)与 TTL 兼容Vcc=5V(10)可选工业级温度范围-40~+85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。
所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。
图2 DS1302管脚图1.2显示模块选择方案一:LED数码管显示数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。
目前单片机数码管普通采用动态显示。
编程简单,但只能显示数字,不能显示中文。
方案二:LCD1602能够显示英文和数字。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
所以最终选择LCD1602。
2.项目功能模块2.1 89C51模块Mcs-51单片机管脚图图如图3所示:单片机管脚图2.2 1602液晶显示模块1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
摘要单片机应用技术飞速发展,纵观我们现在生活的各个领域,从导弹的导航装置,到飞机上各种仪表的控制,从计算机的网络通讯与数据传输,到工业自动化过程的实时控制和数据处理,以及我们生活中广泛使用的各种智能IC卡等,这些都离不开单片机。
单片机是集CPU ,RAM ,ROM ,定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次毕业设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
本文以单片机为核心,采用串行时钟芯片DS1302。
过去多用并行接口的时钟芯片,如MC146818、DS12887 等。
它们已能完全满足单片机系统对实时时钟的要求,但是这些芯片与单片机接口复杂、占用地址, 数据总线接线多、芯片体积大占用空间多。
显示电路采用LED动态扫描方式,动态扫描方式节省外部接口资源。
本文通过对一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。
系统由主控制器A T89C52、时钟电路DS1302、显示电路、按键电路、和复位电路等部分构成,能实现时钟日历显示的功能,能进行年、月、日、时、分及星期的显示。
关键词:AT89C52芯片DS1302芯片C语言Keil软件LED动态显示;AbstractSCM rapid development of applied technology, we now live Looking at the various fields, from the missile's navigation devices, to the various instruments on the aircraft control, computer network communications and data transmission, industrial automation to the process of real-time control and data Processing, and we live in the extensive use of the smart IC cards, these are inseparable from the SCM. S CM is set CPU, RAM, ROM, timing, counting on one interface and a variety of microcontrollers. Its small size, low cost, feature strong, smart widely used in industry and industrial automation. And 51 of the SCM SCM is the most typical and most representative one. The graduation project through its study, and thereby to study, design, develop software and hardware capabilities.Based on SCM as the core, a serial clock chip DS1302. Past the use of parallel interface chip's clock, such as the MC146818, DS12887, and so on. They have been able to fully meet the SCM system to the requirements of real-time clock, but these chips and microcontroller interface complex, occupied address, data bus wiring, chip size of the space and more. LED display circuit using dynamic scan mode, dynamic scan mode external interface save resources.Based on a microcontroller based on the calendar function to achieve the design of electronic clock, so as to achieve learning and understanding of SCM related instructions in all aspect s of the application. System by the main controller AT89C52, clock circuit DS1302, show circuit, the circuit keys, and reset circuit, and other components, to achieve the clock showed that the calendar function, capable of year, month, day, hour, minute an d weeks of shows.Key W ords:AT89C52 Chip DS1302 Chip Keil C language software LED dynamic display;目录摘要 (I)Abstract (II)目录........................................................................................................... 错误!未定义书签。
摘要随着科技的发展社会的进步和全球化竞争的日益激烈,人们对数字钟的要求也越来越高,传统的时钟已不能满足人们的需求。
多功能电子钟不管在性能还是在样式亦或是用途上都发生了重大的变化,许多电子钟都已具备电子闹钟、电子秒表、温度检测等功能。
同时单片机在多功能数字钟中的应用已是非常普遍的。
多功能电子时钟除了具有时钟的功能外还可以包含对环境温度检测的功能。
温度是一种最基本的环境参数。
在各个行业生产及日常生活中,对温度的测量及控制始终占据着非常重要的地位。
目前,国际上已开发出多种智能温度传感器。
新型温度传感器正从模拟式向数字式、集成化向智能化及网络化的方向发展。
本次设计完成电子时钟年、月、日、时、分的显示及环境温度测量等功能的基础上完成定时闹钟的功能。
硬件电路包括单片机、锂电池供电模块、LED数码管显示模块、按键模块、DS18B20温度传感器模块、蜂鸣器报警电路模块;软件部分主要通过汇编程序的编程实现对时钟芯片进行时间数据的读和写。
关键词:单片机;多功能电子钟;温度检测;最小系统电路;LED数码管With the development of technology and social progress and the increasingly fierce global competition, people's requirements for digital clock is getting higher and higher, the traditional clock has been unable to meet the needs of people. Multi-function electronic clock in performance or in the style or purpose have changed greatly, many electronic clock have electronic alarm clock, stopwatch, temperature detection and other functions. At the same time, the application of single chip computer in multifunctional digital clock is very common. Multi-function electronic clock has clock function can also be included on the ambient temperature detection function. Temperature is one of the most basic environmental parameters. In the production of various industries and daily life, the measurement and control of temperature has always occupied a very important position. At present, the world has developed a variety of intelligent temperature sensor. A new temperature sensor from analog to digital, intelligent and integrated to the direction of network development. Electronic clock, month, day, year, display and temperature measurement function based the design on the timing alarm function. Hardware circuit comprises a singlechip, a lithium battery power supply module, LED digital tube display module, keyboard module, DS18B20 temperature sensor module, buzzer alarm circuit; software part mainly carries on the data read and write clock chip through assembler programming.Keywords: MCU; Multi-function Electronic clock; Temperature detection; Minimum system ;Circuit of LED digital tube摘要 (I)Abstract (II)1 绪论 (1)1.1 课题研究的背景和意义 (1)1.2 多功能电子钟的研究现状 (2)1.3总体方案 (4)1.3.1系统的设计思路 (4)1.3.2系统硬件描述 (4)1.3.3系统软件描述 (5)1.3.4设计流程和预期成果 (5)2 硬件芯片介绍 (6)2.1 STC89C52单片机的介绍 (6)2.1.1 STC89C52的主要功能 (6)2.1.2 89C52单片机的引脚功能说明 (7)2.2温度传感器DS18B20 (10)2.2.1 DS18B20特性 (10)2.2.2 DS18B20的通信协议 (13)2.2.3 DS18B20的测温原理 (14)3 系统硬件电路的设计 (16)3.1单片机最小系统 (16)3.1.1晶振电路 (16)3.1.2复位电路 (17)3.1.3 5v电源电路 (18)3.2 RS232接口电路 (19)3.3 温度传感器模块 (20)3.4按键模块 (21)3.5蜂鸣器模块 (22)3.6显示电路的设计 (23)3.6.1数码管的介绍 (23)3.6.2数码管显示模块的设计 (25)4 软件设计 (26)4.1主程序 (26)4.2温度采集 (29)4.3显示子程序 (33)4.4平闰年判别子程序 (35)4.5 中断服务子程序 (38)4.6时间闹钟设置子程序 (41)5 仿真调试 (47)5.1仿真软件的介绍 (47)5.1.1Proteus仿真软件介绍 (47)5.1.2Kiel软件介绍 (48)5.2仿真图及调试结果 (50)5.3 焊接实物 (52)结论 (53)致谢 (54)参考文献 (55)附录A 英文原文 (56)附录B 汉语翻译 (61)附录C 系统硬件原理图 (64)1 绪论1.1课题研究的背景和意义时钟从被发明的那天起,就成为人们生活中必不可少的一种工具,尤其是在现在这个讲究效率的年代,时钟更是在人类生产、生活、学习等多个领域得到广泛的应用。
基于单片机的多功能电子万年历的设计摘要随着科技的快速发展,自从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
本文主要介绍了基于单片机的智能电子万年历的研制,该万年历能够实时显示公历年、月、日、时、分、秒,以及对应的农历日期、24节气、天干地支、闹铃功能,同时还能够实时测取环境温度。
本系统的硬件部分主要由A VR单片机、时钟芯片、温度传感器等部件组成,文中给出了详细的硬件设计实现及相关电路图;软件部分主要包含公历转农历的算法设计模块、显示模块、时间的读取、温度的检测模块,按键的扫描输入模块等,文中给出了系统的软件程序流程图及各功能模块的软件程序清单,最后介绍了整体系统的设计实现、仿真及调试过程,给出了下一步的改进方案等。
关键词:单片机;液晶技术;万年历;时钟芯片Design of Multifunctional digital Perpetual Calendar Based on MCUAbstractWith the development of technology,Since the concept of the sun, Baizhong, andnow the electronic bell,human beings continue to study and constant innovation record。
This paper-based Microcontroller Development of Intelligent electronic calendar, The calendar can display real-time in the calendar year, month, day, hours, minutes and seconds,a nd the correspond ing date of the Lunar New Year, 24 Solar Terms,at the same time also to real-time measurement from the ambient temperature,In addition to the user through the keyboard input years of history,for the correspond ing period of the Lunar.The system hardware from some of the major A VR microcontroller, a number of digital control, decoder, the clock chip,temperature sensors and other components,the paper gives a detailed design and implementation of hardware and related circuit;Software contains some of the major Lunar calendar to the algorithm design module,dynamic digital display modules,time to read,temperature detection module,Press enter the scanning module.In this paper, the system software modules and flow chart of the list of software programs,Finally, the realization of the overall system design, simulation and debugging process, the next step is the improvement programmes.Keywords:MCU;crystal technology;Calendar;Clock chip目录引言 (1)第1章绪论 (2)1.1课题的背景与意义 (2)1.2 数字万年历的现状与发展 (2)1.3 论文的主要工作及章节安排 (3)1.4 本章小结 (3)第2章方案论证比较.............................................................................. (4)2.1 多功能数字万年历系统概述 (4)2.2计时方案 (4)2.3温度检测方案 (5)2.4显示方案 (5)2.5本章小结 (5)第3章系统硬件设计 (6)3.1 主控制器ATmega16 单片机介绍 (6)3.2 时钟电路DS1302 (6)3.3 温度检测DS18B20 (7)3.4 动态显示 (8)3.5 键盘接口 (8)3.6 语音闹铃模块 (8)3.7 电源设计 (9)3.8本章小结 (11)第4章系统软件设计 (12)4.1 公历计算显示程序设计 (13)4.1.1 DS1302 内部寄存器 (13)4.1.2 时间读取程序设计 (15)4.2 农历转换程序设计 (16)4.2.1 公历转农历算法研究 (16)4.2.2 干支纪年简介 (18)4.2.3 公历转农历程序 (18)4.3 温度测量程序设计 (20)4.3.1 DS18B20 的测温原理 (20)4.3.2 温度程序 (21)4.4 二十四节气算法研究 (23)4.5系统仿真 (24)4.6本章小结 (25)结论与展望 (26)致谢 (27)参考文献 (28)附录 A 电子万年历原理图 (29)附录 B 外文文献与译文 (30)英文原文: (30)中文译文: (33)附录 C 参考文献题录及摘要 (35)附录 D 电子万年历源程序 (37)插图清单图2-1 数字万年历系统框图 (4)图3-1 DS1302与ATmega16连接图 (7)图3-2 DS18B20与AtMEGA16连接图 (8)图3-3 报时电路 (9)图3-4 稳压电源原理图 (10)图3-5 电源电路 (10)图4-1 系统程序流程图 (13)图4-2 公历程序流程图 (14)图4-3 DS18B20测温原理 (21)表格清单表3-1 LCD12864显示内容 (8)表4-1 DS1302的寄存器及其控制字 (14)表4-2 RS位配置 (15)引言人类的日常生活离不开时间,任何具有周期性变化的自然现象都可以用来测量时间。
毕业设计开题报告测控技术与仪器基于单片机的万年历时钟设计1选题的背景、意义在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每个人都受到时间的影响。
为了更好的利用我们自己的时间,需要一款灵活、稳定而又功能强大的自动定时控制系统,以规范本单位的作息时间或定时控制一些设备。
目前,市面上出现的一些时控设备或功能单一,或使用烦琐,或价格昂贵,总有一些不尽如人意的地方[1]。
我们必须对时间有一个度量,因此产生了钟表。
钟表的发展是非常迅速的,17 世纪中叶, 由荷兰人C. Huygens来发明的第一个钟摆与以前任何计时装置相比, 摆钟的精确度提高了上百倍,而他随后发明的螺旋平衡弹簧,又进一步提高精度、减小体积, 导致了怀表的出现。
然而再好的摆钟,其精度也只能达到每年误差不超过一秒[2]。
1939年出现了利用石英晶体振动计时的石英钟, 每天误差只有千分之二秒, 到二次大战后精度提高到30 年才差一秒。
很快, 测年的技术又推进到原子层面, 1948 年出现第一台原子钟, 1955年又发明了铯原子钟, 利用Cs133原子的共振频率计时,现在精度已经高达每天只差十亿分之一秒[2]。
从刚开始的机械式钟表到现在普遍用到的数字式钟表,即使现在钟表千奇百怪,但是它们都只是完成一种功能——计时功能,只是工作原理不同而已,在人们的使用过程中,逐渐发现了钟表的功能太单一,无法更大程度上的满足人们的需求。
发展到现在人们广泛使用的万年历。
万年历在家庭居室、学校、车站和广场使用越来越广泛,给人们的生活、学习、工作带来极大的方便[3]。
电子万年历具有信息量大、直观清晰、经济实用等优点,正成为家庭、商场、公共场所等新的消费热点,具有重要的开发价值[4]。
随着科技的不断发展,家用电子产品不但种类日益丰富,而且变得更加经济实用,,功能也越来越齐全,除了公历年月、日、时分秒、星期显示及闹铃外,又增加了农历、温度、24节气及l2生肖等显示。
ARM课程设计可调控万年历时钟1.初始化并运行RTC,然后读取时间值通过串口向上位机发送,并把秒的值输出到教学实验开发平台上的LED1~LED4进展显示。
2.分析。
万年历显示时间包括年、月、日、星期、时、分和秒,利用EasyARM.exe仿真软件把结果发送到上位机上显示。
通过按键进展上述的显示调节,其中月是1~12,日是1~31,星期是1~7,时是00~23,分是00~59,秒是00~59。
现在时间显示2012年6月11日星期一15:23:30。
3.4.程序#include "config.h"#include "stdio.h"#include "math.h"uint8 time[4];/*按键GPIO口*/#define key1 1<<16#define key2 1<<17#define key3 1<<18#define key4 1<<19#define key5 1<<20#define key6 1<<21#define HC595_CS (1 << 29) // P0.29口为74HC595的片选typedef struct UartMode // 定义串口模式设置的数据构造{uint8 datab; // 字长度5/6/7/8uint8 stopb; // 停顿位1/2uint8 parity; // 奇偶校验0-无校验,1-奇校验,2-偶校验}UARTMODE;uint8 rcv_buf[6]; // UART0数据接收缓冲区volatile uint8 rcv_new; // 接收新数据标志void DelayNS (uint32 dly){uint32 m;for ( ; dly>0; dly--)for (m=0; m<5000; m++);}void MSPI_Init(void){//PINSEL0 = (PINSEL0 & 0xFFFF00FF) | 0x00005500; // 设置管脚连接SPIPINSEL0 = (PINSEL0 & (~(0xFF << 8))) | (0x55 << 8) ;SPCCR = 0x52; // 设置SPI时钟分频SPCR = (0 << 3) | // CPHA = 0, 数据在SCK 的第一个时钟沿采样(1 << 4) | // CPOL = 1, SCK 为低有效(1 << 5) | // MSTR = 1, SPI 处于主模式(0 << 6) | // LSBF = 0, SPI 数据传输MSB (位7)在先(0 << 7); // SPIE = 0, SPI 中断被制止}uint8 MSPI_SendData(uint8 data){IOCLR = HC595_CS; // 片选74HC595SPI_SPDR = data;while( 0 == (SPI_SPSR & 0x80)); // 等待SPIF置位,即等待数据发送完毕IOSET = HC595_CS;return(SPI_SPDR);}/* 此表为LED0~F以及L、P的字模*/uint8 const DISP_TAB[19] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8, 0x80,0x90,0x88, 0x83, 0xC6, 0xA1,0x86, 0x8E,};uint8 UART0_Init (uint32 baud, UARTMODE set){uint32 bak;/* 参数过滤*/if ((0 == baud) || (baud > 115200)) return (0);if ((set.datab < 5) || (set.datab > 8)) return (0);if ((0 == set.stopb) || (set.stopb > 2)) return (0);if (set.parity > 4) return (0);/* 设置串口波特率*/U0LCR = 0x80; // DLAB=1bak = (Fpclk >> 4) / baud;U0DLM = bak >> 8;U0DLL = bak & 0xff;/* 设置串口模式*/bak = set.datab - 5;if (2 == set.stopb) bak |= 0x04;if (0 != set.parity){set.parity = set.parity - 1;bak |= 0x08;}bak |= set.parity << 4;U0LCR = bak;return (1);}void SendByte (uint8 data){U0THR = data;while ((U0LSR & 0X20) == 0); // 等待数据发送}void PC_DispChar (uint8 no, uint8 chr){SendByte(0xff);SendByte(0x81);SendByte(no);SendByte(chr);SendByte(0x00);}uint8 const SHOWTABLE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; void SendTimeRtc (void){uint32 datas;uint32 times;uint32 bak;times = CTIME0; // 读取完整的时钟存放器datas = CTIME1;bak = (datas >> 16) & 0xfff; // 获取年PC_DispChar(0, SHOWTABLE[bak / 1000]);bak = bak % 1000;PC_DispChar(1, SHOWTABLE[bak / 100]);bak = bak % 100;PC_DispChar(2, SHOWTABLE[bak / 10]);PC_DispChar(3, SHOWTABLE[bak % 10]);bak = (datas >> 8) & 0x0f; // 获取月PC_DispChar(4, SHOWTABLE[bak / 10]);PC_DispChar(5, SHOWTABLE[bak % 10]);bak = datas & 0x1f; // 获取日PC_DispChar(6, SHOWTABLE[bak / 10]);PC_DispChar(7, SHOWTABLE[bak % 10]);bak = (times >> 24) & 0x07; // 获取星期PC_DispChar(8, SHOWTABLE[bak]);bak = (times >> 16) & 0x1f; // 获取小时PC_DispChar(9, SHOWTABLE[bak / 10]);PC_DispChar(10, SHOWTABLE[bak % 10]);bak = (times >> 8) & 0x3f; // 获取分钟PC_DispChar(11, SHOWTABLE[bak / 10]);PC_DispChar(12, SHOWTABLE[bak % 10]);bak = times & 0x3f; // 获取秒钟PC_DispChar(13, SHOWTABLE[bak / 10]);PC_DispChar(14, SHOWTABLE[bak % 10]);}void RTCInit (void){PREINT = Fpclk / 32768 - 1; // 设置基准时钟分频器PREFRAC = Fpclk - (Fpclk / 32768) * 32768;CCR = 0x00; // 制止时间计数器YEAR = 2012; //设置时钟初值MONTH = 6;DOM = 11;DOW = 1;HOUR = 15;MIN = 23;SEC = 30;CIIR = 0x01; // 设置秒值的增量产生一次中断ILR = 0x03; // 去除RTC增量和报警中断标志CCR = 0x01; // 启动RTC}void __irq IRQ_UART0 (void){uint8 i;if ((U0IIR & 0x0F) == 0x04)rcv_new = 1; // 设置接收到新的数据标志for (i=0; i<14; i++){rcv_buf[i] = U0RBR; // 读取FIFO的数据,并去除中断}/*再次初始化时钟*/CCR = 0x00; // 制止时间计数器YEAR=(rcv_buf[0]-0x30)*1000+(rcv_buf[1]-0x30)*100+(rcv_buf[2]-0x30)*10+(rcv_buf[3]-0x30);MONTH =(rcv_buf[4]-0x30)*10+(rcv_buf[5]-0x30);DOM =(rcv_buf[6]-0x30)*10+(rcv_buf[7]-0x30);DOW =(rcv_buf[8]-0x30);HOUR =(rcv_buf[9]-0x30)*10+(rcv_buf[1]-0x30);MIN =(rcv_buf[11]-0x30)*10+(rcv_buf[3]-0x30);SEC =(rcv_buf[13]-0x30)*10+(rcv_buf[5]-0x30);CIIR = 0x01; // 设置秒值的增量产生1次中断CCR = 0x01; // 启动RTCVICVectAddr = 0x00; // 中断处理完毕}void SET_TIME (void){while ((IO0PIN & key1) == 0) // 等待发送信号{DelayNS(2);if ((IO0PIN & key1) == 0){YEAR=YEAR+1;time[0,1,2,3]=YEAR;loop1: while ((IO0PIN & key1) != 0);DelayNS(2);if ((IO0PIN & key1) == 0) goto loop1; // 等待按键恢复}}while ((IO0PIN & key2) == 0) // 等待发送信号{DelayNS(2);if ((IO0PIN & key2) == 0){if(MONTH>11)else MONTH=MONTH+1;time[4,5]=MONTH;loop2: while ((IO0PIN & key2) != 0);DelayNS(1);if ((IO0PIN & key2) == 0) goto loop2; // 等待按键恢复}}while ((IO0PIN & key3) == 0) // 等待发送信号{DelayNS(2);if ((IO0PIN & key3) == 0){if(DOM>29)DOM=0;elseDOM=DOM+1;time[6,7]=DOM;loop3: while ((IO0PIN & key3) != 0);DelayNS(1);if ((IO0PIN & key3) == 0) goto loop3; // 等待按键恢复}}while ((IO0PIN & key4) == 0) // 等待发送信号{DelayNS(2);if ((IO0PIN & key4) == 0){if(DOW>5)DOW=0;elseDOW=DOW+1;time[8]=DOW;loop4: while ((IO0PIN & key4) != 0);DelayNS(2);if ((IO0PIN & key4) == 0) goto loop4; // 等待按键恢复}}while ((IO0PIN & key5) == 0) // 等待发送信号{DelayNS(2);if ((IO0PIN & key5) == 0){if(HOUR>22)elseHOUR=HOUR+1;time[9,10]=HOUR;loop5: while ((IO0PIN & key5) != 0);DelayNS(2);if ((IO0PIN & key5) == 0) goto loop5; // 等待按键恢复}}while ((IO0PIN & key6) == 0) // 等待发送信号{DelayNS(2);if ((IO0PIN & key6) == 0){if(MIN>58)MIN=0;elseMIN=MIN+1;time[11,12]=MIN;loop6: while ((IO0PIN & key6) != 0);DelayNS(2);if ((IO0PIN & key6) == 0) goto loop6; // 等待按键恢复}}}int main (void){ uint8 i;UARTMODE uart0_set;PINSEL0 = 0x00000005; // 连接IO到串口UART0PINSEL1 = 0x00000000;PINSEL2 = PINSEL2 & (~0x08); // P1[25:16]连接GPIO//PINSEL1 = 0x00005500; // 设置SPI管脚连接//PINSEL2 = 0x00000000;IODIR = HC595_CS;uart0_set.datab = 8;uart0_set.stopb = 1;uart0_set.parity = 0;UART0_Init(115200, uart0_set);U0FCR = 0xc1; // 使能FIFO,并设置触发点为8字节U0IER = 0x01; // 允许RBR中断,即接收中断MSPI_Init();RTCInit();IRQEnable(); // 使能IRQ中断/* 使能UART0中断*/VICIntSelect = 0x00000000; // 设置所有的通道为IRQ中断VICVecttl0 = 0x20 | 0x06; // UART0分配到IRQ slot0,即最高优先级VICVectAddr0 = (uint32)IRQ_UART0; // 设置UART0向量地址VICIntEnable = 1 << 0x06; // 使能UART0中断while (1){ while (0 == (ILR & 0x01)); // 等待RTC增量中断ILR = 0x01;for(i=1; i<8; i++){if(DOW==i)rcv_data = MSPI_SendData(DISP_TAB[i]); // 发送显示数据} // 去除中断标志SET_TIME();SendTimeRtc();}return (0);}。
(2)31 8 位暂存数据存储RAM(3)串行 I/O 口方式使得管脚数量最少(4)宽范围工作电压2.0 5.5V(5)工作电流 2.0V 时,小于300nA(6)读/写时钟或RAM 数据时有两种传送方式单字节传送和多字节传送字符组方式(7)8 脚DIP 封装或可选的8 脚SOIC 封装根据表面装配(8)简单 3 线接口(9)与 TTL 兼容Vcc=5V(10)可选工业级温度范围-40~+85优点:串行接口的日历时钟芯片,使用简单,接口容易,与微型计算机连线较少等特点,在单片机系统尤其是手持式信息设备中己得到了广泛的应用。
所以,最终选择串行时钟芯片DS1302,DS1302的管脚图如图2所示。
图2 DS1302管脚图1.2显示模块选择方案一:LED数码管显示数码管显示比较常用的是采用CD4511和74LS138实现数码转换,数码显示分动态显示和静态显示,静态显示具有锁存功能,可以使数据显示得很清楚,但浪费了一些资源。
目前单片机数码管普通采用动态显示。
编程简单,但只能显示数字,不能显示中文。
方案二:LCD1602能够显示英文和数字。
1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
所以最终选择LCD1602。
2.项目功能模块2.1 89C51模块Mcs-51单片机管脚图图如图3所示:单片机管脚图2.2 1602液晶显示模块1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。
《嵌入式系统》课程设计报告基于ARM的万年历系统院系:机电学院学生姓名:专业:应用电子技术教育班级:指导教师:田丰庆付广春完成时间:2013年3月29日目录1 引言............................................. 错误!未定义书签。
2 STM32芯片RTC时钟介绍........................... 错误!未定义书签。
3 程序运行结果 (2)3.1 STM32管脚介绍.............................. 错误!未定义书签。
3.2 STM32复位电路和时钟设计 (2)4 总体设计框图 (3)5 程序运行结果图示................................. 错误!未定义书签。
6 程序流程图....................................... 错误!未定义书签。
7 总结体会 (5)8 参考文献 (6)附录一:总体电路图 (7)附录二:源程序 (8)基于ARM的万年历系统摘要:本设计选择STM32为核心控制元件,设计了用RTC定时器实现万年历的控制与设计。
程序使用C语言进行编程,能动态显示当前时间,包括年、月、日、时、分、秒,并且用串口助手显示。
关键词:STM32 ARM 时钟1 引言随着科技的发展,嵌入式系统广泛应用于工业控制和商业管理领域,在多媒体手机、袖珍电脑,掌上电脑,车载导航器等方面的应用,更是极大地促进了嵌入式技术深入到生活和工作各个方面。
嵌入式系统主要由嵌入式处理器、相关支撑硬件及嵌入式软件系统组成。
本文介绍基于STM32F103R6T6的嵌入式微处理器的万年历设计,并且在液晶上显示。
2 STM32芯片RTC时钟介绍STM32的实时时钟(RTC)是一个独立的定时器。
RTC模块拥有一组连续计数的计数器,在相应软件配置下,可以提供时钟日历的功能,修改计数器的值可以重新设置系统当前的时间和日期。
课程设计报告书题目: 基于A RM的数字式万年历信息工程学院课程设计任务书2017年6月20摘要本文介绍了基于STC89C52单片机的多功能电子万年历的硬件结构和软硬件设计方法。
本设计由数据显示模块、温度采集模块、时间处理模块和调整设置模块四个模块组成。
系统以STC89C52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能。
温度采集选用DS18B20芯片,万年历采用直观的数字显示,数据显示采用1602液晶显示模块,可以在LCD1602上同时显示年、月、日、周日、时、分、秒,还具有时间校准整点灯光提醒等功能。
此万年历具有读取方便、显示直观、功能多样、电路简洁、成本低廉等诸多优点,具有广阔的市场前景。
关键词:单片机,时钟芯片, 温度传感器, 1602液晶显示器目录1 任务提出与方案论证11.1单片机芯片设计与论证2方案1:采用51系列单片机作为系统控制器2方案2:采用fpga单片机作为系统的控制器21.2按键控制模块设计与论证21.3时钟模块设计与论证2方案二:采用DS1302为计时时钟芯片2方案三:采用DS12C887为计时时钟芯片21.4温度采集模块设计与论证31.5显示模块模块设计与论证32 总体设计33.1 STC89C52单片机33.1.1 最小系统设计53.1.2 时钟电路53.1.3 复位电路63.2时钟芯片DS1302接口设计与性能分析63.2.1 DS1302性能简介63.2.2 DS1302接口电路设计73.3温度芯片DS18B20接口设计与性能分析83.3.1 DS18B20性能简介81.DS18B20的主要特性83.3.2 DS18B20接口电路设计93.4 LCD显示模块103.4.1 LCD1602的特性与使用说明103.4.2 LCD1602与MCU的接口电路113.5按键模块设计113 详细设计与仿真123.1 proteus仿真123.2主程序流程图的设计134 总结15参考文献161 任务提出与方案论证单片机电子万年历的制作有多种方法,可供选择的器件和运用的技术也有很多种。
XX 学院毕业设计(论文)题目:基于单片机的电子万年历设计院系:电子工程学院专业:电子科学与技术班级:学生姓名:导师姓名:职称:教授起止时间:2010年03月09日至 2010年06月20日毕业设计(论文)任务书学生姓名指导教师职称教授院系电子工程学院专业电子科学与技术题目基于单片机的电子万年历设计任务与要求一、任务:设计基于单片机的电子万年历,达到同时显示年、月、日、时、分、秒的要求。
利用单片机定时器及计数器产生定时效果通过编程形成数字钟效果,再利用数码管动态扫描显示单片机内部处理的数据。
同时通过端口读入当前外部控制状态来改变程序的不同状态,实现不同功能。
二、要求:1、熟悉单片机,C语言等相关知识。
2、学会使用Keil C软件开发环境。
3、定时器整体硬件设计,中断系统设计,软件编程,系统调试等。
4、能自己独立解决设计中的问题,加强自主学习能力。
5、成果形式:软件程序,硬件模块,论文。
毕业设计 (论文) 工作计划学生姓名____ 指导教师___职称教授_院别_____电子工程学院_______专业电子科学与技术__________ 题目基于单片机的电子万年历设计工作进程主要参考书目(资料)1、 单片机原理及应用2、单片机原理及接口技术3、 单片机编程实例4、单片机实验教程 相关网站: 1、计算机及配套软件2、单片机3、元件若干除每周定时具体指导外,学生有问题也可随时联系指导。
如有特殊原因可适当调整,否则按计划执行。
主要参考书目(资料) 主要仪器设备及材料 论文(设计)过程中教师的指导安排对计划的说明XX学院毕业设计(论文)开题报告电子工程学院电子科学与技术专业级班课题名称:基于单片机的电子万年历设计学生姓名:学号:0 0指导教师:报告日期: 2010年3月15号1.本课题所涉及的问题及应用现状综述在当代繁忙的工作与生活中,时间与我们每一个人都有非常密切的关系,每个人都受到时间的影响。
为了更好的利用我们自己的时间,我们必须对时间有一个度量,因此产生了钟表。