单片机万年历设计

合集下载

基于单片机的万年历设计

基于单片机的万年历设计

基于单片机的万年历设计一、系统总体设计基于单片机的万年历系统主要由单片机控制模块、时钟模块、显示模块、按键模块和电源模块等组成。

单片机控制模块是整个系统的核心,负责处理和协调各个模块之间的数据传输和控制信号。

通常选用具有较高性能和稳定性的单片机,如 STC89C52 等。

时钟模块用于提供准确的时间信息,常见的有 DS1302 等芯片,能够实现年、月、日、时、分、秒的精确计时。

显示模块用于将时间等信息直观地展示给用户,可采用液晶显示屏(LCD)或数码管。

LCD 显示效果清晰、美观,但成本相对较高;数码管则价格低廉,显示简单明了。

按键模块用于用户对万年历进行设置和操作,如调整时间、设置闹钟等。

电源模块为整个系统提供稳定的电源供应,保证系统的正常运行。

二、硬件设计1、单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,保证其正常工作;复位电路则用于在系统出现异常时将单片机恢复到初始状态。

2、时钟模块电路DS1302 时钟芯片通过串行方式与单片机进行通信,其引脚连接到单片机的相应 I/O 口。

通过对 DS1302 进行读写操作,可以获取和设置时间信息。

3、显示模块电路若采用 LCD1602 液晶显示屏,其数据线和控制线与单片机的 I/O 口相连。

通过编程控制单片机向 LCD 发送指令和数据,实现时间等信息的显示。

4、按键模块电路通常使用独立按键,将按键的一端接地,另一端连接到单片机的I/O 口,并通过上拉电阻保证在按键未按下时引脚处于高电平。

当按键按下时,引脚电平被拉低,单片机通过检测引脚电平的变化来判断按键的操作。

三、软件设计软件设计主要包括主程序、时钟模块驱动程序、显示模块驱动程序和按键处理程序等。

主程序负责初始化各个模块,并进行循环检测和处理。

在循环中,不断读取时钟模块的时间数据,然后通过显示模块进行显示,并检测按键是否有操作。

时钟模块驱动程序根据 DS1302 的通信协议,实现对时钟芯片的读写操作,从而获取和设置时间。

单片机万年历设计编程

单片机万年历设计编程

单片机万年历设计编程一.实验目的1.掌握时钟程序的使用方法2.掌握时间函数的使用方法3.利用单片机设计万年历二.设计要求通过与单片机连接数码管动态显示年、月、日、时、分、秒、星期等功能,并能准确计算闰年闰月的显示,七个按钮连接P0口可以精确调整每一个时间数值,通过对所设计的万年历时钟电路进行实验测试,达到了动态显示时间,随时调整时间等技术指标。

三.设计方案1.原理构成框图本设计用AT89C51作为核心控制部分,外接晶振电路与复位电路,74LS138作为位选扩展电路,P0口接七个开关作为时间调整部分,以两个四位数码管作为显示部分,开关控制显示时间与日期,P2口作为段选,P1口作为位选部分。

具体框图如图所示:2.主程序设计系统程序采用C语言按模块化方式进行设计,然后通过KeilC51L软件开发平台将程序转变成十六进制程序语言,得到HEX文件,接着使用Proteous进行仿真,其次,按照Proteous 的仿真电路图,在Protel99SE中完成电路板的逻辑布局及布线。

系统程序主要包括主程序,读出时钟子程序、计算时间子程序、键盘扫描子程序和显示数据刷新子程序。

主程序流程图如图所示:3时间调整电路的设计采用按键设计,独立式按键直接与单片机I/O口相连构成键盘,每个按键不会相互影响,按下SHI JIAN键两个四位数码管显示时间和星期,按下RI QI键两个数码管显示日期,按下TIAO SHI键可以对时间和日期进行调节,JIA键表示加,JIAN键表示减,YI WEI表示选择所要调节的位置,QUE DING按键按下,时间调节结束。

所连线路和单片机接口仿真图如图所示:4.LED数码管的选择LED数码管分为共阴和共阳两种,以利用AT89C51的P2口作为LED显示的段选部分,以P1口的P1.0、P1.1、P1.2、三个口作为显示部分的位选,通过三八译码器扩展为八位的位选分别接在两个四位数码管的位选部分。

详细电路图如图所示:5.实物的制作与调试原理图的绘制PCB的绘制四.设计总结这次的设计的任务是万年历时钟的设计,对于时钟以前学习C51时有些接触,通过C51芯片程序控制显示万年历。

基于单片机的万年历设计

基于单片机的万年历设计

一、引言万年历是一种显示当前日期和时间的器件或软件。

随着科技的发展,电子产品普及率愈来愈高,基于单片机的万年历设计成为了一种非常受欢迎的设计方案。

本文将介绍一种基于单片机的万年历设计。

二、设计原理1.显示模块:采用液晶显示屏作为显示模块,可以显示日期、时间等信息。

2.时钟模块:基于RTC(实时时钟)模块,用于获取当前日期和时间。

3.按键模块:采用按键模块作为输入模块,用于设置日期和时间、切换显示模式等。

4.控制模块:基于单片机,用于控制各个模块的工作,并进行相关的计算和显示。

三、硬件设计1.单片机选择在本设计中,选择了一款常用的单片机,STM32F103C8T6、它具有低功耗、高性能的特点,并且具备丰富的外设接口,非常适合用来设计万年历。

2.RTC模块选择在本设计中,选择了一款常用的RTC模块,DS1302、它具有低功耗、稳定性好的特点,并且具备SPI接口,非常适合用来获取当前日期和时间。

3.液晶显示屏选择在本设计中,选择了一款常用的液晶显示屏,1602液晶显示屏。

它具有较大的屏幕尺寸、低功耗的特点,并且可以显示多行字符,非常适合用来显示日期、时间等信息。

4.按键模块选择在本设计中,选择了一款常用的按键模块,4x4按键模块。

它具备4行4列的按键布局,可以满足设置日期和时间、切换显示模式等功能的需求。

五、软件设计1.初始化设置在软件设计中,首先需要对各个硬件模块进行初始化设置。

2.获取当前日期和时间使用RTC模块获取当前日期和时间,并将其存储在相应的变量中。

3.显示日期和时间使用液晶显示屏将当前日期和时间显示出来。

4.设置日期和时间通过按键模块获取用户的输入,并将对应的日期和时间设置到RTC模块中。

5.切换显示模式通过按键模块获取用户的输入,并根据用户的选择切换不同的显示模式,例如切换到年模式、月模式、日模式等等。

六、总结通过以上的设计,基于单片机的万年历完成了日期和时间的获取、显示和设置等功能。

基于单片机万年历设计

基于单片机万年历设计

引言:单片机是集成电路上的一种微处理器。

它具有微处理器的核心功能,如运算逻辑单元,控制单元和寄存器,同时还包含其他外设和接口,如存储器,计数器/定时器等。

在现代科技的不断发展下,单片机已经在许多不同的领域得到广泛应用。

其中之一就是在万年历方面的设计。

万年历在生活中扮演着重要的角色,因此基于单片机设计一个功能强大的万年历具有很大的实用价值。

概述:本文将介绍基于单片机的万年历设计,该设计旨在实现更精确的日期和时间显示,同时提供基本的日历功能和其他实用功能。

文中将详细介绍设计的硬件和软件部分,并讨论其中的各种功能和特点。

