找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2362|回复: 35
打印 上一主题 下一主题
收起左侧

单片机+4位数码管怎么驱动合理?

  [复制链接]
跳转到指定楼层
楼主
各位好:4位数码管怎么驱动合理呢?我是按照普中A2开发板原理图焊了一个电路,是可以运行的。但他是用了2个4位共阴数码管,用了74H245八线双向收发器接P0口,74HC138接P2.2,P2.3,P2.4,实现3个IO控制8位数码管阳极的功能。

我的问题是,在我的电路中只用了1个4位的数码管,也需要加38译码器吗?假如数码管的阳极直连单片机4个IO口可以吗,还是每路需要加三极管驱动?若加三极管也可以,那跟38译码器的方案相比哪个成本和稳定性上更有优势呢(毕竟一个38译码器价格也不贵)?再或者我考虑换个别的IC驱动数码管阴极?

我也查了以前的帖子,有很多电路仿真都是单片机和数码管直连的,也有人说没问题可以驱动,可我这是实际项目,跟仿真一样处理可行吗?是不是无论怎样都要用个器件隔离单片机和数码管,以免两者互相影响?


第一次做项目,太多的问题,请大家不吝赐教。


        

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:624769 发表于 2022-10-2 18:21 来自手机 | 只看该作者
用tm1650吧,两个io就可以了。限流电阻都省了。
回复

使用道具 举报

板凳
ID:332444 发表于 2022-10-2 20:53 | 只看该作者
硬件基础差了点,正确应该查单片机IO驱动电流,看描述未触及问题根本。
回复

使用道具 举报

地板
ID:1044091 发表于 2022-10-2 21:07 | 只看该作者
188610329 发表于 2022-10-2 18:21
用tm1650吧,两个io就可以了。限流电阻都省了。

感谢指点,我这就去查资料。
我本来想89C52的IO这么多,用不上也得闲着,现在看来可以再找款IO少的MCU了。
回复

使用道具 举报

5#
ID:88256 发表于 2022-10-2 21:23 | 只看该作者
188610329 发表于 2022-10-2 18:21
用tm1650吧,两个io就可以了。限流电阻都省了。

是啊,还带按键处理功能,还能调亮度的
回复

使用道具 举报

6#
ID:57657 发表于 2022-10-2 21:52 | 只看该作者
IO口配置为强推挽即可直接驱动 (STC89、90除外)
回复

使用道具 举报

7#
ID:997011 发表于 2022-10-3 07:00 | 只看该作者
ningsy 发表于 2022-10-2 21:07
感谢指点,我这就去查资料。
我本来想89C52的IO这么多,用不上也得闲着,现在看来可以再找款IO少的MCU了 ...

最简单低成本就用公阴4位数码管和一只1K排阻就能驱动,因为现在的数码管都是高亮的2,3毫安就很亮了。
回复

使用道具 举报

8#
ID:213173 发表于 2022-10-3 07:56 | 只看该作者
设计学习(开发)板的目的是让初学者用有限的资源学习掌握更多的外围硬件操控。但就某一项功能而言,学习板上的硬件配置未必是最佳。MCU的IO口输出能力毕竟有限,直接驱动数码管等其它功耗器件有点不堪重负,74H245、74HC138等外围IC既可以提高驱动力,又可以扩展应用范围。仿真只要逻辑正确基本都能成功。与实际电路还是有较大差距。做实际项目首先要考虑安全、可靠。玩具、民用、工控及医疗电器的行业安全标准不同,设计方案选择有所区别。高规格产品还要考虑冗余、抗扰、容错。单就怎么合理驱动4位数码管而言,使用专用集成电路TM1650的方案较佳,还能附加16个按键。当然MCU直接驱动数码管,只要在设计、选材和软件上用点心也完全可能。
回复

使用道具 举报

9#
ID:1044091 发表于 2022-10-3 10:24 | 只看该作者
xianfajushi 发表于 2022-10-2 20:53
硬件基础差了点,正确应该查单片机IO驱动电流,看描述未触及问题根本。

有道理,还没怎么想过驱动电流这个问题。
回复

使用道具 举报

10#
ID:1044091 发表于 2022-10-3 10:26 | 只看该作者
npn 发表于 2022-10-2 21:52
IO口配置为强推挽即可直接驱动 (STC89、90除外)

总是看到“强推挽”这种用法,一直没弄明白具体怎么用,原来是我的STC89C52不支持啊
回复

