void light_water(){ num=1;for(a=0;a<8;a++){ P1.1=num<<1;delay(1000); //延时;keyboard();//执行时又不停扫描键盘函数;} } 这样就会有一个LED从右往左移动8次;那么当第一次流水未完时,又调用第
急求单片机流水灯程序及详解 100 第一步:8个发光二极管同时亮并且闪烁2次,闪烁间隔为0.3秒。第二步:8个发光二极管一个一个亮,间隔时间为0.5秒。第三步:开始时,8个发光二极管全部熄灭,0.3秒后一个被点亮,间隔0 第一步:8个
首先定义变量类似于P1_2 = P1^2这种,先把这八个管脚全部定义好,之后给个for循环,让P1(假设的你LED灯连接的是P1口)口的P1^0~P1^7相关标志位依次等于0或者1(0还是1需要看你在LED等上给的是高电位亮还是低电位
希望能帮到你 共阳极,低电平亮,到时候自己调整。假设用单片机P1口。延时函数自己写吧。#include
delay(100); //调用延时子程序 L4=1; //第四盏灯亮 delay(100); //调用延时子程序 while(1); //这里我用了个死循环,目的程序只运行一次,如果需要自动重新运行,可以把这句删掉 } 纯手工书写,并仿真调
include
LCALL DELAY ;延时60秒 LCALL DELAY ;延时60秒 LCALL DELAY ;完成第一次循环点亮,延时约0.25秒 AJMP START ;反复循环 ;延时子程序,12M晶振延时约250毫秒 DELAY: ;大约值:2us*256*256*2=260ms,也
单片机汇编语言流水灯程序延时0.5秒 一共四个灯循环
P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出 delay02s( ); // 延时0.2s j= j<<1; // 左移1位 } j=0x80; // 设置右移初始值j为0x80 for (i=0;i<8;i++){ P1= ~
用两个按键,然后定义一个变量,按键1按下变量增加,按键二按下变量减少。注意按键消抖。然后把变量放到延时函数的参数里面,就可以啦。
delay(5000);如果所带参数是一个常数,那流水灯的速度就是固定不变的。如果改成一个变量,如:delay(speed); 这速度就可以变化可调了。这样,通过按键改变变量speed的值,就调速度了。
这是8个LED灯的流水灯,接在P1,P3.2脚接一个按键,用定时器定时控制流水灯的速度。仿真图如下图所示。
用c51做 逐渐变慢的流水灯 用一个按键来控制 每按一下,变慢一级?
可以用for循环试试unsingned char i;for(i=0;i<5;i++)//流水灯闪烁程序。若干个灯泡依次点亮就叫流水灯,它用在夜间建筑物装饰方面。例如在建筑物的棱角上装上流水灯,可起到变换闪烁美不胜收的效果。单片机(Single-
1、首先要写入单片机的头函数,定义单片机P1口的8个管脚,让他们分别代表流水灯的8个led。2、写一个大约一小时的延时函数,为了清楚的看到流水灯的、效果。3、下面是流水灯的主函数,流水灯一个点亮后一个熄灭反复循环点亮
1、用精确定时的方法,设置流水灯运行时的时间间隔,延时时间为500MS。2、#include "reg51.h"首先写出单片机的头函数。3、#include "intrins.h"输入位移函数。4、unsigned int count=0,led;定义函数。5、输入主函数,定
1选用合适的单片机和LED灯,将它们连接在电路板上。2在单片机程序中编写代码,控制LED灯的亮灭状态。3在代码中指定LED灯的亮灭顺序,以及延时时间。通常采用循环结构进行控制。4在将代码烧录到单片机之后,启动实验,即可看到
用单片机怎样控制流水灯?
单片机中流水灯控制:硬件连接很简单,只要将8个LED指示灯接在P1口上 另一端通过220欧姆的电阻接+5V电源上,就可以了。主要靠软件控制,简单的可以使用左移或右移指令,将低电平0 逐渐移入寄存器中,即控制LED指示灯逐渐
sbit anjian = P1^0; //按键位 void delay(uint16 h) //延时程序 { while(h--);} main(){uint8 k = 0 , i = 0;P0 = 0xff;anjian = 1;while(1){ P0 = ~(1<
TLOW EQU 0F0HTHIGH EQU 0D8HFLAG_DIR BIT 20H.0;FANGXIANGCOUNT_INT DATA 30HCOUNT_K DATA 31HLEDVALUE DATA 32HCOUNT_KEY DATA 33HKEY0 EQU P2.0KEY1 EQU P2.1KEY2 EQU P2
例如:delay(5000);如果所带参数是一个常数,那流水灯的速度就是固定不变的。如果改成一个变量,如:delay(speed); 这速度就可以变化可调了。这样,通过按键改变变量speed的值,就调速度了。
加一个for循环,定义一个值为100,或者更大,让循环里面是灯的亮,循环完事后立即去点亮另个灯,一直循环,这样看你控制几个灯,有点麻烦,最好和上面说的那样,定义几个延时子程序,灯亮调用这个,灭调用另一个时间短的
1、用精确定时的方法,设置流水灯运行时的时间间隔,延时时间为500MS。2、#include "reg51.h"首先写出单片机的头函数。3、#include "intrins.h"输入位移函数。4、unsigned int count=0,led;定义函数。5、输入主函数,定
1、使用延时函数:在单片机的程序中使用延时函数来控制彩灯的亮灭时间间隔。通过增加或减少延时时间,可以调节循环的速度。较短的延时时间将使彩灯循环速度更快,而较长的延时时间将使彩灯循环速度更慢。2、使用定时器:单片机
怎样调整单片机流水灯的快慢,请举个例子
while (1){ if (++i>x){ PORTC = LED_TABLE[j];if(++j > 15){ j = 0;x--;//这样,每循环一次,x就越来越小,速度就越快了,如果你觉得变化太慢,//那就x-=100,x-=200,减的越多,变化越快。}
设定一个变量做延时函数的传入参数,每循环一次,传入参数的值不断减少,延时函数不断减少,那样就加快发光速度了。
1 给你一个算法:可以利用定时计数器0 定时50毫秒 允许中断 再设置一个软件计数器(初始值为20)每当定时器定时时间到即50毫秒 计入中断服务程序后 软件计数器减1 等于0时 表示1秒钟到( 要重新给
就是改变定时间隔!用定时器时,改变定时器值,用延时子程序时,改变延时数值。
来说,想要让流水灯变慢点的话,就增加延时。这里将第二行指令D1: MOV R1,#20中的20改大,但是要小于256.比如D1: MOV R1,#200 如果想要流水灯快点的话,就是要减少延时时间。这里将第二行指令D1: MOV R1,#20中
1、使用延时函数:在单片机的程序中使用延时函数来控制彩灯的亮灭时间间隔。通过增加或减少延时时间,可以调节循环的速度。较短的延时时间将使彩灯循环速度更快,而较长的延时时间将使彩灯循环速度更慢。2、使用定时器:单片机
单片机做流水灯时,怎么使灯亮的时间长点,而延时到下一盏灯亮的时间短一点?
1、用精确定时的方法,设置流水灯运行时的时间间隔,延时时间为500MS。 2、#include "reg51.h"首先写出单片机的头函数。 3、#include "intrins.h"输入位移函数。 4、unsigned int count=0,led;定义函数。 5、输入主函数,定义单片机的端口,写入延时函数。 6、中断跳转,使流水灯运行起来。#include // 仿真 试试 #define uchar unsigned char #define uint unsigned int uchar i,t; uchar code tabled[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // 发光二极管 可以有很多方法 void delay(uint z) // 延时程序 { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void main() { t=100; while(1) { t--; // 延时时间减小 速度变快 if(t==5) t=100; // 到一定速度 恢复 最慢 for(i=0;i<8;i++) // 8 个发光二极管 循环亮 { P1=tabled[i]; // P1 口 发光二极管 delay(t); // 调用延时程序 } } }
P1初值1111 1110 做一个左移1位 那么需要一个中间数, 不能直接用P1, 可以写 x=0xfe;x=x<<1;P1=x;
《基于8051+Proteus仿真》案例 第01 篇基础程序设计 01 闪烁的LED /* 名称:闪烁的LED 说明:LED按设定的时间间隔闪烁 */ #include #define uchar unsigned char #define uint unsigned int sbit LED=P1^0; //延时 void DelayMS(uint x) { uchari; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { while(1) { LED=~LED; DelayMS(150); } } 02 从左到右的流水灯 /* 名称:从左到右的流水灯 说明:接在P0口的8个LED从左到右循环依次点亮,产生走马灯效果 */ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchari; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { P0=0xfe; while(1) { P0=_crol_(P0,1);//P0的值向左循环移动 DelayMS(150); } } 03 8只LED左右来回点亮 /* 名称:8只LED左右来回点亮 说明:程序利用循环移位函数_crol_和_cror_形成来回滚动的效果 */ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchari; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { uchari; P2=0x01; while(1) { for(i=0;i<7;i++) { P2=_crol_(P2,1);//P2的值向左循环移动 DelayMS(150); } for(i=0;i<7;i++) { P2=_cror_(P2,1);//P2的值向右循环移动 DelayMS(150); } } } 04 花样流水灯 /* 名称:花样流水灯 说明:16只LED分两组按预设的多种花样变换显示 */ #include #define uchar unsigned char #define uint unsigned int uchar code Pattern_P0[]= { 0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe, 0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff }; uchar code Pattern_P2[]= { 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf9,0xf3,0xe7,0xcf,0x9f,0x3f,0xff, 0xe7,0xdb,0xbd,0x7e,0xbd,0xdb,0xe7,0xff,0xe7,0xc3,0x81,0x00,0x81,0xc3,0xe7,0xff, 0xaa,0x55,0x18,0xff,0xf0,0x0f,0x00,0xff,0xf8,0xf1,0xe3,0xc7,0x8f,0x1f,0x3f,0x7f, 0x7f,0x3f,0x1f,0x8f,0xc7,0xe3,0xf1,0xf8,0xff,0x00,0x00,0xff,0xff,0x0f,0xf0,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f, 0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00, 0x00,0x80,0xc0,0xe0,0xf0,0xf8,0xfc,0xfe,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff, 0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff }; //延时 void DelayMS(uint x) { uchari; while(x--) { for(i=0;i<120;i++); } } //主程序 void main() { uchari; while(1) { //从数组中读取数据送至P0和P2口显示 for(i=0;i<136;i++) { P0=Pattern_P0[i]; P2=Pattern_P2[i]; DelayMS(100); } } } 05 LED模拟交通灯 /* 名称:LED模拟交通灯 说明:东西向绿灯亮若干秒,黄灯闪烁5次后红灯亮, 红灯亮后,南北向由红灯变为绿灯,若干秒后南北向黄灯闪烁5此后变红灯,东西向变绿灯,如此重复。 */ #include #define uchar unsigned char #define uint unsigned int sbit RED_A=P0^0; //东西向灯 sbit YELLOW_A=P0^1; sbit GREEN_A=P0^2; sbit RED_B=P0^3; //南北向灯 sbit YELLOW_B=P0^4; sbit GREEN_B=P0^5; uchar Flash_Count=0,Operation_Type=1; //闪烁次数,操作类型变量 //延时 void DelayMS(uint x) { uchari; while(x--)for(i=0;i<120;i++); } //交通灯切换 void Traffic_Light() { switch(Operation_Type) { case1: //东西向绿灯与南北向红灯亮 RED_A=1;YELLOW_A=1;GREEN_A=0; RED_B=0;YELLOW_B=1;GREEN_B=1; DelayMS(2000); Operation_Type=2; break; case2: //东西向黄灯闪烁,绿灯关闭 DelayMS(300); YELLOW_A=~YELLOW_A;GREEN_A=1; if(++Flash_Count!=10)return; //闪烁5次 Flash_Count=0; Operation_Type=3; break; case3: //东西向红灯,南北向绿灯亮 RED_A=0;YELLOW_A=1;GREEN_A=1; RED_B=1;YELLOW_B=1;GREEN_B=0; DelayMS(2000); Operation_Type=4; break; case4: //南北向黄灯闪烁5次 DelayMS(300); YELLOW_B=~YELLOW_B;GREEN_B=1; if(++Flash_Count!=10)return; Flash_Count=0; Operation_Type=1; } } //主程序 void main() { while(1)Traffic_Light(); } 06 单只数码管循环显示0~9 /* 名称:单只数码管循环显示0~9 说明:主程序中的循环语句反复将0~9的段码送至P0口,使数字0~9循环显示 */ #include #include #define uchar unsigned char #define uint unsigned int uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //延时 void DelayMS(uint x) { uchart; while(x--)for(t=0;t<120;t++); } //主程序 void main() { uchari=0; P0=0x00; while(1) {/* for(;i<11;i++){ P0=~DSY_CODE[i]; DelayMS(300);} //注:另一方案 */ P0=~DSY_CODE[i]; i=(i+1)%10; DelayMS(300); } } 07 8只数码管滚动显示单个数字 /* 名称:8只数码管滚动显示单个数字 说明:数码管从左到右依次滚动显示0~7,程序通过每次仅循环选通一只数码管 */ #include #include #define uchar unsigned char #define uint unsigned int uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //延时 void DelayMS(uint x) { uchart; while(x--)for(t=0;t<120;t++); } //主程序 void main() { uchari,wei=0x80; while(1) { for(i=0;i<8;i++) { P2=0xff; //关闭显示 wei=_crol_(wei,1); P0=DSY_CODE[i]; //发送数字段码 P2=wei; //发送位码 DelayMS(300); } } } 08 8只数码管动态显示多个不同字符 电路如上图 /* 名称:8只数码管动态显示多个不同字符 说明:数码管动态扫描显示0~7。 */ #include #include #define uchar unsigned char #define uint unsigned int uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //延时 void DelayMS(uint x) { uchart; while(x--)for(t=0;t<120;t++); } //主程序 void main() { uchari,wei=0x80; while(1) { for(i=0;i<8;i++) { P2=0xff; P0=DSY_CODE[i]; //发送段码 wei=_crol_(wei,1); P2=wei; //发送位码 DelayMS(2); } } } 09 8只数码管闪烁显示数字串 电路如上图 /* 名称:8只数码管闪烁显示数字串 说明:数码管闪烁显示由0~7构成的一串数字 本例用动态刷新法显示一串数字,在停止刷新时所有数字显示消失。 */ #include #define uchar unsigned char #define uint unsigned int //段码表 uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //位码表 uchar codeDSY_IDX[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //延时 void DelayMS(uint x) { uchart; while(x--)for(t=0;t<120;t++); } //主程序 void main() { uchari,j; while(1) { for(i=0;i<30;i++) { for(j=0;j<8;j++) { P0=0xff; P0=DSY_CODE[j]; //发送段码 P2=DSY_IDX[j]; //发送位码 DelayMS(2); } } P2=0x00; //关闭所有数码管并延时 DelayMS(1000); } } 10 8只数码管滚动显示数字串 电路如上图 /* 名称:8只数码管滚动显示数字串 说明:数码管向左滚动显示3个字符构成的数字串 */ #include #include #define uchar unsigned char #define uint unsigned int //段码表 uchar codeDSY_CODE[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0xff}; //下面数组看作环形队列,显示从某个数开始的8个数(10表示黑屏) uchar Num[]={10,10,10,10,10,10,10,10,2,9,8}; //延时 void DelayMS(uint x) { uchart; while(x--)for(t=0;t<120;t++); } //主程序 void main() { uchari,j,k=0,m=0x80; while(1) { //刷新若干次,保持一段时间的稳定显示 for(i=0;i<15;i++) { for(j=0;j<8;j++) { //发送段码,采用环形取法,从第k个开始取第j个 P0=0xff; P0=DSY_CODE[Num[(k+j)%11]]; m=_crol_(m,1); P2=m; //发送位码 DelayMS(2); } } k=(k+1)%11; //环形队列首支针k递增,Num下标范围0~10,故对11取余 } } 11 K1-K4 控制LED移位 /* 名称:K1-K4 控制LED移位 说明:按下K1时,P0口LED上移一位; 按下K2时,P0口LED下移一位; 按下K3时,P2口LED上移一位; 按下K4时,P2口LED下移一位; */ #include #include #define uchar unsigned char #define uint unsigned int //延时 void DelayMS(uint x) { uchari; while(x--)for(i=0;i<120;i++); } //根据P1口的按键移动LED void Move_LED() { if ((P1&0x10)==0) P0=_cror_(P0,1); //K1 elseif((P1&0x20)==0) P0=_crol_(P0,1); //K2 elseif((P1&0x40)==0) P2=_cror_(P2,1); //K3 elseif((P1&0x80)==0) P2=_crol_(P2,1); //K4 } //主程序 void main() { ucharRecent_Key; //最近按键 P0=0xfe; P2=0xfe; P1=0xff; Recent_Key=0xff; while(1) { if(Recent_Key!=P1) { Recent_Key=P1; //保存最近按键 Move_LED(); DelayMS(10); } } }
你可以简单地认为单片机只能输出5V或者0V的电压 分别对应1和0,那么LED灯的另一端接地或者接5V,如果你 的单片机输出5V接到LED灯,LED灯另一端接地 , 那就产生电压了,电路就导通了,灯就亮了 ,反之也是这个道理。时间方面可以写大致的延时,或者用定时器,这样就比较精确了,你学会了这个就可以说入门了。
流水灯哪三种模式?
单片机流水灯循环前不百一定要调用延时的,如果用定时器来调整时间的话,延时子程序就没有必要了。 时钟周期如果是12Mhz的话,每个时钟周期MC=6*2/12M=1us,所以延迟是让机器数到100万次,这个公式在24MHz时适用于它本身,它将是200万次。c语言的循环次数自己算,每个指令都有一个周期,所以楼上的程序在12Mhz有1s延迟。 扩展资料: (1)单片机的体积比较小,内部芯片作为计算机系统,其结构简单,但功能完善,使dao使用非常方便,可以模块化应用。 (2)单片机具有集成度高、可靠性较强的特点,即使是单片机在长时间的工作中也不会出现问题。 (3)单片机在应用中采用低电压、低能耗,是人们在日常生活中第一版的选择,便于生产和研发。 (4)单片机数据处理能力和操作能力较强,可应用于各种环境,具有较强的控制能力。 参考资料来源:百度百科-单片机
单片机流水灯循环前不百一定要调用延时的,如果用定时器来调整时间的话,延时子程序就没有必要了。 时钟周期如果是12Mhz的话,每个时钟周期MC=6*2/12M=1us,所以延迟是让机器数到100万次,这个公式在24MHz时适用于它本身,它将是200万次。c语言的循环次数自己算,每个指令都有一个周期,所以楼上的程序在12Mhz有1s延迟。 扩展资料: (1)单片机的体积比较小,内部芯片作为计算机系统,其结构简单,但功能完善,使dao使用非常方便,可以模块化应用。 (2)单片机具有集成度高、可靠性较强的特点,即使是单片机在长时间的工作中也不会出现问题。 (3)单片机在应用中采用低电压、低能耗,是人们在日常生活中第一版的选择,便于生产和研发。 (4)单片机数据处理能力和操作能力较强,可应用于各种环境,具有较强的控制能力。 参考资料来源:百度百科-单片机