keil软件用单片机控制8个LED流水灯来回点亮(C语言程序)
//==============================//8个LED 闪烁//-------------------------------------#include #include #define uchar unsigned char#define uint unsigned int//--------------------------------void DelayMS(uint ms){uchar t;while(ms--) for (t=0;t<120;t++);}//----------------------------------void main(){ P2= 0xfe;while (1){P2 =_crol_(P2,1);DelayMS(200);}}
ad10画流水灯,怎么把led.都摆齐
选中在PCB中的你要摆齐的流水灯,选工具栏的edit》align:(1)align left 左对齐;(2)align right 右对齐;(3)align top 上对齐;(4)align bottom 下对齐;选择你想要的一项对齐方式,如图:
51单片机
从原理图可以看出,如果我们想让接在P1.0口的LED1亮起来,那么我们只要把P1.0口的电平变为低电平就可以了;相反,如果要接在P1.0口的LED1熄灭,就要把P1.0口的电平变为高电平就可以;同理,接在P1.1~P1.7口的其他7个LED的点亮和熄灭方法方法同LED1。
因此,要实现流水灯功能,我们只要将LED2~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高、P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。
从上面中文表示看来实现单片机流水灯很简单,但是我们不能说P1.0你变低,它就变低了。
因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”机器代码。
我们又怎样来使单片机按我们的意思去工作呢?为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。
今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。
这里的“程序语言”目前主要有汇编语言和C语言两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。
前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。
现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。
实现8个LED流水灯汇编语言源程序 liu01.asm ;----- 主程序开始 ----- START: CLR P1.0 ;P1.0输出低电平,使LED1点亮 ACALL DELAY ;调用延时子程序 SETB P1.0 ;P1.0输出高电平,使LED1熄灭 CLR P1.1 ;P1.1输出低电平,使LED2点亮 ACALL DELAY ;调用延时子程序 SETB P1.1 ;P1.1输出高电平,使LED2熄灭 CLR P1.2 ;P1.2输出低电平,使LED3点亮 ACALL DELAY ;调用延时子程序 SETB P1.2 ;P1.2输出高电平,使LED3熄灭 CLR P1.3 ;P1.3输出低电平,使LED4点亮 ACALL DELAY ;调用延时子程序 SETB P1.3 ;P1.3输出高电平,使LED4熄灭 CLR P1.4 ;P1.4输出低电平,使LED5点亮 ACALL DELAY ;调用延时子程序 SETB P1.4 ;P1.4输出高电平,使LED5熄灭 CLR P1.5 ;P1.5输出低电平,使LED6点亮 ACALL DELAY ;调用延时子程序 SETB P1.5 ;P1.5输出高电平,使LED6熄灭 CLR P1.6 ;P1.6输出低电平,使LED7点亮 ACALL DELAY ;调用延时子程序 SETB P1.6 ;P1.6输出高电平,使LED7熄灭 CLR P1.7 ;P1.7输出低电平,使LED8点亮 ACALL DELAY ;调用延时子程序 SETB P1.7 ;P1.7输出高电平,使LED8熄灭 ACALL DELAY ;调用延时子程序 AJMP START ;8个LED流了一遍后返回到标号START处再循环 ;----- 延时子程序 ----- DELAY: MOV R0,#255 ;延时一段时间 D1: MOV R1,#255 DJNZ R1,$ DJNZ R0,D1 RET ;子程序返回 END ;程序结束 在上面主程序中用到了五条汇编语言指令:CLR、ACALL、SETB、LJMP、END。
CLR: 是将其后面指定的位清为0,程序中使对应端口输出低电平 ACALL:是子程序调用指令,程序中调用了DELAY延时子程序 SETB:是将其后面指定的位置成1,程序中使对应端口输出高电平 AJMP:是无条件跳转指令,意思是:跳转到指定的标号处继续运行 END: 是程序结束的伪指令,意思是告诉编译器,程序到此结束。
伪指令只告诉编译器此程序到此有何要求或条件,它不参与和影响程序的执行。
在上面源程序中"ACALL DELAY"指令的作用是调用DELAY延时子程序。
为什么要使用这指令呢?如果不用该指令能够实现"流水"效果吗?答案是肯定的,一定要用该指令才能看到我们需要的"流水"效果。
如果不用该指令,则由于8个LED发光与熄灭的时间都很短,我们肉眼无法看到LED的熄灭与点亮,凭我们肉眼看到的是LED1~LED8都同时亮(半亮),而看不到“流水”效果的!注:初学者可以将上面源程序中所有"ACALL DELAY"指令行删除后再编译后烧写到单片机进行验证一下。
产生这种现象主要是因为单片机执行每条指令的时间很短,我们知道实验板上单片机的时钟高达11.0592MHz,在这个时钟信号(即晶体振荡信号)下,一个“机器周期”仅大约1.08uS(微秒)。
本程序中我们用到的SETB P.x和CLR P.x均属于单周期指令,也就是说,执行一句 SETB P.x 用时仅1.08uS(微秒),CLR P.x 也是1.08uS(微秒);也就是点亮和熄灭时间都为1.08uS(微秒),在如此高速的流水速度下,8个LED发光与熄灭的时间都很短,当然凭我们的肉眼看不到“流水”效果了! 这里需要说明的是,按汇编语法要求,所编制的程序(下称源程序)之格式和书写要求必须依下列原则: 1、源程序必须为纯文本格式文件,如用Windows“附件”中的“记事本”编写的文本文件或用UltraEdit文本编辑器编辑; 2、源程序的扩展名应是 ...
如何用c语言编写流水灯?
C语言流水灯程序是学习的基础,一定要搞懂!给你发两个!(一)#include //51系列单片机定义文件#define uchar unsigned char //定义无符号字符#define uint unsigned int //定义无符号整数void delay(uint); //声明延时函数void main(){ uint i; uchar temp; while(1) { temp=0x01; for(i=0;i>=1; } temp=0xFE; for(i=0;i>=1; } }}void delay(uint a) //延时函数,毫秒级别{ uint i; while(--a!=0) //执行空操作循环,其中a为形参,由调用该函数的函数语句提供值 { for(i=0;i<125;i++);//执行当0加到125时,大约会用掉1ms的时间 }}(二)*****************************以下程序均采用12M晶振*****************************************************/#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned long sbit p2=P2^0;void main(){ TMOD=0x01; TR0=1; ET0=1; EA=1; while(1) { ; }}timer0() interrupt 1{ TH0=0x00; TL0=0x06; p2=!p2;}(三)定时流水灯//#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned longbit ldelay=0;void main(){ uchar led[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; uchar leda; TMOD=0x00; TR0=1; ET0=1; EA=1; while(1) { if(ldelay) { ldelay=0; P2=led[leda]; leda++; if(leda==9)leda=0; } }}timer2() interrupt 1{ static uchar t; TF0=0; t++; if(t==10) { t=0; ldelay=1; }} (四)变速流水灯//#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned longbit ldelay=0;uchar speed=100;void main(){ uchar led[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; uchar leda; TMOD=0x00; TR0=1; ET0=1; EA=1; while(1) { if(ldelay) { ldelay=0; P2=led[leda]; leda++; if(leda==9) { leda=0; speed-=10; if(speed==0)speed=100; } } }}timer2() interrupt 1{ static uchar t; TF0=0; t++; if(t==speed) { t=0; ldelay=1; }} (五)//每2两圈改变一次亮度#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned longbit ldelay=0;uchar speeda=30;uint k=0;void main(){ uchar led[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; uchar leda; uchar speed[10]={5,80,70,60,50,40,30,20,10,5}; uint i; uint k; TMOD=0x00; TR0=1; ET0=1; EA=1; while(1) { if(ldelay) { ldelay=0; P2=led[leda]; leda++; if(leda==9) { leda=0; k++; if(k==2){ k=0; speeda=speed[i]; i++; if(i==9)i=0; } } } }}timer2() interrupt 1{ static uchar t; TF0=0; t++; if(t==speeda) { t=0; ldelay=1; }} (六)//在上面基础上调灯的亮度(调占空比)#include#define uint unsigned int#define uchar unsigned char#define ulong unsigned longbit ldelay=0;uchar speeda=30;uint k=0;uchar scale; void main(){ uchar led[9]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0xff}; uchar leda; uchar speed[10]={5,80,70,60,50,40,30,20,10,5}; uint i; uint k; TMOD=0x00; TR0=1; ET0=1; EA=1; while(1) { if(ldelay==1) { ldelay=0; P2=led[leda]; leda++; scale++; if(scale==10)scale=0; if(leda==9) { leda=0; k++; if(k==2){ k=0; speeda=speed[i]; i++; if(i==9)i=0; } } } }}timer2() interrupt 1{ static uchar t; TH0=0x1c; TL0=0xbf; TF0=0; t++; if(t==speeda) { t=0; ldelay=1; } if(scale==10)P2=0; if(scale==0)P2=1;}
你系瞎子嘛