正文:1.硬件设计1.1主控芯片选择1.2外设接口设计1.3屏幕选择和显示控制1.4时钟电路设计2.软件设计2.1系统架构设计2.2日期和时间计算算法2.3用户界面设计2.4日历功能实现2.5其他实用功能的实现3.功能和特点3.1准确的日期和时间显示3.2自动切换夏令时3.3多种日期和时间格式支持3.4节假日提醒功能3.5闹钟功能4.应用领域4.1家用4.2办公场所4.3学校4.4研究机构4.5工业领域5.前景和挑战5.1市场需求5.2技术挑战5.3发展趋势5.4可持续发展总结:基于单片机的万年历设计是一项非常有实用价值的技术,它能够提供准确的日期和时间显示,并具备多种实用功能。

本文详细介绍了硬件和软件的设计过程,以及功能和特点,并探讨了该设计在不同领域的应用前景和挑战。

未来,随着科技的进一步发展,基于单片机的万年历设计将继续得到改进和拓展,为人们的生活和工作带来更多的便利和效益。

基于单片机的万年历设计

基于单片机的万年历设计

嵌入式系统概述题目:基于单片机的万年历设计班级:自动化1304班一、系统功能概述此设计以AT89C51为控制芯片,用RTC定时器实现万年历的控制与设计。

所进行控制的语句是通过C语言实现的,并且用串口助手显示能动态地显示当前时间信息,包括年、月、日、时、分、秒。

二、硬件设计原理图:1.万年历电路图设计如下:三、软件设计:1.设计思路:本设计主要由3大部分电路组成:单片机最小系统电路、时钟显示电路和参数修改电路。

其中单片机最小系统主要由复位电路和时钟电路组成。

设计中,当接收到修改参数的指令,将停止时钟的继续,转而进行指令程序,在指令结束后转回断点处继续进行计时。

2.流程图:四、基于单片机万年历的源代码:#include <reg52.h>#include <intrins.h>#include <string.h>#define uint unsigned int#define uchar unsigned charsbit IO = P1^0;sbit SCLK = P1^1;sbit RST = P1^2;sbit RS = P2^0;sbit RW = P2^1;sbit EN = P2^2;sbit KEY1=P3^4;sbit KEY2=P3^5;sbit KEY3=P3^6;uchar*WEEK[]={"SUN","***","MON","TUS","WEN"," THU","FRI","SAT"};uchar LCD_DSY_BUFFER1[]={"DATE 00-00-00 "};uchar LCD_DSY_BUFFER2[]={"TIME 00:00:00 "};uchar DateTime[7]; //秒,分,时,日,月,周,年ucharflag,flag_1,i,miao,fen,shi,ri,yue,zhou,nian; void DelayMS(uint ms){uchar i;while(ms--){for(i=0;i<120;i++);}}/*********************************************** ******/ //函数名称:Write_A_Byte_TO_DS1302(uchar x)//函数功能: 向1302写入一个字节//入口参数: x//出口参数: 无//调用子程序: 无/*********************************************** ******/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;}}void Write_DS1302(uchar add,uchar num) {SCLK=0;RST=0;RST=1;Write_A_Byte_TO_DS1302(add);Write_A_Byte_TO_DS1302(num);RST=0;SCLK=1;}/*********************************************** ******///函数名称:Get_A_Byte_FROM_DS1302()//函数功能: 从1302读一个字节//入口参数: 无//出口参数: b/16*10+b%16 //调用子程序: 无/*********************************************** ******/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;}/*********************************************** ******///函数名称: Read_Data(uchar addr)//函数功能: 指定位置读数据//入口参数: addr//出口参数: dat//调用子程序: Write_Abyte_1302(addr) /*********************************************** ******/uchar Read_Data(uchar addr){uchar dat;RST = 0;SCLK=0;RST=1;Write_A_Byte_TO_DS1302(addr);dat = Get_A_Byte_FROM_DS1302();SCLK=1;RST=0;return dat;}/*********************************************** ******///函数名称: GetTime()//函数功能: 读取时间//入口参数: 无//出口参数: 无//调用子程序: 无/*********************************************** ******/void GetTime(){uchar i,addr = 0x81;for(i=0;i<7;i++){DateTime[i]=Read_Data(addr);addr+=2; }}uchar Read_LCD_State(){uchar state;RS=0;RW=1;EN=1;DelayMS(1);state=P0;EN = 0;DelayMS(1);return state;}void LCD_Busy_Wait(){while((Read_LCD_State()&0x80)==0x80); DelayMS(5);}void Write_LCD_Data(uchar dat) //写数据到1602{LCD_Busy_Wait();RS=1;RW=0;EN=0;P0=dat;EN=1;DelayMS(1); EN=0;}void Write_LCD_Command(uchar cmd) //写命令{LCD_Busy_Wait();RS=0;RW=0;EN=0;P0=cmd;EN=1;DelayMS(1); EN=0;}void Init_LCD() //1602 初始化{Write_LCD_Command(0x38);DelayMS(1);Write_LCD_Command(0x01);DelayMS(1);Write_LCD_Command(0x06);DelayMS(1);Write_LCD_Command(0x0c);DelayMS(1);}void Set_LCD_POS(uchar p){Write_LCD_Command(p|0x80);}void Display_LCD_String(uchar p,uchar *s) //1602显示{uchar i;Set_LCD_POS(p);for(i=0;i<16;i++){Write_LCD_Data(s[i]);DelayMS(1);}}void write_com(uchar com){RS=0;P0=com;DelayMS(5);EN=1;DelayMS(5);EN=0;}void write_date(uchar date){RS=1;P0=date;DelayMS(5);EN=1;DelayMS(5);EN=0;}void display(uchar add,uchar date){uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+0x40+add);write_date(0x30+shi);write_date(0x30+ge);}void display1(uchar add,uchar date) {uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_date(0x30+shi);write_date(0x30+ge);}void Format_DateTime(uchar d,uchar *a) {a[0]=d/10+'0';a[1]=d%10+'0';}uchar ZH(uchar dat){uchar tmp;tmp=dat/10;dat=dat%10;dat=dat+tmp*16;return dat;}void Keyscan(){flag_1=1;while(flag_1){if(KEY1==0){DelayMS(5);while(!KEY1);flag=(flag+1)%8;switch(flag){case(1): Write_LCD_Command(0x0f);Write_LCD_Command(0x80+0x40+11);break;case(2):Write_LCD_Command(0x80+0x40+8);break;case(3):Write_LCD_Command(0x80+0x40+5);break;case(4):Write_LCD_Command(0x80+13);break;case(5):Write_LCD_Command(0x80+11);break;case(6):Write_LCD_Command(0x80+8);break;case(7):Write_LCD_Command(0x80+5);break;case(0): flag_1=0;Write_LCD_Command(0x0c);//miaoWrite_DS1302(0x8e,0x00);Write_DS1302(0x80,ZH(DateTime[0]));Write_DS1302(0x8e,0x80);//fenWrite_DS1302(0x8e,0x00);Write_DS1302(0x82,ZH(DateTime[1]));Write_DS1302(0x8e,0x80);//shiWrite_DS1302(0x8e,0x00);Write_DS1302(0x84,ZH(DateTime[2]));Write_DS1302(0x8e,0x80);//riWrite_DS1302(0x8e,0x00);Write_DS1302(0x86,ZH(DateTime[3]));Write_DS1302(0x8e,0x80);// yueWrite_DS1302(0x8e,0x00);Write_DS1302(0x88,ZH(DateTime[4]));Write_DS1302(0x8e,0x80);//nianWrite_DS1302(0x8e,0x00);Write_DS1302(0x8c,ZH(DateTime[6]));Write_DS1302(0x8e,0x80);break;}}if(flag!=0){if(KEY2==0){DelayMS(5);if(KEY2==0)while(!KEY2);if(flag==1) //miao{DateTime[0]++;if(DateTime[0]==60)DateTime[0]=0;write_com(0x80+0x40+11);display(11,DateTime[0]);}if(flag==2) //fen{DateTime[1]++;if(DateTime[1]==60)DateTime[1]=0;write_com(0x80+0x40+8);display(8,DateTime[1]);}if(flag==3) //shi{DateTime[2]++;if(DateTime[2]==24)DateTime[2]=0;write_com(0x80+0x40+5);display(5,DateTime[2]);}/* if(flag==4) //zhou {DateTime[0]++;if(DateTime[0]==60)DateTime[0]=0;write_com(0x80+0x40+11);display(11,DateTime[0]);} */if(flag==5) // ri{DateTime[3]++;if(DateTime[3]==30)DateTime[3]=0;write_com(0x80+11);display1(11,DateTime[3]); }if(flag==6) //yue{DateTime[4]++;if(DateTime[4]==13)DateTime[4]=0;write_com(0x80+8);display1(8,DateTime[4]);}if(flag==7) //nian{DateTime[6]++;if(DateTime[6]==100)DateTime[6]=0;write_com(0x80+5);display1(5,DateTime[6]);}}}if(flag!=0){if(KEY3==0){DelayMS(5);if(KEY3==0)while(!KEY3);if(flag==1) //miao{DateTime[0]--;if(DateTime[0]==-1)DateTime[0]=0;write_com(0x80+0x40+11);display(11,DateTime[0]);}if(flag==2) //fen{DateTime[1]--;if(DateTime[1]==-1)DateTime[1]=0;write_com(0x80+0x40+8);display(8,DateTime[1]);}if(flag==3) //shi{DateTime[2]--;if(DateTime[2]==-1)DateTime[2]=0;write_com(0x80+0x40+5);display(5,DateTime[2]);}/* if(flag==4) //zhou {DateTime[0]++;if(DateTime[0]==60)DateTime[0]=0;write_com(0x80+0x40+11);display(11,DateTime[0]);} */if(flag==5) // ri{DateTime[3]--;if(DateTime[3]==-1)DateTime[3]=0;write_com(0x80+11);display1(11,DateTime[3]); }if(flag==6) //yue{DateTime[4]--;if(DateTime[4]==-1)DateTime[4]=0;write_com(0x80+8);display1(8,DateTime[4]);}if(flag==7) //nian{DateTime[6]--;if(DateTime[6]==-1)DateTime[6]=0;write_com(0x80+5);display1(5,DateTime[6]);}}}}}void main() {Init_LCD(); while(1) {EA=1;EX0=1;GetTime();Format_DateTime(DateTime[6],LCD_DSY_BUF FER1+5); //年Format_DateTime(DateTime[4],LCD_DSY_BUF FER1+8); //月Format_DateTime(DateTime[3],LCD_DSY_BUF FER1+11); //日strcpy(LCD_DSY_BUFFER1+13,WEEK[DateTim e[5]]); //周Format_DateTime(DateTime[2],LCD_DSY_BUF FER2+5); //时Format_DateTime(DateTime[1],LCD_DSY_BUF FER2+8); //分Format_DateTime(DateTime[0],LCD_DSY_BUF FER2+11); //秒Display_LCD_String(0x00,LCD_DSY_BUFFER1);Display_LCD_String(0x40,LCD_DSY_BUFFER2); }}void int0() interrupt 0{Keyscan();}五、运行结果:。

