微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 怎样在单片机C语言里面产生一个0到100的随机数啊?

怎样在单片机C语言里面产生一个0到100的随机数啊?

时间:10-02 整理:3721RD 点击:
我是这样写的:int a;srand(32676);a=rand();a=32776-a;设定单片机0.5秒刷新一次显示,但是我在用1602显示这个数的时候这个随机数却一直不变,请问一下是什么原因啊?

全部程序在这里,用单片机的测试的时候,单片机的数字一直不变。
#include<reg51.h>
#include<stdlib.h>
#define uchar unsigned char
#define uint unsigned int
sbit rs=P2^6;
sbit rw=P2^5;
sbit lcden=P2^7;
uchar ge,shi,bai,qian,wan,i;
uchar code table[]="0123456789";
int a;
void delay(uint z)
{
        uint x,y;
        for(x=100;x>0;x--)
                for(y=z;y>0;y--);
}
void makerand()
{
        srand(32667);
        a=rand();
        a=32767-a;        
        bai=a/100;
        shi=a%100/10;
        ge=a%10;
}
void write_com(uchar com)
{
        rs=0;
        rw=0;
        lcden=0;
        delay(5);
        P0=com;
        lcden=1;
        delay(5);
        lcden=0;          
}
void write_date(uchar date)
{
        rs=1;
        rw=0;
        lcden=0;
        delay(5);
        P0=date;
        lcden=1;
        delay(5);
        lcden=0;
}
void lcd_init()
{
        lcden=0;
        write_com(0x38);
        write_com(0x0c);
        write_com(0x06);
        write_com(0x01);       
}
void main()
{
        lcd_init();
        while(1)
        {       
                write_com(0x80);
                makerand();
                write_date(table[bai]);
                delay(5);
                write_date(table[shi]);
                delay(5);
                write_date(table[ge]);
                delay(5);
                delay(300);                       
        }
}

用定时器加rand()随机函数来实现?
单片机上电之后通过按键去启动取随机数,若是单片机上电就立即取随机数的话,那每次上电随机的结果都是一样的。然后是0到9不重复的随机数,程序中用了循环来判断是否和前面取的随机数相同,相同则进入下次取随机数,不同则存入数组。?程序如下:?#include<reg52.h>??
#include<stdlib.h>?//包含rand()随机函数的头文件?unsigned?char?t,k,i,j,a,f,n[10];?
//t是计时变量,k是按键标志,i是数组下标,f是随机数重复标志,n[10]是存放随机数的数组?




?
void?init()??????//初始化函数?{?????t?=?0;?????i?=?0;?????f?=?0;?????k?=?0;?
????TMOD?=?0x02;????//设置定时器0为工作方式2?????TH0?=?7;????????//装初值??????????????????????????????TL0?=?7;?????????????????????????????????????EA?=?1;?????????//开总中断?????ET0?=?1;????????//开定时器0中断?????TR0?=?1;????????//启动定时0?
????EX0?=?1;????????//开外部中断0,同按键的效果一样?????IT0?=?1;????????//下降沿触发???}?
void?main()?{?




?
????init();?????while(1)?????{?
????????while(k)?????????????????????//外部中断0触发循环?????????{?
????????????if(!i)??????????????????//i=0时取第一个随机数放入数组n[0]?
????????????{?
????????????????srand(t);???????????//随机数初始化??????????????????????a?=?(char)(rand()?%?10);?//取随机数(0~9)?????????????????n[0]?=?a;??????????????//存入数组?????????????????i++;?????????????????//数组下标加1?????????????}?????????????else?
????????????????while(i?<?10)?????????????//存放剩下的9个随机数?????????????????{??
????????????????????srand(t);???????????//随机数初始化??????????????????????????a?=?(char)(rand()?%?10);??//取随机数?




?
????????????????????for(j?=?0;?j?<?i;?j++)??????//与前面的随机数比较?????????????????????{??
????????????????????????if(n[j]?==?a)????????//与前面的随机数相同?????????????????????????????f?=?1;???????????//标志置1??????????????????????}?
????????????????????if(f)??????????????????//有重复执行?????????????????????{??
????????????????????????f?=?0;???????????????//标志清0?????????????????????????continue;??????????//结束本次循环?????????????????????}?
????????????????????n[i]?=?a;????????????????//不同则存入数组中?????????????????????i++;???????????????????//数组下标加1?????????????????}??????????}?????}?}?
void?inter0()?interrupt?0????//外部中断0?




?
{?
????k?=?1;?????????????????????//按键标志置1,主函数执行取随机数??}?
void?time0()?interrupt?1?????//定时器0中断?{?????????
????t++;????????//时间加1?????if(t?==?100)?????{?
????????t?=?0;??????}?}??

srand(32667);你这句话本来就是个定定值了,要取随机种子

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top