基于单片机的电子表设计_第1页
基于单片机的电子表设计_第2页
基于单片机的电子表设计_第3页
基于单片机的电子表设计_第4页
基于单片机的电子表设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课程设计说明书课程:单片机应用技术课程设计题目:基于AT89C51单片机的电子表设计姓名:学号:1专业:机械设计制造及其自动化班级:2023级机院系:工学院机械系指导老师:朱煜钰课程设计时间:2023.10.27至2023.11.10黄河科技学院课程设计任务书工学院机械系机械设计制造及其自动化专业11级3班学号姓名指导教师朱煜钰题目:基于AT89C51单片机的电子表设计课程:单片机应用技术课程设计课程设计时间2023年10月27日至2023年11月10日共2周课程设计工作内容与基本规定(设计规定、设计任务、工作计划、所需相关资料)(纸张不够可加页)1.设计规定运用AT89C51单片机作为微控制器,在数码管通过一个控制键转换来显示的时间和日期;能通过多个控制键用来实现时间和日期的调节。2.设计任务与规定2.1系统硬件电路设计根据该系统设计的功能规定选择所用元器件,设计硬件电路。规定用Proteus绘制整个系统电路原理图。2.2软件设计根据该系统规定的功能进行软件设计,绘制整个系统的软件流程图;根据流程图编写程序并汇编调试通过;列出软件清单,软件清单规定逐条加以注释。2.3Proteus仿真用Proteus对系统软硬件进行仿真调试并通过。2.4编写设计说明书内容涉及任务书、设计方案分析、硬件部分设计、软件部分设计、调试结果整理分析、设计调试的心得体会等,字数不少于5000字;硬件部分设计要绘制整个系统电路原理图,对各部分电路设计原理做出说明;软件设计部分要(用visio2023画图软件)绘制整个系统框图及各部分的软件流程图,列出程序清单,逐条加以注释,并注明各程序功能块的功能。3.工作计划序号设计内容所用时间1布置任务及调研4天3制作与调试8天4撰写设计报告书2天合计14天4.重要参考资料单片机课程设计指导书 皮大能 北京理工大学出版社 2023.78051单片机实践与应用 吴金戎 清华大学出版社 2023.8单片机技术基础教程与实践夏路易 电子工业出版社 2023.1单片机原理及应用 张毅刚高等教育出版社2023.11基于Proteus的单片机系统设计与仿真实例蒋辉平机械工业出版社2023.7…指导老师签字:日期: 目录 第1章概述…………41.1内容摘要……4 1.2实验基本原理………………4第2章设计思绪及框图……………52.1设计思绪……5 2.2设计框图……5第3章硬件的设计…………………6 3.1主控制部件…………………6 3.2显示模块…………………73.3晶振模块……73.4按键模块……83.5驱动模块……8第4章电路设计原理图……………9第5章程序的设计…………………105.1程序流程图…………………10 5.2源程序……12第6章系统验证及调试……………23第7章总结…………24第8章参考文献……25

第1章概述1.1内容摘要本次课程设计基于单片机原理技术介绍了一款于AT89C51芯片作为核心控制器的单片机电子表的设计与制作,重要有两个功能:时钟和秒表。其制作流程重要涉及硬件电路原理的实现方案设计、软件程序编辑的实现、电子表正常工作的流程、原理图仿真实现、硬件实物的调试过程。该单片机数字电子表采用LED数码管可以准确显示时间(显示格式为:时时,分分,秒秒),可随时进行时间调整,时间可采用24小时制显示,还可实现时钟与秒表的切换,暂停与调时调分调秒,可按自己的规定设立扩展其它的功能。1.2实验基本原理运用AT89C51单片机定期器完毕计时功能,定期器0计时中断程序每隔0.01s中断一次并当作一个计数,设定定期1秒的中断计数初值为0,每中断一次中断计数初值加1,当加到100时,则表达1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了。为了将时间在6位LED数码管上显示,可采用静态显示法和动态显示法,由于静态显示法需要译码器,数据锁存器等较多硬件,可采用动态显示法实现LED显示,通过对每位数码管的依次扫描,使相应数码管亮,同时向该数码管送相应的字码,使其显示数字。由于数码管扫描周期很短,由于人眼的视觉暂留效应,使数码管看起来总是亮的,从而实现了各种显示。

