標題: 單片機+4位數(shù)碼管怎么驅動合理? [打印本頁]

作者: ningsy    時間: 2022-10-2 17:54
標題: 單片機+4位數(shù)碼管怎么驅動合理?
各位好:4位數(shù)碼管怎么驅動合理呢?我是按照普中A2開發(fā)板原理圖焊了一個電路,是可以運行的。但他是用了2個4位共陰數(shù)碼管,用了74H245八線雙向收發(fā)器接P0口,74HC138接P2.2,P2.3,P2.4,實現(xiàn)3個IO控制8位數(shù)碼管陽極的功能。

我的問題是,在我的電路中只用了1個4位的數(shù)碼管,也需要加38譯碼器嗎?假如數(shù)碼管的陽極直連單片機4個IO口可以嗎,還是每路需要加三極管驅動?若加三極管也可以,那跟38譯碼器的方案相比哪個成本和穩(wěn)定性上更有優(yōu)勢呢(畢竟一個38譯碼器價格也不貴)?再或者我考慮換個別的IC驅動數(shù)碼管陰極?

我也查了以前的帖子,有很多電路仿真都是單片機和數(shù)碼管直連的,也有人說沒問題可以驅動,可我這是實際項目,跟仿真一樣處理可行嗎?是不是無論怎樣都要用個器件隔離單片機和數(shù)碼管,以免兩者互相影響?


第一次做項目,太多的問題,請大家不吝賜教。


        


作者: 188610329    時間: 2022-10-2 18:21
用tm1650吧,兩個io就可以了。限流電阻都省了。
作者: xianfajushi    時間: 2022-10-2 20:53
硬件基礎差了點,正確應該查單片機IO驅動電流,看描述未觸及問題根本。
作者: ningsy    時間: 2022-10-2 21:07
188610329 發(fā)表于 2022-10-2 18:21
用tm1650吧,兩個io就可以了。限流電阻都省了。

感謝指點,我這就去查資料。
我本來想89C52的IO這么多,用不上也得閑著,現(xiàn)在看來可以再找款IO少的MCU了。
作者: hhdsdy    時間: 2022-10-2 21:23
188610329 發(fā)表于 2022-10-2 18:21
用tm1650吧,兩個io就可以了。限流電阻都省了。

是啊,還帶按鍵處理功能,還能調(diào)亮度的
作者: npn    時間: 2022-10-2 21:52
IO口配置為強推挽即可直接驅動 (STC89、90除外)
作者: lwq1947    時間: 2022-10-3 07:00
ningsy 發(fā)表于 2022-10-2 21:07
感謝指點,我這就去查資料。
我本來想89C52的IO這么多,用不上也得閑著,現(xiàn)在看來可以再找款IO少的MCU了 ...

最簡單低成本就用公陰4位數(shù)碼管和一只1K排阻就能驅動,因為現(xiàn)在的數(shù)碼管都是高亮的2,3毫安就很亮了。
作者: wulin    時間: 2022-10-3 07:56
設計學習(開發(fā))板的目的是讓初學者用有限的資源學習掌握更多的外圍硬件操控。但就某一項功能而言,學習板上的硬件配置未必是最佳。MCU的IO口輸出能力畢竟有限,直接驅動數(shù)碼管等其它功耗器件有點不堪重負,74H245、74HC138等外圍IC既可以提高驅動力,又可以擴展應用范圍。仿真只要邏輯正確基本都能成功。與實際電路還是有較大差距。做實際項目首先要考慮安全、可靠。玩具、民用、工控及醫(yī)療電器的行業(yè)安全標準不同,設計方案選擇有所區(qū)別。高規(guī)格產(chǎn)品還要考慮冗余、抗擾、容錯。單就怎么合理驅動4位數(shù)碼管而言,使用專用集成電路TM1650的方案較佳,還能附加16個按鍵。當然MCU直接驅動數(shù)碼管,只要在設計、選材和軟件上用點心也完全可能。
作者: ningsy    時間: 2022-10-3 10:24
xianfajushi 發(fā)表于 2022-10-2 20:53
硬件基礎差了點,正確應該查單片機IO驅動電流,看描述未觸及問題根本。

有道理,還沒怎么想過驅動電流這個問題。
作者: ningsy    時間: 2022-10-3 10:26
npn 發(fā)表于 2022-10-2 21:52
IO口配置為強推挽即可直接驅動 (STC89、90除外)

