打印
[其他]

单片机模拟74HC595功能

[复制链接]
339|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 虹涛犹珷 于 2023-2-13 12:04 编辑

#申请原创#
最近想做个4位数码管显示的DIY制作,主控单片机IO太少,无法直接驱动,想用74HC595扩展IO,手头上又没有现成的芯片,单片机到时一大把,闲着没事就想用单片机模拟一个74HC595,还要实现主机的程序无需更改。(就是程序不改,把单片机换成74HC595芯片,一样能工作) 为了减少出错次数,首先仿真一下。
第一步撸个主机驱动595的驱动程序先:
/***********************************************************
函数结果:74HC595驱动
备  注:   
***********************************************************/
void HC595_Master_COM1_WR_NByte(uint8_t Len, uint8_t *GPIOValue)
{
       uint8_t i=0,Byte=0;

       HC595_Master_COM1_STCP_RESET();
        while(Len--)
        {
                  Byte=*GPIOValue;
                for(i=0;i<8;i++)
                {               
                        HC595_Master_COM1_SHCP_RESET();
                        if(Byte & 0x80)
                        {
                                HC595_Master_COM1_DS_SET();
                        }
                        else
                        {
                                HC595_Master_COM1_DS_RESET();
                        }
                        HC595_Master_COM1_SHCP_SET();
                        Byte <<= 1;
                }        
                GPIOValue++;
        }
    HC595_Master_COM1_STCP_SET();
}
主函数里面每隔100ms就发9个数据:
//**************************主函数**********************//
void main(void)
{
    uint8_t Buf[9];
    System_Init();
    while (1)
    {
        __delay_ms(100);
        Buf[3]=0x0F;
        Buf[4]=0xF0;
        Buf[8]++;
        HC595_Master_COM1_WR_NByte(9,(uint8_t *)&Buf[0]);
    }
}
仿真通过,数据都能正常显示,偷下懒,只画了6个74HC595级联

接下来撸个丛机的程序:
采用的中断方法,利用上升沿中断。
/***********************************************************
函数结果:HC595_Slave_COM1_ISR
备  注:  
***********************************************************/
void HC595_Slave_COM1_ISR(void)
{
    if((!HC595_Slave_COM1_STCP)&&(MyHC595.Cnt < MyHC595.SlaveRx_INTCnt))
    {
        if(MyHC595.Cnt >= MyHC595.SlaveTx_Q7SCnt)
        {   
                       if(MyHC595.BitBuf[MyHC595.i] & 0x01)
                        {
                                HC595_Slave_COM1_Q7S=1;
                        }
                        else
                        {
                                HC595_Slave_COM1_Q7S=0;
                        }
                        MyHC595.i++;
        }
        MyHC595.Buf[MyHC595.Len] <<= 1;
        MyHC595.Buf[MyHC595.Len]   |= (uint8_t) HC595_Slave_COM1_DS; //数据通过按位“或“运算存入
        MyHC595.BitBuf[MyHC595.Cnt] = (uint8_t) HC595_Slave_COM1_DS;
        MyHC595.Cnt++;
        MyHC595.Len = (uint8_t) (MyHC595.Cnt / 8UL);
    }
}
接收完解析数据:
/***********************************************************
函数结果:HC595_Slave_COM1_AnalysisData
备  注:  
***********************************************************/
void HC595_Slave_COM1_AnalysisData(void)
{
    if((HC595_Slave_COM1_STCP)&&(MyHC595.Cnt >= MyHC595.SlaveRx_INTCnt))//接收完成
    {
        HC595_Slave_COM1_WR_NByte();
        MyHC595.Cnt = 0;
        MyHC595.Len = 0;
        MyHC595.i=0;
    }
}
丛机的主函数啥都不干,就一直等待解析:
//**************************主函数**********************//
void main(void)
{
    System_Init();
    while (1)
    {
        HC595_Slave_COM1_AnalysisData();
    }
}
这样就OK了,可以看出主机程序一样,丛机和74HC595的显示一样。每个丛机显示了3路数据,3个丛机刚好9路数据。

仿真结束,是时候实际操作一下了,画个PCB验证下。如果大家感兴趣,我可以分享下这个PCB源文件,大家可以换成自己熟悉的单片机(带上升沿中断即可)仿真我用的时候PIC的单片机,PCB验证用的是辉芒微的单片机:




可以成功驱动,主机的程序完全兼容74HC595。
附件资料:
PIC_HC595.zip (18.44 KB)
Program_Master.X.zip (98.53 KB)
Program_Slave.X.zip (118.61 KB)

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

1

帖子

0

粉丝