社区导航

 

搜索
查看: 53874|回复: 220

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

  [复制链接]

7913

TA的帖子

54

TA的资源

裸片初长成(中级)

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

荣誉会员勋章

发表于 2011-11-14 20:37 | 显示全部楼层 |阅读模式
在我接触的学51的人里,不少人是通过看视频教程入门的,而这其中为数不少的又是看的 郭天翔 的教程。

郭天翔的大名早就耳闻。
在我大三刚刚开始自学51的时候,我在网上看各种51相关的帖子,资料。
关于前景,关于现状,关于学习方法和所需条件等等。

有天晚上,我在网上看到一个郭天翔写的自述学习51单片机的帖子。帖子写了他如何接触51,并在实验室里写了好些时日的汇编程序的经历。
和我们不同,他当时并不知道可以用C写51,所以他用汇编写了不少可以想象比较大的程序,自然也就有了对51更深的理解。
而他的经历和故事,也给了我很大鼓舞。大概其他看过他故事的人是否如此吧。

这些年,网上流传的51教程,最著名的,我知道的 除了 郭天翔,就是杜洋,还有救火车——我前不久在版主群里无意遇到他,才知道他原来曾经也是我们论坛的某个版块的版主。
三个人里,杜洋可能是最有特色的,因为他强调创意,网上的教程相当多,但他可能是唯一一个想到用面包板,乃至芯片卡座构造一个51开发板,下载线的人。
至于救火车,尽管我后来跟他在QQ上遇到,但其实我没看过他的教程。

因为我大三有开这门课,虽然讲的都是很基础,同时那时候我还在学校,图书馆里,这一类的书我基本都翻遍了,说句难听点的就是——是驴是马,都没少见。

但是,因为我见过不少写的很是“恶劣”的代码,我问过几次谁教你这么写的,他声称,我是看 郭天翔 的教程的。
我当时就很奇怪,因为郭天翔停留在我心里的印象是一个高手。
后来我就看了一下郭天翔的视频。
不得不说,那些人果然没说错,因为郭天翔的确就是这么写的。

只能说,郭天翔的汇编是相当了得,但他的C51却实在不怎样,甚至可以说,有很多地方足以看出,他连基本的C语法,概念都不甚清楚。

我曾经在看完郭天翔的十天视频教程里的几个例程以后,在一个群里说到这事,结果马上被反诘,那你说该怎么写(我当时的确费了不少唇舌,说了几个很明显的点)
在这里我想说的是。
我之所以发这个帖子,无意卖弄——我说的东西其实都很基础。
更没有贬损 郭天翔 的意思。前边说了,从某种程度上来说,他是我的入门老师之一。我之所以硬着头皮写这个帖子,主要是两点考虑:
1 太多的人是看郭天翔的教程入的门,入门第一步真的很重要,最初的编程习惯都来自于此。
2 我希望,我能够为郭天翔老师擦拭掉他教程里的一点蒙尘。
这些问题,其中不少是一种概念上的不清晰造成,偏偏最恐怖的是,运行起来基本没有问题——调试过程序的人都会明白,这种潜藏的BUG才是最恐怖的——而我想,也正因为如此,郭天翔才没有发现这些问题。不然以他的能力和韧性,老早就解决了,不至于让我在此饶舌。
这类问题最明显的也是我最早发觉不对劲的 “#define uchar unsigned char”问题

我在百度上搜了好一会,没搜到什么可以下载的文字版的例程整理,只有一个百度文库,可惜我没分,这里给一个链接,没有例程的朋友们可以参考着看,我将从下一个帖子开始分析几个我认为不太妥当的地方,如有不对,敬请指出。

郭天祥十天学会51单片机教程.rar (8.86 MB, 下载次数: 2745) [ 本帖最后由 小小白 于 2011-11-15 09:10 编辑 ]
此帖出自51单片机论坛

点评

推荐几个不错的c语言书。:lol :)  详情 回复 发表于 2013-9-2 13:04

评分

3

查看全部评分

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


回复

使用道具 举报

7913

TA的帖子

54

TA的资源

裸片初长成(中级)

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

荣誉会员勋章

 楼主| 发表于 2011-11-15 22:32 | 显示全部楼层

回复 25楼 小小白 的帖子

我赞同 51 是所有单片机/嵌入式,甚至是计算机(我说的是X86系统)的基础。

