找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2568|回復(fù): 8
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)74HC595循環(huán)點(diǎn)亮LED 運(yùn)行起來會(huì)有不止一個(gè)LED亮起來?

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
#
單片機(jī)通過74HC595控制8個(gè)LED循環(huán)點(diǎn)亮,按照D16-D15-D14......D9依次循環(huán),每次亮一個(gè)。仿真看著沒問題,實(shí)物運(yùn)行起來會(huì)有不止一個(gè)LED亮起來,學(xué)藝不精,找了很久沒找到問題根源,還請大佬指點(diǎn)迷津。 單片機(jī)型號STC89C52,晶振12MHz。電路、程序、現(xiàn)象還請看一下附件,先謝過了。







單片機(jī)源程序如下:
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. sbit RCK=P3^5;  // Pin12        輸出鎖存控制脈沖
  4. sbit SER=P3^4;  // Pin14  串行數(shù)據(jù)輸入
  5. sbit SCK=P3^6;        // Pin11        移位脈沖

  6. void HC595_Send(unsigned char byte);
  7. void Delay();

  8. void main()
  9. {
  10.         unsigned char i;
  11.         unsigned char buffer[8]={0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE};
  12.         
  13.         while(1)
  14.         {
  15.                 for(i=0;i<8;i++)                //循環(huán)點(diǎn)亮單個(gè)LED
  16.                 {
  17.                         HC595_Send(buffer[i]);
  18.                         Delay();
  19.                 }
  20.         }
  21. }

  22. /*驅(qū)動(dòng)HC595*/
  23. void HC595_Send(unsigned char byte)
  24. {
  25.         unsigned char i;
  26.         for(i=0;i<8;i++)                //寫入移位寄存器
  27.         {
  28.                 SCK=0;
  29.                 SER=byte>>7;
  30.                 byte<<=1;
  31.                 SCK=1;
  32.         }
  33.         
  34.         RCK=0;        //鎖存時(shí)鐘產(chǎn)生上升沿更新輸出
  35.         _nop_();
  36.         RCK=1;
  37. }

  38. /*延時(shí)*/
  39. void Delay()                //@12.000MHz
  40. {
  41.         unsigned char i, j, k;

  42.         _nop_();
  43.         i = 8;
  44.         j = 154;
  45.         k = 122;
  46.         do
  47.         {
  48.                 do
  49.                 {
  50.                         while (--k);
  51.                 } while (--j);
  52.         } while (--i);
  53. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

8#
ID:1080867 發(fā)表于 2023-5-31 23:10 | 只看該作者
188610329 發(fā)表于 2023-5-31 17:20
存在的問題是,你還沒完成下降,就開始上升了。不知道你用的什么單片機(jī),如果1T 的單片機(jī), RCLK = 0; 到 ...

在 RCK=0;  RCK=1之間插入多個(gè)_nop_()也不起作用; 單片機(jī)是STC89C52,595供電電壓是5V,萬用表實(shí)際測下來是4.97V
回復(fù)

使用道具 舉報(bào)

7#
ID:624769 發(fā)表于 2023-5-31 17:20 | 只看該作者
Cqzm 發(fā)表于 2023-5-30 22:55
你好,我照著你的改了下代碼,進(jìn)入HC595_Send()函數(shù)時(shí)就將RCK拉低,八位寫完后在拉高RCK,能正常運(yùn)行了。 ...

存在的問題是,你還沒完成下降,就開始上升了。不知道你用的什么單片機(jī),如果1T 的單片機(jī), RCLK = 0; 到 RCLK =1; 之間,你最少要插入 5個(gè) _nop_();   如果你的 595是 3V供電的話,你甚至需要 插入12個(gè)_nop_(); 才夠。
回復(fù)

使用道具 舉報(bào)

6#
ID:1080867 發(fā)表于 2023-5-31 14:47 | 只看該作者
pcf2000 發(fā)表于 2023-5-31 09:43
SER=byte>>7;    這句代碼是什么意思,串行輸出不該是一位一位輸出的嗎,你移動(dòng)7位,高位的數(shù)據(jù)直接出位, ...

數(shù)據(jù)是串入并出的,這句是在往移位寄存器里面寫入的
回復(fù)

使用道具 舉報(bào)

5#
ID:1081090 發(fā)表于 2023-5-31 13:51 | 只看該作者
提醒樓主一個(gè)冷知識:不同廠家的595芯片,對鎖存和ENABLE的邏輯要求不完全相同,你看下你使用的595芯片對應(yīng)的手冊就明白了。
回復(fù)

使用道具 舉報(bào)

地板
ID:123289 發(fā)表于 2023-5-31 10:37 | 只看該作者
1、要點(diǎn),先關(guān)閉OE,這樣數(shù)據(jù)的切換就不會(huì)閃動(dòng),因?yàn)檫@時(shí)不顯示(暗,消影)。
2、給出串行數(shù)據(jù);
3、要點(diǎn):等數(shù)據(jù)穩(wěn)定后,再給出移位脈沖信號上沿。
4、待輸出穩(wěn)定后,打開OE,放出數(shù)據(jù)。
所謂穩(wěn)定,也就是插入幾個(gè)NOP指令的事。
硬件上要注意,CLK信號,復(fù)位信號要做防護(hù),不能受到干擾。

