求89c51单片机led设计程序.C语言编写

核心提示/*?74HC595驱动程序模块不用?9脚Qs---串行数据输出端模块不用?10脚CR-清除端?L电平仅对寄存器复位?9脚为?L;9脚进位;锁存器没有影响。11脚sclk--由低到高电平时?14脚Ds数据移入寄存器12脚CP/la--由低到

#define?uchar?unsigned?char

#define?uint?unsigned?int

sbit?ser=P3^0;//14脚SER--串行数据输入端

sbit?sclk=P3^3;//11脚srclk--由低到高电平时?14脚Ds数据移入寄存器

sbit?rck=P3^2; //12脚CP/la--由低到高电平时数据从寄存器移入锁存器

sbit?mr=P3^4;

void?delay(uint?z)

{

uint?x,y;

for(x=z;x>0;x--)

for(y=50;y>0;y--);

}

void?WriteSIOByte(unsigned?char?val)?

{

unsigned?char?i;?

mr=0;?

mr=1;

for?(i=8;?i>0;?i--)?//因为数码为8段?要运行8次?1段送一次码并移动一位

{?

sclk=?0;//拉低74HC595?时钟?11脚CP/sr--

?ser=val&0x01;// 发送74HC595?一位串行数据?14脚DS--串行数据输入端

?delay(1);//延时?

sclk?=?1;//拉高74HC595?时钟?11脚CP/sr--?

?val>>=1;//?

}?

rck=0;?

?delay(1);//延时

?rck=1; ?//12脚CP/la--由低到高电平时数据从寄存器移入锁存器

}

/////目前没有用?移位程序

uchar?yiwei(uchar?a)?//移位子程序把如P0-1变为P0^7

{

uchar?temp;

temp=(a&0x01)<<7;

temp=((a&0x02)<<5)|temp;

temp=((a&0x04)<<3)|temp;

temp=((a&0x08)<<1)|temp;

temp=((a&0x10)>>1)|temp;

temp=((a&0x20)>>3)|temp;

temp=((a&0x40)>>5)|temp;

temp=((a&0x80)>>7)|temp;

return?(temp);

}

//////////////、、、、、、、、、、、、、、、、

51单片机,公式怎么实现流水灯?

你认真分析原理图啊,上面明显接成共阳的了。

1、51单片机上电时,端口都是高电平的,只有运行程序,电平才可能产生变化。复位时,端口也是高电平。

2、你这仿真图中,LED正端都接到电源了,负端接单片机IO,根据二极管正向导通原理,此时负端肯定要为低电平,二极管才导通,才会亮。

所以,你要点亮哪个LED,你就要让那个IO口输出0。

0xfe,二进制为1111 1110,正好是P0.0输出0,其它都为高,所以P0.0那个灯就亮。

你要是输出0x01,二进制为0000 0001,可以看到,除了P0.0高电平,其它都是低电平。那么,P0.0那个灯肯定是不会亮的,而其它几个灯肯定都会亮。

你要是想输出1,灯亮,你就要把二极管换一种接法。

这样说,你明白嘛?

;电路图在附件内,经仿真通过,不知能不能达到你的要求。

;想要您的分真难啊

;呵呵!

org 0000h

ajmp start

org 0030h

start:

mov a,#0ffh ;

clr c ;

mov r2,#08h ;循环八次。

loop: rlc a ;带进位左移。

mov p1,a ;输出到P1口。

call delay ;延时一段时间

djnz r2,loop ;反复循环

mov r2,#07h ;再往回循环。

loop1: rrc a ;带进位右移

mov p1,a ;输出到P1口。

call delay ;延时一段时间

djnz r2,loop1 ;反复循环

jmp start ;重新开始

delay: mov r3,#20 ;延时子程序

d1: mov r4,#20

d2: mov r5,#248

djnz r5,$

djnz r4,d2

djnz r3,d1

ret

end

 
友情链接
鄂ICP备19019357号-22