51单片机16位流水灯

合集下载

51单片机流水灯C程序

51单片机流水灯C程序

P0口控制,先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动三次;再从中间往两边流动三次;不过这个程序实现的应该是这样的先奇数亮再偶数亮,循环三次;一个灯上下循环三次;两个分别从两边往中间流动;再从中间往两边流动(延时0."1s)#include<reg52."h>#include<intrins.h>#defineuintunsignedint#defineucharunsignedcharvoiddelay();voidmain(){uchartemp,temp1,temp2,a,b;while(1){for(b=3;b>0;b--){temp=0xaa;P0=temp;delay();temp=0x55;P0=temp;delay();}for(a=3;a>0;a--){temp=0xfe;for(b=7;b>0;b--){P0=temp;temp=_crol_(temp,1);delay();P0=temp;delay();}}temp1=0xfe;temp2=0x7f;for(a=8;a>0;a--){temp=temp1&temp2;P0=temp;delay();temp1=_crol_(temp1,1);temp2=_cror_(temp2,1);}}}voiddelay(){uinta,b;for(a=100;a>0;a--)for(b=100;b>0;b--);}程序实现的第2种方法:实现单片机led流水灯从中间向两边,从两边向中间的效果,下面的程序就是实现思路,这个是直接调用,应该明白吧,数组那其实也可以改一下,如采用一维数组,在多次调用;也可以采用二维数组。

-----------------------------------------------------#include<reg#defineuintunsignedint#defineucharunsignedcharucharTABLE[]={0xFF,0xE7,0xC3,0x81,0x00,//从中间向两侧点亮0xFF,0xE7,0xC3,0x81,0x00,0xFF,0xE7,0xC3,0x81,0x00,0xFF,0x7E,0x3C,0x18,0x00,//从两侧向中间点亮0xFF,0x7E,0x3C,0x18,0x00,0xFF,0x7E,0x3C,0x18,0x00};uchari;DELAY(){uints;for(s=0;s<300;s++);}main(){while(1){if(TABLE[i]!=0x01&TABLE[i]!=0x33){P0=TABLE[i]; i++;DELAY();}else{i=0;}}}*程序详细功能介绍:*利用取表的方法,使端口P1做单一灯的变化:左移2次,右移2次,闪烁2次(延时的时间0."2秒)。

51单片机 流水灯 ~ 花样灯 程序

51单片机 流水灯 ~ 花样灯 程序

单片机为89c52 晶振为11.0592,/***此程序为流水灯*** /#include<reg52.h>#include<intrins.h>#define uchar unsigned char //宏定义#define uint unsigned intuchar led;void delay(uint z) //延时子函数体{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){led=0xfe; //赋初值while(1){P1=led; //点亮第一个小灯delay(100); //延时100毫秒led=_crol_(led,1); 将led的变量左移给下一位}}/*8个发光管间隔200ms由上至下,返回再由上至下,一个个往下亮,后全亮由下至上,返回再由下至上,一个个往下亮,后全亮再重复2次,然后全部熄灭再以500ms间隔全部闪烁3次。

重复此过程*/#include<reg52.h>#include<intrins.h>#define uchar unsigned char#define uint unsigned intuchar led;uint i,j;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void main(){while(1){for(j=0;j<2;j++){led=0xfe; //赋初值for(i=0;i<8;i++){P1=led; //点亮第一个小灯delay(200); //延时200毫秒led=_crol_(led,1); //将led变量循环左移给下一位}led=0xfe; //赋初值for(i=0;i<8;i++){P1=led; //点亮第一个小灯delay(200); //延时200毫秒led<<=1; //左移给下一位}led=0x7f; //赋初值for(i=0;i<8;i++){P1=led; //点亮第一个小灯delay(200); //延时200毫秒led=_cror_(led,1); //将led变量循环右移给下一位}led=0x7f; //赋初值for(i=0;i<8;i++){P1=led; //点亮第一个小灯delay(200); //延时200毫秒led>>=1; //右移给下一位}}for(j=0;j<6;j++){P1=~P1; //全部取反6次,即闪烁5次delay(500); //延时500毫秒}}}。

51单片机经典流水灯程序

51单片机经典流水灯程序

单片机流水灯汇编程序设计开发板上的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个发光二极管,产生流水灯的移动效果。

多种方法写出的51单片机流水灯C语言程序

多种方法写出的51单片机流水灯C语言程序

多种方法写出的51单片机流水灯C语言程序流水灯最原始下面是一个最基本的流水灯程序,使用了51单片机的寄存器编程方法。

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;void mdelay(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;流水灯位左移在流水灯的基础上,我们可以通过左移位的方式来实现流水灯的效果。

void main()unsigned char led = 0x01.// 初始化led为xxxxxxxxwhile(1)P1 = ~led。

// 取反输出,因为我们的电路是低电平亮灯mdelay(1000);led <<= 1.// 左移一位if(led == 0) // 如果led变为0了,说明已经左移到最后一位了,需要重新开始led = 0x01;流水灯移位函数为了方便实现流水灯的位移,我们可以封装一个移位函数。

void shift_left(unsigned char *led。

unsigned char n)for(unsigned char i=0.i<n。

i++)led <<= 1;if(*led == 0)led = 0x01;void main()unsigned char led = 0x01;while(1)P1 = ~led;mdelay(1000);shift_left(&led。

单片机原理流水灯实验

单片机原理流水灯实验

单片机原理流水灯实验单片机原理流水灯实验是一种十分基础的单片机实验,在学习单片机的初级阶段非常重要。

流水灯可以通过多个灯依次亮起,再逐个熄灭,形成灯光流动的效果。

下面将详细介绍单片机原理流水灯实验的步骤和实现原理。

首先,我们需要准备的材料和工具有:1. 单片机主板:例如STC89C52RC型号。

2. LED灯:我们需要7个LED灯,可以选择不同颜色和尺寸的。

3. 面包板:用于连接电路。

4. 连接线:用于连接单片机主板和面包板以及连接LED灯。

接下来,我们开始进行单片机原理流水灯实验的步骤:第一步:连接电路1. 将7个LED灯连接到面包板上,按照流水灯的顺序连接,可以使用杜邦线连接。

2. 在面包板上连接7个电流限制电阻,以保护LED灯,限制电流的大小根据具体LED灯的要求确定。

3. 将面包板的VCC和GND引线分别连接到单片机主板的VCC和GND引脚上。

第二步:编写程序1. 打开Keil C51编译器,新建一个项目。

2. 编写C语言程序,实现流水灯的效果,代码如下:c#include <reg52.h>声明I/O口函数void delay(unsigned int t);void ledFlow(void);程序入口void main(void){主循环while (1){LED流水灯效果ledFlow();}}延时函数void delay(unsigned int t)unsigned int i, j;for (i = 0; i < t; i++)for (j = 0; j < 120; j++);}LED流水灯效果函数void ledFlow(void){unsigned int i;unsigned char flowData = 0x01;for (i = 0; i < 8; i++){P0 = flowData; 将数据输出到P0口delay(500); 延时500msflowData <<= 1; 左移一位}delay(500); 延时500msflowData = 0x80; 数据复位for (i = 0; i < 8; i++){P0 = flowData; 将数据输出到P0口delay(500); 延时500msflowData >>= 1; 右移一位}delay(500); 延时500ms}第三步:烧录程序1. 将单片机主板连接到电脑上,并打开STC-ISP烧录软件。

51单片机常见的五种流水灯编写方式

51单片机常见的五种流水灯编写方式

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.толькодля людей, которые используются для обучения, исследований и не должны использоваться в коммерческих целях.以下无正文。

基于51单片机的流水灯设计

基于51单片机的流水灯设计

基于51单⽚机的流⽔灯设计基于51单⽚机的流⽔灯设计⼀.基本功能利⽤AT89c51作为主控器组成⼀个LED流⽔灯系统,实现8个LED 灯的左、右循环显⽰。

⼆.硬件设计图1.总设计图1.单⽚机最⼩系统1.1选⽤AT89C51的引脚功能图2. AT89C51XTAL1:单芯⽚系统时钟的反向放⼤器输⼊端。

XTAL2:系统时钟的反向放⼤器输出端,⼀般在设计上只要在XTAL1和XTAL2上接上⼀只⽯英震荡晶体系统就可以⼯作了,此外可以在两引脚与地之间加⼊20PF的⼩电容,可以使系统更稳定,避免噪⾳⼲扰⽽死机。

RESET:重置引脚,⾼电平动作,当要对晶体重置时,只要对此引脚电平提升⾄⾼电平并保持两个及其周期以上的时间便能完成系统重置的各项动作,使得内部特殊功能寄存器内容均被设成已知状态。

P3:端⼝3是具有内部提升电路的双向I/O端⼝,通过控制各个端⼝的⾼低电平了实现LED流⽔灯的控制。

1.2复位电路如图所⽰,当按下按键时,就能完成整个系统的复位,使得程序从新运⾏。

图3.复位电路1.3时钟电路时钟电路⽤于产⽣单⽚机⼯作所需要的时钟信号,单⽚机本⾝就是⼀个复杂的同步时序电路,为了保证同步⼯作⽅式的实现,电路应在唯⼀的时钟信号控制下严格地按时序进⾏⼯作。

在AT89C51芯⽚内部有⼀个⾼增益反相放⼤器,其输⼊端为芯⽚引脚X1,输出端为引脚X2,在芯⽚的外部跨接晶体振荡器和微调电容,形成反馈电路,就构成了⼀个稳定的⾃激振荡器。

此电路采⽤12MHz的⽯英晶体。

图4.时钟电路2.流⽔灯部分图5.流⽔灯电路三.软件设计3.1编程语⾔及编程软件的选择本设计选择C语⾔作为编程语⾔。

C语⾔虽然执⾏效率没有汇编语⾔⾼,但语⾔简洁,使⽤⽅便,灵活,运算丰富,表达化类型多样化,数据结构类型丰富,具有结构化的控制语句,程序设计⾃由度⼤,有很好的可重⽤性,可移植性等特点。

⽽汇编语⾔使⽤起来并没有这么⽅便。

本设计选⽤了Keil作为编程软件,.Keil C51⽣成的⽬标代码效率⾮常之⾼,多数语句⽣成的汇编代码很紧凑,容易理解。

51单片机音乐流水灯程序

51单片机音乐流水灯程序

#include <reg52."h>sbitspeaker = P1^6;sbitkey1=P1^5;sbitkey2=P1^7;unsigned char kk=0;unsigned long t3;unsigned char timer0h, timer0l, time,n;codecharled[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f,0x00,0x55,0xaa,0x00,0x5 5,0xaa,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x 7f,0x00,0x55,0xaa,0x00,0x55,0xaa,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x 7f,0x00,0x55,0xaa,0x00,0x55,0xaa,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x 7f,0x00,0x55,0xaa,0x00,0x55,0xaa,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x 7f,0x00,0x55,0xaa,0x00,0x55,0xaa,0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe,0x7e,0x3c,0x18,0x00,0x18,0x3c,0x7e,0x00}; //灯亮数组//--------------------------------------//单片机晶振采用11."0592MHz//频率-半周期数据表高八位本软件共保存了四个八度的28个频率数据code unsigned char FREQH[] = {0xF2, 0xF3, 0xF5, 0xF5, 0xF6, 0xF7, 0xF8,//低音0xF9, 0xF9, 0xFA, 0xFA, 0xFB, 0xFB, 0xFC, 0xFC,//1,2,3,4,5,6,7,i0xFC, 0xFD, 0xFD, 0xFD, 0xFD, 0xFE,//高音2345670xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFE, 0xFF};//超高音//频率-半周期数据表低八位code unsigned char FREQL[] = {0x42, 0xC1, 0x17, 0xB6, 0xD0, 0xD1, 0xB6,//低音0x21, 0xE1, 0x8C, 0xD8, 0x68, 0xE9, 0x5B, 0x8F, //1,2,3,4,5,6,7,i0xEE, 0x44, 0x6B, 0xB4, 0xF4, 0x2D,//高音2345670x47, 0x77, 0xA2, 0xB6, 0xDA, 0xFA, 0x16};//超高音//--------------------------------------//世上只有妈妈好数据表要想演奏不同的乐曲,只需要修改这个数据表codeint shengrikuaile[] = {5,1,1, 5,1,1, 6,1,2, 5,1,2, 1,2,2, 7,1,4,//生日快乐5,1,1, 5,1,1, 6,1,2, 5,1,2, 2,2,2, 1,2,4,5,1,1, 5,1,1, 5,2,2, 3,2,2, 1,2,2, 7,1,2, 6,1,2,4,2,1, 4,2,1, 3,2,2, 1,2,2, 2,2,2, 1,2,4,0,0,0};code int tonghua[]={5,1,2, 5,2,2, 4,2,2,3,2,4, 3,2,2, 4,2,1, 3,2,1, 3,2,4, 3,2,2, 4,2,2,3,2,2, 4,2,2, 3,2,2, 2,2,1, 1,2,1, 1,2,2, 1,2,2, 3,2,2, 5,2,2,6,2,4, 6,2,2, 6,2,1, 5,2,1, 5,2,2, 2,2,2, 2,2,2, 4,2,2,3,2,8, 1,2,2, 3,2,2, 5,2,2,6,2,4, 6,2,2, 6,2,1, 5,2,1, 2,2,2, 2,2,2, 4,2,2,3,2,2, 4,2,2, 3,2,2, 2,2,1, 1,2,1, 1,2,4, 2,2,2, 3,2,2,6,1,4, 6,1,2, 1,2,2, 1,2,2, 7,1,2, 7,1,2, 1,2,1, 1,2,16,0,0,0};//童话//一个音符有三个数字。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档