二进制数流水灯
流水灯设计报告
流水灯设计报告一、实验目的通过本实验教学,学习数字电路综合应用(将单元电路组成系统电路的方法),掌握简单数字系统设计方法。
通过查阅手册和文献资料,培养独立分析和解决实际问题的能力。
掌握示波器、信号发生器、频率计、万用电表等常用电子仪器设备的使用。
获得数字电路综合应用能力。
二、实验内容用D 触发器和译码器设计一个8位可循环的流水灯,用仿真软件进行仿真,最后根据电路图在万能板上焊接出来。
三、实验原理1.D 触发器D 触发器的状态方程为:Q n+1=D 。
其状态的更新发生在CP 脉冲的边沿,74LS74(CC4013)、74LS175(CC4042)等均为上升沿触发,故又称之为上升沿触发器的边沿触发器,触发器的状态只取决于时针到来前D 端的状态。
D 触发器应用很广,可用做数字信号的寄存,移位寄存,分频和波形发生器等,图A 为74LS74外引线排列,图B 为D 触发器逻辑符号。
2.译码器74LS138 为3 线-8 线译码器,共有 54LS138和 74LS138 两种线路结构型式工作原理:① 当一个选通端(E1)为高电平,另两个选通端((/E2))和/(E3))为低电平时,可将地址端(A0、A1、A2)的二进制编码在Y0至Y7对应的输出端以低电平译出。
比如:A2A1A0=110时,则Y6输出端输出低电平信号。
图A 74LS74外引线排列图B D 触发器逻辑符号表1 74LS138逻辑功能表② 利用 E1、E2和E3可级联扩展成 24 线译码器;若外接一个反相器还可级联扩展成 32 线译码器。
③ 若将选通端中的一个作为数据输入端时,74LS138还可作数据分配器。
④ 可用在8086的译码电路中,扩展内存。
引脚功能:A0∽A2:地址输入端STA (E1):选通端/STB (/E2)、/STC (/E3):选通端(低电平有效)/Y0∽/Y7:输出端(低电平有效)VCC :电源正GND :地A0∽A2对应Y0——Y7;A0,A1,A2以二进制形式输入,然后转换成十进制,对应相应Y 的序号输出低电平,其他均为高电平。
I2C总线流水灯
基于51单片机的I2C总线流水灯1.实验任务利用单片机AT89C51与24C02C芯片、LED设计一串流水灯,八个流水灯。
2. 电路原理图3.硬件的连接1)sck管脚与单片机的P3.6相连;2)sda管脚与单片机的P3.7相连;3)24C02C其他管脚都接地;4)P1口接八个led灯;4.c语言程序设计#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit sda=P3^7; //定义数据线sbit scl=P3^6; //定义时钟线uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//灯的显示代码void delay(){;;}void delay1(uint z) //延时{int x,y;for(x=0;x<110;x++)for(y=z;y>0;y--);}void init () //初始化要比较好{sda=1;scl=1;delay();}void start()//开始/当时钟线为高时,数据线从高到低的跳变,表示开始。
当然当中的延时有3us 已经足够。
{sda=1;delay();scl=1;delay();sda=0;delay();}void stop()//结束/当时钟线为高时,数据线从低到高的跳变表示结束。
{sda=0;delay();scl=1;delay();sda=1;delay();}void respons()//应答器件会将sda线拉低,表示收完了8位数据,所以一开始将数据拉高,是位了观察sda线是否被拉低;然而若从件没有给应答信号{ //若从件没有给应答信号,过了一段时间后,就默认它以接受完了。
uchar i="0";scl=1;delay();while((sda==1)&&(i<255))i++;scl=0;delay();}void wr_date(uchar date)//写入芯片{uchar i,temp;temp=date;for(i=0;i<8;i++){scl=0; //当scl 线为低时,才允许sda变化,所以将其拉低delay();temp=(temp<<1); //将要发的东西左移到CY位,sda=CY; // 将要发的数据给sda线delay();scl=1; //delay();}scl=0; //当scl线从高到低跳变时,发送一位数据delay();}uchar re_date()//读出芯片的内容原理和上面写数据差不多。
微机原理流水灯
微机原理流水灯流水灯,又称为跑马灯,是一种常见的LED灯效。
它的灯光效果像水流一样流动,非常美观。
在微机原理中,流水灯的实现是一个很好的实践项目,可以帮助学生理解数字电路和微机原理的知识。
本文将介绍如何使用微机原理实现流水灯,并提供相应的代码和电路图供参考。
首先,我们需要准备以下材料:1. 8个LED灯。
2. 8个220Ω的电阻。
3. 一个面包板。
4. 杜邦线若干。
5. 一个Arduino开发板。
接下来,我们来看一下流水灯的原理。
流水灯的实现原理是通过依次点亮LED 灯,然后熄灭前一个LED,点亮下一个LED,以此类推,就形成了灯光像水流一样流动的效果。
在微机原理中,我们可以利用Arduino开发板来实现这一效果。
首先,我们需要将8个LED灯连接到Arduino开发板上。
将LED的长针(阳极)通过220Ω的电阻连接到Arduino的数字引脚2~9上,LED的短针(阴极)接地。
接下来,我们需要编写Arduino的程序来实现流水灯的效果。
以下是流水灯的Arduino代码:```c。
int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9};void setup() {。
for (int i = 0; i < 8; i++) {。
pinMode(ledPins[i], OUTPUT);}。
}。
void loop() {。
for (int i = 0; i < 8; i++) {。
digitalWrite(ledPins[i], HIGH);delay(100);digitalWrite(ledPins[i], LOW);}。
}。
```。
在这段代码中,我们首先定义了8个LED灯的引脚号,然后在setup函数中将这些引脚设置为输出模式。
在loop函数中,我们依次点亮每个LED灯,并通过delay函数控制灯光的流动速度。
接下来,我们将Arduino开发板连接到电脑上,上传这段代码到开发板中。
流水灯程序
图1流水灯硬件原理图从原理图中可以看出,假如要让接在PLO 口的LEDI 亮起来,那么只要把 P1.0口的电平变为低电平就可以了;相反,假如要接在PLO 口的LEDl 熄灭,就 要把PLO 口的电平变为高电平洞理,接在P1.1~PL7 口的其他7个LED 的点 亮和熄灭的方法同LED1。
因此,要实现流水灯功能,我们只要将发光二极管 LED1-LED8依次点亮、熄灭,8只LED 灯便会一亮一暗的做流水灯了。
在此 我们还应留意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很 短,我们在掌握二极管亮灭的时候应当延时一段时间,否则我们就看不到“流水” 效果了。
3.软件编程单片机的应用系统由硬件和软件组成,上述硬件原理图搭建完成上电之后, 我们还不能看到流水灯循环点亮的现象,我们还需要告知单片机怎么来进行工PlO POO Pll POl PlJ POi PlJ P03 Pl* PO* P15 PO 5 Pl 3PO 4 P17 λ!SS>C51POT am PJO nττoPnP22 Il pn IO P” P25 I∑∖T> PY P27Xl X :XXD!XD KD ALEP TlPSHT∖n47Kx8VCCLEDl-M —LED)W LED)LED1 W * LEDS人KLEDj WLED7W-44LEDS-M作,即编写程序掌握单片机管脚电平的凹凸变化,来实现发光二极管的一亮一灭。
软件编程是单片机应用系统中的一个重要的组成部分,是单片机学习的重点和难点。
下面我们以最简洁的流水灯掌握功能即实现8个LED灯的循环点亮,来介绍实现流水灯掌握的几种软件编程方法。
3.1位控法这是一种比较笨但又最易理解的方法,采纳挨次程序结构,用位指令掌握Pl 口的每一个位输出凹凸电平,从而来掌握相应LED灯的亮灭。
程序如下:ORG OOOOH ;单片机上电后从0000H地址执行AJMPSTART ;跳转到主程序存放地址处ORG 0030H ;设置主程序开头地址START : MOV SP , #60H ;设置堆栈起始地址为60HCLRPl.0;PLO输出低电平,使LEDl点亮ACALL DELAY ;调用延时子程序SETB P1.0;P1.0输出高电平,使LEDl熄灭CLR Pl.l ;P1.1输出低电平,使LED2点亮ACALL DELAY ;调用延时子程序SETB Pl.l ;P1.1输出高电平,使LED2熄灭CLR P1.2;P1.2输出低电平,使LED3点亮ACALL DELAY ;调用延时子程序SETB P1.2;P1.2输出高电平,使LED3熄灭CLR P1.3 ;P1.3输出低电平,使LED4点亮ACALL DELAY ;调用延时子程序SETB P1.3;P1.3输出高电平,使LED4熄灭CLR Pl.4 ;P1.4输出低电平,使LED5点亮ACALL DELAY ;调用延时子程序SETB P1.4;P1.4输出高电平,使LED5熄灭CLR P1.5;P1.5输出低电平,使LED6点亮ACALL DELAY ;调用延时子程序SETB P1.5;P1.5输出高电平,使LED6熄灭CLR P1.6 ;P1.6输出低电平,使LED7点亮ACALL DELAY ;调用延时子程序CLR P1.7 ;P1.7输出低电平,使LED8点亮ACALL DELAY ;调用延时子程序SETB P1.7pl.7输出高电平,使LED8熄灭ACALL DELAY ;调用延时子程序START ;8个LED流了一遍后返回到标号START处再循环AJMPDELAY :;延时子程序MOV RO , #255 ;延时一段时间Dl : MOV Rl , #255DJNZRl , $DJNZ RO , DlRET ;子程序返回END ;程序结束3.2循环移位法在上个程序中我们是逐个掌握Pl端口的每个位来实现的,因此程序显得有点简单,下面我们采用循环移位指令,采纳循环程序结构进行编程。
哈工大数电自主实验-数字流水灯
Harbin Institute of Technology数字电路自主设计实验院系:航天学院班级:姓名:学号:指导教师:哈尔滨工业大学一、实验目的1.进一步掌握数字电路课程所学的理论知识。
2.熟悉几种常用集成数字芯片的功能和应用,并掌握其工作原理,进一步学会使用其进行电路设计。
3.了解数字系统设计的基本思想和方法,学会科学分析和解决问题。
4.培养认真严谨的工作作风和实事求是的工作态度。
5.数电课程实验为我们提供了动手实践的机会,增强动手实践的能力。
二、实验要求设计流水灯,即一排灯按一定的顺序逐次点亮,且可调频、暂停、步进。
三、实验步骤1.设计电路实现题目要求,电路在功能相当的情况下设计越简单越好;2. 画出电路原理图(或仿真电路图);3.元器件及参数选择;4.电路仿真与调试;5.到实验时进行电路的连接与功能验证,注意布线,要直角连接,选最短路径,不要相互交叉,注意用电安全,所加电压不能太高,以免烧坏芯片;6.找指导教师进行实验的检查与验收;7.编写设计报告:写出设计与制作的全过程,附上有关资料和图纸,心得体会。
四、实验原理设计流水灯的方法有很多种,我的设计思路是:利用555定时器产生秒脉冲信号,74LS161组成8进制计数器,74LS138进行译码,点亮电平指示灯。
并通过调节555的电阻,实现频率可调。
通过两与非门,实现暂停、步进功能。
1.秒信号发生器(1)555定时器结构(2)555定时器引脚图(3)555定时器功能表(4)555定时器仿真图2. 74LS161实现8进制加计数74LS161是常用的四位二进制可预置的同步加法计数器,它可以灵活地运用在各种数字电路,以及单片机系统中实现分频器等很多重要的功能。
(1)74LS161同步加法器引脚图管脚图介绍:始终CP和四个数据输入端P0-P3清零CLR使能EP,ET置数PE数据输出端Q0-Q3进位输出TC(2)74LS161功能表(5)74LS161仿真图对74LS161进行八进制计数改组,需要一个与非门,即芯片74LS00,也就是将74LS161的输出端通过与非门,当输出为8时将输出为高电平的端口与非后接到74LS161的清零段。
流水灯实验报告
方案二
将显示译码管的低位端A接高电平,74LS160的输出端QA悬空,QB、QC、QD分别接入B、C、D,利用74LS160自身的十进制计数,就可实现奇数序列。
图7奇数显示(1)
分析
第二种方案的显示时间是第一种方案的两倍,在进行自然数显示到奇数
列显示的时间周期就不相等了。所以选择方案一。
3.4
74hc139功能
2线—4线译码器,M74HC139/74HC139用于高性能的存贮译码或要求传输延迟时间短的数据传输系统,在高性能存贮器系统中,用这种译码器可以提高译码系统的效率。将快速赋能电路用于高速存贮器时,译码器的延迟时间和存贮器的赋能时间通常小于存贮器的典型存取时间,这就是说由系统译码器所引起的有效系统延迟可以忽略不计。HC139含有两个单独的2线—4线译码器,当赋能输入端G为高电平时,按二进制控制输入码从4个输出端中译出一个低电平输出。在解调器应用中,低电平有效的赋能输入端用作数据线。
真值表
INPUTS输入
OUTPUTS输出
SELECTED OUTPUT选定的输出
ENABLE启用
SELECT选择
Y0
Y1
Y2
Y3
G
B
A
H
X
X
H
H
H
H
NONE
L
L
L
L
H
H
H
Y0
L
L
H
L
H
H
Y1
L
H
L
H
H
L
H
Y2
L
H
H
H
H
H
L
Y3
输入信号来自74hc390当QA,QB为“0”,“0”时,这时译码器的输出端就只有Y0为0,接一个反相器然后再接产生自然序列的计数器的清零端;这样就可以实现只有自然序列输出的功能,同理当QA,QB为“0”,“1”时,这是译码器的输出端就只有Y1为0,接一个反相器然后再接产生奇数序列的计数器的清零端,这样就可以实现只有奇数序列输出的功能;当QA,QB为“1”,“0”时,这是译码器的输出端就只有Y2为0,接一个反相器然后再接产生偶数序列的计数器的清零端,这样就可以实现只有偶数序列输出的功能。
流水灯实验报告
流水灯实验报告单片机流水灯实验一、任务让8个LED灯轮流亮起来,实现流水灯的功能。
二、思路让接在P0.0口的LED灯亮起来,那么只要把P0.0口的电平变为低电平就可以了;相反,如果要接在P0.0口的LED灯熄灭,就要把P0.0口的电平变为高电平就可以了。
要实现流水灯功能,只要将8个LED灯依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。
我们应该注意一点,由于单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
三、步骤1、用proteus画电路图。
如下图:2、用keil建工程。
1) 运行keil C51软件,点击Project菜单新建项目,选择为AT89C52的单片机型号。
然后单击File选择New新建程序文件,保存成 .c 文件,右击Source Group1添加入程序文件。
2) 用C语言编写程序代码如下:#includevoid delay (unsigned char tmp);code unsigned char tmpled[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void main(void) {unsigned char i; while (1) {for(i=0;i<8;i++) { P0=tmpled[i]; delay(50); } } }void delay(unsigned char tmp) {unsigned char i,j; i=tmp; while(i) { i--; j=255; { j--; } } }3) 右击Target 1打开设置,Output菜单下勾选上create hex file。
4) 调试运行程序后,在proteus中双击单片机,添加hex文件,运行看到流水的的效果。
四、实验中遇到的问题。
1、用proteus仿真时候,发现错误:error variable not found parsing property resistance of RN1-Rnvalue expected for RN1-R(n=1~8)而且led灯亮度十分微弱。
实现8个LED流水灯汇编语言程
START: MOV ACC,#0FEH ;ACC 中先装入LED1 亮的数据(二进制的11111110 )MOV P1,ACC ;将ACC 的数据送P1 口MOV R0,#7 ;将数据再移动7 次就完成一个8 位流水过程LOOP: RL A ;将ACC 中的数据左移一位MOV P1,A ;把ACC 移动过的数据送p1 口显示ACALL DELAY ;调用延时子程序DJNZ R0,LOOP ;没有移动够7 次继续移动AJMP START ;移动完7 次后跳到开始重来,以达到循环流动效果延时子程序DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束START: CLR P1.0 ;P1.0 输出低电平,使LED1 点亮ACALL DELAY ;调用延时子程序SETB P1.0 ;P1.0 输出高电平,使LED1 熄灭CLR P1.1 ;P1.1 输出低电平,使LED2 点亮ACALL DELAY ;调用延时子程序SETB P1.1 ;P1.1 输出高电平,使LED2 熄灭CLR P1.2 ;P1.2 输出低电平,使LED3 点亮ACALL DELAY ;调用延时子程序SETB P1.2 ;P1.2 输出高电平,使LED3 熄灭CLR P1.3 ;P1.3 输出低电平,使LED4 点亮ACALL DELAY ;调用延时子程序SETB P1.3 ;P1.3 输出高电平,使LED4 熄灭CLR P1.4 ;P1.4 输出低电平,使LED5 点亮ACALL DELAY ;调用延时子程序SETB P1.4 ;P1.4 输出高电平,使LED5 熄灭CLR P1.5 ;P1.5 输出低电平,使LED6 点亮ACALL DELAY ;调用延时子程序SETB P1.5 ;P1.5 输出高电平,使LED6 熄灭CLR P1.6 ;P1.6 输出低电平,使LED7 点亮ACALL DELAY ;调用延时子程序SETB P1.6 ;P1.6 输出高电平,使LED7 熄灭CLR P1.7 ;P1.7 输出低电平,使LED8 点亮ACALL DELAY ;调用延时子程序SETB P1.7 ;P1.7 输出高电平,使LED8 熄灭ACALL DELAY ;调用延时子程序AJMP START ;8 个LED 流了一遍后返回到标号START 处再循环延时子程序DELAY: MOV R0,#255 ;延时一段时间D1: MOV R1,#255DJNZ R1,$DJNZ R0,D1RET ;子程序返回END ;程序结束ORG 0000H ; 上电复位,程序从 0000H 开始执行END ;程序结束START: MOVSP,#60HMOVDPTR,#LIU_TAB LOOP:CLR AMOVC A,@A+DPTRCJNEA,#0FFH,SHOWAJMPSTARTSHOW:MOV P1,A ACALL DELAYINC DPTRAJMP LOOP延时子程序; 堆栈初始化为 60H;流水花样表首地址送 DPTR;检查流水结束标志;所有花样流完 ,则从头开始重复流;将数据送到 P1 口DELAY: MOV R0,#255;延时一段时间D1:MOV R1,#255DJNZ R1,$DJNZR0,D1RET;子程序返回; ---- 下面是流水花样数据表 -----LIU_TAB:DB 01111111B ;二进制表示的流水花样数据DB 10111111B DB 11011111B DB 11101111B DB 11110111B DB 11111011B DB 11111101B DB 11111110B DB 11111110B DB 11111101B DB 11111011B DB 11110111B DB 11101111B DB 11011111B DB 10111111B DB 01111111BDB 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH ; 十六进制表示 DB 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH DB 7EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,7EH DB 7FH,3FH,1FH,0FH,07H,03H,01H,00H DB 0FFH;流水花样结束标志 0FFH延时子程序,12M 晶振延时约250 毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETorg 00h ;程序上电从00h 开始ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A 赋值成11111110loop:mov p1,a ;将A 送到P1 口,发光二极管低电平点亮lcall delay ; 调用延时子程序rl a ; 累加器A 循环左移一位ajmp loop ; 重新送P1 显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250 次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1 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丄3 ------------- 执行2个机器周期,反复执行2次(1+1+502+126250+2)*2=253512微秒)RETdelay 加上第一条总共延时1+253512=253513微秒。
单片机流水灯c语言实现
//------------------------------------------------
#include <reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE []=
red_a=1;yellow_a=1;green_a=0;
red_b=0;yellow_b=1;green_b=1;
delayMs(2000);
Operation_Type=2;
break;
case 2://东西向黄灯开始闪烁,绿灯关闭
delayMs(300);
yellow_a=!yellow_a; green_a=1;
while(x--)
{
for(i=0;i<120;i++);
}
}
//---------------------------------------------
//交通灯切换子程序
void Traffic_Light()
{
switch (Operation_Type)
{
case 1://东西向绿灯亮与南北向红灯亮
{
uchar i;
P2=0x01;//P2端口初始化
while(1)//死循环
{
for(i=0;i<7;i++)//i自加1,当i=7时执行第二个for语句
{
P2=_crol_(P2,1);//P2端口循环左移1位
delayMs(150);
}
for(i=0;i<7;i++)
流水灯程序设计与调试.ppt
10
重点: 1、学习P1口既作为输入,又作为输出的使用方法。 2、学习数据输入、输出程序的设计方法。
11
二、任务分析
1、硬件分析
❖ P1口为准双向I/O接口,输出单条指令完成,输入时应当先 向对应的端口锁存器写入1,然后读入数据。
12
2、软件说明
➢ 有两个操作数,如MOV A,30H指令,操作数之间以逗号 相隔;
➢ 有3个操作数,如 CJNE A,#00H,10H指令。
❖ 注释:对指令的解释说明,用以提高程序的可读性,注释前 必须加分号,注释换行时行前也要加分号。
步骤4:现象无误,请求教师检查、评价。 步骤5:编制项目报告并提交。
18
➢分支程序的基本形式 分支程序有三种基本形式,如图2-1所示。 分支程序的设计要点如下:
❖先建立可供条件转移指令测试的条件。 ❖选用合适的条件转移指令。 ❖在转移的目的地址处设定标号。
19
条件满足? Y
A
(a)单分支
N
条件满足?
Single Chip Microcomputer
情
境
主要内容
1
➢流水灯程序设计与调试
彩
➢转弯灯程序设计与调试
灯
控
➢交通灯程序设计与调试
制
器
1
1.3.1 流水灯程序设计与调试
一、任务说明 1、要求 ❖ P1口作为输出口。P1.0至P1.7接8个发光二极管。要求编写
程序实现如下功能:8个发光二极管依次亮灭并循环,延时 0.1秒(已知fosc=12MHz)。 2、重点 1、学习P1口作为输出口的使用方法。 2、学习延时程序的设计方法。
ANL A,Rn ; A (A)∧Rn ANL A,@Ri ; A (A)∧(Ri) ANL A,#data ; A (A)∧#data ANL direct,A ;(direct) (direct)∧(A) ANL direct,#data ; (direct)(direct)∧#data 注意: 以上指令结果通常影响程序状态字寄存器PSW的P标志。 存储单元指定位清0的做法:按照需清0的位置填0,需保留的位置填1的原则构建 清0常数,然后利用ANL指令实现运算。 相近的指令:逻辑或指令ORL,逻辑异或指令XRL,清0指令CLR,取反指令CPL。 逻辑或可实现存储单元指定位置1,逻辑异或可实现存储单元指定位取反。
单片机-流水灯的程序
#include<reg51.h> sbit led1=P2^0; sbit led2=P2^1; sbit led3=P2^2; sbit led4=P2^3; sbit led5=P2^4; sbit led6=P2^5; sbit led7=P2^6; sbit led8=P2^7; void delay (unsigned char x);
其中void表示这 个函数执行完后 不返回任何数据。 ()内无任何东西, 所以这是个无参 数的函数。 Delayms是函数名。
1
2
3
4
5
6
2)带参数函数的用位定义实现流水灯(8位二极管循环点亮)
编程思路: a) 先点亮第一盏灯,延时点亮第二盏, 依次延时8盏灯全部点亮。 b) 当8盏灯全部点亮时,熄灭8盏灯。 c) 进入循环。
循环移动
循环左移 最高位移入最低位,其它依次向左移动一位。C语言中 没有专门的指令,通过移位指令和简单逻辑运算来实现循环左移,或直接利用C51库中自带的函数-crol-实现。
循环右移 最低位移入最高位,其它位依次向右移一位,C语言中没有专门的指令,通过移位指令与简单的逻辑运算可以实现循环右移,或专门利用C51库中自带函数-cror-实现
方法二:利用总线控制实现流水灯(8位二极管循环点亮)
相关知识 二进制和十六进制之间的相互转换
二进制
十六进制
二进制
十六进制
0000
0
0100
4
0001
1
0101
5
0010
2
0110
6
0011
3
0111
7
二进制
十六进制
二进制
FPGA入门系列实验教程——流水灯
FPGA入门系列实验教程——LED流水灯1.实验任务让实验板上的8个LED实现流水灯的功能。
通过这个实验,进一步掌握采用计数与判断的方式来实现分频的VHDL的编程方法以及移位运算符的使用。
2.实验环境硬件实验环境为艾米电子工作室型号EP2C8Q208C8增强版开发套件。
软件实验环境为Quartus II8.1开发软件。
3.实验原理流水灯,顾名思义就是让LED象水一样的点亮。
如果把流水做慢动作播放,可以想象到其实就是移动,即:把水块不断地向同一方向移动,而原来的水块保持不动,就形成了流水。
同样,如果使得最左边的灯先亮;然后,通过移位,在其右侧的灯,由左向右依次点亮,而已经亮的灯又不灭,便形成了向右的流水灯。
初始状态时,8个灯都不亮。
每来一个时钟脉冲CLK,计数器就加1。
每当判断出计数器中的数值达到25000000时,就会点亮一个灯,并进行移位。
FPGA输出的数据就应该首先是10000000,隔1秒钟变成11000000……一直变化到11111111,这样,依次点亮所有的灯,就形成了流水灯。
而当8个灯都点亮时,需要一个操作使得所有的灯恢复为初始状态,即:灯都不亮。
然后,再一次流水即可。
如果是右移位,就出现向右流水的现象;反之,向左流水。
4.实验程序library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity LED isport(clk:in std_logic;//设置时钟输入dout:out std_logic_vector(7downto0));//8位端口输出end LED;architecture behave of LED issignal p:std_logic_vector(31downto0);//信号变量signal t:std_logic_vector(8downto0);beginprocess(clk)beginif(clk'event and clk='1')then//判断上升沿信号p<=p+1;if(p=25000000)thent(8downto1)<=t(7downto0);//将低8位移至高8位t(0)<='1';//最地位置1p<="00000000000000000000000000000000";end if;if(t(8)='1')thent<="000000000";end if;end if;end process;dout<=t(7downto0);//将低8位赋给输出端口end behave;代码分析:先定义一个二进制32位的信号变量P和一个9位的信号变量t,时钟每产生一个上升沿的时钟跳变,P自动加1。
arduino 二进制灯泡
arduino 二进制灯泡全文共四篇示例,供读者参考第一篇示例:Arduino是一款开源电子平台,可以帮助用户快速、简单地进行物联网项目的开发。
通过Arduino的编程和连接性能,用户可以创造各种各样的电子设备,其中就包括二进制灯泡。
二进制灯泡是一种通过二进制编码来控制亮灭状态的灯泡。
在传统的电子设备中,我们通常通过电压的高低来控制设备的开关状态,而在二进制灯泡中,我们使用的是0和1这两个二进制状态来控制灯泡的亮灭。
这种简单的编码方式不仅能够减少硬件成本,还可以更加灵活地控制设备的状态。
在制作Arduino二进制灯泡之前,我们首先需要准备以下材料:1. Arduino开发板2. LED灯3. 面包板4. 连接线接下来,我们开始制作Arduino二进制灯泡。
将LED灯插入到面包板中,确保LED的正极和负极被正确连接。
然后,将Arduino开发板连接到电脑上,并打开Arduino IDE进行编程。
在Arduino IDE中,我们可以通过写入一个简单的程序来控制LED的亮灭状态。
以下是一个示例程序:```cppint ledPin = 13; // 定义LED连接的引脚void setup() {pinMode(ledPin, OUTPUT); // 将LED引脚设置为输出模式}void loop() {digitalWrite(ledPin, HIGH); // 将LED点亮delay(1000); // 延迟1秒digitalWrite(ledPin, LOW); // 将LED熄灭delay(1000); // 延迟1秒}```在上面的示例程序中,我们定义了一个LED连接的引脚为13,并在循环中控制LED每隔1秒亮灭一次。
通过这个简单的程序,我们就可以实现一个二进制灯泡的效果。
除了控制LED的亮灭状态,我们还可以通过改变LED的亮度、颜色等参数来实现更加丰富的效果。
通过Arduino的强大功能和丰富的库支持,我们可以实现各种各样的创意灯光效果,让二进制灯泡不再局限于简单的亮灭。
用单片机实现流水灯的控制设计
用单片机实现流水灯的控制设计1.引言当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被智能控制系统所取代。
单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
目前,一个学习与应用单片机的高潮正在工厂、学校及企事业单位大规模地兴起。
学习单片机的最有效方法就是理论与实践并重,本设计课题是流水灯的控制设计,流水灯是一串按一定的规律像流水一样连续闪亮。
流水灯控制是可编程控制器的一个应用,其控制思想在工业控制技术领域也同样适用。
2.硬件组成2.1 总体方案设计分析要求用8255的A口和B口做为输出,接16个发光二极管,从而实现16位流水灯的显示效果,基本的界限可如下图A所示,在C口的地两位接两个开关,实现两个扩展功能的控制。
i:基本流水灯显示电路A口和B口两个端口不能同时复制,从而在试验中可以用BX进行需要复制的数据的存储,因为BX可以分从BH BL两个部分进行独立的操作,在本次试验中用BH对A口进行赋值,用BL对B口进行赋值,通过演示一段时间再对BH BL 进行移位和输出,实现流水灯的效果。
ii:正反方向选择把PC.0口接在开关上,编写程序对C端口的数据进行读取,并进行判断,使得当PC.0为高电平的时候则灯进行左移,同时B口与A口相反。
iii:快慢速度控制把PC.1口接在开关上,编写程序对C端口的数据进行读取,并进行判断,使得当PC.1为高电平的时候则延时的时间缩短,使得流水灯的流水速度加快,低电平的时候则进行延时的时间变长,使得流水灯的流水速度加快。
3硬件原理设计A该模块的WR.RD分别练到PC总线接口模块的XIOW和XIORB该模块的数据(AD0~AD7)、地址线(A0~A7)分别连到PC总线接口模块的数据(D0~D7)、地址线(A0~A7)C 8255模块选通线CA连到PC总线接口模块的IOY3D 8255的PA0~PA7连到发光二极管的L1~L8;8255的PB0~PB7连到发光二极管的L9~L16E 8255的PC0 PC1分别练到开关K0 K1F 软件流程框图及程序清单按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。
Mixly开源项目设计27:移位寄存器(二)——8位二进制计数器和流水灯
技术与应用tougao1@77OCT 2018 NO.19Mixly开源项目设计27:移位寄存器(二)——8位二进制计数器和流水灯隋杰峰 山东省威海市乳山市畅园学校信息技术实验上一期,我们介绍了通过74HC595移位寄存器只用UNO 的3个管脚就可以控制8个LED的亮灭。
本期,我们将进一步介绍74HC595的一些应用,将分别做一个8位二进制计数器和一个流水灯项目。
在元件的使用和电路的连接上,依然沿用上一期的元件和电路。
● 需要的元件(如表1)● 电路连接(如图1)● 程序设计1.8位二进制计数器上一期的文章介绍了在shiftOut模块中输入数值,控制8个LED亮灭的过程,实际上,就是将十进制的数值转换为8位二进制,依次送入移位寄存器,明白了这个过程,就可以设计一个程序,来展现二进制进位了,程序如图2所示。
我们来解释一下这个程序:首先声明一个变量i为整数,并赋值为0;然后是一个for循环模块,让i 依次(步长为1)取从0到255的值,即第一次取值0,第二次取值1,第三次取值2……第256次取值255;接着就是我们熟悉的模块,在上一期,我们用它来控制了8个LED 的亮灭;最后延时200毫秒,作用是让每一次输入数值后,LED亮灭的状态保持200毫秒。
上传程序后,我们就可以看到L E D从全灭到全亮的过程,LED从右往左开始被点亮,它们每200毫秒变化一下,相当于从二进制00000000每次加1,一直加到11111111,再重新开始,如此重复表1图1 电路图图2 程序4(8位二进制计数器程序)技术与应用tougao1@78中国信息技术教育本案例的分享视频将会在以下公众号中陆续登载。
执行。
2.流水灯如果要设计一个流水灯,只需要将下面的二进制数一个个输入即可,为了方便,我们可以将它们转换成十进制或者十六进制放到数组里(如表2)。
以十进制为例,流水灯程序如图3所示。
上面的程序采用了数组,依次取出数组mylist中的8个数值,转换为二进制输入移位寄存器,就实现了流水灯的效果。
arduino 二进制灯泡
arduino 二进制灯泡全文共四篇示例,供读者参考第一篇示例:Arduino是一块开源的微控制器,它可以帮助我们完成各种有趣的项目。
今天我们要介绍的是Arduino上的一个小实验——二进制灯泡。
二进制是一种计算机和数字电子技术中使用的数制方式。
在二进制中,每个位置上的数字只能是0或1,它非常适合于数字逻辑的处理和数据传输。
在这个实验中,我们将利用Arduino来模拟一个简单的二进制灯泡。
我们需要准备以下材料:1. Arduino Uno开发板2. 面包板3. 面包板连接线4. LED灯5. 220欧姆电阻6. USB数据线7. 电脑接下来,我们将按照以下步骤进行搭建和编程:1. 将Arduino Uno开发板连接到电脑上,并打开Arduino IDE编程软件。
2. 将LED灯插入面包板上,并通过面包板连接线将LED的长腿连接到Arduino的数字引脚13上,短腿连接到220欧姆电阻上,再将电阻的另一端连接到Arduino的GND引脚上。
3. 在Arduino IDE中编写以下代码:```cppvoid setup() {pinMode(13, OUTPUT);}void loop() {// 从0到15循环显示二进制数for(int i=0; i<16; i++) {displayBinary(i);delay(1000);}}4. 将代码上传到Arduino开发板上,并观察LED灯的变化。
在循环中,我们依次显示0到15的二进制数。
通过这个实验,我们可以看到LED灯的亮灭模式依次变化,每次亮起的灯泡代表一个二进制位,从而展示出0到15的二进制数。
这个实验不仅可以帮助我们更好地理解二进制数的构成方式,还能让我们更深入地了解数字电子技术的原理。
通过Arduino上的二进制灯泡实验,我们不仅可以提升自己的动手能力和编程能力,还可以在玩耍中学习,达到事半功倍的效果。
希望大家能够尝试这个有趣的项目,享受DIY的乐趣!第二篇示例:Arduino是一种开源电子原型平台,以简化硬件开发和交互设计。
maxplus2 cpld vhdl 流水灯的设计 十进制加法计数器的设计 奇偶校验电路的
实验六流水灯的设计(文本输入方式)[实验目的]1.学习设计一个流水灯程序,并在实验板上验证;2.学习使用VHDL语言进行逻辑设计输入;3.学习设计仿真工具的使用方法;[实验说明]该流水灯除了输入有:时钟端、使能端和清零端,输出为8个led指示灯。
清零端为低电平时回到最初始状态,输出为O1灯亮,为高电平时无作用;使能端低电平时流水灯停止,高电平时流水灯继续流动;时钟端为系统时钟输入,要求8个led指示灯每秒变化一次,向右流动,变化顺序依次为O1灯亮→O2灯亮→O3灯亮→ O4灯亮→ O5灯亮→ O6灯亮→ O7灯亮→返回O1。
电路逻辑功能实现后,可将该逻辑功能下载到CPLD中。
注意选择:清零端选1脚,使能端选拨码开关,时钟端选83脚、输出线8根(接发光二极管指示[实验要求]1用VHDL语言实现流水灯2设计仿真文件,进行软件验证3通过下载线下载到实验板上进行验证4若初始状态为O8灯亮,流水灯向左流动,试重新设计并下载验证[实验报告要求]1写出VHDL编程语言源文件2给出软件仿真和硬件测试结果3通过下载线下载到实验板上进行验证4写出学习总结参考程序见下页:library ieee;use ieee.std_logic_1164.all;entity liushuideng isport(ena,clk_in,clr: in std_logic;y: out std_logic_vector(7 downto 0));end liushuideng;architecture a of liushuideng issignal clk: std_logic;beginclock:process(clk_in) --输入的时钟为4Mvariable clock_buffer:std_logic; ----定义一个标准逻辑变量clock_buffervariable count_time:integer range 0 to 1999999; ---定义一个整型变量count_time beginif clk_in'event and clk_in='1' thenif count_time=1999999 thencount_time:=0;clock_buffer:=not clock_buffer; --每计2M次数时翻转一次elsecount_time:=count_time+1;end if;end if;clk<=clock_buffer; --输出的时钟为1HZend process;process(clr,clk,ena)variable q: std_logic_vector(7 downto 0); ----定义一个标准逻辑矢量的变量qbeginif(clr='0')thenq:="11111110"; ----按下清零键让它回到O1灯亮elseif clk'event and clk='1' then ---时钟的上升沿if ena='1' then ---ena为高开始移位,ena为低停止移位q:=q(6 downto 0)&q(7); --向右移动移位end if;end if;end if;y<=q;end process;end a;实验七十进制加法计数器的设计(文本输入方式)[实验目的]1.学习设计一个十进制加法计数器程序,并在实验板上验证;2.熟练掌握VHDL语言进行逻辑设计输入;3.学习设计仿真工具的使用方法;[实验说明]该计数器输入有:时钟端、使能端和清零端,输出为1个数码管。
数电大作业流水灯
综合设计题一.流水灯1.总体思路8位流水灯始终是一亮七暗的,根据这个特点可以考虑采用74LS138译码器的输出来实现流水灯的循环电路。
同时,还可以用74LS161四位二进制计数器来控制74LS138的输入端,从而实现对灯亮灭的控制2.使用元件3—8译码器74LS138,四位二进制计数器74LS161,555定时器,七段数码管译码器驱动器4511芯片,数码管,电容,电阻,非门若干。
3.电路原理框图4.元器件在本电路中的主要功能○1555定时器555 定时器在本电路中的作用主要是产生占空比可调的矩形脉冲从而可以改变灯亮时间,而且它的振荡周期为T=0.7(R1+2R2)C。
此处C=0.1uF.由电路参数可知,当R1为10kΩ时,灯亮时间为0.0014s.它的功能主要由两个比较器决定。
两个比较器的输出电压控制RS 触发器和放电管的状态。
在电源与地之间加上电压,当 5 脚悬空时,则电压比较器 C的同相1的反相输入端的电输入端的电压为 2VCC /3,C2压为VCC /3。
若触发输入端 TR 的电压小于VCC /3,的输出为 0,可使 RS 触发器置 1,使输出端 OUT=1。
如果阈则比较器 C2的值输入端 TH 的电压大于 2VCC/3,同时 TR 端的电压大于VCC /3,则 C1的输出为 1,可将 RS 触发器置 0,使输出为 0 电平。
电路输出为 0,C2图如下:○2 74LS161计数器74LS161计数器在本电路中的作用是产生000-111脉冲控制74LS138的A2A1A,依次选通Y-Y7。
产生脉冲序列也可以用74LS191是四位二进制同步加/减计数器,与74LS161相比,它能够实现减计数,此处只需要求产生脉冲序列,而且74LS161是常用的计数器,所以选择74LS161产生脉冲序列。
所以采用反馈置数法,产生000-111脉冲序号,时钟脉冲外部接入,原理图如下图所示○374LS138译码器74LS138译码器在本电路中的作用主要是选通指示灯发光。