总结TX-1C 51单片机流水灯多种实现方法

1、通过对P1口地址的操作实现流水灯

#include //包含单片机寄存器的头文件
//要点sfr!
sfr x=0xb0; //P1口在存储器中的地址是90H,通过sfr可定义8051内核单片机
     //的所有内部8位特殊功能寄存器,对地址x的操作也就是对P1口的操作
/****************************************
函数功能:延时一段时间
*****************************************/
void delay(void)
 {
 unsigned char i,j;
 for(i=0;i<250;i++)
   for(j=0;j<250;j++); //利用循环等待若干机器周期,从而延时一段时间
 }
/*****************************************
函数功能:主函数
******************************************/
void main(void)
{
 while(1)
 {
     x=0xfe; //第一个灯亮
     delay(); //调用延时函数
     x=0xfd; //第二个灯亮
     delay(); //调用延时函数
     x=0xfb; //第三个灯亮
     delay(); //调用延时函数
     x=0xf7; //第四个灯亮
     delay(); //调用延时函数
     x=0xef; //第五个灯亮
     delay(); //调用延时函数
     x=0xdf; //第六个灯亮
     delay(); //调用延时函数
     x=0xbf; //第七个灯亮
     delay(); //调用延时函数
     x=0x7f; //第八个灯亮
     delay(); //调用延时函数
 }
 }

2、用自增运算控制P0口流水灯

#include //包含单片机寄存器的头文件
/******************************************************
函数功能:延时一段时间
******************************************************/
void delay(void)
{
 unsigned int i;
 for(i=0;i<20000;i++);
}
/******************************************************
函数功能  :主函数
******************************************************/
void main(void)
{
 unsigned char i;
 for(i=0;i<255;i++) //注意i的值不能超过255
 {
     
     P0=i; //将i的值送P0口
     delay(); //调用延时函数
 }
}

3、用右移运算点亮P1口流水灯

#include //包含单片机寄存器的头文件
/*****************************
函数功能:延时一段时间
*****************************/
void delay(void)
{
 unsigned int n;
 for(n=0;n<30000;n++);
}
/*****************************
函数功能:主函数
*****************************/
void main(void)
{
 unsigned char i;
 while(1)
 {
     P1=0xff;
     delay();
   for(i=0;i<8;i++)//设置循环次数为8
   {
       P1=P1>>1; //每次循环P1的各二进位右移1位,高位补0
       delay(); //调用延时函数
   }
 }
 
}

4、用switch语句的控制P0口流水灯

#include //包含单片机寄存器的头文件
sbit S1=P3^4; //将S1位定义为P3.4,可自行定义按键,4,5,6,7都可以
/*****************************
函数功能:延时一段时间
*****************************/
void delay(void)
{
 unsigned int n;
 for(n=0;n<10000;n++);
}
/*****************************
函数功能:主函数
*****************************/
void main(void)
{
 unsigned char i;
 i=0; //将i初始化为0
 while(1)
 {
   if(S1==0) //如果S1键按下
   {
     delay(); //延时一段时间
     if(S1==0) //如果再次检测到S1键按下
     i++; //i自增1
     if(i==9) //如果i=9,重新将其置为1
     i=1;
   }
   switch(i) //使用多分支选择语句
       {
       case 1: P1=0xfe; //第一个LED亮
             break;
         case 2: P1=0xfd; //第二个LED亮
         break;
         case 3:P1=0xfb; //第三个LED亮
         break;
         case 4:P1=0xf7; //第四个LED亮
         break;
         case 5:P1=0xef; //第五个LED亮
         break;
         case 6:P1=0xdf; //第六个LED亮
         break;
         case 7:P1=0xbf; //第七个LED亮
       break;
         case 8:P1=0x7f; //第八个LED亮
         break;
         default: //缺省值,关闭所有LED
         P0=0xff;
       }
   } 
}

5、用while语句控制LED流水灯

#include //包含单片机寄存器的头文件
/****************************************
函数功能:延时约60ms (3*100*200=60000μs)
****************************************/
void delay60ms(void)
{
 unsigned char m,n;
 for(m=0;m<100;m++)
 for(n=0;n<200;n++);
}
/****************************************
函数功能:主函数
****************************************/
void main(void)
{
 unsigned char i;
 while(1) //无限循环
 {
 i=0; //将i初始化为0
   while(i<0xff) //当i小于0xff(255)时执行循环体
   {
         P1=i; //将i送P0口显示
         delay60ms(); //延时
         i++; //i自增1
   }
 }
}

6、用do-while语句控制P1口流水灯

