实验二 查表指令实现流水灯控制
实验流水灯程序
实验二“流水灯”一、实验目的:1.初步了解汇编语言2.通过实验了解单片机最小系统3.了解单片机的I/O口通信。
4.学习延时子程序的编写和使用.二、实验内容:1. 流水灯(跑马灯)(1)……MOV P1, #7FHACALL DELAYMOV P1, #0BFHACALL DELAYMOV P1, #0DFHACALL DELAY……MOV P1, #0FDHACALL DELAYMOV P1, #0FFHACALL DELAY……不科学(2)ORG 00H ;起始地址START: ;程序一开始,初始一些所需要变量,如进位C的清0等MOV A, #0FFH ;累加器A的8位全置1(0FFH),发光二极管全熄灭...CLR C ;进位..0.,.C=0..C.被清MOV R1, #8 ;R1=8,循环..8.次(右移..作计数器......,.用.R1....8.次)RIGHT: ;这是发光二极管向右“流动”......的循环体RRC A ;把进位C在累加器A中从左向右....轮换一位MOV P1, A ;输出至P1口ACALL DELAY ;调延时子程序,延时200msDJNZ R1, RIGHT ;R1减1,如果不为0跳回RIGHT循环执行JMP START ;跳回一开始,重复执行该流水灯程序DELAY: ;延时200ms的子程序MOV R3, #20D1:MOV R4, #20D2:MOV R5, #248 ; 2+248×2=498=498μsDJNZ R5, $;R5减1,如果不为0,就执行本行DJNZ R4, D2 ;2+20×(498+2)=10002μs≈10msDJNZ R3, D1RET ;子程序结束标志,返回主程序END ;程序结束点(3)取表法要显示的数据之间不存在简单的运算关系,不能使用ADD和SUBB等指令根据上一状态计算出下一状态的显示值。
但显示的数据存在依次取用的特点,这时一般就会用到取表的方法。
流水灯(定时器延时)
/********************** main******************************/ main() { unsigned char k,temp,temp1;//设置变量 P1= 0xff; TMOD = 0x01;//设置定时器方式为定时器方式 1 while (1) { temp = 0x01; //L1 到 L8 二极管顺序点亮 for(k=0;k<8;k++) { P1 = ~temp; delay(50); temp = temp<<1; } temp = 0x80; //L8 到 L1 二极管顺序点亮 for(k=0;k<8;k++) { P1 = ~temp; delay(50); temp = temp>>1; } temp = 0xfe;//L8L1 到 L7L2 到 L6L3 到 L5L4 顺序点亮 temp1 = 0x7f; for(k=0;k<8;k++) { P1 =(_cror_(temp,k))&(_crol_(temp1,k)); delay(50); } P1 = 0xFF; delay(200); temp = 0xFE; //L8 到 L1 二极管顺序点亮 for(k=0;k<8;k++) { P1 = temp; delay(50); temp = temp<<1; } temp = 0x7F; //L1 到 L8 二极管顺序熄灭 for(k=0;k<8;k++) { P1 = ~temp; delay(50); temp = temp>>1; } } }
/*********************************************************************************************/ /* 函 数 名: delay*****************************************************************************/ /* 功能描述: 延时*****************************************************************************/ /* 调用函数: 无 ******************************************************************************/ /* 入口参数: t*********************************************************************************/ /* 出口参数:无 ******************************************************************************/ /*********************************************************************************************/
实验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.25typedef 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.29typedef 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;elseIOCLR0=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|--VccQC --|2 15|--QAQD --|3 14|--SIQE --|4 13|--/GQF --|5 12|--RCKQG --|6 11|--SCKQH --|7 10|--/SCLRGND-|8 9|--QH'74595的数据端:QA--QH: 八位并行输出端,可以直接控制数码管的8个段。
实验二 查表指令实现流水灯控制
实验二 查表指令实现流水灯控制一、实验目的1、熟悉Keil uVision2软件的使用;2、掌握流水灯控制;3、掌握延时程序的编制;二、实验设备及仪器Keil μVision2软件;单片机开发板;PC 机一台三、实验原理及内容1、LED 流水灯模块电路原理图,如图2.1所示。
U7+5V 图2.1 LED 流水灯模块原理图 (1)74HC573为8位三态输出锁存器,各引脚功能: D0~D7为输入端(接到P0口); Q0~Q7为输出端(驱动LED 灯DS2~DS9); LE 输入数据锁存控制端,高电平有效(当LE=1时,锁存数据);OE 输出使能端,低电平有效; 只要锁存器按照一定规律输出低电平,就能使LED 灯按一定的规律点亮。
(2)P0口控制流水灯模块、数码管及点阵。
对应的锁存器控制端: P1.2 流水灯(74HC573锁存器U7)P1.0 数码管的段(74HC573锁存器U8)P1.1 点阵列、数码管的位(74HC573锁存器U9)P1.3 点阵行(74HC573锁存器U4)2、训练内容一:用查表指令分别实现如下流水灯方案:(1)LED灯由右到左逐步熄灭参考程序:ORG 00HMAIN:CLR P1.1 ;数码管位、点阵列控制位关闭CLR P1.3 ;点阵行控制位SETB P1.2 ;led灯控制MOV DPTR,#TAB1;首地址MOV R0,#8 ;移位次数MOV R1,#0MOV P0,#0LCALL DELAY ;延时LOOP:MOV A,R1MOVC A,@A+DPTRMOV P0,ALCALL DELAYINC R1DJNZ R0,LOOPLJMP MAINDELAY:MOV R2,#0D1:MOV R3,#0D2:NOPDJNZ R3,D2DJNZ R2,D1RETTAB1:DB 80H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH END(2)LED灯由右到左逐步点亮(3)LED 灯由两边向中间靠拢(4)LED 灯由中间向两边分离(5)LED 等先由两边向中间靠拢,再由中间向两边分离2、训练内容二:点阵模块静态显示对应的行为高电平控制,对应的列为低电平控制。
综合实验一——按键控制流水灯实验(查询方式)
北京科技大学微型计算机原理实验报告学院:____自动化学院________________专业、年级:_自动化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口内部上拉电阻的总开关。
单片机跑马灯(流水灯)控制实验报告
单片机实验报告姓名: 学号:一、 实验实现功能:1:计数器功能2:流水灯二、 具体操作:1、计数器功能数码管的动态显示。
每按一次K2键计数器加1通过数码管显示出来,计数器可以实现从0计数到9999。
2、流水灯当在计数器模式下的时候按下K3键时程序进入跑马灯模式,8个小灯轮流点亮每次只点亮一个,间隔时间为50ms 。
三、 程序流程图开始 定时器T0 设置初值,启动定时器,打开中断复位 Key2按下 中断关闭 计数器模式 计数器加1 Key3按下 流水灯模式 数码管显示数字加1 跑马灯点亮间隔50ms Key1按下中断打开四、程序#include <reg51.h>typedef unsigned char uint8;typedef unsigned int uint16; //类型定义sbit P2_1 = P2^1;sbit P2_2 = P2^2;sbit P2_3 = P2^3;sbit P2_4 = P2^4; //位声明四个数码管开关sbit Key2 = P3^2;sbit Key3 = P3^3; //位声明2个按键K2和K3sbit Ledk = P2^0 ; //LED 开关void delay(uint16 i); //延时函数声明void refresh (); // 数码管刷新函数声明void liushuideng(); //流水灯函数声明uint8 number[] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};//数码管的真值表uint8 out[4] = {0}; // 数组变量uint16 counter=0; //用作计数器的变量uint16 Time_counter=0; //用作定时器的变量void main() //主函数{TMOD = 0x01; //定时器0,工作方式一TH0 = 0xFC;TL0 = 0x18; //定时器初值使每次循环为1msTR0 = 0; //定时器0开始作ET0 = 0; // 定时器中断关EA = 0; // 关中断while(1) //计数器模式{Ledk =1 ; //led开关关out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位if (!Key2) //计数器加1{++counter; //自加out[0]=number[counter%10]; //取个位out[1]=number[counter%100/10]; //十位out[2]=number[counter%1000/100]; //百位out[3]=number[counter/1000]; //千位while(!Key2) //等待键盘抬起refresh(); //刷新数码管}refresh(); //刷新数码管if (!Key3) // 进入跑马灯模式liushuideng();}} //主函数结束/*******************延时*************/void delay(uint16 i){uint8 j; // 定义局部变量for(i;i>0;i--) //循环i*240 次for(j=240;j>0;j--);}/************数码管刷新******************/void refresh (){uint8 j;for (j=0;j<4;j++) //四次循环刷新数码管{switch(j){case 0: P2_1=1;P2_2=1;P2_3=1;P2_4=0;break;case 1: P2_1=1;P2_2=1;P2_3=0;P2_4=1;break;case 2: P2_1=1;P2_2=0;P2_3=1;P2_4=1;break;case 3: P2_1=0;P2_2=1;P2_3=1;P2_4=1;break;//每次循环只选中一个数码管default:break;}P0 = out[j]; // 位选,给数码管送值delay (20); //延时消抖}}/*************定时器的中断服务函数**************/void Timer0_Overflow() interrupt 1 //定时器0溢出中断,这个语句1ms执行一次{TH0 = 0xFC;TL0 = 0x18; //每1ms重新赋定时器初值Time_counter++; //计数,看经过了几个1ms}/***********************流水灯子函数****************************/ void liushuideng(){uint8 j = 0 ; //定义局部变量P0 = 0xff; // 小灯全关TR0 = 1; //定时器1开始计时EA = 1; //中断开放ET0 = 1; //定时器0中断开while(1){Ledk = 0 ; //打开LED开关P2 = P2|0x1E; //关掉数码管if(50 == Time_counter) //50个毫秒{P0=~(1<<j++); //控制小灯Time_counter = 0; //清零开始下一次循环定时}if (8==j) //移完8次再重新移{j=0;}}}。
流水灯实验报告
流水灯实验报告实验目的1.了解单片机I/O口的工作原理。
2.掌握51单片机的汇编指令。
3.熟悉汇编程序开发,调试以及仿真环境。
一、实验内容通过汇编指令对单片机I/O进行编程(本实验使用P0口),以控制八个发光二极管以一定顺序亮灭。
(即流水灯效果)二、实验原理通过更改P0口8位的高低电平,分别控制8个发光二极管的亮灭。
具体的亮灭情况如下表:要实现“流水灯”效果,也就是需要将P0口的输出值发生以下变化:FE→FD→FB→F7→EF→DF→BF→7F→BF→DF→EF→F7→FB→FD→FE→......可以使用一个循环,不断对数据进行移位运算实现。
这里的移位指令采用RL和RR,即不带进位的位移运算指令。
如果使用带进位的位移运算指令(RLC和RRC),则需要定期把CY置0,否则会出现同时亮起两个发光二极管的情况。
三、实验过程1.在仿真系统中绘制好单片机的电路图2.编写汇编程序,程序如下:ORG 0000HDelay: MOV R0,#0FFHSJMP StartDelay1: MOV R1,#0FFHStart: MOV A, Delay2: NOP#0FEHMOV P0, A DJNZ R1,Delay2 CLR P2.7 DJNZ R0,Delay1 CLR P3.7 RETMove: MOV R2, #7H ENDMOV R3, #7HRMove: RL AMOV P0, ACALL DelayDJNZ R2,RMoveLMove: RR AMOV P0, ACALL DelayDJNZ R3,LMoveSJMP Move四、实验结果为了便于实验结果的描述,下面分别把P0.0, P0.1…, P0.7对应的发光二极管编号为1, 2, …, 8号二极管。
在仿真系统中,先从1号二极管下面是在仿真系统中的实验结果:1.只有1号二极管点亮2.只有2号二极管点亮3.只有3号二极管点亮4.只有4号二极管点亮5.只有5号二极管点亮6.只有6号二极管点亮7.只有7号二极管点亮8.只有8号二极管点亮实验的结果:二极管的发光状态从1→2→3→4→5→6→7→8→7→…→1→2;如此往复循环。
流水灯控制的实验报告
流水灯控制的实验报告
《流水灯控制的实验报告》
实验目的:通过对流水灯控制的实验,掌握流水灯的原理和实现方法,加深对
电子电路控制的理解。
实验设备:Arduino开发板、LED灯、面包板、导线等。
实验步骤:
1. 连接电路:将LED灯连接到Arduino开发板的数字引脚上,通过面包板和导
线连接。
2. 编写代码:使用Arduino IDE编写代码,实现流水灯的控制逻辑。
代码中需
要包括LED灯的引脚定义、控制流水灯的循环逻辑等。
3. 上传程序:将编写好的代码上传到Arduino开发板上,进行实际的控制操作。
4. 测试效果:观察LED灯的亮灭情况,检验流水灯控制的效果。
实验结果:通过实验,成功实现了对流水灯的控制。
LED灯按照设定的流水灯
效果进行亮灭,实现了预期的控制效果。
实验分析:流水灯控制实验是一种常见的电子电路控制实验,通过这个实验可
以加深对Arduino开发板以及LED灯的控制原理的理解。
同时,通过编写代码
实现流水灯的控制,也可以提高对编程逻辑的理解和掌握。
实验总结:通过本次实验,我对流水灯的控制原理和实现方法有了更深入的了解,同时也加深了对电子电路控制和编程的理解。
这对我今后的学习和实践都
有很大的帮助。
结语:流水灯控制的实验报告告诉了我们,通过实际操作和实验,我们可以更
深入地理解和掌握电子电路控制的原理和方法。
这对我们的学习和实践都有着
重要的意义。
流水灯控制的实验报告
一、实验目的1. 熟悉流水灯控制电路的原理和设计方法;2. 掌握使用单片机控制LED灯流水灯的方法;3. 培养动手实践能力和创新意识。
二、实验原理流水灯是一种常见的LED灯控制方式,通过单片机对LED灯进行控制,使LED灯按照一定的规律依次点亮和熄灭,形成动态的流水效果。
本实验采用51单片机作为控制器,通过编程实现对LED灯流水灯的控制。
流水灯的控制原理如下:1. 将LED灯连接到单片机的P0口,每个LED灯对应一个P0口的引脚;2. 编写程序,使单片机依次对P0口的引脚进行赋值,从而控制LED灯的亮灭;3. 通过延时函数实现LED灯的流水效果。
三、实验器材1. 51单片机实验板;2. 8个LED灯;3. 电阻(阻值约为220Ω);4. 连接线;5. 编程器;6. 示波器(可选)。
四、实验步骤1. 将LED灯按照电路图连接到实验板上,确保每个LED灯的正极连接到单片机的P0口对应引脚,负极连接到GND;2. 编写程序,实现LED灯流水灯的控制。
程序如下:```c#include <reg51.h>void delay(unsigned int ms) {unsigned int i, j;for (i = 0; i < ms; i++)for (j = 0; j < 120; j++); }void main() {while (1) {P0 = 0x01; // 第一个LED灯亮 delay(500);P0 = 0x02; // 第二个LED灯亮 delay(500);P0 = 0x04; // 第三个LED灯亮 delay(500);P0 = 0x08; // 第四个LED灯亮 delay(500);P0 = 0x10; // 第五个LED灯亮 delay(500);P0 = 0x20; // 第六个LED灯亮 delay(500);P0 = 0x40; // 第七个LED灯亮 delay(500);P0 = 0x80; // 第八个LED灯亮delay(500);P0 = 0xFF; // 所有LED灯亮delay(500);P0 = 0x00; // 所有LED灯灭delay(500);}}```3. 将编写好的程序烧录到单片机中,并上电运行;4. 观察LED灯流水灯的效果,分析程序运行过程。
单片机实验2-LED流水灯实验实验
四、实验步骤: 实验步骤: 1. 实验原理图: 实验原理图:
1KΩ P1.0 P1.1 P1.2
VCC
MCU
P1.3 P1.4 P1.5 P1.6 P1.7 1KΩ
用导线把A2区的 接口与D1区的 用导线把 区的J61接口与 区的 区的 接口与 区的J52接口相连 接口相连
2. 编写程序思路: 编写程序思路: 用单片机P1口的 位输出控制8只 口的8位输出控制 用单片机 口的 位输出控制 只LED灯, 灯 每次点亮一只 LED,8只LED灯依次点亮, , 只 灯依次点亮, 灯依次点亮 点亮LED8之后同时点亮 个LED两秒时间, 之后同时点亮8个 两秒时间, 点亮 之后同时点亮 两秒时间 然后再依次点亮LED1~LED8,如此循环, 然后再依次点亮 ,如此循环, 即可形成流水灯。 即可形成流水灯。 •注意:因为人眼的视觉暂留时间为0.1s 注意:因为人眼的视觉暂留时间为 注意 (100ms),所以每个灯点亮的时间间隔应大于 所以每个灯点亮的时间间隔应大于 200ms。建议取 左右。 。建议取250ms左右。 左右
实验报告要求
1. 实验名称 2. 实验目的 3. 实验设备 4. 实验内容 5. 实验原理(图要画完整)及控制方法和过程的详细 实验原理(图要画完整) 说明。 说明。 6.实验编写的程序 实验编写的程序 7.实验结果 实验结果 8.心得和建议 心得和建议
实验报告不得抄袭
下次实验内容:手动扩展外部中断^INT0、 ^INT1。 下次实验内容 : 手动扩展外部中断 、 。 当 ^INT0产生中断时 , 使 LED 8盏灯流水显示 。 当 产生中断时, 盏灯流水显示。 产生中断时 盏灯流水显示 ^INT1产生中断时,使8盏LED停止流水显示。 产生中断时, 盏 停止流水显示。 产生中断时 停止流水显示 只数码管全亮; 注:当P1=00H时,8只数码管全亮; 时 只数码管全亮 全灭。 当P1=0FFH时,8只LDE全灭。 时 只 全灭 ^INT0:外接 外接SW1; 外接 ; ^INT1外接 外接SW2。 外接 。 设定外部中断边沿触发方式有效; 附:(1) 设定外部中断边沿触发方式有效; (2) 请设计一验证外部中断优先级。 请设计一验证外部中断优先级。
单片机流水灯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++)
单片机流水灯实验程序实验报告
单片机流水灯实验程序实验报告实验题目:流水灯实验2(利用查表方式)一、实验目的:1、学习利用查表的方式,使发光二极管(L1—L8)做舞台灯光效果的变化。
2、学习实用程序的编程规则。
二、实验仪器设备计算机一台、单片机在线系统一套(AY—MPU89S51E)三、实验电路:同实验一电路。
四、实验内容:灯光效果按如下规律显示:00111100,10000001,11000011,11100111,11111111,11100111,11000011,10000001,00000000,00011000,00111100,01111110 11111111,00000000,10101010,10101010,11001100,10000000,11000000,11100000,11110000,11111000,11111100 11111110,11111111,11111110,11111100,11111000,11110000 11100000,11000000,10000000,00000000。
扩展:自行设计花色效果表。
五、实验步骤:1、画出程序流程图。
3、程序输入到编程软件Keilc51中。
3、编译下载程序到系统实验板上的单片机中。
4、分析调试记录的内容和结果,找出程序中可能出错的地方,然后修改程序,继续调试、记录、分析,直到调试成功。
实验电路:U11939XTAL1P0.0/AD038P0.1/AD137P0.2/AD21836XTAL2P0.3/AD335P0.4/AD434 P0.5/AD533P0.6/AD6932RSTP0.7/AD721P2.0/A822P2.1/A923P2.2/A102924PSENP2.3 /A113025ALEP2.4/A123126EAP2.5/A1327P2.6/A1428P2.7/A15110P1.0/T2P3.0/RXD2 11P1.1/T2EXP3.1/TXD312P1.2P3.2/INT0413P1.3P3.3/INT1514P1.4P3.4/T0615P1.5 P3.5/T1716P1.6P3.6/WR817P1.7P3.7/RDAT89C52程序流程图:开始(21H) 00HDPTR #TAB,(A) (21H)(A) @A+DPTR显示灯亮(A) (21H)+1N Y(A)=33?程序代码:ORG 0000HLJMP STARTORG 0100HSTART:MOV P1,#0FFHMOV 21H,#00HLOOP:MOV DPTR,#TABMOV A,21HMOVC A,@A+DPTRCPL AMOV P1,ALCALL DELAYINC 21HMOV A,21HCJNE A,#33,LOOPMOV 21H,#00HLJMP LOOPTAB: DB00111100,10000001,11000011,11100111,11111111,11100111,11000011,10000001 DB00000000,00011000,00111100,01111110,11111111,00000000,10101010,10101010 DB11001100,10000000,11000000,11100000,11110000,11111000,11111100,11111110 DB11111111,11111110,11111100,11111000,11110000,11100000,11000000,10000000, 00000000DELAY: MOV R5,#03HD0:MOV R6,#0FFHD1:MOV R7,#0FFHDJNZ R7,$DJNZ R6,D1DJNZ R5,D0RETEND程序运行正确,写入单片机后,二极管按照上述数值亮灭,展现灯光舞台效果。
组态王 流水灯的实现
实验二组态王实现流水灯效果实验步骤:(1)定义变量(2)数据改变命令语言(3)事件命令语言(4)界面设计(5)应用程序的实现二实验要求:1、参照以上范例,实现6个灯的流水灯效果。
实验步骤(1)定义变量(2)数据改变命令语言(3)事件命令语言(4)界面设计(5)应用程序的实现if(\\本站点\按钮==1)if(\\本站点\KV==0) {\\本站点\D1=1;\\本站点\D2=0;\\本站点\D3=0;\\本站点\D4=0;\\本站点\D5=0;\\本站点\D6=0;\\本站点\D7=0;\\本站点\D8=0;}if(\\本站点\KV==1) {\\本站点\D1=0;\\本站点\D2=1;\\本站点\D3=0;\\本站点\D4=0;\\本站点\D5=0;\\本站点\D6=0;\\本站点\D7=0;\\本站点\D8=0;if(\\本站点\KV==2) {\\本站点\D1=0;\\本站点\D2=0;\\本站点\D3=1;\\本站点\D4=0;\\本站点\D5=0;\\本站点\D6=0;\\本站点\D7=0;\\本站点\D8=0;}if(\\本站点\KV==3) {\\本站点\D1=0;\\本站点\D2=0;\\本站点\D3=0;\\本站点\D4=1;\\本站点\D5=0;\\本站点\D6=0;\\本站点\D7=0;\\本站点\D8=0;if(\\本站点\KV==4) {\\本站点\D1=0;\\本站点\D2=0;\\本站点\D3=0;\\本站点\D4=0;\\本站点\D5=1;\\本站点\D6=0;\\本站点\D7=0;\\本站点\D8=0;}if(\\本站点\KV==5) {\\本站点\D1=0;\\本站点\D2=0;\\本站点\D3=0;\\本站点\D4=0;\\本站点\D5=0;\\本站点\D6=1;\\本站点\D7=0;\\本站点\D8=0;if(\\本站点\KV==6) {\\本站点\D1=0;\\本站点\D2=0;\\本站点\D3=0;\\本站点\D4=0;\\本站点\D5=0;\\本站点\D6=0;\\本站点\D7=1;\\本站点\D8=0;}if(\\本站点\KV==7) {\\本站点\D1=0;\\本站点\D2=0;\\本站点\D3=0;\\本站点\D4=0;\\本站点\D5=0;\\本站点\D6=0;\\本站点\D7=0;\\本站点\D8=1;\\本站点\T2=\\本站点\$分*60+\\本站点\$秒;\\本站点\T3=\\本站点\T2-\\本站点\T1;if(\\本站点\T3<0){\\本站点\T3=\\本站点\T2+3600-\\本站点\T1;\\本站点\T2=\\本站点\$分*60+\\本站点\$秒+3600; }if(\\本站点\T3>=\\本站点\DT){\\本站点\KV=\\本站点\KV+1;\\本站点\T1=\\本站点\T2;if(\\本站点\T1>=3600){\\本站点\T1=\\本站点\T1-3600;}if(\\本站点\KV>8){\\本站点\KV=0;}}}2,实现按一下按键亮一个灯的效果。
stc 单片机闪烁灯、流水灯查表法的实现
Stc 单片机闪烁灯、流水灯查表法的实现闪烁灯1.实验任务如电路原理图所示:在P2.0端口上接一个发光二极管L1,使L1在不停地一亮一灭,一亮一灭的时间间隔为0.2秒。
3.系统板上硬件连线把“单片机最小系统”中的P2.0端口用导线连接到发光二极管L1端口上。
1.实验任务利用取表的方法,使端口P2做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0.2秒)3.硬件实现把“单片机最小系统”P1.0-P1.7用8芯排线连接到“八路发光二极管指示模块”中的L1-L8端口上,要求:P1.0对应着L1,P1.1对应着L2,……,P1.7对应着L8。
5.C语言源程序#include <AT89X51.H>unsigned char code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x00,0xff,0x00,0xff,0x01};unsigned char i;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){if(table!=0x01){P1=table;i++;delay();}else{i=0;}}}流水灯程序c#include <REG52.H>sbit L1=P2^0;sbit l2=P2^1;sbit l3=P2^2;sbit l4=P2^3;sbit l5=P2^4;sbit l6=P2^5;sbit l7=P2^6;sbit l8=P2^7;void delay02s(void) //延时0.2秒子程序{unsigned char i,j,k;for(i=20;i>0;i--)for(j=20;j>0;j--)for(k=150;k>0;k--);}void main(void) {while(1){L1=0;delay02s();L1=1;l2=0;delay02s();l2=1;l3=0;delay02s();l3=1;l4=0;delay02s();l4=1;l5=0;delay02s();l5=1;l6=0;delay02s();l6=1;l7=0; delay02s(); l7=1;l8=0; delay02s(); l8=1;}}。
实验二 流水灯
实验四中断应用--流水灯的设计实验一、设计要求:利用外中断接口接一个外部中断输入,同时使用单片机定时器中断,通过P1口连接8 个发光二极管显示中断的作用:利用定时方式,使8只LED灯每隔1s 左移一次,当外部中断出现时8个LED 灯闪烁5 次,闪烁完后返回继续中断前的状态运行。
二、实验目的:理解中断嵌套及中断优先级的概念和掌握其编程方法。
三、电路设计:1.原理图2.使用电路模块:MCU板、006板3.硬件连线表:MCU模块P1.0~P1.7 P3.2 +5V GND006板LED1~LED8 SW1 +5V GND四、程序设计五、实验效果:外部中断未发生时,系统通过定时器定时的方法,使LED 做流水灯操作;当有外中断发生,LED闪烁5次,完毕返回。
六、实验步骤:1.Proteus 仿真a.在Proteus中打开设计文档 *.DSN;b.建立实验程序并编译,加载hex文件,仿真;c.如不能正常工作,打开调试窗口进行调试。
2.实验板验证a.用ISP下载hex 程序到MCUb.按连接表连接电路c.检查验证结果七、源程序:ORG 0000HLJMP STARORG 0003H ;外中断0入口LJMP EXTORG 000BH ;定时器0入口LJMP TIMSTAR: MOV SP,#70HMOV TMOD,#01H ;定时器0模式1MOV TH0,#0D0H ;定时10msMOV TL0,#0F0HSETB TR0SETB ET0SETB EX0SETB EASETB PX0 ;外中断0优先级高MOV R3,#100 ;每1秒钟灯左移一次MOV R1,#0FEH ;流水灯初值LJMP $;定时中断服务子程序TIM: PUSH ACCPUSH PSWMOV TH0,#0D8HMOV TL0,#0F0HDJNZ R3,LOOP ; 1秒钏没到返回MOV A,R1 ; 1秒钟到了,流水灯左移一位MOV P1,ARL AMOV R1,A ; 保存流水灯的状态返回LOOP: POP PSWPOP ACCRETI;外中断服务子程序EXT: PUSH ACCPUSH PSWMOV A,#0MOV R2,#10LOOP1: MOV P1,ACALL DELAYCPL ADJNZ R2,LOOP1POP PSWPOP ACCRETI;延时DELAY: MOV R5,#20D1: MOV R6, #20D2: MOV R7,#248DJNZ R7,$DJNZ R6,D2DJNZ R5, D1RETEND八、扩展实验改用外部中断1和定时器1来实现上述效果。
实验2 流水灯控制的C语言实现
实验2 流水灯控制的C语言实现一、实验目的1、应用PROTEUS仿真工具软件绘制硬件连接图2、使用Keil C 完成程序的编写和调试3、初步了解C51程序的编写与调试二、实验内容本任务就是在单片机电路板上安装电路,以P1作为输出口,控制8个LED灯(可发红、绿或黄光),模拟流水灯控制。
三、实验电路原理图图4-1 流水灯控制电路原理图四、实验步骤1、在PROTEUS中画好电路原理图。
2、在KEIL中编写流水灯控制的程序。
编好后调试产生HEX文件。
编程要求如下:状态1:8个LED,从左到右逐个点亮,状态2:8个LED,从右到左逐个点亮,状态3:8个LED,从左到右依次点亮,状态4:8个LED,从右到左依次熄灭。
转至状态1循环该程序对应的流程图如图4-2所示。
3、将HEX文件写入电路图中的单片机,仿真出流水灯控制的现象。
五、实验源代码1、汇编程序:ORG 0000HLJMP MAINORG 0040HMAIN: MOV SP,#60HLOOP1:MOV R0,#8; R0=8MOV A,#0FEH;A=1111_1110LP1: MOV P1,A; P1=1111_1110MOV R3,#5; R3=101LCALL DELAY; 调用延时函数RL A; 将A循环左移DJNZ R0,LP1; 将R0-1->R0,如果R0!=0,则循环LOOP2:MOV R0,#8MOV A,#7FHLP2: MOV P1,A____________________________________________LOOP3:MOV R0,#8MOV A,#0FEHLP3: MOV P1,AMOV R3,#5________________________________________________LOOP4:MOV R0,#8MOV A,#80HLP4: MOV P1,AMOV R3,#5LCALL DELAYSETB CRRC ADJNZ R0,LP4LJMP LOOP1DELAY: MOV R2,#0FFH ; 延时子程序R2=255 DELAY1: MOV R1,#0C3H ;R1=12x16+3=195_______________________________________RETEND2、C51程序:#include<reg51.h>#define uint unsigned int#define uchar unsigned charvoid delay(uint n) /*1ms延时函数*/{ uint k,j;for(k=0;k<n;k++)for(j=0;j<121;j++);}main(){ uchar i;uint aa;while(1){ aa=0xfe;//aa=1111_1110for(i=0;i<8;i++){P1=aa;//P1=1111_1110delay(500);aa=(aa<<1)|0x01;//aa=1111_1100 | 0000_0001=1111_1101}aa=0x7f;//aa=0111_1111for(i=0;i<8;i++){P1=aa;delay(500);aa=(aa>>1)|0x80;//aa=1011_1111}aa=0xfe;//aa=1111_1110for(i=0;i<8;i++){P1=aa;delay(500);aa=aa<<1;//aa=1111_1100}aa=0x80;//aa=1000_0000for(i=0;i<8;i++){P1=aa;delay(500);aa=(aa>>1)|0x80;aa=1100_0000}}}图4-2 程序流程图。
流水灯控制2
四、程序代码: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=FDHMOV 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。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验二 查表指令实现流水灯控制
一、实验目的
1、熟悉Keil uVision2软件的使用;
2、掌握流水灯控制;
3、掌握延时程序的编制;
二、实验设备及仪器
Keil μVision2软件;单片机开发板;PC 机一台
三、实验原理及内容
1、LED 流水灯模块电路原理图,如图2.1所示。
U7+5V 图2.1 LED 流水灯模块原理图 (1)74HC573为8位三态输出锁存器,各引脚功能: D0~D7为输入端(接到P0口); Q0~Q7为输出端(驱动LED 灯DS2~DS9); LE 输入数据锁存控制端,高电平有效(当LE=1时,锁存数据);
OE 输出使能端,低电平有效; 只要锁存器按照一定规律输出低电平,就能使LED 灯按一定的规律点亮。
(2)P0口控制流水灯模块、数码管及点阵。
对应的锁存器控制端: P1.2 流水灯(74HC573锁存器U7)
P1.0 数码管的段(74HC573锁存器U8)
P1.1 点阵列、数码管的位(74HC573锁存器U9)
P1.3 点阵行(74HC573锁存器U4)
2、训练内容一:用查表指令分别实现如下流水灯方案:(1)LED灯由右到左逐步熄灭
参考程序:
ORG 00H
MAIN:
CLR P1.1 ;数码管位、点阵列控制位关闭
CLR P1.3 ;点阵行控制位
SETB P1.2 ;led灯控制
MOV DPTR,#TAB1;首地址
MOV R0,#8 ;移位次数
MOV R1,#0
MOV P0,#0
LCALL DELAY ;延时
LOOP:MOV A,R1
MOVC A,@A+DPTR
MOV P0,A
LCALL DELAY
INC R1
DJNZ R0,LOOP
LJMP MAIN
DELAY:MOV R2,#0
D1:MOV R3,#0
D2:NOP
DJNZ R3,D2
DJNZ R2,D1
RET
TAB1:DB 80H,0C0H,0E0H,0F0H,0F8H,0FCH,0FEH,0FFH END
(2)LED灯由右到左逐步点亮
(3)LED 灯由两边向中间靠拢
(4)LED 灯由中间向两边分离
(5)LED 等先由两边向中间靠拢,再由中间向两边分离
2、训练内容二:点阵模块静态显示
对应的行为高电平控制,对应的列为低电平控制。
在很短的时间内依次点亮多个发光二极管,就可以看到显示的数字、字母及其他图形符号。
点亮左上角1盏灯的参考程序:
ORG 00H
MAIN:
SETB p1.0;数码管段控制
SETB P1.2;LED 灯控制位
MOV P0,#0FFH;关闭LED 灯
CLR P1.2 ;关闭LED 灯控制位
MOV P0,#0 ;关闭数码管
CLR P1.0 ;关闭数码管控制位
第1脚
第1脚
第1行第8脚
第1列
SETB P1.3;点阵行,高电平有效
MOV P0,#01H
CLR P1.3
SETB P1.1;点阵列,低电平有效、数码管位MOV P0,#0FEH
CLR P1.1
END。