打印

单片机多任务时的思想

[复制链接]
楼主: yx331447791
手机看帖
扫描二维码
随时随地手机跟帖
61
mdblsh| | 2010-10-18 13:34 | 只看该作者 回帖奖励 |倒序浏览
有意思

使用特权

评论回复
62
刘前辈| | 2010-10-18 14:44 | 只看该作者
本帖最后由 刘前辈 于 2010-10-18 20:25 编辑

支持59楼highgear帮主的说法;不过老帮主修炼这么多年,还是没有巨人讲的清楚具体。

巨人的书上写得一清二楚,菜鸟学生只用了一天就站到了巨人的肩膀上,实在不用自己苦苦修炼半辈子还概念模糊讲不清楚:
     我们上小学时就知道,电影原理是以每秒24帧影像刷新频率;因此根据人类眼睛的响应特性,50HZ~20HZ(20ms~50ms)的多路LED模块刷新频率可以无闪烁地工作。如果有N个LED模块,则每个LED将被激活1 / N时间,即:

      每个LED应被点亮   T = 1/N ( 20ms ~ 50 ms )

        所以,所谓 5ms 的点亮时间不过是具体指系统中只有4个LED模块需要刷新(N=4)而已。如果系统中超过8个LED模块,5ms点亮时间就要担心闪烁了。——LED个数N越少,显示越亮越稳定;N越多,亮度越暗。如若同样的N数,希望亮度增大,那必然要使点亮时间增大,扫描频率降低,越接近闪烁频率。 所以系统中动态扫描LED个数一般不会太多, 除非使用专用LED扫描模块。(还与LED亮度特性有关,例如选高亮度LED。)

       每个LED点亮时间根据上面公式和显示效果调整:
1、如果LED闪烁,说明延迟(点亮一个LED)时间过长或者扫描频率不够快(低于20HZ);
2、如果亮度很低,是扫描过快(超过50HZ);
3、如果感觉有重影,是中间切换过程没处理好;应该是:先关闭显示,然后送数据,然后再开显示。
4、如果亮度不均匀,是因为每个LED点亮的时间片不一样。

下面是一个实际应用的3个LED动态扫描例子。N=3,得到刷新频率6ms;因此设定时间中断节拍为6ms。

使用特权

评论回复
63
刘前辈| | 2010-10-18 14:51 | 只看该作者
本帖最后由 刘前辈 于 2010-10-18 14:53 编辑

sbit led1=P2^1;        //定义第一只数码管的控制线
sbit led2=P2^0;        //定义第二只数码管的控制线
sbit led3=P2^2;        //定义第三只数码管的控制线
sbit K0=P3^2;
#define dig1 led1=0;led2=1;led3=1;          //只点亮第一只数码管
#define dig2 led1=1;led2=0;led3=1;  //只点亮第二只数码管
#define dig3 led1=1;led2=1;led3=0;  //只点亮第三只数码管
#define show P0//定义P0口为所显示段码的控制
uchar number[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x98};//数码0~9
uchar one;    //个位
uchar ten;    //十位
uchar hundred;//百位
void delay_ms(unsigned int time)   //延时1毫秒程序,n是形式参数
{
        unsigned int i,j;
        for(i=time;i>0;i--)//i不断减1,一直到i>0条件不成立为止
                for(j=112;j>0;j--)//j不断减1,一直到j>0条件不成立为止
                {;}
}
void T0_init(void)
{
        TMOD=0x01;//选择工作方式1
        TL0=0x66;    //每6ms中断一次
        TH0=0xea;
        TF0=0;        //中断标志位清零
        ET0=1;        //允许定时器0中断
        EA=1;        //允许总中断
        TR0=1;        //启动定时器
}
void main(void)
{
        uchar i,j,k;
        T0_init();        //定时器0初始化
        i=0;        //控制个位数码
        j=0;        //控制十位数码
        k=0;        //控制百位数码
        one=number[0];        //上电时三位数码管都显示为000
        ten=number[0];
        hundred=number[0];
        while(1)
        {
                if(K0==0)//判断是否有按键被下
                {
                        delay_ms(20);//延时消抖
                        if(K0==0)//确认有按键被下
                        {
                                while(K0==0);//等待按下松开
                                i++;//个位递增
                                one=number;//显示个位                 
                                if(i==10)//假如个位为10立即向十位进1
                                {
                                        i=0;//个位再从0开始递增
                                        j++;//十位递增
                                        one=number;//显示个位
                                        ten=number[j];  //显示十位
                                        if(j==10)//假如十位为10立即向百位进1
                                         {
                                                j=0;//十位再从0开始递增
                                                ten=number[j];//显示十位
                                                k++;//百位递增
                                                hundred=number[k];  //显示百位
                                                if(k==10)//当计数为999时立即转为000从新开始递增
                                                 {
                                                        i=0;//三位数码管都显示为000
                                                        j=0;
                                                        k=0;
                                                        one=number[0];
                                                        ten=number[0];
                                                        hundred=number[0];
                                                 }
                                        }
                                }
                        }
                }
        }
}


