多功能定时装置_第1页
多功能定时装置_第2页
多功能定时装置_第3页
多功能定时装置_第4页
多功能定时装置_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

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

文档简介

1、单片机课程设计题目:多功能定时装置日期:2011年6月一、 设计要求:1)选择LED或LCD显示,可显示年、月、日、时、分、秒、星期、农历日期、节日、节气等(根据实际情况,选择部分或全部功能实现)2)会使用实时钟芯片3)选择蜂鸣器电路,实现闹钟设置和报警功能4)选择按键功能,设计实现时钟校正功能5)整点报时功能6)上电或RESET后能自动显示当前时间(时:分:秒):首次上电复位显示0时0分0秒,以后每次RESET均显示正确的当前时间附加实现功能:1)可以显示0.1100s的秒表,最小单位为0.1秒2)通过按键控制秒表清零、暂停、继续、退出等功能3)秒表可以分组存储(最多10组),批量显示4)具

2、有倒计时功能二、 所使用的硬件1. ADUC848管脚图ADUC848管脚图如图1所示。图1 ADUC848管脚2 电源模块 电源模块原理图如图2所示。图2 电源模块3. 数码管 该模块原理如图3所示。图3 数码管驱动电路4. RS232串口 串口连接原理图如图4所示。图4 RS232串口模块5. 蜂鸣器该模块原理图如图5所示。图5 蜂鸣器6. 按键输入 该模块原理如图6所示。图6 按键模块三、 程序流程图1)主流程图如图8所示:当前时间是否等于闹钟设置时间en=0x55?(无键)或en=0x80?(无效键)开始读取当前时间读取键值,键值为en开启闹钟YNYen=1?en=2?en=3?en=

3、4?en=8?en=9?en=13?en=14?显示年月日星期显示时分秒秒表正计时子程序秒表倒计时子程序显示正计时的记录值设置北京时间关闹钟1设置闹钟1en=0?设置闹钟2继续当前显示闹钟1开?开闹钟1en=13?关闹钟2闹钟2开?开闹钟2YYYYYYYYYYYNNNNNNNNNNN图8 主程序流程图2)秒表正计时子程序流程图如图9所示:正计时子程序启动定时器扫描键值,键值等于5?扫描键值,键值等于6?扫描键值,键值等于7?返回是否记录了十组值?记录当前时间显示当前时间YNYYYNNNY图9 秒表正计时流程图秒表倒计时子程序输入时间初值启动定时器蜂鸣报警,关定时器返回扫描键值,键值等于5?当前

4、时间等于0?YNYN显示当前时间3)秒表倒计时子程序流程图如图10所示图10 秒表倒计时流程图四、 程序1. 主程序(miao_biao.c)如下:#include<aduc848.h>#include"keypp.h"#include"iic.h"#define uchar unsigned char#define uint unsigned intunsigned char b7=45,59,11,2,7,6,11,clock12=12,0,clock22=12,1;code unsigned char tab= 0x03,0x9f,0x

5、25,0x0d,0x99,0x49,0x41,0x1f,0x01,0x19,0x00; /共阴数码管 0-9 显示code unsignedchar tab2=0x39,0xff; / 、全灭void delay(unsigned int cnt); /延时子程序unsigned char getkey1();unsigned char getkey2(); /读键盘void tim(void); /中断void KeyDelay(unsigned int KeyJsTime); /键盘扫描延时void display(uchar bit7,uchar bit6,uchar bit5,ucha

6、r bit4,uchar bit3,uchar bit2,uchar bit1,uchar bit0); /显示子程序void ReadTime(unsigned char TIME7); /DS1307读时间void SetTime(unsigned char TIME7); /设置时间初值void SwitchRTC(unsigned char SWITCH);void iicdelay(unsigned int times);void iicstart(void);void iicstop(void);void iicack(void);bit iicreadack();void iic

7、nack();void iicwriteda(unsigned char da);unsigned char iicreadda();void iicdelay(unsigned int t);uchar dis_num_h; /显示记录数据的组别十位uchar dis_num_l; /显示记录数据的组别个位uchar dis_min_h; /要显示的分的十位;uchar dis_min_l; /要显示的分的个位;uchar dis_sec_h; /要显示的秒的十位;uchar dis_sec_l; /要显示的秒的个位;uchar dis_dsec; /要显示的0.1秒;uchar min=0

