您的位置 首页 测评

由数码管动态显示浅谈单片机程序

数码管动态显示原理:动态显示的特点是将所有位数码管的段选线并联在一起,由位选线控制是哪一位数码管有效。这样一来,就没有必要每一位数

数码管动态显现原理:动态显现的特点是将一切位数码管的段选线并联在一同,由位选线操控是哪一位数码管有用。这样一来,就没有必要每一位数码管接一组IO口,然后大大地节省了IO口。选亮数码管选用动态扫描显现。所谓动态扫描显现即轮流向各位数码管送出字形码和相应的位选,使用发光管的余辉和人眼视觉暂留效果,使人的感觉如同各位数码管一同都在显现。 即实践上,每个数码管是一个个的顺次点亮。使用人眼视觉逗留,快速扫描,一般每隔10ms以的下时刻改写一次数码管显现即可看到安稳的显现效果。自己亲身实验,最好改写时刻设定为5ms一下,高于5ms显现会略微有些晃眼。

传统的数码管显现程序为:

#define DUAN P1

#define WEI P0

void delayms(uchar x)

{

uchar y=120;

while(x–)

while(y–);

}

WEI=0; //消影 共阳,共阴为 WEI=0xff

DUAN=code[value_duan1]; //送段选数据

WEI=value_wei1; //送位选数据,承认第几个数码管点亮

Delayms(5); //延时5ms使其显现安稳

WEI=0; //消影 共阳,共阴为 WEI=0xff

DUAN=code[value_duan2]; //送段选数据

WEI= value_wei2; //送位选数据,承认第几个数码管点亮

Delayms(5); //延时5ms使其显现安稳

当延时后顺次再送下一个数据,再延时······

这儿我想再次说一下关于延时的问题。一般教科书或者说现在绝大多数能看到的数码管处理程序材料大多都是依照上面的方法处理的。我想问一下,这儿延时5ms的含义安在?可否不延时?答案是能够,但显现成果便是最终一个被点亮的数码管会比较亮,其他的都比较暗。至于原因很简略,点亮最终一个数码管后,单片机CPU还要跑其他程序,然后再次跑到数码管显现处理函数时再顺次点亮榜首第二个数码管。显着这样最终一个被点亮的数码管点亮的时刻远远比其他的数码管时刻要长,天然这一个特别亮,其他的很昏暗。可是加上5ms延时的话呢?因为单片机速度还算比较快(一般一条指令1us),5ms适当于5000条指令。5000条指令什么概念呢?怎么说呢,若程序里不必“delay”这样的空指令的话,一般一个大型项目就差不多了。一般来说,比方AD测温、adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=17&is_app=0&jk=85d214d39ac24f75&k=%B5%E7%D7%D3%CA%B1%D6%D3&k0=%B5%E7%D7%D3%CA%B1%D6%D3&kdi0=0&luki=8&n=10&p=baidu&q=98059059_cpr&rb=0&rs=1&seller_id=1&sid=754fc29ad314d285&ssp2=1&stid=0&t=tpclicked3_hc&tu=u1831118&u=http%3A%2F%2Fwww%2E51hei%2Ecom%2Fmcu%2F2120%2Ehtml&urlid=0″ id=”16_nwl” mpid=”16″ target=”_blank”>电子时钟等这样小项目实践有用的指令肯定不会到达好几千的姿态。所以说5ms关于单片机来说是个适当长的时刻。

再回到延时5ms后显现较为安稳的问题上。因为点亮最终一个数码管延时5ms后单片机在跑其他的指令时相对要不了多久(条件是其他当地没有“delay”空指令),所以最终一个数码管比其他数码管多亮的时刻就不太显着了,这样天然显现也会比较均匀一些。可是事实上,最终一个被点亮的数码管仍是略微比其他数码管亮一些。留意上面所说的是单片机跑其他指令用的时刻不长的状况。假如,程序比较大,模块许多,单片机要处理的作业许多呢?比方说一个float型数据的除法(不知道读者有没有在单片机上试过)所消耗的指令数或许你都幻想不到(尤其是关于内部不含硬件除法器单片机,其除法指令转换成其他的运算)。我其时做AD测电阻时用的sonix芯片(没有除法器),开端程序里边一个float型除法,整个程序其时有1.5k的姿态,数码管显现,老是一个亮,其他的昏暗,并且很不安稳。后来查找原因,便是因为那条float型除法的问题,居然占了大几ms的时刻。当删去那条指令后,整个程序只要700多字节,也便是说就这么一条指令就直接让程序巨细翻倍了!检查编译器翻译成的汇编指令占了适当大一部分,并且还有许多CALL指令。所以说,8位单片机 的确不适合做除法以及float运算。

