单片机工程实践
题 目: 电子秒表
小组成员:
指导教师:
设计时间:
XX工业大学课程设计任务书
课程名称: 单片机 学院: 班级: 自动化-X班 学生姓名: XXXX 学号: 201XXXXXXXXXX 学生姓名: XXXX 学号: 201XXXXXXXXX 学生姓名: XXXX 学号: 201XXXXXXXXX 指导教师:
一、题目 电子秒表 二、目的与意义 本课程为培养学生计算机应用能力的实践性课程,也是一门重要的专业技术课程。它将使学生不仅理论上掌握单片微型计算机的基本原理、单片机应用系统的构成、系统程序设计,进一步加强学生单片机应用系统软、硬件开发的能力,并能将电路、模拟电子技术、数字电子技术和微机原理等课程的知识有机地结合起来,做到学用结合。课程通过已实际应用的智能仪表为实训对象,其电路包含了单片机应用系统的基本部分,即:8 位单片机、A/D模数转换器、七段LED动态显示电路、RS-485串行通信及Watchdog 等接口电路,是一个理论与实践相结合的良好载体。课程采用项目组运作模式,使学生熟悉理论课程的相关知识,通过具体项目下线要求、验收方式等环节,充分发挥不同程度学生的学习积极性、创新精神及合作意识,培养学生的工程设计思想和科学研究能力,使学生在分析问题、解决问题和动手能力等方面有所提高,并了解工程项目设计实施的全过程,达到提高学生工程实践能力和素质的目标。 三、要求(包括原始数据、技术参数、设计要求、图纸量、工作量要求等) 1、设计时间:2周 2、分组: (1)题目任选。(重复性不可超过30%) (2)2-3人一组,自由组合。 (3)分工明确,小组成员分配任务量合适。 3、设计任务要求 设计任务相对独立完整,难易适宜,不同层次,并充分考虑学有余力的学生的扩展空间。 (1)完成对所选任务的分析报告。 (如:系统所需要完成的功能是什么,需要哪些硬件环境支持,小组成员分工、 确定自己的设计思想) (2)完成硬件环境的检测程序。 蜂鸣器自检:确定蜂鸣器正确
LED(LCD) 显示器自检:确定LED(LCD) 显示器每一段均正确 键盘自检: 确定键盘正确 ④其他 (3)完成系统的结构设计,画出任务流程框图。 (4)完成系统软件设计与调试。 (5)每小组写一份综合设计报告 主要内容:题目、分工情况、系统可行性分析、系统结构设计说明、程序结构框图设计说明、各模块设计说明、程序清单、体会。 4、设计理念 必须始终保持和发展本课程突出的教学特点:内容综合、按工程项目实施、学生设计自由度较大、对学生的综合能力要求高、挑战性强。 四、工作内容、进度安排 第一周:1、自由分组,选定任务,领硬件设备。(题目重复性不可超过30%) 2、完成对所选任务的分析报告。 (如:系统所需要完成的功能是什么,需要哪些硬件环境支持,小组 成员分工、确定自己的设计思想) 3、确定任务思路,完成硬件环境的检测程序。 4、画出主任务程序框图 5、指导教师分阶段检查各小组进度,给出成绩。 第二周:1、根据主任务程序框图,进行系统软件设计与调试 2、指导教师验收各小组成果,给出成绩 3、各小组交实践报告 4、交硬件设备 主要参考文献(三篇以上) [1] 刘守义等.单片机技术基础[M].西安电子科技大学,2007. [2] 裴岩.刘利民.单片机系统综合设计与实践[M].内蒙古大学出版社.2003 [3] 陈海宴.51单片机原理及应用[M].北京:北京航空航天大学出版社.2010 [4] 胡汉才.单片机原理及接口技术[M].北京:清华大学出版社.1996
[5] 李广弟等.单片机基础[M].北京航空航天出版社,2001. [6] 钟富昭等.8051单片机典型模块设计与应用[M].北京:人民邮电出版社.2007 [7] 李平等.单片机入门与开发[M].北京:机械工业出版社.2008:33-37. [8] 高吉祥.全国大学生电子设计竞赛培训系列教程[M].北京:电子工业出版社.2007 审核意见 系(教研室)主任(签字) 指导教师下达时间 201x 年xx月 xx 日 指导教师签字:
目录
一、设计目的 ..................................................... 1 二、设计任务分析 ................................................. 1 1、计任务内容 ................................................. 1 2、任务分工 ................................................... 1 3、硬件环境检测分析 ........................................... 1 4、设计思路 ................................................... 2 三、框图 ......................................................... 2 1、硬件编程框图及相关说明 ..................................... 2 2、主程序框图、子程序框图及相关说明 ........................... 8 四、程序清单 .................................................... 11 五、实验结果 .................................................... 16 设计体会 ........................................................ 19 六、参考资料 .................................................... 20
一、设计目的:
通过一个以8 位单片机为核心的模拟量数字表的硬件调试过程,掌握具有蜂鸣器自检、七段LED 显示自检、键盘自检等接口电路的单片机应用系统的设计思想和方法。
学习应用系统软件的模块化设计方法,通过源程序的编辑、汇编或编译、链接、仿真调试,完成给定的任务。通过上述过程提高学生工程实践能力和素质。
二、设计任务分析:
1、计任务内容:(1)显示时间范围0~59分59秒。(2)跑表时间范围0~59秒99毫
秒。电子秒表具有时钟显示和秒表计时功能,时钟显示时间范围为00分00秒至59分59秒,秒表计时范围为00秒00毫秒至59秒99毫秒。
2、任务分工
(1)马劭琛:键盘扫描子程序的编写,大任务的主程序流程图的绘制,各个小任务主程序的编制和框图的绘制,实验报告整理与排版。
(2)焦豫康:各个小任务主程序的编写调试小程序框图的绘制,查阅资料,策划硬件如何实现具体功能。
(3)庞新华:完成大任务的主程序编制,各个小任务子程序的的编写与整理,部分大任务程序流程图的绘制,完成分配给的子程序的编制。
3、硬件环境检测分析:
硬件分析:通过电路图可知当P2.3口置1时蜂鸣器不工作,当P2.3口置0时蜂鸣器工作。通过电路图可知通过P2.5,P2.6,P2.7控制Y7口控制74LC245的使能端,进而可以控制是否将键盘的状态送入单片机处理。通过电路图可知七段数码管的位选是由单片机的P2.5,P2.6,P2.7口控制的74LS138控制的,而数码管要显示的码字由P0口提供。
右图为硬件电路图。 图2.1硬件电路图
1
4、设计思路
当显示时钟时,具有设置时间的功能。按一下K1键进入秒位的设置模式,此时按K2键可实现秒位加1,按K3键可实现秒位减1,使秒位在00至59范围内自由切换;按两下K1键进入分位的设置模式,此时按K2键可实现分位加1,按K3键可实现分位减1,使分位在00至59范围内自由切换,以此来实现对时钟显示时间的设置。时钟显示功能与秒表计时可以通过K4键实现功能切换(当处于时钟显示功能时,可以通过按K4键进入秒表功能;当处于秒表计时功能时,可以通过按K4键进入时钟显示功能)。当处于秒表计时时,不影响时钟的正常走时。
当单片机运行在秒表计时功能时,可以通过按下K1键使得秒表开始计时,通过按下K2键使得秒表计时暂停(当秒表没有开始计时时,此时按下K2键无动作),通过按下K3键实现秒表的清零。
三、框图:
1、硬件编程框图及相关说明
(1)蜂鸣器自检硬件编程框图及相关说明 #include #define uchar unsigned char #define uint unsigned int sbit beep=P2^3; void delay(ms) { uchar i,j; for(i=ms;i>0;i--) for(j=114;j>0;j--); } void beep_check(uint times,uchar frequency) { uint i; for(i=times;i>0;i--) { beep=0; Delay(frequency); 2 } } void main() { while(1) { beep_check(400,2); beep_check(400,3); } } 图3.1 蜂鸣器自检程序框图 执行程序,蜂鸣器发声,来检测蜂鸣器对设定频率的响应,来达到自检的目的。 3 (2)键盘自检硬件编程框图及相关说明 #include for(i=0;i<1000;i++); } void main(void) { while(1) {a=1; b=1; c=1; if(key1==0) {a=1; b=0; c=0; P0=0x0C; delay();} if(key2==0) {a=0; b=1; c=0; 4 P0=0xB6; delay();} if(key3==0) {a=1; b=1; c=0; P0=0x9E; delay();} if(key4==0) { a=0; b=0; c=1; P0=0xCC; delay();} } } 图3.2 键盘自检程序框图 5 通过依次按键K1,K2,K3,K4让数码管的第一位,第二位,第三位,第四位分别显示数字1,2,3,4,按钮按下时对应的数码管显示相应的数,按钮松开时数码管停止显示,同时按下多个按钮时,数码管同时显示相应的数,以此来检测各个按键的工作情况,来达到自检的目的。 (3)LED自检硬件编程框图及相关说明 #include\"reg51.h\" sbit A=P2^7; sbit D=P2^6; sbit C=P2^5; int k,i=0; LED[20]={0x7E,0x0C,0xB6,0x9E,0xCC,0xDA,0xFA,0x0E,0xFE,0xDE }; void delay(int n) { for(k=0;k while(1) { for(i=0;i<20;i++) P0=LED[i]; A=0; D=0; C=0; delay(20000); for(i=0;i<20;i++) {P0=LED[i]; A=1; D=0; 6 C=0; delay(20000);} for(i=0;i<20;i++) {P0=LED[i]; A=0; D=1; C=0; delay(20000);} for(i=0;i<20;i++) {P0=LED[i]; A=1; D=1; C=0; delay(20000);} for(i=0;i<20;i++) {P0=LED[i]; A=0; D=0; C=1; delay(20000);} } } 7 图3.3 LED自检程序框图 LED显示器有共阴极和共阳极两种结构。该图结构为共阳极,且是动态扫描显示,COM端为高电平时,显示器工作,反相驱动器的功能是使LED稳定的亮。P0口控制LED显示字形即LED显示何种字形,P2.5、 P2.6 、P2.7是选择字位口即五位LED中哪位LED亮。通过程序让数码管的四位依次同时显示0,1,2,3,4,5,6,7,8,9,A,b,C,d,E,F,最高位显示1和-1,来检测低四位数码管对各个码字的响应,来达到自检的目的。 2、主程序框图、子程序框图及相关说明 8 图3.4 实验主程序框图 9 时钟子程序框图 图3.5 时钟子程序框图 10 四、程序清单: #include #define uchar unsigned char #define uint unsigned int #define N 8330 #define M 41950 sbit w1 = P2^5; sbit w2 = P2^6; sbit w3 = P2^7; sbit beep = P2^3; sbit key1 = P1^0; sbit key2 = P1^1; sbit key3 = P1^2; sbit key4 = P1^3; uchar code table[] = {0x7e,0x0c,0xb6,0x9e,0xcc, 0xda,0xfa,0x0e,0xfe,0xde}; //数码管显示0―9 uchar count,count1; //变量定义 int sec,min,sec1,min1; uchar a,b,c,d,e; void delay(uchar ms); //函数声明 void display(uchar min,uchar sec); void di(); void key_scan() //键盘扫描 { w1 = 1; w2 = 1; w3 = 1; if(key4 == 0) { delay(5); if(key4 == 0) { b++; while(!key4); di(); if(b == 1) //功能键按下1次进入秒表 { 11 if(TR1 == 0) { TR1 = 0; } if (TR1 == 1) { TR1 = 1; } } if(b == 2) { TR0 = 1; b = 0; } } } if(b == 1) { if(key1 == 0) { delay(5); if(key1 == 0) { TR1 = 1; di(); while(!key1); } } if(key2 == 0) { delay(5); if(key2 == 0) { TR1 = 0; di(); while(!key2); } } if(key3 == 0) { delay(5); if(key3 == 0) { di(); TR1 = 0; //秒表定时器停止工作 //功能键按下2次返回时钟 //功能键清零 //开始秒表 //秒表暂停 //秒表清零 12 while(!key3); min1 = 0; sec1 = 0; } } } w1 = 1; w2 = 0; w3 = 1; } void key_scan1() //时钟状态下键盘扫描 { w1 = 1; w2 = 1; w3 = 1; w1 = 1; w2 = 0; w3 = 1; } void di() //蜂鸣器发声函数 { beep = 0; delay(40); beep = 1; } void delay(uchar ms) //延时1ms子程序 { uchar i,j; for(i = ms; i > 0; i--) { for(j = 114; j > 0; j--); } } void display(uchar min,uchar sec) //数码管显示子程序 { w1 = 0; //显示分高位 w2 = 0; w3 = 1; P0 = table[min/10]; delay(15); 13 w1 = 0; w2 = 1; w3 = 0; P0 = table[min%10]; P0 |= 0x01; delay(13); w1 = 0; w2 = 1; w3 = 1; P0 = table[sec/10]; delay(13); w1 = 1; w2 = 0; w3 = 0; P0 = table[sec%10]; delay(13); } void display1(uchar sec) { w1 = 0; w2 = 1; w3 = 1; P0 = table[sec/10]; delay(13); w1 = 1; w2 = 0; w3 = 0; P0 = table[sec%10]; delay(13); } void init() { w1 = 1; w2 = 0; w3 = 1; a = 0; b = 0; beep = 1; sec = 0; //显示分低位 //显示秒高位 //显示秒低位 //数码管显示子程序 //显示秒高位 //显示秒低位 //初始化函数 //关闭数码管显示 //蜂鸣器置高位不工作14 min = 0; sec1 = 0; min1 = 0; count = 0; //时钟计数 count1 = 0; //秒表计数 EA = 1; //开总中断 ET0 = 1; //开定时器0中断 TR0 = 1; //定时器0工作 TMOD = 0X01; //定时器0工作方式1 TH0 = (65536 - M)/256; //定时器0装入初值 TL0 = (65536 - M)%256; ET1 = 1; // TR1 = 0; // TMOD |= 0X10; // TH1 = (65536 - N)/256; // TL1 = (65536 - N)%256; } void main() //{ init(); // while(1) { key_scan(); // if(b != 0) // { w1 = 0; w2 = 0; w3 = 0; P0 = 0x00; delay(15); display(min1,sec1); } else // { key_scan1(); // if(a == 1) // { display1(sec); } else { display(min,sec); } } } 开定时器1中断 定时器1不工作 定时器1工作方式1 定时器1装入初值 主函数 初始化 总键盘扫描 进入秒表状态 时钟状态 时钟状态键盘扫描 秒位调节 //只显示秒位 15 } void timer0() interrupt 1 { TH0 = (65536 - M)/256; TL0 = (65536 - M)%256; count++; if(count == 20) { count = 0; sec++; if(sec >= 60) { sec = 0; min++; if(min >= 60) { min = 0; } } } } void timer1() interrupt 3 { TH1 = (65536 - N)/256; TL1 = (65536 - N)%256; sec1++; if(sec1 == 100) { sec1 = 0; min1++; if(min1 == 60) { min1 = 0; } } } //定时器0中断服务程序 //定时器再次装入初值 //中断次数累加 //20次50ms为1s //秒加到60进位分钟 //秒清零 //定时器1中断服务程序 //定时器再次装入初值 //中断次数累加 //100次10ms为1s 五、实验结果 当显示时钟时,具有设置时间的功能。按一下K1键进入秒位的设置模式,此时按K2 16 键可实现秒位加1,按K3键可实现秒位减1,使秒位在00至59范围内自由切换;按两下K1键进入分位的设置模式,此时按K2键可实现分位加1,按K3键可实现分位减1,使分位在00至59范围内自由切换,以此来实现对时钟显示时间的设置。时钟显示功能与秒表计时可以通过K4键实现功能切换(当处于时钟显示功能时,可以通过按K4键进入秒表功能;当处于秒表计时功能时,可以通过按K4键进入时钟显示功能)。当处于秒表计时时,不影响时钟的正常走时。 当单片机运行在秒表计时功能时,可以通过按下K1键使得秒表开始计时,通过按下K2键使得秒表计时暂停(当秒表没有开始计时时,此时按下K2键无动作),通过按下K3键实现秒表的清零。 图6.1 实验电路板 图6.2 时钟LED显示 17 图6.3 秒表启动 图6.5 秒表清零 18 图6.4 秒表暂停 设计体会 组长(XXX): 通过这两周的单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为真己的东西。们安排了这次单片机课程设计,给了我们学以致用的做好的实践。 对于这次课程设计,我们花费了比较多的心思,既是对课程理论内容的一次复习和巩固,还让我们丰富了更多与该专业相关的其他知识,比如软件应用等,在摸索中学习,在摸索中成长,在学习的过程中带着问题去学我发现效率很高,这是我做这次课程设计的又一收获,在真正设计之前我们做了相当丰富的准备,首先巩固一下课程理论,再一遍熟悉课程知识的构架,然后结合加以理论分析、总结,有了一个清晰的思路和一个完整的的软件流程图之后才着手设计。 组员(XXX): 在为期二周的单片机实训中我的感受颇多,在单片机编程之前虽然对单片机的知识和C语言有一定的理解,同时C语言的基础较好,认为实验应该是非常轻松的,但是事实恰恰相反。我们对51单片机的硬件结构不够了解,导致了我们在编程上的困难,同时让我们认识到要学好单片机必须要软件和硬件相结合。同时在这此课设中让我们的51单片机的定时器/计数器,中断功能,蜂鸣器的频率,LED灯的显示,键盘的按下更加深入的了解。相信通过对51单片机的学习,让我掌握了单片机学习的技巧和方法。会对我之后的毕业设计和后续对单片机更加深入的学习有了更好的基础。我将在课堂上学习到理论知识应用到实践中,让理论与实践相结合,在实践的同时加深理论的认知,巩固了所学知识加深了对知识的理解,锻炼了我们的逻辑能力和思考能力。 组员(XXX): 两周的单片机课程设计终于顺利完成了,其中包含着快乐,也有辛酸。我们选的设计题目是“电子秒表”,大家都觉得这个题目是比较简单的。其实不然,做了之后,发现设计电路虽然简单,但我们认为它真正困难的地方是程序设计,不过在我们同心努力下最终完成了。 虽然自己对于这门课懂的并不多,很多基础的东西都还没有很好的掌握,觉得很难,但是靠着前一个多礼拜的学习,在小组同学的帮助和讲解下,查缺补漏,又学会了很多知 19 识。 在完成单片机课程设计后,我们发现我们还有许多不足,所学到的知识还远远不够,以至于还有一些功能不能被动完成。但通过学习这一次实践,增强了我们的动手能力,提高和巩固了单片机方面的知识,特别是软件方面。从中增强了我们的团队合作精神,并让我们认识到把理论应用到实践中去是多么重要。 本次课设对我来说收获巨大,学会了单片机的相关知识,还能使其理论应用在硬件上,提高了动手能力与团队协作能力,同时感谢老师的细心指导。 六、参考资料 [1] 刘守义等.单片机技术基础[M].西安电子科技大学,2007. [2] 裴岩.刘利民.单片机系统综合设计与实践[M].内蒙古大学出版社.2003 [3] 陈海宴.51单片机原理及应用[M].北京:北京航空航天大学出版社.2010 [4] 胡汉才.单片机原理及接口技术[M].北京:清华大学出版社.1996 [5] 李广弟等.单片机基础[M].北京航空航天出版社,2001. [6] 钟富昭等.8051单片机典型模块设计与应用[M].北京:人民邮电出版社.2007 [7] 李平等.单片机入门与开发[M].北京:机械工业出版社.2008:33-37. 20 因篇幅问题不能全部显示,请点此查看更多更全内容