總是看到“強推挽”這種用法,一直沒弄明白具體怎么用,原來是我的STC89C52不支持啊
作者: ningsy    時間: 2022-10-3 11:02
lwq1947 發(fā)表于 2022-10-3 07:00
最簡單低成本就用公陰4位數(shù)碼管和一只1K排阻就能驅動,因為現(xiàn)在的數(shù)碼管都是高亮的2,3毫安就很亮了。

這個應該要整體考慮程序、單片機、數(shù)碼管的選型匹配吧!我這方面的功力還不夠,客戶端的環(huán)境和用戶習慣千差萬別,如果一旦客戶抱怨(我能想到的:比如亮度不夠,抗干擾不行等等)就很麻煩了。
作者: ningsy    時間: 2022-10-3 11:10
wulin 發(fā)表于 2022-10-3 07:56
設計學習(開發(fā))板的目的是讓初學者用有限的資源學習掌握更多的外圍硬件操控。但就某一項功能而言,學習板 ...

綜合您和以上老師的建議,我決定采用TM1650的方案驅動。還有一種AIP650應該是同一種IC,我在論壇里已經(jīng)找到了這兩種IC的驅動代碼和原理圖,下一步準備買元件來測試了。
非常感謝!







作者: hhdsdy    時間: 2022-10-3 12:39
ningsy 發(fā)表于 2022-10-3 11:10
綜合您和以上老師的建議,我決定采用TM1650的方案驅動。還有一種AIP650應該是同一種IC,我在論壇里已經(jīng)找 ...

TM1650用的地方很多,很可能你拆一個電磁爐的控制板就是用的TM1650
作者: mengsiu    時間: 2022-10-3 15:18
TM1650驅動,使用51單片機。
  1. /*--------------------------------------------------------------------------
  2. TM1650.H
  3. 四位數(shù)碼管驅動 TM1650 讀寫程序
  4. --------------------------------------------------------------------------*/
  5. #ifndef __TM1650_H__
  6. #define __TM1650_H__

  7. sbit CLK = P3^7;
  8. sbit DIO = P3^6;

  9. void Set1650(uchar add,uchar dat);
  10. uchar Scan_Key(void);

  11. uchar BL = 1;          //亮度等級
  12. uchar CODE[10] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //0~9顯示代碼
  13.                                 // 0    1    2    3    4    5    6    7    8    9

  14. void Init1650(){
  15.         Set1650(0x48,(BL*16+0x01));//設定亮度,開顯示八段顯示方式,后一個字節(jié)中高位用于亮度,低位用于七段或八段顯示方式和開關顯
  16.                                                                 //如:0x71為七級亮度,八段顯示方式,開顯示;0x79為為七級亮度,七段顯示方式,開顯示
  17. }

  18. void Delay_us(uint i){ //us延時
  19.         for(;i>0;i--){
  20.                 _nop_();
  21.                 _nop_();
  22.                 _nop_();
  23.                 _nop_();
  24.                 _nop_();
  25.         }
  26. }

  27. void Start1650(void){//開始信號
  28.         CLK = 1;
  29.         DIO = 1;
  30.         Delay_us(5);
  31.         DIO = 0;
  32. }

  33. void Ask1650(void){ //ACK信號
  34.         uchar timeout = 1;
  35.         CLK = 1;
  36.         Delay_us(5);
  37.         CLK = 0;
  38.         while((DIO)&&(timeout<=100)){
  39.                 timeout++;
  40.         }
  41.         Delay_us(5);
  42.         CLK = 0;
  43. }

  44. void Stop1650(void){ //停止信號
  45.         CLK = 1;
  46.         DIO = 0;
  47.         Delay_us(5);
  48.         DIO = 1;
  49. }

  50. void WrByte1650(uchar oneByte){//寫一個字節(jié)高位在前,低位在后
  51.         uchar i;
  52.         CLK = 0;
  53.         Delay_us(1);
  54.         for(i=0;i<8;i++){
  55.                 oneByte = oneByte<<1;
  56.                 DIO = CY;
  57.                 CLK = 0;
  58.                 Delay_us(5);
  59.                 CLK = 1;
  60.                 Delay_us(5);
  61.                 CLK = 0;
  62.         }
  63. }

  64. uchar Scan_Key(void){  // 按鍵掃描
  65.         uchar i;
  66.         uchar rekey;
  67.         Start1650();
  68.         WrByte1650(0x49);//讀按鍵命令
  69.         Ask1650();
  70.         //DIO = 1;
  71.         for(i=0;i<8;i++){
  72.                 CLK = 1;
  73.                 rekey = rekey<<1;
  74.                 if(DIO){
  75.                 rekey++;
  76.                 }
  77.                 Delay_us(5);
  78.                 CLK = 0;
  79.         }
  80.         Ask1650();
  81.         Stop1650();
  82.         return(rekey);
  83. }

  84. void Set1650(uchar add,uchar dat){ //數(shù)碼管顯示
  85.                                                                 //寫顯存必須從高地址開始寫
  86.         Start1650();
  87.         WrByte1650(add); //第一個顯存地址
  88.         Ask1650();
  89.         WrByte1650(dat);
  90.         Ask1650();
  91.         Stop1650();
  92. }

  93. #endif
