湖南大学多功能定时器单片机课程设计_第1页
湖南大学多功能定时器单片机课程设计_第2页
湖南大学多功能定时器单片机课程设计_第3页
湖南大学多功能定时器单片机课程设计_第4页
湖南大学多功能定时器单片机课程设计_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

1、湖南大学电子实训报告所 属 院 系: 电气与信息工程学院专 业:测控技术与仪器班 级:(一)学 号:姓 名:张东指 导 老 师: 朱志杰设 计 时 间: 2014年5月目录1、 设计目的及设计要求()2、 系统原理框图()3、 硬件原理图()4、 程序及主要程序流程图()5、 使用说明书()6、 心得体会()七、参考文献()八、教师评语()一、设计目的及设计要求1、设计目的(1)在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用;(2)能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,在软件编程、排错调试、相关仪器设备

2、的使用技能等方面得到较全面的锻炼和提高;(3)使学生增进对单片机的感性认识,加深对单片机理论方面的理解。使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通信等;(4)使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。2、本设计可实现如下功能:(1)选择LCD12864显示,可显示年、月、日、时、分、秒、星期、(2)会使用实时钟芯片DS1307(3)选择蜂鸣器电路,实现闹钟设置(4)选择按键功能,设计实现时钟校正功能,12小时/24小时制(5)上电或RESET后能自动显示当前时间(时:分:秒):首次

3、上电复位显示0时0分0秒,以后每次RESET均显示正确的当前时间二、系统原理框图制作一个电子时钟,该电子时钟具有实时时钟显示、时钟校正、设置闹钟等功能。其结构框图如下:A D U C 8 4 8 LCD12864 实时钟芯片 蜂鸣器(闹钟) 电池供电 键盘数字钟是采用数字电路实现对时,分,秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。三、硬件原理图1、 键盘部分:(1)硬件模块接线图(2) 键盘功能说明按键0:进入设置模式,实现秒(S)、分(M)、时(H)

4、、年(Y)、月(m)、日(D)、星期(W)、闹钟开关、闹钟时间设置的切换。按键1:每按一次按键1,对所设置的时间加1,当设置的时间超过它的最大值时,该项自动为0,例如:当设置秒为59时,秒自动清零;按键2:每按一次按键:2,对所设置的时间减1,当设置的时间小于0时,该项自动为它的最大值;按键3:设置完成后的确认键并可按此键中途退出设置,时间按用户设置值正常计时;按键4:12小时/24小时切换功能。2、 LCD12864部分:(1) LCD12864模块接线图(2) LCD12864功能说明能够显示年、月、日、星期、闹钟,显示键盘控制的变化。3、 DS1307模块(1)DS1307模块接线图(2

5、) DS1307功能说明本系统采用DS1307实时时钟芯片。它是一款总线接口的时钟日历芯片,片内含有8个特殊功能寄存器和56bit的SRAM,是一种低功耗的实时时钟芯片。它的主要技术性能指标:具有秒、分、时、日、星期、月、年的计数功能,并且具有12小时制和24小时制的计数模式,可自动调整每月的天数,具有闰年调整的功能,具有自动掉电保护和上电复位的功能。同时它独立于CPU工作,不受CPU主晶振及其电容的影响,而且计时准确,月累计误差小于10秒。4、 蜂鸣器模块(1) 蜂鸣器模块连接图(2) 蜂鸣器功能说明蜂鸣器在闹钟时间到时就鸣叫,是反应闹钟的模块。四、程序及主要程序流程图1、主程序(main.

6、c)#includeaduc848.h#includeLCD12864.h#includertc.hunsigned char GetKey();unsigned char CurrentTime7;unsigned char TestTime7=57,59,23,7,30,5,10;unsigned char KeyValue;unsigned char SetMode=0;unsigned char ShowMode=0;unsigned char ShowMode1=0;unsigned char ClockTime3=0,0,0;sbit Buzzer = P26;void Timer

7、0() interrupt 1TR0 = 0;Buzzer = Buzzer;TH0 = 0xE6;TL0= 0x10;TR0=1;void stop() P1&=0xf0; P2|=0x0f; P2&=0xfe; if(P1&0x08)=0) P2&=0xfe; void KeyProcess();main()PLLCON&=0xf8;/设置频率为12.MHzTMOD = 0x01;/置T0定时工作方式1ET0 = 1; /开T0中断EA = 1;CFG848|=0x01;/使用片内xram LCDInitialize();I2CCON=0xE8;/配置IIC为软件主发送模式LCDPrint

