用51单片机实现流水灯和数码管1-F

(1)程序运行时P0^0的LED点亮,数码管显示0;

(2)当完成一次按键操作,P0^0的LED熄灭,P0^1的LED点亮,以此类推;同时数码管进行计数,完成一次按键操作,计数加 1 ,显示范围0-F;

img

点亮LED灯

#include "reg52.h"//调用52单片机的头文件,写51也可以// 
sbit LED=P2^0;//sbit 是用来确定地址,这里是把LED定义为P2的0号接口//
void main()
{
    LED=0;//代表着P2口出低电位使发光二极管前后产生电位差而发光//
}


流水灯实现

#include "reg52.h" 
#define LED P2
#define ui unsigned int
#define uc unsigned char


void delayms(ui del) //延时语句,延时时长为(del*10)ms    
{
    ui i,j;
    for(i=0; i<del; i++)
    for(j=0; j<1827; j++)  ;
}
    
void main(){
    int i;
    
    while(1){
    for(i=1;i<8;i++){
    LED=(0xff<<i);//把0的那一位不断左移使二极管导通
    delayms(15);//此处延时是为了展现视觉效果,不延时会太快人眼看不出流水效果
        }
    }    
}


实现使流水灯从左到右再从右到左

#include "reg52.h" 
#define LED P2
#define ui unsigned int
#define uc unsigned char


void delayms(ui del)     
{
    ui i,j;
    for(i=0; i<del; i++)
    for(j=0; j<1827; j++)  ;
}
    
void main(){
    int i;
    
    while(1){

    for(i=1;i<8;i++){
    LED=(0xff<<i);
    delayms(15);
    }
    LED=0x00;//让所有灯熄灭准备待会反着来亮
    delayms(10);//这就是待会……
     for(i=1;i<8;i++){
    LED=(0xff>>i);//右移!
    delayms(15);
    }    
}
}


img


最简单的让数码管显示一个’0’的代码:

#include<reg52.h>
void main()
{
    P0=0X3F;//显示字符‘0’
}


img

进行动态显示

#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
sbit LSA = P2^2;
sbit LSB = P2^3;
sbit LSC = P2^4;
u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,
                    0x66, 0x6d, 0x7d, 0x07,
                    0x7f, 0x6f, 0x77, 0x7c,
                    0x39, 0x5e, 0x79, 0x71}; //0~F数码
void delay(u16 i) //延时函数
{
    while(i--);
}
    
void DigDisplay() //数码管显示函数
{
    u8 i;
    for(i=0;i<8;i++)
    { 
      switch(i)
      {
        case 0:
              LSC = 0;LSB = 0;LSA = 0;break; //显示第1个数码管
        case 1:
              LSC = 0;LSB = 0;LSA = 1;break; //显示第2个数码管
        case 2:
             LSC = 0;LSB = 1;LSA = 0;break; //显示第3个数码管
        case 3:
            LSC = 0;LSB = 1;LSA = 1;break; //显示第4个数码管
        case 4:
            LSC = 1;LSB = 0;LSA = 0;break; //显示第5个数码管
        case 5:
              LSC = 1;LSB = 0;LSA = 1;break; //显示第6个数码管
        case 6:
              LSC = 1;LSB = 1;LSA = 0;break; //显示第7个数码管
        case 7:
             LSC = 1;LSB = 1;LSA = 1;break; //显示第8个数码管
      }
      P0 = smgduan[i+1];//显示1~8的数值
      delay(100); //延时,造成视觉暂留现象
      P0 = 0x00; //数码管消隐
    }
}    
 
void main()
{
   while(1)
   {
   DigDisplay();
   }
}