#include //包含单片机寄存器的头文件
/****************************************
函数功能:延时约60ms (3*100*200=60000μs)
****************************************/
void delay60ms(void)
{
 unsigned char m,n;
 for(m=0;m<100;m++)
 for(n=0;n<200;n++);
}
/****************************************
函数功能:主函数
****************************************/
void main(void)
{
 do
 {
   P1=0xfe; //第一个LED亮
   delay60ms();
   P1=0xfd; //第二个LED亮
   delay60ms();
   P1=0xfb; //第三个LED亮
   delay60ms();
   P1=0xf7; //第四个LED亮
   delay60ms();
   P1=0xef; //第五个LED亮
   delay60ms();
   P1=0xdf; //第六个LED亮
   delay60ms();
   delay60ms();
   P1=0xbf; //第七个LED亮
   delay60ms();
   P1=0x7f; //第八个LED亮
   delay60ms();
 }while(1); //无限循环,使8位LED循环流水点亮
}

7、用字符数组控制P1口流水灯

#include //包含单片机寄存器的头文件
/****************************************
函数功能:延时约60ms (3*100*200=60000μs)
****************************************/
void delay60ms(void)
{
 unsigned char m,n;
 for(m=0;m<100;m++)
 for(n=0;n<200;n++);
}
/****************************************
函数功能:主函数
****************************************/
void main(void)
{ 
 unsigned char i;
 unsigned char code Tab[ ]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; //定义无符号字符型数组 
 while(1)
 {
 for(i=0;i<8;i++)
 {
 P1=Tab[i];//依次引用数组元素,并将其送P0口显示
 delay60ms();//调用延时函数
 }
 }
}

8、用P1口显示字符串常量实现流水灯

#include //包含单片机寄存器的头文件
/*************************************************
函数功能:延时约150ms (3*200*250=150)
*************************************************/
void delay150ms(void)
{
 unsigned char m,n;
 for(m=0;m<200;m++)
 for(n=0;n<250;n++);
}
/*************************************************
函数功能:主函数
*************************************************/
void main(void)
{ 
 unsigned char str[]={"Now,Temperature is :"}; //将字符串赋给字符型全部元素赋值
 unsigned char i;
 while(1)
 {
 i=0; //将i初始化为0,从第一个元素开始显示
 while(str[i]!='\0') //只要没有显示到结束标志'\0'
 {
   P1=str[i]; //将第i个字符送到P0口显示
   delay150ms(); //调用150ms延时函数
   i++; //指向下一个待显字符
   }
 }
}

9、用数组的指针控制P1口流水灯

#include
/*************************************************
函数功能:延时约150ms (3*200*250=150)
*************************************************/
void delay150ms(void)
{
 unsigned char m,n;
 for(m=0;m<200;m++)
 for(n=0;n<250;n++);
}
/*************************************************
函数功能:主函数
*************************************************/
void main(void)
{ 
 unsigned char code Tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
 unsigned char *p[ ]={&Tab[0],&Tab[1],&Tab[2],&Tab[3],&Tab[4],&Tab[5],
 &Tab[6],&Tab[7]};
 unsigned char i; //定义无符号字符型数据
 while(1)
 {
 for(i=0;i<8;i++)
   {
     P1=*p[i];
     delay150ms();
   }
 }
}

10、用数组的指针控制P1口流水灯(多花样)

#include
/*************************************************
函数功能:延时约150ms (3*200*250=150)
*************************************************/
void delay150ms(void)
{
 unsigned char m,n;
 for(m=0;m<200;m++)
 for(n=0;n<250;n++);
}
/*************************************************
函数功能:主函数
*************************************************/
void main(void)
{ 
 unsigned char i; 
 unsigned char Tab[ ]={0xFF,0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,
                   0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,
             0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,0x00,
           0xE7,0xDB,0xBD,0x7E,0x3C,0x18,0x00,0x81,
         0xC3,0xE7,0x7E,0xBD,0xDB,0xE7,0xBD,0xDB};
               //流水灯控制码
 unsigned char *p; //定义无符号字符型指针
 p=Tab; //将数组首地址存入指针p
 while(1)
 {
 for(i=0;i<32;i++) //共32个流水灯控制码
   {
     P1=*(p+i); //*(p+i)的值等于a[i]
     delay150ms(); //调用150ms延时函数
   }
 }
}

11、用字符数组控制P1口流水灯速度快慢