8、Sentence(0,4,0,年);LCDPrintSentence(0,8,0,月);LCDPrintSentence(0,12,0,日); LCDPrintSentence(2,2,0,时);LCDPrintSentence(2,6,0,分);LCDPrintSentence(2,10,0,秒);LCDPrintSentence(4,0,0,星期); LCDPrintSentence(6,0,0,闹钟);LCDPrintSentence(6,10,0,时);LCDPrintSentence(6,14,0,分);while(1) stop(); if(SetMode=0)ReadTime(C

9、urrentTime); switch(SetMode) case 0:ShowMode=0;ShowMode1=0;break; case 1:ShowMode=0x01;break; case 2:ShowMode=0x02;break; case 3:ShowMode=0x04;break; case 4:ShowMode=0x40;break; case 5:ShowMode=0x20;break; case 6:ShowMode=0x10;break; case 7:ShowMode=0x08;break;case 8:ShowMode1=0x80;ShowMode=0;break;

10、 case 9:ShowMode1=0x01;break; case 10:ShowMode1=0x02;break; default:break; LCDPrintString(0,0,0,20); LCDPrintNumber(0,2,ShowMode&0x40,2,CurrentTime6); /year LCDPrintNumber(0,6,ShowMode&0x20,2,CurrentTime5); /month LCDPrintNumber(0,10,ShowMode&0x10,2,CurrentTime4); /dayLCDPrintNumber(2,0,ShowMode&0x0

11、4,2,CurrentTime2); /hour LCDPrintNumber(2,4,ShowMode&0x02,2,CurrentTime1); /minute LCDPrintNumber(2,8,ShowMode&0x01,2,CurrentTime0); /second LCDPrintZi(4,4,ShowMode&0x08,WordTableCurrentTime3+10);/week LCDPrintZi(6,4,ShowMode1&0x02,WordTable20-ClockTime0);LCDPrintNumber(6,8,ShowMode1&0x80,2,ClockTim

12、e2); /hourLCDPrintNumber(6,12,ShowMode1&0x01,2,ClockTime1); /minutewhile(CurrentTime2=ClockTime2&CurrentTime1=ClockTime1&ClockTime0=1) TR0=1;KeyValue=GetKey();if(KeyValue=3)ClockTime0=0; TR0=0; KeyProcess(); void KeyProcess() KeyValue=GetKey(); switch(KeyValue) case 0: if(SetMode=0)SwitchRTC(0); Set

13、Mode+; if(SetMode10) SetMode=0; SetTime(CurrentTime); if(SetMode=0)SwitchRTC(1); break; case 1: switch(SetMode) case 1:CurrentTime0+;if(CurrentTime059)CurrentTime0=0;break;/秒 case 2:CurrentTime1+;if(CurrentTime159)CurrentTime1=0;break;/分 case 3:CurrentTime2+;if(CurrentTime223)CurrentTime2=0;break;/时

14、 case 4:CurrentTime6+;if(CurrentTime699)CurrentTime6=0;break;/年 case 5:CurrentTime5+;if(CurrentTime512)CurrentTime5=1;break;/月case 6: CurrentTime4+; switch(CurrentTime5) case 1: case 3: case 5: case 7: case 8: case 10: case 12:if(CurrentTime431)CurrentTime4=1;break; case 4: case 6: case 9: case 11:i

15、f(CurrentTime430)CurrentTime4=1;break; case 2: if( (0 = CurrentTime6%4)&(0 !=CurrentTime6%100) |(0 = CurrentTime6%400) )if(CurrentTime428)CurrentTime4=1; else if(CurrentTime429)CurrentTime4=1; break; default:break; break;/日case 7:CurrentTime3+;if(CurrentTime36)CurrentTime3=0;break; /周 case 8:ClockTi

16、me2+;if(ClockTime223)ClockTime2=0;break;/时 case 9:ClockTime1+;if(ClockTime159)ClockTime1=0;break;/分 case 10:ClockTime0+;if(ClockTime01)ClockTime0=0;break;/开关 default:break; break; case 2: switch(SetMode) case 1:CurrentTime0-;if(CurrentTime0254)CurrentTime0=59;break;/秒 case 2:CurrentTime1-;if(Current

17、Time1254)CurrentTime1=59;break;/分 case 3:CurrentTime2-;if(CurrentTime2254)CurrentTime2=23;break;/时 case 4:CurrentTime6-;if(CurrentTime6254)CurrentTime6=99;break;/年 case 5:CurrentTime5-;if(CurrentTime51)CurrentTime5=12;break;/月case 6: CurrentTime4-; switch(CurrentTime5) case 1: case 3: case 5: case 7

