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);
}
}
}