嵌入式 左右循环流水灯

 /*#include 
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 
#include
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<=8)
{if(cnt!=0){ 
P0=~(0x10000000>>cnt);
for(i=0;i<30000;i++);
cnt--;}}
else{
P0=~(0x01<	
		   

			  
#include
#include
#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
#include

#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

你可能感兴趣的:(单片机,c语言,嵌入式硬件)