苏州科技学院单片机课程设计可编程作息时间控制器程序设计.docx
- 文档编号:25510817
- 上传时间:2023-06-09
- 格式:DOCX
- 页数:36
- 大小:148.09KB
苏州科技学院单片机课程设计可编程作息时间控制器程序设计.docx
《苏州科技学院单片机课程设计可编程作息时间控制器程序设计.docx》由会员分享,可在线阅读,更多相关《苏州科技学院单片机课程设计可编程作息时间控制器程序设计.docx(36页珍藏版)》请在冰豆网上搜索。
苏州科技学院单片机课程设计可编程作息时间控制器程序设计
苏州科技学院天平学院
单片机课程设计报告
作息时间控制器设计
姓名:
王亚明
学号:
0930117114
专业班级:
电气0921
指导老师:
徐树梅
2012年6月2日
第一部分概述
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如下所示:
图1
2.2系统各个部分的电路设计:
1、系统复位电路的设计:
单片机系统一般应有手动或上电复位电路。
复位电路的实现通常有两种方式:
1)RC复位电路;2)专用µP监控电路。
前者实现简单,成本低,但复位可靠性相对较低;后者成本较高,但复位可靠性高,尤其是高可靠重复复位。
对于复位要求高、并对电源电压进行监视的场合,大多采用这种方式。
复位电路主要用来在单片机的程序进入死循环后,能使单片机重新从头执行程序而不会无休止的执行程序。
本设计采用了上电按钮电平复位电路,如图2
图2
2、系统时钟电路设计:
对于时间要求不是很高的系统,只要按图进行设计就能使系统可靠起振并稳定运行。
但由于实际工作过程中的C1、C2电容起着系统时钟频率微调和稳定的作用,因此,在实际应用中一定要注意正确选择参数(30±10PF),并保证对称性(尽可能匹配),这两个电容元件对闹钟的走时误差有很大关系,并且选用正规的瓷片或云母电容,如果可能的话,温度系数要尽可能低。
另外,瓷片电容的实际焊接距离不应该离单片机太远否则误差较大。
具体的时钟电路如图三所示:
图3
3、声光指示电路设计:
声光指示可以有声或光两种形式。
本系统采用声音和光混合指示。
关键元件是蜂鸣器和发光二极管。
闹钟电路是用比较器来比较计时系统和定时系统的输出状态,如果计时系统和定时系统的输出状态相同,则发出一个脉冲信号,再和一个高频信号混合,送到放大电路驱动扬声器发声,从而实现定时闹响的功能。
其电路设计参见系统原理图。
4、显示电路的设计:
本设计采用了4位数码管显示电路。
在4位LED显示时,为了简化电路,降低成本,采用动态显示的方式,4个LED显示器共用一个8位的I/O,4位LED数码管的位选线分别由相应的P2.2~P2.5控制,而将其相应的段选线并联在一起,由一个8位的I/O口控制,即P0口。
由于采用了四位数码管,所以数码管显示“时”、“分”;秒的显示选用了一个发光二极管,两灭周期为两秒,即点亮和熄灭时间均为一秒。
到达定时时间时,由计时系统的输出状态产生一脉冲信号,然后去触发蜂鸣器实现闹铃。
校时电路是用来对“时”、“分”、“秒”显示数字进行校对调整的。
具体的电路设计如图4示:
图4
5、定时和调时电路的设计:
本设计因为使用到的键数目比较少,不宜采用矩阵式键盘,采用了功能直观简洁方便的独立式键盘,而且考虑了键盘的消抖问题。
比较容易理解。
每个键的具体功能如下:
K1设置时间;K2加一;K3,减一;K4;声光控制开关。
按键定义如图5所示:
图5
第三部分软件的设计
3.1概述:
软件设计的重点在于秒脉冲信号的产生、显示的实现、以及按键的处理等方面。
基于软件的秒脉冲信号通常有延时法和定时中断法。
延时法一般采用查询方式,在延时子程序前后必然需要查询和处理的程序,导致误差的产生,因此其秒脉冲的精度不高;中断法的原理是,利用单片机内部的定时器溢出中断来实现。
本设计使定时器每50ms中断1次,则20次的周期为1s。
这种实现法的特点是精度高,秒脉冲的发生和其他处理可以并行进行。
本系统中所使用的晶振频率为12MHZ。
3.2主模块的设计:
主模块是系统软件的主框架。
结构化程序设计一般有“自上而下”和“自下而上”两种方式,“自上而下”法的核心就是主框架的构建。
它的合理与否关系到程序最终的功能的多少和性能的好坏。
本系统的主模块的程序框图如下图6所示:
图6
3.3显示模块设计:
显示是由显示代码取得相应的段码,显示段码数据的并行发送,用LED显示器代替指针显示进而显示时间,减小了计时误差,这种表具有时,分,秒显示时间的功能,还可以进行时和分的校对,片选的灵活性好。
程序流程如图7所示。
图七
3.4时间设定模块设计:
时间设定模块的设计要点是按键的去抖处理与多种状态公用一个键的处理问题。
即只涉及4个键完成了4位时间参数的设定。
软件法去抖动的实质是用延时,即检测到某一键状态变化后延时一段时间,再检测该按键的状态是否还保持着,如是则作为按键处理,否则,视为抖动,不予理睬。
去抖中的延时时间一般参考资料多描述为10ms左右,实际应用中,应大于20ms,否则,会导致按一次作多次处理,影响程序正常执行。
按键消抖流程图原理如图8所示:
图8
3.5声光功能的实现:
闹铃功能的实现涉及到两个方面:
闹铃时间设定和是否闹铃判别与相应处理。
闹铃时间设定模块的设计可参照时间设定模块,这里着重阐述闹铃判别与处理模块的设计问题。
闹铃判别与闹铃处理的关键在于判别何时要进行闹铃。
在每次循环扫描的过程中,判断现在的时间和定时的时间是否一致。
一致的话,闹铃电路根据计时系统的输出状态产生一脉冲信号,然后加上一个高频或低频信号送到放大电路驱动蜂鸣器发声实现报时。
时间调节电路根据不同状态下的具体按键意义将相对应的计数器加以改变,并通过数码管显示出来。
第四部分Proteus软件仿真
本次课程设计所采用的程序调试软件为wave6000集成调试软件,所采用的仿真软件为proteusprofessional软件。
本设计在Proteus软件上进行了仿真,实现了设计所要求的具体内容。
4.1仿真结果:
1、启动初值(如图9)
图9
2、声光控制报警(如图10)
图10
3、定时响铃功能(如图11)
图11
4.2性能及误差分析:
该作息时间控制器有四个按键:
K1,K2,K3和K4。
初始加电时数码管显示时钟计数初值并运行。
按K1键进行校时,可以分别按K2和K3键进行对时及分进行单独校时,使其校正到标准时间;并按K4键退出。
时钟正常显示运行状态时,按K2键显示闪烁并进行定时时间设置,按K1键和K3进行分和时的定时时间设定;并按K4键退出。
该电路显示的误差主要由晶振自身的误差所造成,晶振的误差约为0.0001~0.000001。
在软件的编程过程中所产生的误差比较小,另外在中断的过程中,只会在第一次计时时产生时间的偏移,而它所产生累计误差很小,可以忽略。
综合以上分析,本次设计时钟误差较小,能得到比较理想结果,性能稳定。
第五部分课程设计体会
在整个设计过程中,充分发挥人的主观能动性,自主学习,学到了许多没学到的知识。
这次毕业论文的制作过程是我的一次再学习,再提高的过程。
在论文中我充分地运用了大学期间所学到的知识。
我从资料的收集中,掌握了很多单片机、LED显示屏的知识,让我对我所学过的知识有所巩固和提高,并且让我对当今单片机、LED显示屏的最新发展技术有所了解。
在整个过程中,我学到了新知识,增长了见识。
在今后的日子里,我仍然要不断地充实自己,争取在所学领域有所作为。
脚踏实地,认真严谨,实事求是的学习态度,不怕困难、坚持不懈、吃苦耐劳的精神是我在这次设计中最大的收益。
我想这是一次意志的磨练,是对我实际能力的一次提升,也会对我未来的学习和工作有很大的帮助。
在此次设计中,知道了做凡事要有一颗平常的心,不要想着走捷径,一步一脚印。
也练就了我们的耐心,做什么事都在有耐心。
此次论文中学了很多很多东西,这是最重要的。
我认为这个收获应该说是相当大的。
一开始我们从参考书上找来了课题,但是毕竟是参考书,做到后来发现很多程序都是不完整的,这让我们伤透了脑筋。
看着别的小组都弄得有模有样了,可是我们连一个课题都还没有定好。
好不容易又找到了课题,可是结果还是很不尽人意。
程序接线什么的都弄好了,调试也没有问题,可是就是无法达到预期想要的结果。
参考书毕竟只是一个参考,设计这种东西最后还是要靠自己动脑筋。
然后我们大家一起齐心协力,从平时做的实验﹑老师上课的举例﹑书本上的知识和其他同学的帮助下终于完成了。
应该说这是通过我们小组成员的共同努力和动脑完成的,虽然内容并不是很复杂,但是我们觉得设计的过程相当重要,学到了很多,收获了很多。
我觉得课程设计反映的是一个从理论到实际应用的过程,但是更远一点可以联系到以后毕业之后从学校转到踏上社会的一个过程。
小组人员的配合﹑相处,以及自身的动脑和努力,都是以后工作中需要的。
参考文献:
[1]余发山,王福忠编著.单片机原理及应用技术.徐州:
中国矿业大学出版社,2008.
[2]陈奥初,窦振中等编著.单片机应用系统设计与实践.北京:
北京航空航天大学出版社,1991.
[3]陈伟人编著.MCS-51系列单片机实用子程序集锦[M].北京:
清华大学出版社.1993.
附录
附录一:
程序源代码
#include
#defineucharunsignedchar
#defineuintunsignedint
sbitE=P3^4;
sbitRS=P3^5;
sbitkey1=P2^4;
sbitkey2=P2^5;
sbitkey3=P2^6;
sbitkey4=P2^7;
sbitmbkey=P2^2;
sbitbeep=P2^3;
ucharcount,shi=1,fen=59,miao=58,key1num,flag,flag1,xqnum;//flag闹钟
ucharkey2num,jinzhi=3,naonum=1,ms,mbmiao,mbfen,mbkeynum,num;//ms秒表进数,mbmiao.mbfen秒表的秒.分key2num是key5的计数jinzhi进制转换参数
uintnian=2009,yue=11,ri=19,count2;
ucharcodetable[]="2012-6-06WED";
ucharcodetable1[]="24d01:
59:
58ON";
ucharcodetable2[]="MON,TUE,WED,THU,FRI,SAT,SUN";
ucharcodetable3[]="am,pm,24d";
ucharcodetable4[]="ON,OFF";
ucharcodetable5[]="00:
00:
00mb";
voiddelay(uintz)
{
uintx,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
voiddi(uintx)//蜂鸣器发声函数
{
beep=0;
delay(x);
beep=1;
}
voidwrite_com(ucharcom)//给写液晶命令
{
RS=0;
P0=com;
delay(5);
E=1;
delay(5);
E=0;
}
voidwrite_date(uchardate)//给液晶写数据
{
RS=1;
P0=date;
delay(5);
E=1;
delay(5);
E=0;
}
voidinit()//初始化函数
{
ucharnum;
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(table[num]);
delay(20);
}
write_com(0x80+0x40);//第二行
for(num=0;num<16;num++)
{
write_date(table1[num]);
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;
}
voidwrite_nian(ucharadd,uintdate)//年显示函数
{
ucharqian,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);
}
voidwrite_yue(ucharadd,uchardate)//月显示函数
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_ri(ucharadd,uchardate)//日显示函数
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_sfm(ucharadd,uchardate)//秒显示函数
{
ucharshi,ge;
shi=date/10;
ge=date%10;
write_com(0x80+0x40+add);
write_date(0x30+shi);
write_date(0x30+ge);
}
voidwrite_week(ucharweek)//星期显示函数
{
ucharweek_num;
week_num=week;
switch(week_num)
{
case1:
write_com(0x80+13);
write_date(table2[0]);
write_date(table2[1]);
write_date(table2[2]);
write_com(0x80+13);
break;
case2:
write_com(0x80+13);
write_date(table2[4]);
write_date(table2[5]);
write_date(table2[6]);
write_com(0x80+13);
break;
case3:
write_com(0x80+13);
write_date(table2[8]);
write_date(table2[9]);
write_date(table2[10]);
write_com(0x80+13);
break;
case4:
write_com(0x80+13);
write_date(table2[12]);
write_date(table2[13]);
write_date(table2[14]);
write_com(0x80+13);
break;
case5:
write_com(0x80+13);
write_date(table2[16]);
write_date(table2[17]);
write_date(table2[18]);
write_com(0x80+13);
break;
case6:
write_com(0x80+13);
write_date(table2[20]);
write_date(table2[21]);
write_date(table2[22]);
write_com(0x80+13);
break;
case7:
write_com(0x80+13);
write_date(table2[24]);
write_date(table2[25]);
write_date(table2[26]);
write_com(0x80+13);
break;
}
}
voidwrite_jinzhi(ucharjinzhi)//jinzhi进制显示函数
{
ucharjznum;
jznum=jinzhi;
switch(jznum)
{
case1:
write_com(0x80+0x40+0);
write_date(table3[0]);
write_date(table3[1]);
write_date(table3[2]);
write_com(0x80+0x40+0);
break;
case2:
write_com(0x80+0x40+0);
write_date(table3[4]);
write_date(table3[5]);
write_date(table3[6]);
write_com(0x80+0x40+0);
break;
case3:
write_com(0x80+0x40+0);
write_date(table3[8]);
write_date(table3[9]);
write_date(table3[10]);
write_com(0x80+0x40+0);
break;
}
}
voidwrite_nao(ucharnao)//闹钟开关显示函数
{
ucharnaonum;
naonum=nao;
switch(naonum)
{
case1:
write_com(0x80+0x40+13);
write_date(table4[0]);
write_date(table4[1]);
write_date(table4[2]);
write_com(0x80+0x40+13);
break;
case2:
write_com(0x80+0x40+13);
write_date(table4[4]);
write_date(table4[5]);
write_date(table4[6]);
write_com(0x80+0x40+13);
break;
}
}
voidkeyboard()//按键扫描函数
{
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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 苏州 科技学院 单片机 课程设计 可编程 作息 时间 控制器 程序设计