基于AT89C52单片机的万年历设计与仿真

张开发
2026/4/16 3:39:15 15 分钟阅读

分享文章

基于AT89C52单片机的万年历设计与仿真
点击链接获取Keil源码与Project Backups仿真图https://download.csdn.net/download/qq_64505944/92510418?spm1001.2014.3001.55031、功能(1)/时间同步正常显示年月日、时分秒、温度、星期(2)/均可通过按键调节时间(3)/可通过按键设定温度最大最小报警值温度不在范围内会报警。2、压缩包构造代码与仿真常见问题、Keil源码程序、Proteus仿真图、参考文档、功能介绍、仿真代码运行、焊接事项、免费PPT模版、使用前必读。3、仿真构造AT89C52,LCD液晶显示,DS18B20温度模块,指示灯,5按键。4、代码文件代码420行左右有注释文档5900字左右。C48主要内容本次设计所提出的一种基于单片机技术的万年历的方案能更好的解决万年历显示的问题,随着数字生活的到来单片机在生活中越来越重要它能将大量的逻辑功能集成与一个集成电路中使用起来十分方便。基本要求1、万年历电路设计图2、万年历设计源程序3、keil运行源程序4、proteus中仿真5、运行结果分析。主要参考资料[1] 谭浩强.C.程序设计.北京:清华大学出版社2002[2] 王为青程国刚.单片机 Keil Cx52 应用技术开发北京人民邮电大学出版社2007[3] 马忠梅等.单片机的C语言应用程序设计.北京航空航天大学出版社,2003.[4] 王晋凯.简简单单学通52单片机开发 [M].清华大学出版社,2014.[5] 刘守义等.单片机技术基础[M].西安电子科技大学出版社,2007.完 成 期 限12 月 11 日 - 12 月 26 日 指导教师签名 课程负责人签名摘 要近年来随着科技的飞速发展单片机的应用正在不断深入,同时带动传统控制检测技术日益更新.在实时检测和自动控制的单片机应用系统中单片机往往作为一个核心部件来使用但仅单片机方面的知识是不够的还应根据具体硬件结构、软硬件结合来加以完善。万年历在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中以后必将出现功能更多显示更完全的万年历基于这样的理念本次设计是用AT89c52单片机、7SEG-MPX2-CC数码管显示器、控制按键为元件来设计的万年历。利用此设计熟悉单片机微控制器及汇编语言编程对其片资源及各个I/0端口的功能和基本用途的了解。掌握应用程序开发环境常用的7SEG-MPX2-CC数码管显示器的使用方法。此设计是基于单片机技术的万年历的方案本次设计所提出的一种基于单片机技术的简易计算器的方案,采用具有数据处理能力的中央处理器CPU随机存储器ROM多种I/0口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统-—单片机配以汇编语言编写的执行程序能更好的解决计算机计算的问题,随着数字生活的到来单片机在生活中越来越重要它能将大量的逻辑功能集成与一个集成电路中使用起来十分方便。关 键 词AT89C52单片机技术万年历7SEG-MPX2-CC数码管目录摘 要 1目录 21 概述 31.1 设计思想 31.2 单片机概述 31.3 设计目的 41.4 设计要求 42系统总体方案 52.1 整体设计 52.2 温度模块设计 62.3 时钟程序设计 72.4 LCD显示程序 83 系统程序设计 93.1 系统电路图 93.2 程序源代码 94 系统仿真和调试 204.1 Keil uVision与Porteus仿真软件 204.1.1 Keil uVision 204.1.2 Porteus 204.2 测试结果图 214.3 测试结果分析 215 心得与体会 22参考文献 231 概述1.1 设计思想近年来随着科技的飞速发展单片机的应用正在不断深入同时带动传统控制检测技术日益更新。在实时检测和自动控制的单片机应用系统中单片机往往作为一个核心部件来使用但仅单片机方面的知识是不够的还应根据具体硬件结构、软硬件结合来加以完善。万年历在人们的日常生活中是比较常见的电子产品之一.可是它还在发展之中以后必将出现功能更多显示更完全的万年历基于这样的理念本次设计是用AT89c52单片机、7SEG-MPX2-CC数码管显示器、控制按键为元件来设计的万年历。利用此设计熟悉单片机微控制器及汇编语言编程对其片资源及各个I/0端口的功能和基本用途的了解。掌握应用程序开发环境常用的7SEG-MPX2-CC数码管显示器的使用方法。此设计是基于单片机技术的万年历的方案本次设计所提出的一种基于单片机技术的简易计算器的方案,采用具有数据处理能力的中央处理器CPU随机存储器ROM多种I/0口和中断系统、定时器/计时器等功能集成到一块硅片上构成的一个小而完善的计算机系统-—单片机配以汇编语言编写的执行程序能更好的解决计算机计算的问题,随着数字生活的到来单片机在生活中越来越重要它能将大量的逻辑功能集成与一个集成电路中使用起来十分方便。1.2 单片机概述当今时代是一个新技术层出不穷的时代。在电子领域尤其是自动化智能控制领域传统的分立元件或数字逻辑电路构成的控制系统正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点可以说智能控制与自动控制的核心就是单片机。目前一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。过去习惯于传统电子领域的工程师、技术员正面临着全新的挑战如不能在较短时间内学会单片机势必会被时代所遗弃只有勇敢地面对现实挑战自我加强学习争取在较短的时间内将单片机技术融会贯通才能跟上时代的步伐。它所给人带来的方便也是不可否定的它在一块芯片内集成了计算机的各种功能部件构成一种单片式的微型计算机。20世纪80年代以来国际上单片机的发展迅速其产品之多令人目不暇接单片机应用不断深入新技术层出不穷。20世纪末电子技术获得了飞速的发展在其推动下现代电子产品几乎渗透了社会的各个领域有力地推动了社会生产力的发展和社会信息化程度的提高同时也使现代电子产品性能进一步提高产品更新换代的节奏也越来越快。1.3 设计目的通过本次课程设计运用《单片机微型计算机原理及应用》所学到的知识及查询相关资料完成对万年历的设计,进一步提高单片机的系统设计和开发能力,达到理论知识与实践更好的结合提高综合运用所学知识和设计能力的目的。1.4 设计要求本设计中由于要对时间、温度进行显示所以选择液晶显示屏1602模块作为输出。1602字符型LCD通常有14条引脚线或16条引脚线的LCD多出来的2条线是背光电源线。它可以显示两行每行16个字符采用单5V电源供电外围电路配置简单价格便宜具有很高的性价比。1602液晶模块内部的字符发生存储器CGROM)已经存储了160个不同的点阵字符图形这些字符有阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等每一个字符都有一个固定的代码比如大写的英文字母“A”的代码是01000001B41H显示时模块把地址41H中的点阵字符图形显示出来我们就能看到字母“A”。将L1602的RS端和P2.0R/W端和P2.1, E 端和P2.2相连当RS0时对LCD1602写入指令当RS1时对LCD1602写入数据。当R/W端接高电平时芯片处于读数据状态反之处于写数据状态E端为使能信号端。当R/W为高电平,E端也为高电平RS为低电平时液晶显示屏显示需要显示的示数。2系统总体方案2.1 整体设计根据功能和指标要求本系统选用MCS-52系列单片机AT89C52为主控机。电子万年历设计题目的系统总流程图如图所示。流程图分析首先系统初始化系统开始运行当有设置键按下时进入修改时间模式无按键按下时读取时间、温度等数据送入液晶屏显示在修改时间模式下设置时间完成后再送数据到液晶屏显示。图2.1 总体方案流程图2.2 温度模块设计温度读取流程图如图8.2所示。流程图分析开始进入初始化DS18B20就是通过主机拉低单线产生复位脉冲然后释放该线如果有应答脉冲即发起ROM命令当成功的执行操作命令后就使用Convert T命令即开始温度转换当转换完后又初始化DS18B20是否有应答脉冲若有就发起Read Scratchpad读取暂存器和CRC字节命令同时读出第12个字节即为温度的数据。图2.2温度模块流程图2.3 时钟程序设计时钟流程图如图所示。流程图分析DS1302开始计时时首先进行初始化当有中断信号时读取时钟芯片的数据送入液晶屏显示。这时若有设置键按下时进行时间修改完成后将数据送入时钟芯片若没有按键按下则直接存入EPROM送入液晶屏显示。图2.3时钟模块流程图2.4 LCD显示程序显示程序流程图如图8.4。流程图分析首先对1602显示屏进行初始化初始化大约持续10ms左右然后检查忙信号若BF0则获得显示RAM的地址写入相应的数据显示若BF1则代表模块正在进行内部操作不接受任何外部指令和数据直到BF0为止。图2.4 LCD显示程序流程图3 系统程序设计3.1 系统电路图图3.1 系统总电路图3.2 程序源代码#define uchar unsigned char#define uint unsigned intuchar mode0; //屏幕状态变量uchar temp0; //是否调整时钟变量uchar k0; //键盘变量uchar flag0; //温度正负标志位uint TU350; //报警温度初始化25度uint TD150; //报警温度初始化15度uchar WDTZ0; //温度调整标志uint T0; //当前温度//头函数#include reg52.h#include intrins.h#include “Ds1302.h”//时钟函数调用#include “key.h” //键盘函数调用#include “Lcd.h” //屏幕函数调用#include “DS18B20.h” //温度传感器函数调用//蜂鸣器管脚定义sbit FengP2^4;sbit LEDGP1^3;sbit LEDRP1^4;/------------------------------------------------主函数------------------------------------------------/void main(){rw0;Init_LCD(); //初始化显示Ds1302_Init(); //时钟芯片初始化//主循环while(1){//非温度上限调整阶段if(WDTZ0){Ds1302_Read_Time(); //读时间LCD_Write_Time(time_buf1);//LCD显示//读取温度tmpchange();Ttmp();//显示温度Data_WD(T,flag);//判断温度是否高于报警值上线if(TTU){Feng0;//报警开LEDG0;LEDR1;}else if(TTD){Feng0;//报警开LEDG1;LEDR0;}else{Feng1;//报警关LEDG1;LEDR1;}}//检测按键kKey();if(k4)//按下温度调整功能上线{//时间待机状态if(WDTZ!1){Init_LCD_TU(); //温度上限显示初始化显示Data_WD_TZ(TU); //显示温度上限值WDTZ1; //状态切换}else{Init_LCD(); //时间显示初始化显示WDTZ0; //状态切换}}if(k5)//按下温度调整功能下限{//时间待机状态if(WDTZ!2){Init_LCD_TD(); //温度上限显示初始化显示Data_WD_TZ(TD); //显示温度上限值WDTZ2; //状态切换}else{Init_LCD(); //时间显示初始化显示WDTZ0; //状态切换}}else if(k1)//按下温度调整{if(WDTZ1){//温度上限调整if(TU1250){TU1250;}else{TUTU10;}Data_WD_TZ(TU);//显示报警温度}//下限else if(WDTZ2){//温度上限调整if(TDTU-10){}else{TDTD10;}Data_WD_TZ(TD);//显示报警温度}}else if(k3){//若在时间界面按下3键 为功能键 调整时间if(WDTZ0){mode;write_com(0x0d);//打开闪烁write_com(0x800x407);//停留在秒闪烁}}else if(k2)//按下功能键或温度调整-{if(WDTZ1){//温度下限调整if(TUTD10){}else{TUTU-10;}Data_WD_TZ(TU);//显示报警温度}else if(WDTZ2){//温度下限调整if(TD10){TDTD-10;}else{TD0;}Data_WD_TZ(TD);//显示报警温度}}//进入时间调整循环while(mode!0){temp1; //调整时间kKey(); //是否有键按下if(k3) //功能键按下{mode;if(mode7)mode0;switch(mode)//光标闪烁{case 2:{write_com(0x800x404);//停留在秒闪烁break;}case 3:{write_com(0x800x401);//停留在秒闪烁break;}case 4:{write_com(0x800x03);//停留在秒闪烁break;}case 5:{write_com(0x800x06);//停留在秒闪烁break;}case 6:{write_com(0x800x09);//停留在秒闪烁break;}}k0;}if(k2) //时间{switch(mode){case 1://秒{time_buf1[6];if(time_buf1[6]60){time_buf1[6]0;}//显示write_com(0x800x400x06);write_date(0x30time_buf1[6]/10);write_date(0x30time_buf1[6]%10);write_com(0x800x400x07);//停留在秒闪烁break;}case 2://分{time_buf1[5];if(time_buf1[5]60){time_buf1[5]0;}//显示write_com(0x800x400x03);write_date(0x30time_buf1[5]/10);write_date(0x30time_buf1[5]%10);write_com(0x800x400x04);//停留在秒闪烁break;}case 3://时{time_buf1[4];if(time_buf1[4]24){time_buf1[4]0;}//显示write_com(0x800x400x00);write_date(0x30time_buf1[4]/10);write_date(0x30time_buf1[4]%10);write_com(0x800x400x01);//停留在秒闪烁break;}case 4://年{time_buf1[1];if(time_buf1[1]100){time_buf1[1]0;}//显示write_com(0x800x00);write_date(0x30time_buf1[0]/10);write_date(0x30time_buf1[0]%10);write_date(0x30time_buf1[1]/10);write_date(0x30time_buf1[1]%10);//计算日期time_buf1[7]Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);//显示日期Data_XS(time_buf1[7]);write_com(0x800x03);//停留在秒闪烁break;}case 5://月{time_buf1[2];if(time_buf1[2]13){time_buf1[2]1;}//显示write_com(0x800x05);write_date(0x30time_buf1[2]/10);write_date(0x30time_buf1[2]%10);//计算日期time_buf1[7]Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);//显示日期Data_XS(time_buf1[7]);write_com(0x800x06);//停留在秒闪烁break;}case 6://日{time_buf1[3];if(time_buf1[3]32){time_buf1[3]1;}//显示write_com(0x800x08);write_date(0x30time_buf1[3]/10);write_date(0x30time_buf1[3]%10);//计算日期time_buf1[7]Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);//显示日期Data_XS(time_buf1[7]);write_com(0x800x09);//停留在秒闪烁break;}}k0;}if(k1) //时间–{switch(mode){case 1://秒{time_buf1[6]–;if(time_buf1[6]0xff){time_buf1[6]59;}//显示write_com(0x800x400x06);write_date(0x30time_buf1[6]/10);write_date(0x30time_buf1[6]%10);write_com(0x800x400x07);//停留在秒闪烁break;}case 2://分{time_buf1[5]–;if(time_buf1[5]0xff){time_buf1[5]59;}//显示write_com(0x800x400x03);write_date(0x30time_buf1[5]/10);write_date(0x30time_buf1[5]%10);write_com(0x800x400x04);//停留在秒闪烁break;}case 3://时{time_buf1[4]–;if(time_buf1[4]0xff){time_buf1[4]23;}//显示write_com(0x800x400x00);write_date(0x30time_buf1[4]/10);write_date(0x30time_buf1[4]%10);write_com(0x800x400x01);//停留在秒闪烁break;}case 4://年{time_buf1[1]–;if(time_buf1[1]0xff){time_buf1[1]99;}//显示write_com(0x800x00);write_date(0x30time_buf1[0]/10);write_date(0x30time_buf1[0]%10);write_date(0x30time_buf1[1]/10);write_date(0x30time_buf1[1]%10);//计算日期time_buf1[7]Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);//显示日期Data_XS(time_buf1[7]);write_com(0x800x03);//停留在秒闪烁break;}case 5://月{time_buf1[2]–;if(time_buf1[2]0){time_buf1[2]12;}//显示write_com(0x800x05);write_date(0x30time_buf1[2]/10);write_date(0x30time_buf1[2]%10);//计算日期time_buf1[7]Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);//显示日期Data_XS(time_buf1[7]);write_com(0x800x06);//停留在秒闪烁break;}case 6://日{time_buf1[3]–;if(time_buf1[3]0){time_buf1[3]31;}//显示write_com(0x800x08);write_date(0x30time_buf1[3]/10);write_date(0x30time_buf1[3]%10);//计算日期time_buf1[7]Conver_week(time_buf1[1],time_buf1[2],time_buf1[3]);//显示日期Data_XS(time_buf1[7]);write_com(0x800x09);//停留在秒闪烁break;}}k0;}}if(temp1)//存入新时间{write_com(0x0c);//关闭闪烁Ds1302_Write_Time();temp0;}}}4 系统仿真和调试4.1 Keil uVision与Porteus仿真软件4.1.1 Keil uVisionKeil uVision3是美国Keil Software 公司出品的52系列兼容单片机C语言软件开发系统使用接近于传统c语言的语法来开发与汇编相比C语言在功能上、结构性、可读性、可维护性上有明显的优势因而易学易用﹐而且大大的提高了工作效率和项目开发周期,他还能嵌入汇编您可以在关键的位置嵌入使程序达到接近于汇编的工作效率。KEILC52标准℃编译器为8052微控制器的软件开发提供了C语言环境,同时保留了汇编代码高效﹐快速的特点。C52编译器的功能不断增强使你可以更加贴近CPU本身及其它的衍生产品。C52已被完全集成到uVision2的集成开发环境中这个集成开发环境包含:编译器汇编器实时操作系统项目管理器调试器。系统功能Keil C52软件提供丰富的库函数和功能强大的集成开发调试工具全 Windows界面使您能在很短的时间内就能学会使用keil c52来开发您的单片机应用程序。另外重要的一点只要看一下编译后生成的汇编代码就能体会到 KeilC52生成的目标代码效率非常之高多数语句生成的汇编代码很紧凑容易理解。在开发大型软件时更能体现高级语言的优势。4.1.2 PorteusProteus 软件是英国Labcenter electronics 公司出版的EDA工具软件该软件中国总代理为广州风标电子技术有限公司。它不仅具有其它 EDA工具软件的仿真功能还能仿真单片机及外围器件。它是目前最好的仿真单片机及外围器件的工具。虽然目前国内推广刚起步但已受到单片机爱好者、从事单片机教学的教师、致力于单片机开发应用的科技工作者的青睐。Proteus是世界上著名的EDA工具(仿真软件)从原理图布图、代码调试到单片机与外围电路协同仿真一键切换到PCB设计真正实现了从概念到产品的完整设计。是目前世界上唯一将电路仿真软件、PCB设计软件和虚拟模型仿真软件三合一的设计平台其处理器模型支持 8052、HC11、PIC10/12/16/18/24/30/DsPIC33 、AVR、ARM、8086和MSP430“等2010年即将增加Cortex 和 DSP系列处理器并持续增加其他系列处理器模型。在编译方面它也支持IAR、Keil 和MPLAB等多种编译器。其功能特点(1)原理布图(2)PCB自动或人工布线( 3SPICE电路仿真(2)pcb自动或人工布线(3)SPICE电路仿真4.2 测试结果图图4.1 程序运行图4.3 测试结果分析经过测试本次设计的基于52单片机的万年历的功能基本实现成功能够完成出时间、温度等功能的显示但是本次实验也有许多不足之处还有很多地方需要改进比如说温度的显示有误差可以对代码进行更精简的修整从而使功能更加的强大并且可以运用于生活实际当中。5 心得与体会课程设计是培养学生综合运用所学知识发现、提出、分析和解决实际问题锻炼实践能力的重要环节是对学生实际工作能力的具体训练和考察过程。随着科学技术发展的日新日异单片机已经成为当今计算机应用中空前活跃的领域在生活中可以说得是无处不在。因此作为电子信息工程专业的学生来说掌握单片机的开发技术是十分重要的。我的题目是万年历对于我们这些实践中的新手来说这是一次考验。怎么才能找到课堂所学与实际应用的最佳结合点?怎样让自己的业余更接近专业?怎样让自己的计划更具有序性而不会忙无一用?这都是我们所要考虑和努力的。经过查找资料编写程序加深了对单片机的了解与认识通过本次试验最大的收获就是仿真容易而做实物却会遇到各种各样的困难。在电脑上仿真只要程序写对电器元件连接好就会得出结果。本次实验让我收获很多感谢老师的答疑也感谢同学的帮助不仅加深了知识方面更加锻炼了动手能力相信以后遇到这方面问题不再会不知所措让我把知识和实践结合到一起通过这次实践我了解自己的不足C语言掌握的不够方法的不足使我更加了解以后该在哪个方面补充的自己的不足总体来说本次课程设计是成功的使我了解到更多课本上没有的知识最后再次感谢所有帮助过我的老师和同学们。参考文献[1] 谭浩强.C.程序设计.北京:清华大学出版社2002[2] 王为青程国刚.单片机 Keil Cx52 应用技术开发北京人民邮电大学出版社2007[3] 马忠梅等.单片机的C语言应用程序设计.北京航空航天大学出版社,2003.[4] 王晋凯.简简单单学通52单片机开发 [M].清华大学出版社,2014.[5] 刘守义等.单片机技术基础[M].西安电子科技大学出版社,2007.课程设计评定表评定项目 内 容 满分 评分 总分学习态度 学习认真态度端正遵守纪律。 10设计情况 认真查阅资料勤学好问提出的问题有一定的深度分析解决问题的能力较强。 40说明书质量 设计方案正确、表达清楚设计思路、实验论证方法科学合理达到课程设计任务书规定的要求图、表、文字表达准确规范上交及时。 40回答问题情况 回答问题准确基本概念清楚有理有据有一定深度。 10总成绩 采用五级分制优、良、中、及格、不及格指导教师评语签名年 月 日

更多文章