打印

菜鸟又遇到难题了,C51小程序再来求教

[复制链接]
4344|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
辉扬的心|  楼主 | 2009-5-7 23:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
单片机P0口低4位接4个led灯,为"0"时LED灯亮,为"1"时LED熄灭,P1口P1^0接一按钮开关接地,要求:一上电P0^0闪烁,其他不亮,再按一次时,P0^1闪烁,其他不亮,再按一次时,P0^2闪烁,其他不亮,再按一次时,P0^3闪烁,其他不亮,再按一次时,P1^0闪烁,其他不亮。。。。
依次下去,我的程序如下:
#include <reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit P00=P0^0;
sbit P10=P1^0;
void main()
{
    uchar c,i,a;
    i=0;        
P0=0xff;
P10=1;
while(1)      
{    
    switch(i)
    {
    case 0:
         {
         P0=0xfe;
    for(a=0;a<201;a++)
    for(c=0;c<101;c++);
    P0=0xff;
    for(a=0;a<201;a++)
    for(c=0;c<101;c++);
    }break;
    case 1:
         { 
          P0=0xfd;
    for(a=0;a<201;a++)
         for(c=0;c<101;c++);
    P0=0xff;
    for(a=0;a<201;a++)
    for(c=0;c<101;c++);
    }break;
    case 2:
         {
          P0=0xfb;
    for(a=0;a<201;a++)
    for(c=0;c<101;c++);
         P0=0xff;
    for(a=0;a<201;a++)
    for(c=0;c<101;c++);
    }break;
    case 3:
         {
          P0=0xf7;
    for(a=0;a<201;a++)
    for(c=0;c<101;c++);
    P0=0xff;
    for(a=0;a<201;a++)
    for(c=0;c<101;c++);
    }break;
                     
    }
    if(P10==0)
    {
      for(a=0;a<101;a++)
      for(c=0;c<51;c++);
      if(P10==0)
      {
    while(P10==0);
    i++;
    if(i==4)
    {
    i=0;
         }
              
         }
}
}
}


虽然功能大体上实现了,但有个问题,不知道叫不叫传说中的bug,各位高手请看:由于前面的闪烁延时比较长,近40ms,后面还有个延时去抖动5ms,人按键的速度有快有慢,当按键时间小于45ms时,很可能按键信息就丢失了,自己捉摸了好一会,感觉这个是程序的架构问题,(在一个死循环周期里,先闪烁再扫描开关)有没有高人指点一二呀?解决这个问题,谢谢

坐到板凳等 ^_^

相关帖子

沙发
mcufan001| | 2009-5-8 10:59 | 只看该作者

要学会用定时器中断

使用特权

评论回复
板凳
2shift| | 2009-5-8 11:46 | 只看该作者

用定时器

使用特权

评论回复
地板
gszzjf| | 2009-5-8 14:13 | 只看该作者

s

一上电P0^0闪烁 如果你一直不按键的话是不是p0口就一直亮着 这能叫闪烁吗

使用特权

评论回复
5
辉扬的心|  楼主 | 2009-5-8 16:02 | 只看该作者

re

 呵呵
谢谢1,2楼。有眉目了:用死循环点灯,用定时器中断来扫描按键,这样问题就解决了,我再去消化消化。

to3楼,上电后i初值为0,所以进入死循环后一直执行case 0,就一直闪烁了撒,呵呵

使用特权

评论回复
6
刘前辈| | 2009-5-8 20:28 | 只看该作者

唉 .......

众多书上都有的东西,看一天什么都清楚了。自己琢磨?至少一星期。看2天就知道操作系统怎么做的了,自己琢磨?至少2年。

学习就是学书,学了近二十年都是在学书不是?

使用特权

评论回复
7
辉扬的心|  楼主 | 2009-5-8 21:09 | 只看该作者

re LS

知识这个东西,有时候要看书,书上都有,一看就懂,但有的时候书上没有的东西就要靠捉摸研究与人讨论请教不是??书是死的,人的思维却是活的,肯定会偶尔跳出书的框框架架,这时需要指引,不然那还要老师干什么??老师也教了我们十几年不是??呵呵~所谓自己捉摸,当然不是光抠脑壳,是尽自己的能力,看书,上网......解决不了的才来请教的,谢谢你的帮助,上个贴子的问题也是你帮忙解决的,呵呵

努力向高手们靠近,加油!
嘎嘎~

使用特权

评论回复
8
highgear| | 2009-5-8 21:30 | 只看该作者

6楼的号称老头的“前辈“ 实在是 ....