18、: case 8: case 10: case 12:if(CurrentTime41)CurrentTime4=31;break; case 4: case 6: case 9: case 11:if(CurrentTime41)CurrentTime4=30;break; case 2: if( (0 = CurrentTime6%4)&(0 !=CurrentTime6%100) |(0 = CurrentTime6%400) )if(CurrentTime41)CurrentTime4=28; else if(CurrentTime4254)CurrentTime3=6;break;

19、/周 case 8:ClockTime2-;if(ClockTime2254)ClockTime2=23;break;/时 case 9:ClockTime1-;if(ClockTime1254)ClockTime1=59;break;/分 case 10:ClockTime0-;if(ClockTime0254)ClockTime0=1;break;/开关 default:break; break; case 3: if(SetMode!=0) SetTime(CurrentTime); SetMode=0; SwitchRTC(1); break; default:break; case

20、4: /12小时与24小时的转换if(CurrentTime212)CurrentTime2=CurrentTime2-12;SetTime(CurrentTime);elseCurrentTime2=CurrentTime2+12;SetTime(CurrentTime);break; 2、键盘程序(ProCess.c)#includeaduc848.hvoid delay() /延时函数unsigned char i;for(i = 0;i 70) ramos=1; KeyJs=66; if(temp=0x0f)ramos=1;KeyJs=0; KeyTemp=0xf0; return K

21、eyTemp; 3、液晶显示器程序(LCD12864.c)#includeaduc848.h#includeBLESS.Hunsigned char GetWordAddress(unsigned int WordCode) switch(WordCode) case 0xc4ea:return /*年1*/1; case 0xd4c2:return /*月2*/2; case 0xc8d5:return /*日3*/3; case 0xcab1:return /*时4*/4; case 0xb7d6:return /*分5*/5; case 0xc3eb:return /*秒6*/6; ca

22、se 0xd0c7:return /*星17*/17; case 0xc6da:return /*期18*/18; case 0xbfaa:return /*开19*/19; case 0xb9d8:return /*关20*/20; case 0xc4d6:return /*闹21*/21; case 0xd6d3:return /*钟22*/22; default:break; /*变量定义*/sbit LCD_RS = P36;sbit LCD_RW = P35;sbit LCD_EN = P33;sbit LCD_CS1 = P37;sbit LCD_CS2 = P24;sfr LCD

23、Data=0x80;/*函数声明*/写数字(行,列,显示位数,数字)void LCDPrintNumber(unsigned char LCDHangN,unsigned char LCDLieN,unsigned char mode,unsigned char WeiShu,unsigned long int NUMBER);void LCDWriteCommand(unsigned char COMMAND);/写指令void LCDWriteData(unsigned char DATA);/写数据unsigned char LCDReadData();/显示8*8阵列(行,列,字模搜地

24、址)void LCDPrintByte(unsigned char ByteHang,unsigned char ByteLie,unsigned char mode,unsigned char Byte);/显示汉字(行,列,字模搜地址)void LCDPrintZi(unsigned char LCDHang,unsigned char LCDLie,unsigned char mode,unsigned char Zi);/显示字符串(行,列,字符串首地址)void LCDPrintString(unsigned char LCDHangS,unsigned char LCDLieS,u

25、nsigned char mode,unsigned char *STRING);/显示字符(行,列,字符地址)void LCDPrintChar(unsigned char LCDHangC,unsigned char LCDLieC,unsigned char mode,unsigned char *CHAR);void LCDInitialize();/初始化void LCDDelay()unsigned int Delay_Js,Delay_Js2;for(Delay_Js=0;Delay_Js1;Delay_Js+)Delay_Js2+;/反显示8*8阵列(行,列)void LCDI

