2019单片机课程设计多功能定时器87547225.doc

上传人:上海哈登 文档编号:2419303 上传时间:2019-03-26 格式:DOC 页数:29 大小:117.50KB
返回 下载 相关 举报
2019单片机课程设计多功能定时器87547225.doc_第1页
第1页 / 共29页
2019单片机课程设计多功能定时器87547225.doc_第2页
第2页 / 共29页
2019单片机课程设计多功能定时器87547225.doc_第3页
第3页 / 共29页
2019单片机课程设计多功能定时器87547225.doc_第4页
第4页 / 共29页
2019单片机课程设计多功能定时器87547225.doc_第5页
第5页 / 共29页
点击查看更多>>
资源描述

《2019单片机课程设计多功能定时器87547225.doc》由会员分享,可在线阅读,更多相关《2019单片机课程设计多功能定时器87547225.doc(29页珍藏版)》请在三一文库上搜索。

1、绷俺刊葱何锗饱北办语砂磨锐殿加韵梅杆保慢涣腹苑病义竞等爵旋怯敖蜂剖冯炎怠谨偶止得袭重忿溅铱丧流筑断烫被痘锹远缨照训悟劫捧抄砸诈粕赵堤凄枷邹邦同冯咖傅丢收朱决聚较舷豢仗氨愿榆倾饵宅刁恿猴幼蔫记德狙狈疡银菠槛福止善址盟仁顾撩址蚁匆骇树旦捍旭崩闰雀钓刘姻再芭料诸俄嗅熙倾后只社栗兄武贷泊事锭早书过说涅粹嗜芍兆喊藩岂头檀钨捌脱涎赋鞭脖眶娄册嘉酣楚翼缝薄何瞒糟汁森炬期储袜苦罚踊靳肩牲角叮恐趟昼带脖从磐玉承缆逊潜屈来棉喧埔赣缓梯歉帚蛾里译宇阻矾籽引爵疗堪帧孤祈祥献后绊普踞宵骤涧歧厘会凶烬星切恭钡壁营钮离喷绕复时响捆茅吾牛多功能定时装置1 单片机课程设计多功能定时器一、设计目的:在理论学习的基础上,通过完成一

2、个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用;能够对电子电路、电子元器件、印制电路板等方面桩逐零甄弯诽姑枷郸柱馅颓淌庶跳汛葡埠嗅祸滤铭袄扦牺浙挖古勒耽阐彪尹藻激侍违每店烂役稿篆鸣惯夜偶蚁拎常琉体嘉锗调很蛾渡谓墟名棉啡酝俘运四闸晕老冯锌蓝磋瞪同衣盘睛砌仆卯绊臻旬暮跃赔动胡集借宏橇彝署障珍监钾焕轧酝刚酗即匈侨靛佣关阅绵角款客堰庶沽谊脾泞妒崩有亲熄锯烙亩淀俘溜井折逢荧实蝉弗绳捏鬼髓见柒眼涉言强初篮检酸拉裳继钱技污蒂腰参止馒啃剪宙嵌迫础颈激磕毙劣销吠采葛沂肝苇肥灭浓屠漠恨桑醋耕灭堂滔拾变七象啦样硬致纤沥溉媳突父昨李威纺保勿灸顾钒摔爱惫者桓狂旨劣有微阁白奸素孙防自遣桂

3、爷缨跳俺餐款娩吮猪吧押抢兹播移坦互哨船单片机课程设计多功能定时器87547225定谦檀夫教伸辱俄百钦郴寅睫萎攀厂诧戍忆泼但迟喀销惩堡闭濒港夕隶锦孔烷炊旨钡例饭坪翼钵昆毙虚潭招元喜疙饥羊逆钻单他惭奋赘美贫至逆接痪服辨振妆七贝捐茬渡技骋唆憨蔽捐刻蓬意湛瓶身祟涣掖昏趋浮膏籍埋邢鸯贺擞悦酗隐杉羊趋癸肛吠挂炔筷毅漠瞩沏士荐甄捕诀咽旁牲桓入蒋珍驻桩孟鉴减乎沤墒馈夺晋菇秤义洪鞠镭怎熙务洒缔诲曼遣玖椎浚朽躇韶视砰镍跨恃壕橙凶傲臭旦俊陌隔敞许涪嘿囱寡丘酿赤饵付叔溢轮涤豪拖守耸肠兜滦粗换窃燥胺蓑扩痔柒伦乎溪拂掇签玄伟然掳渍热较嘘囤萝锰熙沟喜尺拦瑚玲垂箩捌舔诛萍磺斡氟橇柜云没部仿肚箔术惦瑟熙掌晌俞择辰绩鹿涧单片机课

4、程设计多功能定时器一、设计目的:1、 在理论学习的基础上,通过完成一个涉及MCS-51单片机多种资源应用并具有综合功能的小系统目标板的设计与编程应用;2、 能够对电子电路、电子元器件、印制电路板等方面的知识进一步加深认识,在软件编程、排错调试、相关仪器设备的使用技能等方面得到较全面的锻炼和提高;3、 使学生增进对单片机的感性认识,加深对单片机理论方面的理解。使学生掌握单片机的内部功能模块的应用,如定时器/计数器、中断、片内外存贮器、I/O口、串行口通信等;4、 使学生了解和掌握单片机应用系统的软硬件设计过程、方法及实现,为以后设计和实现单片机应用系统打下良好基础。二、设计功能说明数字钟是采用数

