⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 鬼影灯.c

📁 利用PWM和移位运算设计
💻 C
字号:
/*

				        鬼 影 灯

	功能:P1口外接的八个LED发出的光达到流动拖影的效果
    
	说明:利用PWM和移位运算设计,并利用人眼的视觉
	      暂留现象产生移动,并拖影的动态发光效果。
		  
		  为实现本程序的功能,几乎采用了穷举的方法,
		  例举出各个时段的赋值情况,才掌握规律,比
		  较笨拙。虽然实现了预想的结果,但一定可以
		  有更好的方法实现,希望大家尝试并互相交流。


  (C)西安电子科技大学 测控技术与仪器 编写:郭世忠  2008/03/14
*/

#include<reg52.h>	 //51寄存器头文件

void Delayms(int ms);//函数声明



void main(void)	     //主程序
{
   
  unsigned char k,j,LED;	 //定义变量	
  int i;			         //有关i的运算出现负值,如果定义成无符号会越界
  
				
while(1)					 	//死循环,单片机程序必须是一个死循环
{ 

/*********************以下为正序方向移动 低位到高位***********************/

for(i=0;i<16;i++) 				// 循环16次,移动16位
  {   
    for(j=0;j<120;j++) 		    //重复数次 削除发光抖动 可决定运动快慢
     {
	  if(i<8)
	  {LED=0xfe<<i;}
	  else
	   {
       LED=~(0xff<<(i-8));
	   }       
	   for(k=0;k<8;k++)		    //循环8次
	    {
		if(k<(8-i))	        	//8-i个直接赋值
		{P1=LED;}
	     else
	     {		 //i个移位赋值 			  
		   LED=0x01|(LED<<1)|LED;  //从低位依次补1
	       P1=LED;			    
	      }
	    }
      
      } 
 }  

 Delayms(300);//短暂延时,便于区分起始状态


/*********************以下为逆序方向移动 高位到低位***********************/

for(i=0;i<16;i++) 			   //逆序方向移动 循环16次,移动16位
  {   
    for(j=0;j<120;j++) 		   //重复数次 削除发光抖动  可决定运动快慢
     {
	  if(i<8)
	  {LED=0x7f>>i;}
	  else
	  {
       LED=~(0xff>>(i-8));
	  }       
	    for(k=0;k<8;k++)	    //循环8次
	    {  
		 if(k<(8-i))	        //8-i个直接赋值
		 {P1=LED;}
	     else
		   {
		   P1=LED;				    //i个移位赋值 			  
		   LED=0x80|(LED>>1)|LED;   //从高位依次补1
	       }			    
	     }
      
	 
	  } 

  } 
 Delayms(300);   //短暂延时,便于区分起始状态
}

}

 /****************************************************************************
* 名    称:Delayms()
* 功    能:延迟1ms
* 入口参数:ms: 延迟毫秒数
* 出口参数:无
* 说    明: 11.0592MHz条件下
****************************************************************************/
void Delayms(int ms)
{
   unsigned int i;
   for(;ms>0;ms--)	      //循环ms次
   {
      for(i=0;i<113;i++); //每次1ms延迟@ 11.0592MHz
   }
}




 /*********************** I/O口输出状态对应表*************************

 对应P1口
 7654 3210
 
 1111 1110		 0+0+0+0 0+0+0+8次
 1111 1110
 1111 1110
 1111 1110		 第一位最亮	  i=0
 1111 1110
 1111 1110		  进组
 1111 1110
 1111 1110

 1111 1100		 0+0+0+0 0+0+8+7次
 1111 1100
 1111 1100
 1111 1100		 第二位最亮	   i=1
 1111 1100
 1111 1100							  
 1111 1100
 1111 1101

 1111 1000		 0+0+0+0 0+8+7+6次
 1111 1000
 1111 1000
 1111 1000		 第三位最亮	   i=2
 1111 1000
 1111 1000
 1111 1001
 1111 1011

 1111 0000		 0+0+0+0 8+7+6+5次
 1111 0000
 1111 0000
 1111 0000		 第四位最亮	 i=3
 1111 0000
 1111 0001
 1111 0011
 1111 0111

 1110 0000		 0+0+0+8 7+6+5+4次
 1110 0000
 1110 0000
 1110 0000		 第五位最亮	   i=4
 1110 0001
 1110 0011
 1110 0111
 1110 1111

 1100 0000		 0+0+8+7 6+5+4+3次
 1100 0000
 1100 0000
 1100 0001		 第六位最亮	   i=5
 1100 0011						 
 1100 0111
 1100 1111
 1101 1111

 1000 0000		 0+8+7+6 5+4+3+2次
 1000 0000
 1000 0001
 1000 0011		 第七位最亮	   i=6
 1000 0111
 1000 1111
 1001 1111
 1011 1111

 0000 0000		 8+7+6+5 4+3+2+1次
 0000 0001
 0000 0011
 0000 0111		 第八位最亮    i=7
 0000 1111
 0001 1111
 0011 1111
 0111 1111
 ----------------------------------------
 0000 0001		
 0000 0011		P1=LED;	
 0000 0111		LED=0x01|LED|(LED<<1);
 0000 1111		
 0001 1111		 出组
 0011 1111						8
 0111 1111
 1111 1111

 0000 0011		
 0000 0111
 0000 1111
 0001 1111						9
 0011 1111
 0111 1111
 1111 1111
 1111 1111

 0000 0111		
 0000 1111
 0001 1111						10
 0011 1111		
 0111 1111
 1111 1111
 1111 1111
 1111 1111

 0000 1111		
 0001 1111
 0011 1111
 0111 1111				     	11
 1111 1111
 1111 1111
 1111 1111
 1111 1111

 0001 1111		
 0011 1111
 0111 1111
 1111 1111						12
 1111 1111
 1111 1111
 1111 1111
 1111 1111

 0011 1111		
 0111 1111
 1111 1111
 1111 1111						13
 1111 1111
 1111 1111
 1111 1111
 1111 1111


 0111 1111		
 1111 1111
 1111 1111
 1111 1111		
 1111 1111						14
 1111 1111
 1111 1111
 1111 1111

 1111 1111
 1111 1111
 1111 1111		  //0+0+0+0 0+0+0+0次
 1111 1111
 1111 1111
 1111 1111		            	15
 1111 1111
 1111 1111

*/
//========================================

