日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

IO 扩展(串转并)-74HC595-16*16LED点阵实验

發布時間:2023/12/8 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 IO 扩展(串转并)-74HC595-16*16LED点阵实验 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

? ? ? ??51 單片機的IO 口非常有限,有時候若想要連接更多外圍設備,需要通過 IO 擴展來實現。本文介紹一種 IO 口擴展方式——串轉并,使用的芯片是 74HC595。若有4個 74HC595 芯片,僅需單片機 3 個 IO 口即可擴展到 32 個。而且,還可以將多個 74HC595 級聯擴展出更多 IO,從而實現用少數 IO 資源控制多個設備。

74HC595 芯片簡介

? ? ? ??74HC595 是一個 8 位串行輸入、并行輸出的位移緩存器,其中并行輸出為三 態輸出(即高電平、低電平和高阻抗)。

? ? ? ??芯片管腳圖:

? ? ? ??管腳功能說明:?

表1? 芯片管腳功能序號符號描述
1~7、15QA~QH并行數據輸出
9/QH串行數據輸出
10SCLR非主復位(低電平),移位寄存器清零輸入
11SCK( SRCLK)移位寄存器時鐘輸入
12RCK(RCLK)存儲寄存器時鐘輸入
13G 非輸出使能控制端(低電平)
14SI串行數據輸入
8GND接地
16VCC電源

? ? ? ??內部邏輯圖 :

? ? ? ??真值表如下:

??? ? ? ??74HC595 具有 8 位移位寄存器和一個存儲器、三態輸出功能。移位寄存器和存儲器是單獨的時鐘。數據在 SCK 的上升沿輸入移位存儲器,在 RCK 的上升沿進入到存儲寄存器(鎖存器)中。如果兩個時鐘連在一起,則移位寄存器總是比存儲器早一個脈沖。移位寄存器有一個串行輸入(SI),和一個串行輸出(/QH),和一個異步的低電平復位(SCLK非),存儲寄存器有一個并行 8 位的,具有三態的總線輸出。當 /SCLR 為高電平,/G 為低電平時,數據在 SCK?上升沿進入移位寄存器,在 RCK 上升沿輸出到并行端口。

??? ? ? ??有關 74HC595 芯片的更多詳細介紹,可以查看芯片數據手冊。鏈接:鏈接: https://pan.baidu.com/s/1DDk9CZuU0bcC1B9b6k6Ahw?pwd=chtn 提取碼: chtn?

硬件部分

