江苏大学单片机课程设计-多功能数字钟的设计.docx_第1页
江苏大学单片机课程设计-多功能数字钟的设计.docx_第2页
江苏大学单片机课程设计-多功能数字钟的设计.docx_第3页
江苏大学单片机课程设计-多功能数字钟的设计.docx_第4页
江苏大学单片机课程设计-多功能数字钟的设计.docx_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

单片机课程实验报告班 级 J计算机1302 学 号 4131110037 姓 名 杨岚 指导老师 余景华 2016.07.091、 多功能数字钟的设计要求:1.能在LED显示器上实现正常的时分秒计时2.能通过键盘输入当前时间,并从该时间开始计时3.有校时、校分功能4.有报时功能,通过指示灯表示5.有闹时功能,闹时时间可以设定,通过指示灯表示二、课程设计电路图:图1 设计电路图HD7279A的片选引脚CS连在P5.7;通过C8051F020的P1.6、P1.7连接7279A的CLK和DATA实现串行数据编程;KEY连在比较器1的同相输入端CP1P三、设计思路:根据课程设计要求,我们要设计一个多功能数字电子时钟,随着人类科技文明的发展,高精度、多功能、小体积、低功耗,是现代时钟发展的趋势。在这种趋势下,时钟的数字化、多功能化已经成为现代时钟生产研究的主导设计方向。本实验正是基于这种设计方向,以单片机(C8051F020)为控制核心,设计制作一个多功能的数字时钟。在这些当中,必须要求要有时钟功能、校时校分功能、整点报时和闹钟功能等。1.1首先要实现数码管的正常时分秒计时必须初始化系统时钟,初始化I/O端口以及定时器和使能比较器等,为系统的运行做必要的准备。1.2其次通过键盘输入当前时间并从当前时间开始计时,这个过程中搞清楚,通过键盘输入的数据送到了哪里,是通过什么样的方式送进去的,同时对时间的计时有一个严密的算法来控制。1.3在时间通过键盘输入并正常显示后,可以通过按键来进行校时、校分的功能。并显示出校正后的时间1.4通过按键实现闹钟功能,在设置闹钟的同时,原时间能确保正确行走。7279指令说明:88H,闪烁控制指令,d1-d8对应8个数码管,0表示闪烁,1表示不闪烁。 开始在键盘上输入时分秒进入校分校时功能进入校分校时功能进入闹钟功能输入按键(ABCD) 输入按键(F) 当达到整点时,A (校时的高位) F(输入闹钟) 数码管闪烁3秒B(校时的低位) 当当前时间与闹钟时间相等时,C(校分的高位) 数码管闪烁2秒。D(校分的低位)图2 功能模块图输入按键A使得时钟的时高位加1,若时高位值超过2则返回0值。输入按键B使得时钟的时低位加1,若时低位值超过9则返回0值同时时高位加1,最后判断时高位1且时低位3则时高位=0,时低位0。输入按键C使得时钟的分高位加1,若分高位值超过5,则时低位加1,分高位至0。输入按键D使得时钟的分低位加1,若分低位值超过9,则分高位加1,分低位至0。输入按键E使得时钟的秒高位加1,若秒高位值超过5,则分低位加1,秒高位至0。按键F进入闹钟模块。四、程序的结构图开始关看门狗端口初始化定时器T0初始化使能比较器1开定时器0中断开总体中断复位7279在最右端数码管闪烁显示“”从键盘上输入时间InputNum否有效按键是数码管更新显示DispValue校时校分模块整点报时模块闹钟功能返回显示时间图3 主程序流程图五、具体功能模块的设计及实现:1、端口初始化:将允许SMBus、SPI0和UART0,使能交叉开关和弱上拉。实现代码:void PORT_Init (void) XBR0 = 0x07; /允许SMBus、SPI0和UART0 XBR1 = 0x00; XBR2 = 0x44; /使能交叉开关和弱上拉2、 定时器初始化将T0以方式一,系统时钟频率计数,1000个脉冲为一秒。实现代码:void Timer0_Init (void) CKCON|=0x8; /T0按系统时钟频率计数 TMOD|=0x1; /T0方式1Count1ms=10; TR0 = 0; /停止T0 TH0 = (-SYSCLK/1000) 8; /定时1ms的时间常数 TL0 = -SYSCLK/1000; TR0 = 1; /启动T0 IE|= 0x2; /开T0中断3、 读取按键值首先需要判断是否按键,若未按键则返回-1,若按键则记录保存按键的值,将其放在keyvalue中保存。实现代码:unsigned char GetKeyValue(void)unsigned char KeyValue;if(CPT1CN&0x40) return -1;/if (P17=1) return -1;/无键按下 Send7279Byte(0x15);/发读键盘命令 KeyValue=Receive7279Byte();NOSELECT7279; return KeyValue; 开始是否按键否是返回-1发送读取读键盘命令接受键盘值将其保存在keyvalue中返回keyvalue值结束图4 读取按键值流程图4、 首次启动程序时输入初始时间首先在显示器上显示-,提示程序开始运行,其后将按键进来的六个数字依次保存在num中(若按键不是0-9则无效),然后再显示器上显示。实现代码:unsigned long InputNum(void)unsigned long Num=0;unsigned char i=0, KeyValue; DispLED( -,0);/输入提示FlashLED(0); /第一位闪烁Delay1s(1);while(1) KeyValue=GetKeyValue(); if (i=6) /6位数据输入完,返回 FlashLED(8);/关闪烁 return Num; if(KeyValue=0) & (KeyValue9,则SecondL=0,SecondH加一。再判断SecondH是否大于5,若SecondH5,则SecondH=0,MinuteL加一。再判断MinuteL是否大于9,若MinuteL9,则MinuteL=0,MinuteH加一。再判断MinuteH是否大于5,若MinuteH5,则MinuteH=0,HourL加一。再判断HourL是否大于9,若HourL9,则HourL=0,HourH加一。再判断HourH是否大于2,若HourH2,则HourH=0。最后判断HourH1且HourL3则HourH=0,HourL=0。实现代码:SecondL+;if (SecondL9) SecondH+,SecondL=0; if(SecondH5)SecondH=0,MinuteL+; if (MinuteL9) MinuteH+,MinuteL=0;if(MinuteH5)MinuteH=0,HourL+; if(HourL9) HourH+;HourL=0;if(HourH2) HourH=0;if(HourH1&HourL3)HourH=0,HourL=0;7、 校时校分功能根据按键来判断运行,若按键是A,则执行HourH+1的操作。若按键是B,则执行HourL+1的操作。若按键是C,则执行MinuteH+1操作。若按键是D,则执行MinuteL+1操作。若按键是E,则执行SecondH+1操作。实现代码:if(KeyValue=10)HourH+;if(KeyValue=11)HourL+;if(KeyValue=12)MinuteH+;if(KeyValue=13)MinuteL+;开始从键盘上输入校时校分KeyValue=10否 是HourH+KeyValue=11否是HourL+KeyValue=12否是MinuteH+KeyValue=13是MinuteL+图7 校时校分功能流程图8、 整点报时功能在SecondL在0到3之间时并且SecondH=、MinuteL=0、MinuteH=0时显示器内容闪烁表示报时。SecondL超过3后取消闪烁,回复正常。实现代码if(SecondL=0&SecondL3)&SecondH=0&MinuteL=0&MinuteH=0)FlashLED(8);开始(SecondL=0&SecondL3否显示器闪烁取消图8 整理报时功能流程图9、 闹钟功能在按键为F的时候进入闹钟模式。输入设定时间,系统保存设定的时间,并在计时的每秒上面与保存的时间进行比较,若一致,则显示器闪烁,时间暂停计时,表示闹钟。实现代码:KeyValue=GetKeyValue();if(KeyValue=15)SetTime=InputNum();NowTime0=(unsigned char)(SetTime/100000)4);/时 SetTime=SetTime%100000;NowTime0=NowTime0|(SetTime/10000);SetTime=SetTime%10000;NowTime1=(unsigned char)(SetTime/1000)4);/分 SetTime=SetTime%1000;NowTime1=NowTime1|(SetTime/100);SetTime=SetTime%100; NowTime2=(unsigned char)(SetTime/10)4);/秒 SetTime=SetTime%10;NowTime2=NowTime2|SetTime;S0=NowTime0/16;/转换成10进制 S1=NowTime0%16; S2=NowTime1/16;S3=NowTime1%16; S4=NowTime2/16; S5=NowTime2%16;if(SecondL=S5&SecondH=S4&MinuteL=S3&MinuteH=S2&HourL=S1&HourH=S0)Send7279Byte(0x88);Send7279Byte(0x00);a=SecondL;a=a+2;if (a=SecondL) FlashLED(8);开始按键是否为F否 是是等待输入闹钟设定时间的数字是否已输入六个符合规格的数字否 否 是结束闹钟设定模式,恢复时钟计时模式图9 闹钟功能流程图显示指针DisplLED所指6个单元数据流程图:开始定义i=0;i=a) & (ch=A) & (ch=F)否是ch-=A;ch+=0xa用不译码方式显示在第i位否ch= 是Send7279Byte(0x00)Send7279Byte(BdSegch&0x0f)否ShowDot=ich=- 否是结束Send7279Byte(0x80|BdSegch&0x0f)是Send7279Byte(0x01)图10 显示指针DisplLED所指6个单元数据流程图六、实验小结:本次课程设计的基本要求是实现多功能时钟具备整点报时,校时校分的功能以及闹钟功能。整点报时模块实现的是当时间达到整点时,数码管开始闪烁,并闪烁4秒。校时校分模块实现的是当按下ABCD四个按键的任意一个,相对应的时分位会通过自加来实现校时校分。闹钟模块实现的是当时间达到设定的时间时,数码管开始闪烁,并闪烁2秒。在这一个星期的时间里,我经历从迷茫到清晰的全过程,首先要分析好自己的设计目的及要求,在设计程序前不一定要有一个清晰的思路和一个完整的流程图,并且学会单步调试来找错误。这就好比是人类成长的过程,常有一些不如意和挫折,但只要勇于挑战勇于去尝试总能找到解决的方法。在这学期的课程序设计中,收获知识的同时,还收获了阅历,收获了成熟,通过查找大量资料,请教老师,以及不懈的努力,不仅培养了独立思考、 动手制作的能力,在各种其它能力上也都有了提高。更重要的是,在课程序设计里,我也学会了很多学习的方法,知道了理论和实践的巨大差别。而这是以后最实用的,真的是受益匪浅。要面对社会的挑战,只有不断的学习、实践,再学习、再实践。同时在与老师和同学帮助下将知识融会贯通且通过自己的努力设计了一个数字时钟,这也激起了我的学习兴趣和开发创新思维,让我懂得了学习的重要性,了解到理论知识与实践相结合的重要性,学会了坚持。这将为自己今后的学习和工作作出了最好的榜样。再次感谢老师的热心指导,没有老师的指导我们不可能完成。七、附录#include #include /*软件仿真I2C总线与HD7279A连接的两根并行口线*/sbit HD7279_DAT=P17;sbit HD7279_CLK=P16;/*宏定义,HD7279A片选信号、数据信号和时钟信号定义*/#define NOSELECT7279 P5 |= 0x80 /P57接片选信号,选种#define SELECT7279 P5 &= (0x80) /未选种#define Set7279DAT HD7279_DAT=1 /数据线置1#define Clr7279DAT HD7279_DAT=0 /数据线置0#define Set7279CLK HD7279_CLK=1 /时钟高电平#define Clr7279CLK HD7279_CLK=0 /时钟底电平unsigned char Count1ms;unsigned char xdata NowTime3; /当前时间,用于当前时间的设置unsigned char xdata Hour,HourH,HourL,Minute,MinuteH,MinuteL,SecondH,SecondL;unsigned char xdata S6;/*对所调用其它文件中函数的声明*/void Delay1ms(unsigned char T); /延时T毫秒void Delay1s(unsigned char T); /延时T秒void Delay1us(unsigned char T); /延时T微秒/*仿真I2C总线时序发送一字节*/void SYSCLK_Init (void) int i; OSCXCN = 0x67; /外部晶振22.1184MHz for (i=0; i 8; /定时1ms的时间常数 TL0 = -SYSCLK/1000; TR0 = 1; /启动T0 IE|= 0x2; /开T0中断/*定时器T0中断服务程序(每隔1ms中断1次) */void Timer0_ISR (void) interrupt 1TH0 = (-SYSCLK/1000) 8; /重新装入初值 TL0 = -SYSCLK/1000;if (Count1ms) Count1ms-; /定时时间减1/*延时Ts(软件实现)*/void Delay1us(unsigned char T)while (T) _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); -T;/*延时Tms(定时器T0实现)*/void Delay1ms(unsigned char T)Count1ms=T;while (Count1ms); /在T0中断服务程序中减1/*延时Ts(定时器T0实现)*/void Delay1s(unsigned char T) while (T)Delay1ms(200);Delay1ms(200);Delay1ms(200);Delay1ms(200);Delay1ms(200);T-;void Send7279Byte(unsigned char ch)char i;SELECT7279; /置CS低电平 Delay1us(50);/延时50for (i=0;i8;i+)if (ch&0x80)/输出1位到HD7279A的DATA端 Set7279DAT;elseClr7279DAT;Set7279CLK;ch=ch1;/待发数据左移 Delay1us(8);Clr7279CLK; Delay1us(8);Clr7279DAT;/发送完毕,DATA端置低,返回 /*仿真I2C总线时序接收一字节*/unsigned char Receive7279Byte(void)unsigned char i,ch=0;Set7279DAT;/DATA端置为高电平(输入状态)Delay1us(50);for (i=0;i8;i+)Set7279CLK;Delay1us(8);ch=ch1;/接收数据左移1位if (HD7279_DAT) ch+=1;/接收1位数据Clr7279CLK;Delay1us(8);Clr7279DAT;/接收完毕,DATA端重新置成低电平(输出状态)return ch;/*让第No(0到5)位LED闪烁*/void FlashLED(unsigned char No)unsigned char i;Send7279Byte(0x88);/发闪烁指令 i=0x01;while (No) /将1移到第No位i=i1;No-;Send7279Byte(i); /0闪烁、1不闪烁NOSELECT7279; /*HD7279A左移命令*/void MoveLeft(void)Send7279Byte(0xA1);/发左移指令 NOSELECT7279; /*采用不译码方式显示时数字0到F的段码*/unsigned char code BdSeg=0x7e,0x30,0x6d,0x79, / 0 1 2 3 0x33,0x5b,0x5f,0x70, / 4 5 6 7 0x7f,0x7b,0x77,0x1f, / 8 9 a b 0x4e,0x3d,0x4f,0x47, / c d e f 0x00,0x01; /*显示指针DispBuf所指6个单元数据,点亮第ShowDot(1到6)个LED的小数点*/void DispLED(unsigned char *DispBuf,unsigned char ShowDot) char i,ch;ShowDot-;for (i=0;i=a) & (ch=A) & (ch=0) & (KeyValue=9) /只接收十进制的0到9 i+;Send7279Byte(0xC8); /发送键码值,按方式1译码下载显示 Send7279Byte(KeyValue);MoveLeft(); /显示并左移一位,仍使低位显示并闪烁。Send7279Byte(0x90); Send7279Byte(0x01); NOSELECT7279; WaitKeyOff();Num*=10; /转换成十进制 Num+=KeyValue;Delay1ms(200); void DispTime(void) Send7279Byte(0x85); /在最高位(第5位)LED显示小时的高位 Send7279Byte(HourH);Send7279Byte(0x84); /在第4位LED显示小时的低位Send7279Byte(HourL);Send7279Byte(0x83); /在第3位LED显示分钟的高位Send7279Byte(MinuteH);Send7279Byte(0x82); /在第2位LED显示分钟的低位Send7279Byte(MinuteL);Send7279Byte(0x81); /在第1位LED显示秒钟的高位Send7279Byte(SecondH);Send7279Byte(0x80); /在第0位LED显示秒钟的低位Send7279Byte(SecondL);void main(void) unsigned long CurrentTime=0;unsigned char i=0,a=0;unsigned long SetTime=0;unsigned char KeyValue; WDTCN = 0xde; /关看门狗 WDTCN = 0xad; SYSCLK_Init(); /初始化系统时钟 PORT_Init(); /初始化I/O口 Timer0_Init(); /初始化定时器 CPT1CN|=0x80; /使能比较器1 ET0 =1; /开定时器0中断 EA=1; /开总体中断 /Delay1ms(25); /7279上电复位的延时时间 /Send7279Byte(0xA4); /7279复位 do /从键盘输入时间,格式HHMMSS CurrentTime=InputNum(); DispValue(CurrentTime); NowTime0=(unsigned char)(CurrentTime/100000)4);/时 CurrentTime=CurrentTime%100000;NowTime0=NowTime0|(CurrentTime/10000);CurrentTime=CurrentTime%10000;NowTime1=(unsigned char)(CurrentTime/1000)4);/分 CurrentTime=CurrentTime%1000;NowTime1=NowTime1|(CurrentTime/100);CurrentTime=CurrentTime%100; NowTime2=(unsigned char)(CurrentTime/10)0x24)|(NowTime10x59)|(NowTime20x59); HourH=NowTime0/16;/转换成10进制 HourL=NowTime0%16; MinuteH=NowTime1/16; MinuteL=NowTime1%16; SecondH=NowTime2/16; SecondL=NowTime2%16; while(1) Delay1s(1); SecondL+;if (SecondL9) SecondH+,SecondL=0; if(SecondH5)SecondH=0,Mi

温馨提示

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

评论

0/150

提交评论