嵌入式——花样流水灯

本文介绍了如何利用单片机的位操作、并行I/O和移位运算符控制LED灯的流水效果,并结合蜂鸣器实现灯亮时发声,灯灭时静音。还展示了使用条件语句、数组和指针实现灯循环流动的不同方法。
摘要由CSDN通过智能技术生成

1、使用“位操作”控制流水灯

任务:利用单片机的“位操作”,依次使8个LED亮500毫秒,不断循环 

#include<reg52.h>
sbit LED0 = P2^0;          //sbit声明一个可位寻址变量,进行位操作,P2^0表示P2.0口
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit LED5 = P2^5;
sbit LED6 = P2^6;
sbit LED7 = P2^7;

void delay(int a)
{
		int i,j;
		for(i = 0;i<a;i++)
			for(j=0;j<100;j++);
}

int main()
{
   while(1)
	 {
			LED0 = 0;delay(100);LED0 = 1;
			LED1 = 0;delay(100);LED1 = 1;
			LED2 = 0;delay(100);LED2 = 1;
			LED3 = 0;delay(100);LED3 = 1;
			LED4 = 0;delay(100);LED4 = 1;
			LED5 = 0;delay(100);LED5 = 1;
			LED6 = 0;delay(100);LED6 = 1;
			LED7 = 0;delay(100);LED7 = 1;
	 }
}

2、使用字节控制(即并行I/O口控制)流水灯

任务:用操作字节(即并行I/O口控制)的方法,控制8个LED灯每次亮三个,并循环流动。

#include<reg51.h>
#define LED P2            //宏定义。用LED表示P2。程序在执行过程中,凡是执行到LED,会自动替换成P2
#define T 10000

void delay(unsigned int i){while(--i);}

int main()
{
   while(1)
	 {      //P2的8个脚与十六进制的8个位相对应,0表示低电位,灯亮
			LED = 0x1f;delay(T);     //0x1f=0001 1111
			LED = 0x8f;delay(T);     //0x8f=1000 1111
			LED = 0xc7;delay(T);     //0xc7=1100 0111
			LED = 0xe3;delay(T);     //0xe3=1110 0011
			LED = 0xf1;delay(T);     //0xf1=1111 0001
			LED = 0xf8;delay(T);     //0xf8=1111 1000
			LED = 0x7c;delay(T);     //0x7c=0111 1100
			LED = 0x3e;delay(T);     //0x3e=0011 1110
	 }
}

3、使用移位运算符控制流水灯

任务: 用移位运算符,控制8个LED灯每次亮三个,并循环流动。

代码一:

#include<reg51.h>           
#define T 300000
#define D 0x1f

void delay(unsigned int i){while(--i);}

int main()
{
   while(1)
	 { 
			P2=(D>>0)|(D<<8);delay(T);
			P2=(D>>1)|(D<<7);delay(T);
			P2=(D>>2)|(D<<6);delay(T);
			P2=(D>>3)|(D<<5);delay(T);
			P2=(D>>4)|(D<<4);delay(T);
			P2=(D>>5)|(D<<3);delay(T);
			P2=(D>>6)|(D<<2);delay(T);
			P2=(D>>7)|(D<<1);delay(T);
	 }
}

代码二:

//一次性连着亮三个灯进行循环
#include<reg51.h>           
#define T 300000
#define D 0x1f

void delay(unsigned int i){while(--i);}

int main()
{
   while(1)
	 { 
	 char b=8,a;
	 for(a=0;a<8;a++){
			P2=(D>>a)|(D<<b--);delay(T);
	 }
	 }
}

4、使用“位操作”控制流水灯,同时控制蜂鸣器

任务:8个发光二极管中每次只点亮一个,由左至右间隔1s流动点亮,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。

#include<reg51.h>  
unsigned char j = 100;  //j用于蜂鸣器响的时间
sbit LED0 = P2^0;
sbit LED1 = P2^1;
sbit LED2 = P2^2;
sbit LED3 = P2^3;
sbit LED4 = P2^4;
sbit BEEP = P2^5;    //我开发板的蜂鸣器连的p2.5口,所以每个灯用单独的引脚来控制,也会导致有一个灯会一直在闪
sbit LED6 = P2^6;
sbit LED7 = P2^7;

void delay(unsigned int i){while(--i);}

