66686|220

7815

帖子

56

TA的资源

裸片初长成(中级)

楼主
 

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

 
在我接触的学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, 下载次数: 2771)
[ 本帖最后由 小小白 于 2011-11-15 09:10 编辑 ]
此帖出自51单片机论坛

最新回复

mark   详情 回复 发表于 2020-5-23 11:29

点评

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

赞赏

3

查看全部赞赏

点赞 关注(15)
个人签名

强者为尊,弱者,死无葬身之地

 

回复
举报

7815

帖子

56

TA的资源

裸片初长成(中级)

推荐
 

回复 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语言,那么,一切无关紧要。
此帖出自51单片机论坛

点评

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

赞赏

1

查看全部赞赏

 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

55

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
谢谢楼主的提醒,在此也谢写郭天祥老师的视频,是看他的视频入门的。
此帖出自51单片机论坛
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(中级)

推荐
 

回复 楼主 辛昕 的帖子

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

回复

40

帖子

0

TA的资源

一粒金砂(中级)

推荐
 
这帖子会火的样子,还好我从一开始就没沾染这些习惯。只是大学时学了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。
此帖出自51单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

535

帖子

0

TA的资源

五彩晶圆(初级)

推荐
 

回复 12楼 辛昕 的帖子

我把你之前的帖子整理好了,要不要把这个加上去啊
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

沙发
 

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所指的对象。
此帖出自51单片机论坛

点评

天哪,我用这么久才知道,我一直沿用郭天祥老师的写法,直到现在看了楼主你这篇帖子才知道。世界观都塌了。。。。。  详情 回复 发表于 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
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

板凳
 

2 全局变量

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

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

我们来看一段程序

#include
uchar wei1,wei2;

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

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

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

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

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

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

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

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

点评

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

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

4
 

命名

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

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

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

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

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

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

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

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

点评

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

强者为尊,弱者,死无葬身之地

 
 

回复

116

帖子

0

TA的资源

一粒金砂(高级)

5
 
顶一下,说得很好,看到#define使我想起了我也是用这种方法写了半年的C的,后来看了一些C语言的书才慢慢改正了许多不良习惯,最最推荐的就是《C语言深度剖析》
此帖出自51单片机论坛

点评

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

回复

1469

帖子

0

TA的资源

五彩晶圆(中级)

6
 
嘿嘿,关于全局变量和局部变量,基础的C语言教程里就有介绍的,这个还搞不清楚就太不应该了
此帖出自51单片机论坛
 
 
 

回复

116

帖子

0

TA的资源

一粒金砂(高级)

7
 
我感觉#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浪费了多少资源。如此该选择哪种写法便一目了然吧
此帖出自51单片机论坛

点评

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

回复

192

帖子

0

TA的资源

纯净的硅(初级)

8
 
我看的就是郭天祥的,学了好多他的编程习惯,好像天狼星的也是这样的,斑竹有没有好的视频,让我们改改毛病!!!
杜洋的很好?
编程习惯要看那些书??
此帖出自51单片机论坛
 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(初级)

9
 
确实有些问题,lz有心了。
此帖出自51单片机论坛
 
 
 

回复

803

帖子

0

TA的资源

一粒金砂(高级)

10
 
别的不说了,该贴要火。
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

11
 

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

嘿嘿,由于我习惯了每个变量分行定义,并且初始化,我还真没想过这种问题,也没遇上,长见识了,谢谢分享。
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

12
 

回复 8楼 51学习者 的帖子

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

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

点评

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

强者为尊,弱者,死无葬身之地

 
 

回复

4005

帖子

0

TA的资源

版主

13
 
代码的书写质量往往被人忽视,这一点也体现出了没有专业精神.
此帖出自51单片机论坛
 
 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

15
 

回复 14楼 小小白 的帖子

你有时间就整理啊,没时间就放着先呗。
话说,那个是不是少了个四的下啊?
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

7815

帖子

56

TA的资源

裸片初长成(中级)

16
 

回复 12楼 辛昕 的帖子

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

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

以下是链接
http://www.doyoung.net/program.html
此帖出自51单片机论坛
 
个人签名

强者为尊,弱者,死无葬身之地

 
 

回复

192

帖子

0

TA的资源

纯净的硅(初级)

19
 

回复 12楼 辛昕 的帖子

谢了斑竹
像你这样51没咋深入学习,你直接看完51学习的什么??是不是51现在过时了??
我有时间看看杜洋
此帖出自51单片机论坛
 
 
 

回复

140

帖子

0

TA的资源

一粒金砂(高级)

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

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

强烈支持楼主,别再让后来人误入歧途了!
此帖出自51单片机论坛

点评

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

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/3 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表