復制代碼
注意:TM1650不是IIC器件。!不能接在IIC線路上

作者: qq603599910    時間: 2022-10-3 20:37
ningsy 發(fā)表于 2022-10-2 21:07
感謝指點,我這就去查資料。
我本來想89C52的IO這么多,用不上也得閑著,現(xiàn)在看來可以再找款IO少的MCU了 ...

看MCU還要什么功能,用多少PIN,基本都是STC15或者STC8系列,89系列已經(jīng)很老很少用在產(chǎn)品上了.關于顯示驅動我也偏向于用TM1650專業(yè)芯片,我用TM1650還幾年沒有給我惹過禍,升級固件和換硬件都不用管那一塊,根本不用考慮顯示時基和刷新率.
作者: nanhaixiaodeng    時間: 2022-10-4 10:28
使用1650 IIC通信
作者: ningsy    時間: 2022-10-4 11:17
mengsiu 發(fā)表于 2022-10-3 15:18
TM1650驅動,使用51單片機。
注意:TM1650不是IIC器件。!不能接在IIC線路上。

非常感謝您的驅動代碼!器件到了試一下
作者: ningsy    時間: 2022-10-4 11:40
qq603599910 發(fā)表于 2022-10-3 20:37
看MCU還要什么功能,用多少PIN,基本都是STC15或者STC8系列,89系列已經(jīng)很老很少用在產(chǎn)品上了.關于顯示驅動 ...

您說的有道理,我用的89C52內(nèi)存8K已經(jīng)快滿了!還有很多功能沒有加。這幾天在重新選MCU,想一步到位換成STC32G12K128 DIP40,價格便宜量又足。

再請教一下:我這是個蠕動泵控制器,原理也不復雜,準備做基礎版(數(shù)碼管顯示),高級版(12864及TFT顯示),其實功能一樣的,就是操作體驗不同,顏值不一樣。想做成向下兼容的,用同一塊板子同一款U同時留出數(shù)碼管和顯示屏接口,燒寫不同的軟件,能否可行?

還有我感覺基礎版用STC32G12K128+數(shù)碼管,U的性能可能過剩了,有啥影響么?
作者: qq603599910    時間: 2022-10-6 08:28
ningsy 發(fā)表于 2022-10-4 11:40
您說的有道理,我用的89C52內(nèi)存8K已經(jīng)快滿了!還有很多功能沒有加。這幾天在重新選MCU,想一步到位換成ST ...

完全可行啊,燒錄口后期當通訊口用,隨時想升級就升級. STC32了解過還沒有買回來體驗,后期好的話共享下體驗,謝謝!
作者: 188610329    時間: 2022-10-6 15:58
ningsy 發(fā)表于 2022-10-2 21:07
感謝指點,我這就去查資料。
我本來想89C52的IO這么多,用不上也得閑著,現(xiàn)在看來可以再找款IO少的MCU了 ...

確實,IO空著不用也是浪費, 但是,提議 TM1650 是基于,你打算用 HC24+ HC138 的前提下,建議你用 TM1650  更經(jīng)濟,以及更方便。 如果要 IO 直接驅動, 自然是可以的,但是動態(tài)掃描這個工作,負擔會加在 MCU上,同時,還牽涉到 限流電阻等等的額外電路。這就要考慮“必要性”的問題了。畢竟成本來講 TM1650 實在是太便宜了……,便宜到,我覺得 限流電阻太貴了。

