社区导航

 

搜索
楼主: 辛昕

[原创] 郭天翔老师,我只想为你擦去一些C51代码里的小小蒙尘

  [复制链接]

262

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2011-11-16 21:48 | 显示全部楼层

回复34楼 老阮的帖子

忙了一天,刚回来看到你的留言。谢谢!
我说的是一种教材上比较常见的写法。 就是DS1302的读写程序,当然不会是楼主说的那种低级错误。
写一个字节的时候: - - - -- - - -  - - -
                       T_CLK=0;
                     ---- -- -- - - - -
            for(i=8;i>0;i--)
          {       
               T_IO=ACC0;
                            T_CLK=1;
             T_CLK=0;
              ACC>>=1;
        }
此种方法可以。
若换成  for(i=0;i<8;i++)  就不行了, 用的是STC89C52的片子,楼主可以试试。呵呵,  这也是好多年前的程序了,当时调的非常费力,所以这一块儿我记得还是很清楚的!
你可以试一试,说不定会发现更有趣的问题!呵呵

回复

使用道具 举报

214

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2011-11-16 22:20 | 显示全部楼层

回复 41楼 风亦路 的帖子

我试了一下,没有问题啊。。。真的没发现问题。。。
这是什么情况?芯片也是STC89C52

回复

使用道具 举报

262

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2011-11-16 22:58 | 显示全部楼层

回复42楼

呵呵,不知道楼主是不是完全按照那个构架写的子程序?  

这样的程序有很多种写法,写一个字节,比如中间用 if()判断;或者可以直接用bdata定义一个变量,然后在进行位操作。 这样的话那样的话,for怎么写,基本上也都可以的。
其它的就不多说了,有机会大家再研究研究吧! 最终的目的是我们要知道这两种写法的效率是大大不同的,所以产生的效果也会反差很大····

回复

使用道具 举报

