while(h==24)小时进一位,到24清0 { h=00;} } }

初值和你的单片机IO口工作状态有关,如果你的P1^0连接了LED,那么默认情况下,应该是为低电平,也就是D1=0, 而你的 D1=~D1放在了定时器中断里面,那么定时器溢出产生中断,且a=100时,D1会取反,也就是下次,D1=1,再下次D1又为0,也就是P1^0循环取反,所以与之相连的LED就会闪烁。

if(flag==3)flag=0;if(flag==0){正向流水} else if(flag==1){反向流水} else {间隔流水} }存在问题,由于流水灯执行时间较长,因此对按键响应缓慢,可以在流水灯之间加入按键检测语句,当检测到按键按下时,用break语句退出当前循环

以下是一个简单的51单片机程序,通过按下按键可以实现4种不同状态的灯亮灭,包括正闪、反闪、多种间隔闪。程序中使用了定时器来实现闪烁功能。程序中使用了P1.0到P1.3作为控制灯的引脚,P3.2作为按键的引脚。每当按下按键时,通过判断状态值来切换不同的灯亮灭模式。定时器中断函数用来实现灯的闪

51单片机1按键切换4种不同状态的灯的c程序??可以是正闪,反闪,多种间隔闪。

for(i=0;i<8;i++) // for循环语句,完成8个循环 { P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出 delay02s( ); // 延时0.2s j= j<<1; // 左移1位 } j=0x80; // 设置右移初始值j为0x80 for (i=0;i<8;i++){ P1= ~ j;delay02s(

