矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
查看: 276|回复: 9

请高手看看这个C51程序

[复制链接]
     
发表于 昨天 11:29 来自手机 | 显示全部楼层 |阅读模式
#include<intrins.h>
#include<reg51.h>

void Delay(unsigned char a)
{
unsigned char i;
while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}

void main(void)
{
unsigned char b, i;
while(1)
{
b = 0xfe;
for(i = 0; i < 8; i++)
{
    P1 = _crol_(b, 1);
              b = P1;
    Delay(250);
}
}
}

while( --a != 0) 这句是a自减1,不等于0吗?但a并没有赋值呀。

while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}
请问以上这段程序的执行过程是什么?

Delay(250)这句括号里的250是调用250次延时函数的意思吗?我见有的延时函数括号里没有数字。
     
发表于 昨天 11:46 | 显示全部楼层
这个延迟看晶振或者内部晶振的
回复 支持 反对

使用道具 举报

     
发表于 昨天 11:59 | 显示全部楼层
a是调用的时候赋值的
回复 支持 反对

使用道具 举报

     
发表于 昨天 12:05 | 显示全部楼层
1、a是形式参数,值是函数调用的时候带进来的。

2、delay这个函数的用途就是让cpu空跑一会。具体这一会是多少,要看cpu跑的速度和步数。
速度和晶振的频率相关。
步数和a以及i相关,是a*i



回复 支持 反对

使用道具 举报

发表于 昨天 12:24 来自手机 | 显示全部楼层
太牛B,用疯狂耗电发热来消磨时间。如果a进来是0,得跑断腿,如果a进来是1,一个判断就出去了。就没有nop指令吗?
回复 支持 反对

使用道具 举报

     
发表于 昨天 14:55 来自手机 | 显示全部楼层
本帖最后由 分立元件 于 2025-5-7 14:56 编辑

建议楼主不懂就提问AI,对学习C语言很有帮助,AI回答:这段代码 `while( --a != 0 )` 的作用是:**在每次循环开始前将变量 `a` 的值减 1,并检查新值是否不等于 0**。如果条件成立(即 `a` 减 1 后不为 0),则执行循环体;否则退出循环。  ### 详细解释: 1. **前缀自减运算符 `--a`**      先对 `a` 执行 `a = a - 1`,再返回减后的值。例如,若 `a` 初始为 5,则 `--a` 会先将 `a` 变为 4,再返回 4。  2. **循环条件判断**      每次循环前,先将 `a` 减 1,然后判断新值是否不等于 0。若条件为真(`a ≠ 0`),执行循环体;否则退出循环。  3. **循环次数与初始值的关系**      - 若 `a` 初始值为正整数 **`n`**(如 `n = 5`),循环会执行 **`n-1` 次**(如 `5 → 4 → 3 → 2 → 1`,共 4 次)。      - 若 `a` 初始值为 **1**,`--a` 变为 0,条件不满足,循环体不执行。      - 若 `a ≤ 0`,`--a` 会持续递减(如 `0 → -1 → -2 → ...`),导致 **无限循环**(除非循环体内修改 `a` 的值)。  ### 示例分析: - **初始 `a = 3`**     ```plaintext   循环前:a=3 → --a → a=2(条件 2≠0 → 执行)   循环前:a=2 → --a → a=1(条件 1≠0 → 执行)   循环前:a=1 → --a → a=0(条件 0≠0 → 不执行,退出)   ```   循环体执行 **2 次**。  - **初始 `a = 0` 或负数**     `--a` 会无限递减(如 `0 → -1 → -2 → ...`),导致 **无限循环**。  ### 总结: - **用途**:通常用于从 `a-1` 次迭代到 1 的场景(如遍历数组的特定区间)。   - **注意**:需确保初始 `a > 0`,否则可能陷入死循环。若需包含 `a = 0`,建议用 `while(a-- != 0)`(后缀自减)。
回复 支持 反对

