LED流水灯控制电路如图2-1所示,八个LED灯D0-D7(可选择LED-RED)阳极接到+5V,阴极通过300欧姆电阻分别接到单片机的P1.0-P1.7八个IO口上。I/O口循环流水灯效果实现流程如图2-2所示,依次从第一盏灯开始,分别点亮
//P0口灯由高位向低位依次灭(前一位不亮),最后仅剩最低位亮灯。0xFC,0xF9,0xF3,0xE7,0xCF,0x9F,0x3F,0x7F,//P0口以两个亮灯为单位,由低位向高位逐位移动,最后移至最高位,仅剩最高位亮灯。0xFF,0xFF,0x
使能定时器1中断SETB TR1;启动定时器1SETB EA;开总中断 MOV P1,LED;初始化流水灯LOOP:JMP LOOP;循环等待中断T1INT:PUSH PSW;定时器1中断程序PUSH ACC;保护现场MOV TH1,#3CH;定时时间=50mSMOV TL1,#0B0H;INC YSJS;
sbit led2 = P2^1;sbit led3 = P2^2;sbit led4 = P2^3;sbit led5 = P2^4;sbit led6 = P2^5;sbit led7 = P2^6;sbit led8 = P2^7;void main(){ int i,j;//点亮第一个灯 led1 = 1;led2 =
define uint unsigned int //定义无符号整数 void delay(uint); //声明延时函数 void main(void){ uint i;uchar temp;while(1){ temp=0x01;for(i=0;i<8;i++) //8个流水灯逐个闪动 { P0=~temp;delay(100);
51单片机89c51rc,怎么设计心形流水灯?led至少30个,?求电路图,和程序!步骤要具体
流水灯就是51单片机控制led灯依次点亮的控制方式。具体程序如下:ORG 0000H;复位启动AJMP START;ORG 001BH;T1中断AJMP T1INT;;定义变量===YSJSEQU 30H;延时计数器LEDEQU 31H;LED控制缓冲器 ;主程序===START:MOV LED,#
代码已修改,并仿真通过。include
数组可以,直接也可以 数组的话,比如定义个数组,uchar led[]={0xfe,0xfd,0xfb,0x07………};for(i=0;i<8;i++){ P0=led[i];delayms(1000)} 直接的话,同样的道理,只是代码比较多一些,每次重新赋值一次P0都
led8 = 0;//点亮剩余的灯 //省略……while(1);}
利用51单片机的p0,p1,p2口,分别驱动一个LED灯。然后,首先让它们都输出低电平0x00,再然后,按顺序位移输出高电平。
51单片机16个灯的心形流水灯编程
void delay(unsigned int a){ unsigned i,j;for(i=0;i
单片机led左移然后右移循环亮灭的汇编语言 电路与程序如下:本程序,经过硬件检验,完全符合题目要求。
下载文件:prj15_8_8led.rar|这个我做过了,请参考下面的附件,程序已经上板验证过了,可用。
其实就是讲每一行的数据左右移动一行就可以了。使用>>或<<就可以了。include
在8X8 LED 点阵上显示柱形,让其先从左到右平滑移动1次,其次从右到左 平滑移动1次,再次从上到下平滑移动1次,最后从下到上平滑移动次,如此循环下去。LED显示原理:显示某一个点时,列值设为1,行值设为0即可
//定义一个无符号字符型局部变量 i 取值范围 0~255 Delay(50000); P1=0xfe; //赋初始值 for(i=0;i8;i++) //加入 for循环,表明for循环大括号中的程序循环执行8次
单片机程序8x8led点阵显示心形并实现左移右移的程序
proteus仿真按理来说是不可能达得到效果的,因为这种仿真得有非常快的处理速度。我刚动手试了下和自己的想法相同,LED只会间断的闪烁。我是用AVR单片机,用51也是一样的。我这个程序也在实物试过效果很好。演示定时器1的
单片机8*8点阵(0~F十六进制数字,可做成8*8图形)仿真实例。)LED EQU P3;;;LED灯显示定义 KEY EQU P1;;;键盘接口定义 TIME EQU 30H CNTA EQU 31H CNTB EQU 32H ;---程序入口定义 ORG 0000H JMP START
点阵的 48 列数据线驱动由 6 片 74HC595 级联组成,前一片 74HC595 的 Q’H 引脚连接下一片的SI引脚,各片的SCK、RCK、SRCLR、G引脚分别并联。 (2)LED点阵块 图三LED点阵块 8*8的LED点阵为单色行共阴模块,单点的工作电压为正向
一.基于51的点阵屏显示:(1)点亮第一个8*8点阵:1.首先在Proteus下选择我们需要的元件,AT89C51、74LS138、MATRIX-8*8-GREEN(在这里使用绿色的点阵)。在Proteus 6.9中8*8的点阵总共有四种颜色,分别为MATRIX-8*8-GRE
使用的单片机仿真试验仪型号为DP-51PRO以下的程序是在8x8led显示频上显示一个心形我需要将它移动起来CLKEQUP3.2DINAEQUP3.3DINBEQUP3.4CLEAREQUP3.5org0000hajmpmainorg0100hmain:mov 使用的单片机仿真试验仪型号为DP-51PRO以下的程
delay1();} } }
设计一个用于51单片机的8x8的单色点阵LED驱动程序使,显示一个心形,在Proteus上仿真 求大神
这个对软件编程的确麻烦,想要改变的话,可以只取两个引脚,做串行输出,然后外加个串行转并行的芯片,如74HC595芯片,这样编程上就直观了;
你的主程序就是亮一个点,void hc595(u8 dat)程序没有错。要亮一列,只改主程序的一行,hc595(0xff);//1111 1111,这才是亮一列的,全为1,全亮,而P0=0x7f;//0111 1111 ,是0有效,只选一列。下图,就是
void delay1(void){ unsigned char i,j,k;for(k=8;k>0;k--)for(i=10;i>0;i--)for(j=15;j>0;j--);} main(){ unsigned int i;while(1){ for(i=0;i<8;i++){ P2=taba[i];P0=tabb[i];dela
2、控制器按照需要显示的数字、字母、符号等的编码,依次控制每个LED的点亮或熄灭,从而显示出所需的内容。3、由于点阵数码管的每个LED都是独立控制的,因此可以显示各种复杂的图形和动画效果。
程序没问题就是硬件跟人家的不一样了,单片机程序是与硬件密切相关的,硬件变了,相同的程序未必还管用,一般地得做相应改动
单片机上电复位都是高电平,你的数码管或者点阵应该是高电平驱动的。。。你看看你的驱动电路是不是NPN型的三极管。。假如是NPN的,就是上电全亮
您好,这种情况可能是由于电路中的某些元件或线路出现了问题。您可以尝试检查以下几个方面:1. 检查电源是否正常,是否有电压波动等问题。2. 检查单片机的时钟频率是否正确,是否与数码管和流水灯的工作频率相匹配。3. 检查数
为什么我的51单片机点阵数码管显示爱心图形,而是全亮
左移:处理的是P0 P2口的数据 154是行扫面,就不用更改了。给该行数据就可以了,可以定义一个2字节的变量,用C语言直接左移就可以了(x<<=1;)再将这个变量强制转换位单字节的数据,输出给两个P口。右移的道理和
首先你要确定点阵的大小,黑白(单色)点阵一个 点占一位二进制数据,128*128点占16*128个字节,即2K。用专门的软件将图形转化成十六进制数据,存储于表格中,显示时再一个一个读出,进行显示。点阵显示屏有的是一个点一
void delay1(void){ unsigned char i,j,k;for(k=8;k>0;k--)for(i=10;i>0;i--)for(j=15;j>0;j--);} main(){ unsigned int i;while(1){ for(i=0;i<8;i++){ P2=taba[i];P0=tabb[i];dela
把点阵图形的代码存于表格中,一次取一个数,反复显示即可。
if(r==0){***心形显示***} if(r==1){***星形显示***} //if(r==?){***?形显示***} }
仿真LED点阵屏,别用三极管,这不是实物,不用考虑驱动问题。关键是接三极管后,仿真图变得复杂,反倒出错。看你第二个图的点阵屏,上面引脚全为红点,都是高电平,而下面的引脚全是蓝点,都是低电平,所以全亮。并没有
首先你要搞清楚点阵显示原理。8*8点阵要显示一个画面,通常采用扫描的形式。点阵内部发光阵列每一行的阴极连在一起,引出一条共阴线;每一纵向阳极连在一起,引出一条共阳线。这样8*8点阵就共有8条共阴线和8条共阳线。
关于51单片机点阵心形显示问题
仿真LED点阵屏,别用三极管,这不是实物,不用考虑驱动问题。关键是接三极管后,仿真图变得复杂,反倒出错。看你第二个图的点阵屏,上面引脚全为红点,都是高电平,而下面的引脚全是蓝点,都是低电平,所以全亮。并没有实现按列(或按行)扫描。就是仿真图画得太复杂了,又用了总线加标网络标号,而网络标号又不对。下图,虽然是16*16的点阵,但主要说明,点阵屏的行,列引脚都直接与锁存器连接,不要三极管,不要电阻,越简单越好。不要用实物的驱动想法画仿真图,反倒出错。把点阵图形的代码存于表格中,一次取一个数,反复显示即可。
这要看是几位数码管,是开发板新烧录的程序,那就看看显示程序是不是循环扫描显示的。最好发个截图看一下是什么样。
把点阵图形的代码存于表格中,一次取一个数,反复显示即可。
首先你要搞清楚点阵显示原理。 8*8点阵要显示一个画面,通常采用扫描的形式。点阵内部发光阵列每一行的阴极连在一起,引出一条共阴线;每一纵向阳极连在一起,引出一条共阳线。这样8*8点阵就共有8条共阴线和8条共阳线。具体请参考点阵内部结构示意图! 扫描的过程:例如将共阳线作为扫描线,即每次给其中一条阳线供电,其它阳线断电。这样,在该条阳线上的LED点亮与否就取决于8条阴线的电平高低了。快速地扫描阳线,并且每扫描一条就给阴线变化相应的电平,就实现了一组图像的显示。 在你给的程序中,很明显的 tabP2是用来形成扫描输出的。你自己分析一下这些值每次是不是只发生了0这个值的移位。这是采用查表法来得到扫描功能的,每次让IO口(一组)输出这表中的一个值,最终就形成了扫描动作。至于tabP0就是对应于每一个扫描线输出的心形数据表了。每次扫描IO输出 tabP2的一个值,对应数据IO输出tabP0的一个值。 至于你说的“还有8X8点阵图中接口P23,P25,LP04,LP06,其中的LP04,LP06是不是指单片机的P04和P06接口啊?”我个人认为你应该自己有能力对这等电路进行分析了,不要一味只是单纯复制制作。只有自己尝试了解,以后才能做出更具特色的东西而不会仅仅停留在心形显示。
上拉电阻和三极管都是为了提高单片机的输出能力。你确认程序写的没问题吗?只亮一个灯?那灯的亮度又如何?
每屏显示时,列控制码左(右)移,就可实现点阵屏左(右)移动。 以显示“ | ” 从右向左移为例,第1 屏,右边第1 列亮1ms后灭,第2 屏,第2 列亮。。。。8 屏显示后,完成“| ”左移。
#include sbit ADDR0 = P1^0; sbit ADDR1 = P1^1; sbit ADDR2 = P1^2; sbit ADDR3 = P1^3; sbit ENLED = P1^4; unsigned char code image[11][8] = { {0xC3, 0x81, 0x99, 0x99, 0x99, 0x99, 0x81, 0xC3}, //数字0 {0xEF, 0xE7, 0xE3, 0xE7, 0xE7, 0xE7, 0xE7, 0xC3}, //数字1 {0xC3, 0x81, 0x9D, 0x87, 0xC3, 0xF9, 0xC1, 0x81}, //数字2 {0xC3, 0x81, 0x9D, 0xC7, 0xC7, 0x9D, 0x81, 0xC3}, //数字3 {0xCF, 0xC7, 0xC3, 0xC9, 0xC9, 0x81, 0xCF, 0xCF}, //数字4 {0x81, 0xC1, 0xF9, 0xC3, 0x87, 0x9D, 0x81, 0xC3}, //数字5 {0xC3, 0x81, 0xF9, 0xC1, 0x81, 0x99, 0x81, 0xC3}, //数字6 {0x81, 0x81, 0x9F, 0xCF, 0xCF, 0xE7, 0xE7, 0xE7}, //数字7 {0xC3, 0x81, 0x99, 0xC3, 0xC3, 0x99, 0x81, 0xC3}, //数字8 {0xC3, 0x81, 0x99, 0x81, 0x83, 0x9F, 0x83, 0xC1}, //数字9 {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, //全亮 }; void main() { EA = 1; //使能总中断 ENLED = 0; //使能U4,选择LED点阵 ADDR3 = 0; TMOD = 0x01; //设置T0为模式1 TH0 = 0xFC; //为T0赋初值0xFC67,定时1ms TL0 = 0x67; ET0 = 1; //使能T0中断 TR0 = 1; //启动T0 while (1); } /* 定时器0中断服务函数 */ void InterruptTimer0() interrupt 1 { static unsigned char i = 0; //动态扫描的索引 static unsigned int tmr = 0; //1s软件定时器 static unsigned char index = 9; //图片刷新索引 TH0 = 0xFC; //重新加载初值 TL0 = 0x67; //以下代码完成LED点阵动态扫描刷新 P0 = 0xFF; //显示消隐 switch (i) { case 0: ADDR2=0; ADDR1=0; ADDR0=0; i++; P0=image[index][0]; break; case 1: ADDR2=0; ADDR1=0; ADDR0=1; i++; P0=image[index][1]; break; case 2: ADDR2=0; ADDR1=1; ADDR0=0; i++; P0=image[index][2]; break; case 3: ADDR2=0; ADDR1=1; ADDR0=1; i++; P0=image[index][3]; break; case 4: ADDR2=1; ADDR1=0; ADDR0=0; i++; P0=image[index][4]; break; case 5: ADDR2=1; ADDR1=0; ADDR0=1; i++; P0=image[index][5]; break; case 6: ADDR2=1; ADDR1=1; ADDR0=0; i++; P0=image[index][6]; break; case 7: ADDR2=1; ADDR1=1; ADDR0=1; i=0; P0=image[index][7]; break; default: break; } //以下代码完成每秒改变一帧图像 tmr++; if (tmr >= 1000) //达到1000ms时改变一次图片索引 { tmr = 0; if (index == 0) //图片索引10~0循环 index = 10; else index--; } }
朋友,这方面的你还要的不
673358729 可以帮你做