开关控制流水灯实验报告 源程序

合集下载

单片机流水灯实验报告

单片机流水灯实验报告

单片机流水灯实验报告单片机流水灯实验报告引言:单片机是一种集成电路,具有微处理器、存储器和输入输出设备等功能,被广泛应用于各个领域。

流水灯是一种常见的实验项目,通过控制单片机的输出端口,使多个LED灯依次亮起,形成流动的效果。

本实验旨在通过搭建流水灯电路,了解单片机的基本原理和操作方法。

实验目的:1. 掌握单片机的基本工作原理;2. 学习使用单片机控制LED灯的亮灭;3. 熟悉流水灯电路的搭建和控制。

实验器材:1. 单片机开发板;2. LED灯若干;3. 连线电缆。

实验步骤:1. 将单片机开发板连接至电源,并接通电源开关;2. 将LED灯连接至单片机的输出端口,确保极性正确;3. 打开单片机开发板上的编程软件,编写流水灯控制程序;4. 将编写好的程序下载至单片机开发板;5. 按下开发板上的复位按钮,观察LED灯是否依次亮起。

实验结果:经过实验,我们成功搭建了单片机流水灯电路,并通过编写程序实现了流水灯的效果。

当按下复位按钮后,第一个LED灯亮起,随后依次是第二个、第三个……最后一个LED灯亮起,然后再从第一个开始循环。

整个过程形成了一个流动的效果。

实验分析:通过本次实验,我们深入了解了单片机的基本工作原理。

单片机通过控制输出端口的电平状态,来控制外部设备的亮灭。

在流水灯实验中,我们通过改变输出端口的状态,实现了LED灯的顺序亮灭。

同时,本次实验也让我们学会了使用单片机开发板上的编程软件。

通过编写程序,我们可以灵活控制单片机的输出端口,实现各种不同的功能。

在流水灯实验中,我们编写的程序控制了LED灯的亮灭顺序,形成了流动的效果。

实验总结:通过本次实验,我们不仅了解了单片机的基本原理和操作方法,还掌握了流水灯电路的搭建和控制。

单片机作为一种重要的集成电路,在各个领域都有广泛的应用。

通过学习和实践,我们可以进一步探索单片机的更多功能和应用。

在今后的学习和工作中,我们可以运用单片机的知识,设计和实现更加复杂和有趣的项目。

流水灯实验报告

流水灯实验报告

流水灯实验报告实验目的,通过搭建流水灯电路,了解流水灯的工作原理,并掌握基本的电路连接方法和元器件的使用。

实验仪器与设备,LED灯、电阻、导线、面包板、电源等。

实验原理,流水灯是一种常见的LED灯效应,通过控制LED灯的亮灭顺序,形成灯光流动的效果。

在电路连接方面,我们需要使用电阻来限制LED灯的电流,以保护LED灯不受损坏。

实验步骤:1. 将LED灯和电阻连接到面包板上,按照电路图连接好各个元器件。

2. 将面包板连接到电源上,注意接线的正确性和稳定性。

3. 打开电源,观察LED灯的亮灭顺序,确认流水灯效果是否正常。

实验结果与分析:经过实验,我们成功搭建了流水灯电路,并且观察到LED灯按照一定的顺序亮灭,形成了流水灯的效果。

这说明电路连接正确,元器件工作正常。

在实验过程中,我们发现电阻的作用是非常重要的,它可以限制LED灯的电流,防止LED灯受损。

同时,电源的稳定性也对流水灯的效果有着重要的影响,稳定的电源可以保证LED灯的正常工作。

实验总结:通过本次实验,我们对流水灯的工作原理有了更深入的了解,也掌握了搭建流水灯电路的基本方法。

在今后的学习和实践中,我们可以运用这些知识,进行更多有趣的电路搭建和实验。

实验中还需要注意安全问题,避免短路和触电等意外情况的发生。

在实验过程中,要严格按照操作规程进行,确保实验的顺利进行。

