%是獲得四位的隨機數(shù),/1000是將最高位的那個數(shù)+0x30
成都創(chuàng)新互聯(lián)公司是專業(yè)的河曲網(wǎng)站建設(shè)公司,河曲接單;提供網(wǎng)站制作、成都做網(wǎng)站,網(wǎng)頁設(shè)計,網(wǎng)站設(shè)計,建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進行河曲網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團隊,希望更多企業(yè)前來合作!
lcd里面顯示的是字符,你直接得到的是一個整型的加上0x30就是字符了……
用庫函數(shù)也可以,有簡便的方法,就是捕獲定時器中的值!思路如下,程序一開始就打開定時器(不開中斷),讓定時器在哪里跑。當你要用隨機數(shù)的時候捕獲出定時器中的值,然后經(jīng)過運算可以得出0-9的隨機數(shù)!
#include stdlib.h
srand(dat); //初始化隨機種子,使用該函數(shù)需要上面的頭文件。如果不要這個,每次開機,對應(yīng)的隨機數(shù)都是相同的. dat 也是需要是個隨機數(shù),一般可以用掉電存儲的方式來讀取。
dat = rand() ;
1. 絕對宏:
在程序中,用“#includeabsacc.h”即可使用其中定義的宏來訪問絕對地址,包括CBYTE、XBYTE、PWORD、DBYTE、CWORD、XWORD、PBYTE、DWORD
具體使用可看一看absacc.h便知,例如:
rval=CBYTE[0x0002];指向程序存貯器的0002h地址
rval=XWORD[0x0002];指向外RAM的0002h地址
2. _at_關(guān)鍵字
直接在數(shù)據(jù)定義后加上_at_ const即可,但是注意:
(1)絕對變量不能被初使化;
(2)bit型函數(shù)及變量不能用_at_指定。
例如:
idata struct link list _at_ 0x40;指定list結(jié)構(gòu)從40h開始。
xdata char text[25b] _at_0xE000;指定text數(shù)組從0E000H開始
提示:如果外部絕對變量是I/O端口等可自行變化數(shù)據(jù),需要使用volatile關(guān)鍵字進行描述,請參考absacc.h。
#include reg52.h
sbit Button = P1^0;
void Delay()
{
unsigned char i;
for(i=0;i125;i++);
}
void main()
{
unsigned char DisplayData;
unsigned char DisplayCode[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
TMOD=0X01;
TH0=0;
TL0=0;
ET0=1;
TR0=1;
EA=1;
while(1)
{
//利用定時器制造隨機數(shù),取出0~9的隨機數(shù)
DisplayData=TH0%10;
if(Button == 0)
{
while(Button == 0)
{
P0=DisplayCode[DisplayData];
P2=0;
Delay();
}
}
}
}
void T0() interrupt 1
{
TH0=0;
TL0=0;
}
說明一下,樓主沒有給出圖,我假設(shè)以P1^0接開關(guān)了,P0為數(shù)碼管段碼,P2為數(shù)碼管位選,如果P2沒接138譯碼器就把0換成0x01就好了,主要是利用定時器的內(nèi)部計數(shù)器來作隨機數(shù),因為內(nèi)部計數(shù)器沒變化一次為1us,所以我們沒法把握,把計算器低位數(shù)據(jù)取出后經(jīng)過%10的運算,就能取到0~9的數(shù)據(jù)了
剛寫的程序,我的思想是用定時器加rand()隨機函數(shù)來實現(xiàn)的,單片機上電之后通過按鍵去啟動取隨機數(shù),若是單片機上電就立即取隨機數(shù)的話,那每次上電隨機的結(jié)果都是一樣的。然后是0到9不重復(fù)的隨機數(shù),程序中用了循環(huán)來判斷是否和前面取的隨機數(shù)相同,相同則進入下次取隨機數(shù),不同則存入數(shù)組。程序如下:#includereg52.h
#includestdlib.h //包含rand()隨機函數(shù)的頭文件
unsigned char t,k,i,j,a,f,n[10];
//t是計時變量,k是按鍵標志,i是數(shù)組下標,f是隨機數(shù)重復(fù)標志,n[10]是存放隨機數(shù)的數(shù)組
void init() //初始化函數(shù)
{
t=0;
i=0;
f=0;
k=0;
TMOD=0x02; //設(shè)置定時器0為工作方式2
TH0=7; //裝初值
TL0=7;
EA=1; //開總中斷
ET0=1; //開定時器0中斷
TR0=1; //啟動定時0
EX0=1; //開外部中斷0,同按鍵的效果一樣
IT0=1; //下降沿觸發(fā)
}
void main()
{
init();
while(1)
{
while(k) //外部中斷0觸發(fā)循環(huán)
{
if(!i) //i=0時取第一個隨機數(shù)放入數(shù)組n[0]
{
srand(t); //隨機數(shù)初始化
a=(char)(rand()%10); //取隨機數(shù)(0~9)
n[0]=a; //存入數(shù)組
i++; //數(shù)組下標加1
}
else
while(i10) //存放剩下的9個隨機數(shù)
{
srand(t); //隨機數(shù)初始化
a=(char)(rand()%10); //取隨機數(shù)
for(j=0;ji;j++) //與前面的隨機數(shù)比較
{
if(n[j]==a) //與前面的隨機數(shù)相同
f=1; //標志置1
}
if(f) //有重復(fù)執(zhí)行
{
f=0; //標志清0
continue; //結(jié)束本次循環(huán)
}
n[i]=a; //不同則存入數(shù)組中
i++; //數(shù)組下標加1
}
}
}
}
void inter0() interrupt 0 //外部中斷0
{
k=1; //按鍵標志置1,主函數(shù)執(zhí)行取隨機數(shù)
}
void time0() interrupt 1 //定時器0中斷
{
t++; //時間加1
if(t==100) t=0;
}