1、51单片机上电时,端口都是高电平的,只有运行程序,电平才可能产生变化。复位时,端口也是高电平。2、你这仿真图中,LED正端都接到电源了,负端接单片机IO,根据二极管正向导通原理,此时负端肯定要为低电平,二极管才
那么P1_0口灯灭,其它全亮。语句块括号不匹配。while(1)后面加大括号,如下 while(1){---加在此处。for(i=0;i<=7,i++)。。。P1=table[i];}---此处也多加个大括号 } }
if(count==16) //难道不是该到16才清0吗 0到7 8个 8到15 8个 { count=0; a=128; } P1=~a;} } 或者直接用循环左移或循环右移 #include
那么1,3,5,7灯对应的是0,所以是1,3,5,7灯亮,如果要2,4,6,8灯亮么只要按位取反P1=0b01010101=0x55就行了。要学单片机的话我建议你先找本数电的书看看吧,最基本的二进制码都没搞明白,难。
1.单片机启动时,端口为高电平即P1 = 0xff,时间比较的短,则会刚开始运行时八个灯全都亮。2.可以50ms定时20次,即TH0 = 0x3c,TL0 = 0xb0,这样误差会小一点。3.因为a为int型,16位的,而P1为8位的,所以第一
你用sbit定义的8行是小写字母p0~p7,可主程序中却又用了大写的P0~P7,这肯定错呀。C语言是区分大小写字母的。程序中必须用小写字母p0~p7,而不能用大写的P0~P7,因为P0~P3是单片机四个并行口,用户不能再定义了。其
单片机的流水灯程序,因为程序就这么写的,决定了流水灯左移7次,再右移7次,结束两个循环后,才能执行下面的while(!key),按键才有效,而在循环过程中,不执行while(!key),所以按键无效。下图画红框内的两个循环。要
用51单片机写了一个流水灯程序,有一点问题,请高手解惑
1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。例程:include
急求单片机流水灯程序及详解 100 第一步:8个发光二极管同时亮并且闪烁2次,闪烁间隔为0.3秒。第二步:8个发光二极管一个一个亮,间隔时间为0.5秒。第三步:开始时,8个发光二极管全部熄灭,0.3秒后一个被点亮,间隔0 第一步:8个
0xff;P0 = LED;while(1){ delayms(1000);LED = LED<<1; //循环右移1位,点亮下一个LED if(LED==0x00){ LED=0xff;} P0 = LED;} } 电路:就是普通的单片机IO口,采用灌电流方式就行,外接上拉电阻。
工具:STC系列51单片机、串口转换器(USB转TTL 或232转TTL)材料:实验板一块(可以买现成的,也可以买面包板自己搭建),电阻、LED灯 若干,5V电源等。以下程序可以直接用Keil C 直接编译执行。//可以通过左移函数_crol_
while(1){ P3=0xfe;//第一个灯亮 delay();//延时 P3=0xfd;//第二个灯亮 delay();P3=0xfb;//第三个灯亮 delay();P3=0xf7;//第四个灯亮 delay();P3=0xef;//第五个灯亮 delay();P3=0xdf;//第六
程序如下:include
1选用合适的单片机和LED灯,将它们连接在电路板上。2在单片机程序中编写代码,控制LED灯的亮灭状态。3在代码中指定LED灯的亮灭顺序,以及延时时间。通常采用循环结构进行控制。4在将代码烧录到单片机之后,启动实验,即可看到
如何用单片机简单制作一个流水灯
void){ uchar i;while(1){ P1 = 0xfe;for(i=0; i<7; i++){ P1 = _crol_(P0, 1); //用于循环左移 Delay(15);} } } 这是一个51单片机的P1口小灯循环左移的例子,不懂的问我。应该能用
include
C语言 include
P3=0xfe;//第一个灯亮 delay();//延时 P3=0xfd;//第二个灯亮 delay();P3=0xfb;//第三个灯亮 delay();P3=0xf7;//第四个灯亮 delay();P3=0xef;//第五个灯亮 delay();P3=0xdf;//第六个灯亮 delay
51单片机C语言实现循环8个流水灯左移三次,后右移三次。例程:include
51单片机C语言如何实现8个流水灯左移三次,后右移三次;如此循环
//右边补0,直接移位就可以temp<,=1; 如果流水灯只有一个亮,下面的程序就是对的,移位之后补1.include "reg51.h"void delay(unsigned char m);main(){ unsigned char temp;temp=0xfe; //temp=1111 1110,
/*单片机,用定时中断实现每隔0.2秒让接在P1口的8个小灯从左往右循环点亮。*/ #include #include #define uchar unsigned char uchar a,b; uchar b=1; uchar a=0xfe; void main() { EA=1;IT1=1;ET0=1;
双向循环 可以用左移右移指令 赋值 P1口 A=A<<1 循环左移一位 A=A>>1 循环右移一位
2 每当定时时间到中断 在中断服务程序中软件计数器减1(初始值为20)3 当软件计数器减到0时,表示0.5秒时间到 这时可以判断开关状态 开关合上 可以让8个LED左移一位 开关断开 可以让8个LED右移一位
左移流水灯(带进位的左移),即亮点向P0口的高位移动 DJNZ R2,LOOP MOV R2,#8 ;右移次数 LOOP1: RRC A ;右移流水灯 MOV P0,A LCALL DELAY DJNZ R2,LOOP1 LJMP START DELAY: MOV R5,#10
51单片机的c语言 左移右移怎么用?想用来控制流水灯,请帮忙写个完整的c程序,参考下,端口随意
单片机的流水灯程序,因为程序就这么写的,决定了流水灯左移7次,再右移7次,结束两个循环后,才能执行下面的while(!key),按键才有效,而在循环过程中,不执行while(!key),所以按键无效。下图画红框内的两个循环。要
对控制LED口的寄存器进行位操作,按k1左移,按K2就是右移了。51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内
{ P1= ~ j; // 对变量j 中的值按位取反后,从P1口输出 delay02s( ); // 延时0.2s j= j<<1; // 左移1位 } j=0x80; // 设置右移初始值j为0x80 for (i=0;i>1; // 右移1位 } } }
所谓左移。你换一面看就变右移了
是逻辑重复的问题。解决方法:0x01会两次,0x80也会两次,cnt到7就归0,cnt到8后归1,cnt到7归0要改判断逻辑。
LED灯右移到最右边后向左移时是这样的:右移一位→第二个延时程序→第一个延时程序→右移右移一位→第二个延时程序→第一个延时程序,这样不断循环,循环到最左边,就开始了右移的程序。这样左移的延迟大一点的!
关于单片机流水灯左移右移的问题?
这是8个流水灯加上3个控制开关,可先画出仿真图,才可以根据仿真图写程序。8个流水灯接在P1口,且二极管负极接P1口引脚,则P1口引脚输出低电平流水灯点亮。3个按键开关接在P3.4、P3.5、P3.6三个脚上。
51单片机 的左移右移,首先在开始要调用"intrins.h"的文件包,这个文件包含_cror_(右移),_crol_(左移);然后通过for语句来控制;for(m=20;m>0;m--)for(n=20;n>0;n--)for(k=250;k>0;k--);理解这三句
K1 EQU P1.0K2 EQU P1.1ORG 0000HLJMP MAINORG 0030HMAIN: MOV A,#0FEH CLR 00H CLR 01HLOOP: JB K1,LOOP1 SETB 00H CLR 01H SJMP LOOPLOOP1: JB K2,LOOP2 SETB 01H
P1口接8个流水灯,用两个开关K1和K2控制流水灯的方向,仿真图如下。
对控制LED口的寄存器进行位操作,按k1左移,按K2就是右移了。51单片机是对兼容英特尔8051指令系统的单片机的统称。51单片机广泛应用于家用电器、汽车、工业测控、通信设备中。因为51单片机的指令系统、内部结构相对简单,所以国内
如何实现51单片机的按键k1按下,LED流水灯向右移动,按键k2被按下,LED流水灯向左移动?
LED灯右移到最右边后向左移时是这样的:右移一位→第二个延时程序→第一个延时程序→右移右移一位→第二个延时程序→第一个延时程序,这样不断循环,循环到最左边,就开始了右移的程序。 这样左移的延迟大一点的!LED灯右移到最右边后向左移时是这样的:右移一位→第二个延时程序→第一个延时程序→右移右移一位→第二个延时程序→第一个延时程序,这样不断循环,循环到最左边,就开始了右移的程序。 这样左移的延迟大一点的!
#include "REG52.H" //控制引脚定义 sbit LED1 = PX.X; //P0.0-P3.7任意引脚 .... .... ....... sbit LED12 = PX.X; //宏定义灯亮灯灭 #define LED1_ON( ) LED1 =0 //阳极接电源 #define LED1_OFF( ) LED1 =1 //阳极接电源 ....... ............. ............. #define LED12_ON( ) LED12 =0 //阳极接电源 #define LED12_OFF( ) LED12 =1 //阳极接电源 void Init_GPIO( )//端口引脚初始化,关闭所有指示灯 { LED1_OFF( ) ; .............. LED12_OFF( ) ; } void Delay_ms( u16 dat ) //延时函数 { u16 i, j; for(i = dat; i>0; i--) { for (j=300; j>0; j--); } } int main( ) //主函数 { Init_GPIO( );//引脚初始化 while(1) //大循环 { LED1_ON( );//点亮第一个LED LED2_OFF( ); ............. LED12_OFF( ); Delay_ms(1000);//延时 参数自己可以根据晶振频率自己调节 LED1_OFF( ); //点亮第二个LED LED2_ON( ); LED3_OFF( ); ............. LED12_OFF( ); Delay_ms(1000); ............. //按照上面修改; LED1_OFF( );//点亮第十二个LED LED2_OFF ); LED3_OFF( ); ............. LED12_ON( ); Delay_ms(1000); } }
#include #define uchar unsigned char #define uint unsigned int void delayms(uint i) //1ms延时程序 { uint j; for(;i>0;i--) { for(j=0;j<164;j++) {;} } } void main(void) { uchar i; while(1) { for(i=0;i<8;i++) { P2=0X01<<i; delay_ms(200); } } }
1、51单片机C语言实现循环8个流水灯左移三次,后右移三次。例程: #include //51单片机头文件#include //包含有左右循环移位子函数的库#define uint unsigned int //宏定义#define uchar unsigned char //宏定义sbit beep=P2^3;void delay(uint z) //延时函数,z的取值为这个函数的延时ms数,如delay(200);大约延时200ms.{ //delay(500);大约延时500ms. uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); }void main() //主函数{ uchar a,i,j; while(1) //大循环 { a=0xfe; //赋初值 for(j=0;j<3;j++) for(i=0;i<8;i++) //左移三次 { P1=a; //点亮小灯 beep=0; //开启蜂鸣器 delay(50); //延时50毫秒 beep=1; //关闭蜂鸣器 delay(50); //再延时50毫秒 a=_crol_(a,1); //将a变量循环左移一位 } a=0x7f; for(j=0;j<3;j++) for(i=0;i<8;i++) //右移三次 { P1=a; //点亮小灯 beep=0; //开启蜂鸣器 delay(50); //延时50毫秒 beep=1; //关闭蜂鸣器 delay(50); //再延时50毫秒 a=_cror_(a,1); //将a变量循环右移一位 } }}2、51单片机是对所有兼容Intel 8031指令系统的单片机的统称。该系列单片机的始祖是Intel的8031单片机,后来随着Flash rom技术的发展,8031单片机取得了长足的进展,成为应用最广泛的8位单片机之一,其代表型号是ATMEL公司的AT89系列,它广泛应用于工业测控系统之中。很多公司都有51系列的兼容机型推出,今后很长的一段时间内将占有大量市场。51单片机是基础入门的一个单片机,还是应用最广泛的一种。
#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; } }
先做一个普通流水灯,学会以后,只要重新调整下灯的位置就可以做成各种花式。
楼主既然是做简易的流水灯,就没必要做PCB板,用万用板焊接就可以了。 如果是入门单片机的话,C语言是必须的。有一定的基础就可以了,建议楼主买一个51的开发板。然后按照附带的例程一步一步学习。这是入门,也是基础,是非常必要地。等你把开发板学的差不多了,就可以自己学习制作PCB板子,这个的关键就是学习AltiumDesigner软件。 这样吧,有什么具体的疑问可以联系我,这样泛泛而谈怕是对你作用不大。
第4题 89S51 单片机的P1 口接有 8个 LED,当某一端口输出为“0”时,相应的 LED 点亮,P3.2、P3.3、P3.4、P3.5 分别接有四个按钮 K1~K4,按下按钮时,相应引脚被接地。现要求编写可键控的流水灯程序,当 K1 按下时,开始流动,K2 按下时停止流动,全部灯灭,K3 使灯由上往下流动,K4 使灯由下往上流动。 #include "reg51.h" #include "intrins.h" #define uchar unsigned char void mDelay(unsigned int DelayTime) { unsigned int j=0; for(;DelayTime>0;DelayTime--) { for(j=0;j<125;j++) {;} }} uchar Key() { uchar KeyV; uchar tmp; P1=P1|0x3c; //四个按键所接位置 KeyV=P1; if((KeyV|0xc3)==0xff) //无键按下 return(0); mDelay(10); //延时,去键抖 KeyV=P1; if((KeyV|0xc3)==0xff) return(0); else { for(;;){ tmp=P1; if((tmp|0xc3)==0xff) break;} return(KeyV);}} void main() { unsigned char OutData=0xfe; bit UpDown=0; bit Start=0; uchar KValue; for(;;) { KValue=Key(); switch (KValue) { case 0xfb: //P3.2=0,Start { Start=1; break; } case 0xf7: //P3.3=0,Stop { Start=0; break; } case 0xef: //P3.4=0 Up { UpDown=1; break; } case 0xdf: //P3.5=0 Down { UpDown=0; break; } } if(Start) { if(UpDown) OutData=_crol_(OutData,1); else OutData=_cror_(OutData,1); P2=OutData; } else P2=0xff; //否则灯全灭 mDelay(1000); } }
#include"reg51.h"unsigned char s=0,a=128,count=0;void main(){ TMOD=0x01; TH0=0x3c; TL0=0xb0; TR0=1; P1=~a; ET0=1; EA=1; while(1); } void T0_srv() interrupt 1 using 1 { TH0=0x3c; TL0=0xb0; s++; if(s==20) { count++; s=0; if(count>1; else a=a a=_cror_(a,1); //循环右移