void initT0(){ TMOD=0x01;TH0=-Time/256;TL0=-Time%256;ET0=1;EA=1;TR0=1;}void intT0(void)interrupt 1 { counter++;TH0=-Time/256;TL0=-Time%256;if(counter==100){ P1=~P1;counter=0; //定时器计5000次,counter 计100次,总计500000=500ms.} } void main(void){ P1=0

1、依次亮,依次灭:从一个灯亮到全亮,再到全灭,每次改变一个灯亮灭 2、奇偶号灯间隔亮灭:隔一个灯亮一个灯亮灯时间为1s,没有灯全灭的时候 3、依次闪烁、切换时间为3秒,闪烁时间为2秒,我理解的是,没三秒钟有一个灯在闪烁,其中有一秒钟是灭灯状态 程序中使用了P1口与8个发光二极管

// 51单片机控制八个发光二极管 左右循环。include define uchar unsigned char define uint unsigned int unsigned char TAB[]= {0xff,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0xff}; // 改变这里 LED 各种花样 uchar t

P1 = 0;//8个灯亮 DELAY(); //延时 P1 = 255; //8个灯灭 DELAY(); //延时 以上循环30遍,即可。

点灯的方法是由硬件连接方式决定的,以P1囗的8条引脚连接8只LED为例,8只LED共阳极连至电源,则P1口某位为0时,对应LED点亮,为1时LED熄灭。例如熄灭全部LED操作为 P1=0xFF,点亮第一只LED操作为 P1=0xFE,同时点亮第一,二只LED操作为 P1=0xFC,其它可类推。

if(Count_Sign<3) //2秒 OUT = 0xaa; //奇数 else if(Count_Sign>=3&&Count_Sign<=10) //8秒 OUT = 0x55; //偶数 else if(Count_Sign>10&&Count_Sign<=22) //12秒 OUT = 0x00; //全部 else if(Count_Sign>22)Count_Sign=Sign=0;Count_Sign++;} } 二、利用

51单片机定时器控制8个LED灯亮3秒灭8秒再亮12秒的程序

1 利用定时计数器0 工作在方式2 定时50毫秒 结合软件计数器(初始值选20)允许定时计数器中断 2 设计一个定时器0的中断服务程序 每50毫秒 就中断 在中断程序中软件计数器减1 当减到0时,表示1秒时间到 (重新送初始值20)判断拨动开关状态 如果为低低电平 则选择控制LED的端

下面是采用定时器定时1S(时钟晶振是11.0592MHz)的流水灯程序。采用左移函数_crol_(),此函数包含在intrinsic.h的头文件内。有不懂得再问,需要汇编的话,留言,再写给你。include include unsigned int a,temp;void main(){ TMOD=0x01;TH0=(65536-45872)/256;TL0=(65536

timetemp: DS 1 LED: DS 1 CSEG AT 00H ORG 0000H LJMP START ORG 000BH LJMP Timer0Interrupt START:MOV SP,#60H MOV timetemp,#20 MOV P1,#0FFH;LED低电平点亮 LCALL InitTimer0 MOV LED,#0FEH LOOP:MOV P1,LED ;add your code here!LJMP LOOP InitTimer0:MOV TMO

先写一个延时子函数delay,延时时间1秒。然后写LED=0;delay(1);LED=1;这样就可以做到一亮一灭,再把这段程序加入到循环中就可以,循环函数很简单不用再说了吧,如果还不懂回复我给你程序

51单片机用定时器,怎么编程流水灯一秒闪烁一次,

下面的程序我已经调试过了,你可以直接使用,但是一秒闪烁次数t的最大为2000,如果要大于这个数,你必须改小dalay1ms ()内的j值,就可以改大t include sbit LED0=P1^0;unsigned int t=0,k;void dalay1ms (unsigned int i) //晶振选用11.0592 { unsigned int j;for(i;i>0;i

1.最简方案——利用延时函数:进入主函数后,初始化LED,设置一个延时初始值,然后进入while循环,里边只做四件事,打开LED,利用键盘返回值作延时函数参数,关闭LED,利用键盘返回值作延时函数参数。2.精确解决方案——定时器:初始化定时器,打开中断等,然后进入while等待中断,在中断函数里先定义一个变

void delay(void) //两个void意思分别为无需返回值,没有参数传递。{ unsigned int i; //定义无符号整数,最大取值范围65535。for(i=0;i<20000;i++) //做20000次空循环。; //什么也不做,等待一个机器周期。} / 函数功能:主函数 (C语言规定必须有也只能有1个主函数)。/voi

include#defineucharunsignedcharuchartimes,led;sbitkey1=P1^0;sbitkey2=P1^1;voidt0isr()interrupt1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;times++;}voidrolled(){P0=led;led=(led>>1)|0x80;if(led==0xff)l

在无限循环中,不断检测K1和K2按键状态,以改变全局变量“freq”并控制LED灯的闪烁频率;然后使用一个计时器中断服务程序来控制LED灯的闪烁,具体实现方式请参考代码注释。最后,为了保证每个周期的闪烁持续时间与频率相符,应该在循环内部加入一个延时操作,等待一定时间再进入下一次循环。

请教c51单片机,c语言编程,关于控制LED灯闪烁频率?

#include #include #define uchar unsigned char #define uint unsigned int void DelayMS(uint x) { uchar i; while(x--) { for(i=120;i>0;i--); } } void main() { P0 = 0xFE; while(1) { P0 = _crol_(P0,1); DelayMS(500); } }
TF0 初始值为0。 TR0 = 1; //启动计数器0 启动后,TH0TL0就会自动加一。 如下: B800 B801 B802 …… 当加到0000时,TF0就自动为1。
#include“reg52.h” void yanshi() { };/////延伸函数一秒根据晶体的频率自己设置也可以用定时器的中断来设置1秒时间也可以用软件定时器; mian() { p1=0xff; yanshi(); p1=0x00; yanshi(); }
本来以为这个程序很简单的,没想到写了快三个小时。哎学艺不精啊。贴出来给你研究吧。我不想做过多的解释了,我是按我理解的你出的题目做的,可能和你的本意不是很一样, 1、依次亮,依次灭:从一个灯亮到全亮,再到全灭,每次改变一个灯亮灭 2、奇偶号灯间隔亮灭:隔一个灯亮一个灯亮灯时间为1s,没有灯全灭的时候 3、依次闪烁、切换时间为3秒,闪烁时间为2秒,我理解的是,没三秒钟有一个灯在闪烁,其中有一秒钟是灭灯状态 程序中使用了P1口与8个发光二极管相连,具体电路图你百度一下吧,还有使用了一个按键,该按键与P3.7相连,低电平为按下状态。 程序如下: #include #include /*变量声明: i、j、k都是记录计时器溢出次数的变量, stat是记录当前显示状态的变量,由按键key控制 temp是状态2中保护P1口状态的变量*/ unsigned char i=0,j=0,k=0,stat=0,temp; bit flag=1; //状态1处于灭灯还是亮灯状态的变量,1为依次亮灯,0为依次亮灯 sbit key=P3^7; //按键控制 void init(); //初始化函数 void delay(unsigned int N); //延时函数 void keyscan(); //键盘扫描函数 void main() { init(); while (1) { switch (stat) { case 0: //0方案 if(i==20&&flag) { i=0; P1=P1<<1; //依次亮灯 temp=P1; if(temp==0) { flag=0; } } if(i==20&&!flag) { i=0; if(P1==0xff) { flag=1; P1=0xfe; } if(!flag) { P1=P1<<1; //依次灭灯 temp=P1; P1=temp+1; } } break; case 1: //2方案 if(i==20) { i=0; P1=~P1; //去反后亮灯状态为灭灯,P1初值取0x55或0xaa,奇偶交替亮灯 } break; case 2: //3方案 if(j==60) { P1=temp; P1=_crol_(P1,1); temp=P1; //保护P1口亮灯状态 k=0; j=0; } //闪烁部分,应该可以优化 if(k<5) { P1=0xff; } else if(k>=5&&k<10) { P1=temp; } else if(k>=10&&k<15) { P1=0xff; } else if(k>=15&&k<20) { P1=temp; } else if(k>=20&&k<25) { P1=0xff; } else if(k>=30&&k<35) { P1=temp; } else if(k>=35&&k<40) { P1=0xff; } //----------------------------------- break; } keyscan(); } } void init() { TH0=0x3c; //定时器赋初值定时时间50ms TL0=0xB0; TMOD=0x01; //设置定时器工作方式为方式1 EA=1; //开总中断 ET0=1; //开中断允许位 TR0=1; //定时器计数 P1=0xfe; //这里假设led灯与P1口相连并且 //低电平有效 } void delay(unsigned int N) { int i,j; for (i=0;i<N;i++); for (j=0;j<110;j++); } void keyscan() { if(!key) { delay(10); //消抖 if(!key); //确认有键按下 stat++; if(stat==3) { stat=0; } //右键按下复位 i=0; j=0; k=0; TH0=0x3c; TL0=0xB0; switch (stat) { case 0: P1=0xfe; flag=1; stat=0; break; case 1: P1=0x55; break; case 2: P1=0xfe; temp=P1; break; } //----------------------------------- while(!key) //此循环中的函数和主函数中的显示函数是同一个 //用于长按键的显示,可以去掉,去掉长按键不会正常显示,松开按键后正常 { switch (stat) { case 0: if(i==20&&flag) { i=0; P1=P1<<1; temp=P1; if(temp==0) { flag=0; } } if(i==20&&!flag) { i=0; if(P1==0xff) { flag=1; P1=0xfe; } if(!flag) { P1=P1<<1; temp=P1; P1=temp+1; } } break; case 1: if(i==20) { i=0; P1=~P1; } break; case 2: if(j==60) { P1=temp; P1=_crol_(P1,1); temp=P1; k=0; j=0; } if(k<5) { P1=0xff; } else if(k>=5&&k<10) { P1=temp; } else if(k>=10&&k<15) { P1=0xff; } else if(k>=15&&k<20) { P1=temp; } else if(k>=20&&k<25) { P1=0xff; } else if(k>=30&&k<35) { P1=temp; } else if(k>=35&&k<40) { P1=0xff; } break; } } } } void timer0() interrupt 1 { TH0=0x3c; TL0=0xB0; //溢出后重新赋初值 //定时器中断时间为50ms i++; //20次中断时间为1s j++; //40次中断时间为2s k++; //60次中断时间为3s } 有什么不懂的可以百度Hi我