使用道具 举报

11#
ID:1044091 发表于 2022-10-3 11:02 | 只看该作者
lwq1947 发表于 2022-10-3 07:00
最简单低成本就用公阴4位数码管和一只1K排阻就能驱动,因为现在的数码管都是高亮的2,3毫安就很亮了。

这个应该要整体考虑程序、单片机、数码管的选型匹配吧!我这方面的功力还不够,客户端的环境和用户习惯千差万别,如果一旦客户抱怨(我能想到的:比如亮度不够,抗干扰不行等等)就很麻烦了。
回复

使用道具 举报

12#
ID:1044091 发表于 2022-10-3 11:10 | 只看该作者
wulin 发表于 2022-10-3 07:56
设计学习(开发)板的目的是让初学者用有限的资源学习掌握更多的外围硬件操控。但就某一项功能而言,学习板 ...

综合您和以上老师的建议,我决定采用TM1650的方案驱动。还有一种AIP650应该是同一种IC,我在论坛里已经找到了这两种IC的驱动代码和原理图,下一步准备买元件来测试了。
非常感谢!






回复

使用道具 举报

13#
ID:88256 发表于 2022-10-3 12:39 | 只看该作者
ningsy 发表于 2022-10-3 11:10
综合您和以上老师的建议,我决定采用TM1650的方案驱动。还有一种AIP650应该是同一种IC,我在论坛里已经找 ...

TM1650用的地方很多,很可能你拆一个电磁炉的控制板就是用的TM1650
回复

使用道具 举报