//		 反向移动时序
//========================================
/*


0111 1111
0111 1111
0111 1111				 i=0
0111 1111
0111 1111
0111 1111
0111 1111
0111 1111

0011 1111
0011 1111
0011 1111
0011 1111				 i=1
0011 1111
0011 1111
0011 1111
1011 1111

0001 1111
0001 1111
0001 1111
0001 1111				 i=2
0001 1111
0001 1111
1001 1111
1101 1111

0000 1111
0000 1111
0000 1111
0000 1111				 i=3
0000 1111
1000 1111
1100 1111
1110 1111

0000 0111
0000 0111
0000 0111
0000 0111				i=4
1000 0111
1100 0111
1110 0111
1111 0111

0000 0011
0000 0011
0000 0011
1000 0011				i=5
1100 0011
1110 0011
1111 0011
1111 1011

0000 0001
0000 0001
1000 0001
1100 0001
1110 0001				i=6
1111 0001
1111 1001
1111 1101

0000 0000
1000 0000
1100 0000
1110 0000
1111 0000				i=7
1111 1000
1111 1100
1111 1110

1000 0000
1100 0000
1110 0000
1111 0000
1111 1000				i=8
1111 1100
1111 1110
1111 1111

1100 0000
1110 0000
1111 0000
1111 1000
1111 1100				i=9
1111 1110
1111 1111
1111 1111


1110 0000
1111 0000
1111 1000
1111 1100
1111 1110				i=10
1111 1111
1111 1111
1111 1111


1111 0000
1111 1000
1111 1100
1111 1110
1111 1111				i=11
1111 1111
1111 1111
1111 1111

1111 1000
1111 1100
1111 1110
1111 1111
1111 1111				i=12
1111 1111
1111 1111
1111 1111


1111 1100
1111 1110
1111 1111
1111 1111
1111 1111				i=13
1111 1111
1111 1111
1111 1111

1111 1110
1111 1111
1111 1111
1111 1111
1111 1111				i=14
1111 1111
1111 1111
1111 1111


1111 1111
1111 1111
1111 1111
1111 1111
1111 1111				i=15
1111 1111
1111 1111
1111 1111

*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -