单片机课程设计键控彩灯_第1页
单片机课程设计键控彩灯_第2页
单片机课程设计键控彩灯_第3页
单片机课程设计键控彩灯_第4页
单片机课程设计键控彩灯_第5页
已阅读5页,还剩37页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、单片机课程设计报告组号: 04组员: 45号 汤 31号 曾 10号 邱 03号 曹 43号班级: 09机电(4)班相关说明(一)设计目的1. 熟悉51系列单片机的使用。2. 熟悉汇编语言编程。3. 掌握单片机应用系统的设计方法过程及实现。(二)设计任务描述、要求键控彩灯系统:1. 键盘控制其运行及其停止。2. 键盘控制其流水作业及流动方向。3. 键盘控制其点亮方式 a.全亮全灭b.交叉点亮成员分工情况:袁德:04组长。总设计,将任务说明、框图、功能模块图及相关说明分给成员,协助程序编辑和错误处理,查找资料心得体会。汤跃:担任软件设计,根据功能模块图细分出流程图编辑相应程序与功能相关说明,查找

2、资料。曾玉珍:担任硬件设计,根据总框图在dxp软件中画出原理图、pcb板,查找资料。邱根:进行word排版,与协助汤跃的软件设计和查找资料。曹琦:对进行编辑完的程序在仿真软件上进行仿真训练和错误处理。目录第1章 硬件设计11.1总体框图11.2 原理图与pcb板图21.3 80c51相关说明:4第2章 软件设计62.1 功能模块图62.2主控流程图72.3键盘检测流程图92.4功能键处理流程图13.显示彩灯流程图152.代码实现19第3章 仿真与调试283.1调试步骤283.2错误处理303.3仿真结果31第4章 设计体会32参考文献34第1章 硬件设计1.1总体框图键盘控制 80c51芯片l

3、ed彩灯显示振荡电路复位电路电源电路功能说明:电源:80c51单片机使用5v电源,其中正极接40引脚,负极接20引脚。振荡电路:在80c51单片机内部集成了一个高增益方向放大器,用于构成放大器,只要接上晶振和电容即可构成完整的振荡电器。晶振跨接于18 (xtal2出)和19( xtal1入)引脚之间,18和19引脚对地并联两只小电容,其中晶振可以使用12mhz的小卧式晶振,电容可在1847pf之间取值,一般可以使用27pf的小磁片电容。复位电路:单片机上的9引脚(rst)是复位引脚,采用的是手动复位,其中其中电容用10uf,而接到rst与地之间的电阻用10k/vpp引脚:31引脚为/vpp,该

4、引脚接地。键盘电路:单片机p3.2p3.5引脚作为输入使用,在软件中将其置1.但按键没有按下时,单片机引脚上为高电平:而当按键按下去后,引脚接地,单片机引脚上为低电平。通过编程软件(采用不断查询的方法)即可获知是否有按键按下,按下是哪一个按键。彩灯显示: led的阴极与单片机p1.0p1.7引脚相连,阳极与+5v电源相连。当p1口引脚接高电平时led灯不亮,当p1口引脚接低电平时led灯亮。1.2 原理图与pcb板图功能说明:8个发光二管接8*470电阻,接在p0口,将复位电路接在rst端,复位电路用到了手动复位,该电路的电阻值为1k,电容为c=10uf.p3.2p3.5接四个弹性按键,在按键

5、前接上四个上拉电阻(4*1k),该单片机采用的晶振频率为6hz该电路用的两个电容c=(530pf)ea接地采取片外rom方式pcb板图功能描述: 同dxp软件将图二和图三画出来,在通过这些可以将其在电路板上进行制做,实现硬件电路的安装制作,进行调试元件清单:序号品名型号/规格数量配件图号1单片机芯片at89c5112碳膜电阻4708r1r83碳膜电阻10k1r94碳膜电阻1k4r10r135轻触开关lsh4s1s46无极性电容27pf2c1c27无极性电容10uf1c38卧式晶振12mhz1cy1.3 80c51相关说明:80c51引脚说明:、主电源引脚vcc和gnd vcc(40脚):主电源

