《基于单片机的多功能综合应用系统的设计单片机课程设计报告(27页).doc》由会员分享,可在线阅读,更多相关《基于单片机的多功能综合应用系统的设计单片机课程设计报告(27页).doc(27页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、-基于单片机的多功能综合应用系统的设计单片机课程设计报告-第 27 页单片机课程设计实验报告设计题目:基于单片机的多功能综合应用系统的设计专 业: 电子信息工程 班 级: 姓 名: 指导老师: 目录第一章 设计说明 1.1 设计目的3 1.2 设计内容及要求3第二章 硬件电路仿真实现 2.1 硬件结构分析5 2.2基本功能仿真电图6 2.3扩展功能仿真电路图102.4 实物电路图15第三章 软件设计实现 3.1软件程序内容 16 3.2模块分析 16 3.3 程序流程图17第四章 系统测试 4.1 软件调试19 4.2硬件调试19第五章 心得体会 20第六章 参考文献 21附 录 21第一章
2、设计说明1.1 设计目的 单片机在许多领域使用十分广泛,如智能仪器仪表、实时工控、通讯设备、导航系统、家用电器等。各科任老师们经常说“学好单片机,工作就不成问题了。”可见学好单片意义之重大。单片机作为一门基础学科,既是对前期学习C语言的综合运用,也是理论与实践相结合的一大体现。本次课程设计通过基础部分,拓展功能以及整体电路的实现能很好地锻炼我们的动手及编程能力。1.2 设计内容及要求内容: 1设计并实现具有复位功能的单片机小系统。2利用单片机进行灯光的场景开关控制、循环点亮控制、花样变化控制及速度变化控制(如:左右循环、扩散收缩式移动、流星雨、舞台灯光综合效果、名曲名句跟随显示等。至少应做两项
3、:前两项选一并有速度变化控制功能,后三项选一或自创特色花样)。3. 炫彩音乐显示(依据3秒以上某名曲名句,模拟高、中、低音三分频,彩色LED随音频变化而起伏显示的效果,进一步地,LED亮度跟随音乐响度闪烁)。 4利用单片机进行灯光的色彩连续变化效果控制。5利用单片机进行灯光的三色联动定时控制(以交通灯为例)。 (说明:3、4中二选一,1、2、5必选)6. 配合2至5项中功能,实现液晶屏输出功能或状态信息。7. 以调节5或4项中的时间为例实现基于4X4键盘的输入功能。(可用现有成品键盘,也可自己课外用按键开关焊接自己的键盘。)8. 数字温度计的设计(要求:实时显示温度、设置限值温度、超限报警等)
4、9. 32x16点阵LED显示同组同学汉字名(利用取字模软件获取数据);10. 智能式直流电压表的设计。要求:(1)能启动、停止; (2)能通过开关进行功能选择; (3)基本功能部分要体现循环、组合和色彩变化的控制功能和效果,实现三色联动定时控制,控制变化规律的类型或功能不少于5种。元件清单:序号名称、规格单位数量/组组数备注1AT89S51/2片122AT89S512连线把4共用分红、黑、蓝、绿等色312MHz晶振只122Crystal447p电容只222510u电容(电解)只122Electrolytic capacitor60.1u电容只122capacitor7电阻 330只1022r
5、esistor8电阻 1k只1022resistor9可调电阻 10k只42210电阻: 5108排阻只22211红色LED小灯只322LED12绿色LED小灯只22213蓝色LED小灯只32214按键式开关只122Button15拨动式开关只622switch16面包板块1221774LS04片222可换用74LS07/06、74HC24518RT1602液晶显示屏只12219DS18B20温度传感器只122208550三极管只122PNP型21有源一体蜂鸣器5V只122 第二章 硬件电路仿真实现2.1 硬件结构分析 1、单片机仿真硬件系统由复位电路、晶振电路、独立键盘输入、彩灯输出、矩阵键
6、盘输入以及LCD显示模块构成。根据课本上的内容,首先搭建好复位电路与晶振电路,P1口接8个发光二极管,P3口接键盘,P2.4、P2.5、P2.6和P0口接LCD显示,单片机实物电路由复位电路、晶振电路、独立键盘输入、彩灯输出模块构成。由P1口接入彩灯。其中晶振连接需注意到,两端测试电压的差值在2V左右时才能正常起振工作。复位电路在未工作时不能有电压。 2.2基本功能仿真电路图 复位电路时钟显示电路键盘具体仿真图及说明部分开始为流水灯,或按S0 为流水灯按S1交通灯按S2灯光的色彩连续变化三色联动按S3就转变为流星雨调节时间先按S14就开始调节时间,按S11调节小时和分钟,按S3为+1,按S7为
7、-1.按S15可以调节灯的速度,按按S3为+1,按S7为-1.(其中当调节为0时速度最快,随着数字增加速度逐渐减小)2.3扩展功能仿真电路图温度计部分:当温度超过2530C时,二极管亮,报警:25C时30C时32*16显示屏部分:显示屏显示:第四部分智能电压表部分:按下BUTTON键,LED灯亮起,调节RV1的值,LED亮灭变化,代表不同的输出电压值调节RV1,阻值最大调节RV1,阻值越来越小:RV1阻值一半:RV1阻值最小:2.4电路实物图第三章 软件设计实现3.1软件程序内容 见附录P183.2模块分析 1.显示模块:用1602液晶显示,设置其技术参数为:拨复位开关总能回到初始状态,使用8
8、位数据,显示两行,使用5*7的字型,显示器开,光标关,字符不闪烁,字符不动。 2.矩阵键盘模块:当扫描到1号键盘,进入到流水灯模块;扫描到2号键盘时,进入交通灯模块;扫描到3号键盘时,进入扩展灯模块;当扫描到4号键盘,进入到循环灯模块;当扫描到5号键盘,进入到三色联动模块;按下复位键后,回到初始状态。 3.三色联动模块:通过设置各种灯在不同的时间段亮灭,并且各自亮的时间长不一致,形成人们视觉上的观察,看到的现象是灯由亮到暗的变化过程,由此可形成各种不同的混色。 4.交通灯模块:由延迟控制时间变化,设置两路交通灯,红灯亮18S,绿灯亮17S,黄灯1S,A路交通灯的红灯亮的时间等于B路交通灯黄灯亮
9、的时间加上绿灯亮的时间,由此形成联动状态。 5.流星雨模块:通过控制每个灯的亮灭之间的时间来实现,从而给人视觉上的效果,形成流星雨。 温度显示模块:通过DS18B20温度传感器实时采集温度通过1602芯片显示当前温度。 3.3 程序流程图 基本部分:Led点阵: 开 始开 始字码表初址赋值字码表初址赋值 取码指针 取码指针取当前列显示字码第一个字节取当前列显示字码第一个字节送18行控制口送18行控制口取当前列显示字码第二个字节取当前列显示字码第二个字节送916行控制口送916行控制口送列控制码送列控制码取当前列显示字码地二个字节取当前列显示字码地二个字节送916行控制口送916行控制口送列控制
10、码送列控制码YYNN80列显示完80列显示完第四章 系统测试 4.1 软件调试在编程过程中,遇到了很多难题。流水灯和交通灯子程序都编的比较顺利,三色联动因为要涉及到调节占空比,刚开始的时候感到无从下手,后来又想到利用定时中断,通过产生不同占空比的方波信号来控制灯的亮暗程度。但是这样仍然没有成功。后来在同学的帮助下,利用随机函数调节占空比,调试成功,达到了预想的效果。在编写键盘扫描程序的之前,我查看了很多资料,先弄清楚了矩阵键盘的工作原理,然后确定了一个简单有效的键盘扫描算法,调试成功,启动键盘扫描程序,能够准确判断出键值并进入相应的功能模块。后来把全部功能整合到一个总程序中,就遇到了麻烦。首先
11、在调用子函数的时候,由于各场景由while(1)控制,在子函数中不能及时跳出循环,后来在删除了while(1)死循环之后,当检测到任一其它按键后就能立即跳出循环。刚开始我们的交通灯子程序用到了定时中断,在写主函数的时候,当矩阵键盘按下后交通灯子程序不能执行,后来简化了交通灯程序,改用延时,交通灯功能模块就能正常运行了。还有关于LCD显示的,之前是把对其初始化的调用放在子函数中,这样在每次调用时都初始化一次,使得不能很好地变化,后来把初始化放到了主函数里,则能正常跳变。在此次课程设计中碰到了很多困难,经过老师和同学的帮助,还有自己在网上查资料都能够得以解决。使我深深的体会到,只要坚持不懈,没有什
12、么事情是不能解决的。4.2 硬件测试在硬件电路搭建完毕后,我们开始进行测试,成功烧写52芯片后,发现灯的亮灭不受控制,而且1602液晶显示屏也是没有显示内容。在我们反复的检查,另外有对应仿真结果逐一排查,发现我们的电路有一些问题,因为我们的刚开始的电路AT89C52的P0口接的是排阻,而且排阻的另一端接到了显示屏的端口,犯了很大的错误,检查发现后,我们立刻做了修正,在P1口接了10k的电阻,电阻的另一端接到+5V的电源,同时P1口接到显示屏的端口。这样又进行测试,发现显示屏可以正常的显示,灯也可以正常的工作。给老师检查中,发现我们的复位键不管用,之前没有太注意这个,幸好老师提醒我们,发现我们少
13、接了一个电容。之后我们又做了调整,终于电路正常工作。同时,在调节滑动变阻器使显示屏显示的过程中也是很大的考验,需要有耐心,不断转滑动变阻器,最后才使得整个电路顺利进行。在本次课程设计中,我们进一步了解了89C52各引脚的功能以及89C52的内部逻辑结构,深入掌握了89C52显示电路的基本功能及编程方法,同时深入了解了89C52等芯片以及键盘的工作方式和接口功能。第五章 心得体会 在本次单片机课程设计中,让我感触很深,从刚开始的简单的控制灯的程序开始,逐步地增加开关控制,再将这些连接起来,真的一步一步地发现单片机很有趣。在课程设计课中的头两个星期我很困惑,因为我不懂怎么把很多个功能放在一起,为此
14、我问了一些学的好的同学,他们认真的讲解让我有了一些启发,后来我又自己买了一块单片机自己试着编写一个程序达到自己的预期结果,尽管这个过程非常的枯燥,有时候编不出来或者想的跟试验结果不同时,又要重新检查语句,看每条语句的功能,又通过在网上查阅很多的资料来解决自己的问题。对于我来说,我比较偏向于动手,在硬件的搭建中还算是比较顺利的。还有在这两个多月里,我学到了很多的东西,看书本仅仅只是理论知识,而将所学的理论知识与实践结合的过程中,才发现自己学的理论知识远远不够。尤其是在编程时往往能想到怎么做,却不知怎么编写,我感觉这是最难的,在心里真的是想要去认真的完成,可是却因为克服不了自己的恐惧,总觉得很难,
15、就拖了好几天,不过庆幸的是我还是坚持了过来,我觉得做什么事都必须要有信心和耐心,这样做事才会更有效率。在设计的过程中,我也深刻地感受到了做一个完整的项目靠一个人的力量是很辛苦的,必须和自己的队员一起商量讨论,而且分工合作,这样每个人做自己所擅长的一部分,再合起来就会达到事半功倍的效果。通过这次课程设计,我更加理解了单片机这门课,也将课堂知识运用到实践中,不断地积累,让我对单片机产生了很大的兴趣,我想接下来我还会继续学习这门课,不断地提升自己的编程能力,让自己的思考能力增强。所以我认为这次的课程设计意义很深,和另外两位同学的共同学习配合努力的过程很愉快,另外还要感谢老师的耐心辅导!因为这次我们单
16、片机课程和单片机课程设计是同一个学期的课程,在开始单片机课程设计的时候单片机基础也没什么,班上有些人参加了蓝桥杯的看着他们一开始就能自己编程序觉得很厉害,自己只能慢慢从基础开始学习,难免有点心浮气躁。但是好在课程时间比较长,自己慢慢的看书查资料,和组员慢慢磨合,按照课本的知识我们也能自己编出简单的程序。刚开始的课堂实验开关控制灯等等到矩阵键盘都是给课程设计打基础的,课程设计也是将这些基础知识联系起来,既考验了你的耐心又考验你的细心,一旦错了一点点小地方最后的结果都出不来。毕竟小组一起做课程设计能学到课堂学不到的知识,虽然我们没有别人那么多的花样但是我们也有尽力完成,也有学到实践的重要性。当然在
17、实验过程中也出现了很多问题,这些问题都是值得我们重视的,比如复位电路忘记接电容导致我们复位电路反应很慢甚至没反应,显示屏接上不亮,后来才知道要接滑动变阻器并调节才能亮。中间出现问题也有咨询过其他人,他人的帮助对我们也很重要,总之,最终实物结果能出来,绝不是一个人的结果,小组的配合,他人的帮助,老师的指导也是至关重要的。这次单片机课程设计虽然说纠结过烦躁过但是将单片机的知识系统化学习了一遍,自己的动手能力也培养了,和小组一起学习,让我觉得意义很大。所以不管做什么都在沉下心来慢慢做动手做,不管结果怎么样你也尽力了。 在学习单片机这门课程之前,就听说过这门课程的重要性和学好这门课程的关键,多做单片机
18、实验。因此对这门课程学之前就特别害怕。现在单片机课程已经结束,需要来好好的反思和回顾总结下了。做实验中,遇到问题应该是准备不充分吧。一开始,由于没有课前准备的意识,每每都是到了实验室才开始编程,完成作业,导致每次时间都有些仓促。还有就是自己基础比较差,遇到问题是依赖性也很大,在团队下完成实验。通过这学期的单片机实验的学习,发现了自己的问题,需要的的还有很多,包括搭建电路图和测试硬件电路,需要很大耐心,培养自己接受新知识的自学能力。也通过这次学习在以后的生活和学习中相信只要有足够勇气和耐心,遇到的问题总会被解决。最后感谢老师在我们遇到困难时的帮助和点播。第六章 参考文献1. 单片机技术-课程设计
19、与项目实例 中国电力出版社 作者:李海滨等 2009.102 Proteus教程-电子线路设计、制版与仿真 清华大学出版社 作者:朱清彗 2008.93 51系列单片机设计实例(第2版) 北京航空航天大学出版社 作者:楼然苗 李光飞 附录:程序第一部分程序:#include#include#include#include#define uchar unsigned char#define uint unsigned int#define bit(n) (1n) extern unsigned char key_val;uint speed=50;char yellow=5,green=20,r
20、ed=20;/三色定时控制量uchar hour,minute,second;uchar pwmctr;/占空比控制变量uchar pwmctr_green=5;uchar lxytable=0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff;uchar lxyctr=16;bit flag_green=1;bit flag_yellow;bit flag_red;bit flag_lsd=1;bit flag_jtd;bit flag_pwmled;bit flag_lxy; sbit
21、 Red=P10;sbit yel=P11;sbit gre=P12;sbit RED=P13;sbit YEL=P14;sbit GRE=P15;sbit buzzer=P00;void disp_time() second+; if(second=10) buzzer=1; if(second=60) second=0; minute+; if(minute=60) buzzer=1; minute=0; hour+; if(hour=24) hour=0;L1602_char(2,9,hour/10+0x30);L1602_char(2,10,hour%10+0x30);L1602_ch
22、ar(2,12,minute/10+0x30);L1602_char(2,13,minute%10+0x30);L1602_char(2,15,second/10+0x30);L1602_char(2,16,second%10+0x30); main() buzzer=0; initkeypad(); L1602_init(); TMOD=0x11; TH0=(65536-10000)/256; TL0=(65536-10000)%256; TH1=(65536-1000)/256; TL1=(65536-1000)%256; EA=1; ET0=1; ET1=1; TR0=1; TR1=1;
23、 L1602_string(1,1,SPD); L1602_string(2,1, ); L1602_char(1,5,speed/10+0x30); L1602_char(1,6, ); while(1) kevent();if(key_val=15) if(flag_lsd) L1602_char(1,4,*); L1602_char(1,6,*); initkeypad(); while(key_val!=15) initkeypad(); do kevent(); while(key_val=16); if(key_val=3)speed=speed+10; if(key_val=7)
24、speed=speed-10; L1602_char(1,5,speed/10+0x30); initkeypad(); L1602_char(1,4, ); L1602_char(1,6, );if(key_val=14) initkeypad(); while(key_val!=14) L1602_char(2,11,*); initkeypad();do kevent(); while(key_val=16);if(key_val=3) hour+;if(key_val=7) hour-;if(key_val=11) uchar a=0,i=2; L1602_char(2,14,*);
25、while(i-) initkeypad(); do kevent(); while(key_val=16);a=10*a+key_val;if(i)minute=10*key_val+minute%10; minute=a; L1602_char(2,14, ); initkeypad(); L1602_char(2,11, ); if(key_val=0) L1602_string(1,1,SPD); L1602_string(2,1, ); L1602_char(1,5,speed/10+0x30); L1602_char(1,6, ); flag_lsd=1; flag_jtd=0;
26、flag_pwmled=0; flag_lxy=0; initkeypad();if(key_val=1) P1=0xff; flag_lsd=0; flag_jtd=1; flag_pwmled=0; flag_lxy=0; initkeypad();if(key_val=2) L1602_string(1,1, ); L1602_string(2,1, ); L1602_string(1,1,pwm); P1=0xff; flag_lsd=0; flag_jtd=0; flag_pwmled=1; flag_lxy=0; initkeypad();if(key_val=3) L1602_s
27、tring(1,1, ); L1602_string(2,1, ); L1602_string(1,1,lxy); P1=0xff; flag_lsd=0; flag_jtd=0; flag_pwmled=0; flag_lxy=1; initkeypad(); void t0() interrupt 1 uchar ledcount; uchar timecount; uchar lxycount; uchar i; uchar j; TH0=(65536-10000)/256; TL0=(65536-10000)%256; ledcount+; timecount+; lxycount+;
28、 if(timecount=100) timecount=0; buzzer=0; disp_time(); if(flag_jtd) if(flag_green) GRE=0; Red=0; L1602_string(1,1,RED:); L1602_char(1,5,green/10+0x30); L1602_char(1,6,green%10+0x30); L1602_string(2,1,GRE:); L1602_char(2,5,green/10+0x30); L1602_char(2,6,green%10+0x30); green-; if(green0) green=20; fl
29、ag_green=0;flag_yellow=1;GRE=1;YEL=0;Red=1;gre=0; if(flag_yellow) YEL=0; gre=0; L1602_string(1,1,GRE:); L1602_char(1,5,(yellow+15)/10+0x30); L1602_char(1,6,(yellow+15)%10+0x30); L1602_string(2,1,YEL:); L1602_char(2,5,yellow/10+0x30); L1602_char(2,6,yellow%10+0x30); yellow-; if(yellow5) gre=0; L1602_
30、string(1,1,GRE:); L1602_char(1,5,(red-5)/10+0x30); L1602_char(1,6,(red-5)%10+0x30); else yel=0; L1602_string(1,1,YEL:); L1602_char(1,5,red/10+0x30); L1602_char(1,6,red%10+0x30); L1602_string(2,1,RED:); L1602_char(2,5,red/10+0x30); L1602_char(2,6,red%10+0x30); red-; if(red=4) gre=1; yel=0; if(red100)
31、 ledcount=0; P1=bit(i); i+; if(i=8) i=0; if(flag_lxy) if(lxycount=lxyctr) lxycount=0; P1=lxytablej; j+; if(j=16) j=0; lxyctr-; if(lxyctr=0) lxyctr=16;void t1() interrupt 3 uchar count_pwm,count; TH1=(65536-1000)/256; TL1=(65536-1000)%256; if(flag_pwmled) count_pwm+; count+; if(count_pwm=pwmctr) Red=
32、0;yel=1; if(count_pwm=pwmctr_green) gre=1; if(count_pwm=10) count_pwm=0; Red=1;yel=0;gre=0; if(count=200) count=0;if(pwmctr=10)pwmctr=0;pwmctr+;第二部分程序:#include #define uchar unsigned char #define uint unsigned intsbit rs=P20;sbit rw=P21;sbit lcden=P22; /液晶使能端sbit DATA = P23; /DS18B20接入口uchar FLAG_DI
33、S=0;uchar bai_18b20,shi_18b20,ge_18b20,num; /定义变量bit flag_Negative_number ;/负数标志uchar code table=tempreture: ; /提示语sbit speaker=P24;signed char shangxian=35;signed char xiaxian=2;signed char lala;void delay_ms(uint z)uint x,y;for(x=z;x0;x-)for(y=110;y0;y-);void delay(uint num)while(num-) ;void write
34、_lcd_com(uchar com)P0=com;rs=0;rw=0;lcden=0;delay_ms(1);lcden=1;delay_ms(1);lcden=0;void write_lcd_date(uchar date)rs=1;rw=0;lcden=0;P0=date;delay_ms(1);lcden=1;delay_ms(1);lcden=0;void lcd_init()write_lcd_com(0x38);write_lcd_com(0x0c);write_lcd_com(0x06);write_lcd_com(0x01);void Init_DS18B20(void)
35、/传感器初始化 uchar x=0; DATA = 1; /DQ复位 delay(10); /稍做延时 DATA = 0; /单片机将DQ拉低 delay(80); /精确延时 大于 480us /450 DATA = 1; /拉高总线 delay(20); x=DATA; /稍做延时后 如果x=0则初始化成功 x=1则初始化失败 delay(30);ReadOneChar(void)uchar i=0;uchar dat = 0;for (i=8;i0;i-) DATA = 0; / 给脉冲信号 dat=1; DATA = 1; / 给脉冲信号 if(DATA) dat|=0x80; del
36、ay(8); return(dat);void WriteOneChar(uchar dat) uchar i=0; for (i=8; i0; i-) DATA = 0; DATA = dat&0x01; delay(10); DATA = 1; dat=1;delay(8);int ReadTemperature(void)uchar a=0;uchar b=0;int t=0;float tt=0;Init_DS18B20();WriteOneChar(0xCC); /跳过读序号列号的操作WriteOneChar(0x44); /启动温度转换Init_DS18B20();WriteOne
37、Char(0xCC); /跳过读序号列号的操作WriteOneChar(0xBE); /读取温度寄存器等(共可读9个寄存器)前两个就是温度a=ReadOneChar();/低位b=ReadOneChar();/高位t=b;t=8;t=t|a;if(b&0x80) t=t+1;flag_Negative_number = 1;else flag_Negative_number = 0; tt=t*0.0625;t= tt*10+0.5; return(t);void dis_D18B20(void)int temp;temp=ReadTemperature();/读温度bai_18b20=tem
38、p%1000/100;/显示十位shi_18b20=temp%100/10;/显示个位ge_18b20=temp%10;/显示十分位if(flag_Negative_number) /负数if(bai_18b20=0) /十位为0,则不显示十位write_lcd_com(0x80+0x40);write_lcd_date(0x2D);write_lcd_date(0x30+shi_18b20);write_lcd_date(0x30+ge_18b20);write_lcd_date(0xDF);write_lcd_date(0x43);elsewrite_lcd_com(0x80+0x40);
39、write_lcd_date(0x2D);write_lcd_date(0x30+bai_18b20);write_lcd_date(0x30+shi_18b20);write_lcd_date(0xDF);write_lcd_date(0x43);else /正数if(bai_18b20=0) /十位为0,则不显示十位write_lcd_com(0x80+0x40);write_lcd_date(0x30+shi_18b20);write_lcd_date(0x2E);write_lcd_date(0x30+ge_18b20);write_lcd_date(0xDF);write_lcd_date(0x43);elsewrite_lcd_com(0x80+0x40);write_lcd_date(0x30+bai_18b20);