版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、单片机课程设计多功能定时器一、设计目的:1、 在理论学习的基础上,通过完成一个涉及mcs-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用;2、 能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,在软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高;3、 使学生增进对单片机的感性认识,加深对单片机理论方面的理解。使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、i/o口、串行口通信等;4、 使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。二、设计功能说明数字钟
2、是采用数字电路实现对时,分,秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。数字钟已成为人们日常生活中的必需品,本设计可实现如下功能:1、使用实时时钟芯片写入及读取时间2、用lcd显示,可显示年、月、日、时、分、秒、星期、农历日期、节日3、选择蜂鸣器电路,实现两个闹钟设置和事件提示功能4、实现时钟校正功能,12小时/24小时切换功能5、显示当前时间为上午时间或下午时间6、整点报时功能按键功能如下:1、对显示时间的设置按键0:进入设置模式,实现秒(s)、分(m
3、)、时(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”并通过按键0、1、2
4、设置用户所需闹钟时间,完成闹钟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) keydelay(
7、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;break;
8、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:break; de
9、fault: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) keyha
10、vefree=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(5); en
11、=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_delay_us
12、(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_delay_us(1
13、); 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&0x7f)4)*10
14、+(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 time5=(t
15、ime5&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 timetemp5
16、=(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=(timetemp2
17、/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(); out_byt
18、e(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(); out_byte(
19、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(temp);
20、 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_us(2);
21、 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;/* 函数名: get_b
22、yte;* 描述: 从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 int i; u
24、nsigned 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;/miao case
25、 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 case 5:wr
26、ite_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: case 11
27、: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;/year
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 卷棉机机械原理课程设计
- 南宁镀锌道路护栏施工方案
- 华为管理咨询课程设计
- 长期合作运输合同书
- 环境保护工程实施与管理手册
- 环保行业绿色技术创新与推广方案
- 生物圈与植被 高一上学期+地理+鲁教版(2019)必修一+课时作业
- 大数据应用案例分析报告
- 国际商务谈判技巧手册
- 区块链云存储服务费用清单
- 干部履历表(中共中央组织部2015年制)
- 酒水知识与酒吧管理 课件 第一章 酒水概述
- 加强项目管理提高项目交付效率
- 内科护理学-第二章-呼吸系统疾病病人的护理试题
- 丈夫去世家庭困难补助申请书
- 统编版语文二年级上册第一单元大单元整体教学设计
- 留学生教育质量评估与监控体系构建
- 四年级语文上册第二单元【教材解读 单元先导课】
- 退费申请表模板(直接打印)
- 国家二级公立医院绩效考核医疗质量相关指标解读
- 2023年初中语文《回忆我的母亲》拓展阅读之邹韬奋《我的母亲》+老舍《我的母亲》
评论
0/150
提交评论