第2章设计思绪及框图2.1设计思绪针对要实现的功能,采用AT89S51单片机进行设计,AT89S51单片机是一款低功耗,高性能CMOS8位单片机,第一,熟悉AT89S51单片机,在编程之前必须了解硬件结构特别是各引脚的用法,以及内部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二,设计硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三,画图部分:设计好电路后进行画图。第四,软件部分:先学习理解汇编语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完毕程序设计。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完毕时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,实现想要的功能。2.2设计框图本次设计重要是应用单片机来设计电子时钟,硬件部分重要分以下电路模块:显示电路用8个共阴极数码显示管、按键模块、晶振模块。显示管分别显示:小时、分钟和秒,通过动态扫描进行显示。电路的总体设计框架如下:LED显示模块LED显示模块单片机模块时钟模块按键模块晶振模块驱动模块 图1第3章硬件的设计3.1主控制部件89C51是一个8位单片机,片内ROM所有采用FLASHROM技术,晶振时钟为12MHz。89C51是标准的40引脚双列直插式集成电路芯片,有4个八位的并行双向I/O端口,分别记作P0、P1、P2、P3。第31引脚需要接高电位使单片机选用内部程序存储器;第40脚为电源端VCC,接+5V电源,第20引脚为接地端VSS,通常在VCC和VSS引脚之间接0.1μF高频滤波电容。硬件原理图如图2所示图2

3.2显示模块方案一:静态显示。静态显示,即当显示器显示某一字符时,相应的发光二极管恒定导通或截止。该方式每一位都需要一个8位输出口控制。静态显示时较小电流能获得较高的亮度,且字符不闪烁。但因当所需显示的位数较多时,静态显示所需的I/O口数较大,导致资源的浪费。方案二:动态显示。动态显示,即各位数码管轮流点亮,对于显示器各位数码管,每隔一段延时时间循环点亮一次。运用人的视觉暂留功能可以看到整个显示,但须保证扫描速度足够快,人的视觉暂留功能才可察觉不到字符闪烁。显示器的亮度与导通电流、点亮时间及间隔时间的比例有关。调整参数可实现较高稳定度的显示。动态显示节省了I/O口,减少了能耗。从节省单片机芯片I/O口和减少能耗角度出发,本数字电子钟数码管显示选择设计采用方案二。3.3晶振模块单片机芯片可使用内部时钟电路和外部时钟电路两种方式产生电路所需的时钟脉冲,内部时钟电路实现可用石英晶体和微调电容外接即可达成,外部时钟电路实现需要一个外部脉冲源引入脉冲信号以保证个单片机之间时钟信号的同步。从硬件实现难易角度考虑,内部时钟电路的实现比外部时钟电路的实现更简易。既本数字电子钟设计所需的时钟源采用内部时钟电路实现。所用定期方式为工作方式1,石英晶振为12M,即最小定期时间为1us,最大定期时间约为65.5ms,其电路图如下图2所示。图33.4按键模块本数字电子钟设计所需按键用于进行显示时间的调整与设立扩展的小键盘。单片机芯片4个I/O口可与按键直接相连,通过编程,单片机芯片即可控制按键接口电平的高低,即按键的开与关,以达成用按键进行显示时间的调整与设立扩展的小键盘的设计规定,本电路采用P1口与按键相连。其电路图如图4所示:图43.5驱动模块从实物制作简易限度与驱动数码管段码能力角度出发,本数字电子钟设计采用数码管段码与AT89C51P0口相连,单片机AT89C51的P2口控制数码管的片选信号,通过编程,单片机芯片即可控制段码电平的高低的方式实现数码管段码控制。

