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語言本身並不能產生隨機數。
介紹一個比較簡單的隨機數獲取方法:啟動單片機的定時器,讓它自己跑不要發生溢出中斷,用戶操作時直接讀計數器數值,那基本上就是個隨機數。