欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 關于STC單片機控制HC595的問題 [打印本頁]

作者: sq8422779    時間: 2019-9-18 09:08
標題: 關于STC單片機控制HC595的問題
本人做了個3串的HC595然后 關于代碼  真的搞不明白...
有人有現成的帖子嗎?
網上看了這個帖子  但是 不明白
1個是 HC595的通訊控制是2進制的嗎?那么01001010   01010101 10101010 對應的指示燈的16進制
是0x4A55AA 這么寫嗎?
temp=0x4A55AA
具體怎么改?
這么改沒效果啊 還是1個個的滅燈
原帖 小白 不知到怎么弄 有例子的嗎??

單片機源程序如下:
#include<reg52.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int

sbit Sh_cp=P5^4;
sbit Ds=P3^3;
sbit St=P3^2;
sbit Sh_cp1=P1^0;
sbit Ds1   =P1^1;
sbit St1   =P1^2;
uchar temp;
uchar temp1;
void In_Data(void)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
   Sh_cp=0;
   _nop_();_nop_();
   temp<<=1;Ds=CY;
   Sh_cp=1;
   _nop_();_nop_();
   Sh_cp=0;
   _nop_();_nop_();
  }
}
void Out_Data(void)
{
  St=0;
  _nop_();_nop_();
  St=1;     //上升沿送到鎖存器
  _nop_();_nop_();
  St=0;            //鎖存顯示
}
void In_Data1(void)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
   Sh_cp1=0;
   _nop_();_nop_();
   temp1<<=1;Ds1=CY;
   Sh_cp1=1;
   _nop_();_nop_();
   Sh_cp1=0;
   _nop_();_nop_();
  }
}
void Out_Data1(void)
{
  St1=0;
  _nop_();_nop_();
  St1=1;     //上升沿送到鎖存器
  _nop_();_nop_();
  St1=0;            //鎖存顯示
}
void DelayMS(unsigned int ms)
{
unsigned char i;
while(ms--)
for(i=0;i<120;i++);
}
void main()
{
   uchar i,j;
while(1)
{
  for(j=2;j>0;j--)
  {       temp1=j;
     In_Data1();
       Out_Data1();
   for(i=0;i<8;i++)
   {
    temp=1<<i;
     In_Data();
       Out_Data();
       DelayMS(1000);
   }
   // DelayMS(2000);
     }
}
}
?

作者: cuihaodianzi    時間: 2019-9-18 15:29
我做過兩塊的 有仿真,可以給你參考一下
作者: hantu    時間: 2019-9-18 16:08
你定義是uchar temp吧
temp=0x4A55AA 這樣寫能對?幾個字節了你知道不?
作者: 笨笨兔    時間: 2019-9-18 17:36
主要是看看清除 HC595 手冊即可,程序只是具體的實現。

作者: 51jia    時間: 2019-9-18 23:54
樓主請認真看一下595的時序圖,分成三個字節傳輸三次,之后再鎖存片選,可達到目的,你的數據定義是8位的,不能temp=0x4A55AA這樣寫,可以分成:0x4a,ox55,0xaa三次傳輸。希望我的回答能對你有所幫助!
作者: 末世之王    時間: 2019-9-19 00:41
雖然看不懂 感覺很厲害.
作者: wulin    時間: 2019-9-19 06:42
給你改寫成一次發送3個字節的示例,1T的MCU需要加短延時,12T的51不需要加短延時。

  1. #include<reg52.h>
  2. #include<intrins.h>

  3. sbit Ds=P1^0;//串行數據輸入端 14腳
  4. sbit Sh=P1^1;//移位寄存器時鐘輸入端 11腳
  5. sbit St=P1^2;//存儲寄存器時鐘輸入 12腳
  6. sbit Mr=P1^3;//主復位端,低電平復位 10腳

  7. void DelayMS(unsigned int ms)
  8. {
  9.         unsigned char i;
  10.         while(ms--)
  11.                 for(i=0;i<120;i++);
  12. }

  13. void In_Data(unsigned char a,b,c)
  14. {
  15.         unsigned char i,j;
  16.         j=a;
  17.         for(i=0;i<8;i++)
  18.         {
  19.                 j<<=1;
  20.                 _nop_();_nop_();
  21.                 Ds=CY;
  22.                 _nop_();_nop_();
  23.                 Sh=0;
  24.                 _nop_();_nop_();
  25.                 Sh=1;
  26.         }
  27.         j=b;
  28.         for(i=0;i<8;i++)
  29.         {
  30.                 j<<=1;
  31.                 _nop_();_nop_();
  32.                 Ds=CY;
  33.                 _nop_();_nop_();
  34.                 Sh=0;
  35.                 _nop_();_nop_();
  36.                 Sh=1;
  37.         }
  38.         j=c;
  39.         for(i=0;i<8;i++)
  40.         {
  41.                 j<<=1;
  42.                 _nop_();_nop_();
  43.                 Ds=CY;
  44.                 _nop_();_nop_();
  45.                 Sh=0;
  46.                 _nop_();_nop_();
  47.                 Sh=1;
  48.         }
  49.         St=0;
  50.         _nop_();_nop_();
  51.         St=1;
  52. }

  53. void main()
  54. {
  55.         Mr=0;
  56.         DelayMS(1);
  57.         Mr=1;
  58.         In_Data(0x4A,0x55,0xAA);
  59.         while(1);
  60. }
