欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    51单片机电子时钟设计报告(共22页).doc

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

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

    51单片机电子时钟设计报告(共22页).doc

    精选优质文档-倾情为你奉上电子时钟实验报告全部代码在文档末尾:51单片机,LCD1602液晶显示屏平台下编程实现,可直接编译运行目录:一, 实验目的20世纪末,电子技术获得了飞速的发展,在其推动下,现代电子产品几乎渗透了社会的各个领域,有力地推动了社会生产力的发展和社会信息化程度的提高,同时也使现代电子产品性能进一步提高,产品更新换代的节奏也越来越快。现代生活的人们越来越重视起了时间观念,可以说是时间和金钱划上了等号。对于那些对时间把握非常严格和准确的人或事来说,时间的不准确会带来非常大的麻烦,所以电子钟是以其小巧,价格低廉,走时精度高,使用方便,功能多,便于集成化而受广大消费的喜爱,得到了广泛的使用。1. 学习8051定时器时间计时处理、按键扫描及LCD液晶显示的设计方法。2. 设计任务及要求 利用实验平台上LCD1602液晶显示屏, 设计带有闹铃功能的数字时钟二,实验要求 A.基本要求:1. 在LCD1602液晶显示屏上显示当前日期,时间。 2. 利用按键可对时间及闹玲进行设置,并可显示设置闹玲的时间。闹玲时间到蜂鸣器发出声响,一分钟后闹铃停止。B.扩展部分:1.日历功能(能对年,月,日,星期进行显示,分辨平年,闰年以及各月天数,并调整)实现年月日时分秒的调整,星期准确的随着日期改变而改变进行显示。2.定时功能(设定一段时间长度,定时到后,闹铃提示)C.可扩展部分:1.闹铃重响功能(闹铃被停止后,以停止时刻开始,一段时间后闹铃重响,且重响时间的间隔可调)2可进行备忘录提示,按照年月日,可在设定的某年某月进行闹铃提示。三,实验基本原理利用单片机定时器完成计时功能,定时器0计时中断程序每隔中断一次并当作一个计数,设定定时1秒的中断计数初值为20,每中断一次中断计数初值加1,当减到20时,则表示1s到了,秒变量加1,同理再判断是否1min钟到了,再判断是否1h到了,是否一天到了,是否一个月到了,是否一年到了。将时间在LCD液晶屏上显示,降低了程序的编写难度。LCD的固定显示特性是我们省去了数码管的动态扫描显示。 四,实验设计分析针对要实现的功能,采用AT89S52单片机进行设计,AT89S52 单片机是一款低功耗,高性能CMOS8位单片机,片含4KB在线可编程(ISP)的可反复擦写1000次的Flash只读程序存储器,器件采用高密度、非易失性存储技术制造,兼容标准MCS- 51指令系统及80C51引脚结构。这样,既能做到经济合理又能实现预期的功能。在程序方面,采用分块设计的方法,这样既减小了编程难度、使程序易于理解,又能便于添加各项功能。程序可分为闹钟的声音程序、时间显示程序、日期显示程序,秒表显示程序,时间调整程序、闹钟调整程序、定时调整程序,延时程序等。运用这种方法,关键在于各模块的兼容和配合,若各模块不匹配会出现意想不到的错误。首先,在编程之前必须了解硬件结构尤其是各引脚的用法,以及部寄存器、存储单元的用法,否则,编程无从下手,电路也无法设计。这是前期准备工作。第二部分是硬件部分:依据想要的功能分块设计设计,比如输入需要开关电路,输出需要显示驱动电路和数码管电路等。第三部分是软件部分:先学习理解C语言的编程方法再根据设计的硬件电路进行分块的编程调试,最终完成程序设计。第四部分是软件画图部分:设计好电路后进行画图,包括电路图和仿真图的绘制。第五部分是软件仿真部分:软硬件设计好后将软件载入芯片中进行仿真,仿真无法完成时检查软件程序和硬件电路并进行修改直到仿真成功。第六部分是硬件实现部分:连接电路并导入程序检查电路,若与设计的完全一样一般能实现想要的功能。最后进行功能扩展,在已经正确的设计基础上,添加额外的功能!五,实验要现A.电路设计1. 整体设计此次设计主要是应用单片机来设计电子时钟,硬件部分主要分以下电路模块:显示电路用lcd1602显示,年份,月份,星期,小时、分钟和秒(日),使电路更加简单。单片机采用AT89S51系列,这种单片机应用简单,适合电子钟设计。电路的总体设计框架如下:单片机输入部分晶振和复位输出部分2. 分块设计模块电路主要分为:输入部分、输出部分、复位和晶振电路。 输入部分输入信号主要是各种模式选择和调整信号,由按键开关提供。以下为输入部分样例:在本实验中主要用用P3口输入按键信号,还用到了特殊的P0口。对于P0口,由于其存在高阻状态,为了实现开关功能,给其添加上拉电阻,具体如下图所示: 输出部分本电路的输出信号LCD的写入命令和写入数据,闹铃脉冲信号。闹铃由端输出,模块如下:日期时间由LCD1602输出,模块如下: 晶振与复位电路本实验单片机时钟用部时钟,模块如下:复位电路为手动复位构成,模块如下:B.程序设计 程序总体设计本实验用汇编程序完成.程序总的流程图如下: 程序主要模块中断服务程序:/*一秒定时中断函数*/void timer0() interrupt 1 using 1ET0=0;验总结及感想一分耕耘,一分收获。只有亲自用实践来验证这句话,在能得其要领。经过这次单片机课程设计,我从一个单片机实践的门外汉,已经越升为略知一二的新手。虽然还有很多有关单片机的应用有待学习,但万变不离其宗,只要深入了解单片的原理,全部知识点,各个细节,一切设计皆有可能。在实验的开始几天,基本上没有收获,不知何从下手,不知所措。为了看得更远,不妨站在前人的肩膀上,我在整体思路模糊的情况下,在网上大量招资粮,各种与电子时钟相关的文章,我阅读了不少。随着涉猎的点滴积累,我对电子时钟的设计方案已经慢慢酝酿而成。有了方向和不少知识储备后,在接下来的几天,几乎每天都有突破,虽然有时只是一句程序的修改或诞生,但那种收获的感觉很暖人心。实验中遇到了不少问题,接下来总结一下,共同探讨。1, P0口开关问题。P0口比较特殊,它存在高阻态,要使其输入不是高电平就是低电平,就要接上拉电阻,给其高电平输入。以上就是实验中遇到的主要问题,基本上都找到了相应的解决之道。整个实验的过程就是一个解决问题的过程,每天都解决一些问题,我的实验也就解决了,当然结果不重要,功利化的追求结果,会使人浮躁,还是享受那份疑难迎刃而解的快感吧!全部完整代码:此代码未经本人优化,可以根据自己的需求优化代码。盗版不究,可直接引用。/*/基于STC89S52单片机以及液晶1602显示的万年历项目/*/#include<>#include<>#define uchar unsigned char#define uint unsigned int/*液晶1602相关参数*/#define data_port P0 /液晶屏指令、数据通信接口sbit rs=P10;/液晶屏寄存器选择接口(rs=0时选择指令寄存器,rs=1时选择数据寄存器)sbit rw=P11;/液晶屏读写选择接口(rw=0时选择写入,rw=1时选择读出)sbit en=P12;/液晶屏使能接口(en=0时通信接口中断,en=1时通信接口接通)uchar code line1_str="-Welcome!-"/液晶屏第一行要显示的字符串uchar code line2_str=" made by: MCU "/液晶屏第二行要显示的字符串/*按键设置的相关参数*/sbit timer=P15; /蜂鸣器sbit sound=P34; /进入闹铃设置状态键uchar sflag=0,ssflag=0; /闹铃设置标志位;闹铃工作标志位sbit set_key=P37; /进入设置sbit up_key=P36; /加号键sbit cancle_key=P35; /完成设置键uchar set=0; /是否进行了设置uchar flag=0; /设置选择标志uchar year=0x00; /"年"寄存器 uchar month=0x01;/"月"寄存器 uchar day=0x01;/"日"寄存器 uchar week=0x06;/"星期"寄存器uchar hour;/"时"寄存器 uchar minite;/"分"寄存器 uchar second;/"秒"寄存器 uchar jiamiao=0;/加秒参数uchar fen1,fen2;/(数据交换)分定时寄存器uchar shi1,shi2;/ (数据交换)时定时寄存器uchar code num_tab="09"/液晶屏要显示的数字表uchar dis_val7=0x00,0x01,0x01,0x06,0x00,0x00,0x00;/依次存储:年,月,日,星期,时,分,秒/*子函数部分*/void lcd_int();/初始化1602液晶void welcome();/欢迎界面void in_command(uchar );/向液晶屏输入命令void in_data(uchar dat);/向液晶屏输入数据void delay(uint ms);/延时函数void key();/按键设置函数uchar calculate_week();/星期计算函数void week_disp(uchar x); /LCD1602显示星期值子函数声明void lcd_disp_string(uchar str);/液晶屏显示一串字符子函数声明void brush_lcd(); /刷新液晶屏显示容子函数声明void run();/万年历正常运行函数/*/void main()TMOD=0x01;/0000 0001 使用定时器T0的模式1(16位模式)TH0=(65536-50000)/256;/设定每次中断间隔50msTL0=(65536-50000)%256;jiamiao=1; EA=1;/打开总中断允许ET0=1;/打开定时器T0中断允许位TR0=1;/启动定时器T0lcd_int();welcome();delay(1000);while(1)key();if(jiamiao=20)second+; dis_val6=(second/10)<<4)|(second%10);/刷新"秒"jiamiao=0;run();if(flag=0)if(dis_val0=0x00 && dis_val1=0x01 && dis_val2=0x01)/2000年1月1日为星期六dis_val3=0x06;brush_lcd(); /刷新液晶屏显示容if(hour=shi2 && minite=fen2 &&ssflag=1)timer=0;elsetimer=1;/*延时子函数*/void delay(uint ms) uchar i;while(ms-)for(i=0;i<244;i+);/*LCD初始化*/void lcd_int()delay(30);/延时15MS,等待LCD初始化in_command(0x01);/清显示屏in_command(0x38);/8位通信,2行显示,5*7点阵in_command(0x0c);/开显示,关光标,关闪烁in_command(0x06);/字符不动,光标右移动,地址加一/*液晶屏显示一串字符*/ void lcd_disp_string(uchar str)uchar i=0;while(stri!='0')in_data(stri);/显示数据(字符)i+;/*欢迎界面函数*/void welcome()uchar i;in_command(0x80);/设定第一行字符串起始显示位置while(line1_stri!='0') delay(100);in_data(line1_stri);/显示数据(字符)i+;i=0;in_command(0xc0);/设定第二行字符串起始显示位置while(line2_stri!='0')delay(100);in_data(line2_stri);/显示数据(字符)i+;/*向液晶屏输入命令子函数*/void in_command(uchar )delay(2);en=0;/关闭通信,为设置参数做准备rs=0;/选择指令寄存器rw=0;/写入液晶_nop_();data_port=;en=1;/开始通信_nop_();en=0;/关闭通信,为设置参数做准备/*向液晶屏输入数据子函数*/void in_data(uchar dat)delay(2);en=0;/关闭通信,为设置参数做准备rs=1;/选择数据寄存器rw=0;/写入液晶_nop_();data_port=dat;_nop_();en=1;/开始通信_nop_();en=0;/关闭通信,为设置参数做准备/*计算星期值子函数*/ uchar calculate_week()uint days_number;/存储天数值uchar i;if(year>=1)days_number=(year-1)/4)+1);/从00年到year-1年的闰年个数days_number=days_number+(year*365);/从00年到year-1年的总天数elsedays_number=0;for(i=1;i<month;i+)switch(i)case 1: case 3:case 5:case 7:case 8:case 10:case 12:days_number+=31;/大月31天break;case 4:case 6:case 9:case 11:days_number+=30;/小月30天break;case 2:if(year%4=0)/闰年2月29天days_number+=29;else/平年2月28天days_number+=28;break;days_number+=day;/加上本月日期if(days_number+5)%7=0)/计算现在的星期值,并返回其值return(7);elsereturn(days_number+5)%7); /*LCD1602显示星期值子函数*/void week_disp(uchar x) switch(x) case 1: lcd_disp_string("MON");/显示"星期一"break;case 2:lcd_disp_string("TUE");/显示"星期二"break;case 3: lcd_disp_string("WED");/显示"星期三"break;case 4: lcd_disp_string("THU");/显示"星期四"break;case 5:lcd_disp_string("FRI");/显示"星期五"break;case 6: lcd_disp_string("SAT");/显示"星期六"break;case 7:lcd_disp_string("SUN");/显示"星期日"break; /*按键设置函数*/void key()if(set_key=0) /检测"设置"键是否按下delay(5);/延时消抖if(set_key=0)ET0=0;/打开定时器T0中断允许位TR0=0;/启动定时器T0if(flag<6)flag+;elseflag=0;switch(flag)case 0:if(set=1)/检测时间是否更改set=0;/时间更改标志复位dis_val0=(year/10)<<4)|(year%10); /刷新"年"dis_val1=(month/10)<<4)|(month%10);/刷新"月"dis_val2=(day/10)<<4)|(day%10);/刷新"日"dis_val3=week;/刷新"星期"dis_val4=(hour/10)<<4)|(hour%10);/刷新"时"dis_val5=(minite/10)<<4)|(minite%10);/刷新"分"dis_val6=(second/10)<<4)|(second%10);/刷新"秒"in_command(0x0c);/开显示,关光标,关闪烁break;case 1:in_command(0x83);/设定显示(光标)位置-"年"低位闪烁in_command(0x0d);/开显示,关光标,开闪烁year=(dis_val0>>4)*10)+(dis_val0&0x0f);/预设调节变量初始值为当前时刻month=(dis_val1>>4)*10)+(dis_val1&0x0f);day=(dis_val2>>4)*10)+(dis_val2&0x0f);hour=(dis_val4>>4)*10)+(dis_val4&0x0f);minite=(dis_val5>>4)*10)+(dis_val5&0x0f);second=(dis_val6>>4)*10)+(dis_val6&0x0f);break; case 2:in_command(0x86);/设定显示(光标)位置-"月"低位闪烁break;case 3:in_command(0x89);/设定显示(光标)位置-"日"低位闪烁break;case 4:in_command(0xc5);/设定显示(光标)位置-"时"低位闪烁break;case 5:in_command(0xc8);/设定显示(光标)位置-"分"低位闪烁break;case 6: in_command(0xcb);/设定显示(光标)位置-"秒"低位闪烁break;while(set_key=0);if(up_key=0 && flag!=0)/检测"设置时间"启动时,"上升"键是否按下delay(5);/延时消抖if(up_key=0)switch(flag)case 1: if(sflag=1)break;if(year<99)year+;elseyear=0;if(year%4!=0 && month=2)/平年的2月if(day>28)day=28;in_command(0x88);/设定显示(光标)位置-"日"高位in_data(num_tabday/10);/修正"日"in_data(num_tabday%10);week=calculate_week();/计算星期值in_command(0x8c);/设定显示(光标)位置-"星期"week_disp(week); /LCD1602显示星期值in_command(0x82);/设定显示(光标)位置-"年"高位in_data(num_tabyear/10);/显示正在调节的"年"in_data(num_tabyear%10);in_command(0x83);/设定显示(光标)位置-"年"低位闪烁break;case 2: if(sflag=1)break;if(month<12)month+;elsemonth=1;if(month=4 | month=6 | month=9 | month=11)if(day>30)day=30;in_command(0x88);/设定显示(光标)位置-"日"高位in_data(num_tabday/10);/修正"日"in_data(num_tabday%10);if(month=2)if(year%4!=0)/平年if(day>28)day=28;in_command(0x88);/设定显示(光标)位置-"日"高位in_data(num_tabday/10);/修正"日"in_data(num_tabday%10);else/闰年if(day>29)day=29;in_command(0x88);/设定显示(光标)位置-"日"高位in_data(num_tabday/10);/修正"日"in_data(num_tabday%10);week=calculate_week();/计算星期值in_command(0x8c);/设定显示(光标)位置-"星期"week_disp(week); /LCD1602显示星期值in_command(0x85);/设定显示(光标)位置-"月"高位in_data(num_tabmonth/10);/显示正在调节的"月"in_data(num_tabmonth%10);in_command(0x86);/设定显示(光标)位置-"月"低位闪烁break;case 3: if(sflag=1)break;if(month=4 | month=6 | month=9 | month=11)if(day<30)day+;elseday=1;else if(month=2)if(year%4!=0)/平年if(day<28)day+;elseday=1;else/闰年if(day<29)day+;elseday=1;elseif(day<31)day+;elseday=1;week=calculate_week();/计算星期值in_command(0x8c);/设定显示(光标)位置-"星期"week_disp(week); /LCD1602显示星期值in_command(0x88);/设定显示(光标)位置-"日"高位in_data(num_tabday/10);/显示正在调节的"日"in_data(num_tabday%10);in_command(0x89);/设定显示(光标)位置-"日"低位闪烁break;case 4: if(hour<23)if(sflag=1) /完成闹钟状态下的数值变换,并保存设置前的状态shi1=hour;hour+;shi2=hour;elsehour+;elsehour=0;in_command(0xc4);/设定显示(光标)位置-"时"高位in_data(num_tabhour/10);/显示正在调节的"时"in_data(num_tabhour%10);in_command(0xc5);/设定显示(光标)位置-"时"低位闪烁break;case 5: if(minite<59)if(sflag=1)/完成闹钟状态下的数值变换,并保存设置前的状态fen1=minite;minite+;fen2=minite;elseminite+;elseminite=0;in_command(0xc7);/设定显示(光标)位置-"分"高位in_data(num_tabminite/10);/显示正在调节的"分"in_data(num_tabminite%10);in_command(0xc8);/设定显示(光标)位置-"分"低位闪烁break;case 6: if(second<59)second+;elsesecond=0;in_command(0xca);/设定显示(光标)位置-"秒"高位in_data(num_tabsecond/10);/显示正在调节的"秒"in_data(num_tabsecond%10);in_command(0xcb);/设定显示(光标)位置-"秒"低位闪烁break;set=1;/时间更改标志置位while(up_key=0);if(sound=0 && flag!=0)/启动定时状态标志sflag=1;if(cancle_key=0 && flag!=0)/检测"设置时间"启动时,"完成"键是否按下delay(5);/延时消抖if(cancle_key=0)set=0;/时间更改标志复位flag=0; /设置按键状态值复位in_command(0x0c);/开显示,关光标,关闪烁while(cancle_key=0);if(sflag=1)/判断是否进行过闹钟定时设置minite=fen1;hour=shi1;ssflag=1; /启动闹钟工作标志sflag=0; /关闭闹钟定时状态标志ET0=1;/打开定时器T0中断允许位TR0=1;/启动定时器T0/*刷新液晶屏显示容子函数*/void brush_lcd()static uchar old_second=0x01;if(dis_val6!=old_second)old_second=dis_val6;/刷新原来的"秒"为新"秒"值in_command(0x80); /设定第一行字符串起始显示位置in_data('2'); /年的千位in_data('0'); /年的百位in_data(num_tabdis_val0/16);/显示"年"in_data(num_tabdis_val0%16);in_data('-');/显示分隔符in_data(num_tabdis_val1/16);/显示"月"in_data(num_tabdis_val1%16);in_data('-');/显示分隔符in_data(num_tabdis_val2/16);/显示"日"in_data(num_tabdis_val2%16);in_data(' ');/显示分隔符in_data('')

    注意事项

    本文(51单片机电子时钟设计报告(共22页).doc)为本站会员(飞****2)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

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




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

    本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

    工信部备案号:黑ICP备15003705号 © 2020-2023 www.taowenge.com 淘文阁 

    收起
    展开