因为我自己未曾真正学过任何 计算机基础课程,但是,在我学51前后,两次看 这类的书籍,感觉完全不一样。
51的基础让我基本理解了一些非常基础的诸如 取指译码 等概念,尽管只是概念,但是却让我看懂了曾经的天书。

但与此同时,我自己上班,不好说是 机遇 还是 倒霉,总之,ARM LINUX,所有这些我曾经回避的东西,是躲一个来一个.......

这个过程是相当痛苦的事情。

所以我形成另一种观点:
如果你要学ARM,那你就学吧,不要想着什么,先51,再AVR,再ARM......没用。
真正学的进去的人,你让他直接ARM,他也能学出来。
而学不进去的人,你让他把所有单片机都学一遍,估计也费劲。

因为道理是相通的,既然是相通的,那么,直接走和绕着走区别不大。
为啥我说 学不进去的人 学再多也白搭——我不是鄙视人更没有骂人的意思,只是我见过这样的人不在少数,在他看来,写程序就是找例程,修改参数,他甚至连这个程序是怎么一个结构都没看出来。
当然了不是他没看,是他看了也没看懂,你能想象一个连 带参宏都不懂的人能看懂什么?
要是让他遇上几个条件编译 和 内联函数,估计他就傻了。

我是对51比较熟悉,但是,这对我玩ARM有帮助么?
不能说没有,但至少没有直接帮助。
ARM和51压根是两回事。

而那些真正有帮助的东西,都是“独立于平台”的。
比如C语言。在嵌入式单片机的世界里,C一直是万国通用语言语言,它的应用范围超乎你的想象,惊喜着我,让我觉得我以它为终生语言的选择,无怨无悔。

我可以负责的告诉你们一个我的观点:
C51首先是C语言。
我在学51以前,花了几个月,先学了一遍标准的C语言语法。

后来我玩LINUX时,看过很多所谓的LINUX C,其实这本身就是外行人才说得出来的话。
因为天下没有LINUX C这个说法,天下只有一个C语言,当然你非要说C51,C430增加了几个新的关键字,就说它不是,那我也没办法。
更别说,LINUX本身就是在C的基础上构造出来的一个超级C程序。

所以,你要问我,要想吃这口饭,混这行当,要学什么?
那首先把C学好,别的都多余。
什么平台也罢,除去一些基本的底层设置,在写程序这个层面上,除了C,别无他物。
会51?会什么什么芯片.......也许有一天你上班遇到的是一个你压根听都没听说过的芯片,但是不要紧,只要你看到熟悉的C代码,然后你本身懂C语言,那么,一切无关紧要。

点评

太对了  详情 回复 发表于 2015-7-2 09:36

评分

1

查看全部评分

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


回复

使用道具 举报

63

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2014-3-4 14:41 | 显示全部楼层
谢谢楼主的提醒,在此也谢写郭天祥老师的视频,是看他的视频入门的。

回复

使用道具 举报

77

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

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

回复 楼主 辛昕 的帖子

郭天祥不过是给所有学单片机的朋友提供了一个窗口。有的人仅仅是大概学学,有的则是精通的学,对于后者而言我相信大多数人都有独立思考问题和解决问题的能力,有自己的见解,不会全部的接受,对于前者而言有没有那么些问题也无所谓。再说,郭天祥的视频少说也有4,5年的历史了,存在不足也很正常。楼主不能以现在的单片机水平去衡量过去。

回复

使用道具 举报

48

TA的帖子

0

TA的资源

一粒金砂(中级)

Rank: 2

发表于 2011-11-15 15:11 | 显示全部楼层
这帖子会火的样子,还好我从一开始就没沾染这些习惯。只是大学时学了51系列,工作以后直接上ARM平台,程序工整了很多。因此也不认识杜洋或者郭天翔之类的。
我对uchar的写法很是陌生,抑或是鄙视的看法。毕竟C程序要有易读性。
推荐一个写法:
typedef unsigned char INT8U(或者uint8);前缀uch_Xx;
typedef unsigned int INT16U(或者uint16);前缀uin_Xx

typedef unsigned long        INT32U; 前缀ul_Xx
typedef signed char         INT8S;前缀sch_Xx;
typedef signed short        INT16S;...
typedef signed long         INT32S;...
typedef float                        FP32;...
typedef double                         FP64;...
结构体的前缀:st_Xxx...
另外楼主也别太在意,毕竟写惯汇编的人,对于大工程概念不是很强。对于前缀没太多谨慎,这些人事后去看自己代码,些许都忘了为啥那么做了。
优良的程序=良好的架构+程序书写+代码注释+文档。
可能有人说算法,很多时候为了理解方便,只能折中,就是所谓的tradeoff。