从书中找一个完全正确的程序并不难,或许若干小时就完成了。自己琢磨?至少一星期, 但这两者的意义却完全不同。单片机是一门实践性很强的技术,绝大多数的东西无法从书中获得,需要从实践中琢磨,研究和积累,特别是对于一些没有技术感觉的初学者。只有从过往的错误中不断摸索总结,才会明白书中的道理,才能不断的提高,5楼就是好例子。

顶辉扬的心, 鼓励你的自己动脑,自己琢磨。



使用特权

评论回复
9
刘前辈| | 2009-5-9 13:12 | 只看该作者

顶7楼,有问题先找书。

一个人的青春岁月没有几年。
如果自己遇到一个别人早就解决过、并总结到书本中的问题,自己不知道,却不先查找图书资料,而以为是自己最先发现、马上进入独立思考、研究创新的话,最后好不容易解决了,并总结成论文准备投稿,结果没想到10年前出版的《51单片机C语言常用模块设计实例与应用》早就总结过了。

这当然对大多数人来说并没有什么。主要是时间和生命过去了。

8楼说的没错,书本上学不到电烙铁动手能力。


一般人没有8楼那种天分。highgear总不能在成为巨人之后再来教我们菜鸟吧。

咱们菜鸟现在当前只好借助已有的巨人的肩膀解决问题。

8楼highgear好像自称是21IC顶级高手。不妨现在就拿出个自己裸奔的模块来给LZ调用试试?也给咱菜鸟露一手。

咱只会抄抄书,把书上的例子抄一段供LZ参考。至少咱比顶级高手快呀。

8楼总不见得说:“LZ自己回家独立思考去。”?

LZ是来请教您的。就技术说事,有东西拿出来帮人解决问题。别总说空话吹牛教菜鸟向您顶级高手学习。

大家像书学习。像先进技术学习。

使用特权

评论回复
10
初入江湖| | 2009-5-9 13:38 | 只看该作者

用定时器

用定时器所有的问题就解决了

使用特权

评论回复
11
bjc125| | 2009-5-9 14:30 | 只看该作者

呵呵 有道理

使用特权

评论回复
12
highgear| | 2009-5-9 21:22 | 只看该作者

9楼真不愧是 wxj1952 一伙的

都是一样唧唧歪歪,逻辑混乱。还自称“老头子“,“前辈“,呵呵。

“有问题先找书“,我相信辉扬的心肯定找过书,对于一个茫然的初学者,如果书中能找到答案,还会上论坛问?辉扬的心的程序很粗糙,但是自己做的程序,没有抄袭,这一点非常难能可贵,这样的有上进心的人应该鼓励他们继续摸索,而不是简单的一句:自己看书,书上都有;也不应该简单的提供一个源程序,让他们练练输入。

何况,书中有没有解决具体实践问题的答案,你这个老头子菜鸟不会不知道吧?

你现在还是菜鸟一点都不出奇。

使用特权

评论回复
13
刘前辈| | 2009-5-9 21:57 | 只看该作者

把LZ的题目修改一下。

书上的例题是这么出的,一个LED接在P1^2,两个按钮开关接在P1^3、P1^4。

LED以某一频率闪烁,按下P1^3一定时间(例如500ms)后,LED闪烁频率开始减慢,随着按下时间越长,闪烁频率越慢。(可以定下限,原理性实验而已。)

反之对应,按下P1^4,LED闪烁时间加快,按下时间越长,闪烁频率越快。

释放开关,频率固定停在当前值闪烁。

这才是编程思维挑战。厌恶那些只会说大话、假话的“顶级高手”。
“这还不容易,太简单了。咱根本不用看书......。”
“真笨,连这都不会写。自己回家好好想想。”
“21IC也太没人了,这么简单的要求还要我出手?.....”

大话说了半天,一条程序都没看见。最后没声了,隔10天半个月,又像什么都没发生过一样,又冒出来充高手了。“这有什么难啦......”

使用特权

评论回复
14
刘前辈| | 2009-5-9 22:28 | 只看该作者

highgear放心。我正在抄书,一定会给LZ一个满意的答案。你呢

LZ上21IC就是向你这样“顶级高手”求助的,你让他“回去自己练手、鼓励他继续自己摸索,有助长进”?
“自封高手”不懂就说不懂,别给你自己找台阶啦。还扯什么1952?,这都哪到哪的事?与本题目没关系的事情不要扯。转移注意力?

俺已经受过一次LZ的感谢啦。因为俺没说大话,而是给了LZ一个修正程序。解决了LZ没想通的问题(尽管简单)。不知那2天highgear为何没出手?(问题太简单,高手不屑出手?)既然当时不屑,那么事后又来发表议论不太好吧。这种行为...?

再承让highgear 一次机会,14楼把LZ的问题概念归纳了。看看highgear能否帮到LZ一次。

