流水灯实验
黄博杰 电信3班 222012315220103
一、实验目的
1、熟悉QuartusⅡ的软件的操作;
2、编写流水灯程序,基本掌握时序逻辑电路的编写方法
二、实验原理
所谓流水灯就是让LED灯的亮灭模拟流水,按照顺序使LED灯依次亮,本实验箱上共16个LED,通过程序控制顺序使LED1到LED16亮,从而实现流水灯。
三、实验步骤
1、程序
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
entity led_16 is
port ( clk : in std_logic;
dout : out std_logic_vector(15 downto 0) );
end led_16;
architecture hav of led_16 is
signal q:std_logic_vector(15 downto 0);
signal d:std_logic_vector(3 downto 0);
begin
process(clk)
begin
if clk'event and clk='1' then
d<=d+1;
end if;
end process;
with d select
q<="1000000000000000" when "0000",
"0100000000000000" when "0001",
"0010000000000000" when "0010",
"0001000000000000" when "0011",
"0000100000000000" when "0100",
"0000010000000000" when "0101",
"0000001000000000" when "0110",
"0000000100000000" when "0111",
"0000000010000000" when "1000",
"0000000001000000" when "1001",
"0000000000100000" when "1010",
"0000000000010000" when "1011",
"0000000000001000" when "1100",
"0000000000000100" when "1101",
"0000000000000010" when "1110",
"0000000000000001" when others;
dout<=q;
end hav;
2、RTL图
3、功能仿真图
4、时序仿真图
5、引脚分配
四、实验总结
(1)本实验是以数字电路为基础的实验课,因此数字电路理论知识必须要扎实;
(2)本实验需要耐心和细心,特别是在编写程序时,输入法应为英文输入,还有便是文件名要尽量一致,否则在编译时会报错;
(3)实验程序不同所产生的原理图与直接绘制的原理图有时会不同,但是仿真结果却是一样的,其原因是化简表达式有可能不是最简表达式。
第二篇:实验2、流水灯控制实验
实验2、数码管显示实验
【实验目的】
1、 学习LPC系列处理器GPIO口的使用方法;
2、 学习用Keil软件开发ARM程序方法和步骤。
3、 学习7SEG数码管的驱动原理。
4、 学习74HC595驱动数码管的编程方法。
【实验要求】
1、 了解LPC系列处理器GPIO口的功能原理;
2、 在Keil中设计ARM程序,实现对7SEG数码管的控制,和利用74HC595对数码管驱动的驱动程序的编写;
3、 附加要求:请在数码管显示数组里面实现0——F循环显示(程序一)
【实验原理】
1、LPC系列处理器GPIO口的原理
PINSEL(x) 管脚功能选择寄存器
IOPIN(x) GPIO引脚值寄存器
IOSET(x) GPIO输出置位寄存器
IODIR(x) GPIO方向控制寄存器
IOCLR(x) GPIO输出清零寄存器
2、实验电路原理图
实验电路的连接如下图,LED1和LED2是利用74HC595进行驱动显示[74HC595的三个控制信号SDI(数据输入)、SCLK(时钟控制)、LOAD(数据显示)分别接到p0.27---p0.29],LED8 COMMON AONDE用GPIO口的P1.18到P1.25来控制的。输出低电平则LED点亮,输出高电平则LED熄灭。
本次实验的实质原理同第一次试验,对数码管的驱动实际上也是对LED的驱动,因为数码管的各个段也是一个LED灯,所以大家只要明白了哪个管脚对应于哪个LED,就可以实现用数码管显示不同的数字。
4、 程序代码
(1)
#include<lpc23xx.h>
#define led (0xff<<18)//指定P1.18到P1.25
typedef unsigned int uint8;
typedef unsigned long uint16;
const uint8 DISP_TAB[3]={0xdb,0x12,0xe3};//数码管显示数组
void Delay(uint16 t) //延时函数
{
while(t--);
}
int main()
{
uint8 i;
IODIR1=(0xff<<18); //设置P1.18到P1.25为输出
while(1)
{
for(i=0;i<3;i++)
{
IOSET1=led; //先输出高电平使数码管各段全部熄灭
IOCLR1=(DISP_TAB[i]<<18); //输出显示内容
Delay(10000000); //延时输出
}
}
}
(2)
/*本实验的重点在对74HC595的驱动(show_seg_char()函数功能),其余的同上一个程序,观察显示,上网查找74HC595和74LS595的资料,分析显示结果*/
#include<lpc23xx.h>
#define SDI_SEG 1<<27 //指定p0.27
#define SCLK_SEG 1<<28 //指定p0.28
#define LOAD_SEG 1<<29 //指定p0.29
typedef unsigned int uint8;
typedef unsigned long uint32;
typedef unsigned char uchar;
void Delay(uint32 t) //延时函数
{
while(t--);
}
void init_seg(void) //初始化连接数码管的端口
{
PINSEL1 =PINSEL1&0x003fffff; //选择GPIO 功能
IODIR0 |=0x0f<<27; // 端口为输出
}
void show_seg_char(uchar data) //显示一位数字
{
uchar i;
IOCLR0=LOAD_SEG; //锁存数,可从寄存器通过 ,可输入74HC595内的寄存器
IOCLR0=SCLK_SEG; //上升沿采样
for(i=0;i<8;i++)
{
if((data&0x80)==0x80) //先发高位
IOSET0=SDI_SEG;
else
IOCLR0=SDI_SEG;
IOSET0=SCLK_SEG; //上升沿
data=data<<1;
IOCLR0=SCLK_SEG;
}
IOSET0=LOAD_SEG; //显示数据
}
int main()
{
uchar tab[18]={0x24,0x6f,0x38,0x2a,0x63,0xa2,0xa0,0x2f,0x20,0x23,0x21,0xe0,
0xb4,0x68,0xb0,0xb1,0xff,'\0'}; // 最后一个数据0xff为全灭
uint8 i;
init_seg();
while(1)
{
for(i=0;i<18;i++)
{
show_seg_char(tab[i]);
Delay(10000000);
}
}
}
附(来自网上):
74HC595 数码管驱动
74HC595使用总结
74HC595外形图
QB --|1 16|--Vcc
QC --|2 15|--QA
QD --|3 14|--SI
QE --|4 13|--/G
QF --|5 12|--RCK
QG --|6 11|--SCK
QH --|7 10|--/SCLR
GND-|8 9|--QH'
74595的数据端:
QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
QH': 级联输出端。我将它接下一个595的SI端。
SI: 串行数据输入端。
74595的控制端说明:
/SCLR(10脚): 低点平时将移位寄存器的数据清零。通常我将它接Vcc。
SCK(11脚):上升沿时数据寄存器的数据移位。QA-->QB-->QC-->...-->QH;下降沿移位寄存器数据不变。(脉冲宽度:5V时,大于几十纳秒就行了。我通常都选微秒级)
RCK(12脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄存器数据不变。通常我将RCK置为低点平,当移位结束后,在RCK端产生一个正脉冲(5V时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
/G(13脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。
//这个引脚不管是否用到,都要给他下拉。否则显示会不稳定,万一上拉,将没有任何显示。
注:74164和74595功能相仿,都是8位串行输入转并行输出移位寄存器。74164的驱动电流(25mA)比74595(35mA)的要小,14脚封装,体积也小一些。
74595的主要优点是具有数据存储寄存器,在移位的过程中,输出端的数据可以保持不变。这在串行速度慢的场合很有用处,数码管没有闪烁感。
与164只有数据清零端相比,595还多有输出端时能/禁止控制端,可以使输出为高阻态