评分

1

查看全部评分


回复

使用道具 举报

575

TA的帖子

0

TA的资源

五彩晶圆(初级)

Rank: 7Rank: 7Rank: 7

发表于 2011-11-15 11:26 | 显示全部楼层

回复 12楼 辛昕 的帖子

我把你之前的帖子整理好了,要不要把这个加上去啊

回复

使用道具 举报

7913

TA的帖子

54

TA的资源

裸片初长成(中级)

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

荣誉会员勋章

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

1 #define uchar unsigned char

这句话是什么意思呢?
这是一个宏定义。
其意思就是,用“unsigned char”替代源程序 所有出现的“uchar”。

这句代码,是的,它是能用的,不会出错,目前也不会引发任何不对劲的问题。
但是,它却是错误的。错在概念上的错误。

C代码是允许为基本数据类型取一个更简单的别名,或者说,更正式的说法是“重定义”数据类型——定义一个数据类型并不是一个简单的事情,它不仅涉及定义其数据存储格式,还涉及对其的运算和操作。
所谓 重定义,其实并不是 重新定义一个新的数据类型,而是为原有的数据类型取一个别名。

它就是typedef。
这句话正确的写法应该是
typedef uchar unsigned char

是的,它们在效果上是一样的,而且,也没有什么错误——就这个场合而言,我想了想,好像还真没想出它能怎么个错法。
但是,至少我是抱着这样一种观点:不会出错,不代表它就是对的。

概念上的明晰和准确地书写,是程序稳健的重要保证,谁也不能保证,这句话哪天不会引发什么要命的问题。

关于这个typedef,也就是为基本数据类型取一个别名,我想最后再说一点,因为我只知道那么多。

也许我们这样写,是为了写代码时,烧写几个字母,但这却绝对不是 typedef 的本意,至少不是它存在的唯一理由。

它至少有以下几个作用:
1 我们在一些程序里,或者库的头文件里,经常看到这样的写法:
uint8 uint16......
我们很容易猜测到它们其实对应于我们理解的unsigned char 和 unsigned short int。
这样写的目的是因为在不同机器字长的机器上,几种最基本的数据类型其数据长度并非是固定不变的,这样就会带来一些麻烦。所以,经过这样一次重定义,我们就非常明确,这个数据类型究竟是多少位的数据。不容易出错,程序的可移植性也好。

2 typedef更多的时候其实是用在结构体的重定义。这种时候,也许真的最重要就在于减少经常写一个struct,但它仍然不是最重要的。
最重要的是,我们可以使这个结构体拥有一个与其功能,性质密切相关的数据类型名,便于阅读代码。

3 有时候,我们还经常利用typedef的方法来隐藏真实的数据类型,比如说,我们可以隐藏起一个指针,隐藏有的时候也可以说是 使其透明化。
使用的人并不需要关心其内部究竟是如何实现的,他只需要了解他的调用规则和作用。

这个问题,就说这么多吧,有机会我确切了解一下究竟这两个效果一样的东西,到底有没有什么实质上的差别。
简单搜了一下百度。
这个问题,最重要的一点是,要搞清楚这两句话到底都执行了一个什么过程,一个只是简单的宏替换,而另一个却是“重定义”了数据类型,它是一个助记符,犹如一个关键字一般。
举一个百度知道里的例子来说明 两者混用可能引发的问题中的一种:
typedef int * pint ;
#define PINT int *

那么:
const pint p ;//p不可更改,但p指向的内容可更改
const PINT p ;//p可更改,但是p指向的内容不可更改。

当然了,你也许会想再弄一个#define pINT *int
那就当我啥都没说过好了。
pint是一种指针类型 const pint p 就是把指针给锁住了 p不可更改
而const PINT p 是const int * p 锁的是指针p所指的对象。

点评

天哪,我用这么久才知道,我一直沿用郭天祥老师的写法,直到现在看了楼主你这篇帖子才知道。世界观都塌了。。。。。  详情 回复 发表于 2016-8-30 15:27
楼主真的很用心,你说的我现在都习惯用他那个,以后的改改了!  详情 回复 发表于 2014-3-26 23:16
我也尝试了一下,效果是一样的,但typedef更像是给特定类型取一个小名,有更好的移植性,最近也一直在纠结 这两句有什么区别,另外typedef在定义结构体上有更好的优势,可以定义指针,数据处理更为方便  详情 回复 发表于 2013-10-10 18:45
好像是typedef unsigned char uchar ; 我试了一下。  详情 回复 发表于 2013-10-7 21:19
typedef unsigned char uint8; //!< Unsigned 8 bit integer typedef 与#define用法不一样吧,而且哥们typedef的用法似乎是写错了吧  详情 回复 发表于 2013-3-28 17:44

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


