兩片74HC595級聯動態驅動8位數碼管 51單片機

2020-12-25 電子產品世界

功能 : 用2片74HC595驅動8位數碼管, 級聯的最低1片595控制位選,那麼第一片控制段選

時間 : 2013-3-28 21:11:59
作者 : Stone
版本 : REV1
平臺 : STC89C52 11.0592MHz
現象 : 8位數碼管從第一位開始從0計數,滿10進位
版本說明 : 第0版本沒有使用定時器中斷,同時定義了一個 unsigned long int 變量計數
再把這個數的每位分離出來顯示,所以導致有點閃屏,此版本使用定時器中斷,
而且沒有用 unsigned long int 之類的變量,而是用數組 Val[8] 來計數,
主函數隻負責顯示,其它的在中斷函數裡面處理,這樣顯示一點都不閃屏,
備註 : 可以用 ULN2003A 接在數碼管的 com 口來提高驅動能力,ULN2003A裡面有7個NPN三極體,
可以大大提高驅動能力

本文引用地址:http://www.eepw.com.cn/article/201611/321351.htm


#include


sbit SCK = P1^1; // 數據輸入時鐘線,脈衝
sbit SI = P1^0; // 數據線
sbit RCK = P1^2; // 鎖存

unsigned char code SMG[10] = {0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8, 0x80, 0x90}; // 段碼
unsigned char code Wei[8] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80}; // 位選
unsigned char Val[8] = {0}; // 要顯示的數據


************************ 函數聲明 ************************
void interrupt_init(void);
void timer_init(void);

控制74HC595輸出數據
void Output(void)
{
RCK = 0;
RCK = 1;
}

向74HC595中寫入一字節數據
void Write_Byte(unsigned char dat)
{
unsigned char i = 0;

for(i=0; i<8; i++)
{
SCK = 0;
SI = dat & 0x80;
SCK = 1;

dat <<= 1;
}
}

顯示函數

void Display(unsigned char * p)
{
unsigned char * pt = Wei;

Write_Byte(*(pt+0));
Write_Byte(SMG[*(p+7)]);
Output();

Write_Byte(*(pt+1));
Write_Byte(SMG[*(p+6)]);
Output();

Write_Byte(*(pt+2));
Write_Byte(SMG[*(p+5)]);
Output();

Write_Byte(*(pt+3));
Write_Byte(SMG[*(p+4)]);
Output();

Write_Byte(*(pt+4));
Write_Byte(SMG[*(p+3)]);
Output();

Write_Byte(*(pt+5));
Write_Byte(SMG[*(p+2)]);
Output();

Write_Byte(*(pt+6));
Write_Byte(SMG[*(p+1)]);
Output();

Write_Byte(*(pt+7));
Write_Byte(SMG[*(p+0)]);
Output();

}

int main(void)
{
timer_init();
interrupt_init();

while(1)
{
Display(Val);
}

return 0;
}

void interrupt_init(void)
{
EA = 1;//開總中斷
ET0 = 1;//開定時器0中斷
ET1 = 1;//開定時器1中斷
}

void timer_init(void)
{
TMOD = TMOD | 0x01;//定時器0工作方式1
TMOD = TMOD & 0xFD;

TH0 = 0x4B;//裝初值,50ms計數
TL0 = 0xFF;

TR0 = 1;//開啟定時器0
}

void timer0() interrupt 1
{
static unsigned char counter0 = 0;
counter0++;
TH0 = 0x4B;//重新裝入初值,定時器0從頭開始計數,計數50ms
TL0 = 0xFF;

if(2 == counter0)//2*50 ms = 100ms = 0.1s
{
counter0 = 0;//counter0置零,定時器0從頭開始計數

Val[0]++;
if(10==Val[0])
{
Val[0] = 0;
Val[1]++;

if(10==Val[1])
{
Val[1] = 0;
Val[2]++;

if(10==Val[2])
{
Val[2] = 0;
Val[3]++;

if(10==Val[3])
{
Val[3] = 0;
Val[4]++;

if(10==Val[4])
{
Val[4] = 0;
Val[5]++;

if(10==Val[5])
{
Val[5] = 0;
Val[6]++;

if(10==Val[6])
{
Val[6] = 0;
Val[7]++;

if(10==Val[7])
{
Val[7] = 0;
}
}
}
}
}
}
}
}
}
}


