单片机C语言中为何要定义 如: .. void delay() { unsigned char i;for(i=0;i<10;i++) } 与硬件和软件关系

上题没完善在unsigned char i;

你好
这个问题回答透彻比较繁琐,楼上的两位说的都不错,我这样解释,不知你能明白吗。
1.void delay() 是一个子程序的名字,是软件
2.{ for(i=0;i<10;i++) } 是这个子程序的内容,作用 操作硬件的软件,操作的硬件i(名字)。
3. unsigned char i;定义该子程序操作的硬件(内存中的一个寄存器,数值范围0-255),无符号8位变量,想这个你应该知道。
你要是学习过汇编,这个就不难理解,下面给出这个程序的汇编,你对比一下,示例说明,不一定能用,哈哈,好久没玩过汇编,都快忘记了。就是说明c语言与汇编的异同。

equ i 0030H //定义内存地址30(16进制)的寄存器为i,在汇编中,也可不定义,直接对30H进行操作。汇编中数字不带H,为10进制,后缀带H为16进制。
delay: //定义子程序,方便调用,也可为其他名字,如loop1等。
L1:inc i //寄存器i(30H)加一。L1为行号。
cjne i 10 L1 //比较不等则转,这里回到上一行。相等则往下执行。
ret //子程序返回
对于你对楼上两位的追问,c语言就是一个平台(或者说环境),就像一个游戏,你想玩好就必须遵从游戏规则,或者说他就是这样用才行,否则免谈。
再说一下unsigned char i;就是c语言按自身的规定,或随机给你定义一个可操作的51内存变量,不一定是30H,可能是30H-07FFH中的任何一个,想搞明白,的详细研究c了。不过作为c51的应用,会用就行,就行office的办公软件,会用就好,没必要去追究他是怎么运行的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-10-14
我在你刚才那个提问已经回答过了啊:

这个函数是用来进行时钟延时的。
一般做一个硬件操作,需要等待一段时间再取结果的时候使用这个函数。

i和软硬件都没关系,只是一个循环,目的是让cpu循环10次来等待一小段时间。
这个10一般是个经验值,就是说写代码的人凭经验来估算他所采用的cpu(比如51)大致要等这么长时间。
它和cpu运算速度以及编译器编译代码效率都有关系。
在实际操作中这个循环次数还是需要仔细的调试来确定次数的。

看你还是没明白,我给你举个例子吧。
比如你要做一个串口有线鼠标(串口设备),你鼠标加电以后是不是要初始化?是不是要和上位机(比如PC)通讯?
这时候你和上位机是不是要协商串口波特率?
你告诉上位机你的波特率,要等待上位机应答。这时候是不是要delay等一段时间再去获取应答?
如果不等,发出去马上就收,是不是就收不到数据?波特率协商就失败了吧?那你设备还怎么工作呢?

再给你个例子,比如你要对电压做采样,采样频率10/s,那么每秒采集10次。
这时候你怎么处理10/s的采样呢?是不是要写个循环函数去等?是不是要想办法每两次采集之间等100个毫秒?
如果没这个delay,你的采样能准么?程序能正常工作么?
第2个回答  2012-10-14
1.不同的数据类型在单片机里所占的内存多少不一样,比如unsigned char是一个字节,unsigned int是2个字节。这样根据不同的需要可以分配不同的单元 ,可以有效的节省单片机里的有限的内存空间,并符合你的程序里对数据大小的需要。
2.你例子中是子程序里定义的局部变量,在这个子程序执行完退出后,相应的变量被释放,占用的内存空间可以继续使用,也可以节省单片机的内存空间。追问

这个我知道,我就是不明白为什么要去定义 如果不定义 那么该程序软硬件都无法执行

追答

是的,这个是C语言的要求,变量在使用之前必须先定义。

追问

对 我的答案就差一步 为何必须先定义?

追答

没有为什么,只是规定。

追问

你进我的另一个问题 我把分数设在另一个问题上了 我再把分数给你

追答

先采纳这个吧,那个还没找到呢。

本回答被网友采纳
第3个回答  2012-10-14
只看到一个函数定义,即一个spin循环用来等待一段时间。这里没有上下文,不能作出具体解释。追问

如果没关系那么 不去定义该程序是不成立的

追答

我想可能是某些地方引用了这个函数,或者有时序相关的原因,比如某个操作需要在delay之后才能够完成,而这个操作是异步的,所以用这种简单的方式来等待那个操作完成。