微机原理课程设计-万年历
万年历单片机课程设计
万年历单片机课程设计一、课程目标知识目标:1. 学生能理解单片机的基本原理,掌握其功能和应用。
2. 学生能掌握万年历的运行机制,理解日期、时间计算的方法。
3. 学生能了解并运用编程语言(如C语言)进行单片机程序设计。
技能目标:1. 学生能运用所学知识,设计并实现一个具有日期和时间显示功能的万年历单片机系统。
2. 学生能够通过实践操作,掌握使用开发工具和调试技巧,提高问题解决能力。
情感态度价值观目标:1. 学生培养对单片机技术及编程的兴趣,激发创新意识和探索精神。
2. 学生通过团队协作,培养沟通、合作能力,提高集体荣誉感。
3. 学生在学习过程中,认识到科技发展对社会的重要性,增强社会责任感。
课程性质:本课程为实践性较强的课程,结合理论知识与实践操作,让学生在动手实践中掌握单片机技术。
学生特点:学生具备一定的电子技术基础,对编程有一定了解,好奇心强,喜欢动手实践。
教学要求:教师需结合学生特点,采用任务驱动、案例教学等方法,引导学生主动探究,确保课程目标的实现。
在教学过程中,注重培养学生的实践能力和创新能力。
通过对课程目标的分解和教学评估,确保学生达到预期学习成果。
二、教学内容1. 单片机基础知识:介绍单片机的组成、工作原理及功能特点,结合教材第二章内容,使学生建立单片机的基本概念。
2. 编程语言基础:回顾C语言编程基础,强调其在单片机编程中的应用,参考教材第四章进行教学。
3. 万年历原理:讲解日期和时间的计算方法,分析万年历的运行机制,结合教材第三章内容进行教学。
4. 单片机程序设计:教授如何使用C语言编写单片机程序,实现万年历功能,参考教材第五章内容。
5. 硬件电路设计:介绍万年历单片机系统的硬件组成,分析电路原理,结合教材第六章进行教学。
6. 实践操作:指导学生使用开发工具进行程序编写、调试和烧录,完成万年历单片机系统的搭建和测试。
7. 教学进度安排:- 第1周:单片机基础知识学习;- 第2周:编程语言基础复习;- 第3-4周:万年历原理讲解和单片机程序设计;- 第5周:硬件电路设计;- 第6周:实践操作,完成万年历单片机系统设计;- 第7周:总结与展示,进行教学评估。
单片机课程设计-万年历
一、课程设计名称万年历二、课程设计目的1、掌握单片机的原理、应用。
2、学会利用单片机设计电路。
3、培养大家的创新意识及动手能力。
三、课程设计内容(一)方案设计我们组设计的万年历是以一片40引脚的单片机AT89C52为主体,结合16位定时器/计数器和LED数码管等元器件来实现的,主要有几个单元电路构成,分别是复位电路、振荡电路、按键电路、整点报时电路和显示电路,下面给出了电路框图及其分析和说明。
1、复位电路此单元电路为手动复位电路,由按键、电解电容、电阻等构成,与单片机的RST引脚相连接,在单片机运行过程中可以随时按键复位,电路图如图1所示:图-1 复位电路2、振荡电路此单元电路由晶振和电容构成,其中的晶振频率为12MHz,与单片机的XTAL1和XTAL2引脚相连接,具体电路如图2所示:图-2振荡电路3、调整电路此单元电路主要由多个弹性按键构成,在所设计的电路中与单片机的I/O(P1)口相连接,具体电路可参考图3:图-3按键调整电路图中的按键K0、K1、K2、K3分别具有不同的功能,其中K0、K1、K2用于校准,K0调节小时(或年)、K1调节分(或月)、K2调节秒(或日);K3用于切换,启动时万年历显示的为时分秒,当按下K3时可以切换到年月日显示界面。
4、整点报时电路此部分电路通过采用晶体管驱动蜂鸣器实现的,每当显示时间出现整点时(如12:00:00),蜂鸣器会发出短暂响声,起到整点报时功能。
实际电路中与单片机的P1.3相连接,具体电路可参照图4:图-4整点报时电路5、显示电路此单元电路为万年历的显示屏,由共阳数码管构成,采用动态扫描的方式来显示年月日和时分秒,示意图如图5所示:图-5数码管显示电路注意:实际中电路与上述电路不同,稍复杂些,而且采用的是两个四位一体的数码管,还要接限流电阻(较小,如470欧)和晶体管(如9012)。
(二)系统硬件设计该系统主要由时钟电路部分、中央处理单元、数码管显示部分组成,各组成部分如图所示。
基于51单片机DS1302万年历课程设计报告
基于51单片机DS1302万年历课程设计报告课程名称:微机原理课程设计题目:基于DS1302芯片万年历摘要DS1302 是DALLAS 公司推出的涓流充电时钟芯片,内含有一个实时时钟/日历和31 字节静态RAM,通过简单的串行接口与单片机进行通信实时时钟/日历电路.提供秒、分、时、日、日期.、月、年的信息,每月的天数和闰年的天数可自动调整时钟。
本次课程设计的是使用专门的时钟芯片DS1302在数码管上显示的数字电子钟,并能通过按键对其进行调时和校准以及实现年月日。
DS1302是一种高性能、低功耗、带RAM的实时时钟芯片,它能够对时,分,秒进行精确计时,它与单片机的接口使用同步串行通信,仅用3条线与之相连接,就可以实现STC-51单片机对其进行读写操作,把读出的时间数据送到数码管上显示。
程序运行时,数码管将从当前时间开始显示,通过调节K2键和K3键可以分别对小时和分钟进行调整,调整后,时钟以新的时间为起点继续刷新显示,通过调节K1键可以切换年月日和时钟显示。
关键字:STC-51单片机,DS1302,数码管,动态扫描,调时,切换,秒闪;目录一、设计任务与要求 (4)1.1设计任务 (4)1.2设计要求 (4)1.3发挥部分 (4)1.4创新部分 (4)二、方案总体设计 (5)2.1设计目的 (5)2.2硬件功能描述 (5)2.3设计方案选择 (5)2.4总体设计 (6)2.5总体方案及基本工作原理 (6)三、硬件设计 (7)3.1 STC89C51芯片 (7)3.2电源模块及晶振模块 (7)3.3 DS1302 (8)3.4数码管显示模块 (9)3.5蜂鸣器部分 (10)3.6按键部分 (11)四、软件设计 (13)4.1软件流程图 (13)4.2 软件设计 (13)主函数部分: (13)五、系统仿真和调试 (15)5.1 仿真软件简介 (15)5.2硬件调试 (15)5.3软件调试 (15)5.4使用说明 (16)六、设计总结与体会 (18)6.1学习方面 (18)6.2工作方面 (18)七、参考文献 (19)一、设计任务与要求1.1设计任务DS1302万年历;1.2设计要求利用DS1302生成万年历,时钟可调,通过四位数码管显示,并可实现秒闪功能,同时蜂鸣器闹铃;1.3发挥部分设置按键K3用来切换显示时钟和年月日;1.4创新部分只设置了两个按键K1和K2来调节时分,时钟到24归零,分钟到60归零,分钟有长按迅速调节功能。
单片机课设 电子万年历
《单片机原理及应用》课程设计题目:万年历设计姓名:学号:系别:专业:年级:2008起讫日期:2010.11.22 ~2010.12.3指导教师:职称:目录1.设计概述 (1)2.硬件电路图 (3)3.软件设计 (5)3.1流程图 (5)3.2程序 (7)4. 结论4.1测试结果 (12)4.2遇到问题 (12)5.3如何解决 (12)5.参考文献 (13)附录:电路图 (15)组员分工 (14)1、设计概述单片机就是微控制器,是面向应用对象设计、突出控制功能的芯片。
单片机接上晶振、复位电路和相应的接口电路,装载软件后就可以构成单片机应用系统。
将它嵌入到形形色色的应用系统中,就构成了众多产品、设备的智能化核心。
本设计就是应用单片机强大的控制功能制作而成的电子万年历,该电子万年历包括三大功能:实时显示年、月、日、时、分、秒、周期。
本设计采用的是AT89S52单片机,该单片机采用的MCU51内核,因此具有很好的兼容性,内部带有8KB的ROM,能够存储大量的程序。
计时芯片采用DALLAS公司的涓细充电时钟芯片DS1302,该芯片通过简单的串行通信与单片机进行通信,时钟/日历电路能够实时提供年、月、日、时分、秒信息。
显示器件采用通用型1602液晶,可显示32个字符,如果使用数码管来做显示器件需消耗大量的系统资源,因此采用低功耗的1602液晶,该液晶显示方便,功能强大,完全能满足数字万年历的显示要求。
综上各方案所述,对此次作品的方案选定: 采用AT89S52作为主控制系统; DS1302提供时钟;LCD液晶显示屏作为显示。
通过此次设计能够更加牢固的掌握单片机的应用技术,增强动手能力、硬件设计能力以及软件设计能力。
2、硬件电路图1.时钟芯片2.LCD1602液晶显示屏3.单片机芯片C523、软件设计3.1流程图主程序流程图3.2程序#include <REG51.H>#include <intrins.h>//#include "LCD1602.h"//#include "DS1302.h"#define uint unsigned int#define uchar unsigned charsbit DS1302_CLK = P1^7; //实时时钟时钟线引脚sbit DS1302_IO = P1^6; //实时时钟数据线引脚sbit DS1302_RST = P1^5; //实时时钟复位线引脚sbit ACC0 = ACC^0;sbit ACC7 = ACC^7;charhide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数sbit Set = P2^0; //模式切换键sbit Up = P2^1; //加法按钮sbit Down = P2^2; //减法按钮sbit out = P2^3; //立刻跳出调整模式按钮char done,count,temp,flag,up_flag,down_flag;uchar TempBuffer[5],week_value[2];void show_time(); //液晶显示程序/***********1602液晶显示部分子程序****************///PortDefinitions********************************************************** sbit LcdRs = P2^5;sbit LcdRw = P2^6;sbit LcdEn = P2^7;sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口//内部等待函数//******************************************************************* *******unsigned char LCD_Wait(void){LcdRs=0;LcdRw=1; _nop_();LcdEn=1; _nop_(); LcdEn=0;return DBPort;}//向LCD写入命令或数据//************************************************************#define LCD_COMMAND 0 // Command#define LCD_DATA 1 // Data#define LCD_CLEAR_SCREEN 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回原点void LCD_Write(bit style, unsigned char input){LcdEn=0;LcdRs=style;LcdRw=0; _nop_();DBPort=input;_nop_();//注意顺序LcdEn=1; _nop_();//注意顺序LcdEn=0; _nop_();LCD_Wait();}//设置显示模式************************************************************#define LCD_SHOW 0x04 //显示开#define LCD_HIDE 0x00 //显示关#define LCD_CURSOR 0x02 //显示光标#define LCD_NO_CURSOR 0x00 //无光标#define LCD_FLASH 0x01 //光标闪动#define LCD_NO_FLASH 0x00 //光标不闪动void LCD_SetDisplay(unsigned char DisplayMode){LCD_Write(LCD_COMMAND, 0x08|DisplayMode); }//设置输入模式************************************************************#define LCD_AC_UP 0x02#define LCD_AC_DOWN 0x00 // default#define LCD_MOVE 0x01 // 画面可平移#define LCD_NO_MOVE 0x00 //defaultvoid LCD_SetInput(unsigned char InputMode){LCD_Write(LCD_COMMAND, 0x04|InputMode);}//初始化LCD************************************************************void LCD_Initial(){LcdEn=0;LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵LCD_Write(LCD_COMMAND,0x38);LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动}//液晶字符输入的位置************************void GotoXY(unsigned char x, unsigned char y){if(y==0)LCD_Write(LCD_COMMAND,0x80|x);if(y==1)LCD_Write(LCD_COMMAND,0x80|(x-0x40));}//将字符输出到液晶显示void Print(unsigned char *str){while(*str!='\0'){LCD_Write(LCD_DATA,*str);str++;}}/***********DS1302时钟部分子程序******************/typedef struct __SYSTEMTIME__{unsigned char Second;unsigned char Minute;unsigned char Hour;unsigned char Week;unsigned char Day;unsigned char Month;unsigned char Year;unsigned char DateString[11];unsigned char TimeString[9];}SYSTEMTIME; //定义的时间类型SYSTEMTIME CurrentTime;#define AM(X) X#define PM(X) (X+12) // 转成24小时制#define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间#define DS1302_MINUTE 0x82#define DS1302_HOUR 0x84#define DS1302_WEEK 0x8A#define DS1302_DAY 0x86#define DS1302_MONTH 0x88#define DS1302_YEAR 0x8Cvoid DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数) { unsigned char i;ACC = d; for(i=8; i>0; i--){DS1302_IO = ACC0; //相当于汇编中的 RRCDS1302_CLK = 1; DS1302_CLK = 0; ACC = ACC >> 1; } }unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数) { unsigned char i; for(i=8; i>0; i--){ ACC = ACC >>1; //相当于汇编中的 RRCACC7 = DS1302_IO; DS1302_CLK = 1;DS1302_CLK = 0; }return(ACC); }void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据{ DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr); // 地址,命令DS1302InputByte(ucDa); // 写1Byte数据DS1302_CLK = 1;DS1302_RST = 0;} unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据{ unsigned char ucData;DS1302_RST = 0;DS1302_CLK = 0;DS1302_RST = 1;DS1302InputByte(ucAddr|0x01); // 地址,命令ucData = DS1302OutputByte(); // 读1Byte数据DS1302_CLK = 1;DS1302_RST = 0;return(ucData);}void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组{unsigned char ReadValue;ReadValue = Read1302(DS1302_SECOND);Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MINUTE);Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_HOUR);Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_DAY);Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_WEEK);Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_MONTH);Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);ReadValue = Read1302(DS1302_YEAR);Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F); } void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]{ if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示,输出字符串为 2007/07/22{ Time->DateString[0] = '2';Time->DateString[1] = '0';Time->DateString[2] = Time->Year/10 + '0';Time->DateString[3] = Time->Year%10 + '0';}else{ Time->DateString[0] = ' '; Time->DateString[1] = ' ';Time->DateString[2] = ' '; Time->DateString[3] = ' ';}Time->DateString[4] = '/';if(hide_month<2){Time->DateString[5] = Time->Month/10 + '0';Time->DateString[6] = Time->Month%10 + '0';}else{ Time->DateString[5] = ' '; Time->DateString[6] = ' ';}Time->DateString[7] = '/';if(hide_day<2){Time->DateString[8] = Time->Day/10 + '0';Time->DateString[9] = Time->Day%10 + '0';}else{Time->DateString[8] = ' ';Time->DateString[9] = ' '; } if(hide_week<2){week_value[0] = Time->Week%10 + '0'; } //星期的数据另外放到week_value[]数组里,跟年,月,日的分开存放,因为等一下要在最后显示} else { week_value[0] = ' ';}week_value[1] = '\0';Time->DateString[10] = '\0'; //字符串末尾加 '\0' ,判断结束字符}void TimeToStr(SYSTEMTIME *Time) //将时,分,秒数据转换成液晶显示字符放到数组 TimeString[];{ if(hide_hour<2){ Time->TimeString[0] = Time->Hour/10 + '0';Time->TimeString[1] = Time->Hour%10 + '0';}else{ Time->TimeString[0] = ' ';Time->TimeString[1] = ' ';}Time->TimeString[2] = ':';if(hide_min<2){ Time->TimeString[3] = Time->Minute/10 + '0';Time->TimeString[4] = Time->Minute%10 + '0';}else {Time->TimeString[3] = ' ';Time->TimeString[4] = ' '; }Time->TimeString[5] = ':';if(hide_sec<2){Time->TimeString[6] = Time->Second/10 + '0';Time->TimeString[7] = Time->Second%10 + '0';}else{Time->TimeString[6] = ' ';Time->TimeString[7] = ' '; } Time->DateString[8] = '\0';}void Initial_DS1302(void) //时钟芯片初始化{ unsigned char Second=Read1302(DS1302_SECOND);if(Second&0x80) //判断时钟芯片是否关闭{Write1302(0x8e,0x00); //写入允许Write1302(0x8c,0x07); //以下写入初始化时间日期:07/07/25.星期: 3.时间: 23:59:55Write1302(0x88,0x07);Write1302(0x86,0x25);Write1302(0x8a,0x07);Write1302(0x84,0x23);Write1302(0x82,0x59);Write1302(0x80,0x55);Write1302(0x8e,0x80); //禁止写入}}void Delay1ms(unsigned int count){unsigned int i,j;for(i=0;i<count;i++)for(j=0;j<120;j++);}/*延时子程序*/void mdelay(uint delay){ uint i;for(;delay>0;delay--){for(i=0;i<62;i++) //1ms延时. {;}}}void outkey() //跳出调整模式,返回默认显示{ uchar Second;if(out==0) { mdelay(8); count=0;hide_sec=0,hide_min=0,hide_hour=0,hide_day=0,hide_week=0,hide_mon th=0,hide_year=0;Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0; while(out==0); }}///////////////////////////////////////////////////////////////////// //////////void Upkey()//升序按键{ Up=1;if(Up==0){mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp+1; //秒数加1up_flag=1; //数据调整后更新标志if((temp&0x7f)>0x59) //超过59秒,清零temp=0; break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp+1; //分数加1up_flag=1;if(temp>0x59) //超过59分,清零temp=0;break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp+1; //小时数加1up_flag=1;if(temp>0x23) //超过23小时,清零temp=0; break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp+1; //星期数加1up_flag=1;if(temp>0x7)temp=1;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp+1; //日数加1up_flag=1;if(temp>0x31)temp=1;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp+1; //月数加1up_flag=1;if(temp>0x12)temp=1;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp+1; //年数加1up_flag=1;if(temp>0x85)temp=0;break;default:break;}while(Up==0); }}///////////////////////////////////////////////////////////////////// //////////void Downkey()//降序按键{ Down=1;if(Down==0){ mdelay(8);switch(count){case 1:temp=Read1302(DS1302_SECOND); //读取秒数temp=temp-1; //秒数减1down_flag=1; //数据调整后更新标志if(temp==0x7f) //小于0秒,返回59秒temp=0x59;break;case 2:temp=Read1302(DS1302_MINUTE); //读取分数temp=temp-1; //分数减1down_flag=1;if(temp==-1)temp=0x59; //小于0秒,返回59秒break;case 3:temp=Read1302(DS1302_HOUR); //读取小时数temp=temp-1; //小时数减1down_flag=1;if(temp==-1)temp=0x23;break;case 4:temp=Read1302(DS1302_WEEK); //读取星期数temp=temp-1; //星期数减1down_flag=1;if(temp==0)temp=0x7;;break;case 5:temp=Read1302(DS1302_DAY); //读取日数temp=temp-1; //日数减1down_flag=1;if(temp==0)temp=31;break;case 6:temp=Read1302(DS1302_MONTH); //读取月数temp=temp-1; //月数减1down_flag=1;if(temp==0)temp=12;break;case 7:temp=Read1302(DS1302_YEAR); //读取年数temp=temp-1; //年数减1down_flag=1;if(temp==-1)temp=0x85;break;default:break;}while(Down==0); }}void Setkey()//模式选择按键{Set=1;if(Set==0){ mdelay(8); count=count+1; //Setkey按一次,count就加1 done=1; //进入调整模式while(Set==0); }}void keydone()//按键功能执行{ uchar Second;if(flag==0) //关闭时钟,停止计时{ Write1302(0x8e,0x00); //写入允许temp=Read1302(0x80);Write1302(0x80,temp|0x80);Write1302(0x8e,0x80); //禁止写入flag=1; }Setkey(); //扫描模式切换按键 switch(count){case 1:do //count=1,调整秒{ outkey(); //扫描跳出按钮Upkey(); //扫描加按钮Downkey(); //扫描减按钮if(up_flag==1||down_flag==1) //数据更新,重新写入新的数据{Write1302(0x8e,0x00); //写入允许Write1302(0x80,temp|0x80); //写入新的秒数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_sec++; //位闪计数if(hide_sec>3)hide_sec=0;show_time(); //液晶显示数据}while(count==2);break;case 2:do //count=2,调整分{ hide_sec=0;outkey();Upkey();Downkey();if(temp>0x60)temp=0;if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x82,temp); //写入新的分数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_min++;if(hide_min>3)hide_min=0;show_time();}while(count==3);break;case 3:do //count=3,调整小时{ hide_min=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x84,temp); //写入新的小时数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_hour++;if(hide_hour>3)hide_hour=0;show_time();}while(count==4);break;case 4:do //count=4,调整星期{ hide_hour=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x8a,temp); //写入新的星期数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0;}hide_week++;if(hide_week>3)hide_week=0;show_time();}while(count==5);break;case 5:do //count=5,调整日{hide_week=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){Write1302(0x8e,0x00); //写入允许Write1302(0x86,temp); //写入新的日数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_day++;if(hide_day>3)hide_day=0;show_time();}while(count==6);break;case 6:do //count=6,调整月{ hide_day=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x88,temp); //写入新的月数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_month++;if(hide_month>3)hide_month=0;show_time();}while(count==7);break;case 7:do //count=7,调整年{ hide_month=0;outkey();Upkey();Downkey();if(up_flag==1||down_flag==1){ Write1302(0x8e,0x00); //写入允许Write1302(0x8c,temp); //写入新的年数Write1302(0x8e,0x80); //禁止写入up_flag=0;down_flag=0; }hide_year++;if(hide_year>3)hide_year=0;show_time();}while(count==8);break;case 8: count=0;hide_year=0; //count8, 跳出调整模式,返回默认显示状态Second=Read1302(DS1302_SECOND);Write1302(0x8e,0x00); //写入允许Write1302(0x80,Second&0x7f);Write1302(0x8E,0x80); //禁止写入done=0;break; //count=7,开启中断,标志位置0并退出default:break; }}void show_time() //液晶显示程序{ DS1302_GetTime(&CurrentTime); //获取时钟芯片的时间数据TimeToStr(&CurrentTime); //时间数据转换液晶字符DateToStr(&CurrentTime); //日期数据转换液晶字符GotoXY(0,1);Print(CurrentTime.TimeString); //显示时间GotoXY(0,0);Print(CurrentTime.DateString); //显示日期GotoXY(15,0);Print(week_value); //显示星期GotoXY(11,0);Print("Week"); //在液晶上显示字母 weekDelay1ms(400); //扫描延时}void main(){ flag=1; //时钟停止标志LCD_Initial(); //液晶初始化Initial_DS1302(); //时钟芯片初始化up_flag=0;down_flag=0;done=0; //进入默认液晶显示while(1){ while(done==1) keydone(); //进入调整模式while(done==0){ show_time(); //液晶显示数据flag=0; Setkey(); //扫描各功能键}}}4、结论4.1测试结果经过多次的反复测试与分析,可以对电路的原理及功能更加熟悉,同时提高了设计能力与及对电路的分析能力。
微机原理课程设计万年历
微机原理课程设计万年历的制作目录实验目的 (3)实验内容 (3)实验流程图 (3)实验程序 (5)调试结果 (11)心得体会 (14)实验目的:结合微型计算机原理课程的学习,进一步巩固已学习的知识,同时针对微型计算机原理知识的具体应用,学会对系统中的DOS和BIOS的使用。
学会使用编写软件EDIT,弄懂汇编程序的上机过程以与如何运用DEBUG软件进行汇编程序的调试。
通过单步调试,加深对汇编语言的内容了解。
实验内容:接受年月日信息并显示,编写程序,先显示“What is the data?”,并响铃一次,然后再显示year,接收键盘输入的年,输入正确后,显示month,从键盘输入月,输入正确后,再显示day,从键盘输入日期的信息,并显示。
对于时间的算法,闰年时,二月有29天,而平年,二月有28天,其它月份有30天或是31天。
若输入年月日时产生错误,警告并重新输入。
实验流程图:子程序getnum流程图:实验程序:assume cs:code,ds:datadata segmentcr equ 0dhlf equ 0ahstring1 db 'What is the data?','$'string2 db cr,lf,'Year :','$'string3 db cr,lf,'Month :','$'string4 db cr,lf,'Day :','$'string5 db cr,lf,'ERROR! Input again:','$' buff1 db 5db ?db 5 dup(?)buff2 db 3db ?db 3 dup(?)buff3 db 3db ?db 3 dup(?)data endscode segmentstart:mov ax,datamov dx,offset string1 mov ah,9int 21hcall delaycall warningcall delaycall getnummov dl,0dhmov ah,02hint 21hmov dl,0ahmov ah,02hint 21hcall dispyearmov dl,'-'mov ah,02hint 21hcall dispmonthmov dl,'-'mov ah,02hint 21hmov ax,4c00hint 21hgetnum proc nearrepea0:mov dx,offset string2mov ah,9int 21hmov dx,offset buff1mov ah,0ahint 21hmov cx,4mov si,offset buff1inc sicheck:inc simov al,[si]sub al,30hmov ah,0hcmp ax,9hja repeacmp ax,0hjb repealoop checkmov si,offset buff1mov ah,'$'mov [si+6],ahjmp repeat0repea:call errorcall warningjmp repea0repeat0:mov dx,offset string3mov ah,9int 21hmov dx,offset buff2mov ah,0ahint 21hmov si,offset buff2call addresscmp al,0dhjz repeat01cmp ax,12hja repeat01cmp ax,0jbe repeat01mov si,offset buff2mov [si+4],ahjmp repeat1repeat01:call errorcall warningjmp repeat0repeat1:mov dx,offset string4mov ah,9int 21hmov dx,offset buff3mov ah,0ahint 21hmov si,offset buff3call addresscmp ax,31hja repeat11cmp ax,0jbe repeat11mov si,offset buff2call addresscmp ax,2hjz febdiv dlcmp ah,0hjz doumonthmov si,offset buff2call addresscmp ax,8hja downmonth1jmp over doumonth:mov si,offset buff2call addresscmp ax,7hja downmonth2mov si,offset buff3call addresscmp ax,31hjz repeat11jmp over downmonth2:jmp over repeat11:call errorcall warningjmp repeat1downmonth1:mov si,offset buff3call addresscmp ax,31hjz repeat11jmp overfeb:mov si,offset buff1inc siinc simov dx,[si]sub dh,30hsub dl,30hmov cl,4rol dl,cladd dl,dhmov dh,0mov cl,8rol dx,clcall addresscmp ax,0jz hundardadd ax,dxmov bl,alnextdiv:mov al,ahmov ah,0mov cl,4div cladd ah,2cmp ah,3ja nextdivmov al,bladd al,2div clcmp ah,0hjz leapyear commonyear:mov si,offset buff3call addresscmp ax,28hja repeat11cmp ax,0jbe repeat11jmp overleapyear:mov si,offset buff3call addresscmp ax,29hja repeat11cmp ax,0jbe repeat11jmp over hundard:mov al,dhmov ah,0add ax,2mov dl,4div dlcmp ah,0hjz leapyearjmp commonyear over:mov si,offset buff3mov ah,'$'mov [si+4],ahretgetnum endpdispyear proc nearmov dx,offset buff1inc dxinc dxmov ah,9int 21hretdispyear endpdispmonth proc nearmov dx,offset buff2inc dxinc dxmov ah,9int 21hretdispmonth endpdispday proc nearmov dx,offset buff3inc dxinc dxmov ah,9int 21hretdispday endpaddress proc nearinc siinc simov ax,[si]sub ah,30hsub al,30hmov cl,4rol al,cladd al,ahmov ah,0retaddress endpdelay proc nearpush axpush dxmov dx,5020h ;近1秒mov ax,0s1:sub ax,1sbb dx,0cmp ax,0jne s1cmp dx,0jne s1pop dxpop axretdelay endperror proc nearpush dxpush axmov dx,offset string5mov ah,9int 21hpop axpop dxreterror endpwarning proc nearpush dxpush axmov dl,07hmov ah,2int 21hpop axpop dxretwarning endpcode ends end start调试结果:响铃前:响铃后:输入实例:输入错误信息:心得体会:通过短短几天的课程设计,让我重新拿起已经学习的微机原理理论知识。
(完整版)基于51单片机的万年历的设计
单片机课程实训SCM PRACTICAL TRAINING目录第一部分课程设计任务书 (1)一、课程设计题目 (1)二、课程设计时间 (1)三、实训提交方式 (1)四、设计要求 (1)第二部分课程设计报告 (2)一、单片机发展概况 (2)二、MCS-51单片机系统简介 (2)三、设计思想 (3)四、硬件电路设计 (3)1. 总体设计 (3)2. 晶振电路 (4)3. 复位电路 (4)4. DS1302时钟电路 (5)5. 温度采集系统电路 (5)6. 按键调整电路 (6)7. 闹钟提示电路 (6)五、软件设计框图 (7)六、程序源代码 (8)1. 主程序 (8)2. 温度控制程序 (11)3. 日历设置程序 (13)4. 时钟控制程序 (18)5. 显示设置程序 (20)七、结束语 (23)八、课程设计小组分工 (23)九、参考文献 (23)第一部分课程设计任务书一、课程设计题目用中小规模集成芯片设计制作万年历。
二、课程设计时间五天三、实训提交方式提交实训设计报告电子版与纸质版四、设计要求(1)显示年、月、日、时、分、秒和星期,并有相应的农历显示。
(2)可通过键盘自动调整时间。
(3)具有闹钟功能。
(4)能够显示环境温度,误差小于±1℃(5)计时精度:月误差小于20秒。
第二部分课程设计报告一、单片机发展概况单片机诞生于20世纪70年代末,它的发展史大致可分为三个阶段:第一阶段(1976-1978):初级单片机微处理阶段。
该时期的单片机具有 8 位CPU,并行 I/O 端口、8 位时序同步计数器,寻址范围 4KB,但是没有串行口。
第二阶段(1978-1982):高性能单片机微机处理阶段,该时期的单片机具有I/O 串行端口,有多级中断处理系统,15 位时序同步技术器,RAM、ROM 容量加大,寻址范围可达 64KB。
第三阶段(1982-至今)位单片机微处理改良型及 16 位单片机微处理阶段民用电子产品、计算机系统中的部件控制器、智能仪器仪表、工业测控、网络与通信的职能接口、军工领域、办公自动化、集散控制系统、并行多机处理系统和局域网络系统。
微机原理课程设计---万年历设计
微机原理课程设计---万年历设计目录目录.....................................................1、课程设计内容 (1)1.1任务要求 (1)1. 2方案选择 (1)1. 3项目进度计划 (2)2、硬件选型及电路设计 (3)2. 1硬件的选型 (3)2.2电路的设计 (4)3.系统软件设计 (10)3.1 DS1302读写程序设计 (10)3.2 PCB板设计源文件及原理图展示 (12)4.课程设计总结 (13)4. 1 本人在项目实现中的分工 (13)4.2 个人遇到的困难与获得的主要成果 (14)4.3 课程设计完成结果分析与个人小结 (14)参考文献 (15)1 课程设计内容1.1任务要求目的系统以AT89S52单片机为控制器,以串行时钟日历芯片DS1302记录日历和时间,它可以对年、月、日、时、分、秒进行计时,从而以达到对时间计时,完成万年历的基本功能。
背景二十一世纪是数字化技术高速发展的时代,而单片机在数字化高速发展的时代扮演着极为重要的角色。
电子万年历的开发与研究在信息化时代的今天亦是当务之急,因为它应用在学校、机关、企业、部队等单位礼堂、训练场地、教学室、公共场地等场合,可以说遍及人们生活的每一个角落。
所以说电子万年历的开发是国家之所需,社会之所需,人民之所需。
由于社会对信息交换不断提高的要求及高新技术的逐步发展,促使电子万年历发展并且投入市场得到广泛应用。
随着科技的快速发展,时间的流逝,从观太阳、摆钟到现在电子钟,人类不断研究,不断创新纪录。
它可以对年、月、日、时、分、秒进行计时,还具有闰年补偿等多种功能,而且DS1302的使用寿命长,误差小。
对于数字电子万年历采用直观的数字显示,可以同时显示年、月、日、周日、时、分、秒和温度等信息,还具有时间校准等功能。
该电路采用STC89C52单片机作为核心,功耗小,能在5V的低压工作,电压可选用4.5~5.5V电压供电。
单片机万年历课程设计
单片机万年历课程设计一、课程目标知识目标:1. 让学生理解单片机的基本原理和万年历的功能需求。
2. 使学生掌握单片机编程的基本语法和逻辑结构。
3. 帮助学生掌握如何在单片机上实现日期、时间的计算与显示。
技能目标:1. 培养学生运用单片机进行项目设计的能力,特别是万年历的实际应用。
2. 培养学生独立编程和调试程序的能力,解决实际项目中遇到的问题。
3. 提高学生团队协作能力和项目管理的意识。
情感态度价值观目标:1. 培养学生对单片机及电子制作的兴趣,激发学生的创新意识和探索精神。
2. 增强学生面对困难的勇气和毅力,培养他们积极解决问题的态度。
3. 通过团队合作,培养学生的集体荣誉感和责任感。
课程性质:本课程为实践性强的设计与制作课程,以单片机技术为核心,结合编程和电子技术,实现万年历的制作。
学生特点:学生为高年级学生,已具备一定的单片机基础知识,有编程基础,具备独立思考和解决问题的能力。
教学要求:注重理论与实践相结合,强调动手操作和实际应用。
教学过程中要关注学生的个体差异,提供适当的指导与帮助,确保每个学生都能在原有基础上得到提升。
通过课程学习,使学生能够将所学知识应用于实际项目中,达到学以致用的目的。
二、教学内容1. 单片机基础回顾:复习单片机的硬件结构、工作原理及I/O口编程。
- 教材章节:第三章单片机硬件结构与工作原理;第四章I/O口编程。
2. 定时器与中断:学习单片机定时器的工作原理,掌握中断编程方法。
- 教材章节:第五章定时器与中断;第六章中断编程。
3. 日期时间计算:讲解日期时间的计算方法,如何在单片机中进行实现。
- 教材章节:第七章日期时间计算;第八章单片机实现日期时间计算。
4. 显示技术:学习LED显示技术,掌握动态扫描显示方法。
- 教材章节:第九章LED显示技术;第十章动态扫描显示。
5. 万年历设计与实现:结合所学知识,设计并实现单片机万年历。
- 教材章节:第十一章项目设计与实现;第十二章万年历设计与制作。
微机与接口技术课程设计--万年历
信息科学与技术学院《微机原理与接口技术》课程设计题目名称:电子万年历学生姓名:湛开洪学号:2009082191专业:计算机科学与技术班级:09级(1)班指导教师:裘祖旗完成日期:2012年 1 月 11日目录目录一、课程设计要求 -------------------------------------------------------------- 3二、程序流程图 ----------------------------------------------------------------- 4三、程序主要功能模块 -------------------------------------------------------- 41.画出该程序的界面 (5)2.写出所有非汉字字符 (5)3.写出汉字字符 (6)4.填充公历及农历的信息 (6)5.用户输入一个需要显示的新日期 (7)四、主要技术路线 -------------------------------------------------------------- 81.开发工具 (8)2.主要算法 (8)3.重要指令 (10)五、系统的难点及解决方案 ------------------------------------------------- 111.算法 (11)2.由思想到程序的转换 (11)六、总结与体会 --------------------------------------------------------------- 13七、参考文献 ------------------------------------------------------------------ 14附录(源程序) --------------------------------------------------------------- 15万年历一、课程设计要求DOS 下万年历(8086 汇编)DOS 运行的日历,支持农历:1. a. 能实现计时功能2.显示年、月、日、进、分、秒、星期扩展功能:实现公历与阴历转换二、程序流程图三、程序主要功能模块本万年历程序正确实现从1901年1月1日至2050年12月31日的公历与农历查询,包括公历年,月,日,星期,农历干支年,月,日。
单片机万年历课程设计说明书
单片机万年历课程设计说明书第一章设计原理功能:电子时钟能够显示时、分、秒显示时间的功能,还可以进行时和分的校对,而且其片选的灵活性强。
并且是以单片机为核心来设计的。
28BYJ48步进电机主要技术参数如表1-1所示。
表1-1 28BYJ48步进电机主要技术参数第二章硬件电路设计总体硬件原理图如图2-1所示。
AT89C51因为其含一个可擦除的ROM,以及其存储数据的时间长度可达10年之久所以选其作为该设计的核心控制部件。
图2-1 系统电路原理图2.1键盘电路设计该设计只用了一个键盘,但实现的功能却是比较完善,减少了硬件资源的损耗,该键盘可以实现小时和分钟的调节以及控制是否进入省电模式。
当按键按下又松开,可以实现屏蔽数码管显示的功能,达到省电的目的;直接按下不松开,则可以通过按键实现分钟的累加,每按一次分钟加一;而连续两次按下按键不放松,则可实现小时的调节,同样每按一次小时加一。
达到时间调节的目的。
选择的多功能按键如图2-2所示。
图2-2 多功能控制键2.2主控模块89C5189C51是一个8位单片机,片ROM全部采用FLASH ROM技术,晶振时钟为12MHz。
89C51是标准的40引脚双列直插式集成电路芯片,有4个八位的并行双向I/O端口,分别记作P0、P1、P2、P3。
第31引脚需要接高电位使单片机选用部程序存储器;第40脚为电源端VCC,接+5V电源,第20引脚为接地端VSS,通常在VCC和VSS引脚之间接0.1μF高频滤波电容。
第三章软件设计在主程序的开始定义了一组固定单元用来存储计数的分、秒、时的存储单元。
在主程序中,对不同的按键进行扫描,实现秒表,时间调整。
系统总体流程图如图4-1所示。
图3-1 总体流程图第四章系统测试本系统的软件系统主要可分为主程序、定时计数中断程序、时间调整程序、延时程序四大模块。
在程序设计过程中,加强了部分软件抗干扰措施,下面对部分模块作介绍。
系统开始仿真的仿真图如图4-1系统仿真图所示。
单片机课程设计-万年历
单片机课程设计题目名称:姓名:学号:系别:班级:指导老师:完成时间:华南理工大学广州学院课程设计任务书一、实现功能利用51单片机芯片和DS1302芯片设计电子万年历功能图如下通过四个按键输入调整,在LCD液晶模块上能显示阳历年、月、日、星期、时、分、秒和阴历月、日,在显示农历时间时,能标明是否为闰年。
当切断主5V电源时,由3.3V 备用电池供电,1302内时钟仍然工作。
当重新接上5V电源后,则可以实时显示当前时间。
二、开发环境操作系统:windows XP开发芯片:89C52RC+编译器:keil51三、硬件实现1、整体仿真图如下2、12864LCD12864采用8位并行数据传送方式,占用单片机的P0口。
由于P0口用作普通I/O口时为开漏输出,所以为了输出高电平,增大负载能力,需在每个P0位接一个上拉电阻,本设计中采用10K的排阻接线。
图中的RV1为LCD背光调节电位器,可调节屏幕的亮度。
3、DS13021脚接+5V电源;8脚接3.3V备份电源;2、3脚接晶振;4脚接地;5脚接P2.6;6脚接P2.4;7脚接P2.5;+5V工作时,DS1302的7脚时钟信号由单片机的P2.5口提供,当以3.3V工作时时钟由其2、3脚外接的晶振提供时钟,晶振的震荡频率为32.768KHz。
4、按键选择按键一端接P2.0,另一端接地;加按键一端接P2.1,另一端接地;减按键一端接P3.1,另一端接地;确定按键一端接P3.2,另一端接地;四、软件实现程序流程图如下1、农历为复杂的历法,因此适宜采用查表法进行编程;2、编程中接按键的四个管脚皆为查询方式,单片机上电默认为高电平,当按键按下去的时候变为低电平,输入有效,并执行相应的事件处理程序;3、12864采用8位并行数据传送方式,占用单片机的P0口;4、DS1302位一线串行方式,所以在编程中对时序的要求非常严格,应认真注意时序的先后;主要程序源代码uchar Read1302(uchar ADDRorCOMM){uchar dat;DS1302_RST=0; //禁止数据传输DS1302_SCLK=0; //确保写写之前SCLK被拉低DS1302_RST=1; //启动数据传输DS1302InputByte(ADDRorCOMM); //写入命令或地址dat=DS1302OutputByte(); // 读出数据DS1302_SCLK=1; //将时钟电平置于高电平状态置高是为了让下次写的时候能准确的被拉低保证电平状态的正确性//DS1302_RST=0; //禁止数据传输return(dat);}void Init_1302(void) //(2008年7月12日12时00分00秒星期六){uchar flag;flag=Read1302(0x81); //读秒寄存器if(flag&0x80) //CH为0(flag最高位是0),时钟走动,不用初始化。
SOPC课程设计实验报告万年历的设计
目录摘要 (2)Abstract (2)一、设计要求 (3)1、构建的模型 (3)2、设计的主要内容 (3)三、设计步骤 (4)第一步:硬件部分设计 (4)第二步:软件部分设计 (15)四、运行情况 (19)五、问题分析与解决的方法 (19)六、心得体会 (19)摘要本次设计从系统硬件出发(CPU,系统总线,RAM,外接设备等)以此来构成SOPC Builder 的硬件系统,再通过Nios II IDE开发的嵌入式软件,编写且嵌入SOPC Builder的硬件中,实现万年历的整体开发。
通过应用SOPC Builder开发工具,设计者可以摆脱传统的、易于出错的软硬件设计细节,从而达到加快项目开发、缩短开发周期、节约开发成本的目的。
AbstractThe design of the system hardware from starting (CPU, RAM, bus, external equipment) constitute the SOPC Builder hardware system,and then, through ,the Nios II IDE development of embedded software, and hardware of the embedded SOPC Builder realize the integral development of the calendar. Through the application SOPC Builder development tools, designers can get rid of details of traditional and easy to go wrong the design of the software and hardware, so as to speed up the project development, to shorten the development cycle, save the purpose of development pays.关键词:SOPC Builder 嵌入式硬件开发一、设计要求用Nios II DE2开发板的LCD 显示电子钟的日期和时间。
万年历单片机课程设计-精品
课程设计任务书题目:万年历显示模块设计初始条件:具备电子电路的设计知识和能力;具备单片机系统的设计方法;具备单片机软件编程技术;熟悉单片机常用软件的使用;要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)1、了解并参与万年历电路的设计2、对万年历显示部分进行计算机仿真3、设计万年历显示电路4、具备时间、日期及星期的切换显示功能5、完成符合学校要求的设计说明书时间安排:设计时间2周,其中3天原理设计,3天仿真,3天电路调试,1天答辩指导教师签名:年月日系主任(或责任教师)签名:年月日摘要单片计算机即单片微型计算机。
由RAM ,ROM,CPU构成,定时,计数和多种接口于一体的微控制器。
它体积小,成本低,功能强,广泛应用于智能产业和工业自动化上。
而51系列单片机是各单片机中最为典型和最有代表性的一种。
这次课程设计通过对它的学习,应用,从而达到学习、设计、开发软、硬的能力。
本次课程设计包括AT89C51单片机最小系统包括复位和时钟电路及供电系统、LCD液晶显示电路。
利用相关设计软件进行原理图设计即利用Keil软件编程以及Proteus软件仿真来巩固单片机应用、模拟电路、数字电路课程及学会各种工程软件的使用。
关键字:单片机 AT89C51 DS1302目录1设计方案选择 (1)1.1控制部分的方案选择 (1)1.2 显示模块选择方案和论证 (1)1.3时钟芯片的选择方案和论证 (1)2系统的硬件设计与实现 (1)2.1 电路设计框图 (1)2.2 系统硬件概述 (2)2. 3 主要单元电路的器件 (2)2.3.1单片机主控制模块 (2)2.3.2时钟电路模块的设计 (3)2.3.3显示模块的设计 (5)2.3.4 实时时钟电路设计 (5)2.3.5 功能按钮设计 (6)3 整体电路图 (7)参考文献 (7)附件 (10)1设计方案选择1. 1控制部分的方案选择采用51系列的89C51单片机,89C51单片机有丰富的中断源和时基,方便本实验的设计。
万年历课程设计(完整版)
万年历课程设计(完整版)-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN基于51单片机的万年历的设计学生姓名学号所在专业电子信息工程所在班级电子1111小组成员指导教师完成日期基于51单片机的万年历的设计1 需求分析1.1“需“的分析万年历是一个可以显示当前时间、日历、温度信息以及设置闹钟报警的应用系统,其具有以下功能:(1)可以显示当前的时间信息;(2)可以显示当前的温度;(3)可以手动修改时间;(4)可以设置闹钟,并且达到设置的时间点发出音响信号。
1.2 “求“的分析设计万年历,需要考虑以下几方面的内容:(1)如何获取当前的时间信息,这些时间信息包括时、分、秒、年、月、日、和星期;(2)如何获得当前的温度信息,精确到1°C即可;(3)提供必要的用户输入设置通道;(4)提供相应的显示和报警部件;(5)需要写出合适的软件应用代码。
2方案设计与论证2.1时间获取方法的方案设计与论证方案一:使用单片机的内部定时器进行定时,使用软件算法来计算当前的时间信息。
此种方案虽然可以不使用时钟芯片,节约成本,但是时间的精准度一般,软件代码复杂。
方案二:采用外部扩展实时时钟芯片DS12C887的方式来获取相应的时间信息。
DS12C887是一种高性能的芯片,能自动产生年、月、日、时、分、秒等信息,并有闰年修正功能。
采用双电源供电方式,可设置备用电源充电方式,提供了对后备电源进行涓细电流的充电的能力,在能满足精度要求的同时价格也比较便宜,性价比较高。
所以采用方案二。
2.2显示模块的方案设计与论证方案一:采用LED数码管动态扫描。
LED数码管价格适中,但只能显示数字和简单的字符,且其的接口线少。
方案二:采用点阵式数码管显示。
点阵式数码管是由八行八列的发光二极管组成,并不太适合于对数字跟字母进行显示,其主要用于汉字的显示。
方案三:采用LED液晶显示屏。
液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见,虽然价格稍微贵了点,但其接口线多。
KS-002 数字万年历-课程设计报告
课程名称:微机原理课程设计题目:万年历随着电子技术的迅速发展,特别是随大规模集成电路出现,给人类生活带来了根本性的改变。
由其是单片机技术的应用产品已经走进了千家万户。
电子万年历的出现给人们的生活带来的诸多方便。
本文首先描述系统硬件工作原理,并附以系统结构框图加以说明,着重介绍了本系统所应用的各硬件接口技术和各个接口模块的功能及工作过程,其次,详细阐述了程序的各个模块和实现过程。
本设计以数字集成电路技术为基础,单片机技术为核心。
本文编写的主导思想是软硬件相结合,以硬件为基础,来进行各功能模块的编写。
本设计是一种基于STC89C51单片机控制,DS1302报时的数字时钟设计。
它具有多项显示和控制功能。
能用LCD实时显示当前年、月、日、星期、时间;可对时间进行调整;具有调整时间和日期功能。
本设计通过一个基于单片机的能实现万年历功能电子时钟的设计,从而达到学习、了解单片机相关指令在各方面的应用。
系统由主控制器AT89C51、时钟电路DS1302、显示电路、按键电路和复位电路等部分构成,能实现时钟日历显示的功能,能进行时、分、秒的显示。
关键词:STC89C52单片机、LCD液晶显示、DS1302时钟芯片一、设计任务与要求 ........................................................................... - 4 -1.1 设计任务 .................................................................................................... - 4 -1.2 设计要求 .................................................................................................... - 4 -1.3 发挥部分 .................................................................................................... - 4 -二、方案总体设计 ........................................................................................... - 5 -2.1 显示部分 .................................................................................................... - 5 -2.2 时钟信号的选择 ........................................................................................ - 5 -2.3 总体方案 .................................................................................................... - 5 -三、硬件设计 ....................................................................................... - 7 -3.1 单片机最小系统 ........................................................................................ - 7 -3.2 DS1302时钟电路 ..................................................................................... - 10 -3.3 LCD液晶显示模块.................................................................................. - 11 -3.4 按键电路 .................................................................................................. - 12 -3.5 电源指示灯部分 ...................................................................................... - 14 -四、软件设计 ..................................................................................... - 15 -4.1 主程序流程图显示 .................................................................................. - 15 -4.2 时间设定程序流程图 .............................................................................. - 16 -五、系统仿真与调试 ......................................................................... - 17 -5.1 Proteus仿真软件简介 ............................................................................. - 17 -5.2 仿真及实物 .............................................................................................. - 18 -六、设计总结 ..................................................................................... - 20 -七、参考文献 ..................................................................................... - 21 -一、设计任务与要求1.1 设计任务基于52单片机的DS1302万年历;1.2 设计要求基于52单片机,利用DS1302时钟芯片生成万年历,使用液晶显示年月日时分秒,显示值可通过按键修改。
万年历课程设计说明书
机械工程系课程设计说明书课程名称:微机接口技术题目名称:带闹钟功能及测温的时钟控制器设计年级专业及班级:2008级机械设计制造及其自动化 2 班姓名:郑泽龙学号:0808012217指导教师:刘建春评定成绩:教师评语:指导老师签名:2011 年 7 月 1 日多功能数字时钟系统设计目录1..前言: (3)2.整体方案确定: (3)3.硬件系统设计: (4)3.1. 按键扫描模块设计: (5)3.2. LCD显示模块 (6)3.3. 时钟DS1302模块 (7)3.4. 存储器24C02模块 (8)3.5. 蜂鸣器模块 (8)3.6. 测温模块 (9)4.软件系统设计: (9)4.1.按键控制函数key_control(void)流程图: (10)4.2. 按键扫描函数char KeyScan(void)流程图: (10)4.3.闹钟函数ALARM(void) (11)4.4. 24c02数据存数函数头文件声明程序如下: (12)5.试验仿真: (15)5.1硬件调试 (15)5.1.1排除元件失效 (15)5.1.2.排除电源故障 (15)5.1.3.联机仿真调式 (16)5.2软件仿真 (16)5.2.1系统误差分析 (16)6.结论 (16)7.成果展示 (17)8.参考资料 (18)1..前言:带闹钟功能及测温的时钟控制器是一种可实现年、月、日时、分、秒计时,温度扫描,数据存储,按键调节时间及闹钟功能的装置,并通过单片机处理后送给显示芯片(9325tp)显示的装置,与机械式时钟相比具有更高的准确性和直观性,且具有更长的使用寿命。
本系统可以分为六大模块:按键扫描模块、LCD显示模块、时钟DS1302模块、存储器24C02模块、蜂鸣器模块、测温模块。
2.整体方案确定:程序开始时先对系统初始化,初始化屏幕显示并设置好各种中断。
首先从24c02芯片中读取上次关机前闹钟的存储数据,扫描按键程序,如有按键按下则进入时间修改函数并将修改后的时间信息写入DS1302的时间芯片中并送显示,同时向24c02中写入更改后的闹钟数据,若无按键按下则进入更新时间函数,从时钟芯片中读取时间信息并送显示,并判断从时间芯片上读取的小时,分的数据和24c02中存储的数据是否一致,若一致则进入闹铃程序,若不一致则将时钟芯片的信息送显示。
万年历
信息科学与技术学院微机原理与接口技术课程设计报告题目名称:万年历学生姓名:杜文艳学号: 2009082211 专业年级:计科09级指导教师:裘祖旗时间: 2012-01目录1.课程设计题目及要求 (2)1.1课程设计的题目: (2)1.2课程设计的要求 (2)2.功能设计 (2)2.1功能模块. (2)2.2功能图 (2)3.详细设计. (3)3.1设计方法. (3)3.2各功能模块及流程图 (4)4.运行结果 (8)5. 课程设计总结 (10)6参考书目. (10)附录. (11)1、课程设计题目及要求1.1课程设计的题目:万年历1.2课程设计的要求:1.能实现计时功能2.显示年、月、日、进、分、秒、星期扩展功能:实现公历与阴历转换2、功能设计2.1、功能模块:宏定义:置光标位置(setf)————定义光标定位宏清屏(clearscreen)————用于将屏幕清成指定的前景背景色程序:主程序模块main———主要根据判断输入字符调用相应子程序执行显示时间、日期、星期,设置时间,进行阴阳历转换的功能。
初始化窗口模块kaiji———简单初始化界面,并给出操作提示。
gettime子程序————取得时间,并将时间存于数据段的Disptime。
getdata子程序————取得日期星期,并将日期星期信息存于数据Dispdata。
change_gty子程序————将阳历转换成阴历,将阴历信息存于Dispdata_1。
disp子程序————通过数据段的shuzi,将时间显示成数码管的形式。
delay子程序————通过检测61h端口,实现延时一秒。
inc_1s子程序————执行延时程序后,时间增加一秒。
inc_1d子程序————若时间23:59:59增加一秒,则执行加一天的操作。
output子程序————输出指定的字符串。
2.2、功能图:按e 进入3、详细设计:3.1、设计方法:该课程设计通过测试是否有键盘输入及测试输入的字符来执行相应的功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理课程设计万年历的制作目录实验目的 (3)实验内容 (3)实验流程图 (3)实验程序 (5)调试结果 (11)心得体会 (14)实验目的:结合微型计算机原理课程的学习,进一步巩固已学习的知识,同时针对微型计算机原理知识的具体应用,学会对系统中的DOS和BIOS的使用。
学会使用编写软件EDIT,弄懂汇编程序的上机过程以及如何运用DEBUG软件进行汇编程序的调试。
通过单步调试,加深对汇编语言的内容了解。
实验内容:接受年月日信息并显示,编写程序,先显示“What is the data?”,并响铃一次,然后再显示year,接收键盘输入的年,输入正确后,显示month,从键盘输入月,输入正确后,再显示day,从键盘输入日期的信息,并显示。
对于时间的算法,闰年时,二月有29天,而平年,二月有28天,其它月份有30天或是31天。
若输入年月日时产生错误,警告并重新输入。
实验流程图:子程序getnum流程图:实验程序:assume cs:code,ds:datadata segmentcr equ 0dhlf equ 0ahstring1 db 'What is the data?','$'string2 db cr,lf,'Year :','$'string3 db cr,lf,'Month :','$'string4 db cr,lf,'Day :','$'string5 db cr,lf,'ERROR! Input again:','$' buff1 db 5db ?db 5 dup(?)buff2 db 3db ?db 3 dup(?)buff3 db 3db ?db 3 dup(?)data endscode segmentstart:mov ax,datamov dx,offset string1 mov ah,9int 21hcall delaycall warningcall delaycall getnummov dl,0dhmov ah,02hint 21hmov dl,0ahmov ah,02hint 21hcall dispyearmov dl,'-'mov ah,02hint 21hcall dispmonthmov dl,'-'mov ah,02hint 21hmov ax,4c00hint 21hgetnum proc nearrepea0:mov dx,offset string2mov ah,9int 21hmov dx,offset buff1mov ah,0ahint 21hmov cx,4mov si,offset buff1inc sicheck:inc simov al,[si]sub al,30hmov ah,0hcmp ax,9hja repeacmp ax,0hjb repealoop checkmov si,offset buff1mov ah,'$'mov [si+6],ahjmp repeat0repea:call errorcall warningjmp repea0repeat0:mov dx,offset string3mov ah,9int 21hmov dx,offset buff2mov ah,0ahint 21hmov si,offset buff2call addresscmp al,0dhjz repeat01cmp ax,12hja repeat01cmp ax,0jbe repeat01mov si,offset buff2mov [si+4],ahjmp repeat1repeat01:call errorcall warningjmp repeat0repeat1:mov dx,offset string4mov ah,9int 21hmov dx,offset buff3mov ah,0ahint 21hmov si,offset buff3call addresscmp ax,31hja repeat11cmp ax,0jbe repeat11mov si,offset buff2call addresscmp ax,2hjz febdiv dlcmp ah,0hjz doumonthmov si,offset buff2call addresscmp ax,8hja downmonth1jmp over doumonth:mov si,offset buff2call addresscmp ax,7hja downmonth2mov si,offset buff3call addresscmp ax,31hjz repeat11jmp over downmonth2:jmp over repeat11:call errorcall warningjmp repeat1downmonth1:mov si,offset buff3call addresscmp ax,31hjz repeat11jmp overfeb:mov si,offset buff1inc siinc simov dx,[si]sub dh,30hsub dl,30hmov cl,4rol dl,cladd dl,dhmov dh,0mov cl,8rol dx,clcall addresscmp ax,0jz hundardadd ax,dxmov bl,alnextdiv:mov al,ahmov ah,0mov cl,4div cladd ah,2cmp ah,3ja nextdivmov al,bladd al,2div clcmp ah,0hjz leapyear commonyear:mov si,offset buff3call addresscmp ax,28hja repeat11cmp ax,0jbe repeat11jmp overleapyear:mov si,offset buff3call addresscmp ax,29hja repeat11cmp ax,0jbe repeat11jmp over hundard:mov al,dhmov ah,0add ax,2mov dl,4div dlcmp ah,0hjz leapyearjmp commonyear over:mov si,offset buff3mov ah,'$'mov [si+4],ahretgetnum endpdispyear proc nearmov dx,offset buff1inc dxinc dxmov ah,9int 21hretdispyear endpdispmonth proc nearmov dx,offset buff2inc dxinc dxmov ah,9int 21hretdispmonth endpdispday proc nearmov dx,offset buff3inc dxinc dxmov ah,9int 21hretdispday endpaddress proc nearinc siinc simov ax,[si]sub ah,30hsub al,30hmov cl,4rol al,cladd al,ahmov ah,0retaddress endpdelay proc nearpush axpush dxmov dx,5020h ;近1秒mov ax,0s1:sub ax,1sbb dx,0cmp ax,0jne s1cmp dx,0jne s1pop dxpop axretdelay endperror proc nearpush dxpush axmov dx,offset string5mov ah,9int 21hpop axpop dxreterror endpwarning proc nearpush dxpush axmov dl,07hmov ah,2int 21hpop axpop dxretwarning endpcode ends end start调试结果:响铃前:响铃后:输入实例:输入错误信息:心得体会:通过短短几天的课程设计,让我重新拿起已经学习的微机原理理论知识。
相比一年前的程序的编写,现在的我,对于程序的流程理解和汇编语言的运用,更加灵活,更加通顺,渐渐的得心应手。
相比较单片机的课程设计而言,我更加喜欢微机原理的编程设计,感觉它功能更加强大,特点鲜明,还可以单步调试,类似顺序执行的程序化语言的让我不由自主的爱上它,喜欢去编程,而单片机的运行,各个模块之间相互调用,总是给人一种摸不到头绪,杂乱无章的感觉。
但是,另一方面,短暂的课程设计,不得不给人留下很多的遗憾。
首先,十三个题目,做起来非常多,假如只选四个,又会放弃很多有用的功能,要想每一个均独立完成,并都做到尽善尽美,花的时间远远不止是四天的时间,需要平时,课下的钻研,体会,实践,只有这样,才能体会汇编语言的强大。
然后,课程设计的内容丰富,有许多平时不能接触到的,但非常常用的功能,而这些功能,在短时间内不能尽快掌握。
这又不的不说是一件遗憾的事情。
总的来说,课程设计给予我们的收获远远不止是上课时学习到的。
理论知识固然很重要,但是不要实践亲自检验,给人的感觉总是不深刻的,只有亲自动手去探索,去体会,将理论知识加以应用并及时巩固,才可以学习的更快,才可以激发人的学习兴趣,并不断去探索,只有真正脱离应试模式,不只依靠老师的帮助,才能让我们的学习更加持久,更加具有创造力与生命力。