最后,希望通过这次实验,大家能够对电路连接和LED灯效应有更深入的理解,为今后的学习和科研打下坚实的基础。

结语,本次实验结束,谢谢大家的参与和配合,希望大家能够从中收获知识,不断提高自己的实验能力和动手能力。

实验二流水灯报告

实验二流水灯报告

一、任务分析1、了解 CPU 对 I/O 口的操作方法。

2、学会使用 51 系列单片机 I/O 口的基本输入、输出功能。

3、连接实验系统上的单片机 I/O 口、开关及 LED 灯,设计一个简易流水彩灯。

拨动开关 K1、K0 分别实现 4 种不同的流水彩灯工作方式:二、设计思路1、先对P3.0和P3.1口置1;2、将P3.0和P3.1的值读入寄存器A中;3、判断P3.0和P3.1口的值,由于两个按键有四种组合方式,所以P3.0和P3.1的值分别为00、01、10、11;通过JB跳转程序来判断哪个按键按下;按键按下的不同分别跳转到不同的子函数中;4、通过P3.0和P3.1的值分别跳转到设置P1口工作状态的四个子程序中;5、四个子程序中分别是LED灯闪烁的四种方式,用SETB P1.X 的方式来让LED灯点亮,还应写有Delay函数,Delay函数中设置延时为0.5ms;用CLR的方式来让LED灯灭。

若要让LED全亮或全灭,则对P1口整体赋值。

三、程序流程图图一程序流程图四、实验程序ORG 0030Hmain:SETB P3.0SETB P3.1;未按下按键MOV A, P3ANL A ,#03HMOV R0, #7;MOV R1 ,#7;MOV R2, #7Delay:MOV R6, #1000LP2:MOV R7,#500LP:DJNZ R7,LPDJNZ R6, LP2;延时程序CJNE A,#00H,Moshi1;不等跳到Moshi1,相等则顺序往下执行Moshi0Moshi0:MOV A,#80H ;10000000Next:RR A ;左循环MOV P1,A ;00000001ACALL DelayDJNZ R0,Next ;循环七次Next0:RL AMOV P1,AACALL DelayMOV R0, #7DJNZ R0, Next ;循环七次MOV A, P3 ;A的值改变了要赋值回来,判断语句ANL A ,#03HCJNE A,#01H,Moshi2 ;相等才往下执行,Moshi1:CJNE A,#01H,Moshi2 ; 相等则顺序往下执行MOV A,#01H ;0000 0001MOV P1,#01HNext1:RL A ;0000 0010ORL A,P1 ;或:0000 0011MOV P1,A ;A和P1与完之后结果放到P1里面MOV R0,#07HDJNZ R0, Next1 ;循环七次MOV P1 ,#00HMOV A, P3 ;A的值改变了要赋值回来,判断语句ANL A ,#03HCJNE A,#10H,Moshi1 ;相等才往下执行,Moshi2:MOV P1, 0FFHACALL DelayACALL DelayMOV P1, 0FEH ;11111110ACALL DelayMOV A,P1 ;A 11111110Next2:RL A ; A 11111101ANL A,P1 ;A 11111100MOV P1,ADJNZ R0,Next2 ;循环操作 A 11111100左移后11111001&P1:11111100=11111000;循环9次以后应该需要再判断一次状态。

综合实验一——按键控制流水灯实验(查询方式)

综合实验一——按键控制流水灯实验(查询方式)

北京科技大学微型计算机原理实验报告学院:____自动化学院________________专业、年级:_自动化1101_ ______________ 姓名:__廖文骏_ ________________学号:_ 20111002124 ____________ 指导教师:___ _____王粉花____________2013年12 月综合实验一按键控制流水灯实验(查询方式)实验学时:2学时一、实验目的1.掌握ATmega16 I/O口操作相关寄存器2.掌握CodeVision AVR软件的使用3. 复习C语言,总结单片机C语言的特点二、实验内容1. 设计一个简单控制程序,功能是8个LED逐一循环发光0.5s,构成“流水灯”。