回复

使用道具 举报

7913

TA的帖子

54

TA的资源

裸片初长成(中级)

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

荣誉会员勋章

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

2 全局变量

我不知道我这样猜测对不对。
在大家看到这个帖子的标题时,是不是会有一些人在想,嗯?全局变量,什么东西?

是的,至少从我看到的代码和追问之下的反应来看,也许有不少人是根本不知道 变量原来还有分 全局变量和局部变量,那就更不指望他们还会知道,变量还分 静态变量 ,甚至还有可以定义在寄存器里的 寄存器变量(当然这个东西我也从没用过。)

我们来看一段程序

#include
uchar wei1,wei2;

main (void)
{
。。。。
wei1 = 0;
wei2 = 1;
。。。。。
}

这样的程序,也许你会很熟悉的,是的,郭天翔的很多例程就是这样写的。
在这里,wei1 wei2都是全局变量,但很多时候这并不是必须的。

关于全局变量和局部变量,一句话就能说明白:
我们在函数体里定义的变量叫局部变量,它一旦运行到离开这个程序就不复存在,反之,在整个源文件乃至项目文件都有效的变量叫做 全局变量。
全局和局部,说的是 变量的作用域。
至于静态和自动变量,说的是函数的生存期。(这两者的区别是,静态变量离开了函数以后,尽管它不再可见——就是说不能访问,但是一旦回到那个函数,它还存在,因为OS系统并没有销毁它。反过来说,这也暗示我们,全局和静态,有一个相似点,它们都是占用了固定的存储空间。)

在51程序里,有一种我们平时在PC上写程序的人比较少见到的一种特殊程序,就是中断服务程序。
因为它规定了不准带形参,不能有返回值,所以,如果存在需要它和外部函数进行通信交换的数据,那么,全局变量成了唯一的可能。
但是,全局变量的滥用绝对不是一个好事。所以,原则之一就是,全局变量能少用则尽量少用,有时候,让我选择,我情愿选择用 静态变量都不使用全局变量。

一个最简单的理由就是:
如果大量使用全局变量——郭天翔基本上全用的全局变量,一个局部变量都没用,而很多是根本不必要的。
大量使用,就会造成多个函数对同一个变量进行操作,在程序简单的情况下,你当然不会遇到一种很危险的情形,那就是在同一时间,有几处同时操作该变量,这种时候,你会发生很多误判误操作,造成错误结果,乃至程序崩溃。

另一点,使用了全局变量,意味着你的子函数依赖全局变量,由此带来了高耦合性和低内聚性,这将使你的子函数非常不通用。
并且为后期的维护带来不必要的麻烦。

3 还有最后一个问题:
使用全局变量和静态变量,这意味着OS需要为你的程序分配出固定的存储单元。
有兴趣你可以去看一下OS是如何为程序分配存储空间的。由于我并不是十分确切我所了解的内容。所以这里不说。
但有一点很容易理解的就是。
不管分配在什么位置,这固定的存储空间就不如自动生成和自动撤销的栈来得灵活,当大量使用的时候,会造成大量的内存空间的浪费,使用效率很低。

而对于我们的51单片机这类系统资源本来就敏感的系统,那更是一个要命的问题。

点评

呵呵 可能站的位置不同看到的东西不一样吧,毕竟郭天翔他要考虑的不是已经会C或玩单片机有段时间的人怎么看他的程序,他要考虑的是怎么能让初学者看懂他的程序,不是他程序写的糟,只是他想写的让初学者看的明白,  详情 回复 发表于 2014-1-22 10:18

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


回复

使用道具 举报

7913

TA的帖子

54

TA的资源

裸片初长成(中级)

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

荣誉会员勋章

 楼主| 发表于 2011-11-14 21:29 | 显示全部楼层

命名

不得不说,郭天翔的程序里的变量名是一塌糊涂。
数码管程序里经常看到什么wei1,我都要脑子转半天才猜到这可能是 公共端的名字。
虽然我们都是中国人,虽然我的英语也比较糟糕,但是,程序毕竟是用英文的语言实现的,而且有的单词真的很简单,下次我们还是少点写什么
ge shi bai qian吧,因为这东西,我看得懂是没问题,可是,换了另一个人可就不好说了。