8、x00;uchar sec=0x00;uchar dsec=0x00;uchar en,i,clocken1=0,clocken2=0; main()unsigned char quzhi,xianshi,symbol=0x55,set,set1=0x55,ce;unsigned char c30;unsigned char num,num1,j,k,stop=1;PLLCON&=0xf8; /设置频率为12.58MHzTMOD=0x01; /定时器工作模式设置 TH0=0xce; /设定初值 TL0=0x00;IE= 0x82; /中断控制,10000010,EA=1开总中断,ET0

9、=1:定时器0中断允许 I2CCON=0xE8; /开启iic通信;SetTime(b); /设定初始时间;SwitchRTC(1);while(1)ReadTime(time);if(clock10=time1)&&(clock11=time2)&&(clocken1=0)&&stop)| (clock20=time1)&&(clock21=time2)&&(clocken2=0)&&stop) /闹钟时间到PWM0H=205;PWM1L=500;PWMCON=0x21; /蜂鸣器响KeyDela

10、y(333); /延时PWM1H=0;PWM1L=0;PWMCON=0x00;KeyDelay(333);if(getkey1()=12) /键12按下时蜂鸣器停止蜂鸣stop=0; /无12键按下时,响一分钟后自动停止 if(time1=clock10+1)|(time1=clock10+1) stop=1; /一分钟后重新开启蜂鸣使能,以便下次闹钟顺利反应if(time0=0)&&(time1=0) /整点时,蜂鸣提醒i=1;while(i)PWM0H=50;PWM1L=100;PWMCON=0x21; /蜂鸣器响KeyDelay(333); /延时PWM1H=0;PWM1

11、L=0;PWMCON=0x00; /蜂鸣器关KeyDelay(333);i+;/控制蜂鸣器响的时间if(i=5) i=0; en=getkey1();if(en=0x80)|(en=0x55)/无键按下或有多个键按下时,视为无效,en仍为之前按键值en=symbol;if(xianshi=8) display(dis_num_h,dis_num_l,dis_min_h,dis_min_l,dis_sec_h,dis_sec_l,0xff,dis_dsec) ; /显示已记录的值/if(en=1) /按键1按下,显示北京时间,年月日星期symbol=1;display(tabtime6/10,t

12、abtime6%10,tabtime5/10,tabtime5%10,tabtime4/10,tabtime4%10,0xff,tabtime3%10); /else if(en=2)/按键2按下,显示北京时间,时分秒symbol=2 ;display(tab2clocken1,tab2clocken2,tabtime2/10,tabtime2%10,tabtime1/10,tabtime1%10,tabtime0/10,tabtime0%10); /else if(en=3)/按键3按下,秒表进入正计时工作模式min=0;sec=0;dsec=0; num=1;symbol=3;while(

13、1)quzhi=getkey1();if(num<11) /最多可取值十组display(dis_min_h,dis_min_l,0xff,0xff,dis_sec_h,dis_sec_l,0xff,dis_dsec);else /取值多于十组时将“FULL”送显示 display(0x71,0x83,0xe3,0xe3,0xff,0xff,0xff,0xff);if(quzhi=5) /按键5按下时,启动或关闭定时器,赋取值组别num初值quzhi=0x55;if(TR0=1)TR0=0;else TR0=1; else if(quzhi=6)/按键6按下时,秒表读值quzhi=0x5

14、5;c3*(num-1)+2=dsec; /读出的值放在c中,依次存放各组的分、秒、十分秒c3*(num-1)+1=sec; c3*(num-1)+0=min;num+;else if(quzhi=7) /按键7按下,计时结束,清零,赋读值组别num1初值TR0=0;num1=1;symbol=0x55;min=0;sec=0;dsec=0;break;/else if(en=4)/按键4按下,秒表进入倒计时模式symbol=4;j=0;for(i=0;i<=30;i+)ci=0; /将数组c清零while(1)display(dis_min_h,dis_min_l,0xff,0xff,

15、dis_sec_h,dis_sec_l,0xff,dis_dsec);set=getkey1(); /送入倒计时初值while(j<5) / 依次输入分十位、分个位、秒十位、秒个位、十分秒,设置初值ce=getkey1();display(tabc0,tabc1,0xff,0xff,tabc2,tabc3,0xff,tabc4);if(ce!=0x55)&&(ce!=0x80) /按键有效时将值存入c中if(ce>9)ce=0;cj=ce;j+;min=c0*10+c1; /转化为分、秒及十分秒sec=c2*10+c3;dsec=c4;dis_min_h=tabmi