48

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-11-16 23:02 | 显示全部楼层
回复34楼 老阮的帖子
忙了一天,刚回来看到你的留言。谢谢!
我说的是一种教材上比较常见的写法。 就是DS1302的读写程序,当然不会是楼主说的那种低级错误。
写一个字节的时候: - - - -- - - - - - -
T_CLK=0;
---- -- -- - - - -
for(i=8;i>0;i--)
{
T_IO=ACC0;
T_CLK=1;
T_CLK=0;
ACC>>=1;
}
此种方法可以。
若换成 for(i=0;i<8;i++) 就不行了, 用的是STC89C52的片子,楼主可以试试。呵呵, 这也是好多年前的程序了,当时调的非常费力,所以这一块儿我记得还是很清楚的!
你可以试一试,说不定会发现更有趣的问题!呵呵
------------------------------------------
我去看了下,其实完全是自己的问题,ACC拿过来用出错了,不是很能理解要把ACC拿过来使用
跟for(...一点关系都没
只不过是用到增量碰到ACC了而已。没啥可以说的,就好比没有保存寄存器就使用汇编函数一样,基本的错误

回复

使用道具 举报

7908

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

 楼主| 发表于 2011-11-17 01:42 | 显示全部楼层
原帖由 老阮 于 2011-11-16 12:33 发表
楼主的这个问题好啊。我用keil来查看了一下,得出了结果。汇编还是得好好学。编译器还是得好好了解啊。谢谢!
    11:         for(i=8; i>0; i--);
C:0x0095    751608   MOV      i(0x16),#time(0x08)
C:0x009 ...


我之所以,这个问题我也没想明白。
意思就是说,这种问题,想是想不懂的。只有看,才能看得懂。

所有的秘密都在 汇编里。

汇编不欺吾。

版块里,前不久,有个很邪门的 中断误入程序。

最后我就是在 反汇编 里找出答案的。

八年一梦,洗尽铅华,重头再来


回复

使用道具 举报

7908

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

 楼主| 发表于 2011-11-17 01:44 | 显示全部楼层

回复 40楼 lrz123 的帖子

前阵子,我犯了一个很脑残的问题。

镭影 让我去看 C专家编程。
这书网上很容易找到中文版。
你有时间去下载来,就在目录里, 它专门提到了一个章节论述了这个问题。

你可以看看去。

八年一梦,洗尽铅华,重头再来


回复

使用道具 举报

7908

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

 楼主| 发表于 2011-11-17 01:46 | 显示全部楼层

回复 39楼 biansf2001 的帖子

说句不客气,我不用学就懂51了——靠的就是 大二打下的一点 数字电路 基础。

这些玩意我早就想明白了。

我写这些,从头到尾 只有一个考虑;

对于懂C的人,我这个帖子通篇是废话。
可是你去看看多少 入门靠视频教程学51的人,有多少是真正懂,就是这些基础的C的人.......

[ 本帖最后由 辛昕 于 2011-11-17 01:57 编辑 ]

八年一梦,洗尽铅华,重头再来


回复

使用道具 举报

7908

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

 楼主| 发表于 2011-11-17 01:48 | 显示全部楼层

回复 39楼 biansf2001 的帖子

谭浩强的书我没看过,不过,听过不少人喷他。

前阵子查证 运算符 的优先级 时,看了一下目录,内容也是乱的可以。

看了 运算符 那一部分的 章节,有好些模糊的内容都没有怎么说明。

八年一梦,洗尽铅华,重头再来


回复

使用道具 举报

7908

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

 楼主| 发表于 2011-11-17 01:50 | 显示全部楼层

回复 41楼 风亦路 的帖子

我这里说明一下

我说的这两个for,运行上一点问题都没有,效果没有差别。

唯一的区别在于 实际运行的 效率, 老阮 的 帖子在第四页,你们可以看看去。

前边有个哥们说,以前他试过这样写不行,那样写却可以,我也有点奇怪,不过原因可能是他的那个东西时序要求严格,碰巧,这点效率给影响上了。

八年一梦,洗尽铅华,重头再来


回复

使用道具 举报

7908

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

 楼主| 发表于 2011-11-17 01:55 | 显示全部楼层

回复 42楼 老阮 的帖子

STC的片子,我用过2051和5A60S2.

关于这一点,了解得不深,只有一个体验:

就是同一家STC,不同系列的片子它的指令似乎也不完全一致,我说的是指令的执行时间。

因为我毕业的时候,做一个DS18B20的程序。
STC和真正标准的AT系列指令时间长度不一致也就算了,我后来在2051上,用STC官方提供的DS18B20例程调通了。

后来帮隔壁宿舍一个哥们,做他的毕业设计,是超声波测距,同样需要DS18B20测温度来进行温度补偿,就试过,换上他买的STC89C51,结果又测不到了。

当然了,你会想到,STC12C2051是12T模式的片子,STC89C51是1T模式的片子。
我脑残地用一个12T模式下的例程去跑1T模式的片子,不跑出问题才怪。

可是,换一个角度想一个问题:
STC自己一家的片子都分什么1T,12T,6T模式,这样的玩意,玩起来谁心里不犯嘀咕?

八年一梦,洗尽铅华,重头再来


回复

使用道具 举报

7908

TA的帖子

54

TA的资源

裸片初长成(中级)

Rank: 11Rank: 11Rank: 11Rank: 11

荣誉会员勋章

 楼主| 发表于 2011-11-17 01:57 | 显示全部楼层

回复 43楼 风亦路 的帖子

使用位变量。。。。。。
这个真没试过。

唔,其实这个东西我自己也没有看过 反汇编 代码。
当时提问的人随后就说出了答案。

所以我也没留神。

八年一梦,洗尽铅华,重头再来


回复

使用道具 举报

213

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-11-17 09:21 | 显示全部楼层

回复 楼主 辛昕 的帖子

感觉楼主的口水话太多,看了一点点就不想看下去了!
个人觉得C语言是一门灵活的艺术,解决问题与实现问题的方法有很多种,编程风格也是因人而异!当然,规则是必不可少的,养成一种良好的编程风格也不是一天两天能练成的,需要长期抗战!

回复

使用道具 举报

59

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2011-11-17 10:20 | 显示全部楼层

回复 41楼 风亦路 的帖子

啊~~我也遇到同样的问题过,当时还在这里提问来的,不过没多久就找到答案了
因为用for(i=0;i<8;i++)的时候,给I赋0值,在汇编里并不是直接mov r7(r7=i),0x00这样的,而是先clr a,然后mov r7 a,所以把之前存在a里的数据清除了,就不行,这个我也是看汇编发现的问题。不知道是不是只要是赋0值都是这样。

回复

使用道具 举报

98

TA的帖子

3

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-11-17 10:27 | 显示全部楼层


楼主经典!!

关于#define 和typedef我也纠结了好久好久。。。。

回复

使用道具 举报

415

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2011-11-17 10:29 | 显示全部楼层
还没搞懂为何用#define不行,我知道它和typedef的区别,但很多时候是常用#define,哪位跟我解析下
zhouyuannian#126.com(#换成@)有问题交流

回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2011-11-17 10:41 | 显示全部楼层
学习了,自己也要注意了!!

回复

使用道具 举报

40

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-11-17 11:40 | 显示全部楼层
杜洋口碑不是很好

回复

使用道具 举报

33

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2011-11-17 14:52 | 显示全部楼层
这个必须要顶,良好的编程习惯一定要有! 记得我初学单片机编程的时候看的都是些学校里的原版书,《C: The Complete Reference》是本不错的参考书。可能我不太喜欢速成吧~~~成天看着英文的书和官方的PDF。

回复

使用道具 举报

1698

TA的帖子

0

TA的资源

裸片初长成(高级)

Rank: 12Rank: 12Rank: 12

发表于 2011-11-17 15:41 | 显示全部楼层
郭天祥也好,杜洋也好,平凡也罢,人家只是希望帮助到更多的人,本没有恶意的,相信他们也花了不少的精力,也没有从中获利,即使出一两套开发板,也没要求我们一定掏腰包购买,我们如果有更好的见解,完全可以另外再出本书,出一部视频教程,整一个超好的PDF,以便帮助到比他们帮助到的更多的人。

回复

使用道具 举报

1698

TA的帖子

0

TA的资源

裸片初长成(高级)

Rank: 12Rank: 12Rank: 12

发表于 2011-11-17 15:42 | 显示全部楼层
自古以来言多必失

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

关闭

站长推荐上一条 1/8 下一条

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-5-28 07:07 , Processed in 0.567620 second(s), 38 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表