小会会的C51编程小技俩
jrcsh2013/05/28软件综合 IP:广东
[table=974px][tr][td]


if(aaa==1)
{
for(aaa=0;aaa<50;aaa++)
{
delaymma(50);
P1=~P1;
}
for(aaa=0;aaa<30;aaa++)
{
delaymma(100);
P1=~P1;
}
for(aaa=0;aaa<20;aaa++)
{
delaymma(500);
P1=~P1;
}
aaa=1;
}//aaa=1


aaa 原本是一个 标记  在进入后又利用aaa 来当临时变量, 用完后在还原 原来的值


//=============================================================








if(aaa==3)
{
delay2(bbb);
P1=~P1;
}
现在我想在加个数码管显示上去就~~~显示效果就相当糟糕了(不用定时器)

if(aaa==3)
{
delay2(bbb);
ccc++;
if(ccc==100)
{
P1=~P1;
ccc=0;
}

于是我把这个延时 砍成 100份(延时部分数值也同样改小了) 让主程序来其它程序不用等这么久 (其实引入状态标记会更好不用延时。。但我刚好在写这个小程序~~~实在烦得起框架)











//========================================================================



















//=========================================================================================


这次是结果复用 , 省下了2次运算的时间

原代码

ppp=1000000/(65535-eee);
aaa=(65535-eee)%256;
bbb=(65535-eee)/256;


小花样后
aaa=65535-eee
ppp=1000000/aaa;
bbb=aaa/256;
aaa=aaa%256;[table=974px][tr]数码管利用状态标记+程序流程上的占用代替,亮度保护保持时间,提升运行效率.

#include<reg52.h>
#define uchar unsigned char
#define uint  unsigned int
sbit w1=P2^4;
sbit w2=P2^5;
sbit w3=P2^6;
sbit w4=P2^7;
unsigned int bbb,aaa,smg,ccc;
uchar code table[]={0x28,0xeb,0x32,0xa2,0xe1,0xa4,0x24,0xea,0x20,0xa0,0xff};
void delay()
{
   for(bbb=0;bbb<250;bbb++)
  {
;
}
}
void smg_xs()
{
smg++;
if(smg==5)
{
smg=1;
}
if(smg==1)
{
w2=w3=w4=1;
P0=table[aaa%10];
w1=0;
}
if(smg==2)
{
w1=w3=w4=1;
P0=table[aaa/10%10];
w2=0;
}
if(smg==3)
{
w1=w2=w4=1;
P0=table[aaa/100%10];
w3=0;
}
if(smg==4)
{
w1=w2=w3=1;
P0=table[aaa/1000%10];
w4=0;
}
}
void main()
{
smg=0;
aaa=1234;
ccc=0;
while(1)
{
smg_xs();
delay();
delay();//#%%%¥#%¥@%@¥#%#@
ccc++;
if(ccc>30)
{
ccc=0;
aaa++;
}
if(aaa>9999)
{
aaa=0;
}
}
}


//===================================================================

状态标记,    多路PWM[td]



void Timer0Interrupt(void) interrupt 1
{
    TL0 = 0x9C;        //设置定时初值
    TH0 = 0xFF;        //设置定时初值
    TR0 = 1;        //定时器0开始计时
   pwm++;
  
}


if(pwm>1000)
{
pwm=0;
len=0;
ren=0;
}




if(lpwm>pwm)//  L =======
{
len=1;
}
else
{
len=0;
}








if(rpwm>pwm)  //  R =======
{
ren=1;
}
else
{
ren=0;
}
}




if(pwm<3)
{
len=0;
ren=0;
} //强制死区