2. 用两个按键K1和K2控制流水灯(中断方式):(1)当按下K1时,流水灯从左向右流动;(2)当按下K2时,流水灯从右向左流动。

三、实验所用仪表及设备硬件:PC机一台、AVR_StudyV1.1实验板软件:CodeVision AVR集成开发软件、SLISP下载软件四、实验原理ATmega16芯片有PORTA、PORTB、PORTC、PORTD(简称PA、PB、PC、PD)4组8位,共32路通用I/O接口,分别对应于芯片上32根I/O引脚。

所有这些I/O口都是双(有的为3)功能复用的。

其中第一功能均作为数字通用I/O接口使用,而复用功能则分别用于中断、时钟/计数器、USRAT、I2C和SPI串行通信、模拟比较、捕捉等应用。

这些I/O口同外围电路的有机组合,构成各式各样的单片机嵌入式系统的前向、后向通道接口,人机交互接口和数据通信接口,形成和实现了千变万化的应用。

每组I/O口配备三个8位寄存器,它们分别是方向控制寄存器DDRx,数据寄存器PORTx,和输入引脚寄存器PINx(x=A\B\C\D)。

I/O口的工作方式和表现特征由这3个I/O口寄存器控制。

AVR通用I/O端口的引脚配置情况:I/O口引脚配置表表中的PUD为寄存器SFIOR中的一位,它的作用相当AVR全部I/O口内部上拉电阻的总开关。

流水灯实验总结

流水灯实验总结

流水灯实验总结引言流水灯实验是一种常见的电子实验,通过使用多个LED灯按照一定的顺序依次亮起和熄灭来形成一种流水的效果。

本文将总结流水灯实验的实验内容、步骤和实验结果,并对实验中遇到的问题和解决方法进行分析。

实验材料•Arduino UNO开发板•220欧姆电阻•10个LED灯•连线材料实验步骤1.连线:将Arduino UNO开发板与LED灯连接起来。

将10个LED灯的阴极(短腿)依次与220欧姆电阻连接,然后再将电阻的另一端依次与Arduino开发板的数字输出引脚连接。

2.编写代码:打开Arduino集成开发环境(IDE),编写代码以实现流水灯效果。

代码示例如下:int ledPins[] = {2, 3, 4, 5, 6, 7, 8, 9, 10, 11};int numPins = 10;void setup() {for (int i = 0; i < numPins; i++) {pinMode(ledPins[i], OUTPUT);}}void loop() {for (int i = 0; i < numPins; i++) {digitalWrite(ledPins[i], HIGH);delay(100);digitalWrite(ledPins[i], LOW);}delay(100);}3.上传代码:将代码上传到Arduino UNO开发板中。

4.运行实验:启动Arduino开发板,LED灯将会按照代码中设置的顺序依次亮起和熄灭,形成流水的效果。

实验结果实验结果显示,LED灯按照代码中设置的顺序依次亮起和熄灭,形成了流水的效果。

流水的速度可以通过代码中设置的延迟时间进行调整。

实验问题及解决方法问题一:LED灯没有亮起解决方法:检查LED灯连接是否正确,确认电阻和Arduino开发板的连接是否正确。

检查代码中的引脚设置是否正确。

问题二:LED灯不能按照预期的顺序亮起和熄灭解决方法:检查代码中的引脚设置是否与实际连接的顺序一致。

流水灯实验报告

流水灯实验报告