盼望21IC的“顶级高手——highgear”写出一个漂亮的程序。也让咱们菜鸟开开眼,“真正的程序应该是这样的。....”

使用特权

评论回复
15
aihe| | 2009-5-9 22:38 | 只看该作者

大仗马上又要开始了

使用特权

评论回复
16
highgear| | 2009-5-9 23:32 | 只看该作者

真不愧是 wxj1952, 冷漠 一伙的

http://www.21icbbs.com/club/bbs/list.asp?boardid=11&page=10&t=3303925&tp=%u8BF7%u6559%u5708%u5708%u3001xwj%u5927%u4FA0

难道指针,强制,联合书上没有么?你为什么不看书呢?“众多书上都有的东西,看一天什么都清楚了“,在你的问题里,有人这么说了么?这才几天,一个“老头“菜鸟就对一个初学者说去“学书“,呵呵,滑稽呀滑稽。

想开眼,以后慢慢后让你开眼的。你认为的“编程思维挑战“,对这里的多数人都是小儿科,听说过“小马过河“的故事吗?


相关链接:http://www.21icbbs.com/club/bbs/list.asp?boardid=11&page=10&t=3303925&tp=%u8BF7%u6559%u5708%u5708%u3001xwj%u5927%u4FA0

使用特权

评论回复
17
刘前辈| | 2009-5-10 22:06 | 只看该作者

回7楼,书上的题目一样。程序是这样写的。

   如今没有书上没有的东西。所谓老师,不过是比我们多学、多看了几本书而已。LZ的意思好像老师的学问都是他自己的?.....我们老师讲课有一点好,他在讲任何内容之前,先讲这段知识的历史来源,和那些载入史册的研究发明人的名字、留下的什么专著。以表明他讲的内容都是鼻祖多少年前留下来的,不是他自己研究的。“跳出书的框框架架”?老师的指引,其实是前人的指引,前人写的书的指引。

    咱论坛上有极个别顶级高手习惯说“我认为....什么什么框架比较好。我主张独创.....”好像这世界上除了他就没有学者了似的。
   其实国外早就有人研究一辈子了,为什么这样不好,如何解决等等,理论实践程序,专著都写了几大本。我们自己平时看的少罢了。高手才想了几小时,一本书没看过,一条程序没写出来论证过。“你以后会看到的.....”以后都是等别人写出来了,高手跳出来装明白人,摇头晃脑评论一番。
    顶级高手从来都是后发制人啊.....


言归正传。且看LZ的要求,书上是怎么写的。如链接:
程序执行后,单个按键按下时,状态执行阻塞1秒(Sw_blocked_G = 5;可以设置)。 Sw_blocked_G 秒钟内,无论按键状态任何变化,(抖动或抬起)程序都不响应。 Sw_blocked_G 秒钟之后,如若按键仍不抬起,则进入第二状态。这像生活中电子表的操作方式:单次按键,状态进数;持续按键,状态连续改变——0,1,2,3,0,1,2,3,0....。(这一段程序中没有,因为是LZ的专题要求,先保留源程序不变。)


相关链接:https://bbs.21ic.com/upfiles/img/20095/20095102222728.rar

使用特权

评论回复
18
wang271415728| | 2009-5-10 22:30 | 只看该作者

这样该该试下

while(1)前面定义
for(i=0;i<4;i++)

使用特权

评论回复
19
inter_zhou| | 2009-5-10 22:43 | 只看该作者

为highgear报不平

首先声明本人不认识highgear ,更谈不上是其追随者。
此前一直潜水看过highgear 的几个贴,虽然也认为其想法有些偏激,但在这个贴的发言本是诚心指导学弟们的,为什么刘“前辈”百般挑衅

6楼: 唉 ....... 

众多书上都有的东西,看一天什么都清楚了。自己琢磨?至少一星期。看2天就知道操作系统怎么做的了,自己琢磨?至少2年。

学习就是学书,学了近二十年都是在学书不是?
看2天就知道操作系统怎么做的了,自己琢磨?至少2年。
真是夜郎自大,我确实资质比较差,也许你是天才。如果就看两天书就知道操作系统是怎么做的了,那我敢肯定你是只知其皮毛。有可能看2天就知道做的东西自己琢磨需要两年吗?
本来写程序就应该鼓励原创,为什么要到处去抄袭书上的呢?
此等思想必是误人子弟!!!
 

使用特权

评论回复
20
辉扬的心|  楼主 | 2009-5-10 23:05 | 只看该作者

谢谢大家热心的帮助

谢谢highgear和刘前辈以及各位热心的网友,呵呵

问题解决了,谢谢大家.要和睦相处,都少说几句,谢谢.

使用特权

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

本版积分规则

24

主题

312

帖子

0

粉丝