c语言随机数单片机
A. c语言编写单片机计数脉冲
#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uint times,freq;
sbit p35=P3^5;
main()
{
TMOD=0x01;
TH0=0;
TL0=0;
while(1)
{
while(p35);
TR0=1;
while(!p35);
while(p35);
TR0=0;
times=TH0*256+TL0;
freq=1000000/times;
//处理频率,自己做
}
}
B. 单片机led点阵的程序怎么写我想修改。用C语言写的、就是怎么样随机选择一组代码。让每次显示的内容都不
单片机我懂的不多,就跟不懂一样。。。。 但就软件编程这个角度我到可以提出我的想法
你不说有71个字是固定的,最后一个字从甲、乙、丙、丁里面随机选吗
那你在定义好了前71个字的数组后,可以定义一个二维数组,这二维数组里存放甲、乙、丙、丁
就像这样:
code unsigned char rndword[4][32]={{....},{....},{.....},{....}};
我写点的地方你就写那些十六进制数字,这分别代表四个字
然后呢
你可能是先用一个循环把前71个字输出吧? 这我不管啥样。
反正到第72个字时,你要单独立出来来输出这个了随机数。
看代码:
int iRandom;
srand((unsigned)time(NULL)); // 这步是拿时间做随机数的种子
iRandom = rand()%4; //产生0到3的数,这个用来做二维数组的下标
然后你可能就用循环来输出了吧
for(j = 0 ; j < 32 ; j++)
{
//输出 rndword[iRandom][j]; 这看你单片机的咯
}
主要还是说下rand函数吧, 这要求你先拿一个东西做种子,一般都拿时间,就是srand是种子生成器,这样rand便能以时间做种子产生随机数了,之所以rand%4就是让它所产生的随机数除4取余,来得到0,1,2,3 来做数组下标用。 就这样
对了,忘了提醒,要加载
#include<stdlib.h>
#include<time.h>
第一个头文件是srand 和rand函数的声明, 第二个是time函数的声明
C. C语言 + 单片机-内存分布详解
C语言内存分区示意图如下:
1. 代码区
2. 常量区
3. 全局(静态)区
.bss段
.data段
4. 堆区(heap)
调用函数参数size_t是分配的字节大小,返回值是一个void型的指针,该指针指向分配空间的首地址。参数是开辟的内存的首地址。
5. 栈区(stack)
在STM32中,内存分配如下:
1. 随机存储器—RAM
2. 只读存储器—ROM
STM32F103芯片的内部分区如下图所示。
编译程序完成后,可以看到编译后的大小信息,包括Code、RO-data、RW-data和ZI-data的大小。这有助于开发人员和嵌入式系统设计者更好地管理内存资源并确保程序在目标设备上正常运行。
Code:代码段,指程序由编译器生成的可执行的机器指令。
RO-data:数据段,指程序中的只读数据部分,包括常量、字符串、const定义的变量等。
RW-data:数据段,指初始化为“非0值“的可读写数据,程序运行的时候这些数据又会常驻在RAM区,应用程序可以修改其内容。包括初始化为非零的全局变量和静态变量。
ZI-data:数据段,指初始化为0值的可读可写数据,它与RW-data的区别是程序刚运行时这些数据初始值全都为0,程序运行时和RW-data的性质一样,它们也常驻在RAM区,应用程序可以更改其内容。包括未初始化和初始化为零的全局变量和静态变量。
ZI-data 的栈空间(Stack)及堆空间(Heap):在C语言中,函数内部定义的局部变量属于栈空间,而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。
关于哪些数据存储在Flash区域,哪些数据存储在SRAM区域,这涉及到程序的存储状态。程序具有静止和运行两种状态,静止态的程序被存储在非易失存储器中,如内部FLASH区域。当程序在运行状态的时候,程序常常需要修改一些暂存数据,这些数据往往存放在Flash中,但需要被复制到RAM中。
程序存储分布如下图展示。当程序存储到芯片的内部FLASH时,它占用的空间为Code+RO-data+RW-data的总和。程序在执行的时候,需要占用内部SRAM空间,占用的空间为RW-data+ZI-data之和。
结论,想要让一个程序正常运行,必须满足以下两个条件:程序编译后打开工程的map文件,在map文件的最后一段也可以看到ROM的总大小。
划分依据及好处:首先区分代码段和数据段。程序源代码编译后的机器指令放在代码段;数据段包括" .data "、" .bss "、" .rodata ",将程序中定义的全局变量和局部变量都称为数据段。
把程序的“代码段”和“数据段”分开存放,数据和指令分别被映射到两个虚拟内存区域,数据段对进程是可读写的,而代码段对进程是只读的。现代CPU缓存设计成数据缓存和指令缓存分离,程序的指令和数据分开存放提高缓存命中率。
数据段还需要分 ".data"、".bss"、".rodata",主要根据是否占内存空间、读写权限进行区分。".data"段和".bss"段都是可读写的数据段,而".rodata"存放的是只读数据,主要是一些const变量和字符串常量。".rodata"段单独设立的好处是可以将属性映射成只读,减少修改操作,还可以将".rodata"段存放在只读存储器中。
全局变量也有细分初始化和未初始化,把全局变量分开存放,初始化为0和未初始化的全局变量放在BSS区,初始化不为0的全局变量存放在数据区。程序有两个存储状态,静止状态的程序被存储在非易失存储器中,运行状态的程序需要修改一些暂存数据存放在内存中,减少从ROM读数据的次数提高效率。
D. 51单片机用C语言产生一个100以内的随机数 怎么生成
C语言本身并不能产生随机数。
介绍一个比较简单的随机数获取方法:启动单片机的定时器,让它自己跑不要发生溢出中断,用户操作时直接读计数器数值,那基本上就是个随机数。