实验一流水灯实验一、实验目的1)简单I/O引脚的输出2)掌握软件延时编程方法3)简单按键输入捕获判断二、实验实现的功能1)开机时点亮12发光二极管, 闪烁三下2)按照顺时针循环依次点亮发光二极管3)通过按键将发光二极管的显示由顺时针改为逆时针方式三、系统硬件设计单片机STC10F08XE 1片发光二极管led 红4个黄4个绿4个按键6个复位电路时钟电路如下图所示:四、系统软件设计#include<reg51.h>sbit L1=P0^5; sbit L2=P0^6; sbit L3=P0^7; void Delay(void){unsigned char i,j,k;for(i=10;i>0;i--)for(j=132;j>0;j--)for(k=150;k>0;k--); }Scan_Key(){ unsigned char FLAG=0;unsigned char n;n=(L1==0)||(L2==0)||(L3==0);if(n) { FLAG=1;}return FLAG; }main(){ unsigned char y,n,s=0,b=1,m=0;unsigned char c=1;unsigned char a[]={0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; unsigned char h[]={0xff,0x38,0x34,0x2f,0x1f};n=Scan_Key(); for(y=0;y<3;y++){ P2=0; P3=0; Delay(); Delay(); Delay();P2=0xff; P3=0xff; Delay(); Delay(); Delay(); }while(1) { while(1){ m=m+n; P3=0x3f; while(1){ for(;b<9;b++){ n=Scan_Key(); m=m+n;if((P3==0x3f)&&(m%2==0)){P2=a[b];Delay();}else { P2=0xff;break; }if(m%2==0) c=1; P2=0xff; }for(;c<5;c++){n=Scan_Key(); m=m+n;if((P2==0xff)&&(m%2==0)){ P3=h[c];Delay();}else { P3=0x3f;break;} }if(m%2==0) b=1; break; }if(m%2==1) break; }while(1){ for(;b>0;b--){n=Scan_Key(); m=m+n;if((P3==0x3f)&&(m%2==1)){P2=a[b];Delay(); } else{P2=0xff;break;} P2=0xff; }if(m%2==1) c=4; for(;c>0;c--){ n=Scan_Key(); m=m+n;if((P2==0xff)&&(m%2==1)){ P3=h[c]; Delay();}else { P3=0x3f;break;} P3=0x3f; }if(m%2==0) break;if(m%2==1) b=8; } } }五、实验过程中遇到的问题及解决方法问题1: 如何实现顺、逆时针依次点亮流水灯?解决: 利用循环右移_cror_(m,1)和循环左移_crol_(n,1)依次点亮。

流水灯报告

流水灯变换电路设计与调试实验报告一、任务要求:设计一个流水灯显示电路,开关打开时,一个灯自上而下,然后自下而上流动,开关闭合时,两个灯从两边向中间,再从中间向两边流动(所有延时都是500ms)二、设计思路:整个电路有最小系统、流水灯及一个开关组成,流水灯接在AT89C51芯片的P1端口,它们之间有一个74HC573芯片,开关接在P2.0端口,实现流水灯的流动。

程序中,除了用了reg51.h 头文件外,因为有左右移动,所以还必须用intrins.h 头文件,接着就是宏定义,由于有开关,因此把开关定义在P2.0端口,延时程序用for 语句实现,在许多地方都用到,所以将其作为一个子程序,方便后面调用。

进入主程序,首先定义要使用的变量a,i,j ,再用if 语句控制开关,if 语句条件成立,即开关打开,流水灯自上而下再自下而上,闪烁;当if 语句不成立,即开关闭合,就给P1端口赋值,让流水灯从外向里再从里向外流动,闪烁。

三、硬件设计:1、系统框图如下2、各模块设计及分析最小系统图如下 最小系统 流水灯 74HC573 AT89C51 开关P2.0 P1口其中,还有20脚接地,40脚接电源,18、19脚接的晶振,工作频率是12MHz,与单片机相连构成一个时钟信号源;9脚接的电解电容C3,为复位端,按钮开关用作手动复位;31脚为外部程序储存器访问控制端,由于最小系统没有外接储存器,所以接高电平。

流水灯及74HC573芯片如图74HC573是8位数据锁存器,当输入的数据消失时,在芯片的输出端,数据仍然保持; 这个概念在并行数据扩展中经常使用到。

此芯片主要用于数码管、按键等的控制。