16、n/10; /分、秒及十分秒显示值的处理dis_min_l=tabmin%10;dis_sec_h=tabsec/10;dis_sec_l=tabsec%10;dis_dsec=tabdsec;if(set=5) /按键5按下,倒计时开始set=0x55;TR0=1;TF0=1;if(min=0)&&(sec=0)&&(dsec=0) /倒计时完成while(i)PWM0H=50;PWM1L=100;PWMCON=0x21; /蜂鸣器响KeyDelay(333); /延时PWM1H=0;PWM1L=0;PWMCON=0x00;KeyDelay(333);i+;i

17、f(i=200)i=0;break;if(set=7) / 按键7按下,结束,清零,跳出倒计时模式symbol=0x55;min=0;sec=0;dsec=0;for(i=0;i<30;i+)ci=0;ce=0x55;break;else if(en=8) /按键8按下,将8给xianshi,读出num1组数据symbol=0x55;xianshi=8;dis_num_h=tabnum1/10;dis_num_l=tabnum1%10;dis_min_h=tabc(num1-1)*3+0/10;dis_min_l=tabc(num1-1)*3+0%10;dis_sec_h=tabc(nu

18、m1-1)*3+1/10;dis_sec_l=tabc(num1-1)*3+1%10;dis_dsec=tabc(num1-1)*3+2;num1+; /更新num1值if(num1>num) /超出取值数组时将xianshi信号置为无效xianshi=0x55;else if(en=9) /按键9按下,进入北京时间的设置symbol=0x55;j=0;for(i=0;i<=6;i+)bi=0; /清零for(i=0;i<=30;i+)ci=0;while(1) while(j<=13) ce=getkey1(); if(j<=5) /先分别显示输入时分秒disp

19、lay(tabb2/10,tabb2%10,0xff,tabb1/10,tabb1%10,0xff,tabb0/10,tabb0%10);else if(j<=13) /再显示输入的年月日和星期,最后一个按键退出显示display(tabb6/10,tabb6%10,tabb5/10,tabb5%10,tabb4/10,tabb4%10,0xff,tabb3%10);if(ce=10)break; /按键10按下,跳出设时else if(ce!=0x55)&&(ce!=0x80) /将有效按键值送数组c中if(ce>9) ce=0;cj=ce;j+;b2=c0*10

20、+c1; /处理数组c中数据,放入数组b中正确位置b1=c2*10+c3;b0=c4*10+c5;b6=c6*10+c7;b5=c8*10+c9;b4=c10*10+c11;b3=c12;ReadTime(time); /读取当前时间c13=time2/10; /将当前时间值处理后存入数组c第14至第26号单元中c14=time2%10;c15=time1/10;c16=time1%10;c17=time0/10;c18=time0%10;c19=time6/10;c20=time6%10;c21=time5/10;c22=time5%10;c23=time4/10;c24=time4%10;

21、c25=time3%10;for(k=j;k<=12;k+) /对于没有重置的数据保持当前数据ck=ck+13;b2=c0*10+c1; /将改好的时间数据处理后送给数组bb1=c2*10+c3;b0=c4*10+c5;b6=c6*10+c7;b5=c8*10+c9;b4=c10*10+c11;b3=c12;SetTime(b); /设置时间break;else if(en=13) /按键13按下,改变闹钟1开关状态if(clocken1=0) clocken1=1;else if(clocken1=1) clocken1=0;else if(en=14) /按键14按下,进入闹钟1时间

22、设置symbol=0x55;j=0;for(i=0;i<=30;i+)ci=0;while(1)while(j<=4) /共输入4个数据,之后若按键则闪显后跳出ce=getkey1();display(tabclock11/10,tabclock11%10,0xff,0xff,tabclock10/10,tabclock10%10,0xff,0xff); if(ce!=0x55)&&(ce!=0x80) /将有效数据放入数组c中if(ce>9)ce=0; /输入数据大于九是令该次输入为零cj=ce;j+;clock11=c0*10+c1; /将输入的分、时依次

