单片机原理及应用课程设计.docx_第1页
单片机原理及应用课程设计.docx_第2页
单片机原理及应用课程设计.docx_第3页
单片机原理及应用课程设计.docx_第4页
单片机原理及应用课程设计.docx_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

此文档收集于网络,如有侵权,请联系网站删除单片机原理及应用课程设计报告电子万年历设计专 业: 班 级: 姓 名: 学 号: 指导教师: 2011年X月X日1.课程设计目的1.1巩固和加深对单片机原理和接口技术知识的理解;1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。2.课程设计要求2.1 制作一个可以显示年月日时间的万年历2.2 可以设置时间日期2.3 以月历的方式显示日期2.4 当前日期反显标出2.5 时间和日期的字体不一致,以便区分3. 硬件设计3.1 以单片机为计算核心,外加3个按键和一块显示器完成整个电路3.2 AT89C52单片机为核心(51单片机程序存储空间不够用),功能及引脚配置同52单片机。 以Nokia3310L黑白液晶屏为显示模块,该模块具有引脚少,功能简单实用价格便宜等优点。该模块采用串行通信的方式传递数据。3.3 电路设计如下图中R1R5为上拉电阻,为保证P0.0P0.4的端口的输出电压足够驱动显示模块。R6R8为下拉电阻起到同样的功能。实际测试仿真是因为未接入上拉电阻而导致显示模块没有输出的情况造成了很大的干扰。3个按钮为操作按钮,用于设置时间日期。4. 软件设计4.1 万年历的基本流程为定时、计数,然后进行时间的运算,时分秒的运算十分便捷,闰年和大小月的运算稍有繁琐,主要困难的在于星期的计算。所以本程序采用计算和标记每月第一日的星期来简化计算。所有的数据计算结束后,单片机就从P0的部分端口上向显示模块输出信号。4.2.1总流程4.2.2主函数部分4.2.3中断函数部分4.2.4日期和时间显示流程图4.3 源程序源代码#include #include sbit sc=P04;sbit sclk=P02;sbit d_c=P00;sbit sdin=P01;sbit reset=P03;sbit set_ok_set=P05;sbit set_next_bit=P06;sbit set_change=P07;unsigned char sec,min,hour,day,mon,year,week,firstweek,max_day;unsigned long count;bit setORrun;unsigned char maxday(unsigned char mo)if(mo=2) & (year%4 != 0)return(28);if(mo=2) & (year%4 = 0)return(29);if(mo=4) | (mo=6) | (mo=9) | (mo=11)return(30);return(31);void datout(unsigned char dat)/输出函数unsigned char i;for(i=0;i8;i+)sclk=0;sdin=(dat&0x80)/80;sclk=1;dat=dat1;void time2char(unsigned char i) /时间转换成点整字符输出 unsigned char j;unsigned char k5;switch(i)case 0:k0=0x7F;k1=0x7F;k2=0x41;k3=0x7F;k4=0x7F;break;case 1:k0=0x64;k1=0x66;k2=0x7f;k3=0x7F;k4=0x60;break;case 2:k0=0x7b;k1=0x7b;k2=0x49;k3=0x6F;k4=0x6F;break;case 3:k0=0x63;k1=0x6b;k2=0x49;k3=0x7F;k4=0x7F;break;case 4:k0=0x0F;k1=0x0F;k2=0x08;k3=0x7F;k4=0x7F;break;case 5:k0=0x6F;k1=0x6F;k2=0x49;k3=0x7b;k4=0x7b;break;case 6:k0=0x7F;k1=0x7F;k2=0x49;k3=0x7b;k4=0x7b;break;case 7:k0=0x03;k1=0x03;k2=0x01;k3=0x7F;k4=0x7F;break;case 8:k0=0x7F;k1=0x7F;k2=0x49;k3=0x7F;k4=0x7F;break;case 9:k0=0x6F;k1=0x6F;k2=0x49;k3=0x7F;k4=0x7F;sc=0; /转换结束输出d_c=1;for(j=0;j5;j+)datout(kj);void reshow1(unsigned char show_min,unsigned char show_hour) /更新时间显示unsigned char highbit,lowbit;highbit=show_hour/10; /小时输出lowbit=show_hour%10;sc=0;d_c=0;datout(0x20);/坐标输出datout(0x41);datout(0x81);time2char(highbit);/小时高位datout(0x00);time2char(lowbit); /小时低位datout(0x00);datout(0x66); /中间分隔符输出datout(0x66);datout(0x00);highbit=show_min/10;/分钟输出lowbit=show_min%10;time2char(highbit);/分钟高位datout(0x00);time2char(lowbit);/分钟低位void day2char(unsigned char i,unsigned char l,unsigned char show_day)unsigned char j,k3; switch(i)case 0:k0=0x7F;k1=0x41;k2=0x7F;break;case 1:k0=0x42;k1=0x7f;k2=0x40;break;case 2:k0=0x79;k1=0x49;k2=0x4F;break;case 3:k0=0x49;k1=0x49;k2=0x7F;break;case 4:k0=0x0F;k1=0x08;k2=0x7F;break;case 5:k0=0x4F;k1=0x49;k2=0x79;break;case 6:k0=0x7F;k1=0x49;k2=0x79;break;case 7:k0=0x01;k1=0x01;k2=0x7F;break;case 8:k0=0x7F;k1=0x49;k2=0x7F;break;case 9:k0=0x4F;k1=0x49;k2=0x7F;d_c=1;for(j=0;j3;j+)if(l=show_day)datout(kj0xff);else if(l=show_day-7)datout(kj|0x80);else datout(kj);void ym2char(unsigned char i)unsigned char j,k3; switch(i)case 0:k0=0x7F;k1=0x41;k2=0x7F;break;case 1:k0=0x42;k1=0x7f;k2=0x40;break;case 2:k0=0x79;k1=0x49;k2=0x4F;break;case 3:k0=0x49;k1=0x49;k2=0x7F;break;case 4:k0=0x0F;k1=0x08;k2=0x7F;break;case 5:k0=0x4F;k1=0x49;k2=0x79;break;case 6:k0=0x7F;k1=0x49;k2=0x79;break;case 7:k0=0x01;k1=0x01;k2=0x7F;break;case 8:k0=0x7F;k1=0x49;k2=0x7F;break;case 9:k0=0x4F;k1=0x49;k2=0x7F;for(j=0;j3;j+)datout(kj);void reshow3(unsigned char show_mon,unsigned char show_year)unsigned char highbit,lowbit;d_c=0;datout(0x44);datout(0x84);highbit=show_year/10;lowbit=show_year%10;d_c=1;ym2char(highbit);datout(0x00);ym2char(lowbit);datout(0x00);datout(0x08);datout(0x08);datout(0x08);datout(0x08);highbit=show_mon/10;lowbit=show_mon%10;datout(0x00);ym2char(highbit);datout(0x00);ym2char(lowbit);void reshow2(unsigned char show_min,unsigned char show_hour,unsigned char show_day,unsigned char show_mon,unsigned char show_year,unsigned char show_firstweek,unsigned char show_max_day) unsigned char i,j,k,l,highbit,lowbit;sc=0;d_c=1;for(i=0;ishow_max_day)break;d_c=0;j=(i+6-l+show_firstweek)/7+63;datout(j);k=28+l*8+128;if(i=show_day)datout(k-1);d_c=1;datout(0xff);d_c=0;else if(i=show_day-7)datout(k-1);d_c=1;datout(0x80);d_c=0;elsedatout(k);highbit=i/10;lowbit=i%10;day2char(highbit,i,show_day);day2char(lowbit,i,show_day);if(i=show_day)datout(0xff);else if(i=show_day-7)datout(0x80);elsedatout(0x00);datout(0x00);reshow1(show_min,show_hour);reshow3(show_mon,show_year);main()unsigned char set_min,set_hour,set_day,set_mon,set_year,set_week,set_firstweek,caseselect,set_max_day;bit set_ok_set2,set_next_bit2,set_change2;sc = 0; /初始化sclk= 0;reset=0;sclk= 1;sec = 0;min = 0;hour= 9;day = 10;mon = 6;year= 11;week= 2;firstweek=3;count=0;TMOD= 0x02;TH0 = 6;TL0 = 0;ET0 = 1;TR0 = 1;EA = 1;reset=1;max_day=maxday(mon);d_c=0;datout(0x20);datout(0x08);reshow2(min,hour,day,mon,year,firstweek,max_day);while(1) /键盘扫描操作等,为防止误操作,按键确认上升沿有效if(set_ok_set=1)&(set_ok_set2=0)set_ok_set2=set_ok_set;set_min=min;set_hour=hour;set_day=day;set_week=week;set_firstweek=firstweek;set_max_day=max_day;caseselect=1;while(1)if(set_ok_set=1)&(set_ok_set2=0)break;if(set_next_bit=1)&(set_next_bit2=0)caseselect+;if(caseselect=6)caseselect=1;if(set_change=1)&(set_change2=0)switch(caseselect)case 1:set_min+;if(set_min=60) set_min=0;break;case 2:set_hour+;if(set_hour=24) set_hour=0;break;case 3:set_year+;if(set_year=100) year=0;if(set_year%4=0)set_firstweek=(set_firstweek+366)%7;elseset_firstweek=(set_firstweek+365)%7;set_day=1;set_week=set_firstweek;break;case 4:set_mon+;if(set_mon=13)set_mon=1;set_firstweek=(set_firstweek+set_max_day)%7;set_max_day=maxday(set_mon);set_day=1;set_week=set_firstweek;break;case 5:set_day+;set_week+;if(set_daymax_day) set_day=1;set_week=firstweek;if(set_week=7)set_week=0;reshow2(set_min,set_hour,set_day,set_mon,set_year,set_firstweek,set_max_day);set_ok_set2=set_ok_set;set_next_bit2=set_next_bit;set_change2=set_change;EA=0;/为防止发生意外,产生逻辑上的错误,暂时关闭CPU中断min=set_min;hour=set_hour;day=set_day;mon=set_mon;year=set_year;week=set_week;firstweek=set_firstweek;max_day=maxday(mon);EA=1;set_ok_set2=set_ok_set;timer0() interrupt 1 /定时器中断count+;if(count=4000)count=0;sec+;if(sec=60)sec=0;min+;if(min=60)min=0;hour+;if(hour=24)day+;week+;if(week=7)week=0;if(daymax_day)day=1;mon+;max_day=maxday(mon);if(mon=13)mon=0;year+;if(setORrun=0)reshow2(min,hour,day,mon,year,firstweek,max_day);return;if(setORrun=0)reshow1(min,hour);5. 调试运行proteus建立电路图,载入hex文件,运行液晶模块没有任何显示,网上查找资料得知原因是单片机输出口电压供压不足,无法驱动显示模块,需要加装上拉电阻。修改后显示模块有了正常的输出。第一次运行了50分钟,结果计算时间比实际时间慢了12秒左右,经检查发现定时器的自动再

温馨提示

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

评论

0/150

提交评论