26、nverseByte(unsigned char RByteHang,unsigned char RByteLie);/反显示快(起始行,起始列,结束行,结束列)void LCDInverseBlock(unsigned char StartHang,unsigned char StartLie,unsigned char EndHang,unsigned char EndLie);/*函数声明完毕*/unsigned int wordtemp;/*写中文句子*/void LCDPrintSentence(unsigned char hang,unsigned char lie,unsigne

27、d char mode,unsigned char *wordp) unsigned int *word; word=(unsigned int *)wordp; while(*word)&0xff00)!=0x0000) LCDPrintZi(hang,lie,mode,WordTableGetWordAddress(*word); word+;lie+=2; /*写指令*/void LCDWriteCommand(unsigned char COMMAND) LCDDelay(); LCD_RS=0; LCD_RW=0; LCDDelay(); LCDData=COMMAND; LCD_E

28、N=1; LCDDelay(); LCD_EN=0; /*写数据*/void LCDWriteData(unsigned char DATA) LCDDelay(); LCD_RS=1; LCD_RW=0; LCDDelay(); LCDData=DATA; LCD_EN=1; LCDDelay(); LCD_EN=0; unsigned char LCDReadData() unsigned char LCDReadTemp; LCDData=0xff; LCDDelay(); LCD_RS=1; LCD_RW=1; LCDDelay(); LCD_EN=1; LCDDelay();/需要延

29、时 LCDReadTemp=LCDData; LCD_EN=0; /记得把EN清零,不然会影响别的函数 return LCDReadTemp;/*写8*8阵列*/void LCDPrintByte(unsigned char ByteHang,unsigned char ByteLie,unsigned char mode,unsigned char Byte)unsigned char LieTemp,i;if(ByteLie8)LCD_CS1=1;LCD_CS2=0;LieTemp=ByteLie;elseLCD_CS2=1;LCD_CS1=0;LieTemp=ByteLie-8;LCDW

30、riteCommand(ByteHang+0xb8);LCDWriteCommand(LieTemp*8+0x40);if(mode)for(i=0;i8;i+)LCDWriteData(Bytei);else for(i=0;i8;i+)LCDWriteData(Bytei);LCD_CS1=0;LCD_CS2=0;/*反显8*8阵列*/void LCDInverseByte(unsigned char IByteHang,unsigned char IByteLie)unsigned char LCDReadByte8;unsigned char LieTemp,i;LCD_CS1=0;

31、LCD_CS2=0;if(IByteLie8)LCD_CS1=1;LieTemp=IByteLie;elseLCD_CS2=1;LieTemp=IByteLie-8;LCDWriteCommand(IByteHang+0xb8);LCDWriteCommand(LieTemp*8+0x40);LCDData=0xff;LCDReadData();for(i=0;i8;i+)LCDReadBytei=LCDReadData();LCDWriteCommand(LieTemp*8+0x40);for(i=0;i8;i+)LCDWriteData(LCDReadBytei);LCD_CS1=0; L

32、CD_CS2=0;/*反显示块*/void LCDInverseBlock(unsigned char StartHang,unsigned char StartLie,unsigned char EndHang,unsigned char EndLie) unsigned char i,j; for(i=StartHang;i=EndHang;i+) for(j=StartLie;j0)temp0=(NUMBER%)/10000;temp1=(NUMBER%10000)/1000;temp2=(NUMBER%1000)/100;temp3=(NUMBER%100)/10;temp4=NUMB

33、ER%10;for(j=0;jWeiShu;j+) LCDPrintChar(LCDHangN,LCDLieN+j,mode,CharTable(tempj+5-WeiShu)+16);/else LCDPrintString(LCDHangN,LCDLieN,0);void LCDPrintChar(unsigned char LCDHangC,unsigned char LCDLieC,unsigned char mode,unsigned char *CHAR)LCDPrintByte(LCDHangC,LCDLieC,mode,CHAR);LCDPrintByte(LCDHangC+1

34、,LCDLieC,mode,CHAR+8); void LCDPrintString(unsigned char LCDHangS,unsigned char LCDLieS,unsigned char mode,unsigned char *STRING)while(*STRING!=0) LCDPrintChar(LCDHangS,LCDLieS,mode,CharTable(*STRING)-32); STRING+; LCDLieS+; void LCDInitialize()unsigned char i,j;LCD_CS1=1;LCD_CS2=1;LCDWriteCommand(0xc0);for(i=0;i200;i+)j+;LCDWriteCommand(0xc0);LCDDelay();LCDWriteCommand(0x3f);LCDWriteCommand(0xb8);LCDWriteCommand(0x44);for(i=0;i8;i+)LCDWriteCommand(i+0xb8);LCDWriteCommand(0x40); for(j=0;j4)*10+(TIME0&0x0f); /second TIME1=(T

温馨提示

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

评论

0/150

提交评论