51单片机点阵实验

1.电路图解析

1.1点阵实验图

P0控制全部行有效,P0输出低电平有效;74hc595输出控制全部列有效,输出高电平有效.

让P0^7的端口为低电平,P0的其他端口为高电平;D7的端口为高电平,则第一行第一列的led被点亮

1.2 74hc595的原理图

(1)D0~D7,并行输出,接LED。

(2)16号和8号引脚,分别接Vcc,Gnd。

(3)OE,13号引脚,低电平才输出有效,让它接地。

(4)10号引脚,主复位引脚,低有效。目前不需要复位,直接接VCC就好.

(5)14号引脚SER,接在集成板的P3^4,为串行输入端。

(6)11号引脚SRCLK,接在集成板的P3^6;上升沿时,将串行口RCLK的一位,移位输入。

(7)12号引脚RCLK,接在集成板的P3^5;上升沿时,将移入的8位数据,送到存储寄存器。

1.2实验程序(显示第一个灯):

#include "reg51.h"
#include<intrins.h>

sbit SER=P3^6;
sbit SRCLK=P3^5;
sbit RCLK=P3^4;

void HC595sendbyte(unsigned char dat)
{
     unsigned char a;
    SRCLK=0;
    RCLK=0;
    for(a=0;a<8;a++)//从高位到低位,依次串行输入
    {
      SER=dat>>7;
      dat<<=1;

      SRCLK=1;    //上升沿,依次串行输入8位数据
      _nop_();    //一个机器周期
      _nop_();
      SRCLK=0;
     }

     RCLK=1;    //上升沿,将数据送入存储寄存器
     _nop_();
     _nop_();
     RCLK=0;
}

void main()
{
  HC595sendbyte(0x00);
  while(1)
  {
    P0=0x7f;
    HC595sendbyte(0x80);
   }
 }

1.3实验程序(显示数字0):

#include "reg51.h"             //此文件中定义了单片机的一些特殊功能寄存器
#include<intrins.h>

typedef unsigned int u16;      //对数据类型进行声明定义
typedef unsigned char u8;

sbit SRCLK=P3^6;
sbit RCLK=P3^5;
sbit SER=P3^4;

u8 ledduan[]={0x00,0x00,0x3e,0x41,0x41,0x41,0x3e,0x00};//D0~D7控制行
u8 ledwei[]={0x7f,0xbf,0xdf,0xef,0xf7,0xfb,0xfd,0xfe};//P0控制列
/*******************************************************************************
* 函 数 名         : delay
* 函数功能           : 延时函数,i=1时,大约延时10us
*******************************************************************************/
void delay(u16 i)
{
    while(i--);    
}

/*******************************************************************************
* 函数名         : Hc595SendByte(u8 dat)
* 函数功能           : 向74HC595发送一个字节的数据
* 输入           : 无
* 输出              : 无
*******************************************************************************/
void Hc595SendByte(u8 dat)
{
    u8 a;
    SRCLK=0;
    RCLK=0;
    for(a=0;a<8;a++)
    {
        SER=dat>>7;
        dat<<=1;

        SRCLK=1;
        _nop_();
        _nop_();
        SRCLK=0;    
    }

    RCLK=1;
    _nop_();
    _nop_();
    RCLK=0;
}

/*******************************************************************************
* 函 数 名       : main
* 函数功能         : 主函数
* 输    入       : 无
* 输    出         : 无
*******************************************************************************/
void main()
{            
    u8 i;
    while(1)
    {
        P0=0x7f;
        for(i=0;i<8;i++)
        {
            P0=ledwei[i];          //位选,先选择一列
            Hc595SendByte(ledduan[i]);    //发送段选数据(行数据)
            delay(100);           //延时
            Hc595SendByte(0x00);  //消隐
        }    
    }        
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值