说到命名,有个很著名的匈牙利命名法,说实话,我对此并不了解,刚才看了看百度,发现其实我并不喜欢这种命名法,这种命名法写出来的变量名,其实挺纠结,你要说它简短吧,其实他经常要将近十个字母,你说它复杂吧,嘿,它偏偏还是使用了缩写来着。

所以说,命名法很多时候来自于个人的习惯,但这不代表我们可以肆无忌惮写什么a,a1,aa一类的变量,这会给程序的可读性带来大大的折扣性。

这方面,说说我自己,我现在起变量名的习惯大多数是把变量的意义,用一到三个单词描述完毕,每个单词首字母大写。

这个习惯是在我有一阵子做STM32,看它的固件库时学来的。

所以说,可能的话,我们要多读一些优秀的代码,学习别人更好的变成习惯——当然,更重要的是学会其更好的代码和思维方式。

编程规范这种东西,它并不是 行不行的问题,它是好不好的问题。

但凡写过一点程序的人,本身也没少看程序,看程序其实是一件比自己写还烦还难的事情。
试想,要是遇到一个通篇a b c aa b1这样的程序,你还会有心情往下看吗?
心情归心情,程序不是自己写的,要猜懂别人的意图,很多时候我们根本不用看代码,只看函数名就猜到其功能,只看变量名就知道它为何操作,为何而在。
但是,如果我看到*a = 34;
a = b + 0x30;
我觉得我是很难猜到它到底在干嘛?(在把数字转换成ASCII码?)

点评

楼主说的确实对的,,,我看了下郭天祥的程序,,那个#define uchar unsigned char 确实把我忽悠进去了,刚开始我还记得C语言里明明是用typedef写的,,而没有用define写过。。。。还有那个变量名我也觉得他的命名非  详情 回复 发表于 2013-7-26 09:47

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


回复

使用道具 举报

119

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2011-11-14 21:51 | 显示全部楼层
顶一下,说得很好,看到#define使我想起了我也是用这种方法写了半年的C的,后来看了一些C语言的书才慢慢改正了许多不良习惯,最最推荐的就是《C语言深度剖析》

点评

C语言深度解剖(第2版)解开程序员面试笔试的秘密  详情 回复 发表于 2015-11-10 16:41

回复

使用道具 举报

1572

TA的帖子

0

TA的资源

五彩晶圆(中级)

Rank: 8Rank: 8

发表于 2011-11-14 22:06 | 显示全部楼层
嘿嘿,关于全局变量和局部变量,基础的C语言教程里就有介绍的,这个还搞不清楚就太不应该了

回复

使用道具 举报

119

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2011-11-14 22:09 | 显示全部楼层
我感觉#define和typedef中需要补充这点,我曾经就经常这样写,还理所当然的认为自己这是对的。例如:#define uint8  unsigned char        uint8 i,j;和typedef unsigned char uint8;     uint8 i,j;这2种的区别在哪儿?            其实第一种define写法使得i为unsigned char ,但j却为编译器默认的类型,keil为auto int但typedef却使得i和j均为unsigned char。我以前define后使用逗号运算符定义多个变量就理所当然的认为自己定义的全是unsigned char,后来知道了这原因不然可以定义为char的全变成int浪费了多少资源。如此该选择哪种写法便一目了然吧

点评

我在uVision 4中做了实验,好像您的说法是错的。 通过define方法声明的变量不论是在占用的空间上,还是存储的值的范围上,都跟typedef没有区别。 实验程序如下 #include #define uchar unsigned char voi  详情 回复 发表于 2012-7-19 14:43

回复

使用道具 举报

216

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2011-11-14 22:37 | 显示全部楼层
我看的就是郭天祥的,学了好多他的编程习惯,好像天狼星的也是这样的,斑竹有没有好的视频,让我们改改毛病!!!
杜洋的很好?
编程习惯要看那些书??

回复

使用道具 举报

4

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2011-11-14 23:15 | 显示全部楼层
确实有些问题,lz有心了。

回复

使用道具 举报

880

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2011-11-14 23:41 | 显示全部楼层
别的不说了,该贴要火。

回复

使用道具 举报

7913

TA的帖子

54

TA的资源

裸片初长成(中级)

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

