




已阅读5页,还剩4页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
江西科技师范大学通信与电子学院单片机应用技术实训报告实训题目: 电子万年历设计 小组成员: 班 级: 12电子信息工程职教本科1班 指导老师: 一、 实训选题内容、要求 电子万年历 要求:1、使用ds1302芯片,电路能使用液晶显示日期、时间、星期;2、电路能更改当前时间和日期;3、系统能设定闹钟,设定时间到了后用led闪烁表示;二、实训计划和人员安排在这次单片机实训中,我们做的是万年历加闹钟电路。在这次实训中我们小组进行分工完成此次单片机实训。具体分工情况如下:4月15号4月16 整个小组进行讨论分析,确定如何完成这次实训。每个人开始在网上查找有关万年历有关的资料4月18 号4月19号 大家将各自找好的资料进行分析,确定大概思路4月20号 4月22号 整理思路,写出大概的框架,以及流程图4月23号-4月24号 画出仿真电路4月25号4月27号 根据仿真电路写出单片机程序4月28号-4月30号 采购电路元件以及焊接电路板5月1号 5月3号 进行电路板的调试,直至达到选题要求具体人员安排王文博: 程序设计以及焊接电路板陈红英: 硬件部分设计及元件采购刘玉婷:ppt制作及实训报告兰小玲: 视屏录制 三、实训选题分析(主要完成对选题的功能分析,注重原理阐述;如何细化功能模块,软、硬件电路设计的设计思路)功能分析:电子万年历加闹钟就是实用单片机加上一个时钟芯片ds1302和几个与门芯片构成一个可调节年月日时分秒,以及能够读取当前时间的一个电路和闹钟功能。实现我们日常生活中的日历的作用。硬件设计 由于电路程序复杂,本电路采用89c52单片机作为控制核心,它具有在线编程功能,低功耗,能在3v超低压工作;时钟电路由ds1302提供,它是一种高性能、低功耗、带ram的实时时钟电路,它可以对年、月、日、时、分、秒等进行计时,具有闰年补偿功能,工作电压为2.5v-5.5v。采用三线接口与cpu进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或ram数据。ds1302内部有一个用于临时存放数据的ram寄存器。可产生年、月、日、时、分、。以及通过与门芯片和按键开关来实现年月日时分秒可调。具体框架结构图如下:开关单 片 机 lcd显示与门芯片 ds1302芯片四、方案设计(最少要提出两种不同的方案,并比较两种方案在设计、实现细节方面的差异和优劣,确定实训最终选定方案)方案一:采用at89c51芯片作为硬件核心,内部具有4kb rom存储空间,能于3v的超低电压工作,而且与mcs-51系列单片机完全兼容,但是运用于电路设计中时由于不具备isp在线编程技术。显示部分 采用led数码管动态扫描,led数码管价格适中,对于显示数字最合适,而且采用动态扫描法与单片机相连接时,占用的单片机口线少,但所需要的数码管数量太多,焊接困难极易出错,所以不采用led数码管作为显示。直接采用单片机定时计数器提供秒信号,使用程序实现年、月、日、星期、时、分、秒技术,调节部分使用与门芯片和按键开关进行调节。实现对年月日时分秒的调节与设定。方案二: 采用stc89c52芯片,它能以3v的超低电压工作,同时也与mcs-51系列单片机完全兼容,该芯片内部存储器为8kb rom存储空间,同时具有89c51的功能,且具有在线编程可擦除技术,当在对电路进行调试时,由于程序的错误修改或程序的新增功能需要烧入程序时,不需要对芯片进行多次插拔,所以不会对芯片造成损坏.采用lcd液晶显示屏,液晶显示屏的显示功能强大,可显示大量文字,图形,显示多样,清晰可见。采用ds1302时钟芯片实现时钟,ds1302芯片是一种高性能的时钟芯片,可自动对秒、分、时、日、周、月、年以及闰年补偿的年进行计数,而且精度高,位的ram作为数据暂存区,工作电压2.5v-5.5v范围内,2.5v时耗电小于300ma。调节部分使用与门芯片和按键开关进行调节。实现对年月日时分秒的调节与设定。最后,我们采用方案二stc89c52单片机 实时时钟芯片ds1302 显示使用lcd1602液晶显示屏,并设置了5个按键,每个按键分别标号为key1,key2,key3,key4.key5.按下key1,选择调节的对象,key2,key3键为加减键,key4为确定键,key5键为闹钟设置键。五、方案实现(根据选定的方案,给出每一功能模块具体的实现细节,所选用的具体芯片介绍,得到的硬件电路和相应的函数模块) 单片机芯片的选择和方案论证采用at89c52芯片,它能以3v的超低电压工作,同时也与mcs-51系列单片机完全兼容,该芯片内部存储器为8kb rom存储空间,同时具有89c51的功能,且具有在线编程可擦除技术,。p1口有两个作用,一个接上ds1302的ad0-ad7(双向地址/数据复用总线),控制着ds1302的8位并行数据的地址和数据的传输,另接上液晶的db0-db7(数据总线)控制着向液晶发送8位并行数据。p1.1接上ds1302的单数据线,发送并接受数据,地址的操作。p3.0到p3.3作为独立按键口。p2.4口为液晶的数据/命令选择端,1为数据,二为命令,p2.1口控制液晶读/写选择端,1为读命令,0为写操作,p2.0口控制液晶使能信号。对ds1302:p2.0口控制ds1302的片选信号的输入(cs),p2.1口控制地址选通输入(as),p2.2口为读写输入(r/w),p1.7接入闹钟,到设置时间到了,led灯闪烁。 时钟电路模块的设计图示为ds1302的引脚排列,其中vcc1为后备电源,vcc2为主电源,在主电源关闭的情况下,也能保持时钟的连续运行,ds1302由vcc1或vcc2两者中的较大者供电,当vcc2大于vcc1+0.2v时,vcc2给ds1302供电,当vcc2小于vcc1时候vcc1供电。x1和x2是振荡源,外接32.768khz晶振,rst是复位片选线,通过把rst输入驱动置高电平来启动所有的数据传送。rst输入有两种功能:首先,rst接通控制逻辑,允许地址/命令序列送入移位寄存器;其次,rst提供终止单字节或多字节数据的传送手段,当rst为高电平时,所有的数据传送被初始化,允许对ds1302进行操作,如果在传送过程中rst置为低电平,则会终止此次数据传送,i/o引脚变为高阻态,上电运行时,在vcc大于等于2.5v之前,rst必须保持低电平,中有在sclk为低电平时,才能将rst置为高电平,i/o为串行数据输入端,sclk始终是输入端。工作原理如下:(1) 时钟芯片ds1302的工作原理: ds1302在每次进行读、写程序前都必须初始化,先把sclk端置 “0”,接着把rst端置“1”,最后才给予sclk脉冲;读/写时序如下图4所示。图5为ds1302的控制字,此控制字的位7必须置1,若为0则不能把对ds1302进行读写数据。对于位6,若对程序进行读/写时ram=1,对时间进行读/写时,ck=0。位1至位5指操作单元的地址。位0是读/写操作位,进行读操作时,该位为1;该位为0则表示进行的是写操作。控制字节总是从最低位开始输入/输出的。表6为ds1302的日历、时间寄存器内容:“ch”是时钟暂停标志位,当该位为1时,时钟振荡器停止,ds1302处于低功耗状态;当该位为0时,时钟开始运行。“wp”是写保护位,在任何的对时钟和ram的写操作之前,wp必须为0。当“wp”为1时,写保护位防止对任一寄存器的写操作。(2) ds1302的控制字节ds1302的控制字如表1所示。控制字节的高有效位(位7)必须是逻辑1,如果它为0,则不能把数据写入ds1302中,位6如果0,则表示存取日历时钟数据,为1表示存取ram数据;位5至位1指示操作单元的地址;最低有效位(位0)如为0表示要进行写操作,为1表示进行读操作,控制字节总是从最低位开始输出表1 ds1302的控制字格式 ram rd 1 a4 a3 a2 a1 a0 / ck /wr (3) 数据输入输出(i/o)在控制指令字输入后的下一个sclk时钟的上升沿时,数据被写入ds1302,数据输入从低位即位0开始。同样,在紧跟8位的控制指令字后的下一个sclk脉冲的下降沿读出ds1302的数据,读出数据时从低位0位到高位7。如图5所示: 图5 ds1302读/写时序图 闹钟模块对时间进行设定,时间到了。led灯闪烁。闹钟模块的接线如图所示,3.2.5 按键部分按键部分如上图所示,本设计总的用了5个按扭开关作为键盘,其中一个是闹钟确定键,另4个中的其中两个是调整时间增加、减少的键,第一个是切换年、月、日及时、分、秒的显示状态并在所切换的显示状态下配合加减两个键调整时间,另外一个是确定键。液晶显示部分液晶显示模块如上图所示,字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式lcd,本设计采用16列*2行的字符型lcd1602带背光的液晶显示屏。六、仿真电路图 七、程序设计过程(介绍程序设计的算法思想、并介绍主要模块的功能及实现,用自顶向下的设计思路完成程序功能的分解)1基于ds1302的电子万年历设计系统主程序设计该系统的主程序包含了液晶模块初始化、ds1302时钟控制模块初始化、定时器t0初始化、时钟程序和中断程序。2液晶模块初始化程序首先产生一个让lcd复位的低电平脉冲,复位后再使能lcd。初始化中主要设置lcd模式、偏置电压、显示模式和清屏。3.ds1302时钟控制模块初始化程d1302时钟模块的初始化主要是往ds1302中写数据定时器t0初始化程序定时器t0的初始化主要设置定时器的操作模式、启动方式。设置定时器的值及采用中断方式。设置完成后,启动定时器工作。4时钟程序和中断程序钟程序主要包含了键盘控制程序和时钟显示程序液晶显示模块液晶显示主要显示四行,第一行采用显示当前日期,格式为年月日星期。第二行显示闹钟的时间,格式为时:分:秒。闹钟部分采用了led灯闪烁来显示闹钟的到来。程序如下: #include #include #include#define uchar unsigned char#define uint unsigned intsbit sda=p10;/ ds1302数据线sbit clk=p11;/ds1302时钟线sbit rst=p12; /ds1302复位线sbit rs=p20;sbit rw=p21;sbit en=p22;sbit k1=p34; / 选择sbit k2=p35; / 加sbit k3=p36; / 减sbit k4=p37; / 确定sbit k5=p30; / 闹钟确定sbit k6=p30; / 闹钟设置sbit beep=p17;void display_lcd_string(uchar p,uchar *s);uchar tcount=0;/一年中每个月的天数,2月的天数由年份决定uchar monthsdays=0,31,0,31,30,31,30,31,31,30,31,30,31;uchar *week=sun,mon,tus,wen,thu,fri,sat;/周日,周一到周六uchar lcd_dsy_buffer1=date 00-00-00 ; /lcd显示缓冲uchar lcd_dsy_buffer2=time 00-00-00 ;uchar alarm_time_buffer= ;/闹钟时分位保存uchar datetime7; /所读取的日期时间char adjust_index=-1; /当前调节的时间:秒,分,时,日,uchar change_flag=-mhdm-y; uchar read_lcd_state(); void lcd_busy_wait(); void write_lcd_data(uchar dat); void write_lcd_command(uchar cmd); void init_lcd(); void set_lcd_pos(uchar p); void delayms(uint x) uchar i;while(x-) for(i=0;i120;i+); uchar read_lcd_state() uchar state;rs=0;rw=1;en=1;delayms(1);state=p0;en=0;delayms(1);return state; void lcd_busy_wait()while(read_lcd_state()&0x08)=0x80);delayms(5);void write_lcd_data(uchar dat) /写数据lcd_busy_wait();rs=1;rw=0;en=0;p0=dat;en=1;delayms(1);en=0;void write_lcd_command(uchar cmd)/写命令lcd_busy_wait();rs=0;rw=0;en=0;p0=cmd;en=1;delayms(1);en=0;void init_lcd()/lcd初始化write_lcd_command(0x38); delayms(1);write_lcd_command(0x01); delayms(1);write_lcd_command(0x06); delayms(1);write_lcd_command(0x0c); delayms(1);display_lcd_string(0x00,zhongzhoudaxue);delayms(1000);display_lcd_string(0x40,dian zi ri li);delayms(1000);void set_lcd_pos(uchar p)write_lcd_command(p|0x80);void display_lcd_string(uchar p,uchar *s)uchar i;set_lcd_pos(p);for(i=0;i16;i+)write_lcd_data(si);delayms(1);/*-向ds1302写入一字节-*/void ds1302_write_byte(uchar x) uchar i; for(i=0;i=1; /*-从ds1302读取一字节-*/uchar ds1302_read_byte()uchar i,b,t;for(i=0;i=1;t=sda;b|=t7;clk=1;clk=0; return b/16*10+b%16;/*-从ds1302指定位置数据-*/uchar read_data(uchar addr)uchar dat;rst=0;clk=0;rst=1;ds1302_write_byte(addr);dat=ds1302_read_byte();clk=1;rst=0;return dat;/*-向ds1302某地址写入数据-*/void write_ds1302(uchar addr,uchar dat)clk=0;rst=1;ds1302_write_byte(addr);ds1302_write_byte(dat);clk=0;rst=0;/*- 设置时间-*/void set_ds1302()uchar i;write_ds1302(0x8e,0x00);for(i=0;i7;i+)write_ds1302(0x80+2*i,(datetimei/104|(datetimei%10);write_ds1302(0x8e,0x80);/*-读取当前时期时间-*/void gettime()uchar i;for(i=0;i7;i+)datetimei=read_data(0x81+2*i); /*- 时间和日期转换成数字字符-*/void format_datetime(uchar d,uchar *a)a0=d/10+0;a1=d%10+0;/*- 判断是否为闰年-*/uchar isleapyear(uint y)return (y%4=0&y%100!=0)|(y%400=0);/*- 星期转换-*/void refreshweekday()uint i,d,w=5;for(i=2000;i2000+datetime6;i+)d=isleapyear(i) ? 366 : 365;w=(w+d)%7;d=0;for(i=1;idatetime4;i+) d+=monthsdaysi;d+=datetime3;datetime5=(w+d)%7+1;/*- 年月日时分秒+/-*/void datetime_adjust(char x)switch (adjust_index)case 6: /年if(x= 1&datetime60) datetime6-;monthsdays2=isleapyear(2000+datetime6)? 29:28;if(datetime3monthsdaysdatetime4) datetime3=monthsdaysdatetime4;refreshweekday();break;case 4: /月if(x= 1&datetime41) datetime4-;monthsdays2=isleapyear(2000+datetime6)? 29:28;if(datetime3monthsdaysdatetime4)datetime3=monthsdaysdatetime4;refreshweekday();break;case 3:/日monthsdays2=isleapyear(2000+datetime6)? 29:28;if(x= 1&datetime30) datetime3-;refreshweekday();break;case 2: /时if(x= 1&datetime20) datetime2-;break;case 1: /秒if(x= 1&datetime10) datetime1-;break; /*-主程序-*/void main()init_lcd();/lcd初始化ie=0x83; / 允许int0,t0中断ip=0x01;it0=0x01;tmod=0x01;th0=-50000/256;tl0=-50000%256;tr0=1; while(1)if(adjust_index=-1) gettime();/*- 定时器每秒刷新lcd显示-*/void t0_int() interrupt 1th0=-50000/256;tl0=-50000%256;if(+tcount!=2) return;tcount=0;format_datetime(datetime6,lcd_dsy_buffer1+5);format_datetime(datetime4,lcd_dsy_buffer1+8);format_datetime(datetime3,lcd_dsy_buffer1+11);strcpy(lcd_dsy_buffer1+13,weekdatetime5-1);format_datetime(datetime2,lcd_dsy_buffer2+5);format_datetime(datetime1,lcd_dsy_buffer2+8);format_datetime(datetime0,lcd_dsy_buffer2+11);display_lcd_string(0x00,lcd_dsy_buffer1);display_lcd_string(0x40,lcd_dsy_buffer2);if(alarm_time_buffer0=lcd_dsy_buffer25&alarm_time_buffer1=lcd_dsy_buffer26&alarm_time_buffer2=lcd_dsy_buffer28&alarm_time_buffer3=lcd_dsy_buffer29)beep=beep;/*- 键盘中断-*/void ex_int0() interrupt 0if(k1=0)/选择调整对象:年,月,日,时,分,秒while(k1=0);if(adjust_index=-1|adjust_index=1) adjust_index=7;adjust_index-;if(adjust_index=5) adjust_index=4;lcd_dsy_buffer213=;lcd_dsy_buffer214=change_flagadjust_index;lcd_dsy_buffer215=;elseif(k2=0) / 加while (k2=0); datetime_adjust(1);elseif(k3=0) / 减while (k3=0); datetime_adjust(-1);elseif(k4=0) / 确定while(k4=0);set_ds1302();/调整后的时间写入ds1302lcd_dsy_buffer213= ;lcd_dsy_buffer214= ;lcd_dsy_buffer215= ;adjust_index=-1;elseif(k5=0) / 闹钟确定while(k5=0);if(adjust_index!=-1)alarm_time_buffer0=lcd_dsy_buffer25;/设置当前时间为闹铃时间alarm_time_buffer1=lcd_dsy_buffer26;alarm_time_buffer2=lcd_dsy_buffer28;alarm_time_buffer3=lcd_dsy_buffer29;adjust_index=-1;八、焊接、调试过程(说明焊接过程中的故障情况及调试处理的方法)1载入程序后,lcd显示的秒数快慢不均匀,有时快一点有时慢一点。解决办法:首先晶振的连接进行检查,看是否是由于晶振连接不对而导致产生的脉冲时钟不均匀。其次,是看焊接问题,有没有虚焊,导致电路连接不畅,查看后都没有问题,于是检查程序,循环出问题了,修正了循环条件,最后解决了此问题。2修改时间、日期时没有星期和日期没有自动对应上。解决办法:把不相关的程序暂时屏蔽,将星期的子程序独立调试,发现在调用星期更新时,对十进制和十六进制处理不好,所以会造成错乱。最后把相应的十进制进行修改,使得可以与十六进制对应,最后解决了此问题.3. 对于日的调整不正确,找出是程序的问题,在日期循环设定的时候,必须将其值设为小于等于31,月就要小于等于12,没有将条件设定好,而ds1302芯片对这类寄存器的取值都有具体的规定,后来找出又是条件搞错了,好在单片机是可擦除的,重新装入程序后再次运行一下,就解决了这个问题。在实际使用中,我们发现ds1302的工作情况不够稳定,主要表现在实时时间的传送有时会出现误差,有时甚至整个芯片停止工作。我们对ds1302的工作电路进行了分析, ds1302的外部电路十分简单,惟一外接的元件是32768hz的晶振。通过实验我们发现:当外接晶振电路振荡时,ds1302计时正确;当外接晶振电路停振时,ds1302计时停止。因此,我们认为32768hz晶振是造成ds1302工作不稳定的主要原因。在使用前对晶体的负载电容并不知道的情况下,通过测定晶体振荡频率的方法可以确定该晶体的负载电容。对于晶体振荡器来说,其振荡频率与负载电容之间的关系是确定的。以本文讨论的ds1302使用的32768hz晶振为例:当它工作于所要求的负载电容时,能较准确地产生 32768hz的频率;当它的负载电容小于6pf时,其振荡频率会正向偏移;当它的负载电容大于6pf时,其振荡频率就会负向偏移。因此,对于未知负载电容的晶体应首先采用实验的方法,在其两端加入辅助电容使晶体起振,然后用频率计测出振荡频率
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中国对甲基氯化苄行业市场发展前景及发展趋势与投资战略研究报告(2024-2030)
- 车辆伤害事故反思感悟
- 危险化学品安全生产工作总结
- 安全教育体会心得800
- 安全生产法规立法的最基本依据是
- 安全知识培训内容
- 2025年中国微距电子闪光灯行业市场运行现状及投资战略研究报告
- 什么是事故隐患排查治理和防控的
- 2025年中国美式咖啡机行业发展前景预测及投资策略研究报告
- 生产经营单位安全培训规定是一部部门规章
- 船舶制造主要管理人员及工程技术人员配备计划
- 水利水电工程行业市场发展分析及发展前景与投资研究报告2025-2028版
- 血小板减少症护理查房
- 浙江杭州市2024-2025学年高一下学期6月期末考试数学试题及答案
- 碱性电解水制氢过程中的纯度影响因素研究
- 师傅带徒弟管理制度
- (苏教版)数学三年级下册计算题“天天练”习题卡含105份题组
- 2025年中国邮政集团有限公司广东省分公司人员招聘笔试备考试题及参考答案详解1套
- 中建海外管理制度
- 农产品产业园项目可行性研究报告专用模板
- 2025-2030中国全麦粉市场销售状况与竞争前景分析报告
评论
0/150
提交评论