找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1200|回复: 1
打印 上一主题 下一主题
收起左侧

为什么我的随机数生成程序运行几次以后就不正常了?

[复制链接]
跳转到指定楼层
楼主
ID:1006994 发表于 2022-12-28 13:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
RTRT,我对着按键狠搓个一百次左右后就会保持在一个数字不变,但是过一会又会恢复正常功能……“左右”是因为每次出现这种情况要按的次数都不一定……不过基本上是在100次以上的样子。
我用的随机数生成方法是srand()+rand()函数,在main()里用递增生成一个种子。不知道究竟哪里出问题了……
我用的开发板是普中-3的开发板。单片机的型号是STC89C52RC
附代码:
  1. #include <REGX52.H>
  2. #include <stdlib.h>

  3. #define BUT1 P3_1
  4. #define MAX 255
  5. #define MIN 1

  6. unsigned char key_old = 1;
  7. unsigned char key_flag = 0;
  8. unsigned char key_now = 1;
  9. unsigned char keyup = 1;

  10. unsigned char down_count = 0;
  11. unsigned char up_count = 0;

  12. void configTimer0();
  13. unsigned int random(unsigned int xxx);

  14. void main()
  15. {
  16.         unsigned int seed = 0;
  17.         unsigned char LED = 0xFF;
  18.        
  19.         configTimer0();
  20.        
  21.         while (1)
  22.         {
  23.                 if (seed < 65530)
  24.                 {
  25.                         seed+=1;
  26.                 }
  27.                 else
  28.                 {
  29.                         seed=0;
  30.                 }
  31.                 if (down_count >= 2)
  32.                 {
  33.                         LED=random(seed);
  34.                         seed = 0;
  35.                        
  36.                         P2=LED;
  37.                         down_count = 0;
  38.                         keyup = 0;
  39.                 }
  40.                 if (up_count >= 2)
  41.                 {
  42.                         up_count = 0;
  43.                         keyup = 1;
  44.                 }
  45.         }
  46. }

  47. void configTimer0()
  48. {
  49.     TMOD=0x01; //0000 0001
  50.     TH0 = (65536 - 1000) / 256; //delay 1ms
  51.     TL0 = (65536 - 1000) % 256;
  52.     TR0 = 1;
  53.     ET0 = 1;
  54.     EA = 1;
  55. }

  56. unsigned int random(unsigned int xxx)
  57. {
  58.         unsigned int value;
  59.   srand(xxx);
  60.   value = rand() % (MAX + 1 - MIN)+ MIN;               //get a random num (MIN-MAX)
  61.   return value;
  62. }


  63. void timer0() interrupt 1
  64. {
  65.         static int count = 0;
  66.         if (count >= 10)
  67.         {
  68.                 // detect key
  69.                 key_now = BUT1;
  70.                 key_flag = (key_now ^ key_old) ^ key_flag;
  71.                 key_old = key_now;
  72.                 if(key_flag && keyup)
  73.                 {
  74.                         down_count += 1;
  75.                 }
  76.                 else if (!keyup && !key_flag)
  77.                 {
  78.                         up_count += 1;
  79.                 }
  80.         }
  81.        
  82.         TH0 = (65536 - 1000) / 256;
  83.   TL0 = (65536 - 1000) % 256;
  84.         count+=1;
  85. }
复制代码



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:883242 发表于 2023-1-3 16:05 | 只看该作者
开一个定时器,随机种子用定时器的值。
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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