51单片机数码管显示0到9不关闭位选能打开段选吗?

专业文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“专业文档”标识的文档便是该类文档。

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档。

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取,非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。

付费文档是百度文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取,具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档。

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档。

}

专业文档是百度文库认证用户/机构上传的专业性文档,文库VIP用户或购买专业文档下载特权礼包的其他会员用户可用专业文档下载特权免费下载专业文档。只要带有以下“专业文档”标识的文档便是该类文档。

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取,非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档。

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取,非会员用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档。

付费文档是百度文库认证用户/机构上传的专业性文档,需要文库用户支付人民币获取,具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档。

共享文档是百度文库用户免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定。只要带有以下“共享文档”标识的文档便是该类文档。

}



因为我的程序里有大量RAM占用和多路ADC,导致LED数码管出现类似打嗝那样闪烁, delay调到最小都是这样。
在网上找了一下用定时器动态扫描4位数码管的例程,全部是用595之类的进行驱动的,我想用STC直接驱动,有没有这样的例程呢?
我的是4位共阴数码管,用STC强推挽输出,通过按键切换各路ADC数值显示。

程序如果被占用CPU高,动态扫描必会打嗝。。。。。。。。。。

扫描就是就是不断显示各位、和各段——足够快时,眼看就不闪了


这个时候你就需要使用状态机的思想了。使用状态机的思想把数码管扫描打碎到其他部分的程序执行中就好了。除非有某些无法拆分的函数执行占用了过长的时间,不然就是没有问题的。而且数码管扫描不要用delay函数。

你可以参考下这个帖子里的源程序:/thread--1.html


整个程序,包括数码管扫描就使用了状态机的思想。单片机如同列表循环一样顺次执行多个事物,但同时只处理一个事物,每次列表循环数码管扫描只移动一位显示,当进行下次列表循环时数码管扫描再移动一位。数码管从一位切换到下一位的时间很短,这样由于MCU还要执行其他事物数码管每一位就都有足够长的时间进行显示了,同时又能不断扫描,即便是有的事物执行的时间比较长,也不会影响数码管显示,因为在执行某个事物的时候,数码管的某一位是一直点亮的,除非这个事物执行的真是太长了,几百毫秒,不然顶多就是扫描频率低一些,显得有些闪烁而已。上述文中我也简单提到了程序的思路。

如果使用状态机的思想还无法满足楼主的需求,那么可能就要使用完整的状态机来重新规划整个程序了。如果还无法满足,那么可能就要考虑使用操作系统来调度MCU资源了。

当然了,还有另外一个办法,就是使用两片单片机,其中一片专门负责显示,二者使用UART或者IIC之类的通信,这种办法我也用过,比较笨但是绝对好使。

使用中断就能解决问题了。
比如定时器中断。设置定时器每隔20毫秒产生一个中断,中断服务中扫描所有的数码管。这样数码管的刷新率有50Hz,绝对不会闪烁了。
而主程序再卡再慢都不会影响数码管的扫描,因为是定时器中断负责数码管的刷新。
如果程序中没有其他需要精确控制时间的部分可以用中断来扫描,方法是使用定时器/计数器T0或T1的中断,每隔很短的时间就扫描一位。其实我更推荐在定时器中断里面做别的事,主循环不停的做扫描数码管操作,设置4个8位的存储器用来存储每一位数码管要显示的内容,比如用20h到23h,然后主循环里面就是循环把位于20h的数据发送给数码管1,21H的数据发送给数码管2这样,然后利用定时器中断每隔50ms采样一次,一般的采样不需要不停采样的
既然你的ram被大量占用,不妨加个专用驱动数码管IC驱动芯片,非常简单,比如MAX7219,可推8位共阴数码管,只占cpu3个IO口,可以大大缓解压力,好处多多,谁用谁知道!

程序如果被占用CPU高,动态扫描必会打嗝。。。。。。。。。。

扫描就是就是不断显示各位、和各段——足够快时,眼看就不闪了