??? ? ? ??使用到硬件資源如下:

  • 16*16LED 點陣模塊
  • 74HC595 模塊
  • ? ? ? ? ? 74HC595模塊電路如下圖所示:

    ? ? ? ? ? ?6*16LED 點陣模塊電路如下圖所示:

    ? ? ? ? ? ?由上圖可知,模塊電路獨立,74HC595 模塊內使用了 4 塊 74HC595 芯片,采用級聯方式,即 RCLK ( RCK )?和SRCLK( SCK)?管腳并聯在一起,并且 74HC595 (A)的輸出 /QH 連接到 74HC595(B)的串行輸入口 SER(SI),而 74HC595(B)的 輸出 /QH 又連接到 74HC595(C)的串行輸入口 SER(SI),依次類推。并且每塊芯片的輸出端都連接到對應的端子上,74HC595(A)的輸出連接到 J27 端子,74HC595 (B)的輸出連接到 J32 端子,74HC595(C)的輸出連接到 LED 點陣前 8 列,74HC595 (D)的輸出連接到 LED 點陣后 8 列。圖上的 NEGx 是網絡標號,74HC595(C)和74HC595 (D)的輸出已經與 LED 點陣列相連。74HC595 需要用到的控制管腳 RCLK、SRCLK、SER 并未直接連接到 51 單片機 的 IO 上,而是連接到 J24 端子上。

    ? ? ? ? ? ?此處使用 P3.4-P3.6 管腳來控制 74HC595 輸出數據,行為 LED 發光二極管的陽極,列則為發光二極管的陰極。

    ? ? ? ? ? ?要想控制 LED 點陣,需將單片機管腳按照 74HC595 芯片的通信時序要求來傳輸數據。使用了 4 片 74HC595 芯片,A、B 兩塊芯片控制點陣的行 POS1-POS16,C、D 兩塊芯片控制點陣列 NEG1-NEG16。這樣即可控制 LED 點陣。根據 LED 發光二極管導通原理,當陽極為高電平,陰極為低電平則點亮,否則熄滅。因此通過單片機發送 4 組數據,通過 74HC595 芯片將這四組數據分配到對應輸出從而控制 LED 點陣。

    源代碼

    ? ? ? ? ? ? 解釋一下代碼的邏輯順序;

    ? ? ? ? ? ? 定義好 74HC595 控制管腳,以及點陣列控制口。然后重新定義了一個 ms 級延時函數 delay_1ms,該函數與前面 delay_10us 類似,都是利用循環占用 CPU 起到延時效果。

    ? ? ? ? ? ? 定義 74HC595 的控制函數 HC595_WRITE_DATA,該函數完全按照 74HC595 的通信時序要求編寫,需要注意的是 74HC595 是先傳輸字節的高位后傳輸低位,所以需要將字節低位移動到高位傳輸。在傳輸數據時,要注意移位寄存器時鐘和存儲寄存器時鐘的先后順序,將要寫入的數據先傳輸到 74HC595 寄存器中,即在準備好每位數據時要將 SCK 進行一個上升沿變化,此時即可將數據傳輸到移位寄存器內。循環 8 次,一個字節就傳輸到寄存器中,就可以來一個存儲時鐘上升沿RCK,此時就可以將 74HC595 寄存器中的數據全部一次傳輸到 595 存儲寄存并從端口輸出。? ? ? ? ? ?

    ? ? ? ? ? ? 使用了?4 個 74HC595 芯片且級聯, 所以在函數入口有 4 個參數 cs_data1-cs_data4,從函數中可看到,第一個 for 循環中首先發送 cs_data4 數據,然后再發送 cs_data3,最后發送 cs_data1,因為 595 是移位寄存器, 可以理解為一開始發送的數據會被后面的數據向前推走,通過 4 次 for 循環后cs_data4 就被移到了 74HC595(D)芯片處,cs_data3 就被移到了 74HC595(C)芯片處,cs_data2 就被移到了 74HC595(B)芯片處,cs_data1 就被移到了 74HC595(A)芯片處。

    ? ? ? ? ? ? 可以將輸入看成水管中的水流,從cs_data4開始,依次將四個數據放入水管中,最后cs_data4率先流出水管,到達LED點陣的后8列。然后流出水管的是cs_data3,到達LED點陣的前8列。然后是cs_data2,到達LED點陣的后8行。最后是cs_data1,到達LED點陣的前8行。如此這般依次設置LED點陣的行列,從而實現控制LED點亮。

    ? ? ? ? ? ? 最后就是在 main 函數中調用 74HC595 的控制函數 HC595_WRITE_DATA,將實驗中要實現的效果數據寫入進去, 從而控制 LED 點陣的陽極和陰極。

    #include "reg52.h"typedef unsigned int u16;//使用關鍵字 typedef 對系統默認數據類型 unsigned int 重新命名 typedef unsigned char u8;/*定義74HC595控制管腳*/ sbit SI=P3^4; //串行數據輸入 sbit RCK=P3^5; //存儲寄存器時鐘輸入 sbit SCK=P3^6; //移位寄存器時鐘輸入u8 HC595_buf[8]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};void delay_10us(u16 ten_us)//延時函數,ten_us=1 時,大約延時 10us {while(ten_us--); }void delay_1ms(u16 ms) {u16 i,j;for(i=ms;i>0;i--)for(j=110;j>0;j--); }void HC595_WRITE_DATA(u8 cs_data1,u8 cs_data2,u8 cs_data3,u8 cs_data4) //最后兩個形參表示所有列的數據,前面兩個形參表示所有行的數據 {u8 i=0;for(i=0;i<8;i++)//傳入第四個形參{SI=cs_data4>>7; //因為595芯片先傳高位,所以將最高位移到最低位(比如 12345678——>00000001,此處12345678這樣寫只為方便理解),然后給個上升沿把1傳入寄存器中cs_data4<<=1; /*這一步是將原先cs_data(比如12345678)的第二個高位(1后面的2)移到第一個高位(即變成了23455670),這一步是為了執行下一次循環的時候,將最高位移到最低位做準備,也就是SI_SER=cs_date4>>7;*/SCK=0; //此處開始產生上升沿,先設為0,后面再設置為1,上升沿就有了,數據在 SCK 的上升沿輸入存儲器delay_10us(1);SCK=1; //此刻,最高位就輸入到寄存器中了,然后下一次循環依次按照此方法傳入第二個高位、第三個....delay_10us(1);}for(i=0;i<8;i++)//傳入第三個形參{SI=cs_data3>>7; cs_data3<<=1; SCK=0;delay_10us(1);SCK=1;delay_10us(1);}for(i=0;i<8;i++)//傳入第二個形參{SI=cs_data2>>7; cs_data2<<=1; SCK=0;delay_10us(1);SCK=1;delay_10us(1);}for(i=0;i<8;i++)//傳入第一個形參{SI=cs_data1>>7; cs_data1<<=1; SCK=0;delay_10us(1);SCK=1;delay_10us(1);}RCK=0; //這里需要一個上升沿,將存儲器的數據,在 RCK 的上升沿的作用下,輸入到鎖存器中(此時輸出使能控制端/G或/OE接地)delay_10us(1);RCK=1; }void main(void) //主函數 { u8 i=0; while(1) //while循環一次,LED點陣從第一行到最后一行點亮完成一個輪回{for(i=0;i<8;i++) //控制16*16LED點陣的前8行LED燈亮滅{HC595_WRITE_DATA(HC595_buf[i],0,0,0);//使74HC595(A)輸出ghc595_buf[i],控制16*16LED點陣的前8行LED燈亮滅 delay_1ms(500);//延時500ms}for(i=0;i<8;i++) //控制16*16LED點陣的后8行LED燈亮滅{HC595_WRITE_DATA(0,HC595_buf[i],0,0);//使74HC595(B)輸出ghc595_buf[i],控制16*16LED點陣的后8行LED燈亮滅delay_1ms(500);//延時500ms} } }

    現象

    ?

    總結

    以上是生活随笔為你收集整理的IO 扩展(串转并)-74HC595-16*16LED点阵实验的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。