荣誉会员勋章

 楼主| 发表于 2011-11-15 09:12 | 显示全部楼层

回复 7楼 巭孬嫑夯昆 的帖子

嘿嘿,由于我习惯了每个变量分行定义,并且初始化,我还真没想过这种问题,也没遇上,长见识了,谢谢分享。

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


回复

使用道具 举报

7913

TA的帖子

54

TA的资源

裸片初长成(中级)

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

荣誉会员勋章

 楼主| 发表于 2011-11-15 09:14 | 显示全部楼层

回复 8楼 51学习者 的帖子

对于杜洋,我只是很欣赏他的创意和新的做法。
他的程序我没怎么看。
但据我看过他的其他一些方面的内容,比如他曾在 无线电 上花了不少心血写了一个 各类封装和封装的发展历史,我倾向于认为这样一个人,在这些方面应该会处理的很好。

至于我自己,我没太多时间,而且其实51我也没怎么玩的深入,所以,除了写过一个比较简明的教程,没弄过什么视频教程。

点评

楼主,您好,关于你说的杜洋“各类封装和封装的发展历史”,能帮忙给我一下link吗?学习一下。谢谢!  详情 回复 发表于 2013-3-27 21:30

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


回复

使用道具 举报

3601

TA的帖子

0

TA的资源

版主

Rank: 6Rank: 6

发表于 2011-11-15 09:27 | 显示全部楼层
代码的书写质量往往被人忽视,这一点也体现出了没有专业精神.

回复

使用道具 举报

7913

TA的帖子

54

TA的资源

裸片初长成(中级)

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

荣誉会员勋章

 楼主| 发表于 2011-11-15 13:07 | 显示全部楼层

回复 14楼 小小白 的帖子

你有时间就整理啊,没时间就放着先呗。
话说,那个是不是少了个四的下啊?

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


回复

使用道具 举报

7913

TA的帖子

54

TA的资源

裸片初长成(中级)

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

荣誉会员勋章

 楼主| 发表于 2011-11-15 13:10 | 显示全部楼层

回复 12楼 辛昕 的帖子

刚才随意打开以前去过的 杜洋工作室
内容比以前多了不少。

我特意看了一下 编程 那一页。
事实证明,杜洋自己本人似乎不喜欢用uchar这一类东西,他情愿写 unsigned char(其实我自己也是这样,typedef我都用的很少。)
另外要说的是, 杜洋的程序相当规范,非常值得学习。

以下是链接
http://www.doyoung.net/program.html

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


回复

使用道具 举报

216

TA的帖子

0

TA的资源

纯净的硅(初级)

Rank: 4

发表于 2011-11-15 15:54 | 显示全部楼层

回复 12楼 辛昕 的帖子

谢了斑竹
像你这样51没咋深入学习,你直接看完51学习的什么??是不是51现在过时了??
我有时间看看杜洋

回复

使用道具 举报

143

TA的帖子

0

TA的资源

一粒金砂(高级)

Rank: 3Rank: 3

发表于 2011-11-15 16:34 | 显示全部楼层
跟楼主有强烈同感!
郭天祥确实是个人物,当初打算重新拾起单片机时在网上首先找到的就是《十天学会单片机》,然后就开始从网上了解郭天祥,他的创业经历令人鼓舞,处于好奇下载了《十天学会单片机》的教程,这一看不要紧,对他的敬拜荡然无存。
教程的质量就不说了,看看他那几个程序,就是在忽悠么,简直就是误导!!!什么dula,wela,*屁!程序就没见有几处规范,照这样的学不得越学越傻啊,快进看完两个视频后直接delete!
之后只要看到有关郭天祥的程序什么的就不再问津。

#define uchar unsigned char
这个我也是被误导了一直在用,就在前不久才发现这是个严重的错误,这样做存在隐患,还好只是初学还没用到工程上。
可以搜一下“define typedef const的区别”

强烈支持楼主,别再让后来人误入歧途了!

点评

“别再让后来人误入歧途了!” 呵呵 于振南的ZNFAT了不起吧,可用是哈工大的,很多初学者只知道郭天翔不知道于振南,于振南的程序可移植性很强(可你看得懂吗),郭天翔的则更容易理解,不管你怎么看,反正我是这  详情 回复 发表于 2014-1-22 10:29

回复

使用道具 举报

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

关闭

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

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

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

GMT+8, 2020-6-1 10:49 , Processed in 0.630308 second(s), 44 queries , Gzip On, MemCache On.

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