相關焦點

  • 74ls595應用電路圖大全(五款74ls595驅動數碼管/計時顯示/超聲波...
    打開APP 74ls595應用電路圖大全(五款74ls595驅動數碼管/計時顯示/超聲波測距儀電路) 發表於 2018-04-28 11:32:04
  • 單片機驅動74HC595的c51程序
    //該子程序為74HC595發送字符的程序,該程序是先發送的是最低位!//晶片74HC595的時鐘引腳為第11腳//晶片74HC595的數據引腳為第14腳//晶片74HC595的鎖存引腳為第12腳//當有多片74HC595串聯時,只有當所有數據都發送完成後,再鎖存信號!
  • 第17節:兩片聯級74HC595驅動16個LED燈的基本驅動程序
    第二點:兩個聯級74HC595的工作過程:每個74HC595內部都有一個8位的寄存器,兩個聯級起來就有兩個寄存器。ST引腳就相當於一個刷新信號引腳,當ST引腳產生一個上升沿信號時,就會把寄存器的數值輸出到74HC595的輸出引腳並且鎖存起來,DS是數據引腳,SH是把新數據送入寄存器的時鐘信號。
  • 74HC595在單片機上的應用及程序
    74HC595具有8位串入並出的三態門電路。高速率:最高55MHz(5V工作電壓)本文引用地址:http://www.eepw.com.cn/article/201612/324569.htm寬的工作電壓範圍:2V -6V每個口的最大電流值(QA-QH):±35mA當單片機的I/O資源比較緊張時,採用595並進行級聯是一個很好的選擇
  • 條分縷析 巧學妙解 ——談談74HC595的教學方法
    特別強調兩片74HC595級聯時,第一片的輸出引腳接第二片的輸入引腳,以完成數據的傳輸;第二步:介紹兩個時鐘引腳11腳SCK、 12腳RCK;具體看圖2,發現移位寄存器和存儲器分別使用不同的時鐘,數據在 SCK(11 腳)的上升沿輸入,在RCK(12 腳) 的上升沿進入到存儲寄存器中並行輸出,所以兩個時鐘脈衝是互相獨立的,能做到輸入串行移位與輸出鎖存的控制互不幹擾。
  • 74HC595控制8位數碼管 51單片機
    74HC595是8位串行移位寄存器,亦能串行輸出控制下一級級聯晶片。關於級聯、595晶片具體我就不多介紹,大家自己查吧!本文引用地址:http://www.eepw.com.cn/article/201611/321353.htm// 注意 此代碼沒有什麼技術含量,也沒有按規範些,旨在說明595怎麼控制,大家不要模仿。
  • #51單片機#8位數碼管(74HC595晶片)的使用方法
    數碼管基本屬性:1.採用2片595驅動數碼管,需要單片機3路IO口,根據數碼管動態掃描原理進行顯示;2.寬工作電壓3.3V到5V
  • 第18節:把74HC595驅動程序翻譯成類似單片機IO口直接驅動的方
    為了更加方便操作74HC595輸出的每個IO狀態,這節講如何把74HC595驅動程序翻譯成類似單片機IO口直接驅動的方式。(1)硬體平臺:基於朱兆祺51單片機學習板。(2)實現功能:兩片聯級的74HC595驅動的16個LED燈交叉閃爍。比如,先是第1,3,5,7,9,11,13,15八個燈亮,其它的燈都滅。然後再反過來,原來亮的就滅,原來滅的就亮。交替閃爍。
  • 74HC595 的實際應用與編程
    推薦閱讀 8x8LED點陣驅動方法(74HC595的使用) 前幾天學了點陣的顯示,今天按自己的思路來總結一下。首先介紹一下點陣的顯示原理。點陣的電路圖和之前學過的矩陣按鍵的電路圖是相似的。
  • 數碼管的靜態與動態顯示技術分析
    所謂靜態顯示, 就是每一個數碼管的段碼都要獨佔具有鎖存功能的輸出口, CPU把要顯示的字碼送到輸出口上,就可以使數碼管顯示對應的字符, 直到下一次送出另外一個字碼之前, 顯示的內容一直不會消失;動態掃描是把所有顯示器的8個段碼中的A-dp的各個相同段連接在一起, 接到一個公共的輸出口上,而數碼管的位端分別接在另外的輸出口上,通過這兩個輸出口的兩組信號相互作用來產生顯示效果。
  • 51單片機輕鬆入門與實踐 — 暢學單片機
    下載常見問題及解決;第3課 暢學51單片機開發學習板硬體測試1、測試說明2、單色流水燈測試3、彩色流水燈測試4、雙色燈測試5、八位數碼管測試6、1位數碼管測試7、雙色點陣測試8、LCD1602測試9、LCD12864測試10、OLED測試11、TFT彩屏顯示測試12
  • 暢學三合一51單片機實戰教程
    開發板的準備工作 2、硬體連接 3、CP2102驅動的安裝4、下載燒錄程序過程5、硬體測試6、下載常見問題及解決第3課 8位單色流水燈模塊講解1、LED燈簡介及原理 2、LED燈種類及正負極 3、硬體電路講解 4、位控制點亮LED5、字節控制點亮LED6、查表點亮LED
  • 51單片機直接驅動共陰極數碼管
    單片機驅動Led數碼管(或n個Led)應該算是單片機經典試驗之一了。數碼管種類:本文引用地址:http://www.eepw.com.cn/article/201611/321065.htm 少量的數碼管實際可以直接用單片機驅動(如4個數碼管)。數碼管數碼管有兩種:共陰極和共陽極數碼管。
  • 第51節:利用ADC0832採集電壓信號進行濾波處理
    基於朱兆祺51單片機學習板。(2)實現功能:本程序有2個局部顯示。第1個局部是第8,7,6,5位數碼管,顯示沒有經過濾波處理的實際電壓值。void);void delay_short(unsigned int uiDelayShort);void delay_long(unsigned int uiDelaylong);//驅動數碼管的74HC595void dig_hc595_drive(unsigned char ucDigStatusTemp16
  • 第88節:單片機靠關鍵字快速截取有效數據串
    //第8位數碼管要顯示的內容unsigned char ucDigShow7;//第7位數碼管要顯示的內容unsigned char ucDigShow6;//第6位數碼管要顯示的內容unsigned char ucDigShow5;//第5位數碼管要顯示的內容unsigned char ucDigShow4;//第4位數碼管要顯示的內容
  • 第36節:帶數碼管顯示的加法簡易計算器
    IO口sbit led_dr=P3^5; //LED指示燈sbit dig_hc595_sh_dr=P2^0; //數碼管 的74HC595程序sbit dig_hc595_st_dr=P2^1;sbit dig_hc595_ds_dr
  • 74HC595擴展IO口
    //當單片機的IO口不夠用時,可以用一般的數字集成電路74LS(HC)595擴展IO口用。//下面是51單片機74HC595的c51驅動本文引用地址:http://www.eepw.com.cn/article/201611/320302.htm#include#include #define
  • 兩個74ls164怎麼連?74ls164聯級應用電路
    74ls164聯級應用電路:串口連接兩個74LS164驅動2個LED 數碼管顯示 單片機的最小系統是單片機能夠工作的最小硬體組合,對於8051系列單片機,其電路的最小系統大致相同,主要包括電源、晶體振蕩電路、復位電路等。
  • proteus仿真之8位數碼管動態掃描顯示試驗
    /*Proteus 仿真之8位共陰數碼管動態掃描實驗*/程序:/*Proteus 仿真之8位共陰數碼管動態掃描實驗*/#include#define SegPortP0   //定義數碼管連接埠sbit LE_Duan = P2^0;   //定義573鎖存使能埠 段鎖存sbit LE_Wei = P2^1;   //定義573鎖存使能埠 位鎖存unsigned char code Seg_Duan[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,
  • 74HC595驅動LCD1602程序
    為了節約埠,1602液晶我也改為595來驅動了,一共有2個文件都在下面,程序本人測試通過,在你自己的應用中只需要修改埠即可.