欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    苏州某学院单片机课程设计可编程作息时间控制器程序设计.doc

    • 资源ID:4296637       资源大小:235KB        全文页数:16页
    • 资源格式: DOC        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    苏州某学院单片机课程设计可编程作息时间控制器程序设计.doc

    苏州科技学院天平学院单片机课程设计报告作息时间控制器设计姓 名: 王亚明 学 号: 0930117114 专业班级: 电气0921 指导老师: 徐树梅 2012年6月2日 目录1 概述31.1 课程设计的目的和意义31.2 单片机课程设计的要求31.3 作息时间控制器的设计要求32 系统总体方案及硬件设计32.1 系统总体设计32.2 系统各个部分的电路设计43 软件的设计63.1 概述63.2 主模块的设计63.3显示模块设计73.4 时间设定模块设计73.5 声光显示功能的实现84 Proteus软件仿真84.1仿真结果84.2性能及误差分析95课程设计体会10参考文献10附1 程序源代码10附2原理图15第一部分 概述1.1 课程设计的目的和意义: 综合利用所学单片机知识完成一个单片机应用系统设计并仿真、由硬件实现,从而加深对单片机软硬知识的理解,获得初步的应用经验,为走出校门从事单片机应用的相关工作打下良好基础。1.2 单片机课程设计的要求:1、进一步熟悉和掌握单片机的内部结构和工作原理,了解单片机应用系统设计的基本方法和步骤;2、掌握单片机仿真软件Proteus的使用方法; 3、掌握键盘和显示器在的单片机控制系统中的应用。4、掌握撰写课程设计报告的方法。1.3 作息时间控制器的设计要求:1、设计制作一个单片机数字钟及控制电路。2、使用LED显示器来显示现在的时间。显示格式为“时-分-秒”,由LED闪动作为秒计数表示。3、可以设定作息时间,并进行到时提示。4、能够根据预先设定好的作息时间表自动启停控制电路,完成对外部设备的实时控制。5、可以设置现在的时间及显示定时设置时间。第二部分 系统总体方案及硬件设计 2.1 系统总体设计:1、方案设计:用单片机来设计制作完成,由于其功能的实现主要通过软件编程来完成,那么就降低了硬件电路的复杂性,而且其成本也有所降低,2、单片机的选型:AT89C52是低功耗、高性能的CMOS型8位单片机。片内带有4KB的Flash存储器,且允许在系统内改写或用编程器编程。另外, AT89C51的指令系统和引脚与8051完全兼容,片内有128B 的RAM、32条I/O口线、2个16位定时计数器、5个中断源、一个全双工串行口等。基于以上优点,本设计采用AT89C52单片机。3、总体电路的设计:时间作息控制的主体电路应包括秒信号发生器、时间显示电路、按键电路、供电电源以及闹铃指示电路等几部分。按键功能说明:K1设置时间;K2 加一;K3,减一;K4;声光控制开关。时间作息控制的系统框图1如下所示:AT89C52复位、时钟等电路按钮电路LED显示电路声光指示电路电源供电电路 图1 2.2 系统各个部分的电路设计: 1、系统复位电路的设计:单片机系统一般应有手动或上电复位电路。复位电路的实现通常有两种方式:)RC复位电路;)专用µ监控电路。前者实现简单,成本低,但复位可靠性相对较低;后者成本较高,但复位可靠性高,尤其是高可靠重复复位。对于复位要求高、并对电源电压进行监视的场合,大多采用这种方式。复位电路主要用来在单片机的程序进入死循环后,能使单片机重新从头执行程序而不会无休止的执行程序。本设计采用了上电按钮电平复位电路,如图2 图22、系统时钟电路设计:对于时间要求不是很高的系统,只要按图进行设计就能使系统可靠起振并稳定运行。但由于实际工作过程中的C1、C2电容起着系统时钟频率微调和稳定的作用,因此,在实际应用中一定要注意正确选择参数(30±10 PF),并保证对称性(尽可能匹配),这两个电容元件对闹钟的走时误差有很大关系,并且选用正规的瓷片或云母电容,如果可能的话,温度系数要尽可能低。另外,瓷片电容的实际焊接距离不应该离单片机太远否则误差较大。具体的时钟电路如图三所示: 图 33、声光指示电路设计:声光指示可以有声或光两种形式。本系统采用声音和光混合指示。关键元件是蜂鸣器和发光二极管。闹钟电路是用比较器来比较计时系统和定时系统的输出状态,如果计时系统和定时系统的输出状态相同,则发出一个脉冲信号,再和一个高频信号混合,送到放大电路驱动扬声器发声,从而实现定时闹响的功能。其电路设计参见系统原理图。4、显示电路的设计:本设计采用了4位数码管显示电路。在4位LED显示时,为了简化电路,降低成本,采用动态显示的方式,4个LED显示器共用一个8位的I/O, 4位LED数码管的位选线分别由相应的P2.2P2. 5控制,而将其相应的段选线并联在一起,由一个8位的I/O口控制,即P0口。由于采用了四位数码管,所以数码管显示“时”、“分”;秒的显示选用了一个发光二极管,两灭周期为两秒,即点亮和熄灭时间均为一秒。到达定时时间时,由计时系统的输出状态产生一脉冲信号,然后去触发蜂鸣器实现闹铃。校时电路是用来对“时”、“分”、“秒”显示数字进行校对调整的。具体的电路设计如图4示: 图45、定时和调时电路的设计:本设计因为使用到的键数目比较少,不宜采用矩阵式键盘,采用了功能直观简洁方便的独立式键盘,而且考虑了键盘的消抖问题。比较容易理解。每个键的具体功能如下:K1设置时间;K2 加一;K3,减一;K4;声光控制开关。按键定义如图5所示:图5第三部分 软件的设计3.1 概述:软件设计的重点在于秒脉冲信号的产生、显示的实现、以及按键的处理等方面。基于软件的秒脉冲信号通常有延时法和定时中断法。延时法一般采用查询方式,在延时子程序前后必然需要查询和处理的程序,导致误差的产生,因此其秒脉冲的精度不高;中断法的原理是,利用单片机内部的定时器溢出中断来实现。本设计使定时器每50ms中断1次,则20次的周期为1s。这种实现法的特点是精度高,秒脉冲的发生和其他处理可以并行进行。本系统中所使用的晶振频率为12MHZ。 3.2 主模块的设计:主模块是系统软件的主框架。结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心就是主框架的构建。它的合理与否关系到程序最终的功能的多少和性能的好坏。本系统的主模块的程序框图如下图6所示:单片机系统初始化定时初始化中断初始化串口初始化显示待机指示符设定闹铃时间判设置闹铃时间否?显示刷新启动走时有关变量初始化刷新显示判时或分变化否?秒指示判秒到否?闹铃判是否到闹铃时间?延时YYYY 图63.3显示模块设计:显示是由显示代码取得相应的段码,显示段码数据的并行发送,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。程序流程如图7所示。图七3.4 时间设定模块设计:时间设定模块的设计要点是按键的去抖处理与多种状态公用一个键的处理问题。即只涉及4个键完成了4位时间参数的设定。软件法去抖动的实质是用延时,即检测到某一键状态变化后延时一段时间,再检测该按键的状态是否还保持着,如是则作为按键处理,否则,视为抖动,不予理睬。去抖中的延时时间一般参考资料多描述为10ms左右,实际应用中,应大于20ms,否则,会导致按一次作多次处理,影响程序正常执行。按键消抖流程图原理如图8所示:图83.5声光功能的实现:闹铃功能的实现涉及到两个方面:闹铃时间设定和是否闹铃判别与相应处理。闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。闹铃判别与闹铃处理的关键在于判别何时要进行闹铃。在每次循环扫描的过程中,判断现在的时间和定时的时间是否一致。一致的话,闹铃电路根据计时系统的输出状态产生一脉冲信号,然后加上一个高频或低频信号送到放大电路驱动蜂鸣器发声实现报时。时间调节电路根据不同状态下的具体按键意义将相对应的计数器加以改变,并通过数码管显示出来。第四部分 Proteus软件仿真本次课程设计所采用的程序调试软件为wave6000集成调试软件,所采用的仿真软件为proteus professional软件。本设计在Proteus软件上进行了仿真,实现了设计所要求的具体内容。4.1仿真结果:1、启动初值(如图9)图92、声光控制报警(如图10)图103、定时响铃功能(如图11)图114.2性能及误差分析:该作息时间控制器有四个按键: K1, K2,K3和K4。初始加电时数码管显示时钟计数初值并运行。按K1键进行校时,可以分别按K2和K3键进行对时及分进行单独校时,使其校正到标准时间;并按K4键退出。时钟正常显示运行状态时,按K2键显示闪烁并进行定时时间设置,按K1键和K3进行分和时的定时时间设定;并按K4键退出。该电路显示的误差主要由晶振自身的误差所造成,晶振的误差约为0. 00010. 000001。在软件的编程过程中所产生的误差比较小,另外在中断的过程中,只会在第一次计时时产生时间的偏移,而它所产生累计误差很小,可以忽略。综合以上分析,本次设计时钟误差较小,能得到比较理想结果,性能稳定。第五部分 课程设计体会在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。这次毕业论文的制作过程是我的一次再学习,再提高的过程。在论文中我充分地运用了大学期间所学到的知识。我从资料的收集中,掌握了很多单片机、LED显示屏的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机、LED显示屏的最新发展技术有所了解。在整个过程中,我学到了新知识,增长了见识。在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。也练就了我们的耐心,做什么事都在有耐心。此次论文中学了很多很多东西,这是最重要的。我认为这个收获应该说是相当大的。一开始我们从参考书上找来了课题,但是毕竟是参考书,做到后来发现很多程序都是不完整的,这让我们伤透了脑筋。看着别的小组都弄得有模有样了,可是我们连一个课题都还没有定好。好不容易又找到了课题,可是结果还是很不尽人意。程序接线什么的都弄好了,调试也没有问题,可是就是无法达到预期想要的结果。参考书毕竟只是一个参考,设计这种东西最后还是要靠自己动脑筋。然后我们大家一起齐心协力,从平时做的实验老师上课的举例书本上的知识和其他同学的帮助下终于完成了。应该说这是通过我们小组成员的共同努力和动脑完成的,虽然内容并不是很复杂,但是我们觉得设计的过程相当重要,学到了很多,收获了很多。我觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。小组人员的配合相处,以及自身的动脑和努力,都是以后工作中需要的。参考文献:1 余发山,王福忠编著. 单片机原理及应用技术.徐州:中国矿业大学出版社,2008.2 陈奥初,窦振中等编著.单片机应用系统设计与实践.北京:北京航空航天大学出版社,1991.3陈伟人编著.MCS-51系列单片机实用子程序集锦M.北京:清华大学出版社.1993.附录附录一:程序源代码#include<reg52.h> #define uchar unsigned char#define uint unsigned intsbit E=P34;sbit RS=P35;sbit key1=P24;sbit key2=P25;sbit key3=P26;sbit key4=P27;sbit mbkey=P22;sbit beep=P23;uchar count,shi=1,fen=59,miao=58,key1num,flag,flag1,xqnum;/flag闹钟uchar key2num,jinzhi=3,naonum=1,ms,mbmiao,mbfen,mbkeynum,num; /ms秒表进数,mbmiao.mbfen秒表的秒.分 key2num是key5的计数 jinzhi进制转换参数uint nian=2009,yue=11,ri=19,count2;uchar code table=" 2012-6-06 WED"uchar code table1="24d 01:59:58 ON "uchar code table2="MON,TUE,WED,THU,FRI,SAT,SUN"uchar code table3="am ,pm ,24d"uchar code table4="ON ,OFF"uchar code table5=" 00:00:00 mb "void delay(uint z)uint x,y;for(x=z;x>0;x-)for(y=110;y>0;y-);void di(uint x) /蜂鸣器发声函数beep=0;delay(x);beep=1;void write_com(uchar com)/给写液晶命令RS=0;P0=com;delay(5);E=1;delay(5);E=0;void write_date(uchar date)/给液晶写数据RS=1;P0=date;delay(5);E=1;delay(5);E=0;void init() /初始化函数uchar num;E=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01);/清零write_com(0x80);for(num=0;num<16;num+)write_date(tablenum);delay(20);write_com(0x80+0x40);/第二行for(num=0;num<16;num+)write_date(table1num);delay(20);TMOD=0X01; TH0=(65536-50000)/256;TL0=(65536-50000)%256;EA=1;ET0=1;TR0=1;TH1=(65536-10000)/256;TL1=(65536-10000)%256;ET1=0;TR1=0;void write_nian(uchar add , uint date) /年显示函数 uchar qian,bai,shi,ge;qian=date/1000;bai=(date-1000*qian)/100;shi=(date-qian*1000-bai*100)/10;ge=date%10;write_com(0x80+add);write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge);void write_yue(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 write_ri(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 write_sfm(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 write_week(uchar week) /星期显示函数uchar week_num;week_num=week;switch(week_num)case 1:write_com(0x80+13);write_date(table20);write_date(table21);write_date(table22);write_com(0x80+13);break;case 2:write_com(0x80+13);write_date(table24);write_date(table25);write_date(table26);write_com(0x80+13);break;case 3:write_com(0x80+13);write_date(table28);write_date(table29);write_date(table210);write_com(0x80+13);break;case 4:write_com(0x80+13);write_date(table212);write_date(table213);write_date(table214);write_com(0x80+13);break;case 5:write_com(0x80+13);write_date(table216);write_date(table217);write_date(table218);write_com(0x80+13);break;case 6:write_com(0x80+13);write_date(table220);write_date(table221);write_date(table222);write_com(0x80+13);break;case 7:write_com(0x80+13);write_date(table224);write_date(table225);write_date(table226);write_com(0x80+13);break;void write_jinzhi(uchar jinzhi)/jinzhi进制 显示函数uchar jznum;jznum=jinzhi;switch(jznum)case 1:write_com(0x80+0x40+0);write_date(table30);write_date(table31);write_date(table32);write_com(0x80+0x40+0);break;case 2:write_com(0x80+0x40+0);write_date(table34);write_date(table35);write_date(table36);write_com(0x80+0x40+0);break;case 3:write_com(0x80+0x40+0);write_date(table38);write_date(table39);write_date(table310);write_com(0x80+0x40+0);break;void write_nao(uchar nao)/闹钟开关显示函数uchar naonum;naonum=nao;switch(naonum)case 1:write_com(0x80+0x40+13);write_date(table40);write_date(table41);write_date(table42);write_com(0x80+0x40+13);break;case 2:write_com(0x80+0x40+13);write_date(table44);write_date(table45);write_date(table46);write_com(0x80+0x40+13);break;void keyboard() /按键扫描函数if(flag=1)/闹钟暂停函数if(key4=0)delay(5);if(key4=0)while(!key4);beep=1;flag=0;if(key1=0)delay(5);/消斗if(key1=0)key1num+;while(!key1);/di(1);if(key1num=1)TR0=0;write_com(0x80+0x40+10);write_com(0x0f);/光标闪烁if(key1num=2)write_com(0x80+0x40+7);if(key1num=3)write_com(0x80+0x40+4);if(key1num=4) write_com(0x80+0x40);if(key1num=5) write_com(0x80+2);if(key1num=6) write_com(0x80+7);if(key1num=7) write_com(0x80+10);if(key1num=8) write_com(0x80+13);if(key1num=9) write_com(0x80+0x40+13);if(key1num=10)key1num=0;write_com(0x0c);/光标停止闪烁TR0=1;/打开定时器if(key1num!=0)if(key2=0)delay(5);if(key2=0)while(!key2);/等待松手di(100);if(key1num=1) miao+;if(miao=60)miao=0;write_sfm(10,miao);write_com(0x80+0x40+10);if(key1num=2)fen+;if(fen=60)fen=0;write_sfm(7,fen);write_com(0x80+0x40+7);if(key1num=3)shi+;if(jinzhi=3)if(shi=24)shi=0;elseif(shi>12)shi=shi-12;write_sfm(4,shi);write_com(0x80+0x40+4);if(key1num=4) jinzhi+; if(jinzhi=4) jinzhi=1; write_jinzhi(jinzhi); if(key1num=5) nian+; write_nian(2,nian); write_com(0x80+2); if(key1num=6) yue+; if(yue=13) yue=1; write_yue(7,yue); write_com(0x80+7); if(key1num=7) ri+;if(ri=32) ri=1;write_ri(10,ri);write_com(0x80+10); if(key1num=8) xqnum+; if(xqnum=8) xqnum=1; write_week(xqnum); if(key1num=9) naonum+; if(naonum=3) naonum=1; write_nao(naonum); if(key1num=10)key1num=0;write_com(0x0c);/光标停止闪烁TR0=1;/打开定时器 if(key3=0)delay(5);if(key3=0)while(!key3);di(100);if(key1num=1)miao-;if(miao=-1)miao=59;write_sfm(10,miao);write_com(0x80+0x40+10);if(key1num=2)fen-;if(fen=-1)fen=59;write_sfm(7,fen);write_com(0x80+0x40+7);if(key1num=3)shi-;/*if(shi=-1)shi=23;*/if(jinzhi=3)if(shi=-1)shi=23;elseif(shi<1)shi=shi+12;write_sfm(4,shi);write_com(0x80+0x40+4); if(key1num=4) jinzhi-; if(jinzhi=0) jinzhi=3; write_jinzhi(jinzhi); if(key1num=5) nian-; write_nian(2,nian); write_com(0x80+4); if(key1num=6) yue-; if(yue=0) yue=12; write_yue(7,yue); write_com(0x80+7);if(key1num=7) ri-; if(ri=0) ri=31; write_ri(10,ri); write_com(0x80+13);/*if(key1num=8) xqnum-; if(xqnum=0) xqnum=7; write_week(xqnum); write_com(0x80+10); if(key1num=9) naonum-; if(naonum=0) naonum=2; write_nao(naonum); write_com(0x80+0X40+13); */ void mbiao( ) /秒表函数 if(mbkey=0) mbkeynum+; while(!mbkey); if(mbkeynum=1) /关闭时钟定时器 TR0=0;ET0=0;write_com(0x80+0x40);for(num=0;num<16;num+) write_date(table5num);ms=0;mbmiao=0;mbfen=0; TR1=0;ET1=0; if(mbkeynum=2)/打开秒表定时器关闭时钟定时器 TR1=1;ET1=1;TR0=0;ET0=0; if(mbkeynum=3) /关闭秒表定时器 TR1=0;ET1=0;TR0=0;ET0=0; if(mbkeynum=4) /显示时钟状态打开时钟定时器 TR0=1;ET0=1;TR1=0;ET1=0;write_sfm(10,miao);write_sfm(7,fen);write_sfm(4,shi);write_jinzhi(jinzhi);write_com(0x80+0x40+13);write_date(' ');write_date('O');write_date('N');mbkeynum=0; void main()init();while(1)keyboard(); mbiao();if(count=20)/液晶变化count=0;miao+

    注意事项

    本文(苏州某学院单片机课程设计可编程作息时间控制器程序设计.doc)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开