回復(fù)

使用道具 舉報(bào)

板凳
ID:245053 發(fā)表于 2023-5-31 09:43 | 只看該作者
本帖最后由 pcf2000 于 2023-5-31 09:51 編輯

SER=byte>>7;    這句代碼是什么意思,串行輸出不該是一位一位輸出的嗎,你移動(dòng)7位,高位的數(shù)據(jù)直接出位,就用0補(bǔ)位了,就出現(xiàn)LED燈亮了,
記住,你的電路是0電平點(diǎn)亮LED燈,要實(shí)現(xiàn)每次只一只LED點(diǎn)亮,595的輸出每次必須只有一位輸出為0
改為 :SER=byte>>1;    即可
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:1080867 發(fā)表于 2023-5-30 22:55 | 只看該作者
wulin 發(fā)表于 2023-5-30 16:40
程序沒有什么明顯問題,仿真成功不等于實(shí)物就能成功。把595驅(qū)動(dòng)代碼調(diào)整一下試試。

你好,我照著你的改了下代碼,進(jìn)入HC595_Send()函數(shù)時(shí)就將RCK拉低,八位寫完后在拉高RCK,能正常運(yùn)行了。 修改前HC595_Send()這個(gè)函數(shù)里面,寫入八位后RCK給一個(gè)上升沿這種做法為啥不對呢?l兩者看起來差不多啊,存在什么問題。

void HC595_Write(unsigned char dat)
{
    unsigned char i;
    RCK=0;
    for(i=0;i<8;i++)
    {
        SCK=0;
        SER=dat>>7;
        dat<<=1;
        SCK=1;
        _nop_();
    }
    RCK=1;
}
回復(fù)

使用道具 舉報(bào)

樓主
ID:213173 發(fā)表于 2023-5-30 16:40 | 只看該作者
程序沒有什么明顯問題,仿真成功不等于實(shí)物就能成功。把595驅(qū)動(dòng)代碼調(diào)整一下試試。
  1. #include<reg52.h>
  2. #include<intrins.h>

  3. sbit RCK=P3^5;  // Pin12  輸出鎖存控制脈沖
  4. sbit SER=P3^4;  // Pin14  串行數(shù)據(jù)輸入
  5. sbit SCK=P3^6;  // Pin11  移位脈沖

  6. void HC595_Send(unsigned char byte);
  7. void Delay();

  8. void main()
  9. {
  10.         unsigned char i;
  11.         unsigned char buffer[8]={0X7F,0XBF,0XDF,0XEF,0XF7,0XFB,0XFD,0XFE};
  12.         SCK=0;       
  13.         RCK=0;
  14.         while(1)
  15.         {
  16.                 for(i=0;i<8;i++)                //循環(huán)點(diǎn)亮單個(gè)LED
  17.                 {
  18.                         HC595_Send(buffer[i]);
  19.                         Delay();
  20.                 }
  21.         }
  22. }

  23. /*驅(qū)動(dòng)HC595*/
  24. void HC595_Send(unsigned char byte)
  25. {
  26.         unsigned char i;
  27.         for(i=0;i<8;i++)//寫入移位寄存器
  28.         {
  29.                 SER=byte>>7;
  30.                 SCK=1;
  31.                 _nop_();
  32.                 SCK=0;
  33.                 byte<<=1;
  34.         }       
  35.         RCK=1;        //鎖存時(shí)鐘產(chǎn)生上升沿更新輸出
  36.         _nop_();
  37.         RCK=0;
  38. }

  39. /*延時(shí)*/
  40. void Delay()                //@12.000MHz
  41. {
  42.         unsigned char i, j, k;
  43.         _nop_();
  44.         i = 8;
  45.         j = 154;
  46.         k = 122;
  47.         do
  48.         {
  49.                 do
  50.                 {
  51.                         while (--k);
  52.                 } while (--j);
  53.         } while (--i);
  54. }
復(fù)制代碼
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表