復制代碼





作者: sq8422779    時間: 2019-9-19 07:14
51jia 發表于 2019-9-18 23:54
樓主請認真看一下595的時序圖,分成三個字節傳輸三次,之后再鎖存片選,可達到目的,你的數據定義是8位的, ...

關鍵是怎么傳輸給595  沒搞明白 希望大師指點
作者: sq8422779    時間: 2019-9-19 08:27
cuihaodianzi 發表于 2019-9-18 15:29
我做過兩塊的 有仿真,可以給你參考一下

好的挖 能發給我看下嗎 萬分感謝啊
作者: wulin    時間: 2019-9-19 09:30
sq8422779 發表于 2019-9-19 07:14
關鍵是怎么傳輸給595  沒搞明白 希望大師指點

樓主看7樓回帖
作者: sq8422779    時間: 2019-9-19 21:23
wulin 發表于 2019-9-19 06:42
給你改寫成一次發送3個字節的示例,1T的MCU需要加短延時,12T的51不需要加短延時。

我去,大神,一語驚醒夢中人!我總算明白為什么要<<=1了前面的for8 是為了堆8個二進制數字過去 明白了 多謝
作者: sq8422779    時間: 2019-9-19 21:26
wulin 發表于 2019-9-19 09:30
樓主看7樓回帖

其實文中我一直沒搞明白 二進制數據怎么賦值 一看你的立刻明白,其實我文中根本就沒有賦任何數據到temp里,所以里面是0 難怪我測試燈是一個個的亮,一看你的就明白了,我根本就沒有賦值進去
作者: chen0769    時間: 2019-9-20 10:16
PIC 單片機程序,供參考:

#include <stdlib.h>
#include <stdio.h>

#define SIO_CLK RD4
#define SIO_RCK RD5
#define SIO_Data RD6


void SerialIO_init()     //74HC595串行發送初始化
{
  TRISD4 = 0;
  TRISD5 = 0;       
  TRISD6 = 0;    //PORTD 輸出: 不受其他模板影響。輸入: 在上電復位時,這些引腳被配置為數字輸入。
}

/*-------------------------74HC595串行轉并行控制IO------------------------------------------------*/
void HC595_SIO(unsigned char Data)    // 74HC595串行發送
{
   unsigned char i;
    for(i = 0;i < 8;i++)               
    {
           SIO_CLK = 0;              
      if( Data&0x80)
                 {
                   SIO_Data = 1;
                 }   
       else
                 {   
                   SIO_Data = 0;
                 }
       SIO_CLK = 1;         
     Data <<= 1;           
    }
   SIO_RCK = 0;               //關鎖存
   SIO_RCK = 1;               //開鎖存
}
void SerialIO_fun(unsigned char Data[])  
{
  HC595_SIO(atoi(Data));
}
/*-------------------------End-----------------------------------------------------------------------*/




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1