使用道具 举报

     
发表于 昨天 15:24 | 显示全部楼层
楼主不是不懂 C51,而是对 C 语言一窍不通。另外,楼主对英语也是一窍不通,否则也不会问一个名叫 Delay 的函数是干啥用的。

建议先从 C 语言最基本的入门知识学起,另外要善于运用网络资源,毕竟在线词典、翻译、乃至 AI 都可以帮你的。

补充内容 (2025-5-7 19:19):
后面楼主已经说了 Delay 是用于延迟的,是俺刚才匆忙回帖,看的不仔细,抱歉!
回复 支持 反对

使用道具 举报

     
发表于 昨天 16:38 | 显示全部楼层
后面的程序已经告诉你了,a=250。
回复 支持 反对

使用道具 举报

     
发表于 昨天 19:57 | 显示全部楼层

while( --a != 0) 这句是a自减1,不等于0吗?但a并没有赋值呀。

这句话的意思是a先自减,然后再判断A值是否不等于零。
若a不等于零,执行循环体内的语句。
若a等于零,则退出循环。

代码前面先定义了函数“Delay(unsigned char a)”,其中函数名“Delay”是延时的意思,“a”是此函数的参数,是个变量,调用函数时要为其幅值。“unsigned char a”的意思是定义变量a的数据类型为无符号整数。

后面的主程序里调用了Delay()函数, Delay(250)的意思是将250这个值赋给变量a,然后执行函数体内的语句。



while( --a != 0)
{
for(i = 0; i < 125; i++);
}
}
请问以上这段程序的执行过程是什么?


while是循环,循环条件是变量a不等于0,变量a的值是调用Delay()函数时传入的。
for(i = 0; i < 125; i++); 这句也是循环,跳出循环的条件是i < 125。每次循环i都自加1,循环125次后i等于125,此时不再小于125,跳出循环。

整个代码段是大循环里套着小循环,执行一次大循环就执行125次小循环。您这变量a传进来的值是250,意思是执行249次大循环,每执行一次大循环就执行125次小循环。这样每次调用Delay(250)函数,程序就在此往复循环了三万多次,期间什么都不做,就干耗时间,即所谓延时。




C语言入门并不难,现在有了AI,AI最擅长的就是干这个,哪里有不懂的就扔给AI,让它给您解释。
就比如您这代码,扔给AI让他详细给出注释,返回救过如下,比在论坛上询问简单省事、清晰明了:


#include<intrins.h>      // 引入Keil C51移位函数库[6,7,8](@ref)
#include<reg51.h>       // 引入51单片机寄存器定义头文件[9,10](@ref)

void Delay(unsigned char a) // 自定义延时函数,参数a控制延时倍数[1,3](@ref)
{
    unsigned char i;         // 定义内层循环计数器
    while( --a != 0)         // 外层循环:参数a递减至0时退出[4](@ref)
    {
        for(i = 0; i < 125; i++);  // 内层空循环,约125μs@12MHz晶振[1,3](@ref)
    }
}

void main(void)
{
    unsigned char b, i;      // 定义LED模式变量和循环计数器
    while(1)                 // 主程序无限循环[6,7](@ref)
    {
        b = 0xfe;            // 初始化LED模式:0xfe=11111110B(第1个LED亮)[6,10](@ref)
        for(i = 0; i < 8; i++)  // 循环8次实现8位流水灯效果[6](@ref)
        {
            P1 = _crol_(b, 1);    // 循环左移1位,更新LED显示模式[6,7,8](@ref)
            b = P1;                   // 将当前端口状态赋值回b变量[6](@ref)
            Delay(250);            // 延时约250×125μs=31.25ms[1,3](@ref)
        }
    }
}
回复 支持 反对

使用道具 举报

     
 楼主| 发表于 昨天 20:05 来自手机 | 显示全部楼层
bg1trk 发表于 2025-5-7 19:57
“while( --a != 0) 这句是a自减1,不等于0吗?但a并没有赋值呀。”

这句话的意思是a先自减,然后再判 ...

谢谢,以后就试试AI吧。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2025-5-8 02:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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