void Buzzer(){
	while(--j){         
		BEEP = 0;
		delay(100);      //我的蜂鸣器时无源蜂鸣器,它需要一定频率的脉冲,通过一定时间交替变化高低电平从而产生频率
		BEEP = 1;
	}
}


int main()
{
while(1){
	LED0 = 0;Buzzer();LED0 = 1;delay(100000);
	LED1 = 0;Buzzer();LED1 = 1;delay(100000);
	LED2 = 0;Buzzer();LED2 = 1;delay(100000);
	LED3 = 0;Buzzer();LED3 = 1;delay(100000);
	LED4 = 0;Buzzer();LED4 = 1;delay(100000);
	BEEP = 0;Buzzer();BEEP = 1;delay(100000);
	LED6 = 0;Buzzer();LED6 = 1;delay(100000);
	LED7 = 0;Buzzer();LED7 = 1;delay(100000);
}
}

5、使用循环移位函数实现流水灯,并控制蜂鸣器

任务:8个发光二极管中每次只点亮一个,由左至右间隔1s流动点亮,其中每个管亮500ms,灭500ms,亮时蜂鸣器响,灭时关闭蜂鸣器,一直重复下去。

#include<reg51.h>  
#include<intrins.h>            //含有移位函数_crol_()的头文件
unsigned char j = 250,temp;    //j控制蜂鸣器响的时长以及灯亮的时长,它与内部延时函数相乘,注意char只有255位,如果需要更长的时间,将j改成int类型,temp定义灯的每一个位。
sbit BEEP = P2^5;              //我的蜂鸣器引脚是p2.5口,故每一个灯亮时,总会有两个灯亮

void delay(unsigned int i){    //延时函数带参数的1毫秒延时
    while(--i){
        int j;
        for(j=110;j>0;j--){}
    }
}   

void Buzzer(){               //蜂鸣器发声函数
	while(--j){
		BEEP = 0;
		delay(2);            //0、1交替延时变化,产生频率从而产生不同声音,延时函数控制频率从而控制声音的响声
		BEEP = 1;
	}
}


int main()
{
temp = 0xfe;    //1111 1110      
while(1){
		P2 = temp;Buzzer();
		P2 = 0xff;delay(500);      //灯灭500毫秒
		temp = _crol_(temp,1);
}
}

5、使用条件语句实现流水灯

任务:用if语句实现LED灯循环流动

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

uchar a;
void delay(uint i){    
    while(--i){
        int j;
        for(j=110;j>0;j--){}
    }
}   

void display(){
		if(a==1)P2=0xfe;
		if(a==2)P2=0xfd;
		if(a==3)P2=0xfb;
		if(a==4)P2=0xf7;
		if(a==5)P2=0xef;
		if(a==6)P2=0xdf;
		if(a==7)P2=0xbf;
		if(a==8)P2=0x7f;
}

void main(){
while(1){
		a++;
		display();
		delay(400);
		if(a>7) a=0;
}
}

任务:用switch语句实现LED灯循环流动

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char

uchar a;
void delay(uint i){    
    while(--i){
        int j;
        for(j=110;j>0;j--){}
    }
}   

void display(){
switch(a){
		case 1:P2=0xfe;break;
		case 2:P2=0xfd;break;
		case 3:P2=0xfb;break;
		case 4:P2=0xf7;break;
		case 5:P2=0xef;break;
		case 6:P2=0xdf;break;
		case 7:P2=0xbf;break;
		case 8:P2=0x7f;break;
}
}
void main(){
while(1){
		a++;
		display();
		delay(400);
		if(a>7) a=0;
}
}

6、使用数组实现流水灯

任务:使用数组实现流水灯效果

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar k;

void delay(uint i){    
    while(--i){
        int j;
        for(j=110;j>0;j--){}
    }
}   

void main(){
uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
while(1){
		for(k=0;k<8;k++){
			P2 = table[k];
			delay(500);
		}
}
}

7、使用指针实现流水灯

任务:使用指针实现流水灯

#include<reg51.h>
#define uint unsigned int
#define uchar unsigned char
uchar k,*p;

void delay(uint i){    
    while(--i){
        int j;
        for(j=110;j>0;j--){}
    }
}

uchar table[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};

void main(){
p = &table;
while(1){
		for(k=0;k<8;k++){
			P2 = *(p+k);
			delay(500);
		}
}
}
  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值