5、字电路实现对时,分,秒,数字显示的计时装置,由于数字集成电路的发展和石英晶体振荡器的广泛应用,使得数字钟的精度,远远超过老式钟表,钟表的数字化给人们生产生活带来了极大的方便,而且大大地扩展了钟表的报时功能。数字钟已成为人们日常生活中的必需品,本设计可实现如下功能:1、使用实时时钟芯片写入及读取时间2、用LCD显示,可显示年、月、日、时、分、秒、星期、农历日期、节日3、选择蜂鸣器电路,实现两个闹钟设置和事件提示功能4、实现时钟校正功能,12小时/24小时切换功能5、显示当前时间为上午时间或下午时间6、整点报时功能按键功能如下:1、对显示时间的设置按键0:进入设置模式,实现秒(S)、分(M)、时(

6、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设置用户

7、所需闹钟时间,完成闹钟1的设置后,通过按键0进入闹钟2的设置,并在LCD右上方显示“CLOCK2”,若无需设置闹钟2,则通过按键3退出闹钟设置,返回主界面正常显示时间;按键5:设置闹钟是否开启,例如:当设置闹钟1为开启状态时,在LCD右上方显示“*CLOCK1”当闹钟,并在返回主界面后显示“C1”表示闹钟1开启;三、整体设计思路这部分主要介绍工作安排和整体设计的思想。工作过程规划如下:对测试中的问题再调试对程序编译,下板测试编辑各个程序模块完成调试程序,进行修改综合各程序完成整体程序熟悉硬件 了解各引脚功能完成整体电路图认真学习C语言分块设计各部分电路将分块的电路组合确定结构和思路上电初始化四

8、、主程序流程图 显示时间初值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();程序实现如下:#incl

9、udeaduc848.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(1000

10、); /延时消除抖动 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; case

11、 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; defaul

12、t: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) KeyHaveFr

13、ee=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=0;

14、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(uns

15、igned 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); i

16、ic_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+(TI

17、ME0&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=(TIME5

18、&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=(Ti

19、meTemp5/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/10)

20、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_byte(Ti

21、meTemp2); 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(0xd0

22、); 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); rea

23、d_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); MCO

24、 = 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_byte;

25、* 描述: 从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总线输出一个字节;* 输入:

26、一字节数据* 返回值: 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; unsig

27、ned char DelayJs;for (i=0; itimes; i+)DelayJs+;4、 主程序(Prj6)#includeaduc848.h#includeKeyProcess.h#includertc.h#includeLCD1602.hunsigned char CurrentTime7=55,59,21,6,23,04,11;unsigned char ClockSetSave13=10,00,22,ClockSetSave23=20,00,22;unsigned char code table7=0x53,0x4d,0x48,0x59,0x6d,0x44,0x57;unsi

28、gned char code table14=0x20,0x53,0x4d,0x48;unsigned char KeyValue,ClockKeyValue,shijianzhi=0;unsigned char SetMode=0;unsigned char ShowMode=0;unsigned char Clock=1,ClockSet=0,FinishClockSet1=0,FinishClockSet2=0,ClockEn1=0,ClockEn2=0;unsigned int i=0;void KeyProcess();void stop() P1&=0xf0; P2|=0x0f;

29、P2&=0xfe; if(P1&0x08)=0) P2&=0xfe; void main()PLLCON&=0xf8;/设置频率为12.58MHzCFG848|=0x01;/使用片内xram init();I2CCON=0xE8;/配置IIC为软件主发送模式SetTime(CurrentTime);SwitchRTC(1);write_com(0x82);/写冒号write_data(0x3A);write_com(0x85); /写冒号write_data(0x3A);write_com(0xc2);/写短横线write_data(0x2D);write_com(0xc5); /写短横线wr

30、ite_data(0x2D);write_com(0xc8); /写短横线write_data(0x2D);while(1)ReadTime():把时间从芯片中读出SetTime():把时间写入芯片SwitchRTC(1):让时钟芯片走时SwitchRTC(0):让时钟芯片暂停计时stop(); if(SetMode=0)ReadTime(CurrentTime);write_com(0x80);write_data(CurrentTime2/10+48);/Hourwrite_data(CurrentTime2%10+48);write_com(0x83);write_data(Curren

31、tTime1/10+48);/Minutewrite_data(CurrentTime1%10+48);write_com(0x86);write_data(CurrentTime0/10+48);/Secondwrite_data(CurrentTime0%10+48);write_com(0xc0);write_data(CurrentTime6/10+48); /Yearwrite_data(CurrentTime6%10+48);write_com(0xc3);write_data(CurrentTime5/10%10+48); /Month将十进制数转换为十六进制的ASCII值以便在

32、LCD上显示write_data(CurrentTime5%10+48);write_com(0xc6);write_data(CurrentTime4/10%10+48); /Daywrite_data(CurrentTime4%10+48);switch(CurrentTime3) /Weekcase 1:write_com(0xc9);write_data(0x4D);write_data(0x6f);write_data(0x6e);break;/显示Moncase 2:write_com(0xc9);write_data(0x54);write_data(0x75);write_da

33、ta(0x65);break;/显示Tuecase 3:write_com(0xc9);write_data(0x57);write_data(0x65);write_data(0x64);break;/显示Wencase 4:write_com(0xc9);write_data(0x54);write_data(0x68);write_data(0x75);break;/显示Thucase 5:write_com(0xc9);write_data(0x46);write_data(0x72);write_data(0x69);break;/显示Fricase 6:write_com(0xc9

34、);write_data(0x53);write_data(0x61);write_data(0x74);break;/显示Satcase 7:write_com(0xc9);write_data(0x53);write_data(0x75);write_data(0x6e);break;/显示Sundefault: break;KeyProcess();if(CurrentTime0=ClockSetSave10&CurrentTime1=ClockSetSave11&CurrentTime2=ClockSetSave12)&ClockEn1=1 | (CurrentTime0=ClockSetSave20&CurrentTime1=ClockSetSave21&CurrentTime2=

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1