数电实验报告发光二极管走马灯电路设计与实现
- 格式:doc
- 大小:117.50 KB
- 文档页数:6
跑马灯实验报告姓名:班级:跑马灯实验报告试验目的1.学习8031内部计数器的使用和编程方法。
2.进一步掌握中断处理程序的编程方法。
3.学习端口的输入输出操作。
实验原理1、软件流程图:2.程序设计内容我们可以运用输出端口指令MOV P1,A 或MOV P1,#DATA ,只要给累加器值或常数值,然后执行上述的指令,即可达到输出控制的动作。
3、硬件连接图:4.软件清单ADR EQU 8000HORG 0000HLJMP STARTORG 001BHLJMP OT1ORG 00F0HSTART:MOV TMOD,#10HMOV TL1,#0B0HMOV TH1,#3CHSETB EASETB ET1MOV R2,#14HMOV R3,#00HSETB TR1SJMP $OT1:CLR TR1CLR EAMOV TH1,#3CHMOV TL1,#0B0HDJNZ R2,BACKNEXT:MOV R2,#14HMOV DPTR,#0200hMOV A,R3MOVC A,@A+DPTRMOV DPTR,#ADRMOVX @DPTR,AINC R3CJNE R3,#08H,BACKSJMP ROUNDBACK:SETB EASETB TR1RETIROUND:MOV R3,#00HSJMP BACKORG 0200HDB 05H,0AH,50H,0A0H,55H,0AAH,0FFH,00H END5.C语言源程序#include <AT89X51.H>unsigned char i;unsigned char temp;unsigned char a,b;void delay(void){unsigned char m,n,s;for(m=20;m>0;m--)for(n=20;n>0;n--)for(s=248;s>0;s--);}void main(void){while(1){temp=0xfe;P1=temp;delay();for(i=1;i<8;i++){a=temp<<i;b=temp>>(8-i);P1=a|b;delay();}for(i=1;i<8;i++){a=temp>>i;b=temp<<(8-i);P1=a|b;delay();}}}功能说明由8031内部定时器1,按方式1工作,即作为16位定时器使用每0.05秒钟T1溢出中断一次。
北京邮电大学实验报告实验名称:发光二级管走马灯电路的设计与实现目录一.实验目的 (3)二.实验所用仪器及元器件 (3)三.实验任务要求 (3)四.实验设计思路及过程 (3)1.设计思路 (3)2.VHDL代码 (3)五.VHDL代码分析 (4)六.仿真波形及分析 (6)1.仿真波形 (6)2. 波形分析 (7)七.故障及问题分析 (7)八.本实验总结与结论 (7)九.参考文献 (7)一.实验目的1.进一步了解时序电路描述方法;2.熟悉状态机的设计方法。
二.实验所用仪器及元器件1.计算机;2.直流稳压电源;3.数字系统与逻辑设计实验开发板。
三.实验任务要求设计并实现一个控制8个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。
1. 单点移动模式:一个点在8个发光二极管上来回的亮2. 幕布式:从中间两个点,同时向两边依次点亮直到全亮,然后再向中间点灭,依次往复。
四.实验设计思路及过程1. 设计思路定义一个控制端口,实现两种走马灯的转换。
自定义两种新的数据类型,一种含8个变量,代表幕布式移动的8种情况;另一种含13个变量,代表单点移动的13种状态。
2.过程说明:走马灯控制:en为控制端,en=0时实现单点式移动,en=1时实现幕布式移动。
单点式移动:自定义了一种数据类型one point,13个变量代表了走马灯的13种状态,高电平代表灯亮,低电平代表灯灭。
幕布式移动:自定义了一种数据类型film,8个变量代表了走马灯的8种状态,高电平代表灯亮,低电平代表灯灭。
时钟:clk为时钟信号,实际下载到实验班上测试时,加上了50MHZ的分频器。
异步复位:reset为异步复位端,高电平有效,复位至全0状态。
五. VHDL代码library ieee;use ieee.std_logic_1164.all;entity lamp is --定义实体lamp,输入端时钟clk,控制信port(clk_in,reset:in std_logic;号en,输出端口8个,代表8个LED灯light:out std_logic_vector(7 downto 0);en:in std_logic);end lamp; --结束定义architecture a of lamp is --定义结构体aTYPE film is(s0,s1,s2,s3,s4,s5,s6,s7); --定义数据类型film,onepoint TYPE onepoint is(s0,s1,s2,s3,s4,s5,s6,s7,s00,s01,s02,s03,s04,s05);signal state1:onepoint; --定义信号state1,state,并指定数据类型signal state:film;begin --开始结构体的描述语句process(a,clk_in,reset) --进程语句begin --开始if(reset='1') then light<="00000000";elsif(rising_edge(clk)) thenif a='0' then --单点式case state1 is --事件state1的相关描述when s0=>state1<=s1;light<="10000000";when s1=>state1<=s2;light<="01000000";when s2=>state1<=s3;light<="00100000";when s3=>state1<=s4;light<="00010000";when s4=>state1<=s5;light<="00001000";when s5=>state1<=s6;light<="00000100";when s6=>state1<=s7;light<="00000010";when s7=>state1<=s00;light<="00000001";when s00=>state1<=s01;light<="00000010";when s01=>state1<=s02;light<="00000100";when s02=>state1<=s03;light<="00001000";when s03=>state1<=s04;light<="00010000";when s04=>state1<=s05;light<="00100000";when s05=>state1<=s0;light<="01000000";end case;else --幕布式,实现原理同单点移动case state iswhen s0=>state<=s1;light<="00011000";when s1=>state<=s2;light<="00111100";when s2=>state<=s3;light<="01111110";when s3=>state<=s4;light<="11111111";when s4=>state<=s5;light<="01111110";when s5=>state<=s6;light<="00111100";when s6=>state<=s7;light<="00011000";when s7=>state<=s0;light<="00000000";end case;end if;end if;end process;end arch_L1; --结束六.仿真波形及分析1.仿真波形(1)单点移动式(2)幕布式2. 波形分析(1)单点移动式由图可以看出,当en为0时程序实现单点移动功能,具体表现为,light[7]开始亮,之后依次为light[6], light[5], light[4], light[3], light[2], light[1], light[0],然后light[1]也开始亮,往回依此类推,实现了功能要求(2)幕布式由图可以看出,当en为1时,如,先是中间的两个灯light[4], light[5]亮,下一下阶段是light[3, light[4], light[5], light[6]亮,接下来是light[2], light[3], light[4], light5], light[6], light[7]亮,最后全亮,接着light[2], light[3], light[4], light5], light[6], light[7]亮,继而循环下去,从而实现功能。
一、实验背景随着科技的不断发展,电子技术在我们的日常生活中扮演着越来越重要的角色。
作为电子信息工程专业的学生,掌握电子电路的设计与制作技能是必不可少的。
本实训旨在通过制作跑马灯,让学生了解基本电子元件的原理和电路设计方法,提高学生的动手能力和创新思维。
二、实验目的1. 熟悉电子元件的使用方法和电路原理。
2. 掌握电路图的绘制和实际电路的制作。
3. 理解跑马灯的工作原理,并能够进行简单的故障排除。
4. 培养学生的团队协作能力和实践创新能力。
三、实验内容1. 基本跑马灯电路制作(1)材料准备:8个发光二极管(LED)、1个按键(K1)、1个电阻、1个面包板、1个电源、连接线等。
(2)电路连接:根据图1电路图,将LED按照顺序连接到面包板上,确保每个LED的正负极正确连接。
将按键K1连接到电路中,并设置合适的电阻以限制电流。
(3)程序编写:使用C语言或汇编语言编写程序,实现LED的顺序点亮和熄灭,模拟跑马灯效果。
2. 键控跑马灯电路制作(1)材料准备:8个发光二极管(LED)、2个按键(K1、K2)、1个电阻、1个面包板、1个电源、连接线等。
(2)电路连接:在基本跑马灯电路的基础上,增加按键K2。
按下K1时,LED按正序点亮;按下K2时,LED按倒序点亮。
(3)程序编写:在原有程序的基础上,增加按键判断逻辑,实现按键控制LED点亮顺序的功能。
3. 多功能跑马灯电路制作(1)材料准备:8个发光二极管(LED)、3个按键(K1、K2、K3)、1个电阻、1个面包板、1个电源、连接线等。
(2)电路连接:在键控跑马灯电路的基础上,增加按键K3。
按下K1时,LED按正序点亮;按下K2时,LED按倒序点亮;按下K3时,LED全部熄灭。
(3)程序编写:在原有程序的基础上,增加按键判断逻辑,实现按键控制LED点亮顺序和熄灭的功能。
四、实验结果与分析1. 成功制作出基本跑马灯电路,实现了LED的顺序点亮和熄灭。
2. 成功制作出键控跑马灯电路,实现了按键控制LED点亮顺序的功能。
电子系统综合设计报告学号 201009120229 姓名李文海年级专业 2010级电子信息工程(二) 指导教师刘怀强学院理学院走马灯实验论文--《嵌入式系统技术》1、实验目的1、学会dp-51pro实验仪监控程序下载、动态调试等联机调试功能的使用;2、理解和学会单片机并口的作为通用i/o的使用;3、理解和学会单片机外部中断的使用;4、了解单片机定时器/计数器的应用。
2、实验设备z pc 机、arm 仿真器、2440 实验箱、串口线。
3、实验内容z 熟悉 arm 开发环境的建立。
z 使用 arm 汇编和 c 语言设置 gpio 口的相应寄存器。
z 编写跑马灯程序。
5、实验原理走马灯实验是一个硬件实验,因此要求使用dp-51pro 单片机综合仿真实验仪进行硬件仿真,首先要求先进行软件仿真,排除软件语法错误,保证关键程序段的正确。
然后连接仿真仪,下载监控程序,进行主机与实验箱联机仿真。
为了使单独编译的 c 语言程序和汇编程序之间能够相互调用,必须为子程序间的调用规定一定的规则。
atpcs ,即 arm , thumb 过程调用标准(arm/thumb procedure callstandard),是 arm 程序和 thumb 程序中子程序调用的基本规则,它规定了一些子程序间调用的基本规则,如子程序调用过程中的寄存器的使用规则,堆栈的使用规则,参数的传递规则等。
下面结合实际介绍几种 atpcs 规则,如果读者想了解更多的规则,可以查看相关的书籍。
1.基本 atpcs 基本 atpcs 规定了在子程序调用时的一些基本规则,包括下面 3 方面的内容:(1)各寄存器的使用规则及其相应的名称。
(2)数据栈的使用规则。
(3)参数传递的规则。
相对于其它类型的 atpcs,满足基本 atpcs 的程序的执行速度更快,所占用的内存更少。
但是它不能提供以下的支持: arm 程序和 thumb 程序相互调用,数据以及代码的位置无关的支持,子程序的可重入性,数据栈检查的支持。
跑马灯实验报告
实验目的,通过搭建一个简单的跑马灯电路,了解电子元件的基本原理和电路的工作方式。
实验器材,LED灯、电阻、导线、电池、开关、面包板。
实验步骤:
1. 将LED灯的正极与电池的正极通过导线连接起来,负极与电阻连接,然后再将电阻的另一端与电池的负极连接。
2. 将开关连接到电路中,使得可以通过开关控制电路的通断。
3. 将整个电路搭建在面包板上,确保连接牢固。
4. 打开开关,观察LED灯的亮灭情况。
实验结果:
经过搭建和观察,我们发现当开关闭合时,LED灯会亮起;当开关断开时,LED灯会熄灭。
通过不断地开合开关,我们可以看到LED灯会不断地亮灭,就像跑马灯一样在不同的位置闪烁。
实验分析:
跑马灯实验的原理是利用开关控制电路的通断,从而控制LED灯的亮灭。
当开关闭合时,电路闭合,电流可以流通,LED灯就会亮起;当开关断开时,电路断开,电流无法流通,LED灯就会熄灭。
通过不断地开合开关,就可以实现LED 灯的频繁闪烁,呈现出跑马灯的效果。
实验总结:
通过这个简单的跑马灯实验,我们了解了电子元件的基本原理和电路的工作方式。
同时,我们也体会到了实验中的观察和分析的重要性。
在今后的学习中,我们将进一步深入学习电子电路的知识,探索更多有趣的实验和应用。
以上就是本次跑马灯实验的实验报告,希望对大家有所帮助。
实验报告一:实验名称跑马灯电路二:实验目的(1)掌握proteus软件的使用方法;(2)调试跑马灯电路的汇编语言;(3)绘制跑马灯原理图,实现电路的实现;三:实验要求跑马灯电路,即实现p1口上的8个发光二极管循环闪亮的电路。
四:实验仪器计算机,keil c51软件,proteus软件。
五:参考程序ORG 0000H ;程序入口AJMP MAIN ;转主程序ORG 30HMAIN:MOV R2,#16 ;将16送给R2MOV A,#0FEH ;将0FEH送给累加器ALOOP:MOV P1,A ;循环,将累加器A的值送给p1LCALL D1 ;长调子程序D1RL A ;累加器循环左移DJNZ R2,LOOP ;R2减1非0则转移到LOOPD1: MOV R4,#10 ;将10送给R4D2: MOV R5,#100 ;将100送给R5D3: MOV R6,#249 ;将249送给R6DJNZ R6,$ ;R6减1不为0,则原地等待DJNZ R5,D3 ;R5减1不为0,则转到D3DJNZ R4,D2 ;R4减1不为0,则转到D2RET ;返回主程序END六:试验步骤(1)进入keil c51系统的操作环境,并建立一个工程,输入汇编程序,对程序进行编译和链接:(2):调试无误后运行程序并检查运行结果,检查正确后生成hex文件:(3):在软件proteus中,绘制电路图,找到此实验需要用到的主要元器件及其符号:1:单片机AT89C51;2:电阻RES 10k;3:电容 CAP 30uF;4:晶振 CRYSTAL ;5;排阻 RESPACK-8;6:开关 BUTTON;7:发光二级管 LED;(4)绘制电路仿真图,然后将生成的hex文件下载到AT89C51中,并开始仿真,结果如下:七:实验结果程序仿真完成后,发光二级管会有规律的从左向右循环闪亮,直到时间结束后才会停下。
学号14142200277序号19单片机原理与接口技术实验报告实验项目序号一实验项目名称跑马灯实验姓名卢志雄专业电子信息工程班级电信14-2BF完成时间 2016年4月2日一、实验内容实验内容为3项,其中第1、2项必做。
1、基本的流水灯。
根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。
每点亮一个LED,采用软件延时一段时间。
2、简单键控的流水灯。
不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。
松手后,又按正序点亮流水灯。
3、键控的流水灯。
上电,不点亮LED,按一下K1键,按正序点亮流水灯。
按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。
二、电路原理图图1 跑马灯实验电路原理图三、程序流程图图2 简单键控的流水灯程序流程图四、源程序1、基本的流水灯#include<reg51.h>#define uint unsigned int#define uchar unsigned charvoid delay( j ) //延时函数data uint j;{ data uint i;while(j--)for(i=0;i<250;i++);}void main( ) //主函数{ data uchar a;a=1; //保证只有一个点亮while(1) //不断循环{ P2=~a; //低电平点亮a=a<<1; //左移一位,右补0if(a==0)a=1; //全0delay(2250);} //流动点亮延时}2、简单键控的流水灯#include<reg51.h>#define uchar unsigned char #define uint unsigned int void delay(uint i){ uchar t;while(i--){for(t=0;t<120;t++);}}void main(){ data uchar a;a=1;while(P2==0xff){ P0=~a;a=a<<1;if(a==0)a=1;delay(250);}while(P2==0xfe){ P0=~a;a=a>>1;if(a==0)a=128;delay(250);}}3、键控的流水灯#include<reg51.h>#define uchar unsigned char #define uint unsigned int void delay(uint i){ uchar t;data uchar b=0xfb;while(i--){ if(P2==0xfe) b=0xfe;if(P2==0xfd) b=0xfd;if(P2==0xfb) b=0xfb;for(t=0;t<120;t++);}}void main(){ data uchar a;a=1;while(P2==0xfe){ P0=~a;a=a<<1;if(a==0)a=1;delay(250);while(P2==0xff){P0=~a;a=a<<1;if(a==0)a=1;delay(250);}}while(P2==0xfd){ P0=~a;a=a>>1;if(a==0)a=128;delay(250);while(P2==0xff){ P0=~a;a=a>>1;if(a==0)a=128;delay(250);}}while(P2==0xfb){ P0=0xff;}}五、实验结果1、基本的流水灯基本流水灯仿真图2、简单键控的流水灯简单键控的流水灯仿真图3、键控的流水灯键控的流水灯仿真图六、思考题回答1、采用I/O口作为输出口时要考虑哪些因素?为什么实验装置中LED要串联一个电阻?答:电压的大小(包括它能感知的最小电压作为高电平),电流的驱动能力等,同时也要要考虑它是否要加上拉电阻。
实验报告跑马灯实验报告:跑马灯引言:跑马灯作为一种常见的室内装饰和广告展示工具,广泛应用于商场、剧院、车站等公共场所。
本实验旨在探究跑马灯的工作原理和设计过程,并通过实际搭建跑马灯模型进行验证。
一、跑马灯的工作原理跑马灯是通过一组灯泡或LED灯组成的,它们按照一定的顺序依次亮灭,从而形成连续的动态效果。
跑马灯的工作原理主要包括电路控制和程序设计两个方面。
1. 电路控制:跑马灯的电路控制是通过继电器或集成电路实现的。
继电器是一种电磁开关,通过控制电磁铁的通断来控制灯泡的亮灭。
而集成电路则是通过逻辑门和计时器等元件实现灯泡的顺序控制。
2. 程序设计:跑马灯的程序设计是通过编写一段简单的代码来实现的。
在代码中,通过控制灯泡或LED灯的亮灭时间和顺序来实现跑马灯效果。
常见的程序设计语言如C、Python等都可以用来编写跑马灯的代码。
二、跑马灯的设计过程跑马灯的设计过程包括灯泡或LED灯的选型、电路设计、程序编写和外壳制作等步骤。
1. 灯泡或LED灯的选型:在跑马灯的设计中,选择合适的灯泡或LED灯是非常重要的。
灯泡的亮度、寿命和能耗等指标需要进行综合考虑。
而LED灯则具有节能、寿命长和颜色丰富等优点,因此在现代跑马灯设计中更加常见。
2. 电路设计:电路设计是跑马灯设计中的关键环节。
在电路设计中,需要考虑灯泡或LED灯的亮灭顺序、时间间隔和电源供应等因素。
通过合理的电路设计,可以实现跑马灯的稳定运行和灯泡的长寿命。
3. 程序编写:程序编写是跑马灯设计中的另一个重要环节。
通过编写一段简单的代码,可以控制灯泡或LED灯的亮灭顺序和时间间隔。
程序编写需要考虑灯泡或LED灯的数量和控制方式等因素,以实现预期的跑马灯效果。
4. 外壳制作:外壳制作是跑马灯设计中的最后一步。
通过设计和制作合适的外壳,可以保护电路和灯泡或LED灯,同时也可以增加跑马灯的美观性。
外壳的材料可以选择塑料、金属或木材等,根据实际需要进行选择。
可编辑修改精选全文完整版实验一跑马灯实验一、实验内容1、基本的流水灯根据图1电路,编写一段程序,使8个发光二极管D1、D2、D3、D4、D5、D6、D7、D8顺序(正序)点亮:先点亮D1,再点亮D2、D3……D8、D1……,循环点亮。
每点亮一个LED,采用软件延时一段时间。
2、简单键控的流水灯不按键,按正序点亮流水灯;按下K1不松手,按倒序点亮流水灯,即先点亮D8,再顺序点亮D7、D6……D1、D8……。
松手后,又按正序点亮流水灯。
3、键控的流水灯上电,不点亮LED,按一下K1键,按正序点亮流水灯。
按一下K2键,按倒序点亮流水灯,按一下K3键,全部关闭LED。
二、实验方案1、总体方案设计考虑到K4键未被使用,所以将实验内容中的三项合并到一个主函数中:K4键代替实验内容第二项中的K1键;单片机一开机即执行实验内容第一项;K1、K2、K3键实现实验内容第三项。
所用硬件:AT89C52、BUTTON、LED-BLUE、电源输入:P2.0-K1;P2.1-K2;P2.2-K3;P2.3-K4。
低电平有效输出:P0.0~P0.7-D0~D7。
LED组连线采用共阳极,低电平有效软件设计:软件延时采用延时函数delay(t),可调整延迟时间:void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}由于涉及到按键变化所以要设置一个变量oldK保留按键键值,要在延时程序中检测是否按键,当按键后立即设置oldK的值。
按键判断采用在while循环中利用条件语句判断P2的值然后执行该键对应的代码段,达到相应的响应。
为了让K4键的效果优化,即状态变化从当前已亮灯开始顺序点亮或逆序点亮,利用全局变量n来记录灯号,利用算法即可实现。
主要算法:1、全局变量的定义:uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;2、顺序、逆序点亮流水灯:void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}3、实验内容第二项流水灯灯亮顺序变换:void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){out=D[n];n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}4、对应实验内容第一项,开机顺序点亮流水灯:while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}2、实验原理图图2-1 实验原理图3、程序流程图图2-2 程序流程图三、源程序#include"reg51.h"#define uchar unsigned char#define uint unsigned int#define out P0uchar D[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0X7f};//单个LED亮uchar AllOff=0xff;//LED全灭uchar AllOn=0x00;//LED全亮uchar K[]={0xff,0xfe,0xfd,0xfb,0xf7};//按键开关uchar oldK;//记录已按键int n;//记录当前亮的灯号void delay(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK&&P2!=K[0])break;//按下了其他键退出循环}}void delay10ms(){uint i;for(i=0;i<10000;i++);}void forward(){for(n=0;n<=7;n++){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}void backward(){for(n=7;n>=0;n--){out=D[n];delay(15);if(P2!=oldK&&P2!=K[0])break;}out=AllOff;}int delay4(uint t){uint i;while(t--)for(i=0;i<1000;i++){if(P2!=oldK){ //按键变化退出循环return 1;}}return 0;}void hold(){n=8;while(1){if(P2==K[4]){//一直按着K4键,逆序点亮跑马灯oldK=K[4];if(n==-1)n=7; //D0灯亮后点亮D7while(n>=0){n--;if(delay4(15))break;}}if(P2==K[0]){//未按下K4键,一直正序点亮跑马灯oldK=K[0];if(n==8)n=0;//D7灯亮后点亮D0while(n<=7){out=D[n];n++;if(delay4(15))break;}}if(P2!=K[4]&&P2!=K[0]){//按下了其他键,退出hold函数break;}}}void main(){oldK=K[0];while(1){//开机即正序点亮流水灯forward();if(P2!=K[0]){break;}}while(1){out=AllOff;if((P2&0x0f)!=0x0f){//检测有键按下delay10ms();//延时10ms再去检测//P2.0_K1键按下正序点亮流水灯if(P2==K[1]){oldK=K[1];while(1){forward();if(P2!=K[1]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.1_K2键按下逆序点亮流水灯if(P2==K[2]){while(1){backward();if(P2!=K[2]&&P2!=K[0]){//按下了其他键,退出break;}}}//P2.2_K3键按下关闭全部LEDif(P2==K[3]){oldK=K[3];out=AllOff;}//P2.3_K4键按下长按逆序点亮流水灯,不按正序点亮流水灯,直到其他键按下停止if(P2==K[4]){hold();}}}}四、实验结果1、基本的流水灯:开机后即重复顺序点亮流水灯,等待其他按键。
LED跑马灯实验初学者可先动手做下面的实验:发光二极管轮流点亮的实验,也就是通常所说的跑马灯实验,首先让我们来完成必须的硬件部分,我们需要焊接上8个发光二极管和8个限流电阻,可以参考下面的原理图和实物图像进行操作,需要注意的是LED是有极性的,引脚长的为正极,引脚短的为负极,负极和电阻一侧连接,如果接错那么相应的那一路可能在实验中不会点亮了,在焊接前要看仔细哦 D2D7D4D3D1D6D5D8R7R2R3R4R5R6R1R812345678STC89C51RC VCC +5V 下面我们来完成软件编程设计,这里我们没有采用高深的编程技巧,而是用了最笨、最直接的向端口送数的办法来实现,一来程序比较简单,没必要玩深沉,而且初学者看起来直观易懂。
ORG 0000H START:MOV P1,#01111111B;最下面的LED点亮 LCALL DELAY;延时1秒 MOV P1,#10111111B;最下面第二个的LED点亮 LCALL DELAY;延时1秒 MOV P1,#11011111B;最下面第三个的LED点亮 (以下省略) LCALL DELAY MOV P1,#11101111B LCALL DELAY MOV P1,#11110111B LCALL DELAY MOV P1,#11111011B LCALL DELAY MOV P1,#11111101B LCALL DELAY MOV P1,#11111110B LCALL DELAY MOV P1,#11111111B;完成第一次循环点亮,延时约0.25秒 AJMP START;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: MOV R4,#2 L3: MOV R2 ,#250 L1: MOV R3 ,#250 L2: DJNZ R3 ,L2 DJNZ R2 ,L1 DJNZ R4 ,L3 RET END 如何精确计算延时子程序的执行时间? 汇编语言的一大优势就是能够精确控制程序的执行时间,这在编写一些对时序要求严格的外围器件驱动时由为重要! ;延时子程序,12M晶振延时约253毫秒 DELAY: MOV R4,#2------执行1个机器周期,耗时1微秒 L3: MOV R2 ,#250---执行1个机器周期,耗时1微秒 L1: MOV R3 ,#251---执行1个机器周期,耗时1微秒 L2: DJNZ R3 ,L2---执行2个机器周期,反复执行251次(2x251)=502微秒) DJNZ R2 ,L1-----执行2个机器周期,反复执行250次(1+502+2)*250=126250微秒) DJNZ R4 ,L3-----执行2个机器周期,反复执行2次 (1+1+502+126250+2)*2=253512微秒) RET delay 加上第一条总共延时1+253512=253513微秒 。
北京邮电大学
数字电路与逻辑设计实验
实验报告
实验名称:发光二极管走马灯电路设计与实现
学院:
班级:
姓名:
学号:
任课老师:
实验日期:
成绩:
一.实验名称和实验任务要求
实验名称:发光二极管走马灯电路设计与实现
实验目的:⑴进一步了解时序电路描述方法;
⑵熟悉状态机的设计方法。
实验任务要求:
设计并实现一个控制8个发光二极管亮灭的电路,仿真验证其功能,并下载到实验板测试。
⑴单点移动模式:一个点在8个发光二极管上来回的亮;
⑵幕布式:从中间两个点,同时向两边依次点亮直至全亮,然后
再向中间点灭,依次往复。
二.设计思路和过程
设计实现过程:⑴设计的电路拥有两种功能,所以设定d_in控制
输出实现两种功能,规定当d_in=0时,实现单
点移动模式;当d_in=1时,实现幕布式。
同时,
时序电路中钟控是必不可少的,所以引入clk_in
来实现钟控。
最终需输出在实验板上的8个发光
二极管上验证,所以输出f需设定为8端口输出,
如:f:out std_logic_vector(7 downto 0)。
⑵单点移动模式的实现:来一个时钟沿,实现一次
变化。
单点移动模式需实现发光二极管来回亮,
所以需定义一个16变量的数据类型。
利用
CASE-WHEN语句实现状态的转移。
状态转移。
⑶幕布式的实现:需实现发光二极管从中间两个点,
同时向两边依次点亮直至全亮,然后再向中间点
灭,往复。
需要8变量数据类型,利用单点式中
信号类型定义给状态转移。
状态转移需满足:
三.VHDL程序
发光二极管走马灯电路VHDL程序:
四.仿真波形图
发光二极管走马灯电路的仿真波形图:
五.仿真波形图分析
⑴单点移动模式功能的仿真波形图分析:
由波形可见,当控制信号d_in=0时,输出的8个端口依次出现正脉冲,波形呈现阶梯状,代表一个发光的点在8个发光二极管上来回的亮,实现了功能要求;
⑵幕布式功能的仿真波形图的分析:
当控制信号d_in=1时,输出的8个端口出现正脉冲的时间与
脉冲的长度呈现“中间宽,两头窄”的形状,先是中间的两个灯亮,接下来是中间四个灯亮,接下来是中间六个灯亮,两旁两个灯不亮,最后全亮,接着中间六个灯亮,两旁两个灯不亮,继而循环下去,实现了幕布式的点灯方式。
由图可知,该电路实现了要求的逻辑。
六.故障及问题分析
⑴开始设计时想到用计数器实现,导致全用case语句实现当设计电路,但是仿真是发现:不论是单点移动式还是幕布式只能实现单方向的移动,而无法进行反方向的移动。
最后,查阅书籍决定改为引入类型定义语句,利用类型第一语句来完成实验,所以引进了16个信号数据类型进行状态转移。
⑵电路拥有两个功能,不能同时将这两个功能实现,所以需引进控制信号来控制功能的实现。
⑶引入时钟,控制状态的变化,此次的时钟的周期不用分频器来分频,利用实验板上先用的低频率时钟,可以实现发光二极管的状态变化。
⑷实验的程序设计基本上问题不大,主要是要熟练掌握IF-THEN, CASE-WHEN语句等。
七.总结和结论
这学期的数字电路与逻辑设计实验在这一周结束了。
这学期学了一门新课程,接触了关于课程的实验,我发现理论联系实际,实验验证理论的方法令人感到很满足。
每次做实验都会期待这次的电路设计自己会做出一个什么东西出来。
实验课结束了,回顾这几周的实验,
现在的我可以很高兴的说:现在自己已经基本上掌握了数字电路的设计了。
这几周的数字逻辑电路设计实验,我明白了一个重要的道理:进行实验,理论分析是十分重要的一环,只有逻辑分析透彻无误了,才能用语言进行描述,进而用硬件实现。
这几次实验让我对VHDL这样一门硬件描述语言有了更加深刻的认识。
同时,我也明白了做任何实验之前预习的要求是极为重要的。
做好预习工作,不仅可以减少实验课上应无知而浪费的时间,还可以更深入的明白仿真实验所蕴含的原理。
总的来说,数字逻辑电路与设计实验课对我的帮助真的很大。
我更加深刻的理解了理论课上老师所教授的知识,同时对于自己能够将理论知识运用到实验中感到十分高兴,相信下学期的数字逻辑电路与设计实验将会带给我更多新奇与经验。