最后,看你打算用 STC32,  雖然STC32本身不錯,但是,基于你 單片機基礎還薄弱,不建議 步子一下子邁那么大, 先STC8 系列 過渡一下,可能會更好。
以上,純屬個人建議。
作者: ningsy    時間: 2022-10-6 23:03
188610329 發(fā)表于 2022-10-6 15:58
確實,IO空著不用也是浪費, 但是,提議 TM1650 是基于,你打算用 HC24+ HC138 的前提下,建議你用 TM165 ...

感謝大佬指導!我已經(jīng)準備使用TM1650了,只是這兩天商家放假,發(fā)貨很慢,還沒收到。

至于STC32,我今天實在忍不住下單買了一個,心想早晚要用上的吧(以后接12864或TFT屏)。如果看到您的建議,我可能會同時入一個STC8,不過沒關系,我再買一次就是了。
作者: 蛋黃派@SZPT    時間: 2022-10-7 10:02
TM1650確實好用,又便宜又省引腳。IIC驅動到處都有例程能用,自己刷新還不用占用程序時間
作者: Y_G_G    時間: 2022-10-8 10:10
如果條件允許,最好是IO直接控制,有強推挽模式的就串聯(lián),沒有這個模式的就上拉
在實際項目中,是完全可以用IO直接驅動的
245和138都是多余的
這是最優(yōu)先選擇的方案,首先是程序簡單,對于不是很精通編程的人來說,代碼簡單易懂比很多東西都重要
最怕就是出了問題,你找半天都不知道是你自己的代碼有問題還是別人的驅動代碼有問題
但TM1650之類的外圍你是肯定要學會使用的,畢竟,TM1650的優(yōu)點就擺在那,當你的PCB是主控和顯示是分離的,它的好處就顯現(xiàn)了,IO直接驅動要12根線.....
作者: ningsy    時間: 2022-10-8 14:09
零件已到,成功點亮,效果完美!電路真的是太簡潔了!

不過第一次加載了一個官方例程竟然是黑屏!害的我檢查了近一個鐘頭,最后換了個例程,啥毛病也沒有。下步就是匹配代碼了。

在此感謝各位老師的建議!






作者: ningsy    時間: 2022-10-8 14:38
Y_G_G 發(fā)表于 2022-10-8 10:10
如果條件允許,最好是IO直接控制,有強推挽模式的就串聯(lián),沒有這個模式的就上拉
在實際項目中,是完全可以用IO ...

有道理,1650的代碼實在有些多,不好理解。
作者: ROMEOBACKi    時間: 2022-10-8 15:10
IO可以直接控制的,但是四位數(shù)碼管驅動代碼還是比較冗長的,所以更換一下硬件選擇,這樣代碼也可以變得更加簡潔
作者: 188610329    時間: 2022-10-9 11:38
ningsy 發(fā)表于 2022-10-8 14:38
有道理,1650的代碼實在有些多,不好理解。

tm1650的代碼其實很少,你覺得多,因為你用的89c52,就好比如果你沒有硬件串口,要軟件模擬串口,你也會覺得代碼繁瑣,其實說白了,大多網(wǎng)上傳的所謂的“通用庫”大多都是不利用硬件資源的,就好比ds1302,網(wǎng)上你能找到的范例都是用io直接驅動的,但是,如果用半雙工spi直接驅動,或者串口直接驅動,代碼就會簡單很多。tm1650也一樣,硬件驅動,代碼會少很多。
作者: ningsy    時間: 2022-10-9 15:32
mengsiu 發(fā)表于 2022-10-3 15:18
TM1650驅動,使用51單片機。
注意:TM1650不是IIC器件!!不能接在IIC線路上。

已用您的代碼驅動起來了,顯示完美,非常感謝!

按鍵暫時沒用到,屏蔽了。又在函數(shù)里面加了一個數(shù)碼管地址定義數(shù)組,便于定位地址:

//數(shù)碼管位數(shù)                              1       2        3       4
u8 DIG_BIT_CODE[4]      = {  0x68,0x6a,0x6c,0x6e };





作者: ningsy    時間: 2022-10-9 15:47
188610329 發(fā)表于 2022-10-9 11:38
tm1650的代碼其實很少,你覺得多,因為你用的89c52,就好比如果你沒有硬件串口,要軟件模擬串口,你也會 ...