//=======================================================================
来自:计算机科学 / 软件综合
15
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
小龙
11年8个月前 IP:未同步
530454
学习了“!!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
我说要有光
11年8个月前 IP:未同步
530467
记得以前看到一篇推广状态机的文章里说不应该在程序里用delay。。。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
ehco
11年8个月前 IP:未同步
530470
回 2楼(我说要有光) 的帖子
是的,状态机架构的写法完全不用delay,靠时间片计数来实现延时,这样不会占用掉CPU资源。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
robbie
11年8个月前 IP:未同步
530711
完全没看懂。。。表示只会RGSS语言[s:275]
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
snomom
11年8个月前 IP:未同步
532886
[s:274]他明我不明.
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
炮八平五
11年8个月前 IP:未同步
534407
状态架构只是一种程序设计技巧,事实上,在编程的时候,或多或少都会用到状态架构,只是这个架构是否真的系统化而已!
在编程的过程中,往往针对一个复杂的需求会使用较多的设计手法来简化解决方案!
以我个人经验看来,设计技巧好不好,就得看解决问题的效率与质量来评定!
假设DELAY前面是状态A,后面是状态B
如果说,一个程序打死不用delay的设计,而是用系统时钟来计时,然后来触发,
那么假设原本程序中有大量使用DELAY的设计,若用状态架构,会怎么样?试想一下?
又如果,程序中只用了一个DELAY,那么用状态架构,又会怎么样?
(此处删除几千字...)当然,我认为要让单片机更好的利用状态架构来优化速度
和设计,是可行的,只是需要精心设计一个架构系统,用于承载和规范设计!
这样才能在解决方案的设计效率和重用率以及质量有明显体现!
那么这样一搞,就会有不少人不愿意了,因为单片机毕竟不是电脑,很多人可能也写不上1000行代码!
然后呢,更关键的是,我前面说到的,打死不用DELAY,就算你设计好了状态架构系统来承载!
但由于局限在打死不用DELAY,那么在一定程度上就增加了这个架构的设计负担!这个架构的本质
改变了!
OK,说那么多,其实很简单,这个状态架构的设计思维从一开始就不是用来节省DELAY的!
两者的关系就类似 面向对象编程 与 函数式编程 关系了!
表达能力较差,可能用词不理想,水平有限,纯属交流经验,无任何攻击意思!
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
11年8个月前 IP:未同步
534425
回 6楼(qq363606096) 的帖子
还有一些情况,节省代码空间, 这个对MCU小程序空间是很重要的直接关系到成本,  提升系统执行器的有校利用,  延时就是无用功,不得不作, 效率引伸出来的问题还是成本, 更高的效率,可节省在频率上的投入, 这点在ARM的表现的更明显, 25M 与50M  的差价,可以让老板宁愿给更多的开发代码费用, 一般也就500台机就收回这个额外投入,而500台机后这个额外投入变成额外盈利,这就是成本竞争。自己的成本能降得下来,别人的降不下来。(还有更极端的ARM用汇编),
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
flion
11年8个月前 IP:未同步
534431
写数码管建议将扫描程序放到定时器中断中去,这样扫描片的时间精确可控,否则容易出现闪烁的现象,特别是数码管位数比较多的时候。而且,你的单片机不光是用来扫描数码管的吧?还得做其他事情才对啊,如果在主程序中扫描的话,稍微加几句代码就能让你的扫描片时间变掉。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
flion
11年8个月前 IP:未同步
534432
delay还是很有用的一个东西。比如我就遇到过在STM8平台上 使用STVD平台编译出来的程序出错了,好几个else if,编译出来的程序从第二个else if里运行着运行着 就进入了第四个else if里面去了,不管如何调整编译器的设置都没用,后来就在出错的后面加了delay(1),问题解决。
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
炮八平五
11年8个月前 IP:未同步
534443
回 7楼(jrcsh) 的帖子
其实我也不是很懂单片机,谈及应用或者说商业层面,还真不敢发话了!
再说,我其实不喜欢谈理论的,我比较关注实在的,只是忍不住YY几句,让人见笑了!
另外我有一个很疑惑的问题:
我曾经看过一篇谈及状态架构的文章,里面也示例了一些单片机状态架构的代码,
其中就涉及到按钮的防抖处理,其防抖处理部分依然使用DELAY设计!
那么如果不使用DELAY,有没有更直观而且高效的解决方案呢?
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
11年8个月前 IP:未同步
534446
回 10楼(qq363606096) 的帖子
那么如果不使用DELAY,有没有更直观而且高效的解决方案呢?

如果按下;

等到不为按下; //(可能受到抖动干扰)

运行代码;  //变相延时

完;         // 不算太完美的处理方法,可能会发生,重复运行
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
jrcsh作者
11年8个月前 IP:未同步
534450
回 9楼(flion) 的帖子
  这个问题不在程序本身
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
炮八平五
11年8个月前 IP:未同步
534454
回 11楼(jrcsh) 的帖子
去年6月做了一个大约3万行代码的项目,难度又较大,但由于时间关系,没规划架构
我基本上把核心都写在一个类中了!
然后使用了大量的状态记录,和定时器,加动态事件通知,这样乱七八糟地堆起来了!
结果,半年后,我不得不重写! 我以前做过这个项目的简单版,也是时间紧迫,用类似方法实现得又超顺利,维护难度一般般!
按这样的规律,初步认为,状态架构比较适合逻辑不强的底层处理,而且独立性要较强!
然后高起来,就是面向过程了-面向对象! 最后又回到读写状态的状态! 无言...
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
炮八平五
11年8个月前 IP:未同步
534488
回 11楼(jrcsh) 的帖子
if(按钮!=按下) return;
if((LCD==存在)&&(LCD状态=休眠)){
点亮LCD背光;
将LCD从休眠状态唤醒;
反复检查LCD是否忙,忙则继续检查}else{
喘口气;//如果喘不过气就...
}
if(按钮==按下)  OnRunKeyDOWNEve(AKey);
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
flion
11年7个月前 IP:未同步
539300
回 10楼(qq363606096) 的帖子
按键的防抖可以不用delay
每1ms扫描一次按键状态,如果是按下,count++
十次之后,如果count>7
可以认定按键已经按下,7和10这个数字是经验值,你可以根据你实际的项目来做具体的调整
引用
评论
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
上级专业
同级专业
jrcsh
学者 笔友
文章
491
回复
6730
学术分
4
2009/01/02注册,7年0个月前活动

.

主体类型:个人
所属领域:无
认证方式:邮箱
IP归属地:未同步
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}