数码之家

 找回密码
 立即注册

QQ登录

只需一步,快速开始

微信登录

微信扫一扫,快速登录

搜索
查看: 1590|回复: 17

[C51] 大家帮我看看做了个LED亮和灭循环自动翻页的程序,需要修改

[复制链接]
发表于 2022-5-18 16:49:42 | 显示全部楼层 |阅读模式
50家元
做的是一个LED亮和灭循环的程序,如何让程序自动随机延时5-30秒亮点LED灯呢?比如LED亮延时2秒关闭,在随机延时7秒开启LED后2秒关闭,在随机延时12秒在开启LED呢、请问如何修改呢?


#include <reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit LED = P1 ^ 7; //定义闪烁LED



/*********************************************************************************************
函数名:毫秒级CPU延时函数
调  用:DELAY_MS (?);
参  数:1~65535(参数不可为0)
返回值:无
结  果:占用CPU方式延时与参数数值相同的毫秒时间
备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
/*********************************************************************************************/
void DELAY_MS (unsigned int a){
    unsigned int i;
    while( --a != 0){
        for(i = 0; i < 600; i++);
    }
}
/*********************************************************************************************/
/*********************************************************************************************/
void main (void){ //主程序
    while(1){
    unsigned char a;


    LED=0;
    DELAY_MS(300);
    LED=1;

         DELAY_MS(3000);
    LED=0;
    DELAY_MS(300);
    LED=1;

        
for(a=1;a<25;a++)
{
}
}
}

最佳答案

查看完整内容

就是帮你加个随机函数的问题。你试试这个。
发表于 2022-5-18 16:49:43 | 显示全部楼层
就是帮你加个随机函数的问题。你试试这个。
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <stdlib.h>


  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit LED = P1 ^ 7; //定义闪烁LED



  7. /*********************************************************************************************
  8. 函数名:毫秒级CPU延时函数
  9. 调  用:DELAY_MS (?);
  10. 参  数:1~65535(参数不可为0)
  11. 返回值:无
  12. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  13. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  14. /*********************************************************************************************/
  15. void DELAY_MS (unsigned int a){
  16.     unsigned int i;
  17.     while( --a != 0){
  18.         for(i = 0; i < 600; i++);
  19.     }
  20. }
  21. /*********************************************************************************************/
  22. /*********************************************************************************************/
  23. void main (void){ //主程序
  24.     while(1){
  25.     unsigned char a;


  26.     LED=0;
  27.     DELAY_MS(2000);
  28.     LED=1;

  29.          DELAY_MS( (rand()%25+5)*1000); //获得5~30秒之间的随机数,函数rand()在stdlib.h
  30.             

  31.    

  32. }
  33. }
复制代码

回复

使用道具 举报

发表于 2022-5-18 17:42:59 | 显示全部楼层
可以用一个定时器开一个ms定时,然后用伪随机程序生成一个随机数放在delay(x)里面
回复

使用道具 举报

发表于 2022-5-18 17:56:45 | 显示全部楼层
好像有随机数生成函数,设置生成范围就好了
回复

使用道具 举报

发表于 2022-5-18 18:25:16 | 显示全部楼层
自己的想法要自己实现才有成就感,才能学到东西
回复

使用道具 举报

发表于 2022-5-18 18:51:56 | 显示全部楼层
随机数PLC的话可以取时钟尾数,单片机就不知道了
回复

使用道具 举报

 楼主| 发表于 2022-5-18 19:11:06 来自手机浏览器 | 显示全部楼层
750123208 发表于 2022-5-18 17:42
可以用一个定时器开一个ms定时,然后用伪随机程序生成一个随机数放在delay(x)里面 ...

具体代码怎么写呢?
回复

使用道具 举报

发表于 2022-5-19 09:17:27 | 显示全部楼层
好东西!是一定要给大家分享的!
回复

使用道具 举报