void time_display(void) interrupt 1{
        static uchar show_bit=1;
        TL0=0x66; //定时器赋初始6ms.
        TH0=0xea;
        switch(show_bit)
        {
                case 1:
                {
                        dig1                        //只点亮第一只数码管
                        show=hundred; //百位
                        show_bit=2;//下次进中断程序点亮十位
                        break;
                }
                case 2:
                {
                        dig2                        //只点亮第二只数码管
                        show=ten; //十位
                        show_bit=3;//下次进中断程序点亮百位
                        break;
                }
                case 3:
                {
                        dig3            //只点亮第三只数码管
                        show=one; //个位
                        show_bit=1;//下次进中断程序点亮个位
                        break;
                }
        }
}

使用特权

评论回复
64
yx331447791|  楼主 | 2010-10-19 15:15 | 只看该作者
呵呵,这样看来,是前辈误解了,我说的是一个80*16的一个LED屏点阵,你理解成数码管了。

使用特权

评论回复
65
liuyuxiier| | 2010-10-19 18:03 | 只看该作者
刘前辈?有点意思啊~怎么看都不像54岁的人啊~跟我年纪差不多吧~我刚毕业的~

使用特权

评论回复
66
刘前辈| | 2010-10-19 19:14 | 只看该作者
回65楼:
我写的是我自己的实验板实验程序,还是卖家提供的现成的对应实验板程序,板上只有3个LED,所以按照原理公式取6ms或者7ms.——原理性程序而已。

LED点阵屏,我的概念是市场上有卖现成的,专业公司做的,是智能的嵌入式产品,(以前看朋友用89C51做过,不是很简单)。RS232对外接口,串行送入显示数据、位置、固定、移动……等参数,自动实现。例如公交车上的LED点阵屏。
  朋友本来规划自己成立公司专业做LED点阵显示屏,陪他参加了2次竞标,才知道别人做得比他好多了。——结果2年白干了,除了积累了经验。

   所以LED点阵屏应该是系统中一个RS232智能外设,整个系统是一个单片机主从通信系统。


使用特权

评论回复
67
刘前辈| | 2010-10-19 19:34 | 只看该作者
回66楼liuyu: 详见45楼帖子,我也刚毕业,给刘老板打工而已。
如今工作不好找,公司招一名单片机开发,一下收到十几份简历,还得感激刘老板招收我。否则可能现在还在人才市场晃悠呢。

使用特权

评论回复
68
yx331447791|  楼主 | 2010-10-20 20:04 | 只看该作者
嗯,我还是能看得出来,你的水平还有很大的提高空间的

使用特权

评论回复
69
aihe| | 2010-10-20 20:42 | 只看该作者
回66楼liuyu: 详见45楼帖子,我也刚毕业,给刘老板打工而已。
如今工作不好找,公司招一名单片机开发,一下收到十几份简历,还得感激刘老板招收我。否则可能现在还在人才市场晃悠呢。 ...
刘前辈 发表于 2010-10-19 19:34

现在这么感恩图报的人真是很少了啊

使用特权

评论回复
70
刘前辈| | 2010-10-21 09:28 | 只看该作者
本帖最后由 刘前辈 于 2010-10-21 09:34 编辑

同感,现在的人都是互相算计;像我长辈那样一生没讲过一句假话的人,已经没有了。
那么知道滴水之恩,涌泉相报的人,可能也成稀缺资源了。我在其中。

看我的签名。

使用特权

评论回复
71
machunshui| | 2010-10-21 09:54 | 只看该作者
只能说明现在的教材以及单片机书籍,

实在是不负责任,

充满了:
DELAY(N);//延时N ms

使用特权

评论回复
72
machunshui| | 2010-10-21 09:55 | 只看该作者
单片机软件分时的本质是:

任务拆分,

任务分段处理,

别没事还站着茅坑不拉屎.

仅此而已

使用特权

评论回复
73
machunshui| | 2010-10-21 09:57 | 只看该作者
看着LZ的标题就觉得好笑,

还思想????

这是自发行为,

哪里谈的着思想?

使用特权

评论回复
74
sz_longyue| | 2010-10-21 11:08 | 只看该作者
至于吗,不过是个简单的TMR应用,至于扯到什么系统多任务上去吗,都是让满天的UCOS,LINUX给整的

使用特权

评论回复
75
yx331447791|  楼主 | 2010-10-21 12:38 | 只看该作者
看来UCOS,LINUX害我不浅啊

使用特权

评论回复
76
McuPlayer| | 2010-10-21 12:43 | 只看该作者
忒高瞻远瞩了也不行啊

使用特权

评论回复
77
yx331447791|  楼主 | 2010-10-21 12:57 | 只看该作者
是啊,脚踏实地慢慢来是对的

使用特权

评论回复
78
448738516| | 2013-6-24 11:52 | 只看该作者
c+++ 发表于 2010-10-13 10:33
楼上刘钱贝好像是那个被称作论坛败类的wxj5952的马甲吧? 想单挑人家 highgear, 结果逃之夭夭了, 是你吧? ...

他就是个败类,听他说话就来气

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则