除非特殊需要,超过1ms的延时不宜采用delay软件延时,数码管动态显示程序不论放在主循环还是中断里都不可以用一次把所有数码管扫描一遍的方法,而是每次循环只改变一位数码管。参考例程:
就用定时器中断来扫描驱动数码管,这样就不会闪了。
其实用LED大屏幕的的恒流驱动如MBIA之类的更好解决甚至驱动时序都和595一样,4位数码管用两片就够了。质优价廉,还方便。静态显示永远不会闪。

或者直接加片单片机。15W204之类的专做显示,也很好用。

有时候用硬件解决比纯软件容易还可靠。还省事。

谢谢你的回帖,我先去学习下你的帖子
我就是要找用中断显示的方法,找到的都用了外接显示芯片
4路ADC采集,因为要的就是数据不灵敏,50ms进行采样的,通过按键轮流切换显示的。现在要的就是用中断来扫描
谢谢你的程序,我来试试
说下IO口配置,我可以试试
单片机:SST89C516RD2  .用普通C51的单片机,用3个IO模拟一个SPI口,速度慢一点点。关键事定时中断的程序要执行速度快,短小精悍。这样1毫秒扫描一位,LED会很亮的。还有动态扫描24位的。是2002年做的。
这个项目的MCU的负担是大大的。

我就是要找用中断显示的方法,找到的都用了外接显示芯片

在定时器中断里面做数码管的扫描。只要定时器中断的频率足够高(50Hz的频率就足够了),就看不出数码管的闪烁。
由于使用了中断,所以要求扫描数码管的过程要足够快,以防止中断服务占用过多的CPU时间,影响系统实时性。
所以要把数码管显示的过程拆成两部分:一部分负责把要显示的内容转换成数码管可以直接拿来用的数据,另一部分就是显示这些数据了。
简单地说就是“逻辑”和“渲染”这两部分。
逻辑不要求很高的频率,所以可以放在主函数里面。渲染就是定时器中断服务。
从代码中可以看到,Dec2Buf函数将传入的数值进行一番转换,拆成了从个位到千万位的每一位数值。其中还做了灭零处理。这个函数就是所谓的“逻辑”。
Octuple8SegLED_Display函数直接取上面转换好的8位数值,然后扫描数码管的每一位,把对应的位的数值写到数码管里面。这个函数就是所谓的“渲染”。
为了显示效果,我故意用了8位数码管做演示。4位数码管扫描次数少一半,效果更好。
此外,Proteus没有STC单片机,所以只能拿8051仿真。不过这古董玩意的P口没有强推挽模式,所以只好拿74LS244模拟强推挽了。STC单片机的话不需要这两个芯片,P口可以直连LED。(安全起见最好加上8个限流电阻)
还有,我这里把8个位选直接连了P3口。事实上完全可以使用一个3-8译码器(4位数码管的话就是2-4译码器)节省IO口。当然,扫描的那部分代码需要稍微修改一下。
非常感谢你的代码,用595和单片机的端口直接推动在哪些地方有差异呢?
谢谢你的热心,c的我都不是很懂,汇编的我就更难了,我会好好琢磨你上面发的C的程序。
非常感谢你的热心。我来认真学习

非常感谢你的热心。我来认真学习

//数码管:正向位置;共阴极;正向连接


给你一个4位共阴数码管动态显示演示程序,仿真无误,代码简洁,有详细注释,很容易理解。中断刷新速度2.5ms,适合STC15系列,如STC15W408AS。P1.0~P1.7用作ADC,P2.0~P2.7用作数码管段码,P3.4~P3.7用作数码管位码,P3.0~P3.3保留作其它用途,如用其它51单片机测试需要更改定时器初始化和中断程序。

除非特殊需要,超过1ms的延时不宜采用delay软件延时,数码管动态显示程序不论放在主循环还是中断里都不可以用一次把所有数码管扫描一遍的方法,而是每次循环只改变一位数码管。参考例程:



因为段码和位码是由P0口分时通过两个74HC573锁存器驱动数码管
用天微电子的TM系列LED驱动控制专用电路方便,最多用3个端口,驱动最高十几位LED,不用刷新自己保持数据,几毛钱一片。
}

我要回帖

更多关于 单片机数码管 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信