|
之前給別人做的,通過(guò)51單片機(jī)產(chǎn)生偽隨機(jī)數(shù),通過(guò)定時(shí)器控制時(shí)間,3S時(shí)間計(jì)算結(jié)果并通過(guò)矩陣鍵盤(pán)顯示到液晶1602上。話不多說(shuō),看仿真:
QQ截圖20170724111205.png (29.81 KB, 下載次數(shù): 72)
下載附件
正常顯示界面
2017-7-24 11:12 上傳
QQ截圖20170724111135.png (31.5 KB, 下載次數(shù): 76)
下載附件
開(kāi)機(jī)界面
2017-7-24 11:12 上傳
76523F203B64CE69D217022BB206542E.png (166.13 KB, 下載次數(shù): 112)
下載附件
2017-7-24 16:39 上傳
0.png (37.58 KB, 下載次數(shù): 70)
下載附件
2017-7-24 16:40 上傳
單片機(jī)源程序如下:
- //程序頭函數(shù)
- #include <reg52.h>
- #include <stdlib.h>
- #include <intrins.h>
- //宏定義
- #define uint unsigned int
- #define uchar unsigned char
- #define keyIo P1
- //1602液晶
- sbit rs=P2^5;
- sbit rw=P2^6;
- sbit e=P2^7;
- //led
- sbit led_red=P2^3;
- sbit led_green=P2^0;
- /*******************************定義全局變量********************************/
- uint num1=100,num2=100,num3,round,round_t,cod,keyNo;
- uint count;
- int sec=3;
- bit flag_ok;
- uint tab[4]={0};
- uint sum,i=0;
- uint num1_t,num2_t,key_off,result;
- /****************************************************************************
- 函數(shù)功能:延時(shí)子程序
- 入口參數(shù):
- 出口參數(shù):
- ****************************************************************************/
- void delay(uint k)
- {
- uint m;
- while(k--)
- for(m=0;m<121;m++);
- }
- void delay_uint(uint z)
- {
- while(z--);
- }
- /****************************************************************************
- 函數(shù)功能:1602顯示子程序
- 入口參數(shù):
- 出口參數(shù):
- ****************************************************************************/
- /********************************************************************
- * 名稱 : write_com(uchar com)
- * 功能 : 1602命令函數(shù)
- * 輸入 : 輸入的命令值
- * 輸出 : 無(wú)
- ***********************************************************************/
- void write_com(uchar com)
- {
- e=0;
- rs=0;
- rw=0;
- P0=com;
- delay_uint(25);
- e=1;
- delay_uint(100);
- e=0;
- }
- /********************************************************************
- * 名稱 : write_data(uchar dat)
- * 功能 : 1602寫(xiě)數(shù)據(jù)函數(shù)
- * 輸入 : 需要寫(xiě)入1602的數(shù)據(jù)
- * 輸出 : 無(wú)
- ***********************************************************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=0;
- P0=dat;
- delay_uint(25);
- e=1;
- delay_uint(100);
- e=0;
- }
- /***********************lcd1602上顯示兩位十進(jìn)制數(shù)************************/
- void write_sfm1(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date);
- }
- void write_sfm2(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
- void write_sfm3(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/100);
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
- void write_sfm4(uchar hang,uchar add,uint date)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- write_data(0x30+date/1000);
- write_data(0x30+date/100%10);
- write_data(0x30+date/10%10);
- write_data(0x30+date%10);
- }
- /***********************lcd1602上顯示字符函數(shù)************************/
- void write_string(uchar hang,uchar add,uchar *p)
- {
- if(hang==1)
- write_com(0x80+add);
- else
- write_com(0x80+0x40+add);
- while(1)
- {
- if(*p == '\0') break;
- write_data(*p);
- p++;
- }
- }
- /***********************lcd1602初始化設(shè)置************************/
- void init_1602() //lcd1602初始化
- {
- write_com(0x38);
- write_com(0x0c);
- write_com(0x06);
- delay_uint(1000);
- write_string(1,0," Welcom to use ");
- write_string(2,0," Brain Tester ");
- }
- /*=======按鍵采集函數(shù)========*/
- /*-------------------------------------------------------------------------------------------------
- 說(shuō)明:
- 1.每次只采集1個(gè)按鍵,多個(gè)按鍵按下時(shí),只采集程序前面的鍵值.
- 2.該函數(shù)只要采集到按鍵后.只有當(dāng)按鍵松開(kāi)后才能再次采集按鍵.
- 3.采集的結(jié)果與按鍵數(shù)字對(duì)應(yīng).(0~15)方便其它函數(shù)處理.如果沒(méi)有按鍵按下.采集結(jié)果為100.
- --------------------------------------------------------------------------------------------------*/
- unsigned int key16 (void) //4*4矩陣鍵盤(pán)掃描.
- {
- static unsigned int key_new = 0; //聲明1個(gè)靜態(tài)變量,用來(lái)記錄按鍵在沒(méi)有松開(kāi)的情況下,只能被采集1次.
- static unsigned int key_l; //聲明1個(gè)靜態(tài)變量,用來(lái)存放掃描后的數(shù)據(jù),方便判斷是哪個(gè)鍵被按下了.
-
- keyIo = 0x0f; //初始化按鍵掃描IO口,
- if(keyIo != 0x0f) //如果有任意按鍵按下,按鍵掃描IO口肯定不是初始值(這個(gè)要參考電路)
- {
- delay(10); //按鍵延時(shí)去抖動(dòng)
- if((keyIo != 0x0f) && (key_new == 0)) //如果判斷按鍵還被按下,并且是按鍵在松開(kāi)的情況下按下的.
- {
- key_new = 1; //按鍵松開(kāi)記錄清0,表示下次如果按鍵沒(méi)有松開(kāi),就不再進(jìn)入
- key_off = 1; //記錄按鍵被按下.1表示按下,0表示松開(kāi).
- key_l = (keyIo | 0xf0); //矩陣鍵盤(pán)掃描
- keyIo = key_l;
- switch(keyIo) //判斷鍵值.
- {
- case 0xee: return 0; //返回按鍵值. 1110 1110
- case 0xde: return 4; //返回按鍵值. 1101 1110
- case 0xbe: return 8; //返回按鍵值. 1011 1110
- case 0x7e: return 12; //返回按鍵值. 0111 1110
-
- case 0xed: return 1; //返回按鍵值. 1110 1101
- case 0xdd: return 5; //返回按鍵值. 1101 1101
- case 0xbd: return 9; //返回按鍵值. 1011 1101
- case 0x7d: return 13; //返回按鍵值. 0111 1101
-
- case 0xeb: return 2; //返回按鍵值. 1110 1011
- case 0xdb: return 6; //返回按鍵值. 1101 1011
- case 0xbb: return 10; //返回按鍵值. 1011 1011
- case 0x7b: return 14; //返回按鍵值. 0111 1011
-
- case 0xe7: return 3; //返回按鍵值. 1110 0111
- case 0xd7: return 7; //返回按鍵值. 1101 0111
- case 0xb7: return 11; //返回按鍵值. 1011 0111
- case 0x77: return 15; //返回按鍵值. 0111 0111
- }
- }
- }
- else
- {
- key_new = 0; //按鍵松開(kāi)時(shí),記錄按鍵松開(kāi)復(fù)位,可以再次進(jìn)入按鍵采集
- key_off = 0; //記錄按鍵被按下.1表示按下,0表示松開(kāi).
- }
- return 100; //如果沒(méi)有檢測(cè)到按鍵,直接反回100.這個(gè)值只要不是有效鍵值就行.
- }
- //**********************************************************
- //初始化
- //**********************************************************
- void Init()
- {
- EA=1; //開(kāi)總中斷
- ET0=1; //定時(shí)器0中斷使能
- ET1=1; //定時(shí)器1中斷使能
- TMOD=0x21; //定時(shí)器0模式1,定時(shí)器1模式2
- TH0=(65535-50000)/256; //定時(shí)器0設(shè)定初值
- TL0=(65535-50000)%256;
- TH1=0x00; //定時(shí)器1設(shè)定初值
- TH1=0x00;
- TR0=1; //定時(shí)器0不開(kāi)啟
- TR1=0; //定時(shí)器1開(kāi)啟
- }
- //**********************************************************
- //隨機(jī)函數(shù)
- //**********************************************************
- void Random_Dot()
- {
- num1_t=rand()%1000; //取出100-999中的任意一個(gè)值
- num2_t=rand()%1000;
- if(num1_t>100)
- num1=num1_t;
- if(num2_t>100)
- num2=num2_t;
- }
- /****************************************************************************
- 函數(shù)功能:主程序
- 入口參數(shù):
- 出口參數(shù):
- ****************************************************************************/
- void main(void)
- {
- unsigned char key_16mun; //聲明1個(gè)變量,用來(lái)暫存按鍵的值.
- init_1602();
- Init();
-
- delay(2000);
- write_string(1,0,"Round: Code: ");
- write_string(2,0,"T: N000+000=0000");
- write_sfm2(1,6,round);
- write_sfm2(1,13,cod);
- write_sfm1(2,2,sec);
- TR1=1;Random_Dot(); TR1=0; sum=num1+num2;
- num3=result;
- write_sfm3(2,4,num1);
- write_sfm3(2,8,num2);
- write_sfm4(2,12,num3);
- while(1) //主循環(huán)
- {
- key_16mun = key16();
- if(key_16mun==15)
- {
- TR0=1;
- round=round_t=0;
- cod=0;
- num3=result=i=0;
- TR1=1;Random_Dot(); TR1=0; sum=num1+num2;
- }
- if(key_16mun < 10) //如果輸入的鍵值是數(shù)字鍵
- {
- tab[i]=key_16mun;
- result=result*10+tab[i];
- i++; //每輸入一位密碼,位數(shù)自增1.
- if(i == 5) //密碼輸入位數(shù)控制在6位
- {
- i = 0;
- result=0;
- }
- }
- num3=result;
- sum=num1+num2;
- if((num3==sum)&&(round!=round_t))
- {
- led_green=0;
- led_red=1;
- cod+=10;
- round_t=round;
- }
- else
- {
- led_green=1;
- led_red=0;
- }
- write_sfm2(1,6,round);
- write_sfm2(1,13,cod);
- write_sfm1(2,2,sec);
- write_sfm3(2,4,num1);
- write_sfm3(2,8,num2);
- write_sfm4(2,12,num3);
- }
- }
- //**********************************************************
- //定時(shí)器中斷0
- //**********************************************************
- void time0() interrupt 1
- {
- TH0=(65535-50000)/256; //定時(shí)器0設(shè)定初值
- TL0=(65535-50000)%256;
- count++;
- ……………………
- …………限于本文篇幅 余下代碼請(qǐng)從51黑下載附件…………
復(fù)制代碼
所有資料51hei提供下載:
058-大腦運(yùn)算能力智力測(cè)試儀.zip
(237 KB, 下載次數(shù): 20)
2017-7-24 11:13 上傳
點(diǎn)擊文件名下載附件
全套資料 下載積分: 黑幣 -5
|
評(píng)分
-
查看全部評(píng)分
|