流水灯用的是共阳的,且接P1端口,此端口内置上拉电阻。

SWITCH开关如图接在P2.0口。

3、整体电路图四、软件设计:1、设计思路设计流水灯的流动显示,首先一个程序必须有头文件,由于有左右移动,因此,除了reg51.h外还应有intrins.h,接着,宏定义,进入程序,为了看清楚,所以必须有一个延时程序,此程序用for语句实现,设计中用开关控制流水灯花样,所以用if语句判断,if语句条件成立,即开关打开,用_crol_(a,1)、_cror_(a,1)实现流水灯地上下移动,闪烁;当if语句不成立,即开关闭合,就给P1端口赋值,控制流水灯的亮灭。

流水灯控制实验报告

《电子与控制系统设计》实验报告实验项目名称:LED灯的移动控制指导老师:元泽怀完成时间:2015年9月22日姓名:刘文开班级:12 电气 1班学号:201224122116成绩:电子信息与机电工程学院编制实验项目LED 灯的移动控制验证实验项目类型演示综合设计其他*一、实验目的1.熟悉 IO 接口的设置与应用;2.进一步熟悉编译软件和下载软件的使用;3.熟悉单片机 C 语言中移位、延时、数组等语句的应用;4.熟悉单片机 C 语言开发过程。

二、实验内容1.编写一程序,实现如下功能:每按一次S1 键,8 个发光二极管顺序点亮1 个;同样每按下 S2 键一次, 8 个发光二极管逆序点亮 1 个,实验电路原理图如下图 1所示。

实现发光二极管循环点亮的按键控制。

2. 设计一个完整程序(另建一个project),实现8个led灯的自动顺序(加法)点亮和逆序(减法)点亮。

图 1 实验原理图三、使用仪器设备及材料1、安装 windows xp 操作系统的微型计算机 1 台2、AVR单片机 C语言集成开发环境ICCAVR6.31A3、单片机仿真平台proteus7.54、AVR单片机下载软件progisp5、AVR单片机实验板 1 套(含下载器)四、实验过程原始记录1、硬件仿真电路( 1)在实验室电脑 E 盘“ 12 电气 1 班刘文开”文件夹里新建一个文件名为“ test1 ”的文件夹。

(2)打开 protues 仿真软件,根据图 1 设计出试验仿真图,命名为“test1.DSN ”保存到上述“ test 的文件夹里”。