单片机课程设计报告电子万年历

单片机课程设计报告电子万年历

单片机课程设计报告电子万年历单片机课程设计报告:电子万年历一、设计简介在本次单片机课程设计中,我们选择了电子万年历作为设计主题。

电子万年历是一种结合了数字电路、单片机技术和实时时钟(RTC)技术的电子产品,它具有显示年份、月份、星期、日、时、分、秒的功能,还可以根据用户的需求进行定时、闹钟、报时等功能。

二、硬件设计我们采用了基于8051内核的单片机作为主控芯片。

该单片机具有丰富的I/O 端口,适于实现各种复杂的输入输出操作。

此外,它还内置了定时器和中断控制器,可以很方便地实现实时时钟功能。

1.显示模块:为了方便用户查看时间信息,我们选用了LCD显示屏作为显示设备。

LCD屏具有功耗低、体积小、显示内容丰富等优点。

2.实时时钟(RTC)模块:我们采用了常用的DS1302芯片作为实时时钟模块。

该芯片可以提供秒、分、时、日、星期、月、年的信息,而且还有可编程的报警功能。

3.按键模块:为了实现人机交互,我们设计了一组按键。

用户可以通过按键来调整时间、设置闹钟等。

4.电源模块:为了保证系统的稳定工作,我们采用了稳定的5V直流电源。

三、软件设计我们采用了C语言编写程序。

程序主要由以下几个部分组成:1.主程序:主程序主要负责读取RTC模块的时间信息,并控制LCD显示屏显示时间。

同时,主程序还要检测按键输入,根据用户的需求进行相应的操作。

2.RTC驱动程序:为了正确地读取和设置DS1302芯片的时间信息,我们编写了相应的驱动程序。

驱动程序包括初始化和读写寄存器两部分。

3.按键处理程序:按键处理程序用于检测按键输入,并根据按键值执行相应的操作。

比如,用户可以通过按键来增加或减少时间,设置闹钟等。

4.LCD显示程序:LCD显示程序用于控制LCD显示屏的显示内容。

在本设计中,我们使用了点阵字符库,将时间信息以字符的形式显示在LCD屏上。

四、测试与验证为了确保我们的电子万年历设计正确无误,我们进行了以下的测试和验证:1.硬件测试:首先,我们对硬件电路进行了测试,确保每个模块都能正常工作。

自己制作的单片机万年历程序+原理图

自己制作的单片机万年历程序+原理图

自己制作的单片机万年历程序+原理图单片机万年历仿真原理图如下仿真Altium Designer画的万年历原理图和PCB图如下:PCB原理图基于51单片机,可以完成时钟显示、公历显示、农历显示、温度显示、闹钟报警定时的LCD时钟PPT内容预览:本设计使用AT89C51来做主控芯片,其强大的功能足够实现我们设计的所有功能。

使用LCD1602的液晶显示器来进行显示。

使用Keil uVision5进行编程。

通过Proteus8.6来进行仿真。

点击一次K1进入时钟设置页面,通过点击K2切换时、秒、分、星期、年、月、日,通过K3与K4实现加减来完成时钟的设置点击两次K1进入闹钟设置页面,通过点击K2切换开关、时、秒、分,通过K3与K4实现加减完成闹钟的设置。