多謝大佬指導!您說的這些我還沒學到,有點暈我一定去找資料看一下。感覺這個小項目越做要學的東西越多啊。我已經(jīng)入了一塊STC8,下一步準備把代碼搬過去。
作者: ningsy    時間: 2022-10-24 09:23
請教:還是TM1650驅動的問題。

為什么用STC8H系列(STC8H1K08,STC8H8K64U)驅動TM1650 I/O口必須要開強推挽模式才亮呢?設置成準雙向模式DAT腳電壓拉不起來只有0.6V左右導致黑屏。另外開強推挽模式需要串接電阻么?多大合適?

而用STC89C52(I/O口不用設置)和STC8G系列(STC8H1K08-16/20,STC8H1K17,設置成準雙向口模式)就能正常亮屏。


看手冊這兩種U  I/O口配置也沒啥區(qū)別啊,代碼也能通用(除了STC8H 要改下I/O配置),有前輩遇到過這個問題嗎?







作者: lkc8210    時間: 2022-10-24 09:48
ningsy 發(fā)表于 2022-10-24 09:23
請教:還是TM1650驅動的問題。

為什么用STC8H系列(STC8H1K08,STC8H8K64U)驅動TM1650 I/O口必須要開強 ...

準雙向模式的拉電流只有270~150uA
拉不動1650,要加上拉電阻(通常是4.7k)




作者: ningsy    時間: 2022-10-24 11:21
lkc8210 發(fā)表于 2022-10-24 09:48
準雙向模式的拉電流只有270~150uA
拉不動1650,要加上拉電阻(通常是4.7k)

多謝高手指點!經(jīng)測試完全可行。手頭沒有4.7K電阻,只有10K的。設為準雙向口模式,加一個仍舊黑屏,并兩個點亮,電壓2.2V;并三個電壓2.49V。單片機電流也降了幾個mA。
那為何STC8G1K08 系列準雙向口模式可以點亮呢?難道是由于制造誤差,處在臨界值上了?
作者: 188610329    時間: 2022-10-24 15:39
ningsy 發(fā)表于 2022-10-24 11:21
多謝高手指點!經(jīng)測試完全可行。手頭沒有4.7K電阻,只有10K的。設為準雙向口模式,加一個仍舊黑屏,并兩 ...

STC8系列  有個 PnUP 寄存器  可以開啟 內(nèi)部的 4.7K 上拉,你不需要外接上拉電阻, 只要 開漏模式 + 內(nèi)部上拉,就可以驅動 TM1650,
有些知識,隨著使用的單片機進化,要跟著進化。
進入STC8 系列時代,如果不是對功耗有特別的需要,盡可能的用   開漏+內(nèi)部上拉 取代  準雙向模式。
作者: ningsy    時間: 2022-10-24 23:34
188610329 發(fā)表于 2022-10-24 15:39
STC8系列  有個 PnUP 寄存器  可以開啟 內(nèi)部的 4.7K 上拉,你不需要外接上拉電阻, 只要 開漏模式 + 內(nèi)部 ...

大師您好!您說的“開漏模式 + 內(nèi)部上拉”我試了N遍,就是不亮屏是不是我端口配置代碼寫錯了?
TM1650的引腳定義:
sbit CLK = P3^6;
sbit DIO = P3^7;

端口配置:

P3M1 = 0xff;   P3M0 = 0xff;
P3PU =0xc0; //不行

端口配置:

P3M1 = 0x00;   P3M0 = 0x00;
P3PU =0xc0; //也不行

下面一行改成P3PU =0xff; P3PU |=0xc0;//都不行

MCU型號是STC8H1K08,用什么辦法能看下內(nèi)部上拉電阻起沒起作用呢?






作者: 188610329    時間: 2022-10-25 01:36
P_SW2 |= 0x80;    //這個最好放在  void main() 的第一句,  開了就不用關了。
P3PU =0xc0;


作者: ningsy    時間: 2022-10-25 08:48
188610329 發(fā)表于 2022-10-25 01:36
P_SW2 |= 0x80;    //這個最好放在  void main() 的第一句,  開了就不用關了。
P3PU =0xc0;

感謝大師指點!已經(jīng)完全正常了。




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