《单片机技术课程设计(论文)电子万历设计.doc》由会员分享,可在线阅读,更多相关《单片机技术课程设计(论文)电子万历设计.doc(25页珍藏版)》请在三一办公上搜索。
1、 单片机技术课程设计说明书摘 要本设计是基于51系列的单片机设计的电子万年历 ,可以显示年月日时分秒及星期等功能。设计过程中不但对单片机的理论基础而且外围扩展知识都进行了比较全面的准备。具备三个功能:(1) 显示年月日时分秒及星期(2) 具有可调整日期和时间功能(3) 具有闹钟设置功能关键词 单片机;AT89S52芯片;矩阵式键盘Abstract The design is based on 51 series of microcontrollers designed electronic calendar, you can show date and time every second we
2、ek, and other functions. The design process, not only the theoretical basis for microcontroller and peripheral expansion of knowledge and have conducted a more comprehensive preparation. Has three functions: (A) shows the date when the minutes and seconds, and weeks (2) The date and time functions w
3、ith adjustable (3) has set the alarm clock function Key words:SCM; AT89S52 chip; Matrix Keyboard 目 录1 设计任务及方案11.1 设计课题任务11.2 功能要求1 1.3 设计课题总体方案介绍及工作原理说明1 1.3.1 总体方案介绍1 1.3.2 工作原理说明12 万年历硬件系统的设计22.1 万年历硬件系统各模块功能简要介绍2 2.1.1 系统原理框图2 2.1.2 单片机最小系统2 2.1.3 显示电路2 2.1.4 行列式键盘32.2 万年历电路原理图、PCB图、元器件布局图32.3 设计
4、元器件清单33 万年历软件系统的设计43.1 万年历使用单片机资源的情况43.2 万年历软件系统各模块功能简要介绍4 3.2.1 显示模块43.3 设计课题软件系统程序流程框图53.4 万年历程序清单74 仿真、万年历说明、误差分析及总结84.1 设计结论及万年历使用说明8 4.1.1 时间设置84.2 PROTEUS软件仿真84.3 误差分析及调整84.4 设计体会84.5 教学建议8参考文献9致谢10附录111 设计任务及方案1.1 设计课题任务设计一个具有日期.时间.星期功能的电子钟,并可以调整时间和设置闹钟等功能。1.2 功能要求正确显示时间和日期,具备准确的计时功能,并且有启动和暂停
5、功能。使用行列式键盘来控制它的启动、暂停和修改日期和时间,以达到准确无误地计时和显示日期和时间的目的。用FYD128640402液晶模块的自带字库实现,显示方便,大小适宜,显示程序简单等特点。1.3 设计课题总体方案介绍及工作原理说明1.3.1 总体方案介绍这次设计选用的是单片机(AT89S52)来实现电子万年历的功能。共具备两个功能:(1)显示年月日及分秒信息(2)具有可调整日期和时间功能。该电子万年历能够成功实现时钟运行,调整功能,且精确度经调试一天的误差在2S内。1.3.2 工作原理说明将AT89S52芯片作为内核,运用单片机定时器功能,当所设定时间截止,执行中断程序,实现时钟的调整。通
6、过P0口输送数据到液晶显示模块使它同步显示时钟的变化。判键执行子程序,通过矩阵式键盘调节时间和设置闹钟。当闹钟设定时间等于同步时间,蜂鸣器持续响60秒。通过反复测试有24小时的时间误差,每天12点自动调整误差,从而达到精准计时的目的。2 万年历硬件系统的设计2.1 万年历硬件系统各模块功能简要介绍2.1.1 硬件系统原理框图如图2.1所示:图2.1系统原理框图2.1.2 单片机最小系统AT89S52 是标准的40引脚双列直插式集成电路芯片,有4个I/O口分别为P0,P1,P2,P3。MCS-51单片机共有4个8位的I/O口分别为P0、P1、P2、P3,每一条I/O线都能独立地作输出或输入。2.
7、1.3 显示电路接口信号说明如表2所示:表2.1 接口信号序号符号引脚说明型号符号引脚说明1VSS电源地DB512DataI/O2VDD电源正极DB613DataI/O3VO液晶显示偏压输入DB714DataI/O4RS数据/命令选择端CS115片选IC1信号5R/W读写控制信号CS216片选IC2信号6E使能端RST17复位端7DB0DataI/OVEE18负电源输出8DB1DataI/ONC19空脚9DB2DataI/ONC20空脚10DB3DataI/OBLA21背光电源正极11DB4DataI/OBLK22背光电源负极2.1.4 行列式键盘在键盘中按键数量较多时,为了减少I/O口的占用
8、,通常将按键排列成矩阵形式,在这次设计中一共采用16个按键,直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显。2.2 万年历原理图.PCB图.元器件布局图原理图、PCB图及元器件布局图见附录1,2,32.3 元器件清单元器件清单见附录43 万年历软件系统的设计3.1 万年历使用单片机资源的情况本设计将P1口作为行列式键盘与单片机之间的接口,用P0口作为液晶显示的数据传送口,用定时计数器1作为定时中断。3.2 万年历软件系统各模块功能简要介绍3.2.1 显示模块基本显示模块设计的重点是由显示代码取得相应的段码、显示段码数据的串行发送。FYD128640402显示模块的时序图(读操作时序和
9、写操作时序)如图3.1,3.2所示:图3.1 显示模块读操作时序图图3.2 显示模块写操作时序图3.2.2 行列式键盘行列式键盘的按键识别方法称为行扫描法,行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。判断键盘中有无键按下,检查方法:将全部行线置低电平,然后检测列线的状态。只要有一列的电平置为低,则表示键盘中有键按下,且闭合的键位于低电平与4根行线相交叉的4按键位置。若所有列线均为高电平,则可证明无键按下。判断闭合键所在的位置有无键按下,即可确定具体闭合键。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线均为高电平。在确定某根行线位置为低电平后,再逐行检测各
10、列线的电平状态。若某列显示为低电平,则该列线与置为低电平的行线交叉处的按键即为闭合的按键。3.3 软件系统程序流程框图系统程序流程框图包括主程序流程框图,时间调整流程图和行列式键盘流程图,分别如图3.3,3.4,3.5所示:图3.3 主程序流程图图3.4 时间调整程序框图图3.5 行列式键盘程序流程框图3.4 程序清单见附录54 设计结论、仿真结果、误差分析、教学建议4.1 设计结论及使用说明本次设计万年历在经过反复测试后,功能基本完成。4.1.1 时间设置开机按C键时钟开始计时,按D键停止;按年加一;按1则年份减一;按2月份数加一;按3则月份减一;按4天数加一;按5则天数减一;按6小时数加一
11、;按7则小时数减一;按8分钟加一;按9分钟减一;按A星期加一;按B星期减一。按C则复位重新开始计时。4.2 Proteus仿真结果对程序进行编译,在软件的帮助下检查其中的错误并进行反复修改,显示结果准确无误,仿真结果非常成功。4.3 误差分析该电子万年历能够成功实现时钟运行,调整功能,且精确度经调试一天的误差在2S内。4.4 设计体会通过这两周的课程设计,我学到了不少的知识。加深了我对于单片机和数字电路的认识,相信在以后的学习和工作中碰到这些基础的元器件我会更加得心应手。本课程设计的重要在于原理图的设计、PCB的生成和硬件的调试,和程序的编写。设计过程中,我很认真地对待每一个细节,希望自己能做
12、得更好。希望今后还有这样的机会,能够让我学到更多的知识。4.5 教学建议经过上学期的单片机课程学习,我学到了很多以前未接触过的新知识,根据个人学习情况,对单片机的教学提出两点建议: 一、单片机课程的指令繁多,容易混淆,建议王老师在讲解指令系统时,指出这些指令的区别和注意事项,发一些资料给我们参考与学习,多举实例,进一步激发我们学习这门课程的兴趣。二、上课时要多提问,给予每位同学同等的机会回答,学到更多的知识。参考文献李广弟,朱月秀,冷祖祁.单片机基础.北京:北京航空航天大学版社,2008.12Li guangdi,Zhu yuexiu,Len zhuqi. Microcontroller ba
13、sed.Beijing: Beijing University of Aeronautics and Astronautics Press,2008.12(in Chinese)2马忠梅.单片机的C语言应用程序设计.北京:北京航空航天大学版社,2008.2Ma zhongmei.SCM C-Language Application Programming.Beijing: Beijing University of Aeronautics and Astronautics Press,2008.2(in Chinese)3B2B99.矩阵式键盘的结构及工作原理EB/OL4曹巧媛,单片机原理及应
14、用M,北京:电子工业出版社,1997.7Cao qiaoyuan.SCM Principle and Application.Beijing: Electronic industry Press,1997.7(in Chinese)致 谢大学三年已经进行过3次课程设计,经过老师的指导和自己的设计,对这次单片机课程设计万年历充满信心。在本次设计过程中,虽然遇到一些问题,最终在全组人员的努力下成功解决。在这里我衷心感谢我们的组长胡代军同学,在他的带领和引导之下,我们的设计才取得了圆满的成功。他学习刻苦勤奋,助人为乐给我们的设计提供很大的帮助,此次设计顺利完成。最后要感谢我们的课程设计指导老师王韧,
15、由于他的认真负责,使得我们在整个设计过程中不敢有丝毫的怠慢和松懈,不仅在设计过程中学会了怎样将理论与实践相结合,而且懂得了做人要严谨,做事要认真。附录1附录2附录3附录4Part TypeDesignatorFootprintAT89S52U1DIP401KR13AXIAL0.4CON2J4SIP21KR2AXIAL0.4CON4J1SIP41kR12AXIAL0.4CON8JP4SIP84.7KR7AXIAL0.4CON8JP3SIP84.7KR10AXIAL0.4CON8JP1SIP84.7KR9AXIAL0.4CON8JP2SIP84.7KR8AXIAL0.4CON9D9RAD0.110
16、KR17AXIAL0.4CON9J5SIP911.0592MHZY1XTAL1CON9S2按钮22FC3RAD0.1CON9S1按钮24C04u4DIP8CON9S3按钮33PFC1RAD0.1CON9S4按钮33PFC2RAD0.1CON9S5按钮470R00AXIAL0.4CON20J6SIP20470R01AXIAL0.4DYKGS?开关470R26AXIAL0.4ISPISPISP470R25AXIAL0.4LED4LED2数码管470R27AXIAL0.4LED4LED1数码管470R03AXIAL0.4PNPQ6TO-52470R07AXIAL0.4PNPQ5TO-52470R02
17、AXIAL0.4PNPQ7TO-52470R06AXIAL0.4PNPQ9TO-52470R04AXIAL0.4PNPQ8TO-52470R05AXIAL0.4PNPQ4TO-52470R21AXIAL0.4PNPQ1TO-52470R20AXIAL0.4PNPQ2TO-52470R1AXIAL0.4PNPQ3TO-52470R24AXIAL0.4POT1R18SIP3470R23AXIAL0.4SPEAKERLS1AXIAL0.3470R22AXIAL0.4AT89S52U1DIP40Part TypeDesignatorFootprintCON2J4SIP2附录5#include#defi
18、ne uint unsigned int#define uchar unsigned charsbit rs=P20;sbit rw=P21;sbit psb=P23;sbit ret=P25;sbit E=P22;void clear(void);void lcd_ini(void);void delay(uchar m);void display(); void wrda(uchar da);void busy(void);void wrir(uchar com);void ini1(void);void display_y(void);void ini(void);void proces
19、s(void);void change(void);void week1(void); void start(void); uchar disdata=0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0xc4,0xea,0xd4,0xc2,0xc8,0xd5,0x3a,; / 0-9,年,月,日,: 的液晶代码uchar pp=0,0,0,0,10,11,0,0,12,13,0,0,14,15,0,0,16,0,0,16,0,0; / 年月日时分秒数组uchar a=0xd0,0xc7,0xc6,0xda,0,0; / 星期数组uchar y
20、f=32,29,32,31,32,31,32,32,31,32,31,32; / 每月天数uint year=2009,p=0,k=0;uchar month=10,day=23,hour=08,minite=08,second=0,counter=0,c=0,week=1;void main(void) lcd_ini(); ini(); clear(); ini1(); TR0=0; start(); process(); while(1) display();void lcd_ini(void) /液晶复位 ret=0; delay(10); ret=1; delay(2); psb=1
21、; delay(10);void ini(void) /液晶初始化 wrir(0x34); wrir(0x30); wrir(0x01); wrir(0x06); wrir(0x0c);void wrir(uchar com) /液晶写指令 busy(); rs=0; rw=0; P0=com; E=1; delay(50); E=0;void busy(void) /液晶判忙 rw=1; rs=0; P0=0xff; E=1; while(P07); E=0;void wrda(uchar da) /液晶写数据 busy(); rs=1; rw=0; P0=da; E=1; delay(30
22、); E=0;void clear(void) /清屏 wrir(0x01); wrir(0x34); wrir(0x30);void delay(uchar ms) /延时 uchar i; while(-ms) for(i=0;i120;i+); void ini1(void) /定时器初始化 TMOD=0x01; TH0=(65536-46080)/256; TL0=(65536-46080)%256; ET0=1; EA=1;void start(void) wrir(0x83); wrda(0xcd); /万 wrda(0xf2); wrda(0xc4); /年 wrda(0xea)
23、; wrda(0xc0); /历 wrda(0xfa);void process(void) / 年月日处理 if(year%4=0) /润年判断进行二月天数处理 yf1=30; else yf1=29; pp0=year/1000%10; pp1=year/100%10; pp2=year/10%10; pp3=year%10; pp6=month/10%10; pp7=month%10; pp10=day/10%10; pp11=day%10; pp14=hour/10%10; pp15=hour%10; pp17=minite/10%10; pp18=minite%10; pp20=se
24、cond/10%10; pp21=second%10; week1(); display_y();void week1(void) /星期处理 switch(week) case 1: a4=0xd2;a5=0xbb;break; /星期一 case 2: a4=0xb6;a5=0xfe;break; /星期二case 3: a4=0xc8;a5=0xfd;break; /星期三case 4: a4=0xcb;a5=0xc4;break; /星期四case 5: a4=0xce;a5=0xe5;break; /星期五case 6: a4=0xc1;a5=0xf9;break; /星期六case
25、 7: a4=0xc8;a5=0xd5;break; /星期日 void display_y(void) / 显示程序 uchar j,h,q; wrir(0x91); / 显示年月日 for(j=0;j14;j+) wrda(disdatappj); wrir(0x8a); /显示时分秒 for(h=14;h22;h+) wrda(disdatapph); wrir(0x9b); /显示星期 for(q=0;q6;q+) wrda(aq);uchar key(void) /判键 uchar H,L; P1=0xf0; if(P1&0xf0)!=0xf0) delay(30); if(P1&0
26、xf0)!=0xf0) H=0xfe; while(H&0x10)!=0) P1=H; if(P1&0xf0)!=0xf0) L=(P1&0xf0)|0x0f; return(H)|(L); else H=(H1)|0x01; return(0);void display(void) /键值处理 uchar x; x=key(); switch(x) case 0x11: year+; if(year=2100) year=2009; while(1) process(); if(P10=1) break;break; /年加一 case 0x21: year-; if(year=2000)
27、year=2009; while(1) process(); if(P10=1) break;break; /年减一 case 0x41: month+; if(month=13) month=1; while(1) process(); if(P10=1) break;break; /月加一 case 0x81: month-; if(month=0) month=12; while(1) process(); if(P10=1) break;break; /月减一 case 0x12: day+; if(day=yfmonth-1) day=1; while(1) process(); i
28、f(P10=1) break;break; /日加一 case 0x22: day-; if(day=0) day=yfmonth-1-1; while(1) process(); if(P10=1) break;break; /日减一 case 0x42: hour+; if(hour=24) hour=0; while(1) process(); if(P10=1) break;break; /时加一 case 0x82: hour-; if(hour=0) hour=23; while(1) process(); if(P10=1) break;break; /时减一 case 0x14
29、: minite+; if(minite=60) minite=0; while(1) process(); if(P10=1) break;break; /分加一 case 0x24: minite-; if(minite=0) year=59; while(1) process(); if(P10=1) break;break; /分减一 case 0x44: week+; if(week=8) week=1; while(1) process(); if(P10=1) break;break; /星期加一 case 0x84: week-; if(week=0) week=7; whil
30、e(1) process(); if(P10=1) break;break; /星期减一 case 0x18: TR0=1; while(1) process();if(key()=0x28) break; TR0=0;break; /C键开始计时 ;D键暂停 调节时间void Timer_0(void)interrupt 1 using 2 /中断处理 TH0=(65536-46080)/256; TL0=(65536-46080)%256; counter+; if(counter=20) counter=0; second+; if(second=60) second=0; minite+; if(minite=60) minite=0; hour+; if(hour=24) hour=0; day+; week+; if(week=8) week=1; if(day=yfmonth-1) day=1; month+;if(month=13) month=1; year+; if(year=2100) year=2009;