单片机源程序如下注释是很全的#include //调用单片机头文件#define uchar unsigned char //无符号字符型宏定义变量范围0~255#define uint unsigned int //无符号整型宏定义变量范围0~65535#include "eeprom52.h"#include "nongli.h"#include "intrins.h"bit flag_200ms ;bit flag_100ms ;sbit beep = P3^7; //蜂鸣器定义bit flag_beep_en;uint clock_value; //用作闹钟用的sbit dq = P3^1; //18b20 IO口的定义uint temperature ; //温度变量uchar flag_nl; //农历阳历显示标志位uchar menu_1,menu_2;uchar key_time,flag_value; //用做连加的中间变量bit key_500ms ;uchar n_nian,n_yue,n_ri; //农历显示的函数#include "ds1302.h"#include "lcd1602.h"/******************把数据保存到单片机内部eeprom中******************/void write_eeprom(){SectorErase(0x2000);byte_write(0x2000, fen1);byte_write(0x2001, shi1);byte_write(0x2002, open1);byte_write(0x2058, a_a);}/******************把数据从单片机内部eeprom中读出来*****************/void read_eeprom(){fen1 = byte_read(0x2000);shi1 = byte_read(0x2001);open1 = byte_read(0x2002);a_a = byte_read(0x2058);}/**************开机自检eeprom初始化*****************/void init_eeprom(){read_eeprom(); //先读if(a_a != 1) //新的单片机初始单片机内问eeprom{fen1 = 3;shi1 = 8;a_a = 1;write_eeprom(); //保存数据}}/***********************18b20初始化函数*****************************/void init_18b20(){bit q;dq = 1; //把总线拿高delay_uint(1); //15usdq = 0; //给复位脉冲delay_uint(80); //750usdq = 1; //把总线拿高等待delay_uint(10); //110usq = dq; //读取18b20初始化信号delay_uint(20); //200usdq = 1; //把总线拿高释放总线}/*************写18b20内的数据***************/void write_18b20(uchar dat){uchar i;for(i=0;i<8;i++){ //写数据是低位开始dq = 0; //把总线拿低写时间隙开始dq = dat & 0x01; //向18b20总线写数据了delay_uint(5); // 60usdq = 1; //释放总线}}/*************读取18b20内的数据***************/uchar read_18b20(){uchar i,value;for(i=0;i<8;i++){dq = 0; //把总线拿低读时间隙开始value >>= 1; //读数据是低位开始dq = 1; //释放总线if(dq == 1) //开始读写数据value |= 0x80;delay_uint(5); //60us 读一个时间隙最少要保持60us 的时间}return value; //返回数据}/*************读取温度的值读出来的是小数***************/uint read_temp(){uint value;uchar low; //在读取温度的时候如果中断的太频繁了,就应该把中断给关了,否则会影响到18b20的时序init_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0x44); //启动一次温度转换命令delay_uint(50); //500usinit_18b20(); //初始化18b20write_18b20(0xcc); //跳过64位ROMwrite_18b20(0xbe); //发出读取暂存器命令EA = 0;low = read_18b20(); //读温度低字节value = read_18b20(); //读温度高字节EA = 1;value <<= 8; //把温度的高位左移8位value |= low; //把读出的温度低位放到value的低八位中value *= 0.625; //转换到温度值小数return value; //返回读出的温度带小数}/******************1ms 延时函数*******************/void delay_1ms(uint q){uint i,j;for(i=0;i<>< p=""><>for(j=0;j<120;j++);}/******************写星期函数*******************/void write_week(uchar hang,uchar add,uchar week)//写星期函数{if(hang==1)write_com(0x80+add);elsewrite_com(0x80+0x40+add);。

基于51单片机的万年历设计

基于51单片机的万年历设计

基于51单片机的万年历设计一、系统设计方案本万年历系统主要由 51 单片机、时钟芯片、液晶显示屏、按键等部分组成。

51 单片机作为核心控制器,负责整个系统的运行和数据处理。

时钟芯片用于提供精确的时间信息,液晶显示屏用于显示万年历的相关内容,按键则用于设置时间和功能切换。

二、硬件设计1、单片机选型选用常见的 51 单片机,如 STC89C52 单片机,它具有性能稳定、价格低廉、易于编程等优点。

2、时钟芯片选择 DS1302 时钟芯片,该芯片能够提供高精度的实时时钟,具有闰年补偿功能,并且可以通过串行接口与单片机进行通信。

3、液晶显示屏采用 1602 液晶显示屏,能够清晰地显示字符和数字,满足万年历的显示需求。

4、按键电路设计四个按键,分别用于时间设置、功能切换、加和减操作。

三、软件设计1、主程序流程系统上电后,首先进行初始化操作,包括单片机端口初始化、时钟芯片初始化、液晶显示屏初始化等。

然后读取时钟芯片中的时间数据,并在液晶显示屏上显示出来。

接着进入循环,不断检测按键状态,根据按键操作执行相应的功能,如时间设置、功能切换等。

2、时钟芯片驱动程序通过单片机的串行接口向 DS1302 发送命令和数据,实现对时钟芯片的读写操作,获取准确的时间信息。

3、液晶显示屏驱动程序编写相应的函数,实现对1602 液晶显示屏的字符和数字显示控制。

4、按键处理程序采用扫描方式检测按键状态,当检测到按键按下时,执行相应的按键处理函数,实现时间设置和功能切换等操作。

四、时间设置功能通过按键操作进入时间设置模式,可以分别设置年、月、日、时、分、秒等信息。

在设置过程中,液晶显示屏会显示当前设置的项目和数值,并通过加、减按键进行调整。

设置完成后,将新的时间数据保存到时钟芯片中。

五、显示功能万年历的显示内容包括年、月、日、星期、时、分、秒等信息。

通过合理的排版和显示控制,使这些信息在液晶显示屏上清晰、直观地呈现给用户。

六、系统调试在完成硬件和软件设计后,需要对系统进行调试。

基于STM32单片机的万年历设计毕业设计论文

基于STM32单片机的万年历设计毕业设计论文

万年历是一种可以显示年、月、日、星期的电子设备,广泛应用于日常生活和办公场所。

本文将介绍一个基于STM32单片机的万年历的设计思路和实现过程。

首先,我们需要明确设计目标。

在这个项目中,我们的目标是使用STM32单片机开发一个功能齐全、易于操作的万年历。

具体地说,这个万年历应该能够显示当前的年、月、日和星期,并且能够进行日期的加减操作,同时应该具备一些辅助功能如闹钟设置、倒计时等。

接下来,我们需要进行硬件设计。

首先需要选择适当的显示屏,比如常见的LCD或OLED屏幕。

然后,我们需要选择合适的按键和外部触发器,用于用户的交互输入。

同时,还需要添加一些必要的接口,如USB接口用于数据传输和维护。

在软件设计方面,我们需要定义合适的数据结构来存储日期、时间、闹钟等信息。

同时,需要编写相应的程序来实现日期的显示和更新、日期的加减、闹钟的设置等功能。

在实现倒计时功能时,我们可以使用定时器中断来实现精确的计时。

此外,为了提高用户体验,我们可以添加一些额外的功能。

比如,我们可以为万年历设计一个简洁美观的用户界面,考虑使用图形库绘制用户界面元素。

同时,可以添加一些实用的功能如温湿度监测、天气预报等。

最后,在整个开发流程结束后,我们需要进行集成测试和调试,确保万年历的各项功能正常运行。

并且,我们还可以考虑为万年历添加一些优化和改进措施,如增加存储容量、优化节能技术等。

综上所述,基于STM32单片机的万年历设计主要涉及硬件设计和软件设计两个方面。

通过精心的设计和合理的实现,我们可以开发出一款功能丰富、易于使用的万年历产品,满足用户的各种需求。

基于单片机万年历设计

基于单片机万年历设计

基于单片机万年历设计基于单片机的万年历设计二、实验要求设计一个万年历,将时钟显示在LCD1602的显示屏上并且可以进行年、月、日以及时、分、秒的设置。

此外还可以通过按键进行闹钟设置以及事件提醒功能,用蜂鸣器进行闹铃提醒。

最后附加一个温湿度检测的功能,用温湿度传感器检测室内的温湿度并将温湿度数据在显示屏上显示出来。

三、实验设备和仪器1.用STC89C52芯片作为系统板的主控芯片2.DHT11温湿度传感器3.DS1302时钟芯片4.LCD1602显示屏四、实验各模块原理介绍4.1STC89C52单片机STC89C52是STC公司生产的一种低功耗、高性能CMOS8位微控制器,具有8K字节系统可编程Flah存储器。

STC89C52使用经典的MCS-51内核,具有传统51单片机不具备的功能。

在单芯片上,拥有灵巧的8位CPU和在系统可编程Flah,使得STC89C52为众多嵌入式控制应用系统提供高灵活、超有效的解决方案。

