void delay(unsigned int z );void main(){ unsigned int a;unsigned char b=0xfe;for(a=0;a<8;a++){ P1=b;//P1口接8个LED灯 delay(200);b=_crol_ (b,1);} } void delay(unsigned int z){ unsigned
MAIN:MOVR1,#7;MOVA,#0FCH LOOP1:MOVP1,A RLA CALLDELAY DJNZR1,LOOP1 MOVP1,00H CALLDELAY CALLDELAY MOVR1,#7;MOVA,#3FH LOOP2:MOVP1,A CALLDELAY RRA DJNZR1,LOOP2 MOVP1,#00H CALLDELAY SJMP MAIN DEL
P3=0xbf;//第七个灯亮 delay();P3=0x7f;//第八个灯亮 delay();} }
//主程序 void main(){ uint s;while(1){ P0=0xfe;DelayMS(150);for(s=8;s>1;s--){ P0=_crol_(P0,1); //P0 的值向左循环移动 DelayMS(150);} P0=0x00;DelayMS(150);p0=0xff;DelayMS(150);
include
51单片机制作一个由一个按钮控制的8盏流水灯程序,要求按下按钮后流水灯先从左到右闪两次
跑马灯。网上一大把。我就解释下间隔一秒的那个,时间常数。看你用的定时器方式。一般用方式1。若频率是24mhz,机器周期为0.5us。所以计数次数为1s/0.5us=200000次超过了范围。所以用循环。可以50000循环4次或其他次数。
先写一个延时子函数delay,延时时间1秒。然后写LED=0;delay(1);LED=1;这样就可以做到一亮一灭,再把这段程序加入到循环中就可以,循环函数很简单不用再说了吧,如果还不懂回复我给你程序
SETB P0.1 ;关掉P0.1口LED灯 SJMP AJCX ;转移到按键查询程序 AJCL-3: ;按键处理程序 CALL XDYS ;调转消抖延时程序 JNB P1.2, $ ;查询P1.2等待 CLR P0.2 ;点燃P0.2口LED灯 CALL LDYS ;调亮灯延时 SETB
闪烁的话需要用到定时器,时间到了把当前P2对应的引脚取反一下就行了,比如当前P2.0 = 1; 定时器时间到了以后 ~P2.0 当然实际写程序的时候不能直接这么写,自己多复习下吧
延时一段时间;LED0=1;就可以看到闪烁了。
1. 假设 单片机输出低电平(0) LED 亮;2. 假设晶振为12M,则计数器 计数一次则为1uS;3. 假设你说的LED是一排(8个)都接在单片机P0口;4. 假设你说的是8个都同时亮,同时灭;5. 假设你说的是 亮 1S 然后
八个led灯用P0口控制。led负极接单片机。怎样用定时器写出让led闪烁的?时间为一秒。急。求c语言程序。单
图需要你自己画,代码没问题。能实现你的要求,延时要根据你的单片机晶振频率来确定。
开发环境 Keil C51系列 单片机C代码 include
define Frequency 12 //晶振几M的就改成几 define Time 5000*(Frequency/12)unsigned char counter=0;void initT0(){ TMOD=0x01;TH0=-Time/256;TL0=-Time%256;ET0=1;EA=1;TR0=1;}void intT0(void)i
8个 led 接在P1口
求大仙,给出“8个LED的闪烁控制,要求亮0.5s,灭0.5s,不断闪烁20次。”的C语言编程程序
ORG000bh AJMPint_timer ORG0030h main:MOVtmod,#01h;设置定时器工作方式寄存器。MOVth0,#high(65536-10000);MOVtl0,#low(65536-10000);设10MS初始值。MOVie,#82h;设置中断允许寄存器 MOV30h,#10;MOV31h,#6;30H和
while(1){ P2=led_data;//默认第一位亮 if(key==0)Delay_ms(10);if(key==0){ while(!key);Delay_ms(500); //延时0.5s led_data=_crol_(led_data,1);//移位函数,使led_date向左循环移动1位 } }
P2 = ~(0x80>>LEDIndex);if(LEDIndex==7) /*当一次循环结束时,把LEDDirection取反,下次循环时将以相反的顺序点亮*/ LEDDirection = !LEDDirection;LEDIndex = (LEDIndex+1)%8; /*LEDIndex+1对8取余,保证LED
1、单片机AT89C51的P2口接8个发光二极管,让这8个发光二极管显示闪烁功能,即八灯亮2S,熄灭3S,如此循环。参考程序:ORG 0000H start: MOV P1,#0H CALL delay MOV P1,#0FFH CALL delay CALL delay LJMP start delay:
ORG 0000H ajmp start org 50 START: MOV A,#00H LOOP: MOV P2,A CALL DELAY1 CPL A MOV P2,A CALL DELAY2 CPL A JMP LOOP DELAY1:MOV R5,#10 D1:MOV R6,#200 D2:MOV R7,#250 D3:DJNZ R7,D3 DJ
单片机AT89C51的P2口接8个LED,让这8个LED显示闪烁功能即8个LED1s熄灭2s如此循环,求完整程序
CALL PRG2 ; 灭且静音 SJMP 0 ;--- PRG1:MOV P0, #0 ; 8个led灯亮 MOV R2, #200 LP1:CPL P1.0 ; 蜂鸣器响 DJNZ R6,DJNZ R7, $ - 2 DJNZ R2, LP1 MOV P0, #255 ; 8个led灯灭
很简单,用rand函数和srand函数,这样将得到的值对8取余数,即rand%8,就可以点亮随机的灯了,至于其他如何点亮环节还有延时的你可以自己编写,想学单片机的人是必须学的,我也就不提示了,这只是个思路,要是全给你完整代
方法:1:设定一个变量i,可以从0到3循环的变化 2:检测一个经过消抖处理的按键,按一下,i+1 3:当i值为各个值时,执行相应的花样。流水灯参考程序 include include define uchar unsigned char uchar j,temp;void de
请设计一个8个led同时全部闪烁的程序 include
单片机 8个LED灯随机闪烁怎么做?
LED=LED<<1; 点亮的发光管,向左移动一位 if (P2==0x00) 判断是否8个全部点亮了 { LED=0xff; 如果全部点亮,则将全部发光管熄灭 } } } void Delay10ms(unsigned int c)延时函数主程序 { unsigned cha
{ //有必要的话,这里先对单片机各类寄存器进行初始化,这里因为简单,未做相关初始化工作 for(;;){ if(KEY1==0)//如果按键1被按下 {LED1=0;}//开启LED1灯 else{LED1=1;}//否则关闭LED1等,以下雷同if(
下次循环时将以相反的顺序点亮*/ LEDDirection = !LEDDirection;LEDIndex = (LEDIndex+1)%8; /*LEDIndex+1对8取余,保证LEDIndex在0~7之间*/ Delay1ms(500); /*延时500ms,即LED的点亮间隔为0.5s*/ } }
因为一般接io口的LED灯有个上拉高电平,io这端给他个低电平(0),造成电压差,就有电流通过,灯就亮了;反之,io给高电平(1),没有压差,无电流,灯灭。下面的你自己应该可以写了,锻炼下手。void delay(void){
include
Delay_ms(500); //延时0.5s led_data=_crol_(led_data,1);//移位函数,使led_date向左循环移动1位 } } } 向左转|向右转 已通过仿真,符合你的要求!
include
利用C51单片机控制8个LED灯同时闪烁的程序
1:设置一个变量zhidaoi,它可以从0循环到3 2:检测一个已取消缓冲的键。按“+1” 3:当I值为每个值时,执行相应的模式。 水量灯参考程序 #include #include #定义uchar无符号字符 Ucharj,温度; 无效延迟(无符号整型ms) { Uchart; (女士) 对于(t = 0;T < 123;T + +); } Voidmain() { P1=0XFF; 延迟(500); Temp=0xfe;//奇怪,led连接在P2.3~P2.6 对于(j = 0;J < 4;J + +) { P1=temp; 延迟(500); Temp=_crol_(Temp,1); } P1=0XFF; (1); } 扩展资料: 注意事项: #include“reg52。这个文件为单片机定义了一些特殊的功能寄存器 Typedef无符号int在16以下;//以声明的方式定义数据类型 无符号charu8; //LED灯 Sbitleda=P0; Sbitled1=P0^0; Sbitled2=P0^1; Sbitled3=P0^2; Sbitled4=P0^3; Sbitled5=P0^4; Sbitled6=P0^5; Sbitled7=P0^6; Sbitled8=P0^7; 无效延迟(16岁以下) { ,(我); } Voidmain() { 而(1) { 勒达=1;//所有的灯都亮着 //从左到右熄灭 Led1=0; 延迟(50000);//延迟时间约为450毫秒 Led2=0; 延迟(50000);//延迟时间约为450毫秒 Led3=0; 延迟(50000);//延迟时间约为450毫秒 Led4=0; 延迟(50000);//延迟时间约为450毫秒 Led5=0; 延迟(50000);//延迟时间约为450毫秒 Led6=0; 延迟(50000);//延迟时间约为450毫秒 Led7=0; 延迟(50000);//延迟时间约为450毫秒 Led8=0; 延迟(100000);//延迟大约900毫秒 //从右到左照明 Led8=1; 延迟(50000);//延迟时间约为450毫秒 Led7=1; 延迟(50000);//延迟时间约为450毫秒 Led6=1; 延迟(50000);//延迟时间约为450毫秒 Led5=1; 延迟(50000);//延迟时间约为450毫秒 Led4=1; 延迟(50000);//延迟时间约为450毫秒 Led3=1; 延迟(50000);//延迟时间约为450毫秒 Led2=1; 延迟(50000);//延迟时间约为450毫秒 Led1=1; 延迟(50000);//延迟时间约为450毫秒 勒达=1;//所有的灯都亮着 } }以51位例,使用P1的八个IO口控制。 先定义: sbit LED0=P1^0; sbit LED1=P1^1; ........ 以此类推,定义八个。 然后在主循环中: LED0=0; 延时一段时间; LED0=1; 就可以看到闪烁了。
1、首先在电脑中新建项目:Keil uVision4 51单片机LED闪烁编程,如下图所示。 2、然后设计单片机端口与LED灯相连,如下图所示,输入代码。 3、接着创建延迟函数,如下图所示,输入以下代码。 4、然后创建C语言主函数,如下图所示,输入以下代码。 5、接着输入对输出取反,最后调用延迟函数,如下图所示就完成了。
#include void Delay1ms(unsigned int count) /*延时函数,延迟时间为count×1ms)*/ { unsigned int i,j; for(i=0;i<count;i++) for(j=0;j<120;j++); } main() { unsigned char LEDIndex = 0; /*声明8位变量LEDIndex,用来指示8个LED中哪个被点亮,初始值为00000000*/ bit LEDDirection = 1; /*声明位变量LEDDirection,用来指示点亮的方向,初始值为1*/ while(1) /*一直循环执行大括号里面的语句*/ { if(LEDDirection) /*当LEDDirection=1时,0000 0001左移LEDIndex位,取反后送给P2端口,点亮一个LED*/ P2 = ~(0x01<<LEDIndex); else /*当LEDDirection=0时,1000 0000右移LEDIndex位,取反后送给P2端口,点亮一个LED*/ P2 = ~(0x80>>LEDIndex); if(LEDIndex==7) /*当一次循环结束时,把LEDDirection取反,下次循环时将以相反的顺序点亮*/ LEDDirection = !LEDDirection; LEDIndex = (LEDIndex+1)%8; /*LEDIndex+1对8取余,保证LEDIndex在0~7之间*/ Delay1ms(500); /*延时500ms,即LED的点亮间隔为0.5s*/ } }
间隔50MS的八个灯熄灭闪烁。
#include #define Frequency 12 //晶振几M的就改成几 #define Time 5000*(Frequency/12) unsigned char counter=0; 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; initT0(); while(1); }//实测图。如下:
应该可以的 你把两端初始化做成两个函数 需要哪一个的时候调用就可以了 我的想法是在中断程序中加一个变量,比如 void timer1() interrupt 3 { TH1=(65536-10000)/256; TL1=(65536-10000)%256; count++; count2++; } 利用count和count2,在主程序中判断是否达到某个值来实现,行不行? 比如当count==50时,是0.5s,当count2==1000时,是10s
#include #define uchar unsigned char uchar times,cnt; uchar led[]={0x00,0xff,0xfe,0xfc,0xf8,0xf0,0xe0,0xc0,0x80,0x00,0xff}; void t0isr() interrupt 1 { TH0=(65536-50000)/256; TL0=(65536-50000)%256; times++; if(times>=40) { times=0; P0=led[cnt]; cnt++; cnt%=11; } } main() { TMOD=0x01; TH0=(65536-50000)/256; TL0=(65536-50000)%256; TR0=1; ET0=1; EA=1; while(1); } //程序很简单,你自己加注释和完成其他工作吧。
应该是MOV P1,#0FFH 把,将P1口8位全置1(高电平),当P1口某位开关按下时为低电平。
#include#include#define uchar unsigned charsbit k1=P1^0;sbit k2=P1^1;sbit k3=P1^2;sbit k4=P1^3;void delay(uchar a){uchar i;while(a--)for(i=0;i<120;i++);}main(){uchar flag=0;uchar led=0xff;while(1) { if(k1==0) { delay(10); if(k1==0) { while(k1==0); flag=1; led=0xfe; } } if(k2==0) { delay(10); if(k2==0) { while(k2==0); flag=2; } } if(k3==0) { delay(10); if(k3==0) { while(k3==0); flag=3; } } if(k1==0) { delay(10); if(k4==0) { while(k4==0); flag=4; } } switch(flag) { case 1:P0=led;led=_crol_(led,1);delay(100);break; case 2:P0=0xff;led=0xff;break; case 3:P0=led;break; case 4:P0=led;led=_crol_(led,1);delay(100);break; default:break; } }}
# include "reg51.h" // 包含头文件 #define uchar unsigned char void delay02s(void) // 延时0.2s子程序 { unsigned char i,j,k; for ( i=2;i>0;i-- ) for (j=200;j>0;j-- ) for (k=250;k>0;k-- ); } void main (void) // 主函数 { uchar i,j; while (1) // 死循环 { j=0x01; // j初始化为0x01,左移初始值 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( ); j= j>>1; // 右移1位 } } } 这只是延时的方法实现的。