五种编程方式实现流水灯的单片机C程序
- 格式:doc
- 大小:21.51 KB
- 文档页数:5
说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。
那个单片机究竟有什么功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^)我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。
一般只须连接晶体、VCC、GND、RST即可,一般情况下,AT89C51的31脚须接高电平。
#include<reg51.h> //头文件定义。
或用#include<at89x51.h>其具体的区别在于:后者定义了更多的地址空间。
//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0; //定义管脚void main (void){while(1){P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}}就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。
因为我们把LED的正通过电阻接至VCC。
P1_0 = 0; 类似与C语言中的赋值语句,即把0 赋给单片机的P1_0引脚,让它输出相应的电平。
那么这样就能达到了我们预先的要求了。
while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。
如果我们要试着点亮其他的LED,也类似上述语句。
这里就不再讲了。
点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。
我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。
假设我们有8个LED分别接在P1口的8个引脚上。
硬件连接,在P1_1--P1_7上再接7个LED即可。
例程如下:#include<reg51.h>sbit P1_0 = P1 ^ 0;sbit P1_1 = P1 ^ 1;sbit P1_2 = P1 ^ 2;sbit P1_3 = P1 ^ 3;sbit P1_4 = P1 ^ 4;sbit P1_5 = P1 ^ 5;sbit P1_6 = P1 ^ 6;sbit P1_7 = P1 ^ 7;void Delay(unsigned char a){unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
五种编程方式实现流水灯的单片机C 程序//功能:采用顺序结构实现的流水灯控制程序/*此方式中采用的是字操作(也称为总线操作)*/#include<regvoiddelay(unsignedchari);//延时函数声明voidmain()//主函数{while(1){P1=Oxfe;//点亮第1 个发光二极管,delay(200);//延时P1=Oxfd;//点亮第2 个发光二极管,delay(200);//延时P1=Oxfb;//点亮第3 个发光二极管delay(200);//延时P1=0xf7;〃点亮第4 个发光二极管delay(200);//延时P1=Oxef;//点亮第5 个发光二极管delay(200);//延时P1=Oxdf;//点亮第6 个发光二极管delay(200);//延时P1=Oxbf;//点亮第7 个发光二极管delay(200);//延时P1=0x7f; 〃点亮第8 个发光二极管delay(200);//延时}}//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;//i 控制空循环的外循环次数,共循环i*255 次//返回值:无voiddelay(unsignedchari)//延时函数,无符号字符型变量i 为形式参数{unsignedcharj,k;〃定义无符号字符型变量j 和kfor(k=0;k<i;k++) 〃双重for 循环语句实现软件延时for(j=0;j<255;j++);}//功能:采用循环结构实现的流水灯控制程序//此方式中采用的移位,按位取反等操作是位操作#include<reg包含头文件REGvoiddelay(unsignedchari); 〃延时函数声明voidmain()//主函数{unsignedchari,w;while(1){w=0x01;//信号灯显示字初值为01Hfor(i=0;i<8;i++){P1=~w;//显示字取反后,送P1 口delay(200);//延时w<<=1;//显示字左移一位}}}//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;//i 控制空循环的外循环次数,共循环i*255 次//返回值:无voiddelay(unsignedchari)//延时函数,无符号字符型变量i 为形式参数{unsignedcharj,k;〃定义无符号字符型变量j 和kj++);}/******// 功能:for(k=0;k<i;k++) 〃双重for 循环语句实现软件延时for(j=0;j<255;***************************************************************采用位运算符编写的流水灯控制程序,显示效果为挨次熄灭信号灯//此方式也是典型的顺序结构#include<regvoiddelay(unsignedchari); 〃延时函数声明voidmain()//主函数{while(1){P1=OxOO;〃P1 口全部清0,即点亮8 个发光二极管delay(200);//延时P1=P1|0x01;//熄灭第1 个发光二极管delay(200);//延时P1=P1|0x03;//熄灭第1、个发光二极管delay (200);//延时P1=P1|0x07;//熄灭第1〜3 个发光二极管delay(200);//延时P1=P1|0x0f;//熄灭第1〜4 个发光二极管delay(200);//延时P1=P1|0x1f;//熄灭第1〜5 个发光二极管delay(200);//延时P1=P1|0x3f; 〃熄灭第1〜6 个发光二极管delay(200);//延时P1=P1|0x7f; 〃熄灭第1〜7 个发光二极管delay(200);//延时P1=P1|0x7f;//熄灭所有发光二极管delay(200);//延时}}//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;//i 控制空循环的外循环次数,共循环i*255 次//返回值:无voiddelay(unsignedchari)//延时函数,无符号字符型变量i 为形式参数{unsignedcharj,k;〃定义无符号字符型变量j 和kfor(k=0;k<i;k++) 〃双重for 循环语句实现软件延时for(j=0;j<255;j++);}/**********************************************************///功能:采用数组实现的流水灯控制程序//此方式也是典型的循环结构#include<reg包含头文件REGvoiddelay(unsignedchari); 〃延时函数声明voidmain()//主函数{unsignedchari;unsignedchardisplay[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};while(1){for(i=0;i<8;i++){P1=display[i]; 〃显示字送P1 口delay(200);//延时}}}//函数名:delay//函数功能:实现软件延时//形式参数:unsignedchari;//i 控制空循环的外循环次数,共循环i*255 次//返回值:无voiddelay(unsignedchari)//延时函数,无符号字符型变量i 为形式参数{unsignedcharj,k;〃定义无符号字符型变量j 和kfor(k=0;k<i;k++) 〃双重for 循环语句实现软件延时for(j=0;j<255;j++);}#include<reg#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharvoiddelay(uintz){uintx,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}voidmain(){uchara,i,j;while(1){for(j=0;j<2;j++){a=0xfe;for(i=0;i<8;i++){P2=a; delay(200);a=_crol_(a,1);//11110}a=0x7f;for(i=0;i<8;i++){P2=a; delay(200);a=_cror_(a,1);}}P2=0xff;for(j=0;j<10;j++)}}{}delay(300);P2=~P2;。
用单片机设计流水灯的方法和程序编写-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIANS51增强型单片机实验板上有8个高亮度发光二极管(见图1所示),可以用来做单片机流水灯、跑马灯。
等实验,电路原理图见下图3。
图3单片机流水灯设计方法从原理图可以看出,如果我们想让接在口的LED1亮起来,那么我们只要把口的电平变为低电平就可以了;相反,如果要接在口的LED1熄灭,就要把口的电平变为高电平就可以;同理,接在~口的其他7个LED的点亮和熄灭方法方法同LED1。
因此,要实现流水灯功能,我们只要将LED2~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、低、延时、高、返回到开始、程序结束。
从上面中文表示看来实现单片机流水灯很简单,但是我们不能说你变低,它就变低了。
因为单片机听不懂我们的汉语的,只能接受二进制的“1、0......”机器代码。
我们又怎样来使单片机按我们的意思去工作呢为了让单片机工作,只能将程序写为二进制代码交给其执行;早期单片机开发人员就是使用人工编写的二进制代码交给单片机去工作的。
今天,我们不必用烦人的二进制去编写程序,完全可以将我们容易理解的“程序语言”通过“翻译”软件“翻译”成单片机所需的二进制代码,然后交给单片机去执行。
这里的“程序语言”目前主要有汇编语言和C语言两种;在这里我们所说的“翻译”软件,同行们都叫它为“编译器”,将“程序语言”通过编译器产生单片机的二进制代码的过程叫编译。
前面说到,要想使LED1变亮,只需将对应的单片机引脚电平变为低电平就可以了。
现在让我们将上面提到的8只LED流水灯实验写为汇编语言程序。
在上面主程序中用到了五条汇编语言指令:CLR、ACALL、SETB、LJMP、EN D。
CLR:是将其后面指定的位清为0,程序中使对应端口输出低电平ACALL:是子程序调用指令,程序中调用了DELAY延时子程序SETB:是将其后面指定的位置成1,程序中使对应端口输出高电平AJMP:是无条件跳转指令,意思是:跳转到指定的标号处继续运行END:是程序结束的伪指令,意思是告诉编译器,程序到此结束。
五种编程方式实现流水灯的单片机C程序流水灯是一种常见的灯光效果,常用于装饰和展示。
实现流水灯的程序可以使用多种不同的编程方式,包括传统的顺序编程、状态机编程、中断编程、调度器编程和面向对象编程。
下面分别介绍这五种方式实现流水灯的程序。
1.顺序编程方式:顺序编程是最常见的编程方式,也是最直接的方式。
下面是使用顺序编程方式实现流水灯的C程序:```c#include <reg52.h>void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainunsigned char led = 0x80; // 初始灯光状态while(1)P0 = led; // 输出灯光状态delay(500); // 延时一段时间led >>= 1; // 右移一位,实现流水灯效果if(led == 0) // 到达最右边后重新开始led = 0x80;}}```2.状态机编程方式:状态机编程是一种基于状态的编程方式,通过定义不同的状态和状态转换来实现流水灯效果。
下面是使用状态机编程方式实现流水灯的C程序:```c#include <reg52.h>typedef enumState1,State2,State3,State4,State5} State;void delay(unsigned int t)while(t--)for(int i=0; i<50; i++);}void mainState state = State1; // 初始状态为State1 while(1)switch(state)case State1:P0=0x80;delay(500);state = State2;break;case State2:P0=0x40;delay(500);state = State3;break;case State3:P0=0x20;delay(500);state = State4;break;case State4:P0=0x10;delay(500);state = State5;break;case State5:P0=0x08;delay(500);state = State1;break;}}```3.中断编程方式:中断编程方式是一种基于中断事件的编程方式,通过在特定的中断事件触发时改变灯光状态来实现流水灯效果。
目录流水灯最原始 (1)流水灯位左移 (3)流水灯移位函数 (4)流水灯数组 (5)流水灯精确定时器 (6)流水灯最原始#include "reg51.h"sbit p0=P1^0;sbit p1=P1^1;sbit p2=P1^2;sbit p3=P1^3;sbit p4=P1^4;sbit p5=P1^5;sbit p6=P1^6;sbit p7=P1^7;voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){while(1){P1=0;p0=1;mdelay(1000);p0=0;p1=1;mdelay(1000);p1=0;p2=1;mdelay(1000);p2=0;p3=1;mdelay(1000);p3=0;p4=1;mdelay(1000);p4=0;p5=1;mdelay(1000);p5=0;p6=1;mdelay(1000);p6=0;p7=1;mdelay(1000);p7=0;}}流水灯位左移#include "reg51.h"voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char i;unsignedint led;while(1){led=0xfe;for(i=0;i<8;i++){P1=led;mdelay(1000);led=led<<1;led=led|0x01;}}}流水灯移位函数#include "reg51.h"#include "intrins.h"voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char led;led=0x01;while(1){P1=led;led=_crol_(led,1);mdelay(1000);}}流水灯数组#include "reg51.h"unsigned char table[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; voidmdelay(unsigned int t){unsigned char n;for(;t>0;t--)for(n=0;n<125;n++){;}}void main(){unsigned char i;while(1){for(i=0;i<8;i++){P1=table[i];mdelay(1000);}}}流水灯精确定时器#include "reg51.h"#include "intrins.h"unsignedint count=0,led;void main(){P1=0x00;led=0x01;EA=1;ET0=1;TMOD=0x01;TH0=0x3c;TL0=0xb0;TR0=1;for(;;){;}}voidbiao() interrupt 1{count++;if(count==20){count=0;P1=led;led=_crol_(led,1);}TH0=0x3c;TL0=0xb0;}。
基于51单片机的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<8;i++) //8个流水灯逐个闪动{P2=~temp;delay(500); //调用延时函数temp<<=1;}temp=0x80;for(i=0;i<8;i++) //8个流水灯反向逐个闪动{P2=~temp;delay(500); //调用延时函数temp>>=1;}temp=0xFE;for(i=0;i<8;i++) //8个流水灯依次全部点亮{P2=temp;delay(500); //调用延时函数temp<<=1;}temp=0x7F;for(i=0;i<8;i++) //8个流水灯依次反向全部点亮{P2=temp;delay(500); //调用延时函数temp>>=1;}}}void delay(uint a) //延时函数,毫秒级别{uint i;while(--a!=0) //执行空操作循环,其中a为形参,由调用该函数的函数语句提供值{for(i=0;i<125;i++);//执行当0加到125时,大约会用掉1ms 的时间}}。
单片机流水灯汇编程序设计开发板上的8只LED为共阳极连接,即单片机输出端为低电平时即可点亮LED。
程序A:;用最直接的方式实现流水灯ORG 0000HSTART:MOV P1,#01111111B ;最下面的LED点亮LCALL DELAY;延时1秒MOV P1,#10111111B ;最下面第二个的LED点亮LCALL DELAY;延时1秒MOV P1,#11011111B ;最下面第三个的LED点亮(以下省略)LCALL DELAYMOV P1,#11101111BLCALL DELAYMOV P1,#11110111BLCALL DELAYMOV P1,#11111011BLCALL DELAYMOV P1,#11111101BLCALL DELAYMOV P1,#11111110BLCALL DELAYMOV P1,#11111111B ;完成第一次循环点亮,延时约0.25秒AJMP START ;反复循环;延时子程序,12M晶振延时约250毫秒DELAY:MOV R4,#2L3: MOV R2 ,#250L1: MOV R3 ,#250L2: DJNZ R3 ,L2DJNZ R2 ,L1DJNZ R4 ,L3RETEND程序B:;用移位方式实现流水灯org 00h ;程序上电从00h开始ajmp main ;跳转到主程序org 0030h ;主程序起始地址main:mov a,#0feh ;给A赋值成11111110loop:mov p1,a ;将A送到P1口,发光二极管低电平点亮lcall delay ;调用延时子程序rl a ;累加器A循环左移一位ajmp loop ;重新送P1显示delay:mov r3,#20 ;最外层循环二十次d1:mov r4,#80 ;次外层循环八十次d2:mov r5,#250 ;最内层循环250次djnz r5,$ ;总共延时2us*250*80*20=0.8Sdjnz r4,d2djnz r3,d1retend51单片机经典流水灯程序,在51单片机的P2口接上8个发光二极管,产生流水灯的移动效果。
1、用Proteus软件画出电路原理图。
要求在P1.0至P1.7口线上分别接LED0至LED7八个发光二极管,在P3.0口线上接一蜂鸣器。
2、编写程序:要求LED0至LED7以秒速率循环右移。
3、编写程序:要求LED0至LED7以秒速率循环左移。
4、编写程序:要求在灯移动的同时,蜂鸣器逐位报警。
查询方式右移ORG 0000HCLRO: MOV IE, #00H;关闭中断MOV TMOD, #10H;方式1MOV SP, #30H; 开辟栈底MOV TH1, #3CH;采用定时器1定时50msMOV TL1, #0B0H;SETB TR1;开启定时器MOV P1, #07FH;起始状态LED7亮MOV A, #7FH;MOV P3, #0FFH;MAIN: MOV R3,#14H;20次LCALL TIME; 定时一秒CLR P3.0;RR A;右移MOV P1, A;灯右移LJMP MAIN;定时一秒的子程序TIME: JBC TF1, LOOP2;溢出标志位为1跳转AJMP TIME;LOOP2: MOV TH1, #3CH;MOV TL1, #0B0H;DJNZ R3, TIME;R3先自减再,判断R3是否为0,为0跳转RET;返回主程序END中断方式左移低电平有效START: LJMP MAINORG 000BHLJMP TTCOORG 0100HMAIN: MOV SP, #30H; 开辟栈底SETB EA; 打开总中断SETB ET0; 打开定时器中断MOV R1, #00H;MOV R2, #14H;MOV A, #0FEH; 给A送值MOV P1, A;初始状态LED0亮LOOP: LCALL TIME;调用一秒的延时子程序RL A;左移MOV P1, A;灯左移CLR P3.0;开启蜂鸣器LJMP LOOP;定时为1S,TIME: MOV TMOD, #01H; 设置定时器为工作方式1MOV TH0, #3CH; 初始化定时时间50usMOV TL0, #0B0H;SETB TR0;LOOP2: CJNE R1, #14H, LOOP2; 出现R1=14H才往下执行,MOV R1, #00H;RETORG 2000H中断程序TTCO: MOV TH0, #3CHMOV TL0, #0B0H; 再次初始化定时时间INC R1LOOP1: RETIEND双向流水灯循环ORG 0000HLJMP MAINORG 000BHLJMP TTC0MAIN: MOV R0, #08HMOV R1, #00HMOV A, #0FEHSETB EASETB ET0;LOOP1: LCALL TIMEMOV P1, ARL ACPL P3.0;DJNZ R0, LOOP1MOV R0,#08H;LOOP2: LCALL TIMERR A ;MOV P1,A;CPL P3.0DJNZ R0, LOOP2;MOV R0,#08H;LJMP LOOP1;TIME: MOV TMOD, #01HMOV TH0, #3CHMOV TL0, #0B0HSETB TR0;HERE: CJNE R1, #14H, HEREMOV R1, #00HRETORG 2000HTTC0: INC R1;MOV TH0, #3CHMOV TL0, #0B0HRETIEND十六进制数,12MHZ,ORG 0000HCLRO: MOV IE, #00H;MOV TMOD, #10H;方式1MOV TH1, #3CH;定时器1定时50msMOV TL1, #0B0H;SETB TR1;开始定时器MOV R3, #00H;MOV P1, #0FFH;led初始全灭MOV A, #00H;MOV P3, #0FFH;MOV SP, #30H;开辟堆栈MAIN: LCALL TIME;MOV R3, #00H;ADDC A, #01H;高电平有效MOV R2, A;保护A,CPL A;对A取反MOV P1, A;把A赋格P1MOV A, R2;取出以前的ACLR P3.0;开启蜂鸣器CJNE A, #0FFH, MAIN;MOV A, #00H;清零重新开始LJMP MAIN;延时1ms子程序TIME: JBC TF1, LOOP2;溢出标志位AJMP TIME;LOOP2: INC R3;MOV TH1, #3CH;MOV TL1, #0B0H;CJNE R3, #14H, TIME;执行20次RETENDLED0表示第七位--LED7表示第0位ORG 0000H ; 十六进制计数规律翻转亮灯(由原来子程序——查询改写)MAIN: MOV A, #01HCLR EAMOV R0, #14H;定20次MOV P1, #80HLOOP1: LCALL DELAYMOV R0, #14HINC AMOV 20H, A; 将A的值存入20H位寻址区JB 20H.0, FZ1; 判断20H.0是否为1NEXT1: JB 20H.1, FZ2; 。
For personal use only in study and research; not for commercial use51单片机常见的五种流水灯编写方式通过改变赋值实现流水灯void main(){while(1){P2=0xfe;delay1ms(500);P2=0xfd;delay1ms(500);P2=0xfb;delay1ms(500);P2=0xf7;delay1ms(500);P2=0xef;delay1ms(500);P2=0xdf;delay1ms(500);P2=0xbf;delay1ms(500);P2=0x7f;delay1ms(500);}}通过公式运算实现流水灯void main(){while(1){uint a,b=1;P2=0xfe;delayms(500);for(a=0;a<7;a++){P2-=b; // P2=P2-bdelayms(500);b=b*2; //都化为同一类型进制运算}}}通过操作符<<与“|”实现流水灯(通过移位实现流水灯)void main(){uchar a,i;while(1){a=0xfe; //点亮第一位LED灯for(i=0;i<8;i++){P2=a;a=a<<1; //左移一位a=a|0x01; //左移一位后与0x01相或,保证左移后最低位为1 delay_ms(500);}}}通过库函数_crol_(字符左移)实现流水灯void main(){uint a;a=0xfe;while(1){P2=a;a=_crol_(a,1);delay_ms(500);}}采用数组实现流水灯uchar code table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};void main(void){uchar i;while (1){for(i=0;i<8;i++) //循环点亮8只LED灯{P2=table[i];delay_ms(500); //延时500毫秒}}}For personal use only in study and research; not for commercial use.Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden.Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.以下无正文For personal use only in study and research; not for commercial use.Nur für den persönlichen für Studien, Forschung, zu kommerziellen Zwecken verwendet werden.Pour l 'étude et la recherche uniquement à des fins personnelles; pas à des fins commerciales.толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.以下无正文。
单片机控制流水灯程序汇编语言随着科技的发展和微电子技术的迅猛进步,单片机逐渐成为智能系统与设备中不可或缺的组成部分。
而流水灯作为最基础的应用之一,不仅在学习过程中具有重要意义,同时也在实际工程中发挥着重要作用。
本文将介绍如何使用汇编语言编写单片机控制流水灯程序,并详细讲解其运行原理和实现方法。
一、流水灯原理流水灯是一种由多个LED组成的灯条或灯链,在按照一定次序依次点亮和熄灭的灯光效果。
其原理基于单片机通过控制输出口的电平高低来控制LED的亮灭状态,实现灯光的变化和移动效果。
二、程序设计方法1. 初始化设置在编写流水灯程序之前,我们首先要了解单片机的相应接口和寄存器的使用方法。
在程序开始时,需要进行相应的初始化设置,包括将数据方向寄存器和端口寄存器设置为输出,并将初始值赋予输出口电平。
例如,对于51单片机,可以使用以下汇编语言代码进行初始化设置:MOV P1, #00H ;将P1端口的输出电平置为低电平MOV P1M1, #FFH ;将P1端口的数据方向设置为输出MOV P1M0, #00H2. 主程序在流水灯程序中,需要编写主程序来实现流水灯的效果。
主程序中使用循环结构控制LED的亮灭状态和移动效果。
例如,以下是一个简单的汇编语言代码,实现了由4个LED组成的流水灯的效果:MOV R0, #F0H ;初始亮灭状态MOV R1, #00H ;初始LED位置LOOP: ;循环MOV P1, R0 ;将亮灭状态赋予P1端口的输出电平ACALL DELAY ;延时,形成流水灯效果MOV A, R1SUBB A, #01H ;将LED位置减一MOV R1, AJZ CHANGE ;当LED位置为零时,改变亮灭状态MOV R0, R0SJMP LOOP ;继续循环CHANGE: ;改变亮灭状态CPL R0 ;对亮灭状态进行取反操作SJMP LOOP ;继续循环3. 延时函数为了实现流水灯的移动效果,需要设置一个合适的延时时间来控制LED的亮灭速度。
说了这么多了,相信你也看了很多资料了,手头应该也有必备的工具了吧!(不要忘了上面讲过几个条件的哦)。
那个单片机究竟有什么功能和作用呢?先不要着急!接下来让我们点亮一个LED(搞电子的应该知道LED是什么吧^_^)我们在单片机最小系统上接个LED,看我们能否点亮它!对了,上面也有好几次提到过单片机最小系统了,所谓单片机最小系统就是在单片机上接上最少的外围电路元件让单片机工作。
一般只须连接晶体、VCC、GND、RST即可,一般情况下,AT89C51的31脚须接高电平。
#include<reg51.h> //头文件定义。
或用#include<at89x51.h>其具体的区别在于:后者定义了更多的地址空间。
//在Keil安装文件夹中,找到相应的文件,比较一下便知!sbit P1_0 = P1 ^ 0; //定义管脚void main (void){while(1){P1_0 = 0;//低电平有效,如果把LED反过来接那么就是高电平有效}}就那么简单,我们就把接在单片机P1_0上的LED点亮了,当然LED是低电平,才能点亮。
因为我们把LED的正通过电阻接至VCC。
P1_0 = 0; 类似与C语言中的赋值语句,即把0 赋给单片机的P1_0引脚,让它输出相应的电平。
那么这样就能达到了我们预先的要求了。
while(1)语句只是让单片机工作在死循环状态,即一直输出低电平。
如果我们要试着点亮其他的LED,也类似上述语句。
这里就不再讲了。
点亮了几个LED后,是不是让我们联想到了繁华的街区上流动的彩灯。
我们是不是也可以让几个LED依次按顺序亮呢?答案是肯定的!其实显示的原理很简单,就是让一个LED灭后,另一个立即亮,依次轮流下去。
假设我们有8个LED分别接在P1口的8个引脚上。
硬件连接,在P1_1--P1_7上再接7个LED即可。
例程如下:#include<reg51.h>sbit P1_0 = P1 ^ 0;sbit P1_1 = P1 ^ 1;sbit P1_2 = P1 ^ 2;sbit P1_3 = P1 ^ 3;sbit P1_4 = P1 ^ 4;sbit P1_5 = P1 ^ 5;sbit P1_6 = P1 ^ 6;sbit P1_7 = P1 ^ 7;void Delay(unsigned char a){unsigned char i;while( --a != 0){for(i = 0; i < 125; i++); //一个; 表示空语句,CPU空转。
流水灯电路设计及程序代码
#include <reg52.h>
#include<instrins.h>
#define uchar unsigned char
#define uint unsigned int
uchar code led[]={0xfe,0xfb,0xfd ,0xf7,0xef,0xbf,0xdf,0x7f};
delayuint z
{
uint x,y;
forx=z;x>0;x--
fory=110;y>0;y--;
}
main
{
uint i;
while1
{
P2=led[];
delay500;
_crol_led,1;
}
}
就是一组灯,然后在控制系统的控制下按照设定的顺序和时间来发亮和熄灭,这样就能形成一定的视觉效果,很多街上的店面和招牌上面就安了流水灯,看上去更美观。
这个原理其实很简单,三极管在电路中充当开关的作用,当电路导通,最左边的LED 首先点亮。
基极串出一电容连接下一个三极管的集电极。
当电容充分充电后,下一个三极管导通使得第二个LED点亮,以此类推。
可以通过调节电容的容量值,来控制流水灯点亮的时间。
感谢您的阅读,祝您生活愉快。