发表于 2022-5-19 09:53:46 | 显示全部楼层
就是帮你加个随机函数的问题。你试试这个。
  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include <stdlib.h>


  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. sbit LED = P1 ^ 7; //定义闪烁LED



  7. /*********************************************************************************************
  8. 函数名:毫秒级CPU延时函数
  9. 调  用:DELAY_MS (?);
  10. 参  数:1~65535(参数不可为0)
  11. 返回值:无
  12. 结  果:占用CPU方式延时与参数数值相同的毫秒时间
  13. 备  注:应用于1T单片机时i<600,应用于12T单片机时i<125
  14. /*********************************************************************************************/
  15. void DELAY_MS (unsigned int a){
  16.     unsigned int i;
  17.     while( --a != 0){
  18.         for(i = 0; i < 600; i++);
  19.     }
  20. }
  21. /*********************************************************************************************/
  22. /*********************************************************************************************/
  23. void main (void){ //主程序
  24.     while(1){
  25.     unsigned char a;


  26.     LED=0;
  27.     DELAY_MS(2000);
  28.     LED=1;

  29.          DELAY_MS( (rand()%25+5)*1000); //获得5~30秒之间的随机数,函数rand()在stdlib.h
  30.             

  31.    

  32. }
  33. }
复制代码
回复

使用道具 举报

 楼主| 发表于 2022-5-19 11:08:57 | 显示全部楼层
kindzhon 发表于 2022-5-19 09:56
就是帮你加个随机函数的问题。你试试这个。

DELAY_MS( (rand()%25+5)*1000); 用是可以用 可是计时已经超出30秒了,有的已经到40多秒才关闭,我用的是12C2052AD,能不能告诉我 %25的含义是什么?+5又是什么意思 )   *1000)还有这个 我好方便调合适的参数,谢谢啦
回复

使用道具 举报

发表于 2022-5-19 11:33:15 | 显示全部楼层
yyou58 发表于 2022-5-19 11:08
DELAY_MS( (rand()%25+5)*1000); 用是可以用 可是计时已经超出30秒了,有的已经到40多秒才关闭,我用的是 ...

生成随机数值为5~29之间。rand()%25生成0~24之间随机数。
回复

使用道具 举报

发表于 2022-5-19 13:32:04 | 显示全部楼层
本帖最后由 kindzhon 于 2022-5-19 15:18 编辑
yyou58 发表于 2022-5-19 11:08
DELAY_MS( (rand()%25+5)*1000); 用是可以用 可是计时已经超出30秒了,有的已经到40多秒才关闭,我用的是 ...

那要看你选的多少M的晶振,和你的主频是多少,这会影响你的DELAY_MS的时间。DELAY_MS是表示延时1毫秒。2秒是DELAY_MS(2000)。如果是12M的晶振, for(i = 0; i < 600; i++);这个600就要改成420。
回复

使用道具 举报

 楼主| 发表于 2022-5-19 16:39:43 | 显示全部楼层
kindzhon 发表于 2022-5-19 13:32
那要看你选的多少M的晶振,和你的主频是多少,这会影响你的DELAY_MS的时间。DELAY_MS是表示延时1毫秒。2秒 ...

程序有点小问题,每次重新上电计时器都是重新从6秒左右点亮LED,比如上电,6秒开启3秒关闭LED,,断电在上电,还是是6秒开启,8秒开启3秒关闭LED,反正每次上电计时都是重复的
回复

使用道具 举报

发表于 2022-5-19 17:05:43 | 显示全部楼层
LED=0;//点亮LED?
    DELAY_MS(2000);
    LED=1;//点亮LED??
回复

使用道具 举报

 楼主| 发表于 2022-5-19 19:00:59 来自手机浏览器 | 显示全部楼层
ccma1000 发表于 2022-5-19 17:05
LED=0;//点亮LED?
    DELAY_MS(2000);
    LED=1;//点亮LED??

1是关闭啊
回复

使用道具 举报

发表于 2022-5-19 23:26:34 来自手机浏览器 | 显示全部楼层
yyou58 发表于 2022-5-19 11:08
DELAY_MS( (rand()%25+5)*1000); 用是可以用 可是计时已经超出30秒了,有的已经到40多秒才关闭,我用的是 ...

12c单片机周期与c52的不一样吧。具体还要重新计算下。
回复

使用道具 举报

发表于 2022-5-21 18:54:42 | 显示全部楼层
用定时器得到随机数,可以用,我就是这么干的。
回复

使用道具 举报

 楼主| 发表于 2022-5-22 09:01:07 来自手机浏览器 | 显示全部楼层
ahyu99 发表于 2022-5-21 18:54
用定时器得到随机数,可以用,我就是这么干的。

上面发的程序有问题 每次断电在用电都会重复上一次的计时的时间
回复

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-7-25 00:43 , Processed in 0.140400 second(s), 11 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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