
#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