U19RESET PC0/SCL 22 23PC1/SDA1224XTAL1PC2/TCK1325XTAL2PC3/TMS26PC4/TDO4027PA0/ADC0PC5/TDI3928PA1/ADC1PC6/TOSC13829PA2/ADC2PC7/TOSC237PA3/ADC33614PA4/ADC4PD0/RXD3515PA5/ADC5PD1/TXD3416PA6/ADC6PD2/INT03317 U2PA7/ADC7PD3/INT118PD4/OC1B 120119PB0/T0/XCK PD5/OC1A 219220PB1/T1PD6/ICP1 318321PB2/AIN0/INT2PD7/OC2 4174PB3/AIN1/OC05165PB4/SS6156PB5/MOSI714732PB6/MISO AREF 813830PB7/SCK AVCC9121011ATMEGA16LED-BARGRAPH-RED图 2实验仿真电路图9U122 RESET PC0/SCL23PC1/SDA1224XTAL1PC2/TCK1325XTAL2PC3/TMS26PC4/TDO4027PA0/ADC0PC5/TDI3928PA1/ADC1PC6/TOSC13829PA2/ADC2PC7/TOSC237PA3/ADC33614PA4/ADC4PD0/RXD3515PA5/ADC5PD1/TXD3416PA6/ADC6PD2/INT03317 U2PA7/ADC7PD3/INT118PD4/OC1B 120119PB0/T0/XCK PD5/OC1A 219220PB1/T1PD6/ICP1 318321PB2/AIN0/INT2PD7/OC24174PB3/AIN1/OC05165PB4/SS6156PB5/MOSI714732PB6/MISO AREF 813830PB7/SCK AVCC9121011ATMEGA16LED-BARGRAPH-RED图 3 实验仿真电路图2、程序流程图(1) .LED 控制移动流程图:开始初始化、定义I/O 端口YNS1 按下?Y计数器 counter++Counter>8?Y第一个 LED灯点亮是否有按键按Y下?S2 按下?Y计数器 counter--Counter<0?N Y最后一个下一个 LED灯点亮LED 灯点亮N上一个 LED灯点亮2).LED 自动循环流程图:开始初始化、定义I/O 口i = 0i = i+1Ni<8?YPORTB=~(1<<i)3、软件主要程序及注解(1).移动控制程序:#include <iom16v.h>#define uchar unsigned char#define uint unsigned intuchar temp;//*******延时函数 ********//void delay_ms(uint k){i = i - 1Ni>0?Y PORTB=~(1<<i-1)uint i,j;for(i=0;i<k;i++){for(j=0;j<1140;j++);}}//*****************端口设置函数********************// void port_init(void) {DDRB = 0xFF; //B端口设置为输出PORTD = 0XFF; //输出高电平DDRD = 0x00;//D PORTD = 0XFF; //端口设置为输入输出高电平}//*********主函数 *********//void main(void){char counter=0; // port_init();while(1)计数器//调用端口函数{if((PIND&0x10)==0){if(++counter>8) counter=1; delay_ms(300);}if((PIND&0x20)==0){counter = counter--;if(--counter<1) counter=8; delay_ms(300);}switch(counter){case 1: PORTB=0xfe;break;case 2: PORTB=0xfd;break;case 3: PORTB=0xfb;break;case 4: PORTB=0xf7;break;case 5: PORTB=0xef;break;case 6: PORTB=0xdf;break;case 7: PORTB=0xbf;break;case 8: PORTB=0x7f;break;default:break;}}}(2).自动循环程序:#include <iom16v.h>#define uchar unsigned char#define uint unsigned int//**********延时函数 **********//void delay_ms(uint k){uint i,j;for(i=0;i<k;i++){for(j=0;j<1140;j++);}}//*****************端口设置函数********************// void port_init(void) {DDRB = 0xFF; //B端口设置为输出PORTD = 0XFF; //输出高电平DDRD = 0x00;//D PORTD = 0XFF; //端口设置为输入输出高电平}//*********主函数 *********// void main(void){unsigned char i;char counter=0; // port_init(); //计数器调用端口函数while(1){for(i=0;i<8;i++){PORTB =~(1<<i);delay_ms(200);}for(i=8;i>0;i--){PORTB =~(1<<i-1);delay_ms(200);}}}五、实验结果及分析先使用 ICCAVR编译修改老师的程序,由移动控制到自动循环控制,程序的主旨不改变,大家一起交流,相互改进。

流水灯控制实验

综合实验:流水灯控制一、实验要求:根据开关状态选择八个流水灯的工作方式,且在任何状态下如有开关状态发生改变,则能立即转入最新开关状态所对应方式工作。

模式一:顺序点亮八个灯,一直循环,直到开关状态改变。

模式二:八个灯闪烁,即八盏灯全亮后全灭,一直循环,直到开关状态改变。

模式三:间隔点亮八个灯,如对八盏灯编号为L1、L2、L3、L4、L5、L6、L7、L8 ,则灯亮的方式为:L1 L3 L5 L7 ,L2 L4 L6 L8 ,L1 L3 L5 L7 ,L2 L4 L6 L8(从左往右循环)。

二、实验内容:开关S1、S2 分别与P3.1、P3.0连接,用于流水灯工作方式控制,开关组合为00、01、02、03,其中00为无效状态,01、02、03分别对应连续方式点亮灯、闪烁、间隔点亮。

