版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
四川大学网络教育学院专业课课程设计题目办学学院四川大学电气信息学院学习中心黔江奥鹏专业层次专升本年级0903学生姓名石胜良学号aDH1091g10322010年7四川大学网络教育学院实验报告实验名称:实时时钟实验学习中心姓名学号实验内容:根1、实验题目分析1.1问题描述结合实时时钟,IIC〔控制小键盘和数码管等〕来做具备定期功能的实时时钟。1.2功能分析至少完成以下功能:(1)能显示每秒的时刻(2)按下功能键能切换显示日期(3)能设置定时闹钟,定时到产生某种输出(4)可以扩展考虑参加外部中断,如停止闹钟功能等。1.3开发平台及工具介绍实验器材有:CITK2410开发板,JTAG连接线,RS-232直通连接线RVDS集成开发环境,超级终端工具,2、实验概要设计2.1实验根本原理IIC总线:IIC总线的器件分为主器件和从器件。主器件的功能是启动在总线上传送数据,并产生时钟脉冲,以允许与被寻址的器件进行数据传送。SCL线为高电平期间,SDA线由高电平向低电平的变化表示起始信号;SCL线为高电平期间,SDA线由低电平向高电平的变化表示终止信号。I2C总线进行数据传送时,时钟信号为高电平期间,数据线上的数据必须保持稳定,只有在时钟线上的信号为低电平期间,数据线上的高电平或低电平状态才允许变化。超始和停止信号图数据传送时序图IIC总线〔IICSDA、IICSCL〕经过VDD33的上拉后,进入ZLG7290数码管:实验使用的数码管是广州周立公司单片机开展自行设计的一款数码管显示驱动及键盘扫描管理芯片。下面是介绍该数码管的特点还有电路图:
1I2C串行接口提供键盘中断信号方便与处理器接口
2可驱动8位共阴数码管或64只独立LED和64个按键
3可控扫描位数可控任一数码管闪烁
4提供数据译码和循环移位段寻址等控制
58个功能键可检测任一键的连击次数
6无需外接元件即直接驱LED可扩展驱动电流和驱动电压
7提供工业级器件多种封装形式PDIP24SO24
采用24引脚封装引脚图如下图其引脚功能分述如下:实时时钟(RealTimeClock):2410提供了一个实时时钟,该时钟使用独立的一路1.8V供电,保证主电源切断时能正常维持RTC工作。2410的RTC支持两个中断:TimeTick〔固定在一个频率内发出的时钟中断〕和Alarm中断〔在某个时刻产生闹铃中断〕。利用这两个中断可以设置每一秒中断一次显示变化时间,用Alarm中断实现闹钟功能。以下为S3C2410内部RTC模块结构图:2.2实验电路图ZLG7290功能电路图:IIC总线接口电路图:2.3实验主要步骤1.初始化配置〔各种存放器〕。2.编写各种相关的中断程序。3.主函数调用这几个中断程序。4.编译程序,在zoc串口工具进行测试。5.使用zoc下载和调试。3、实验详细过程3.1具体实验过程和内容〔1〕实现实时时钟功能设置rRTCCON、rTICNT、rRTCALM存放器TICNT[6:0]=127;可以设置rTICNT=(1<<7)|(127)实现每秒中断一次。可以设置闹铃存放器,例如每秒的第几秒中断一次,实现定时闹钟的功能。要设置初始化当前时间。这里还包括编写TimeTick中断和Alarm中断的中断效劳程序。〔2〕初始化IIC总线编写一个IIC的操作库。包括发送和接受功能。编写可以向ZLG7290发出指令的函数。〔3〕编写键盘中断处理程序通过键盘中断,实现数码管显示日期和时间的切换,还有停止。〔4〕使用RVDS集成开发环境编译调试程序〔5〕使用ZOV软件测试3.2程序流程图程序入口点程序入口点2410初始化显示时间主函数闹钟停止显示日期是否切换初始化初始化Alarm中断Timetick中断键盘中断输出当前时间数码管显示日期或时间闹钟3.3实验和程序问题分析这次试验实际上是融合了三个实验的要求,要实验实时时钟的功能,包括显示当前时间,还有设置闹钟,主要使用到2410的RTC的两个中断:TimeTick和Alarm中断。而要实现在数码管上显示当前时间,并且按键盘时实现时间与日期的切换,需要用到数码管和IIC总线的知识。而实现的难处在于如何把几个内容融合在一起并且实现所需的功能,这也是实验要求做的。4、实验输出界面选取主要界面的截图。5、总结这次实验其实是包含了几个内容的,有实验5的实时时钟〔RTC〕实验,实验6的IIC总线与数码管实验。试验7的IIC总线与键盘实验。而实现的功能也相应增加了,因此难度加大了一点。要分别掌握RTC,IIC,还有数码管的知识。但是通过这次实验,我对它们的知识得到了稳固。在没有学RTC的时候,我就对某些事情感到好奇,我的拥有定时开机和关机功能,闹钟功能,疑惑的是,既然都关了,为何能够自动开机甚至是在关机的情况下相应闹钟功能。通过学习RTC的知识,我明白了2410提供了一个实时时钟,该时钟使用独立的一路1.8V供电,保证主电源切断时能正常维持RTC工作。相应闹铃和自动开机都有着相似的原理,帮我解惑不少。要想设计一个实时时钟和闹钟的功能,只需要RTC的两个中断,TimeTick和Alarm,需要设置一些存放器的初值。另外,通过使用数码管,还有自己上网搜索一些资料,了解到如何使晶体管发亮,而形成自己所要显示的字符或者数字形状,例如显示时间。而这次实验就是要用数码管显示时间或者日期。由于发光是用硬件实现的,而要控制得到我们要的输出,要通过我们编写代码,幸好中间的过程已经被实现了,我们实际上在键盘上打入数字,我们只需要初始化一些存放器的值,数码管就会有显示。而ZLG7290产生的中断,主机通过IIC总线可以读取。而IIC总线协议是需要了解过程的。学习嵌入式系统的时间并不长,而且又是第一次接触,因此有很多东西还是不太了解,虽然说时间不长,但是还是很有收获的,这次毕竟使自己有时机去学习一些贴近硬件的知识,如果将来有时机再学习,我还是很乐意的。毕竟一个真正学习计算机的人不能只知道软件的知识。附录:主要程序代码:#include"2410addr.h"#include"target.h"#include"2410lib.h"#include"iic.h"voidiic_init(void){ rGPEUP|=0xc000; //禁止上拉 rGPECON|=0xa00000; //设置GPIO为IIC总线 //EnableACK,PrescalerIICCLK=PCLK/16,Enableinterrupt,TransmitclockvalueTxclock=IICCLK/16 //rIICCON=(1<<7)|(0<<6)|(1<<5)|(0xf);//rIICADD=0x10; //2410从设备地址//rIICSTAT=0x10; //IIC总线输出有效}voidiic_send_master(unsignedchar*buf,intsize){ //IIC总线Master模式数据发送函数 intfc1; //ZLG7290要求IIC传输速率不大于32Kbit/s,即Txclock不大于32KHz //设置IICCLK=PCLK/512Txclock=IICCLK/4,那么 //如果FLCK=200MHz,那么最大Txclock=24kHz,处于可接受范围 //初始化IIC rIICCON=(1<<7)|(1<<6)|(1<<5)|(0<<4)|(3<<0); rIICSTAT=0xD0; //发送从设备地址 rIICDS=*(buf++)&0xFE; size--; rIICSTAT=0xF0; while(!(rIICCON&IIC_PENDING_BIT)); while(size>0) { //发送buf数据 rIICDS=*(buf++); size--; //等待IICSCL到达触发沿 for(fc1=0;fc1<10;fc1++){;} if(size!=0) { rIICCON=rIICCON&IIC_PENDING_MASK; } else { //最后发送不需要应答 rIICCON=rIICCON&IIC_PENDING_MASK&IIC_ACK_MASK; } //等待发送完成 while(!(rIICCON&IIC_PENDING_BIT)); } //停止IIC rIICSTAT=0xD0; rIICCON=rIICCON&IIC_PENDING_MASK; Delay(10);}voidiic_receive_master(unsignedchar*cmdbuf,intcmdsize,unsignedchar*buf,intsize){ //IIC总线Master模式数据接收函数 intfc1; //ZLG7290要求IIC传输速率不大于32Kbit/s,即Txclock不大于32KHz //设置IICCLK=PCLK/512Txclock=IICCLK/4,那么 //如果FLCK=200MHz,那么最大Txclock=24kHz,处于可接受范围 intslave_addr; rIICCON=(1<<7)|(1<<6)|(1<<5)|(0<<4)|(3<<0); rIICSTAT=0xD0; //发送从设备地址 slave_addr=*(cmdbuf++); cmdsize--; rIICDS=slave_addr&0xFE; rIICSTAT=0xF0; while(!(rIICCON&IIC_PENDING_BIT)); while(cmdsize>0) { //发送buf数据 rIICDS=*(cmdbuf++); cmdsize--; //等待IICSCL到达触发沿 for(fc1=0;fc1<10;fc1++){;} rIICCON=rIICCON&IIC_PENDING_MASK; //等待发送完成 while(!(rIICCON&IIC_PENDING_BIT)){;} } rIICDS=slave_addr|0x01; rIICSTAT=0xB0; while(size>0) { if(size>1) { rIICCON=rIICCON&IIC_PENDING_MASK; } else { //最后接收不需要应答 rIICCON=rIICCON&IIC_PENDING_MASK&IIC_ACK_MASK; } //等待接收完成 while(!(rIICCON&IIC_PENDING_BIT)){;} //取出数据 *(buf++)=rIICDS; size--; } //停止IIC rIICSTAT=0x90; rIICCON=rIICCON&IIC_PENDING_MASK; Delay(10);}void__irqisr_keyboard(void){ unsignedcharcmdbuf[4]; unsignedcharkey[5]; //关闭1号外中断 rINTMSK=rINTMSK|BIT_EINT1; //去除中断位 rINTPND=BIT_EINT1; rSRCPND=BIT_EINT1; //等待IIC总线空闲 while(rIICCON&IIC_PENDING_BIT){;} //读取键值 cmdbuf[0]=IIC_ADDR_ZLG7290; cmdbuf[1]=IIC_ADDR_ZLG7290_KEY; iic_receive_master(cmdbuf,2,key,4); //判断是否有效按键 if(key[1]==0x01) { //数字左移2位 for(fc1=0;fc1<4;fc1++) { cmdbuf[1]=IIC_ADDR_ZLG7290_DPM0+date[fc1]; cmdbuf[2]=0xff; iic_send_master(cmdbuf,3); } } elseif(key[1]==0x02) { //数字左移2位 for(fc1=0;fc1<4;fc1++) { cmdbuf[1]=IIC_ADDR_ZLG7290_DPM0+time[fc1]; cmdbuf[2]=0xff; iic_send_master(cmdbuf,3); } } //翻开1号外中断 rINTMSK=rINTMSK&~BIT_EINT1;}void__irqisr_alarm(void){ rINTMSK=rINTMSK|BIT_RTC; Uart_Printf("Thisisaalarminterruptoccuratthe30thsecondeveryminute.\n"); //去除中断位 rINTPND=BIT_RTC; rSRCPND=BIT_RTC; rINTMSK=rINTMSK&~BIT_RTC;}void__irqisr_tick(void){ publicinttmpintmsk; publicintyear; publicintmonth; publicintday; publicintdate; publicinthour; publicintminute; publicintsecond; publicintreadtime=0; publicintdate[3]; publicinttime[3]; //在实际应用中,由于“嘀嗒〞中断实时性要求较高,中断时间固定,而且处理时间不长 //所以需要屏蔽所有中断,并且去除中断位操作必须尽快执行 //屏蔽所有中断 tmpintmsk=rINTMSK; rINTMSK=BIT_ALLMSK; //去除中断位 rINTPND=BIT_TICK; rSRCPND=BIT_TICK; //“嘀嗒〞中断效劳处理 //读时间 //由于读时间时可能跨越了年、月、日、时、分界限 //例如:本来时间是2000年12月31日23时59分59秒,但刚好读取到hour的时候,到达了2001年的0秒 //从而造成了读出的时间前后不一致性 //所以,如果遇到了秒读取是0的话,那么需要再读一次。这样就能解决问题 do { year=((rBCDYEAR&0xF0)>>4)*10+(rBCDYEAR&0x0F); month=((rBCDMON&0x10)>>4)*10+(rBCDMON&0x0F); date=((rBCDDAY&0x70)>>4)*10+(rBCDDAY&0x0F); hour=((rBCDHOUR&0x70)>>4)*10+(rBCDHOUR&0x0F); minute=((rBCDMIN&0x70)>>4)*10+(rBCDMIN&0x0F); second=((rBCDSEC&0x70)>>4)*10+(rBCDSEC&0x0F); day=(rBCDDAY&0x07); readtime++; }while(second==0&&readtime<=1); date[0]=year; date[1]=month; date[2]=date; time[0]=hour; time[1]=minute; time[2]=second; Uart_Printf("Timeisnow:%.2d.%.2d.%.2d%.2d:%.2d:%.2d,%d\n",year,month,date,hour,minute,second,day); //恢复中断 rINTMSK=tmpintmsk;}voidmain(void){ iic_init(); //Inittargetboard(callthisfunctionbeforeanythingcango!) Target_Init(); Uart_Printf("CITK2410RTCdemousingRTC.\n"); //初始化RTC和“嘀嗒〞中断控制器 rRTCCON=(1<<3)|(0<<2)|(0<<1)|(0); //RTC设置只读〔为了RTC稳定,需要写的时候再翻开写允许位〕 rTICN
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度环保监测服务期限延长补充协议3篇
- 《教育评估中介组织的创新发展研究》
- 2024年度绿色环保型售楼部建筑工程施工合同
- 2024医疗事故赔偿及医疗过错责任认定及赔偿协议3篇
- 职场团队凝聚力培训
- 2024同居生活环境卫生维护与管理合同3篇
- 2024年02月江苏2024年广发银行徐州分行招考笔试历年参考题库附带答案详解
- 2024年度职工食堂餐饮服务标准制定与执行合同2篇
- 病证的后期调护
- 药物溶栓治疗策略优化-洞察分析
- 【MOOC】中国文化概论-华南师范大学 中国大学慕课MOOC答案
- 2025年蛇年年会汇报年终总结大会模板
- 新编苏教版一年级科学上册实验报告册(典藏版)
- 沟通的艺术智慧树知到期末考试答案章节答案2024年湖南师范大学
- 微机原理与应用智慧树知到期末考试答案章节答案2024年山东大学
- 细胞生物学知识点
- 幼儿园生成课程与预成课程
- 时间序列分析论文
- 轻型货车设计
- 实际问题与反比例函数(1)
- 城市轨道交通工程项目质量安全控制要点
评论
0/150
提交评论