/*#include <reg52.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned int i = 0; //定义循环变量 i,用于软件延时
unsigned char cnt = 0; //定义计数变量 cnt,用于移位控制
ENLED = 0;
ADDR3 = 1;
ADDR2 = 1;
ADDR1 = 1;
ADDR0 = 0;
while (1) //主循环,程序无限循环执行该循环体语句
{
P0 = ~(0x01 << cnt); //P0 等于 1 左移 cnt 位,控制 8 个 LED
for (i=0; i<20000; i++); //软件延时
cnt++; //移位计数变量自加 1
if (cnt >= 8) //移位计数超过 7 后,再重新从 0 开始
{
cnt = 0;
}
}
} */
/*#include <reg52.h>
#include<intrins.h>
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
void main()
{
unsigned int i=0;
unsigned char cnt=0;
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0;
while(1)
{
/*P0=~(0x01<<cnt);
for(i=0;i<30000;i++);
cnt++;
if(cnt>=8)
{if(cnt!=0){
P0=~(0x10000000>>cnt);
for(i=0;i<30000;i++);
cnt--;}}
else{
P0=~(0x01<<cnt);
for(i=0;i<30000;i++);
cnt++; }
}}*/
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;/* */
void delay(uint t)//延时函数
{
uint x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
/*void main(){
uchar i;
P0=0x01;
while(1)
{
for(i=7;i>0;i--)
{
P0=_crol_(P0,1);
delay(1000);}
for(i=7;i>0;i--)
{
P0=_cror_(P0,2);
delay(1000);}}}*/
/*void main()//主函数
{
uchar temp,i;
ENLED=0;
ADDR3=1;
ADDR2=1;
ADDR1=1;
ADDR0=0; 3
while(1)
{
temp=0x01; //8盏灯单个亮向左移
for(i=0;i<8;i++)
{
P0=~temp;
delay(1000);
temp<<=1;
}
temp=0x80;
for(i=0;i<8;i++)//8盏灯单个亮反向右移
{
P0=~temp;
delay(1000);
temp>>=1;
} }} */
/**/void main(){
uchar temp,i;
ENLED=0;
ADDR3=1;
ADDR1=1;
ADDR0=0;
while(1){
temp=0x01;
for(i=0;i<8;i++)
{
P0=~temp;
delay(1000);
temp<<=1;
}
temp=0x80;
for(i=0;i<9;i++)
{P0=~temp;
delay(1000);
temp>>=1;}}}
/* temp=0xfe;
for(i=0;i<8;i++)//8盏灯逐个向右亮
{
P0=temp;
delay(50);
temp<<=1;
}
temp=0xfe;
for(i=0;i<8;i++)//8盏灯逐个灭向右
{
P0=~temp;
delay(50);
temp<<=1;
}
temp=0x7f;
for(i=0;i<8;i++)//8盏灯逐个亮向左
{
P0=temp;
delay(50);
temp>>=1;
}
temp=0x7f;
for(i=0;i<8;i++)//8盏灯逐个灭向右
{
P0=~temp;
delay(50);
temp>>=1;
}
delay(100);
P0=0x55;//隔一个亮
delay(100);
P0=0xaa;//隔一个亮
delay(100);
P0=0x00;//全亮
delay(100);
P0=0xff;//全灭
}
}
*/ /* #include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
#define led P1
void delay_1ms();
void delay_ms(uint x);//ms级延时函数
void main()
{
uchar i=0;//定义一个变量,用于后面的for循环
led=0xfe;//把十六进制的0xfe变为二进制,0xfe= 1111 1110。
//低位的0对应单片机引脚低位,所以0xfe使得P1^0输出低电平,其他引脚为高电平
delay_ms(1000);//延时1000ms,使得LED保持当前亮灭状态1s
while(1)//while(1)是个死循环,可以保证程序一直在while(1)内运行
{
for(i=0;i<7;i++)
{
led=_crol_(led,1);//_crol_()为循环左移函数,led依次变为1111 1101、1111 1011...... 1011 1111、0111 1111
delay_ms(1000);//_crol_()和_cror_()函数被包含在头文件intrins.h中,所以在使用这两个函数时intrins.h这个头文件不可少
}
for(i=0;i<7;i++)
{
led=_cror_(led,1);//_cror_()为循环右移函数,led由0111 1111依次变为1011 1111、1101 1111......1111 1101、1111 1110
delay_ms(1000);
}
}
}
/*
此处的51单片机的晶振为12Mhz,一个时钟周期为1/12us,一个机器周期为12个时钟周期为1us。
延时时间为122*8*1us=976us,加上i--占用的时间,调试测得总用时约1ms(不到一点点点)
*/
/*void delay_1ms()
{
uint i;
for(i=122;i>0;i--);
}
void delay_ms(uint x)//ms级延时函数
{
while(x--)
{
delay_1ms();
}
} */
QQ录屏20220612083057