![]() |
發布時間: 2021-7-13 10:13
正文摘要:下圖是延時很慢的74hc595的仿真圖: 如上圖顯示,在ST_CP 有上升沿后,右邊應該有輸出才對。這個圖片是輸入了兩組數據。下邊附上單片機代碼: #include<reg51.h> #include "intrins.h" sbit YA=P2^ ... |
595這么純粹的器件,不會很難吧? 1、在SHCP的上升沿,把DS的電平存入595內(共8個位,SHCP需8個時鐘),串行 2、在STCP的上升沿,把595內的數據存到輸出緩存寄(8位并行),這里只要一個STCP時鐘 3、OE低電平時,Q0-Q7的電平等于輸出緩存寄(8位并行),OE為高電平時,Q0-Q7為高阻態 注意上升沿和低電平在代碼上的區別,基本上就能驅起來了。 595的時鐘高達50M,渣渣51單片機的速度對它來說是小CASE,根本不需要什么NOP,即便是M1的內核都不需要NOP! |
void HC595SendByte(unsigned char dat)//3入多出,這是串行輸入,并行輸出的東西 { unsigned char a; YA=0; HUAN=0; for(a=0;a<8;a++) { DAT=dat>>7; dat<<=1; YA=1; _nop_();//對于12mhz的芯片延時1us,包含在intrinsic.h里 _nop_(); delay(1000);//故意延時 YA=0; delay(1000);//故意延時 } HUAN=1; _nop_(); _nop_(); // delay(3000);//故意延時 HUAN=0; } |
void HC595SendByte(unsigned char dat)//3入多出,這是串行輸入,并行輸出的東西 { unsigned char a; YA=0; HUAN=0; for(a=0;a<8;a++) { DAT=dat>>7; dat<<=1; YA=1; _nop_();//對于12mhz的芯片延時1us,包含在intrinsic.h里 _nop_(); delay(1000);//故意延時 YA=0; delay(1000);//故意延時 } HUAN=1; _nop_(); _nop_(); // delay(3000);//故意延時 HUAN=0; } |
本帖最后由 wjsyjh 于 2022-9-3 16:21 編輯 void HC595SendByte(unsigned char dat)//3入多出,這是串行輸入,并行輸出的東西 { unsigned char a; YA=0; HUAN=0; for(a=0;a<8;a++) { DAT=dat>>7; dat<<=1; YA=1; _nop_();//對于12mhz的芯片延時1us,包含在intrinsic.h里 _nop_(); delay(1000);//故意延時 YA=0; delay(1000);//故意延時 } HUAN=1; _nop_(); _nop_(); // delay(3000);//故意延時 HUAN=0; } 子函數延時短一點就可以了 |
可以試試把28和29行代碼換成dat<<1;DAT=CY; |
接線有問題的吧,或者圖發完整一點 |
接線有問題,應該U2-11接P21,U2-14接P20,U2-12接P22. |
void HC595SendByte(unsigned char dat)//3入多出,這是串行輸入,并行輸出的東西 { unsigned char a; HUAN=0; for(a=0;a<8;a++) { YA=0; DAT=dat>>7; dat<<=1; YA=1; _nop_();//對于12mhz的芯片延時1us,包含在intrinsic.h里 _nop_(); delay(50000);//故意延時 } HUAN=1; _nop_(); _nop_(); delay(50000);//故意延時 HUAN=0; YA=0; } 我稍改了一下,試一下這個 |
1205551786 發表于 2021-7-13 14:22 對~只是把delay(50000);改delay(3000); |
595和595A是不一樣的,看下是不是用了595A |
用的我的程序么 |
原理圖發完整一點,至少74HC595的這些引腳怎么接得發全一點,你這樣發我只能看到一半 |
我的沒問題 ![]() |
Q0~Q7'接的是什么? |
devcang 發表于 2021-7-13 11:15 您這個是595對的用法,我看了很多資料了,我這個問題還沒有解決 |
595輸出要加上拉 |
注意時序必須符合要求 |