1、依次亮,依次灭:从一个灯亮到全亮,再到全灭,每次改变一个灯亮灭 2、奇偶号灯间隔亮灭:隔一个灯亮一个灯亮灯时间为1s,没有灯全灭的时候 3、依次闪烁、切换时间为3秒,闪烁时间为2秒,我理解的是,没三秒
P0 = 0x00; //P0.0~P0.7分别接八个发光二极管,刚开始全灭 while(1){ delay(1000);P0 = 0xc0;//点亮前两个发光二极管P0.0和P0.1;delay(1000);//延时1秒 P0 = 0x30;//点亮第三个和第四个LED delay(
51单片机定时器控制8个LED灯亮3秒灭8秒再亮12秒的程序 - 一、利用定时器实现:/***预处理命令***/#include
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、用精确定时的方法,设置流水灯运行时的时间间隔,延时时间为500MS。2、#include "reg51.h"首先写出单片机的头函数。3、#include "intrins.h"输入位移函数。4、unsigned int count=0,led;定义函数。5、输入主函数,
先说下思路,先初始化定时器间隔时间为0.2秒,之后开中断,在中断服务程序里对P1.0取反即可。外围电路需要设计么?因为单片机IO口驱动能力有限,建议你把P1.0接L1阴极,串上1K左右的限流电阻,L1阳极接VCC。部分程序如下
void main(){ TMOD|=0x01; //定时器0工作方式为1 TH0=(65536-50000)/256; //装初值 TL0=(65536-50000)%256;EA=1; //开总中断 ET0=1; //开定时器中断 TR0=1; //开启定时器 while(1); /
可以用一个数组存放LED灯的状态,在定时器里面为LED赋值数组里面的值就行 例如 LED_arr[10]= {0x81,0x42,0x24,0x18,0x24,0x42,0x81};LED = LED_arr[pos++];
//开定时器中断 TR0=1; //开启定时器 while(1); //等待中断}void timer0() interrupt 1{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; m++ ; if(m==5) //12M晶振 定时5*50MS=250MS { m=
51单片机C语言对流水灯编程,用定时中断做
ORG 0000H ; 试试这个 流水灯的编码随便改 LJMP MAIN ORG 0003H LJMP LINT0 ORG 000BH LJMP LT0ZD ORG 0030H MAIN: MOV SP, #60H MOV TMOD, #00H MOV IE, #81H MOV
定义定时器工作模式 SETB EA ;开中断 SETB ET0 SETB TR0 ;开定时器 HRER: SJMP HERE;循环等待 T0: MOV TH0,#;重新装填定时器(中断服务程序)MOV TL0,CPL P1.0;取反,控制灯的亮灭 RETI;终端返回
已经调试和仿真。用两种语言编写。程序中加了按键防抖和按键释放判断功能。/*STC51单片机编程实验第一课:彩灯控制器设计(跑马灯))*/ /*以下为汇编语言*/ key0bitP2.0 key1bitP2.1 org 0000h jmpstart org0030h
time=0;sbit key=P1^0;void t0isr() interrupt 1{TH0=(65536-50000)/256;TL0=(65536-50000)%256;led=_crol_(led,1);P0=led;time++;if(time>=200)TR0=0;
} 中断程序 void zhongduan() interrupt 0 { flag=!flag; }
51单片机定时器实现流水灯,并用按键外部中断控制改变流水灯的流向,这个程序怎么写?最好有注释,谢谢
二、片上资源丰富。MEGA系列片上具备JTAG仿真和下载功能。片内含有看门狗电路、片内程序Flash、片内数据RAM、同步串行接口SPI、异步串口UART、内嵌AD转换器、EEPROM、模拟比较器、PWM定时计数器、TWI(IIC)总线接口、硬件乘法器
一、#include
这个流水灯是很普通的一种花样,假设LED接P1口,程序如下:ORG 0000H LJMP MAIN 0RG 000BH LJMP T0ISR ORG 0030H MAIN:MOV TMOD,#01H MOV TH0,#HIGH(65536-50000) ;50毫秒定时 MOV TL0,#LOW(65536-50000)SET
定时的时间常数是X=65536-1000/2=15536=3CB0H。所以定时器初始化程序是 MOV TMOD, #10H MOV TH1,#3CH MOV TL1,#0B0H SETB TR1 MOV IE,#88H;开中断 剩下的就是P1口输出控制哪个灯亮就行了。
} 中断程序 void zhongduan() interrupt 0 { flag=!flag; }
先写一个延时子函数delay,延时时间1秒。然后写LED=0;delay(1);LED=1;这样就可以做到一亮一灭,再把这段程序加入到循环中就可以,循环函数很简单不用再说了吧,如果还不懂回复我给你程序
DSEG AT 30H 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 InitT
51单片机,用定时器中断,在P1口实现1S移动一次的流水灯,用汇编语言编写的程序
} void main (void) // 主函数 { uchar i,j; while (1) // 死循环 { j=0x01; // j初始化为0x01,左移初始值 for(i=0;i<8;i++) // for循环语句,完成8个循环 { P1= ~ j; // 对变量j 中
如果只用一个端口的话,你可以建一个表,如果LED是高电平点亮的话,里面存放数据0x81,0x42,0x24,0x18 如果LED是低电平点亮的话,里面存放数据 0x7e,0xbd,0xdb,0xe7 然后在循环里一直按照数组下标0到3递增3到0递减将
//流水灯#include "reg52.h"#define LED_PORT P3void delay(unsigned char time){ unsigned char i,j,k; for(i=0;i
这个流水灯程序最好用数组定义8个状态的灯,这样用for循环就可以实现了。简洁明了,易读性强,也容易理解。include
void disp_mode(uchar mode_1) //这个函数控制三个LED灯 { switch(mode_1){ case 0: //模式0,全灭 LED_H=1;LED_M=1;LED_S=1;TR0 = 1;break;case 1: //模式1,LED_S亮 LED_H=1;LED_M=1;LED_S
LED_arr[pos++];
51单片机C语言对流水灯编程,用定时中断做 LED等从两边向中间亮
可以用for循环试试unsingned char i;for(i=0;i<5;i++)//流水灯闪烁程序。若干个灯泡依次点亮就叫流水灯,它用在夜间建筑物装饰方面。例如在建筑物的棱角上装上流水灯,可起到变换闪烁美不胜收的效果。单片机(Single-
void timer0() interrupt 1 { uchar t;//定义变量 TF0=0;//定时器清0 t++; //中断一次累加1 if(t==20) //预置值,溢出20次就是1秒钟,晶振12MHZ { t=0;P3=~P3; //反转LED灯的亮灭 } } /***/
1 利用定时计数器0 工作在方式2 定时50毫秒 结合软件计数器(初始值选20)允许定时计数器中断 2 设计一个定时器0的中断服务程序 每50毫秒 就中断 在中断程序中软件计数器减1 当减到0时,表示1秒时间到
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,#
51单片机用定时器,怎么编程流水灯一秒闪烁一次,
#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。
一、实验要求:(1)、在proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路;(2)、继续在proteus软件中绘制电路,将p1口做输出口,接八只发光二极管;(3)、在keil软件中编写程序,实现功能间隔1s点亮一个发光二极管,顺序从p1.0到p1.7依次点亮;二、实验目的:(1)、学习proteus软件的,使用方法(2)、学习keil软件的使用方法(3)、学习端口输出的使用方法(4)、掌握延时程序的设计三、实验说明。在proteus软件中把实验要求的电路连接好,再利用keil软件把需要实现的功能编写程序,生成hex文件,把hes文件导入到proteus软件进行仿真。在编写程序时需要延时1s,我们选用的单片机是12MHz的,机器周期是12个时钟脉冲,一个时钟脉冲的时间是1/12微us,即一个周期为1us,程序中子函数void delay_ms(int x)中x为1 是可能延时1ms,以此类推可得1s=1000ms,当x=1000时刚好延时1s。四、硬件原理图及程序设计(1)、硬件原理图设计.电路中,p1.0到p1.7为LED控置端口,排阻RP1阻值为330兆,AT89c51单片机的9脚(RST)为复位引脚;31引脚(EA))为存取外部储存器使能引脚;单片机内部已接地,所以我们不用再接了。如下图所示(2)、程序流程图(3)、程序源代码【摘要】 求用51单片机实现16个流水灯依次点亮,间隔1秒,程序及电路图,设计思路,及所用元件参数!要求从右到左亮灯,在从左到右亮灯,用到了keil,和STC【提问】 一、实验要求: (1)、在proteus软件中画好51单片机最小核心电路,包括复位电路和晶振电路; (2)、继续在proteus软件中绘制电路,将p1口做输出口,接八只发光二极管; (3)、在keil软件中编写程序,实现功能间隔1s点亮一个发光二极管,顺序从p1.0到p1.7依次点亮; 二、实验目的: (1)、学习proteus软件的,使用方法 (2)、学习keil软件的使用方法 (3)、学习端口输出的使用方法 (4)、掌握延时程序的设计 三、实验说明。 在proteus软件中把实验要求的电路连接好,再利用keil软件把需要实现的功能编写程序,生成hex文件,把hes文件导入到proteus软件进行仿真。在编写程序时需要延时1s,我们选用的单片机是12MHz的,机器周期是12个时钟脉冲,一个时钟脉冲的时间是1/12微us,即一个周期为1us,程序中子函数void delay_ms(int x)中x为1 是可能延时1ms,以此类推可得1s=1000ms,当x=1000时刚好延时1s。 四、硬件原理图及程序设计 (1)、硬件原理图设计. 电路中,p1.0到p1.7为LED控置端口,排阻RP1阻值为330兆,AT89c51单片机的9脚(RST)为复位引脚;31引脚(EA))为存取外部储存器使能引脚;单片机内部已接地,所以我们不用再接了。如下图所示  (2)、程序流程图 (3)、程序源代码【回答】
流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下: ORG 0000H ;复位启动AJMP START ;ORG 001BH ;T1中断AJMP T1INT ; ;定义变量========================YSJS EQU 30H;延时计数器LED EQU 31H;LED控制缓冲器 ;主程序==========================START: MOV LED,#0FEH ;初始化数据MOV YSJS,#0 ;MOV TMOD,#10H ;定时器1工作于方式1,16位定时器MOV TL1,#0B0H ;设置定时初值MOV TH1,#3CH ;定时时间=50mSSETB ET1 ;使能定时器1中断SETB TR1 ;启动定时器1SETB EA ;开总中断 MOV P1,LED ;初始化流水灯LOOP: JMP LOOP ;循环等待中断T1INT: PUSH PSW ;定时器1中断程序PUSH ACC ;保护现场MOV TH1,#3CH ;定时时间=50mSMOV TL1,#0B0H ;INC YSJS ; PUSH ACC ;保护ACCMOV A,YSJI ;CJNE A,#2,QT1 ;50mS*2=100mSMOV P1,LED ;MOV A,LED ;RL A ;累加器A的值循环左移1位MOV LED,A ;MOV YSJS,#0 ;QT1: POP ACC ;恢复现场POP PSW ;RETI ;返回主程序END ;汇编程序结束 扩展资料: 实现流水灯的三个方法: 第一种,总线方法实现流水灯。这是一种比较笨但又最易理解的方法,采用顺序程序结构,用位指令控制P1口的每一个位输出高低电平,加上延时函数,即可控制每个LED灯的亮灭。 第二种,移位方法实现流水灯采用循环程序结构编程。首先在程序开始给P1.0口送一个低电平,其它位为高。然后延时一段时间再让低电平往高位移动,这样就实现“流水”的效果了。 第三种,库函数实现流水灯。利用左移函数进行。
定时器调成一秒就行了.
for(b=2;b<6;b++) { if(key_on()) OutData2=_cror_(OutData,b); else OutData2=_crol_(OutData,b); P3=OutData2; P2=0xff; delay1s(); }
#include#define uchar unsigned char uchar m=0,i=0; void main(){ TMOD|=0x01; //定时器0工作方式为1 TH0=(65536-50000)/256; //装初值 TL0=(65536-50000)%256; EA=1; //开总中断 ET0=1; //开定时器中断 TR0=1; //开启定时器 while(1); //等待中断}void timer0() interrupt 1{ TH0=(65536-50000)/256; TL0=(65536-50000)%256; m++ ; if(m==5) //12M晶振 定时5*50MS=250MS { m=0; P1=~(0X01<<i); //P1接8个LED if(++i==8) i=0; }}[补充] 延时函数是一种粗略计算延时时间的函数是通过让单片机执行空指令,达到等待延时的目的。经常被应用在对延时时间要求不太严格的场合。而定时器中断,则是通过对晶振时钟进行计数由于晶振的频率一般是很稳定的,所以晶振的脉冲频率基本稳定从而通过对脉冲进行计数即可得到准确的延时目的。中断延时函数和定时器中断延时没有明确的对应关系。主要是根据你的应用场合来确定使用哪种函数。
可以用一个数组存放LED灯的状态,在定时器里面为LED赋值数组里面的值就行 例如 LED_arr[10] = {0x81,0x42,0x24,0x18,0x24,0x42,0x81}; LED = LED_arr[pos++];
#include //51系列单片机定义文件 #define uchar unsigned char //定义无符号字符 #define uint unsigned int //定义无符号整数 void delay(uint); //声明延时函数 void main(void) { uint i; uchar temp; while(1) { temp=0xFE; for(i=0;i<8;i++) //8个流水灯依次全部点亮 { P1=temp; delay(500); //调用延时函数 temp<<=1; } }} void delay(uint t) //定义延时函数 { register uint bt; for(;t;t--) for(bt=0;bt<255;bt++); }
#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我