八盏灯L1、L2、L3、L4、L5、L6、L7、L8分别与P1.0~P1.7连接,八盏灯为共阴极连接,即高电平点亮。

由于灯的状态改变时间间隔小于肉眼能分辨的最小时间间隔,所以在程序实现的时候必须在灯两种状态之间引入延时处理,以便肉眼能够分辨。

1.延时子程序(条件转移侧N,竖Y此页有效)四、程序代码:ORG 0000HSJMP MAINORG 0030HMAIN:MOV SP,#60HRESCAN:MOV A,#00HMOV P1,A ;灯全灭LCALL SCAN ;扫描P3口状态CJNE R0,#01H,NEXT1AJMP MODE1 ;如果P3=FDH,则转入MODE1执行(灯连续点亮)NEXT1: CJNE R0,#02H,NEXT2AJMP MODE2 ;如果P3=FEH,则转入MODE2执行(灯闪烁)NEXT2: CJNE R0,#03H,NEXT3AJMP MODE3 ;如果P3=FFH,则转入MODE3执行(间隔点亮灯)NEXT3: SJMP RESCAN ;如果P3=FCH(无效状态),则不停的对P3口扫描MODE1: ;灯连续点亮,从左往右(MODE1), P3=FDH MOV A,#00HMOV P1,AMOV R2,#80H ;R2=1000,0000LOOP1: MOV A,R2MOV P1,ARR AMOV R2,A ;A向右移一位后回送R2LCALL DEL200 ;调用200Ms延时子程序LCALL SCAN ;扫描P3口状态CJNE R0,#01H,NEXT01SJMP LOOP1 ;如果P3状态没变,跳到LOOP1执行NEXT01:CJNE R0,#02H,NEXT02AJMP MODE2 ;如果P3变为P3=FEH,跳到MODE2执行NEXT02: CJNE R0,#03H,NEXT03AJMP MODE3 ;如果P3变为P3=FFH,跳到MODE3执行NEXT03: AJMP RESCAN ;如果P3=FCH(无效状态),则不停的对P3口扫描MODE2: ;灯闪烁(MODE2), P3=FEHMOV A,#00HLOOP2: MOV P1,ACPL ALCALL DEL200 ;延时200MsPUSH ACC ;扫描P3状态前,保护现场LCALL SCAN ;扫描P3口POP ACC ;恢复现场CJNE R0,#02H,NEXT001SJMP LOOP2 ;如果状态没变,转到LOOP2执行NEXT001: CJNE R0,#01H,NEXT002AJMP MODE1 ;如果模式改变,P3=FEH,跳到MODE2NEXT002: CJNE R0,#03H,NEXT003SJMP MODE3 ;如果模式改变,P3=FFH,跳到MODE3NEXT003: AJMP RESCAN ;如果P3=FCH(无效状态),则不停的对P3口扫描MODE3:MOV A,#00H ;间隔点亮灯(MODE3),R0=03HMOV P1,AMOV R3,#04H ;R3,R4都用来控制当前趟第一个灯亮的初始位置MOV R4,#04HMOV A,#80H ;准备给P1送1000,0000LOOP3 :MOV P1,ARR ARR ALCALL DEL200 ;延时200MsDJNZ R3,LOOP3 ;判断当前(从第一个开始亮)趟结束MOV R3,#04H ;如果此趟结束,重设计数,为下一次做准备MOV A,#40H ;设置下一趟灯亮的初始位置(第二个)LOOP4: MOV P1,ARR ARR ALCALL DEL200 ;延时200MsPUSH ACC ;保护现场LCALL SCAN ;扫描P3口POP ACC ;现场恢复CJNE R0,#03H,NEXT21DJNZ R4,LOOP4 ;如果模式不变,且该趟没结束,则到LOOP4MOV R4,#04H ;如果此趟结束(模式没变),则重置计数,为下一次做准备MOV A,#80HSJMP LOOP3 ;执行当前模式的第二次亮灯NEXT21:CJNE R0,#01H,NEXT22AJMP MODE1 ;模式改变为MODE1则装到对应位置执行NEXT22: CJNE R0,#02H,NEXT23AJMP MODE2 ;模式改变为MODE2则装到对应位置执行NEXT23: AJMP RESCAN ;如果R0=00H(无效状态),则不停的对P3口扫描DEL200: ;如果晶振频率f=6MHz,误差为0MOV R7,#13HDL1: MOV R6,#14HDL0: MOV R5,#82HDJNZ R5,$ ;R5-1<>0时重复执行此句DJNZ R6,DL0DJNZ R7,DL1RETSCAN:JB P3.0,MM ;P3口状态扫描子程序JB P3.1,VVMOV A,#00HMOV R0,ARETVV:MOV A,#02HMOV R0,ARETMM:JB P3.1,NNMOV A,#01HMOV R0,ARETNN:MOV A,#03MOV R0,ARETEND五、实验分析1、误差分析:假如晶振频率f = 6MHz,那么一个机器周期t = 0.002Ms。

