普中开源电子分享网

 找回密码
 立即注册
搜索
查看: 4675|回复: 9

led闪烁实验为什么延迟函数用u8不行

[复制链接]

1

主题

1

帖子

3

积分

新手上路

Rank: 1

积分
3
发表于 2020-1-10 01:03:22 | 显示全部楼层 |阅读模式
1金钱
代码如下,因为50000并没有超出unsigned char的数字范围,所以我就用u8作为参数了,编译没报错,但是debug时没进入delay函数,下载到开发板,led等常亮不闪烁,求大佬解答。

#include "reg52.h"
#include <stdio.h>

typedef unsigned char u8;
typedef unsigned int u16;
sbit led = P2 ^ 0;
void delay(u8 n){
        while(n--)
                ;
}

void main(){
        u8 num = 50000;
        while(1){
                led = 0;

                delay(num);
                led = 1;
                delay(num);
        }

}

我知道答案 本帖寻求最佳答案回答被采纳后将获得系统奖励10 金钱 , 目前已有8人回答

回复

使用道具 举报

20

主题

1344

帖子

8372

积分

论坛元老

Rank: 8Rank: 8

积分
8372
发表于 2020-1-10 08:40:22 | 显示全部楼层
理解错了吧。
unsigned char类型变量为8位,最大255
unsigned int 类型变量为16位,最大65535
回复

使用道具 举报

4

主题

6

帖子

26

积分

新手上路

Rank: 1

积分
26
发表于 2020-1-10 11:35:39 | 显示全部楼层
HC6800-ES-V2.0 发表于 2020-1-10 08:40
理解错了吧。
unsigned char类型变量为8位,最大255
unsigned int 类型变量为16位,最大65535

typedef unsigned char u8;
typedef unsigned int u16;
为什么要写两个  就用一个不可以吗  例如 只用typedef unsigned char u8;或者只用
typedef unsigned int u16;     请大佬回答 谢谢
回复

使用道具 举报

20

主题

1344

帖子

8372

积分

论坛元老

Rank: 8Rank: 8

积分
8372
发表于 2020-1-10 15:25:02 | 显示全部楼层
本帖最后由 HC6800-ES-V2.0 于 2020-1-10 15:27 编辑
张国清 发表于 2020-1-10 11:35
typedef unsigned char u8;
typedef unsigned int u16;
为什么要写两个  就用一个不可以吗  例如 只用 ...

这是很多人的习惯:先写在那里,如果用到就不会有问题,如果没用到,也不会有问题。最最常用的两个变量类型。如果只写8位的,万一要用16位的再去添?只写16位的,万一都是8位的那不就浪费了,既浪费软件,也浪费硬件
回复

使用道具 举报

2

主题

6

帖子

43

积分

新手上路

Rank: 1

积分
43
发表于 2020-2-1 00:09:49 | 显示全部楼层
HC6800-ES-V2.0 发表于 2020-1-10 08:40
理解错了吧。
unsigned char类型变量为8位,最大255
unsigned int 类型变量为16位,最大65535

大哥大哥!我想问一下,那个  while(n--);存在的意义是什么,或者说它出现在程序里的作用是什么?换成  while(n++);   行不行?
回复

使用道具 举报

20

主题

1344

帖子

8372

积分

论坛元老

Rank: 8Rank: 8

积分
8372
发表于 2020-2-1 10:23:14 | 显示全部楼层
田子文 发表于 2020-2-1 00:09
大哥大哥!我想问一下,那个  while(n--);存在的意义是什么,或者说它出现在程序里的作用是什么?换成   ...

你没看到函数名:delay??
这是个延时函数,就是拖时间的,所以,这个while就是空运行,拖时间的。循环次数(也就是拖的时间),就是由n决定的,当n减到零时,循环结束,时间也就拖够了。可能你还不知道为什么“拖时间”,可以学习一下每条语句执行的时间的相关知识。
你可以试试n++,我认为当n加到256时,也会结束的,也就是说,n<128时,n--时间短些,n++时间长些;n>128时,n--时间长些,n++时间短些
回复

使用道具 举报

2

主题

6

帖子

43

积分

新手上路

Rank: 1

积分
43
发表于 2020-2-1 15:26:49 | 显示全部楼层
HC6800-ES-V2.0 发表于 2020-2-1 10:23
你没看到函数名:delay??
这是个延时函数,就是拖时间的,所以,这个while就是空运行,拖时间的。循环 ...


#include "reg52.h"       
typedef unsigned int u16;         
typedef unsigned char u8;


sbit led=P2^0;               

void delay(u16 i)
{
        while(i--);
}

void main()
{
        while(1)
        {
                led=0;
                delay(5000); //大约延时450ms
                led=1;
                delay(5000); //大约延时450ms       
        }               
}

多谢大哥哥为我解惑!我还是有疑问!
以上我的程序是这样子的,跟楼主的程序基本一样。
让我不明白的是,程序都是从main函数开始执行的,main函数的函数体里面已经有了delay(5000);这个不就起到延时的作用了吗,延时的参数是5000!

那么更让我不解的是,while(i--)根本都不在main函数里面,不会被执行吧?
而且,整个程序里面都没有定义i是数字几,那么这个i--,程序是怎么知道应该从哪个数字开始减,然后拖时间减到0,然后跳出循环呢?
回复

使用道具 举报

20

主题

1344

帖子

8372

积分

论坛元老

Rank: 8Rank: 8

积分
8372
发表于 2020-2-2 10:21:30 | 显示全部楼层
田子文 发表于 2020-2-1 15:26
#include "reg52.h"       
typedef unsigned int u16;         
typedef unsigned char u8;

同学
第一:你可以试试,把delay函数去掉,看能不能执行下去。delay(5000); //大约延时450ms这条语句就是调用这个延时函数的,你去掉延时函数,这条语句就不能执行了。
第二:你说的那个变量i,就是delay(5000); //大约延时450ms这个的5000啊,参数传递嘛。
你现在就该多看看书,而且是最基础的部分。
回复

使用道具 举报

0

主题

33

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2020-5-20 18:19:46 | 显示全部楼层
建议学习一下C语言,兄弟
回复

使用道具 举报

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

本版积分规则

关闭

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

Archiver|手机版|小黑屋|普中开源电子分享网 粤ICP备16123577号-2

GMT+8, 2024-4-20 12:20 , Processed in 0.118661 second(s), 40 queries .

Powered by 论坛搭建 X3.4

Copyright © 2001-2021, Tencent Cloud.

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