2.工作电压:5.5V~3.3V(5V单片机)/3.8V~2.0V(3V单片机) 3.工作频率范围:0~40MHz,相当于普通8051的0~80MHz,实际工作频率可达48MHz4.用户应用程序空间为8K字节5.片上集成512字节RAM6.通用I/O口(32个),复位后为:P1/P2/P3是准双向口/弱上拉,P0口是漏极开路输出,作为总线扩展用时,不用加上拉电阻,作为I/O口用时,需加上拉电阻。

8.具有EEPROM功能9.共3个16位定时器/计数器。

即定时器T0、T1、T2。

10.外部中断4路,下降沿中断或低电平触发电路,PowerDown模式可由外部中断低电平触发中断方式唤醒。

11.通用异步串行口(UART),还可用定时器软件实现多个UART。

12.工作温度范围:-40~+85℃(工业级)/0~75℃(商业级)13.PDIP封装1、STC89C52单片机引脚图图4.1STC89C52单片机引脚图①主电源引脚(2根) VCC(Pin40):电源输入,接+5V电源GND(Pin20):接地线②外接晶振引脚(2根) 某TAL1(Pin19):片内振荡电路的输入端某TAL2(Pin20):片内振荡电路的输出端③控制引脚(4根) RST/VPP(Pin9):复位引脚,引脚上出现2个机器周期的高电平将使单片机复位。

单片机万年历课程设计

单片机万年历课程设计

单片机万年历课程设计一、课程目标知识目标:1. 让学生理解单片机的基本原理和万年历的功能需求。

2. 使学生掌握单片机编程的基本语法和逻辑结构。

3. 帮助学生掌握如何在单片机上实现日期、时间的计算与显示。

技能目标:1. 培养学生运用单片机进行项目设计的能力,特别是万年历的实际应用。

2. 培养学生独立编程和调试程序的能力,解决实际项目中遇到的问题。

3. 提高学生团队协作能力和项目管理的意识。

情感态度价值观目标:1. 培养学生对单片机及电子制作的兴趣,激发学生的创新意识和探索精神。

2. 增强学生面对困难的勇气和毅力,培养他们积极解决问题的态度。

3. 通过团队合作,培养学生的集体荣誉感和责任感。

课程性质:本课程为实践性强的设计与制作课程,以单片机技术为核心,结合编程和电子技术,实现万年历的制作。

学生特点:学生为高年级学生,已具备一定的单片机基础知识,有编程基础,具备独立思考和解决问题的能力。

教学要求:注重理论与实践相结合,强调动手操作和实际应用。

教学过程中要关注学生的个体差异,提供适当的指导与帮助,确保每个学生都能在原有基础上得到提升。

通过课程学习,使学生能够将所学知识应用于实际项目中,达到学以致用的目的。

二、教学内容1. 单片机基础回顾:复习单片机的硬件结构、工作原理及I/O口编程。

- 教材章节:第三章单片机硬件结构与工作原理;第四章I/O口编程。

2. 定时器与中断:学习单片机定时器的工作原理,掌握中断编程方法。

- 教材章节:第五章定时器与中断;第六章中断编程。

3. 日期时间计算:讲解日期时间的计算方法,如何在单片机中进行实现。

- 教材章节:第七章日期时间计算;第八章单片机实现日期时间计算。

4. 显示技术:学习LED显示技术,掌握动态扫描显示方法。

- 教材章节:第九章LED显示技术;第十章动态扫描显示。

5. 万年历设计与实现:结合所学知识,设计并实现单片机万年历。

- 教材章节:第十一章项目设计与实现;第十二章万年历设计与制作。

单片机万年历课程设计报告

单片机万年历课程设计报告

单片机万年历课程设计报告一、课程设计目标本课程设计旨在帮助学生掌握单片机应用基础知识,学习并完成万年历电路的设计和代码编写。

通过这个实践,学生将会深入理解单片机在实际生活中的应用,同时提升自己的程序设计和解决问题的能力。

二、课程设计内容1. 万年历电路的原理和设计本次课程设计要求学生完成一个万年历电路的设计,包括硬件电路和程序设计。

在电路设计中,学生需要考虑到显示器、时钟模块、日期模块和温湿度传感器等部分的连接和调试。

在程序设计方面,学生需要实现万年历的功能,包括显示当前日期和时间、自动确定闰年、节假日提示等。

2. 单片机基本原理和应用实践在万年历电路设计之前,本课程将会对单片机基本原理进行介绍,包括单片机内部结构、芯片选型和I/O口控制等。

另外,还将介绍单片机在各种应用场景中的应用实践,如遥控、电脑控制、机器人和智能家居等。

3. 问题解决和困难克服在学生完成万年历电路设计的过程中,难免会遇到各种问题和困难。

本课程将对学生进行相关的实用技巧和方法讲解,帮助他们解决问题和克服难关。

三、课程设计流程1. 单片机基础知识介绍(2学时)讲解单片机内部结构及其原理,并介绍单片机应用实践2. 万年历电路设计(12学时)对万年历的硬件和软件进行介绍,包括连接显示器和外设、编写程序等3. 问题解决(2学时)介绍学生应对问题的技巧和方法,并帮助他们克服电路设计中的问题和难点四、课程设计评价标准1. 设计成果设计成果的好坏是课程设计的重要衡量标准之一,包括电路的设计完整性、软件功能实现等方面。

2. 实践能力课程设计是一种实践性强的学习形式,学生需要通过实践来掌握知识,因此他们的实践能力成为衡量标准之一。

3. 团队合作在课程设计的过程中,学生要协同工作,完成一个大型的项目,因此团队合作能力是衡量标准之一。

4. 学习的态度学习态度是衡量标准之一,包括学生在课程设计中的主动性、积极性和责任感等方面。

五、总结通过这个万年历课程设计,学生不仅学会了单片机应用的基础知识,还掌握了实际项目开发的方法和技巧。

51单片机万年历课程设计报告

51单片机万年历课程设计报告

一、设计任务:1、设计任务:设计并制作一个数字钟。

2、设计要求:●显示年月日时分秒及星期信息●具有可调整日期和时间功能●增加闰年计算功能●显示部分由LCD1602完成二、方案论证:1.显示部分:显示部分是本次设计的重要部分,一般有以下两种方案:方案一:采用LED显示,分静态显示和动态显示。

对于静态显示方式,所需的译码驱动装置很多,引线多而复杂,且可靠性也较低。

而对于动态显示方式,虽可以避免静态显示的问题,但设计上如果处理不当,易造成亮度低,有闪烁等问题。

方案二:采用LCD显示。

LCD液晶显示具有丰富多样性、灵活性、电路简单、易于控制而且功耗小等优点,对于信息量多的系统,是比较适合的。

鉴于上述原因,我们采用方案二。

2.数字时钟:数字时钟是本设计的核心的部分。

根据需要可采用以下两种方案实现:方案一:方案完全用软件实现数字时钟。

原理为:在单片机内部存储器设三个字节分别存放时钟的时、分、秒信息。

利用定时器与软件结合实现1秒定时中断,每产生一次中断,存储器内相应的秒值加1;若秒值达到60,则将其清零,并将相应的分字节值加1;若分值达到60,则清零分字节,并将时字节值加1;若时值达到24,则将时字节清零。

该方案具有硬件电路简单的特点,但当单片机不上电,程序将不执行。

而且由于每次执行程序时,定时器都要重新赋初值,所以该时钟精度不高。

方案二:方案采用Dallas公司的专用时钟芯片DS1302。

该芯片内部采用石英晶体振荡器,其芯片精度不大于10ms/年,且具有完备的时钟闹钟功能,因此,可直接对其以用于显示或设置,使得软件编程相对简单。

为保证时钟在电网电压不足或突然掉电等突发情况下仍能正常工作,芯片内部包含锂电池。