6、接5v vss(20脚):接地2、时钟电路引脚xtal1 和xtal2 xtal2(18脚):接外部晶体振荡器的一端。片内是一个振荡电路反相放大器的输出端。 xtal1(19脚):接外部晶体振荡器的另一端。片内是一个振荡电路反相放大器的输入端。3、控制信号rst/vpd、ale/(/prog) 、/ psen和 (/ea)/vpp rst/vpd(9脚):复位端。高电平有效,宽度在24个时钟周期宽度以上,使单片机复位。该引脚有复用功能,vpd为备用电源输入端,防止主电源掉电。 ale/(/prog)(30脚):地址锁存信号端。访问片外存贮器时,ale作低八位地址的锁存控制信号。平时不访问片外存

7、贮器时,该端以六分之一的时钟振荡频率固定输出脉冲。ale端负载驱动能力为8个lsttl门。该引脚有复用功能, 为片内程序存贮器编程(固化)的编程脉冲输入。 /psen(29脚):片外程序存贮器读选通信号端。负载能力为8lsttl门。在读外部rom时psen低电平有效,以实现外部rom单元的读操作。 1、内部rom读取时,psen不动作; 2、外部rom读取时,在每个机器周期会动作两次; 3、外部ram读取时,两个psen脉冲被跳过不会输出; 4、外接rom时,与rom的oe脚相接。 (/ea)/vpp(31脚):/ea端接高电平时,cpu取指令从片内程序存贮器自动顺延至片外程序存贮器。 /ea