单片机流水灯实验报告

单片机流水灯实验报告
单片机流水灯实验报告
本次实验是单片机灯光控制实验,主要目的是培养学生使用突变端口控制灯光的实操能力。

实验分为程序设计、硬件组装、调试调试几个部分。

程序设计:根据实验要求编写了一个流水灯程序,主要利用单片机控制实现开关控制和常开及常闭特性,以及设置灯的渐变和闪烁的速度。

硬件组装:在板子上安装单片机和电路原件,并连接灯光电路,可以把单片机连接到PC,以便烧录程序。

调试调试:将程序烧录到单片机上,使板子上的灯光依次亮起,调整每个灯光闪烁或连续亮起的间隔,使灯光更好地结合实验要求。

本次实验让我深刻体会到用单片机编码语言思考问题的重要性,以及如何解决具体的技术问题。

实验操作让我加深了对单片机现象和面向对象编程的理解,让我更加熟练灵活地运用单片机配合硬件的概念和编程技术,全面提高了自己的应用水平。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

附件:
一、软件设计:源程序
/* 开关控制流水灯.c LED 高低电平交替闪烁*/
//==声明区=======================================
#include <reg51.h> //定义8051 寄存器的头文件
#define SW P0 //定义开关端口P0口
#define LED1 P1
#define LED2 P2
#define LED3 P3
void delay(int); //声明延迟函数
unsigned char i; //定义一个无符号整型变量i //==主函数=======================================
void main() //主函数开始
{ i=0; //初始化变量i 值SW=0xff; //初始化开关处于高电平
while(1)
{ switch(SW)
{ case 0xff: LED1=SW;LED2=SW;LED3=SW; break;
delay(200);
case 0xfe: LED1=SW;LED2=SW+1;LED3=SW-1; break;
delay(200);
case 0xfd: LED1=SW;LED2=SW+1;LED3=SW-1; break;
delay(200);
case 0xfb: LED1=SW;LED2=SW+1;LED3=SW-1; break;
delay(200);
case 0xf7: LED1=SW;LED2=SW+1;LED3=SW-1; break;
delay(200);
case 0xef: LED1=SW;LED2=SW+1;LED3=SW-1; break;
delay(200);
case 0xdf: LED1=SW;LED2=SW+1;LED3=SW-1; break;
delay(200);
case 0xbf: LED1=SW;LED2=SW+1;LED3=SW-1; break;
delay(200);
case 0x7f: LED1=SW;LED2=SW+1;LED3=SW-1; break;
delay(200);
}
}
} //主函数结束
//==延迟函数=====================================
void delay(int x) //延迟函数的开始,x=延迟次数
{
int i; //声明整型变量i
for(i=0;i<x;i++); //计数次数
} //延迟函数结束
二、硬件设计:
1、按开关顺序一个接一个闭合时实验现象:
2、第一个开关始终闭合,其他的开关一次闭合时实验现象:。

相关文档
最新文档