流水灯实验
1.引言
当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。
学习单片机的最有效方法就是理论与实践并重,现在我把单片机流水灯设计作为一个毕业课程设计,需要更深的去了解单片机的很多功能,努力的去查找资料,当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未见的速度被单片机智能控制系统所取代。单片机具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。2.任务描述及设计方案
2.1任务描述
设计流水灯控制电路,使连接在该电路上的8个发光二极管按顺序以次闪烁。
2.2设计方案
实现此功能有两种方案,一种是使用传统的模拟电路,另一种是用单片机控制的电路。我们选择单片机控制系统。其中系统工作原理为:
在上个程序中我们是逐个控制P1端口的每个位来实现的,因此程序显得有点复杂,下面我们利用循环移位指令,采用循环程序结构进行编程。我们在程序一开始就给P1口送一个数,这个数本身就让P1.0先低,其他位为高,然后延时一段时间,再让这个数据向高位移动,然后再输出至P1口,这样就实现“流水” 效果啦。由于8051系列单片机的指令中只有对累加器ACC中数据左移或右移的指令,因此实际编程中我们应把需移动的数据先放到ACC中,让其移动,然后将ACC移动后的数据再转送到P1口,这样就可以实现“流水”效果。
3.硬件设计方案
3.1 设计思路
如果要让接在P1.0口的LED1亮起来,那么只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭的方法同LED1。因此,要实现流水灯功能,我们只要将发光二极管LED1~LED8依次点亮、熄灭,8只LED灯便会一亮一暗的做流水灯了。在此我们还应注意一点,由于人眼的视觉暂留效应以及单片机执行每条指令的时间很短,我们在控制二极管亮灭的时候应该延时一段时间,否则我们就看不到“流水”效果了。
3.2交通灯控制系统电路原理图
图 3-1 流水灯系统工作原理图
3.3 主要元件功能说明
按照单片机系统扩展与系统配置状况,单片机应用系统可分为最小系统、最小功耗系统及典型系统等。AT89C51单片机是美国ATMEL公司生产的低电压、高性能CMOS 8位单片机,具有丰富的内部资源:4kB闪存、128BRAM、32根I/O口线、2个16位定时/计数器、5个向量两级中断结构、2个全双工的串行口,具有4.25~5.50V的电压工作范围和0~24MHz工作频率,使用AT89C51单片机时无须外扩存储器。因此,本流水灯实际上就是一个带有八个发光二极管的单片机最小应用系统,即为由发光二极管、晶振、复位、电源等电路和必要的硬件组成的单个单片机。其具体硬件组成如图3-1所示。
4.1 程序流程图
图 4-1 主程序流程图
4.2 程序清单
ORG 0000H
JMP MAIN
ORG 0100H
MAIN: MOV A,#01111111B
LOOP1: MOV P1,A
CALL DELAY
RR A
JMP LOOP1
DELAY: MOV R2,#10
MOV R0,#200
DL3: NOP
DL1: MOV R1,#250
DL2: DJNZ R1,DL2
DJNZ R0,DL1
DJNZ R2,DL3
RET
END
4.3 proteus软件仿真
在proteus软件仿真之前必须在Proteus里面画出硬件的外部接线图,接下来装入程序,然后组建生成HEX文件,接下来就可以运行仿真了,如图4-3。
图4-3 仿真图
5. 设计总结
通过这次课程设计,我拓宽了知识面,锻炼了能力,综合素质得到较大提高。而安排课程设计的基本目的,是在于通过理论与实际的结合、人与人的沟通,进一步提高思想觉悟和领悟力。尤其是观察、分析和解决问题的实际工作能力。它的一个重要功能,在于运用学习成果,检验学习成果。运用学习成果,把课堂上学到的系统化的理论知识,尝试性地应用于实际设计工作,并从理论的高度对设计工作的现代化提出一些有针对性的建议和设想。检验学习成果,看一看课堂学习与实际工作到底有多大距离,并通过综合分析,找出学习中存在的不足,以便为完善学习计划,改变学习内容与方法提供实践依据。实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。这也是一次预演和准备毕业设计工作。通过课程设计,让我们找出自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,为求职与正式工作做好充分的知识、能力准备,从而缩短从校园走向社会的心理转型期。课程设计促进了我系人才培养计划的完善和课程设置的调整。课程设计之后,我们普遍感到不仅实际动手说,这应该是个警示,在剩下的大学生活里,我应该好好珍惜,好好学习各方面的知识。在单片机方面也是了解了一些些,我相信这次课程设计会对我以后的工作通过这次单片机课程设计,我不仅加深了对单片机理论的理解,将理论很好地应用到实际当中去,而且我还学会了如何去培养我们的创新精神,从而不断地战胜自己,超越自己。创新可以是在原有的基础上进行改进,使之功能不断完善,成为自己的东西。
第二篇:实验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还多有输出端时能/禁止控制端,可以使输出为高阻态