8、端接低电平时,cpu仅从片外程序存贮器取指令。该引脚有复用功能,vpp为片内程序存贮器编程时的编程电压。 4、输入/输出引脚p1、和p3口 p1.0p1.7(18脚): 8位准双向i/o口。负载能力为3个lsttl门。p1口只做i/o口使用:其内部有上拉电阻 p3.0p3.7(1017脚):8位准双向i/o口。负载能力为3个lsttl门。另外还有专门的第二功能。二、p3口的第二功能: p3.0(10脚): rxd(串行口输入端) p3.1(11脚): txd(串行口输出端) p3.2(12脚): /int0(外部中断0输入端) p3.3(13脚): /int1(外部中断1输入端) p3.4(1

9、4脚): t0(定时器/计数器0外部输入端) p3.5(15脚): t1(定时器/计数器1外部输入端) p3.6(16脚): /wr(片外数据存贮器写选通信号输出端) p3.7(17脚): /rd(片外数据存贮器读选通信号输出端第2章 软件设计2.1 功能模块图主程序键盘检测模块功能键处理模块彩灯流动显示模块去抖延时模块延时模块功能说明:键盘扫描模块:就检测是否按有键按下因按键是有抖动存在所一要扫描两次以保正确实有按键按下然后在检查是否有键的释放。延时去抖模块:因为有按键抖动的现象存在,且键盘抖动时间一般为510ms,抖动现象会引起cpu对一次键盘操作进行多次处理,从而可能产生错误。所以实行软

10、件去抖消除抖动的影响。主程序模块图:将个模块连接起来并初始化。彩灯显示模块;流水灯模块采用了8个led发光二极管,通过代码的编写实现四中流水彩灯,本设计采用共阳极接法,将不同的初值给单片机就可以看到彩灯变化。延时模块:为了能让我们看的出彩灯变化的效果进行延时,这样就可以看到彩灯流动。2.2主控流程图开始堆栈初始化给p1初始化复位程序中所有的标志位updown、startend、yuan、quan、zuoyi、给流动灯复初值调用键盘检测程序f0为1?调用键盘处理程序调用显示程序yn 图一主程序流程图功能说明:图一主程序流程图,编写汇编主程序,开始给堆栈初始化,把p1复位也就让彩灯一开始处于灭的状

11、态,把所有标志位复位,否则下次运行时容易出错,。给流动代码复初值,然后调用键盘程序看是否有键按下没有就跳转显示程序返回,f0为则调用功能键处理程序然后在调用显示程序返回循环。2.3键盘检测流程图有键按下吗?扫描键盘键盘扫描有键按下吗?获去键值n延时去抖动有键按下吗?yyn键已释放?设立有键按下标志yn清有键按下标志退出图二键盘检测流程图功能说明:根据图二编写键盘扫描程序,首先给f0按键清零,因为下面要读p3口,所以先orl给p3先写1在将p3给a给其余四个位置1,取反a如果为则没有键按下跳到返回。如果为1则有键按下,因为按下键有抖动,所以调用去抖延时程序在稳定期时在扫描是否有键按下有则去键值给

12、b将f0按键标志置一,在k_ret将p3口用orl置一读取p3口给a去反a如果为0则有键释放返回主程序,如果为1则无按键释放跳回k_ret循环检测是否有按键按下。延时去抖流程图开始给r7复值d1: 给r6复值r6j减1到0?r7减1到0?返回nyyn 图五延时去抖流程图delay: ;去抖延时程序 mov r7,#100 ;将r7复初值d1: mov r6,#100 ;将r6复初值 djnz r6,$ ;当r6循环100次跳到本身行 djnz r7,d1 ;r7循环10次跳到d1重新环 ret 功能说明:根据图五编辑20ms去抖延时程序,先给r7和r6复值然后先给内循环r6减1,一直减到r6等

13、0即在给外循环r7减1,如果没到0即跳回d1,当r7=0时返回。公式=1us*2*100*100=20ms2.4功能键处理流程图获取键值是00100000?是00010000?是00001000?是00000100?nnnn返回startend为1?y给startend复位n给startend置1zuoyi为1?给zuoyi复位y给zuoyi置1n给yuan置1给quan置1给updown复位给yuan置1给quan复位给updown复位nyyyy图三功能键处理流程图功能说明:根据图三编写功能键流程图,当acc.2为1跳第一个按键处理:看是启动标志否为1?不为1则给其置1启动。为1则跳d40复

14、位启动标志。其他标志复位然后返回, acc.2为0顺序执行。当acc.3为1跳第二个按键处理:看左移标志是否为1,为1则跳到d30给左循环流动标志复位和updown置1,给其他标志复位返回。为0则给左移置1,表示为左移。yuan复位把右循环标志置1给返回。acc.3为0则顺序执行。acc.4为1跳到第三个按键处理:把全亮全灭标志和交叉点亮置1,给updown复位返回。acc.4为0则顺序执行acc.5为1则跳到第四个按键处理:把updown复位,把yaun置1和把全亮全灭复位返回。acc.5为0则返回主程序。.显示彩灯流程图startend为1?updown为1?yuan为1?把0feh给p1

15、zuoyi为1?将lampcode给arl a把a给lampcode将a给p1调用延时程序将lampcode给arr a把a给lampcode将a给p1调用延时程序quan为1?把d20给a取返 a把a给d20把a给p1调用延时程序把d10给a取返 a把a给d10把a给p1调用延时程序返回结束yyyyynnnnn把0ffh给p1开始图四显示彩灯流动程序流程图功能说明:根据图四编写汇编程序,通过功能键处理程序可知道当按下第一个键将给启动键置1其他复位就从lapm跳转lampstart把0fe给p1口显示第一盏灯亮说明启动了在按下第一个键因为r0加1了所以跳转d40给启动标志复位在lamp给p1复

16、位灯灭返回。当启动后按下第二个键给给左置一跳到d50把执行单灯向左移动程序把左后的a给lapcode保证反方向流动时可以从原来的状态然后在为了能看的清楚调用延时程序返回,在次按下第二个键时因为前面功能处理程序给r1加1跳到d30给左移标志复位执行向右单灯流动程序返回。但第三个键按下时给yuan和quan置1其他标志复位既跳转到d80在跳转到d90执行全亮全灭的程序把d20给a在取反a给p1和d20记住当前的状态,调用延时程序返回。当第四个键按下时给yaun置1,把其他标志复位,既执行交叉点亮程序把d10给a取反a给p1和d10,调用延时程序返回,结束。延时流程图开始入栈给r7复初值d51: 给

17、r6复初值d52: 给r5复初值d53: r5减1到0?r6减1到0?r7减1到0?出栈返回ynnny图六延时流程图功能说明:因为去抖延时用大了r7、r6所以一开始入栈保护现场,r7、r6、r5复值,将r5减1如果没有到0则跳d53循环r5=0给r6减1看r6到0了吗,没有到则 跳到d52循环,到0了则给r7减1,看到0了吗?没到则跳d51循环,如果r5=0则出栈,返回。10秒延时 公式=100*250*200*2*1us=10ms2.代码实现updown bit 00h ;右循环标志startend bit 01h ;起动及停止标志yuan bit 02h ;全亮全灭标志quan bit 0

18、3h ;交叉点亮标志zuoyi bit 04h ;左右循环标志 lampcode equ 21h ;存放流动的数据代码d10 equ 22hd20 equ 23h org 0000h ajmp main org 0030hmain: ;主程序 mov sp,#5fh ;设置堆栈指针初值 mov p1,#00h ;p1初始化 clr updown ;启动时处于向上的状态 clr startend ;标志位初始化 clr yuan clr quan clr zuoyi mov d10,#55h ;交叉点亮灯流动代码 mov d20,#00h ;全亮全灭灯流动代码 mov lampcode,#01h

19、 ;单灯流动的代码 mov r0,#00h ;软件记数清零 mov r1,#00h ;软件记数清零loop: acall key ;调用键盘程序 jnb f0,lnext ;如果无键按下,则继续 acall keyproc ;否则调用键盘处理程序lnext: acall lamp ;调用灯显示程序 ajmp loop ;反复循环,主程序到此结束delay: ;去抖延时程序 mov r7,#100 ;将r7复初值d1: mov r6,#100 ;将r6复初值 djnz r6,$ ;当r6循环100次跳到本身行 djnz r7,d1 ;r7循环10次跳到d1重新循环 ret ;返回keyproc:

20、 mov a,b ;从b寄存器中获取键值 jb acc.2,keyd30 ;分析键的代码,某位被按下,则该位为1 jb acc.3,keyd50 jb acc.4,keyd60 jb acc.5,keyd70 ajmp key_retkeyd30: ;第一个键按下后的处理 jb startend,d40 ;如果启动标志为0则启动 setb startend ;启动标志置1 clr zuoyi ;复位其他标志位 clr yuan clr quan ajmp key_ret ;返回d40: clr startend ;复位startend, clr zuoyi ;复位其他标志位 clr yuan

21、clr updown ajmp key_ret ;返keyd50: ;第二个键按下后的处理 jb zuoyi,d30 ;如果左移标志为0 setb zuoyi ;则左移标志为1 clr yuan ;复位yuan标志位 setb updown ;给updown置1 ajmp key_retd30: ;否则跳转到d30 clr zuoyi ;给zuoyi置1 clr yuan ;复位yuan标志位 setb updown ;给updown置1 ajmp key_ret ;返回keyd60: ;第三个键按下后的处理 setb yuan ;将yuan置1 clr updown ;复位updown se

22、tb quan ;将quan置1 ajmp key_ret ;返回keyd70: ;第四个键按下后的处理 clr updown ;将updown复位 setb yuan ;将yuan置1 clr quan ;将quan复位key_ret: ret ;返回key: ;键盘扫描程序 clr f0 ;清f0,表示无键按下。 orl p3,#00111100b ;将p3口的接有键的四位置1 mov a,p3 ;取p3的值 orl a,#11000011b ;将其余4位置1 cpl a ;取反 jz key_ret1 ;如果为0则一定无键按下 acall delay ;否则延时去键抖 orl p3,#0

23、0111100b ;去抖后再次检测有无按键按下 mov a,p3 orl a,#11000011b cpl a jz k_ret mov b,a ;确实有键按下,将键值存入b中 setb f0 ;设置有键按下的标志k_ret: ;键盘释放程序 orl p3,#00111100b ;此处循环等待键的释放 mov a,p3 orl a,#11000011b cpl a jz k_ret1 ;直到读取的数据取反后为0说明键释放了,才从键盘处理程序中返回 ajmp k_retk_ret1: key_ret1: ;返回 ret;- d500ms: ;流水灯的延迟时间 push psw ;入栈 setb

24、rs0 mov r7,#10 ;给r7复初值d51: mov r6,#250 ;给r6复初值d52: mov r5,#200 ;给r5复初值d53: djnz r5,d53 ;r5减1到0则跳d53 djnz r6,d52 ;r6减1到0则跳d52 djnz r7,d51 ;r7减1到0则跳d51 pop psw ;出栈 ret ;返回lamp: jb startend,lampstart ;如果startend=1,则启动 mov p1,#00h ;否则停止 mov lampcode,#01h clr zuoyi ajmp lampret ;返回lampstart: ;启动程序 jb upd

25、own,lampup ;如果updown=1,则向右流动 jb yuan,d80 ;如果yuan=1,则全亮全灭流动 mov p1,#01h ;启动是p1。1灯亮 ajmp lampret ;返回lampup: ;灯向右流动程序 jb zuoyi,d50 ;如果zuoyi=1,则向左流动 mov a,lampcode ;将单灯流动给a rr a ;右移a mov lampcode,a ;将变化的a值给lampcode mov p1,a ;将a给p1 lcall d500ms ;延时程序 ajmp lampret ;返回d50: ;向左流动程序 mov a,lampcode ;将单灯流动给a r

26、l a ;左移a mov p1,a ;将a给p1 mov lampcode,a ;将变化的a值给lampcode lcall d500ms ;延时程序 ajmp lampret ;返回d80: ;交叉点亮程序 jb quan,d90 ;如果quan=1,则全亮程序 mov a,d10 ;把交叉点亮代码给a cpl a ;取反 mov d10,a ;在将a给d10 mov p1,a ;将a给p1 lcall d500ms ;延时程序 ajmp lampret ;返回d90: ;全亮全灭程序 mov a,d20 ;把全亮代码给a cpl a ;取反 mov d20,a ;在将a给d20 mov p

27、1,a ;将a给p1 lcall d500ms ;延时程序lampret: ;返回 ret end ;结束 第3章 仿真与调试3.1调试步骤源文件的建立:启动keil软件,选择filenew,输入源程序,输入完毕后,选择filesave,并给该文件取名txit.asm保存起来。工程的建立选择projectnew project,然后建立名为200的工程文件,并保存。一般把工程和源文件放在同一个文件夹中。注意不用加拓展名。然后选择atmel公司的89s51,点击确定。选择好后返回到主界面此时功能已建立,然后单击工程管理窗口target 1下的source group 1使其反白显示,然后右击鼠标

28、,在出现的快捷菜单中选择其中的add file to group source group 1项,在“文件类型”下拉列表框中选择asm source file(*.a*;*.src)项,这时会将文件下的*.asm文件显示出来。双击要加入的文件名或者单击要加入的文件名后单击add按钮,将这个文件加入到工程中。工程的设置选择projectoption for targettarget 1,打开debug选项卡后,在左侧最下面的parameter文本框中输入“-dledkey”,单击“确定”关闭对话框。编译、链接设置好工程后,即可进行编译链接。按f7汇编、链接以获得目标文件,然后选择debugsta

29、rt/stop debug菜单项或快捷键ctrl+f5进入调试状态。选择peripherals“键盘显示实验仿真板”,再单击“运行”按钮即可开始运行。l 在没有按第一个键p3.2时,按其他任何一个结果彩灯没有现象。l 按下第一个键p3.2后,亮一栈p1.1所接的彩灯亮,其他的灯灭。l 在按下一个键p3.2后,灯全灭。l 按下p3.2后看到一盏灯后在按第二个键p3.3后彩灯单灯向左流动,在按下该键彩灯单灯向右流动,在按下该键彩灯单灯向左移动。l 按下第三个按键p3.4后彩灯由单向流动变为全亮全灭交替亮。l 按下第四个按键p3.5后彩灯由全亮全灭交替亮变为交叉循环点亮。l 按下p3.2后所有的灯灭

30、。3.2错误处理 接到老师发的课程设计后我按着书和自己的思路编写程序编写后进行软件仿真调试发现当按下第二个键时所有没有左右循环,出现了全亮全灭与交叉流动一起出现我按下停止键进行单步运行,一步一走,到了显示程序我看到黄色的箭头在左右单灯流动没有返回直接跳到全亮全灭的程序,我在程序最后添加了ajmp lampret后,在点编辑连接后进入调试状态点运行就可以实现各按键控制相应的程序不会出现刚才的现象。但是我发现按完第一个键停止后在按第一个键运行在按第二个键左右流动时不是从开始流动而是从上次停止时的地方流动,在停止的程序给r1清零,在进行调试就可以从初始状态流动,经过处理仿真结果基本符合设计要求。3.3仿真结果仿真结果基本可以达到任务要求。当启动键(p3.2)没按时按任何键led无任何变化。按第二个键(p3.3)时向左流动,在按下向右流动按第三个键(p3.4)时led灯变化为全亮全灭。按第四个键(p3.5)时led马上变化为交叉循环电亮。在按下第二键、第三个键led显相应彩灯变化。按下第一个键灯全灭实现led停止。第4章 设计体会通过这次课程设计,让我学习到了很多知识以及认识到了很多问题。同时我意识到一个很重要的问题,那就是课程设计之前的准备工作也是很重要的,包括提前预习设计的课题,上网和去

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论