14#
ID:16255 发表于 2022-10-3 15:18 | 只看该作者
TM1650驱动,使用51单片机。
  1. /*--------------------------------------------------------------------------
  2. TM1650.H
  3. 四位数码管驱动 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));//设定亮度,开显示八段显示方式,后一个字节中高位用于亮度,低位用于七段或八段显示方式和开关显
  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){//写一个字节高位在前,低位在后
  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){ //数码管显示
  85.                                                                 //写显存必须从高地址开始写
  86.         Start1650();
  87.         WrByte1650(add); //第一个显存地址
  88.         Ask1650();
  89.         WrByte1650(dat);
  90.         Ask1650();
  91.         Stop1650();
  92. }

  93. #endif
复制代码
注意:TM1650不是IIC器件!!!不能接在IIC线路上
回复

使用道具 举报

15#
ID:272119 发表于 2022-10-3 20:37 | 只看该作者
ningsy 发表于 2022-10-2 21:07
感谢指点,我这就去查资料。
我本来想89C52的IO这么多,用不上也得闲着,现在看来可以再找款IO少的MCU了 ...

看MCU还要什么功能,用多少PIN,基本都是STC15或者STC8系列,89系列已经很老很少用在产品上了.关于显示驱动我也偏向于用TM1650专业芯片,我用TM1650还几年没有给我惹过祸,升级固件和换硬件都不用管那一块,根本不用考虑显示时基和刷新率.
回复

使用道具 举报

16#
ID:1046594 发表于 2022-10-4 10:28 | 只看该作者
使用1650 IIC通信
回复

使用道具 举报

17#
ID:1044091 发表于 2022-10-4 11:17 | 只看该作者
mengsiu 发表于 2022-10-3 15:18
TM1650驱动,使用51单片机。
注意:TM1650不是IIC器件!!!不能接在IIC线路上。

非常感谢您的驱动代码!器件到了试一下
回复

使用道具 举报

18#
ID:1044091 发表于 2022-10-4 11:40 | 只看该作者
qq603599910 发表于 2022-10-3 20:37
看MCU还要什么功能,用多少PIN,基本都是STC15或者STC8系列,89系列已经很老很少用在产品上了.关于显示驱动 ...

您说的有道理,我用的89C52内存8K已经快满了!还有很多功能没有加。这几天在重新选MCU,想一步到位换成STC32G12K128 DIP40,价格便宜量又足。

再请教一下:我这是个蠕动泵控制器,原理也不复杂,准备做基础版(数码管显示),高级版(12864及TFT显示),其实功能一样的,就是操作体验不同,颜值不一样。想做成向下兼容的,用同一块板子同一款U同时留出数码管和显示屏接口,烧写不同的软件,能否可行?

还有我感觉基础版用STC32G12K128+数码管,U的性能可能过剩了,有啥影响么?
回复

使用道具 举报

19#
ID:272119 发表于 2022-10-6 08:28 | 只看该作者
ningsy 发表于 2022-10-4 11:40
您说的有道理,我用的89C52内存8K已经快满了!还有很多功能没有加。这几天在重新选MCU,想一步到位换成ST ...

完全可行啊,烧录口后期当通讯口用,随时想升级就升级. STC32了解过还没有买回来体验,后期好的话共享下体验,谢谢!
回复

使用道具 举报

20#
ID:624769 发表于 2022-10-6 15:58 | 只看该作者
ningsy 发表于 2022-10-2 21:07
感谢指点,我这就去查资料。
我本来想89C52的IO这么多,用不上也得闲着,现在看来可以再找款IO少的MCU了 ...

确实,IO空着不用也是浪费, 但是,提议 TM1650 是基于,你打算用 HC24+ HC138 的前提下,建议你用 TM1650  更经济,以及更方便。 如果要 IO 直接驱动, 自然是可以的,但是动态扫描这个工作,负担会加在 MCU上,同时,还牵涉到 限流电阻等等的额外电路。这就要考虑“必要性”的问题了。毕竟成本来讲 TM1650 实在是太便宜了……,便宜到,我觉得 限流电阻太贵了。

最后,看你打算用 STC32,  虽然STC32本身不错,但是,基于你 单片机基础还薄弱,不建议 步子一下子迈那么大, 先STC8 系列 过渡一下,可能会更好。
以上,纯属个人建议。
回复

使用道具 举报

21#
ID:1044091 发表于 2022-10-6 23:03 | 只看该作者
188610329 发表于 2022-10-6 15:58
确实,IO空着不用也是浪费, 但是,提议 TM1650 是基于,你打算用 HC24+ HC138 的前提下,建议你用 TM165 ...

感谢大佬指导!我已经准备使用TM1650了,只是这两天商家放假,发货很慢,还没收到。

至于STC32,我今天实在忍不住下单买了一个,心想早晚要用上的吧(以后接12864或TFT屏)。如果看到您的建议,我可能会同时入一个STC8,不过没关系,我再买一次就是了。
回复

使用道具 举报

22#
ID:685684 发表于 2022-10-7 10:02 | 只看该作者
TM1650确实好用,又便宜又省引脚。IIC驱动到处都有例程能用,自己刷新还不用占用程序时间
回复

使用道具 举报

23#
ID:401564 发表于 2022-10-8 10:10 | 只看该作者
如果条件允许,最好是IO直接控制,有强推挽模式的就串联,没有这个模式的就上拉
在实际项目中,是完全可以用IO直接驱动的
245和138都是多余的
这是最优先选择的方案,首先是程序简单,对于不是很精通编程的人来说,代码简单易懂比很多东西都重要
最怕就是出了问题,你找半天都不知道是你自己的代码有问题还是别人的驱动代码有问题
但TM1650之类的外围你是肯定要学会使用的,毕竟,TM1650的优点就摆在那,当你的PCB是主控和显示是分离的,它的好处就显现了,IO直接驱动要12根线.....
回复

使用道具 举报

24#
ID:1044091 发表于 2022-10-8 14:09 | 只看该作者
零件已到,成功点亮,效果完美!电路真的是太简洁了!

不过第一次加载了一个官方例程竟然是黑屏!害的我检查了近一个钟头,最后换了个例程,啥毛病也没有。下步就是匹配代码了。

在此感谢各位老师的建议!





回复

使用道具 举报

25#
ID:1044091 发表于 2022-10-8 14:38 来自手机 | 只看该作者
Y_G_G 发表于 2022-10-8 10:10
如果条件允许,最好是IO直接控制,有强推挽模式的就串联,没有这个模式的就上拉
在实际项目中,是完全可以用IO ...

有道理,1650的代码实在有些多,不好理解。
回复

使用道具 举报

26#
ID:867081 发表于 2022-10-8 15:10 | 只看该作者
IO可以直接控制的,但是四位数码管驱动代码还是比较冗长的,所以更换一下硬件选择,这样代码也可以变得更加简洁
回复

使用道具 举报

27#
ID:624769 发表于 2022-10-9 11:38 来自手机 | 只看该作者
ningsy 发表于 2022-10-8 14:38
有道理,1650的代码实在有些多,不好理解。

tm1650的代码其实很少,你觉得多,因为你用的89c52,就好比如果你没有硬件串口,要软件模拟串口,你也会觉得代码繁琐,其实说白了,大多网上传的所谓的“通用库”大多都是不利用硬件资源的,就好比ds1302,网上你能找到的范例都是用io直接驱动的,但是,如果用半双工spi直接驱动,或者串口直接驱动,代码就会简单很多。tm1650也一样,硬件驱动,代码会少很多。
回复

使用道具 举报

28#
ID:1044091 发表于 2022-10-9 15:32 | 只看该作者
mengsiu 发表于 2022-10-3 15:18
TM1650驱动,使用51单片机。
注意:TM1650不是IIC器件!!!不能接在IIC线路上。

已用您的代码驱动起来了,显示完美,非常感谢!

按键暂时没用到,屏蔽了。又在函数里面加了一个数码管地址定义数组,便于定位地址:

//数码管位数                              1       2        3       4
u8 DIG_BIT_CODE[4]      = {  0x68,0x6a,0x6c,0x6e };




回复

使用道具 举报

29#
ID:1044091 发表于 2022-10-9 15:47 | 只看该作者
188610329 发表于 2022-10-9 11:38
tm1650的代码其实很少,你觉得多,因为你用的89c52,就好比如果你没有硬件串口,要软件模拟串口,你也会 ...

多谢大佬指导!您说的这些我还没学到,有点晕我一定去找资料看一下。感觉这个小项目越做要学的东西越多啊。我已经入了一块STC8,下一步准备把代码搬过去。
回复

使用道具 举报

30#
ID:1044091 发表于 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口配置也没啥区别啊,代码也能通用(除了STC8H 要改下I/O配置),有前辈遇到过这个问题吗?






回复

使用道具 举报

31#
ID:161164 发表于 2022-10-24 09:48 | 只看该作者
ningsy 发表于 2022-10-24 09:23
请教:还是TM1650驱动的问题。

为什么用STC8H系列(STC8H1K08,STC8H8K64U)驱动TM1650 I/O口必须要开强 ...

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



回复

使用道具 举报

32#
ID:1044091 发表于 2022-10-24 11:21 | 只看该作者
lkc8210 发表于 2022-10-24 09:48
准双向模式的拉電流只有270~150uA
拉不動1650,要加上拉電阻(通常是4.7k)

多谢高手指点!经测试完全可行。手头没有4.7K电阻,只有10K的。设为准双向口模式,加一个仍旧黑屏,并两个点亮,电压2.2V;并三个电压2.49V。单片机电流也降了几个mA。
那为何STC8G1K08 系列准双向口模式可以点亮呢?难道是由于制造误差,处在临界值上了?
回复

使用道具 举报

33#
ID:624769 发表于 2022-10-24 15:39 | 只看该作者
ningsy 发表于 2022-10-24 11:21
多谢高手指点!经测试完全可行。手头没有4.7K电阻,只有10K的。设为准双向口模式,加一个仍旧黑屏,并两 ...

STC8系列  有个 PnUP 寄存器  可以开启 内部的 4.7K 上拉,你不需要外接上拉电阻, 只要 开漏模式 + 内部上拉,就可以驱动 TM1650,
有些知识,随着使用的单片机进化,要跟着进化。
进入STC8 系列时代,如果不是对功耗有特别的需要,尽可能的用   开漏+内部上拉 取代  准双向模式。
回复

使用道具 举报

34#
ID:1044091 发表于 2022-10-24 23:34 | 只看该作者
188610329 发表于 2022-10-24 15:39
STC8系列  有个 PnUP 寄存器  可以开启 内部的 4.7K 上拉,你不需要外接上拉电阻, 只要 开漏模式 + 内部 ...

大师您好!您说的“开漏模式 + 内部上拉”我试了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,用什么办法能看下内部上拉电阻起没起作用呢?





回复

使用道具 举报

35#
ID:624769 发表于 2022-10-25 01:36 | 只看该作者
P_SW2 |= 0x80;    //这个最好放在  void main() 的第一句,  开了就不用关了。
P3PU =0xc0;

回复

使用道具 举报

36#
ID:1044091 发表于 2022-10-25 08:48 | 只看该作者
188610329 发表于 2022-10-25 01:36
P_SW2 |= 0x80;    //这个最好放在  void main() 的第一句,  开了就不用关了。
P3PU =0xc0;

感谢大师指点!已经完全正常了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表