当电网电压不足或突然掉电时,可使系统自动转换到内部锂电池供电系统。

而且即使系统不上电,程序不执行时,锂电池也能保证芯片的正常运行,以备随时提供正确的时间。

基于时钟芯片的上述优点,本设计采用方案二完成数字时钟的功能。

基于51单片机的万年历设计流程

基于51单片机的万年历设计流程

基于51单片机的万年历设计流程
基于51单片机的万年历设计流程可以分为以下几个步骤:
1. 确定需求:首先,你需要明确你的万年历需要有哪些功能。

例如,是否需要显示日期、时间、星期,是否需要闹钟功能,是否需要手动或自动校准等。

2. 选择硬件:选择合适的单片机作为主控制器。

常用的单片机有8051系列,如AT89C51、AT89S52等。

此外,还需要选择适当的显示模块、按键模块、实时时钟模块等。

3. 设计硬件电路:根据选择的硬件设备,设计电路原理图和PCB图。

需要
考虑单片机的引脚连接、电源供给、时钟源、外部扩展等问题。

4. 编写软件程序:根据硬件电路和需求,编写相应的软件程序。

这包括初始化程序、主程序、中断服务程序等。

5. 调试和测试:将编写好的程序下载到单片机中,进行实际测试。

根据测试结果,对程序进行调试和修改,直到满足设计要求。

6. 生产:完成调试后,就可以进行批量生产了。

在生产过程中,还需要对产品进行质量检测,确保每个产品都能正常工作。

7. 后期维护:在产品上市后,可能需要对产品进行维护或升级。

例如,如果用户在使用过程中发现了问题,或者有新的需求,就需要对产品进行改进或升级。

以上是基于51单片机的万年历设计的基本流程,但具体的步骤可能会根据具体的需求和硬件设备有所不同。

单片机万年历毕业设计

单片机万年历毕业设计

单片机万年历是一种非常实用的电子设备,它可以准确地显示日期和时间,并且可以自动调整闰年和月份的天数。

在现代社会,随着人们生活水平的提高和科技的发展,电子设备在人们的日常生活中发挥着越来越重要的作用。

在这种背景下,单片机万年历应运而生,它不仅可以帮助人们准确地了解日期和时间,还可以提醒人们重要的日程安排。

单片机万年历的设计原理是通过单片机的控制,实现对时钟芯片的读取和控制,从而实现准确的时间显示。

同时,通过编程控制,还可以实现闰年和月份天数的自动调整功能。

为了实现更加精确的时间显示,可以通过连接网络进行时间同步,从而保证万年历的准确性。

单片机万年历的设计需要考虑多个方面,包括硬件设计和软件设计。

在硬件设计方面,需要选择适合的单片机和时钟芯片,同时还需要设计合适的电路板和显示屏,以及其他必要的外围电路。

在软件设计方面,需要编写相应的程序代码实现对时钟芯片的读取和控制,并实现闰年和月份天数的自动调整功能。

此外,还可以添加一些其他功能,如闹钟、倒计时等,以增加万年历的实用性和娱乐性。

在进行单片机万年历的毕业设计过程中,需要注意以下几个关键点。

首先,要确保硬件电路的正常工作,包括各个元件的连接和供电的稳定性。

其次,要确保编写的软件程序能够准确地读取和显示时间,并能够自动调整闰年和月份天数。

再次,要确保设计的功能实用性和稳定性,如闹钟功能的准点提醒、倒计时功能的精确计算等。

最后,还需要注意外观的美观性和易用性,以增加用户的满意度和使用体验。

综上所述,单片机万年历作为一种实用的电子设备,在现代社会中具有广泛的应用前景。

通过对硬件和软件的设计,可以实现准确的时间显示和自动调整功能,从而方便人们的日常生活和工作。

在进行单片机万年历的毕业设计过程中,需要注重电路的稳定性和软件的功能完善性,并通过实际测试和调试,不断优化设计,以实现更好的效果。

希望通过这篇文献,能够为单片机万年历的毕业设计提供一些参考和帮助。

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历

单片机课程设计--基于51单片机的万年历单片机课程设计基于 51 单片机的万年历一、引言在现代生活中,时间的准确记录和显示对于我们的日常生活和工作具有重要意义。

万年历作为一种能够同时显示年、月、日、星期、时、分、秒等信息的设备,给人们带来了极大的便利。

本次课程设计旨在利用 51 单片机实现一个简单实用的万年历系统。

二、系统设计方案(一)硬件设计1、单片机选型选择经典的 51 单片机,如 STC89C52 单片机,其具有性能稳定、价格低廉、资源丰富等优点,能够满足本设计的需求。

2、显示模块采用液晶显示屏(LCD1602)作为显示设备,能够清晰地显示数字和字符信息。

3、时钟芯片选用DS1302 时钟芯片,它可以提供精确的实时时钟数据,包括年、月、日、星期、时、分、秒等。

4、按键模块设置三个按键,分别用于调整时间、选择调整项(年、月、日、时、分、秒等)以及切换显示模式(正常显示和设置模式)。

(二)软件设计1、主程序流程系统初始化后,首先读取 DS1302 中的时间数据,并将其显示在LCD1602 上。

然后进入循环,不断检测按键状态,根据按键操作进行相应的时间调整和显示模式切换。

2、时间读取与显示程序通过与 DS1302 进行通信,读取实时时间数据,并将其转换为适合LCD1602 显示的格式进行显示。

3、按键处理程序检测按键的按下状态,根据不同的按键执行相应的操作,如调整时间、切换显示模式等。

三、硬件电路设计(一)单片机最小系统单片机最小系统包括单片机芯片、晶振电路和复位电路。

晶振电路为单片机提供时钟信号,复位电路用于系统初始化时将单片机的状态恢复到初始值。

(二)显示电路LCD1602 显示屏通过数据总线和控制总线与单片机相连。

数据总线用于传输要显示的数据,控制总线用于控制显示屏的读写操作和显示模式。

(三)时钟电路DS1302 时钟芯片通过串行通信接口与单片机进行通信。

单片机通过发送特定的指令和数据,对 DS1302 进行读写操作,获取或设置时间信息。

基于51单片机的万年历设计

基于51单片机的万年历设计

一、引言万年历是一种日历工具,能够显示任何一个公历日期的星期、年、月和日,并且能够自动判断闰年。

在本设计中,我们将使用51单片机设计一个基于LCD显示屏的万年历。

它将能够显示当前的日期和星期,并且具备一些附加功能,如闹钟、计时器等。

二、设计目标本设计的主要目标是通过51单片机实现以下功能:1.显示当前日期和星期:使用LCD显示屏显示当前的年、月、日和星期。

2.闰年判断:根据公历算法判断是否为闰年,并在显示屏上进行标识。

3.闹钟功能:设置一个闹钟时间,并在指定时间到达时发出提醒。

4.计时器功能:实现一个简单的计时器,能够显示经过的时间。

三、系统框图```+------------------+51单片+---+----------+---++--v--++--v--+LCD ,, Keypa+-----++-------+```四、系统设计1.时钟模块:使用定时器模块实现系统的主时钟,根据预设的频率进行中断,更新时间和日期。

2.LCD模块:使用51单片机的IO口控制LCD显示屏,实现对日期、星期和其他功能的显示。

3.按键模块:通过按键模块实现对系统功能的操作,包括设置闹钟、切换功能等。

4.闹钟模块:根据预设的时间进行判断,判断是否到达闹钟时间并触发相应的操作。

5.计时器模块:通过计时器模块实现计时功能,显示经过的时间。