#include
/*************************************************
函数功能:延时一段时间
*************************************************/
void delay(unsigned char x)
{
 unsigned char m,n;
 for(m=0;m

12、用数组做参数控制流水灯

#include
/*************************************************
函数功能:延时约150ms
*************************************************/
void delay(void)
{
 unsigned char m,n;
 for(m=0;m<200;m++)
 for(n=0;n<250;n++);
}
/*************************************************
函数功能:流水点亮P0口8位LED
*************************************************/
void led_flow(unsigned char a[8])
{
 unsigned char i;
 for(i=0;i<8;i++)
 {
 P1=a[i];
 delay();
 }
}
/*************************************************
函数功能:主函数
*************************************************/
void main(void)
{ 
 unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F}; 
               //流水灯控制码 
 led_flow(Tab);
 
}

13、用指针作函数参数控制P1流水灯

#include
/*************************************************
函数功能:延时约150ms
*************************************************/
void delay(void)
{
 unsigned char m,n;
 for(m=0;m<200;m++)
 for(n=0;n<250;n++);
}
/*************************************************
函数功能:流水点亮P0口8位LED
*************************************************/
void led_flow(unsigned char *p) //形参为无符号字符型指针
{
   unsigned char i;
while(1)
 {
 i=0; //将i置为0,指向数组第一个元素
 while(*(p+i)!='\0') //只要没有指向数组的结束标志
 {
   P1=*(p+i);// 取的指针所指变量(数组元素)的值,送P0口
   delay(); //调用延时函数
   i++; //指向下一个数组元素
 }
 }
}
/*************************************************
函数功能:主函数
*************************************************/
void main(void)
{ 
 unsigned char code Tab[ ]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F, 
                   0x7F,0xBF,0xDF,0xEF,0xF7,0xFB,0xFD,0xFE,
                   0xFF,0xFE,0xFC,0xFB,0xF0,0xE0,0xC0,0x80,
                   0x00,0xE7,0xDB,0xBD,0x7E,0xFF,0xFF,0x3C,
                   0x18,0x0,0x81,0xC3,0xE7,0xFF,  0xFF,0x7E};
                   //流水灯控制码 
 unsigned char *pointer;
 pointer=Tab;
 led_flow(pointer);
 
}

14、用函数指针控制P1流水灯

#include //包含51单片机寄存器定义的头文件
unsigned char code Tab[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
//流水灯控制码,该数组被定义为全局变量
/**************************************************************
函数功能:延时约150ms
**************************************************************/
 void delay(void) 
{
 unsigned char m,n;
 for(m=0;m<200;m++)
 for(n=0;n<250;n++);
 }
/**************************************************************
函数功能:流水灯左移
**************************************************************/
void led_flow(void)
{
 unsigned char i;
 for(i=0;i<8;i++) //8位控制码
 {
   P1=Tab[i];
   delay();
 }
 
}
/**************************************************************
函数功能:主函数
**************************************************************/ 
 void main(void)
 {
 void (*p)(void); //定义函数型指针,所指函数无参数,无返回值  
 p=led_flow; //将函数的入口地址赋给函数型指针p
 while(1)
 (*p)(); //通过函数的指针p调用函数led_flow()
}

15、用指针数组作为函数的参数显示多个字符串实现花样流水灯

#include //包含51单片机寄存器定义的头文件
unsigned char code str1[ ]="Temperature is tested by DS18B20";//C语言中,字符串是作为字符数组来处理的
unsigned char code str2[ ]="Now temperature is:"; //所以,字符串的名字就是字符串的首地址 
unsigned char code str3[ ]="The Systerm is designed by Zhang San";
unsigned char code str4[ ]="The date is 2008-9-30";
unsigned char *p[ ]={str1,str2,str3,str4}; //定义p[4]为指向4个字符串的字符型指针数组 
/**************************************************************
函数功能:延时约150ms
**************************************************************/
 void delay(void) 
{
 unsigned char m,n;
 for(m=0;m<200;m++)
 for(n=0;n<250;n++);
 }
/**************************************************************
函数功能:流水点亮P0口8位LED
**************************************************************/
void led_display(unsigned char *x[ ]) //形参必须为指针数组
{
 unsigned char i,j;    
 for(i=0;i<4;i++) //有4个字符串要显示
 {
   j=0; //指向待显字符串的第0号元素
 while(*(x[i]+j)!='\0') //只要第i个字符串的第j号元素不是结束标志
   {
      P1=*(x[i]+j); //取得该元素值送到P0口显示
      delay(); //调用延时函数
      j++; //指向下一个元素
   }
   }      
}
/**************************************************************
函数功能:主函数
**************************************************************/ 
 void main(void)
 {
 unsigned char i;
 while(1)
 {
 for(i=0;i<4;i++)
   led_display(p); //将指针数组名作实际参数传递
 }
}

16、用定时器T0查询方式P1口控制8位LED闪烁(不是流水灯)

#include // 包含51单片机寄存器定义的头文件
/**************************************************************
函数功能:主函数
**************************************************************/
void main(void)
{
 // EA=1; //开总中断
//  ET0=1; //定时器T0中断允许 
 TMOD=0x01; //使用定时器T0的模式1
 TH0=(65536-46083)/256; //定时器T0的高8位赋初值
 TL0=(65536-46083)%256; //定时器T0的高8位赋初值
 TR0=1; //启动定时器T0
 TF0=0;
 P1=0xff;
 while(1)//无限循环等待查询
 {
   while(TF0==0);
   TF0=0;
   P1=~P1;
 TH0=(65536-46083)/256; //定时器T0的高8位赋初值
 TL0=(65536-46083)%256; //定时器T0的高8位赋初值
 }
 }

后续方法慢慢总结。

你可能感兴趣的:(51单片机)