精华内容
下载资源
问答
  • 在74HC595等串口转并口芯片接线的时候,我们会遇到两个问题:74HC595有时候按次序接线较困难。比如上图,我的我这样接线是方便,但是一些图形显示的库就不能直接用了,因为这些库需要按固定次序连线,当然,我们可以...

    在74HC595等串口转并口芯片接线的时候,我们会遇到两个问题:

    74HC595

    有时候按次序接线较困难。比如上图,我的我这样接线是方便,但是一些图形显示的库就不能直接用了,因为这些库需要按固定次序连线,当然,我们可以改造数码管字库数据,但太麻烦了。

    我的74HC595某引脚连接的电路坏了,或者我只想使用部分引脚。比如我焊接的8个LED有3个坏了,我想在LED顺序点亮的时候只点亮5个。或者我只想用4个LED,传数据的时候,我只传0~15即可。

    我写了两个函数来解决这些问题。这两个函数均是可变长参数,感觉还比较好用。

    shiftOutQPins 这个函数可以用来解决问题2。用法和shirtOut相同,后面多了几个参数,表示你要使用的针脚。数字对应使用的Q引脚号。引脚使用的次序是按MSBFIRST和LSBFIRST来的,和输入的次序无关。

    如果要们要使用Q7,Q5,Q3,Q2,前几个参数和shiftOut类似,后面加上4,7,5,3,2。4表示参数的个数。

    shiftOutQPinsOrder 可以用来解决问题1和2。和shiftOutQPin不同的是,是按次序使用制定的引脚的,所以少了bitOrder参数。

    shiftOutQPinsOrder(dataPin, clockPin, val, 8, 7, 6, 5, 4, 3, 2, 1, 0);

    等同于shiftOut(dataPin, clockPin, MSBFIRST, val);

    shiftOutQPinsOrder(dataPin, clockPin, val, 8, 0, 1, 2, 3, 4, 5, 6, 7);

    等同于shiftOut(dataPin, clockPin, LSBFIRST, val);

    上图应该用shiftOutQPinsOrder(dataPin, clockPin, val, 8, 6, 7, 1, 2, 3, 5, 4, 0);

    这两个函数本质是对shiftOut的封装,能用shiftOut的情况皆可用这两个封装。

    // 只使用74HC595等芯片部分引脚输出数据

    //

    // 和系统shiftOut函数参数对比

    // shiftOutQPins(dataPin, clockPin, bitOrder, value, count, pins...);

    // shiftOut(dataPin, clockPin, bitOrder, val);

    // dataPin, clockPin, bitOrder:用法与shiftOut函数相同

    // value:使用的针脚能表示的数值,如果用到n个针脚,数值最大应为2^n-1,若超过范围,只截取后面n位的数据

    // count:要使用的QPin个数

    // pins:使用的QPin针脚,次序可任意

    //

    // 使用范例

    // DS,SH_CP分别接在Arduino 11,12引脚,使用Q6, Q4, Q2, Q1, Q0五个引脚,使 Q6 与 Q2 输出高电平:

    // shiftOutQPins(11, 12, MSBFIRST, B10100, 5, 6, 4, 2, 1, 0);

    void shiftOutQPins(uint8_t dataPin, uint8_t clockPin, uint8_t order, uint8_t value, int count, ...) {

    int8_t pins[8] = { -1, -1, -1, -1, -1, -1, -1, -1};

    if (count <= 0) return;

    if (count > 8) count = 8;

    int8_t pin;

    va_list ap;

    va_start(ap, count);

    uint8_t index = 0;

    for (uint8_t i = 0; i < count; i++) {

    pin = va_arg(ap, int);

    if (pin < 0 || pin > 7) continue;

    pins[index] = pin;

    index++;

    }

    va_end(ap);

    qsort(pins, index, sizeof(int8_t), &ascending);

    if (order == LSBFIRST) {

    shiftOutQPinsOrder(dataPin, clockPin, value, 8, pins[0], pins[1], pins[2],

    pins[3], pins[4], pins[5], pins[6], pins[7]);

    } else {

    shiftOutQPinsOrder(dataPin, clockPin, value, 8, pins[7], pins[6], pins[5],

    pins[4], pins[3], pins[2], pins[1], pins[0]);

    }

    }

    // 使74HC595等芯片按指定的引脚次序输出数据,可只使用部分引脚

    //

    // void shiftOutQPinsOrder(uint8_t dataPin, uint8_t clockPin, uint8_t value, int count, pins...)

    // dataPin, clockPin:用法与shiftOut函数相同

    // value:使用的针脚能表示的数值,如果用到n个针脚,数值最大应为2^n-1,若超过范围,只截取后面n位的数据

    // count:要使用的QPin个数

    // pins:使用的QPin针脚,有次序

    //

    // shiftOutQPinsOrder(dataPin, clockPin, val, 8, 7, 6, 5, 4, 3, 2, 1, 0);

    // 等同于shiftOut(dataPin, clockPin, MSBFIRST, val);

    //

    // shiftOutQPinsOrder(dataPin, clockPin, val, 8, 0, 1, 2, 3, 4, 5, 6, 7);

    // 等同于shiftOut(dataPin, clockPin, LSBFIRST, val);

    //

    // 使用范例(1)

    // DS,SH_CP分别接在Arduino 11,12引脚,要按照Q7, Q6, Q2, Q1, Q0,Q3, Q5, Q4次序输出:

    // shiftOutQPinsOrder(11, 12, B11111111, 8, 7, 6, 2, 1, 0, 3, 5, 4);

    // 使用范例(2)

    // DS,SH_CP分别接在Arduino 11,12引脚,使用Q6, Q4, Q2, Q1, Q0五个引脚,使 Q6 与 Q2 输出高电平:

    // shiftOutQPinsOrder(11, 12, B10100, 5, 6, 4, 2, 1, 0);

    void shiftOutQPinsOrder(uint8_t dataPin, uint8_t clockPin, uint8_t value, int count, ...) {

    int8_t pins[8] = { -1, -1, -1, -1, -1, -1, -1, -1};

    if (count <= 0) return;

    if (count > 8) count = 8;

    int8_t pin;

    va_list ap;

    va_start(ap, count);

    uint8_t index = 0;

    for (uint8_t i = 0; i < count; i++) {

    pin = va_arg(ap, int);

    if (pin < 0 || pin > 7) continue;

    pins[index] = pin;

    index++;

    }

    va_end(ap);

    // 7, 4, 6, 1, 2 // 引脚数组pins(忽略未使用的引脚)

    // 1, 2, 4, 6, 7 // 排序后数组pinsOrdered

    // 4, 2, 3, 0, 1 // 7,4,6,1,2在pinsOrdered中的索引(position)

    int8_t pinsOrdered[8];

    memcpy(pinsOrdered, pins, sizeof(pins)); // 复制pins数据到pinsOrdered

    qsort(pinsOrdered, index, sizeof(int8_t), &ascending);

    uint8_t val = 0;

    for (uint8_t i = 0; i < index; i++) {

    uint8_t position = 0;

    for (; position < index; position++) {

    if (pins[i] == pinsOrdered[position]) break;

    }

    uint8_t bitValue = (!!(value & (1 << position))) << (index - 1 - i);

    val += bitValue;

    }

    shiftOut(dataPin, clockPin, 1, val);

    }

    // 用于qsort函数,从小到大排列

    int ascending(const void * a, const void * b) {

    return *((int8_t *)a) - *((int8_t *)b);

    }

    展开全文
  • 74HC595串口转并口芯片学习

    千次阅读 2019-04-29 21:35:57
    当 MR 为高电平,OE 为低电平时,数据在 SHCP 上升沿进入移位寄存器,在 STCP 上升沿输出到并行端口。 74595 的数据端: QA–QH: 八位并行输出端,可以直接控制数码管的 8 个段。 QH’: 级联输出端。...

    在这里插入图片描述
    当 MR 为高电平,OE 为低电平时,数据在 SHCP 上升沿进入移位寄存器,在
    STCP 上升沿输出到并行端口。
    74595 的数据端:
    QA–QH: 八位并行输出端,可以直接控制数码管的 8 个段。
    QH’: 级联输出端。我将它接下一个 595 的 SI 端。
    SI: 串行数据输入端
    74HC595 是具有 8 位移位寄存器和一个存储器,三态输出功能。 移位寄存
    器和存储器是分别的时钟。数据在 SCHcp 的上升沿输入,在 STcp 的上升沿进入
    的存储寄存器中去。如果两个时钟连在一起,则移位寄存器总是比存储寄存器早
    一个脉冲。移位寄存器有一个串行移位输入(Ds),和一个串行输出(Q7’),
    和一个异步的低电平复位,存储寄存器有一个并行 8 位的,具备三态的总线输
    出,当使能 OE 时(为低电平),存储寄存器的数据输出到总线。

    74595 的控制端说明:
    /SCLR(10 脚): 低点平时将移位寄存器的数据清零。通常我将它接 Vcc。
    SCK(11 脚):上升沿时数据寄存器的数据移位。QA–>QB–>QC–>…–>QH;下
    降沿移位寄存器数据不变。(脉冲宽度:5V 时,大于几十纳秒就行了。)
    RCK(12 脚):上升沿时移位寄存器的数据进入数据存储寄存器,下降沿时存储寄
    存器数据不变
    。通常我将 RCK 置为低点平,当移位结束后,在 RCK 端产生一
    个正脉冲(5V 时,大于几十纳秒就行了。我通常都选微秒级),更新显示数据。
    /G(13 脚): 高电平时禁止输出(高阻态)。如果单片机的引脚不紧张,用一个引
    脚控制它,可以方便地产生闪烁和熄灭效果。比通过数据端移位控制要省时省力。
    在这里插入图片描述在这里插入图片描述
    下面的代码实现一个流水灯的效果
    #include <reg51.h>
    #include “intrins.h”
    typedef unsigned int u16;
    typedef unsigned char u8;

    sbit sck=P3^6;//移位寄存器时钟信号
    sbit rck=P3^5;//存储寄存器时钟信号
    sbit ser=P3^4;//串行输入
    void Delay10ms() //@12.000MHz
    {
    unsigned char i, j;

    i = 117;
    j = 184;
    do
    {
    	while (--j);
    } while (--i);
    

    }

    void delay(u8 i)
    {
    while(i–);
    }
    void Hc595(u8 sdata)
    {
    int i;
    for(i=0;i<8;i++)
    {
    sck=1;
    ser=sdata>>7;//取最高位
    sdata<<=1;//将次高位移到最高位
    sck=0;//先给一个下降沿
    nop();
    nop();
    sck=1;//再给一个上升沿,让595移位一次

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

    }
    void main()
    {
    u8 i;
    i=1;
    while(1)
    {
    Hc595(i);
    i=crol(i,1);//循环左移一位
    Delay10ms();
    }

    }

    展开全文
  • Protues仿真实例-51单片机-串口转并口.rar
  • //PS:由于串口每贞发10bit,所以500k的波特率每秒只发50k个字节(一字节=8bit)//PS:当counter_1相关数据为217,counter_3相关数据为434时,波特率为115200//PS:当counter_1相关数据为100,counter_3相关数据为200时...

    //PS:由于串口每贞发10bit,所以500k的波特率每秒只发50k个字节(一字节=8bit)

    //PS:当counter_1相关数据为217,counter_3相关数据为434时,波特率为115200

    //PS:

    当counter_1相关数据为100,counter_3相关数据为200时,波特率为250K

    module uart_rxd

    (rxd,ben_zhen,out_data,int0);//本程序的接收波特率由时钟频率和counter_1及counter_3共同决定,算法见下

    input

    rxd,ben_zhen;//输入频率的时钟,本例为50Mhz,本例的接收波特率为500k

    output[7:0]out_data;//串口数据并行输出

    output int0;//串口数据接收中断输出

    reg[7:0]out_data;

    reg[3:0]counter_2;

    reg[8:0]counter_1,counter_3;

    reg uart_start;

    reg biaozhi;

    reg int0;

    always @(negedge rxd or negedge biaozhi)

    begin

    if(rxd==0)

    uart_start=1;

    else uart_start=0;

    end

    always @(posedge ben_zhen)

    //begin

    //if(rxd==0) uart_start=1;

    //else

    begin

    biaozhi=1; //要更改接收波特率,请按说明修改下面这三行的数据:

    if((uart_start)&&(counter_1<217))begin

    counter_1=counter_1+1;int0=1;end//counter_1取时钟频率除以波特率再除以2,counter_1的作用是保证串口起始位的延时时间

    else

    if((uart_start)&&(counter_1==217)&&(counter_3<434))

    counter_3=counter_3+1;//counter_3取时钟频率除以波特率

    else

    if((uart_start)&&(counter_1==217)&&(counter_3==434))

    begin

    case(counter_2)

    4'd0:out_data[0]=rxd;

    4'd1:out_data[1]=rxd;

    4'd2:out_data[2]=rxd;

    4'd3:out_data[3]=rxd;

    4'd4:out_data[4]=rxd;

    4'd5:out_data[5]=rxd;

    4'd6:out_data[6]=rxd;

    4'd7:out_data[7]=rxd;

    4'd8:begin if(!rxd)out_data=8'hff;else

    biaozhi=0;counter_1=0;counter_2=0;int0=0;end

    //default:;

    endcase

    counter_2=counter_2+1;

    counter_3=0;

    end

    else begin counter_1=0;counter_2=0;counter_3=0;

    end//防止非串口信号的误低电平信号

    end

    //end

    endmodule

    展开全文
  • 使用verilog以及VHDL编写的将串口数据转换为32位并口数据,作为FPGA和DSP接口使用 使用verilog以及VHDL编写的将串口数据转换为32位并口数据,作为FPGA和DSP接口使用
  • PL2003串口转并口

    2014-07-18 15:27:11
    串口转并口软件,适用于XP和win7系统。
  • 本系列文章讲述了基于proteus仿真的51单片机学习,内容全面,不仅讲解电路原理,还讲解了单片机c语言,实例丰富,内容全面。
    1、74HC164是8 位边沿触发式移位寄存器,串行输入数据,然后并行输出。数据通过两个输入端(DSA 或 DSB)之一串行输入;任一输入端可以用作高电平使能端,控制另一输入端的数据输入。两个输入端或者连接在一起,或者把不用的输入端接高电平,一定不要悬空。
      时钟 (CP) 每次由低变高时,数据右移一位,输入到 Q0, Q0 是两个数据输入端(DSA 和 DSB)的逻辑与,它将上升时钟沿之前保持一个建立时间的长度。
      主复位 (MR) 输入端上的一个低电平将使其它所有输入端都无效,同时非同步地清除寄存器,强制所有的输出为低电平。
     
    2、在keil c51中新建工程ex57,编写如下程序代码,编译并生成ex57.hex文件
    //8位串行输入/并行输出器件74hc164演示实例
    #include <reg51.h>   // 包含头文件
    sbit HC164_data = P2^4;  // 端口引脚定义。,数据输出端,
    sbit HC164_CLK = P2^1;  //时钟输出端
    // 延时函数
    void delay(void)
    {
      unsigned int i,j;
     for(i=0;i<1000;i++)
     {
       for(j = 0;j < 500;j++);
     }
    }
    // 主函数
    void main(void)
    {
     unsigned char i;
     P2 = 0x00;
     for(i = 0;i < 8;i++)   //
     {
        HC164_data = 1 << i;    // 数据串行输出,一次移动一位
        HC164_CLK = 1;     //  数据在上升沿期间输出
        HC164_CLK = 0;     //
        delay();
     }
     while(1)
     {
     }
    }
     
    3、在proteus中新建仿真文件ex57.dsn,电路原理图如下所示


    4、将ex57.hex文件载入at89c51中,启动仿真,观察运行结果。下图是某一时刻程序运行结果。


    展开全文
  • 摘要:详细说明利用并口模拟I2C总线协议,实现Myson MTV230芯片的在线编程(ISP)过程,以及利用PC机的串口通信实现Winbond W78E516B的在线编程(ISP)过程;阐述PC机的串口并口在单片机开发中的应用。  ...
  • 并口串口驱动.zip

    2019-03-25 11:27:29
    驱动支持PCI、PCIE的串并口,支持DH382、TXIC382、WCH382、MCS98XX、MCS99XX、AX99100
  • 利用串口并口实现51内核单片机的在线编程来源:单片机及嵌入式系统应用 作者:浙江大学 张懿摘要:详细说明利用并口模拟I2C总线协议,实现Myson MTV230芯片的在线编程(ISP)过程,以及利用PC机的串口通信实现...
  • 74hc165串口转并口输入

    千次阅读 2015-05-02 10:36:26
    74hc165.h#ifndef _74H165_H_ #define _74H165_H_ #include #include #define GPIO_LED P0 sbit IN_PL = P1^6; sbit IN_Data = P1^7; sbit SCK = P3^6; #ifndef uchar #define uchar unsigned c
  • 并口转串口程序

    2012-08-30 22:44:29
    并口转串口程序,希望有帮助!
  • ut-880 串口转并口

    2011-11-30 12:15:24
    usb串口驱动 ut-880型号,我安装过,现在就用的这个驱动,没有任何问题。
  • 单片机实现并口转串口的功能,并口输入,串口输出
  • 1、本例利用单片机的串口模式0,即移位寄存器输入/输出模式,串行数据通过RXD输出,TXD则用于输出移位时钟脉冲。这种模式有利于用最少硬件实现接口扩展。 本例在单片机串行端口出外接一片74HC164,构成输出电路...
  • 74hc595串口转并口输出

    千次阅读 2015-05-02 10:31:37
    74hc595.h#ifndef _74HC585_H_ #define _74HC585_H_#include #include #include #ifndef uchar #define uchar unsigned char #endif #ifndef uint #define uint unsigned int #end
  • 串口并口的比较

    2020-11-19 01:26:06
     串行接口通常又被简称为串口,英文标识为Serial或COM;现 在的PC 机一般有两个串行口COM 1 和COM 2 。这两个接口是最早出现在计算机中的标准接口即RS232标准,在这个标准产生之前每个厂家生产的计算机的外设也都与...
  • 就是一个USB串口并口的驱动,电脑无法自动安装的可以下载手动安装,带调试软件
  • 全能增强版加密狗复制机、可以复制串口并口、USB加密狗
  • 文章目录前言一、串口是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,...
  • ch352pci转并口串口卡驱动是一款专门用户进行pci卡安装的驱动程序,不仅可以成功实现pci口串口,还可可以保证能够有不俗的性能表现。有需要的朋友欢迎前来下载体验!ch352pci转并口串口卡驱动介绍现在新型号的主板...
  • 串口并口

    2017-01-20 13:56:10
    串口没有干扰,传输的距离大于并口。目前串口都采用9针的连接方式直接集成在主板上。常用的USB即位串口。 2. 并行接口简称并口(Parallel口),也就是LPT接口,是采用并行通信协议的扩展接口。并口的数据传输率比...
  • 摘要:详细说明利用并口迷你I2C总线协议,实现Myson MTV230芯片的在线ISP过程,以及利用PC机的串口通信实现Windond W78E516B的在线编程ISP过程,阐述PC机的串口串口并口在单片机中的应用
  • 原标题:电子连接系统上的串口并口知识分享“电子连接系统上的串口并口知识分享”由电蜂优选(Elecbee.cn)为您整理,采购连接器,上电蜂优选。如今对电子产品有个简单了解的都知道,电子产品上的电路板、PCB板上...
  • 串口并口的区别

    2012-11-30 13:55:49
    本文主要讲述了串并口的区别以及串行接口和并行接口的各自特点
  • 串口并口介绍

    2013-12-11 09:39:48
    串口并口介绍 1、串口 串口形容一下就是 一条车道,而并口就是有8个车道同一时刻能传送8位(一个字节)数据。  但是并不是并口快,由于8位通道之间的互相干扰。传输时速度就受到了限制。而且当传输出错时,要同时...
  • 一般的情况是两个串口的内存连接,或是两个并口的内存连接,所以,自觉得这篇文章描述的是最复杂的状况,即串行磁盘和并口硬盘同时使用,以及区分主副硬盘。个人觉得并口的内存连接没必要具体描述,把大排线的剩余接头...
  • 所有 接头的针脚有统一规定,在接头上都印好了的,连接时要注意查看。在接线时没有提及的针脚都悬空不管。下面给出串口并口各针脚功能表以供高级用户维护电缆或接头时使用。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 12,263
精华内容 4,905
关键字:

串口转并口