23、放入数组clock1中clock10=c2*10+c3;break;elseif(en=15) /按键15按下,改变闹钟2开关状态if(clocken2=0) clocken2=1;else if(clocken2=1) clocken2=0;elseif(en=0) /按键0按下,进入闹钟2时间设置,程序类似对闹钟1的时间设置symbol=0x55;j=0;for(i=0;i<=30;i+)ci=0;while(1)while(j<=4)ce=getkey1();display(tabclock21/10,tabclock21%10,0xff,0xff,tabclock20/10

24、,tabclock20%10,0xff,0xff); if(ce!=0x55)&&(ce!=0x80)if(ce>9)ce=0;cj=ce;j+;clock21=c0*10+c1;clock20=c2*10+c3;break;/*/* 延时函数程序 */*/void delay(unsigned int cnt) /用于动态扫描数码管的延时程序while(-cnt);/*/* 数码管显示函数 */*/void display(uchar bit7,uchar bit6,uchar bit5,uchar bit4,uchar bit3,uchar bit2,uchar bi

25、t1,uchar bit0) /从左至右依次显示,各位显示均有延时 P2=0x08;P0=bit7;delay(500);P2=0x04;P0=bit6;delay(500);P2=0x02; P0=bit5; delay(500);P2=0x10;P0=bit4;delay(500);P2=0x00;P3=0x80;P0=bit3;delay(500);P3=0x40;P0=bit2;delay(500);P3=0x20;P0=bit1;delay(500);P3=0x08;P0=bit0;delay(500);P3=0x00;/*/* 定时中断函数程序 */*/void tim(void)

26、 interrupt 1 using 1unsigned int count;TH0=0x3c; /重新赋值,200分之1定时TL0=0x00;IE=0x82; /中断控制,EA=1开总中断,ET0=1:定时器0中断允许TR0=1; /开启定时器count+; /定时完成1次,count加1if(en=3) /正计时if(count>=20) /count等于或大于20,表明已产生0.1秒count=0; /将count置零dsec+; /十分秒加1if(dsec=10) /十分秒为10时dsec=0; /十分秒置零sec+; /秒加1if(sec=60) /秒为60时sec=0; /秒

27、置零min+; /分加1if(min=60) /分为60时min=0; /分置零else /倒计时,程序类似正计时if(count>=20)count=0;dsec-;if(dsec=-1)dsec=9;sec-;if(sec=-1)sec=59;min-;if(min=-1)min=59; if(min=0)&&(sec=0)&&(dsec=0) /分、秒、十分秒都为零时,表明倒计时完成,关闭定时器TR0=0;en=0x55;i=1;dis_min_h=tabmin/10; /分、秒及0.1秒显示值的处理dis_min_l=tabmin%10;dis_s

