版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、多功能定时装置单片机课程设计多功能定时器一、设计目的:1、 在理论学习的基础上,通过完成一个涉及mcs-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用;2、 能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,在软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高;3、 使学生增进对单片机的感性认识,加深对单片机理论方面的理解。使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、i/o口、串行口通信等;4、 使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。二、设计
2、功能说明数字钟是采用数字电路实现对时,分,秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。数字钟已成为人们日常生活中的必需品,本设计可实现如下功能:1、使用实时时钟芯片写入及读取时间2、用lcd显示,可显示年、月、日、时、分、秒、星期、农历日期、节日3、选择蜂鸣器电路,实现两个闹钟设置和事件提示功能4、实现时钟校正功能,12小时/24小时切换功能5、显示当前时间为上午时间或下午时间6、整点报时功能按键功能如下:1、对显示时间的设置按键0:进入设置模式,实现秒
3、(s)、分(m)、时(h)、年(y)、月(m)、日(d)、星期(w)设置的切换,并在lcd右下角显示所设置的项目,当各项目设置完毕后,再按下按键0则返回主界面正常显示时间;按键1:每按一次按键1,对所设置的时间加1,当设置的时间超过它的最大值时,该项自动为0,例如:当设置秒为59时,秒自动清零;按键2:每按一次按键:2,对所设置的时间减1,当设置的时间小于0时,该项自动为它的最大值;按键3:设置完成后的确认键并可按此键中途退出设置,时间按用户设置值正常计时;按键7:实现时钟校正功能,12小时/24小时切换功能。2、对闹钟的设置按键4:进入闹钟1的设置,并在lcd右上方显示“clock1”并通过
4、按键0、1、2设置用户所需闹钟时间,完成闹钟1的设置后,通过按键0进入闹钟2的设置,并在lcd右上方显示“clock2”,若无需设置闹钟2,则通过按键3退出闹钟设置,返回主界面正常显示时间;按键5:设置闹钟是否开启,例如:当设置闹钟1为开启状态时,在lcd右上方显示“*clock1”当闹钟,并在返回主界面后显示“c1”表示闹钟1开启;三、整体设计思路这部分主要介绍工作安排和整体设计的思想。工作过程规划如下:对测试中的问题再调试对程序编译,下板测试编辑各个程序模块完成调试程序,进行修改综合各程序完成整体程序熟悉硬件 了解各引脚功能完成整体电路图认真学习c语言分块设计各部分电路将分块的电路组合确定
5、结构和思路上电初始化四、主程序流程图 显示时间初值yy响铃是否开启?与闹钟时间相同?n不响y报时整点?n不响nkeyvalue=getkey()n进入时间设置ykey=0?ny各设置项加一key=1?ny各设置项减一key=2?nkey=3?y退出设置回到主界面继续计时nkey=4?闹钟设置yny关闭闹钟闹钟已开启?ykey=5?n开启闹钟,显示*ykey=7?12/24进制的转换n结束五、电气原理图(见附图)六、实验程序1、键盘程序(keyprocess)键盘与848相连接,采用矩阵键盘的方式p2用于列扫描,p1用于行扫描,经过消抖及等待键释放的程序,将最终正确的结果置于getkey();程
6、序实现如下:#includeaduc848.hvoid keydelay(unsigned int keyjstime); /键盘扫描延时函数声明unsigned char getkey(); /扫描后获取键值unsigned char getkey()static unsigned char keyhavefree=1;static unsigned int keyjs=0;unsigned char temp,keytemp=0xff;p1&=0xf0;p2&=0xf0; / 将低四位置零做i/o口temp=p1&0x0f;if(keyhavefree) if(temp!=0x0f) ke
7、ydelay(1000); /延时消除抖动 if(temp=(p1&0x0f) /延时后确认是否有键按下,并获取具体键值 p2|=0x0e; switch(p1&0x0f) case 0x0e:keytemp=3;break; case 0x0d:keytemp=7;break; case 0x0b:keytemp=11;break; case 0x07:keytemp=15;break; case 0x0f:break; default:keytemp= 0x80;break; p2&=0xf0; p2|=0x0d; switch(p1&0x0f) case 0x0e:keytemp= 2;
8、break; case 0x0d:keytemp= 6;break; case 0x0b:keytemp= 10;break; case 0x07:keytemp= 14;break; case 0x0f:break; default:keytemp= 0x81;break; p2&=0xf0; p2|=0x0b; switch(p1&0x0f) case 0x0e:keytemp= 1;break; case 0x0d:keytemp= 5;break; case 0x0b:keytemp= 9;break; case 0x07:keytemp= 13;break; case 0x0f:br
9、eak; default:keytemp= 0x82;break; p2&=0xf0; p2|=0x07; switch(p1&0x0f) case 0x0e:keytemp= 0;break; case 0x0d:keytemp= 4;break; case 0x0b:keytemp= 8;break; case 0x07:keytemp= 12;break; case 0x0f:break; default:keytemp= 0x83;break; keyhavefree=0; /lcdprintnumber(6,11,5,keytemp); else keyjs+; if(keyjs70
10、) keyhavefree=1; keyjs=66; if(temp=0x0f)keyhavefree=1;keyjs=0; keytemp=0xf0; return keytemp;void keydelay(unsigned int keyjstime)unsigned char temp;unsigned int jskeydelay;for(jskeydelay=0;jskeydelay0;x-) for(y=110;y0;y-); void write_com(unsigned char com) / rs=0; rw=0; p0=com; delay(5); en=1; delay
11、(5); en=0; void write_data(unsigned char date) rs=1; rw=0; p0=date; delay(5); en=1; delay(5); en=0; 3、iic程序(rtc)/实时时钟#includeaduc848.hvoid iic_start(void);void iic_stop(void);void iic_ack(void);bit read_ack(void);void iic_nack();unsigned char get_byte(void);void out_byte(unsigned char dd);void iic_d
12、elay_us(unsigned int times);void readtime(unsigned char time7);void settime(unsigned char time7);void switchrtc(unsigned char switch);void readtime(unsigned char time7) bit eatemp; unsigned char temp; eatemp=ea; iic_start(); out_byte(0xd0); read_ack(); out_byte(0x00); read_ack(); iic_stop(); iic_del
13、ay_us(1); iic_start(); out_byte(0xd1); read_ack(); time0=get_byte(); iic_ack(); time1=get_byte(); iic_ack(); time2=get_byte(); iic_ack(); time3=get_byte(); iic_ack(); time4=get_byte(); iic_ack(); time5=get_byte(); iic_ack(); time6=get_byte(); iic_nack(); iic_stop(); iic_delay_us(1); time0=(time0&0x7
14、f)4)*10+(time0&0x0f); /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=(time4&0x3f)4)*10+(time4&0x0f); /date t
15、ime5=(time5&0x1f)4)*10+(time5&0x0f); /month time6=(time64)*10+(time6&0x0f); /year ea=eatemp;void settime(unsigned char time7) bit eatemp; unsigned char temp=0; unsigned char timetemp7; eatemp=ea; for(temp=0;temp7;temp+)timetemptemp=timetemp; temp=0; timetemp6=(timetemp6/10)4)+(timetemp6%10);/year ti
16、metemp5=(timetemp5/10)4)+(timetemp5%10);/month timetemp4=(timetemp4/10)4)+(timetemp4%10);/day timetemp3=(timetemp3/10)4)+(timetemp3%10);/week if(timetemp2&0xc0)=0x00)/hour timetemp2=(timetemp2/10)4)+(timetemp2%10); else if(timetemp2&0xc0)=0x01)temp=0x40;else temp=0x60; timetemp2&=0x3f; timetemp2=(ti
17、metemp2/10)4)+(timetemp2%10); timetemp2|=temp; timetemp1=(timetemp1/10)4)+(timetemp1%10); /minute timetemp0=(timetemp0/10)4)+(timetemp0%10);/second timetemp0&=0x7f; iic_start(); out_byte(0xd0); read_ack(); out_byte(0x00); read_ack(); out_byte(timetemp0); read_ack(); out_byte(timetemp1); read_ack();
18、out_byte(timetemp2); read_ack(); out_byte(timetemp3); read_ack(); out_byte(timetemp4); read_ack(); out_byte(timetemp5); read_ack(); out_byte(timetemp6); read_ack(); iic_stop(); iic_delay_us(1); ea=eatemp; void switchrtc(unsigned char switch) unsigned char temp; bit eatemp; eatemp=ea; iic_start(); ou
19、t_byte(0xd0); read_ack(); out_byte(0x00); read_ack(); iic_stop(); /iic_delay_us(1); iic_start(); out_byte(0xd1); read_ack(); temp=get_byte(); iic_nack(); iic_stop(); /iic_delay_us(1); if(switch)temp&=0x7f; else temp|=0x80; iic_start(); out_byte(0xd0); read_ack(); out_byte(0x00); read_ack(); out_byte
20、(temp); read_ack(); iic_stop(); /iic_delay_us(1); ea=eatemp;void iic_start(void) mde=1; mdo=1; /iic_delay_us(2); mco=1; /iic_delay_us(2); mdo=0; /iic_delay_us(2); void iic_stop(void) mde=1; mdo=0; /iic_delay_us(2); mco=1; /iic_delay_us(2); mdo=1;void iic_ack(void) mde=1; mco = 0; mdo = 0; /iic_delay
21、_us(2); mco = 1; /iic_delay_us(2); mco = 0; /iic_delay_us(1); mdo = 1;bit read_ack(void) bit flag; mco = 0; /iic_delay_us(2); mde=1; mdo = 1; mco = 1; /iic_delay_us(2); mde=0; flag = mdi; mco = 0; return flag;void iic_nack() mde=1; mdo = 1; /iic_delay_us(2); mco = 1; /iic_delay_us(2); mco = 0;/* 函数名
22、: get_byte;* 描述: 从iic总线获取一个字节;* 输入: none;* 返回值: 一字节数据;* 注释: none;*/unsigned char get_byte(void) /输入一个字节 unsigned char dd; int i; dd=0; mde=1; mdo = 1; mde=0;for (i=0;i8;i+) mco = 0; iic_delay_us(1); mco = 1; /iic_delay_us(1); dd=1; if (mdi)dd|=0x01; mco = 0;return(dd);/* 函数名: out_byte;* 描述: 向iic总线输出
23、一个字节;* 输入: 一字节数据* 返回值: none;* 注释: none;*/ void out_byte(unsigned char dd) /输出一个字节 unsigned char i; mde=1; for(i=0;i7; iic_delay_us(1); mco = 1; /iic_delay_us(3); dd = 1; mco = 0; /* 函数名: iic_delay_us;* 描述: iic总线延时函数;* 输入: 延时参数* 返回值: none;* 注释: none;*/ void iic_delay_us(unsigned int times) unsigned i
24、nt i; unsigned char delayjs;for (i=0; i7) /如果设置完了,则开始计时 setmode=0; settime(currenttime); if(setmode=0)switchrtc(1);write_com(0xcf);write_data(0x20); break; case 1: /按键1:加 switch(setmode) /执行按键1是在进入设置的模式下 case 1:write_com(0xcf);write_data(0x53);currenttime0+;if(currenttime059)currenttime0=0;break;/mi
25、ao case 2:write_com(0xcf);write_data(0x4d);currenttime1+;if(currenttime159)currenttime1=0;break;/fen case 3:write_com(0xcf);write_data(0x48);currenttime2+;if(currenttime223)currenttime2=0;break;/shi case 4:write_com(0xcf);write_data(0x59);currenttime6+;if(currenttime699)currenttime6=0;break;/year ca
26、se 5:write_com(0xcf);write_data(0x6d);currenttime5+;if(currenttime512)currenttime5=1;break;/month case 6:/day write_com(0xcf);write_data(0x44);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:
27、case 11:if(currenttime430)currenttime4=1;break; case 2: if(currenttime6%4)if(currenttime428)currenttime4=1; else if(currenttime429)currenttime4=1; break; default:break; break; case 7:write_com(0xcf);write_data(0x57);currenttime3+;if(currenttime37)currenttime3=1;break; /week default:break; break; case 2: /按键2:减 switch(setmode) case 1:currenttime0-;if(currenttime0254)currenttime0=59;break;/miao case 2:currenttime1-;if(currenttime1254)currenttime1=59;break;/fen case 3:currenttime2-;if(currenttime2254)currenttime2=23;break;/shi case 4:currenttime6-;if(currenttime6254)currenttime6=99;break;/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 云南省文山壮族苗族自治州(2024年-2025年小学五年级语文)人教版质量测试(下学期)试卷及答案
- 2024年abplc培训教程:引领你进入自动化领域
- 《剪羊毛》音乐教学实践
- 2024年音乐教育:《堆雪人》课件的创新实践
- 探索2024:《炉中煤》课件的创新发展之路
- 2024年糖尿病患者的护理发展趋势
- 《接触网施工》课件 3.3.2 腕臂柱安装
- 2024年基于DRGs的医疗质量控制与改进研究
- 湖北省黄冈市(2024年-2025年小学五年级语文)人教版随堂测试(上学期)试卷及答案
- 从基础到精通:2024年3dmax全方位培训指南
- 安徽省A10联盟2024-2025学年高三上学期开学考试生物试题(解析版)
- 2022-2023学年北京市海淀区中关村中学八年级(上)期中数学试卷【含解析】
- 2.1 认识自己 课件-2024-2025学年道德与法治七年级上册(统编版2024)
- 5.5《方程的意义》(课件)-2024-2025学年人教版数学五年级上册
- 2021新青岛版六三制三年级上册科学全册知识点总结期末复习背诵资料
- 部编版二年级语文上册看拼音写词语含答案
- 2024年浙江省应急管理行政执法竞赛题库-上(单选、多选题)
- 四肢关节病症推拿治疗-梨状肌综合症患者的推拿治疗
- 房产开发地块收购项目可行性研究报告(完美版)
- JJF 2133-2024海洋资料浮标传感器校准规范
- HGT 6333-2024《煤气化灰水阻垢分散剂阻垢性能测定方法》
评论
0/150
提交评论