五、代码实现以下是基于51单片机的万年历的主要代码实现的伪代码:1.时钟模块:```初始化定时器;定时器中断中获取当前的日期和时间;```2.LCD模块:```定义LCD引脚;初始化LCD显示;定时刷新LCD内容;```3.按键模块:```定义按键引脚;初始化按键;判断按键事件并执行相应的操作;```4.闹钟模块:```设置闹钟时间;判断当前时间是否与闹钟时间相等;触发相应操作;```5.计时器模块:```设置起始时间;计算当前时间与起始时间的差值;显示计时时间;```六、实验结果通过上述的代码实现和电路连接,我们可以成功地实现了基于51单片机的万年历。

基于单片机的万年历设计

基于单片机的万年历设计

基于单片机的万年历设计随着现代科技的发展,电子设备已经成为人们生活中必不可少的一部分。

在这个信息爆炸的时代,人们对于时间的重视变得前所未有的强烈。

为了满足人们对时间的需求,开发出一款基于单片机的万年历是非常实用和有意义的。

本文将介绍基于单片机的万年历的设计原理、功能和优势。

一、设计原理基于单片机的万年历的设计原理是将传统的机械万年历通过电子元件嵌入到单片机中,通过编程控制显示当天的日期、星期、月份和年份,同时还能显示闰年、节假日等特殊信息。

这样一来,人们只需要通过触摸按钮,就可以轻松查看到当前日期的相关信息,而无需再翻看纸质万年历。

二、功能介绍基于单片机的万年历的功能非常强大,以下是其主要功能的介绍:1.日期显示:万年历能够以数字的形式直观地显示当天的日期,包括年、月、日。

2.星期显示:万年历可以精确地显示当天是星期几,帮助人们更好地安排日程。

3.月份显示:万年历还可以显示当月的名字,让人们轻松记忆每个月的名称和顺序。

4.年份显示:万年历还能够显示当前的年份,方便人们记录时间和纪念重要的年份。

5.闰年判断:万年历能够判断每个年份是否为闰年,避免人们在自己计算时出现错误。

6.节假日显示:万年历还能够预设节假日,并在节假日到来时进行提醒,帮助人们更好地安排休息和旅行计划。

除了以上功能之外,基于单片机的万年历还可以根据不同地区的需要进行个性化设置,比如显示不同的节日和纪念日,增强用户体验。

三、设计优势基于单片机的万年历相比传统的纸质万年历具有以下几个优势:1.便携性:基于单片机的万年历体积小巧,可以随身携带,随时查看日期。

而传统的纸质万年历往往比较笨重,不易携带。

2.准确性:基于单片机的万年历通过编程控制,可以实现日期的精确显示,避免了人为计算的误差。

而纸质万年历可能会受到印刷质量和人工记录错误的影响,准确性不如电子万年历。

3.交互性:基于单片机的万年历可以通过按钮进行交互,方便用户使用和操作。

用户可以自由切换显示模式,查询不同日期相关信息。

基于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.按键操作:对按键进行扫描,根据按键的不同操作进行相应的处理。

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

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

万年历显示模块设计1使用硬件和软件简介1.1 51单片机简介本次单片机课程设计需要使用的是上课时学习的51单片机,其是对目前所有兼容Intel 8031指令系统的单片机的统称。

该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为目前应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。

目前很多公司都有51系列的兼容机型推出,在目前乃至今后很长的一段时间内将占有大量市场。

51单片机即是基础入门的一个单片机,还是应用最广泛的一种。

1.2 使用软件简介本次课程设计要使用2款软件协作完成,即protues完成基本电路构造和keil完成单片机程序设计。

1.2.1 protues介绍Protues在两次课程设计中都有用到,可见学校对其应用的总是程度。

Protues软件是英国Labcenter electronics公司出版的EDA工具软件(该软件中国总代理为广州风标电子技术有限公司)。

它不仅具有其它EDA工具软件的仿真功能,还能仿真单片机及外围器件,几乎是目前最好的仿真单片机及外围器件的工具。

虽然目前国内的推广刚起步,但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。

从原理图布图、代码调试到单片机与外围电路协同仿真,一键切换到PCB设计,真正实现了从概念到产品的完整设计。

是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台,其处理器模型支持8051、HC11、PIC10/12/16/18/24/30/DsPIC33、AVR、ARM、8086和MSP430等。

在编译方面,它支持IAR、Keil和MPLAB等多种编译,这次课程设计就是Protues和Keil的协同使用来完成。

软件仿真方面,支持当前的主流单片机,如51系列、AVR系列、PIC12系列、PIC16系列、PIC18系列、Z80系列、HC11系列、68000系列等。

可以提供软件调试功能,丰富的外围接口器件及其仿真( RAM,ROM,键盘,马达,LED,LCD,AD/DA,部分SPI器件,部分IIC器件)。

这样很接近实际。

此外还具有强大的原理图绘制功能。

1.2.2 keil介绍这次单片机课程设计中除必要的硬件外,同样离不开软件的支持,所使用的汇编语言或C语言源程序要变为CPU可以执行的机器码有两种方法,一种是手工汇编,另一种是机器汇编,目前已极少使用手工汇编的方法了。

机器汇编是通过汇编软件将源程序变为机器码,用于MCS-51单片机的汇编软件有早期的A51,随着单片机开发技术的不断发展,从普遍使用汇编语言到逐渐使用高级语言开发,单片机的开发软件也在不断发展,Keil软件是目前最流行开发MCS-51系列单片机的软件,这从近年来各仿真机厂商纷纷宣布全面支持Keil即可看出。

Keil提供了包括C编译器、宏汇编、连接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(uVision)将这些部份组合在一起。

掌握这一软件的使用对于使用51系列单片机的设计者来说是十分必要的,如果使用C语言编程,那么Keil几乎就是唯一的选择。

即使不使用C语言而仅用汇编语言编程,Keil方便易用的集成环境、强大的软件仿真调试工具也会事半功倍。

2 设计过程2.1 设计流程图图2.1 设计流程图2.2 keil编程根据上述的电路图,可知显示部分采用8位7段数码管的分时显示,利用人眼的视觉暂留现象,在数码管上显示出连续的明显数值。

其中8位数码管的各位开关信号16进制编码如下表:图2.2 8位数码管开关位编码相应的2进制数输出转化位7段数码管显示十进制的编码表如下:图2.3 7段数码管显示编码根据以上数据和单片机的各端口功能分布,可以大略得出程序的流程图。

程序开始前,可以先进行一些预处理,使编程过程简化。

2.2.1 程序预处理首先,讲头文件中包含的单片机的各对应引脚定义为较容易书写的格式,同时定义十进制到7段数码管显示对应的8位2进制数转化的数组序列。

然后,定义全局变量(同时初始化初值),方便在各函数间调用和改变年月日时分秒的具体数值,避免使用指针带来的语言复杂性。

最后,对要用到的函数进行统一声明(也可以直接先写函数),防止编程时不合理的调用函数。

2.2.2 主函数流程最重要的主函数流程可归纳如下:先将2输出端置零,使得显示屏清空。

后建立一永久循环H,表示程序一直运行。

循环的开始再建立一设定好次数的循环J,用来做单片机分频用,其中调用键盘扫描程序,看是否有键按下,以此判定下一步动作。

由于日历的要求控制键不多,课程设计的要求为可切换显示,故最少应有2个控制键来切换日期和时间的显示。

若按下的为显示日期/时间,则对日期/时间相关数据进行处理,由其中一个输出端输出,由另一输出端控制显示在8位数码管的哪一位上,后延时实现一段时间。

最后再次执行键盘扫描函数,看指令是否变化。

固定循环J结束,判断是否按下其他操作键,对时间日期的数据进行人为修改;若无则向下执行,进行时间/日期的溢出判断和正常增加计数。

最后运行至无限循环H底部,再跳至开头进行上述步骤。