28、ec_h=tabsec/10;dis_sec_l=tabsec%10;dis_dsec=tabdsec; /*/ /* 读时间程序 */ /*/void ReadTime(unsigned char TIME7) bit EATemp; unsigned char temp; EATemp=EA; CFG848|=0x01;/使用片内xram iicstart(); iicwriteda(0xd0); iicreadack(); iicwriteda(0x00); iicreadack(); iicstop(); iicdelay(1); iicstart(); iicwriteda(0xd1

29、); iicreadack(); TIME0=iicreadda(); iicack(); TIME1=iicreadda(); iicack(); TIME2=iicreadda(); iicack(); TIME3=iicreadda(); iicack(); TIME4=iicreadda(); iicack(); TIME5=iicreadda(); iicack(); TIME6=iicreadda(); iicnack(); iicstop(); iicdelay(1); TIME0=(TIME0&0x7f)>>4)*10+(TIME0&0x0f); /

30、second TIME1=(TIME1&0x7f)>>4)*10+(TIME1&0x0f); /minute if(TIME2&0x40) if(TIME2&0x20)temp=0x80;else temp=0x40; TIME2=(TIME2&0x1f)>>4)*10+(TIME2&0x0f); /hour TIME2|=temp; else TIME2=(TIME2&0x3f)>>4)*10+(TIME2&0x0f); TIME3=TIME3&0x07; /week TIME4=(T

31、IME4&0x3f)>>4)*10+(TIME4&0x0f); /date TIME5=(TIME5&0x1f)>>4)*10+(TIME5&0x0f); /month TIME6=(TIME6>>4)*10+(TIME6&0x0f); /year EA=EATemp; /*/ /* 设置时间程序 */ /*/void SetTime(unsigned char TIME7) bit EATemp; unsigned char temp=0; unsigned char TimeTemp7; EATemp=EA; CF

32、G848|=0x01; /使用片内xram for(temp=0;temp<7;temp+)TimeTemptemp=TIMEtemp; temp=0; TimeTemp6=(TimeTemp6/10)<<4)+(TimeTemp6%10); TimeTemp5=(TimeTemp5/10)<<4)+(TimeTemp5%10); TimeTemp4=(TimeTemp4/10)<<4)+(TimeTemp4%10); TimeTemp3=(TimeTemp3/10)<<4)+(TimeTemp3%10); if(TimeTemp2&

33、;0xc0)=0x00) TimeTemp2=(TimeTemp2/10)<<4)+(TimeTemp2%10); else if(TimeTemp2&0xc0)=0x01)temp=0x40;else temp=0x60; TimeTemp2&=0x3f; TimeTemp2=(TimeTemp2/10)<<4)+(TimeTemp2%10); TimeTemp2|=temp; TimeTemp1=(TimeTemp1/10)<<4)+(TimeTemp1%10); TimeTemp0=(TimeTemp0/10)<<4)+(T

34、imeTemp0%10); TimeTemp0&=0x7f; iicstart(); iicwriteda(0xd0); iicreadack(); iicwriteda(0x00); iicreadack(); iicwriteda(TimeTemp0); iicreadack(); iicwriteda(TimeTemp1); iicreadack(); iicwriteda(TimeTemp2); iicreadack(); iicwriteda(TimeTemp3); iicreadack(); iicwriteda(TimeTemp4); iicreadack(); iicw

35、riteda(TimeTemp5); iicreadack(); iicwriteda(TimeTemp6); iicreadack(); iicstop(); iicdelay(1); EA=EATemp; void SwitchRTC(unsigned char SWITCH) unsigned char temp; bit EATemp; EATemp=EA; CFG848|=0x01;/使用片内xram iicstart(); iicwriteda(0xd0); iicreadack(); iicwriteda(0x00); iicreadack(); iicstop(); iicst

36、art(); iicwriteda(0xd1); iicreadack(); temp=iicreadda(); iicnack(); iicstop(); if(SWITCH)temp&=0x7f; else temp|=0x80; iicstart(); iicwriteda(0xd0); iicreadack(); iicwriteda(0x00); iicreadack(); iicwriteda(temp); iicreadack(); iicstop(); EA=EATemp;2. 键盘扫描程序(keypp.h)如下:unsigned char getkey1() /按键扫

37、描子程序1,先粗扫描,再细扫描,有返回值unsigned char temp,keyvale;P1&=0xf0;P2&=0xf0; temp=P1&0x0f;if(temp!=0x0f)keydelay(1000); /延时消抖if(temp=(P1&0x0f) /temp!=0时,有键按下,temp=0时无键按下P2|=0x0e; /第一列switch(P1&0x0f) case 0x0e:keyvale=1;break;case 0x0d:keyvale=2;break;case 0x0b:keyvale=3;break;case 0x07:keyv

38、ale=4;break;case 0x0f:break;default:keyvale=0x80;break; /其他情况返回80P2&=0xf0;P2|=0x0d;/第二列switch(P1&0x0f)case 0x0e:keyvale=5;break;case 0x0d:keyvale=6;break;case 0x0b:keyvale=7;break;case 0x07:keyvale=8;break;case 0x0f:break;default:keyvale=0x80;break;P2&=0xf0;P2|=0x0b;/第三列switch(P1&0x0

39、f)case 0x0e:keyvale=9;break;case 0x0d:keyvale=10;break;case 0x0b:keyvale=11;break;case 0x07:keyvale=12;break;case 0x0f:break;default:keyvale=0x80;break;P2&=0xf0;P2|=0x07; /第四列switch(P1&0x0f)case 0x0e:keyvale=13;break;case 0x0d:keyvale=14;break;case 0x0b:keyvale=15;break;case 0x07:keyvale=0;b

40、reak;case 0x0f:break;default:keyvale=0x80;break; else keyvale=0x55;while(1)/按键释放后有效P1&=0xf0;P2&=0xf0; temp=P1&0x0f;if(temp=0x0f)break;return keyvale; /无键按下,返回55void keydelay(unsigned int KeyJsTime) /延时unsigned char temp;unsigned int JsKeyDelay;for(JsKeyDelay=0;JsKeyDelay<KeyJsTime;JsKeyDelay+)temp

温馨提示

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

评论

0/150

提交评论