扯远了,回到数码管问题。综上面所述,delayms(5)的方法是不可靠的。并且最为要害的时delay指令是毫无含义的,便是让单片机啥也不做,在那里死等。试想一下,单片机还要处理其他作业,光在这儿死等岂不是太糟蹋了吗?就好比人相同我能够在吃饭的一同听音乐,而不是先吃饭,饭吃完了再专门听音乐。单片机也是相同,要的是功率,而不是在那里死等。

那么这种方法欠好,该怎么办呢?要不要延时?延时肯定是需求的,否则显现不均匀,但不是这种方法。正确的方法是守时器守时5ms,5ms到后改写一次数码管,这样一来单片机不会在这儿死等,二来数码管显现时刻肯定均匀。关于守时器,一般的单片机至少有一个,并且它作为单片机的独立模块,底子不影响cpu作业。以3个数码管为例,其程序代码如下

#define DUAN P1 //宏界说段选

#define WEI P0 //宏界说位选

void timer(); //守时器处理函数,用守时器守时5ms

{

if(守时标志方位一)

{

守时标志清零;

If(T_5ms) //若T_5ms大于0,每5ms减1

T_5ms–;

}

}

if(T_5ms==2)

{

WEI=0; //消影 共阳,共阴为 WEI=0xff

DUAN=code[value_duan1];

WEI= value_wei1;

}

if(T_5ms==1)

{

WEI=0;

DUAN=code[value_duan1];

WEI= value_wei2;

}

if(T_5ms==0)

{

T_5ms=3; //计时寄存器从头赋值

WEI=0;

DUAN=code[value1];

WEI=value2;

}

这样CPU不必在这儿死等,每次程序跑到这儿时,只需做个判别就好了,5ms到后就进去点亮数码管,否则就不进去,显现效果肯定均匀。同理,比方键盘扫描程序,延时消抖,都能够选用这种方法,而不必delay。

或许读者或许发现了问题,对,仍是有点问题。假若程序在其他当地消耗时刻大于5ms的话,那么这儿的守时5ms就失去了效果。的确是这样的。实践上关于好程序来说,主循环肯定操控在1ms一下(CPU跑1Mhz,即1条指令1us)。或许你会问,有些模块不或许1ms以内就完结啊。是的,有些时分某些模块的确需求好久才干完结。这就涉及到程序分时分段处理的问题。好比人做作业相同,我这件事今日做不完,但能够明日再做,并且一同今日我也要吃饭、睡觉做其他的作业,而不是说这件事没做完,其他什么也不干了。单片机也是如此。不论在大的程序,都是分时分段处理的,否则CPU会溃散的,CPU不或许一同把一切的都一同处理了,而是这段时刻处理一点,下段时刻再处理一点。这样在总的时刻上是相同的,CPU完结的作业却翻倍了。说道这儿程序主循环操控在1ms肯定不成问题了。在试想一下,在程序里边处处delay是不是很可怕?比方按键,消抖能够delay 10ms,假如是长按键呢?莫非要delay 3s或更长?所以说不论从功用上仍是程序结构上,delay是肯定不可取的。关于delay,几个us(适当于几个nop指令)仍是答应的。

提到这儿,程序分时分段思维现已很理解了。尽管说一个大型项目,包含许多模块,比方按键、AD采样、数码管显现(或lcd显现)、PWM输出、UART、IIC通讯等等,可是并不是说每个模块都在同一时刻完结。比方按键按一下大约几百毫秒的姿态,长按好几秒的姿态,主程序不是一向在这儿等,而是一遍又一遍的循环扫描,当扫描的按键键值改变并且接连在100ms以内没有改变,那么承认此次为短按键按下。每次在扫描键盘时大约消耗几十us,然后接着以相同的方法扫描其他模块。这样主循环把一切的模块都扫一遍顶多也就几百us的姿态。这样说来,一次按键按下事情,程序现已把它分成了大约几百次来完结,即为分时处理。而不是以delay的方法死等这一次事情完结。其他模块都遵从这个道理。

离别delay,主循环while(1)周期做到小于1ms,那么就离别了校园教育然后进入实践使用!为什么校园所教的不是这种思维呢?因为在校园和实践严峻脱节,没有考虑过真实的项目。所学的都是一些独立子程序模块。因为子程序结构简略,程序较小,delay无所谓。而把各个模块都加在一同,或许就会出毛病。实践状况要考虑的还多的很,比方功耗、本钱等等。在校园只管能搞出成果就不错了,哪管这个芯片多少钱,这个电容多少钱?关于真实的项目使用,完成功用只算很小很小的一部分。因为校园所学和实践脱节,所以这也是当今大学生难找作业的原因之一,这也是当今中国教育的缺点!当然成为单片机高手,还有许多路要走,了解这些仅仅一个门槛罢了。

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/ceping/318333.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部