第4章电路设计原理图图5第5章程序设计程序流程图在主程序的开始定义了一组固定单元用来存储计数的分、秒、时的存储单元。在主程序中,对不同的按键进行扫描,实现秒表,时间调整。系统总体流程图如图6所示。图6T0中断入口T0中断入口通过查表方式显示数据位选数值=0秒计数加1秒计数=1000秒计数=0Seconds加1中断返回开始系统子程序流程图如图7所示:是否满24h?是否满24h?显示缓冲单元清0返回NY是否满60m?小时加1分值加1N计数器重新加载循环次数加1是否满1s?是否满60s?秒值加1N开始源程序程序清单如下:#include<reg51.h>#defineucharunsignedchar#defineuintunsignedint//七段共阴数码显示管段码表//ucharcodedispcode[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//定义初始化变量////秒表部分//ucharDecisec=0;//分秒//ucharSec=0;//秒//ucharMint=0;//分////时钟部分//ucharSeconds=0;ucharMinutes=0;ucharHours=0;ucharCount=0;ucharNumb=0;//按键部分//sbitCHANGE=P1^0; //切换:可实现跑表与时钟互切//sbitSTART=P1^1; //开始//sbitSTOP=P1^2; //暂停//sbitRST=P1^3; sbitrst=P1^4;sbitjia1=P1^5;sbitjia2=P1^6;sbitjia3=P1^7; //复位////函数声明//voiddelay(ucharms);//延迟函数//voidtime_pro1();//秒表解决函数//voidtime_pro2();//时钟解决函数//voidkeyscan(); //键盘扫描//voiddisplay1();//数码管显示秒表//voiddisplay2();//数码管显示时钟///*******************/// 主函数///*******************/voidmain(){ P1=0xff; TMOD=0x11; TH0=(65536-10000)/256; TL0=(65536-10000)%256; TH1=(65536-10000)/256; TL1=(65536-10000)%256; EA=1; ET0=1; ET1=1; TR0=1; while(1) { keyscan(); if(Numb==1) { display1(); } if(Numb==0) { display2(); if(rst==0) { Hours=0; Seconds=0; Minutes=0; } if(jia1==0) { delay(5); if(jia1==1) { Hours++; if(Hours==24) {Hours=0;} } } if(jia2==0) { delay(5); if(jia2==1) { Minutes++; if(Minutes==60) {Minutes=0;} } } if(jia3==0) { delay(5); if(jia3==1) { Seconds++; if(Seconds==60) {Seconds=0;} } } } }}/*******************///延迟函数///*******************/voiddelay(ucharms){ uchari,j; for(i=ms;i>0;i--) for(j=500;j>0;j--);}/*******************///秒表解决函数///******************/voidtime_pro1(){ if(Decisec==100) { Decisec=0; Sec++; if(Sec==1000) { Sec=0; } }}/*******************///时钟解决函数///******************/voidtime_pro2(){ if(Seconds==60) { Seconds=0; Minutes++; if(Minutes==60) { Minutes=0; Hours++; if(Hours==24) { Hours=0; } } }}/*******************///键盘扫描函数///******************/voidkeyscan(){ //秒表/时钟切换// if(CHANGE==0) { delay(5); if((CHANGE==0)&&(Numb==0)) { display1(); Numb=!Numb; while(!CHANGE) { display1(); } } if((CHANGE==0)&&(Numb==1)) { Numb=!Numb; while(!CHANGE) { display2(); } } } //开始计时// if((START==0)&&(Numb==1)) { delay(5); if(START==0) { TR1=1; while(!START) { display1(); } } } //暂停计时// if((STOP==0)&&(Numb==1)) { delay(5); if(STOP==0) { TR1=0; while(!STOP) { display1(); } } } //重新计时// if((RST==0)&&(Numb==1)) { delay(5); if(RST==0) { Hours=0; Seconds=0; Minutes=0; Decisec=0; Sec=0; while(!RST) { Decisec=0; Sec=0; display1(); } } }}/********************///数码管显示秒表///********************/voiddisplay1(){ P2=0x7f; P0=dispcode[Decisec/10];//显示分秒// delay(1); P2=0xbf; P0=dispcode[(Sec%100)%10]|0x80;//显示秒个位// delay(1); P2=0xdf; P0=dispcode[(Sec%100)/10];//显示秒十位// delay(1); P2=0xef; P0=dispcode[Sec/100]; delay(1); }/*********************///数码管显示时钟///*********************/voiddisplay2(){ P2=0x7f; P0=dispcode[Seconds%10];//显示秒个位// delay(1); P2=0xbf; P0=dispcode[Seconds/10];//显示秒十位// delay(1); P2=0xdf; P0=dispcode[Minutes%10]|0x80;//显示分个位// delay(1); P2=0xef; P0=dispcode[Minutes/10];//显示分十位// delay(1); P2=0xf7; P0=dispcode[Hours%10]|0x80;//显示时个位// delay(1); P2=0xfb; P0=dispcode[Hours/10];//显示时十位// delay(1);}/*********************///定期器T1中断服务程序///********************/voidtime_T1()interrupt3{ TH1=(65536-10000)/256; TL1=(65536-10000)%256; Decisec++; time_pro1();//秒表时间解决函数//}/**********************///定期器T0中断服务程序///**********************/voidtime_T0()interrupt1{ TH0=(65536-10000)/256; TL0=(65536-10000)%256; Count++; if(Count==100) { Seconds++; time_pro2();//时钟时间解决函数// Count=0; }}

第6章系统的验证及调试时钟调试:秒表调试:第7章总结这两周的课程设计学到了不少的东西,刚开始的时候我感觉毫无头绪,又要忙着安装软件,又要学习Proteus,以前没有用过,紧张忙但是来,做完之后才明白本来用单片机做一个实物也不是想象中的那样困难重重,在这整个的设计过程中,不仅复习了书本上的理论知识,提高了自己的动手能力,并且还强化了自己的编程水平,总的来感觉效果还是挺不错的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论