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位赋初值
}
}
后续方法慢慢总结。