3.2.3 相关子函数键盘检测程序:由于操作键较少,所以不必使用多重键盘,只需使用单片机一个端口就可以有8个按键供使用。

检测哪个端口有电位变化,就可判断按下的是哪个按键。

延时函数:就一设定好次数的循环,用以消耗指令周期,循环中可以为空语句,或者为检测、显示语句以确定按键、固定示数。

2.2.4 程序总流程图根据上述文字表达,可以得出程序总流程图如下:图2.4 程序总流程图根据课程设计的要求和设计流程,结合设计出的电路图,可以设计相应的C语言程序,见附录。

2.3 protues设计电路图及仿真根据所编的程序,可以设计出相应的电路图。

显示部分采用8位7段数码管,虽然年月日/时分秒只用带6位左右,但是为了分隔便于观察,所以增加2位空格显示。

其中将P1口做输入端,用来和8个接地按键相连,构成键盘电路。

P2口做输出口,用来输出时间日期的8位2进制数表达。

P0口做控制端,控制P2输出的信号显示在具体哪个数码管上。

此外,需要提供相应的外部时钟输入XLAT1和XLAT2,再对RET和EA端口赋予相应的电位,使得单片机能够正常工作。

综上,利用protues元件库,可以设计出满足上述条件的显示电路,如下所示:图2.5 仿真电路图由于对于Protues的晶振元件不是很熟悉,无法设定合适的电路使其起振,故在此用一周期脉冲源替代晶振作为外部时钟。

基本电路完成,将编程生成的hex文件导入到仿真单片机中:图2.6 导入hex文件按下仿真键,即可开始仿真:图2.7 仿真实时图(显示日期)图2.8 仿真实时图(显示时间)虽然电路比较简陋,但是基本可以实现对年月日和时分秒的分别显示,且具有清零和更改设置时间的功能。

由于没有采用4×4键盘,只和P1端口直接链接,所以只有8个操作键,实现显示6个时间和2个更新时间的操作。

由于选用的的数码管最多只能找到8位的,所以就没有增加显示星期的功能。

也因为,我觉得星期本身就是在日期上多加一个限制在7内的计数单元,没有太多的必要,所以就没有设计这个功能。

3 心得体会本次单片机课程设计是一个使用Protues设计工具、协同使用Keil编程软件制作小万年历的题目。

本来以为会很简单,因为课本上就有很接近的习题和讲解,所以开始我也没有很在意,以至时间越拖越后,最后只能赶工完成。

解题过程中,我更加感到之前的判断是多么的天真,单片机的的C语言表示法很多语法与之前学过的C语言不同,特别是单片机的存储结构和指令计数方式是从前没有学到的。

不过时间紧迫,只能临时抱佛脚啃啃教材。

在整个过程中,我深刻地感受并理解到C语言的简便性和丰富性。

不管是从实现功能的角度看还是从数据类型、架构上,都可以看出C语言是一个十分优秀的程序开发语言。

虽然汇编有程序段短小的巨大优势,不过对于我这样新手而言,能用C语言完成这个题目已经很不容易了。

这次作业让我了解怎么从不同的角度去分析同一个问题,让我们有更多更广的思路去处理解题时遇到的难点和要点。

从解决问题的过程中也可以熟悉和了解C语言和Protues程序的不同用法和功能,而各种原有的模板使得我可以用高效,简洁的思路、观点来解题。

这样的探索过程也是很愉悦的,特别是看到自己也能编写一个起码有点样子的仿真程序的时候。

虽然我所完成的作业本身就是很简单的一个基本应用,但在这过程中我所学到的东西令我终生受用。

在如此紧的时间内(好吧,由于之前所述的原因,其实作业很早就布置了,只是我个人因素使得真正在做的时间很短)完成这次作业,甚至我还只是对所应用的语言和软件一知半解的情况下,没有同学和老师的帮助,要完成它简直是不可想象的。

在我落后进度那么多的情况下,多谢有我的同学的帮助,特别是我的单片机的教材找不到时,他分享他的学习资料,使得我得到可以完成这次课程设计的客观条件。

在学习相关语言知识和软件应用时,也多谢老师和其他同学给予的教导和提点。

有这么多的帮助,我相信,只要坚持不懈的努力,一定能够战胜重重的困难,完成此门课程最后一次大作业!最后,我完成了这次作业,望老师指正。

参考文献[1]李群芳,张士军,黄建《单片微型计算机与接口技术(第二版)》电子工业出版社 2007年1月[2]楼然苗《51系列单片机设计实例》北京航空航天出版社 2003年3月[3]梁翎,李爱齐《C语言程序设计实用技巧与程序实例》上海科普出版社1996年[4]李广第《单片机基础》第1版北京航空航天大学出版社 1999年[5]高峰《单片微机应用系统设计及实用技术》机械工业出版社 2004年附录#include <reg51.h>#include <absacc.h>#define uchar unsigned char#define uint unsigned intUnsigned char code discode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; unsigned int i=0,j,m=32,f=25,s=10,r=21,y=7,n=05;sbit P1_0=P1^0;sbit P1_1=P1^1;sbit P1_2=P1^2;sbit P1_3=P1^3;sbit P1_4=P1^4;sbit P1_5=P1^5;sbit P1_6=P1^6;sbit P1_7=P1^7;sbit P0_0=P0^0;sbit P0_1=P0^1;sbit P0_2=P0^2;sbit P0_3=P0^3;sbit P0_4=P0^4;sbit P0_5=P0^5;sbit P0_6=P0^6;void delays(void);uchar kbscan(void);uchar inkbscan(void);void display(void);/******************************下面是主程序*************************/void main(void){P0=0;P2=0;while(1){kbscan();//键盘扫描程序delays();//延时程序for(j=600;j>0;j--){if(j>290&&j<550){if(i==0) //show day{P0=0xfe;P2=discode[n/10];delays();P0=0xfd;P2=discode[n%10];delays();P0=0xf7;P2=discode[y/10];delays();P0=0xef;P2=discode[y%10];delays();P0=0xbf;P2=discode[r/10];delays();P0=0x7f;P2=discode[r%10];delays();}if(i==1) //? show time {P0=0xfe;P2=discode[s/10];delays();P0=0xfd;P2=discode[s%10];delays();P0=0xf7;P2=discode[f/10];delays();P0=0xef;P2=discode[f%10];delays();P0=0xbf;P2=discode[m/10];delays();P0=0x7f;P2=discode[m%10];delays();}kbscan();//键盘扫描程序}}if(i==2){n++;i=0;} // year add 1if(i==3){y++;i=0;} // yuefen add 11if(i==4){r++;i=0;} // day add 1if(i==5){s++;i=1;} // hour add 1if(i==6){f++;i=1;} // min add 1if(i==7){n=0;y=1;r=1;s=0;f=0;m=0;i=0;} // all be 0 { m++; //秒计数进行if(m>59){f++;m=0;}if(f>59){s++;f=0;}if(s>23){r++;s=0;}if(r>30){y++;r=1;}if(y>12){n++;y=1;}if(n>99){n=2;}}}}void delays(void)//延时程序{int o;for(o=80;o>0;o--);}uchar kbscan(void)//键盘扫描程序{if((P1&0xff)!=0xff){delays();if((P1&0xff)!=0xff){if(P1_0==0)i=0;if(P1_1==0)i=1;if(P1_2==0)i=2;if(P1_3==0)i=3;if(P1_4==0)i=4;if(P1_5==0)i=5;if(P1_6==0)i=6;if(P1_7==0)i=7;display();//数码管显示程序}}return(i);}void display(void) //数码管显示程序{P2=discode[i];delays();}此程序可以正常进行编译,生成相应的hex,说明基本语法没有错误。

相关文档
最新文档