之前給別人做的,通過51單片機產生偽隨機數,通過定時器控制時間,3S時間計算結果并通過矩陣鍵盤顯示到液晶1602上。話不多說,看仿真:
QQ截圖20170724111205.png (29.81 KB, 下載次數: 72)
下載附件
正常顯示界面
2017-7-24 11:12 上傳
QQ截圖20170724111135.png (31.5 KB, 下載次數: 76)
下載附件
開機界面
2017-7-24 11:12 上傳
76523F203B64CE69D217022BB206542E.png (166.13 KB, 下載次數: 112)
下載附件
2017-7-24 16:39 上傳
0.png (37.58 KB, 下載次數: 70)
下載附件
2017-7-24 16:40 上傳
單片機源程序如下:
- //程序頭函數
- #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;
- /****************************************************************************
- 函數功能:延時子程序
- 入口參數:
- 出口參數:
- ****************************************************************************/
- void delay(uint k)
- {
- uint m;
- while(k--)
- for(m=0;m<121;m++);
- }
- void delay_uint(uint z)
- {
- while(z--);
- }
- /****************************************************************************
- 函數功能:1602顯示子程序
- 入口參數:
- 出口參數:
- ****************************************************************************/
- /********************************************************************
- * 名稱 : write_com(uchar com)
- * 功能 : 1602命令函數
- * 輸入 : 輸入的命令值
- * 輸出 : 無
- ***********************************************************************/
- 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寫數據函數
- * 輸入 : 需要寫入1602的數據
- * 輸出 : 無
- ***********************************************************************/
- void write_data(uchar dat)
- {
- e=0;
- rs=1;
- rw=0;
- P0=dat;
- delay_uint(25);
- e=1;
- delay_uint(100);
- e=0;
- }
- /***********************lcd1602上顯示兩位十進制數************************/
- 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上顯示字符函數************************/
- 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初始化設置************************/
- 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 ");
- }
- /*=======按鍵采集函數========*/
- /*-------------------------------------------------------------------------------------------------
- 說明:
- 1.每次只采集1個按鍵,多個按鍵按下時,只采集程序前面的鍵值.
- 2.該函數只要采集到按鍵后.只有當按鍵松開后才能再次采集按鍵.
- 3.采集的結果與按鍵數字對應.(0~15)方便其它函數處理.如果沒有按鍵按下.采集結果為100.
- --------------------------------------------------------------------------------------------------*/
- unsigned int key16 (void) //4*4矩陣鍵盤掃描.
- {
- static unsigned int key_new = 0; //聲明1個靜態變量,用來記錄按鍵在沒有松開的情況下,只能被采集1次.
- static unsigned int key_l; //聲明1個靜態變量,用來存放掃描后的數據,方便判斷是哪個鍵被按下了.
-
- keyIo = 0x0f; //初始化按鍵掃描IO口,
- if(keyIo != 0x0f) //如果有任意按鍵按下,按鍵掃描IO口肯定不是初始值(這個要參考電路)
- {
- delay(10); //按鍵延時去抖動
- if((keyIo != 0x0f) && (key_new == 0)) //如果判斷按鍵還被按下,并且是按鍵在松開的情況下按下的.
- {
- key_new = 1; //按鍵松開記錄清0,表示下次如果按鍵沒有松開,就不再進入
- key_off = 1; //記錄按鍵被按下.1表示按下,0表示松開.
- key_l = (keyIo | 0xf0); //矩陣鍵盤掃描
- 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; //按鍵松開時,記錄按鍵松開復位,可以再次進入按鍵采集
- key_off = 0; //記錄按鍵被按下.1表示按下,0表示松開.
- }
- return 100; //如果沒有檢測到按鍵,直接反回100.這個值只要不是有效鍵值就行.
- }
- //**********************************************************
- //初始化
- //**********************************************************
- void Init()
- {
- EA=1; //開總中斷
- ET0=1; //定時器0中斷使能
- ET1=1; //定時器1中斷使能
- TMOD=0x21; //定時器0模式1,定時器1模式2
- TH0=(65535-50000)/256; //定時器0設定初值
- TL0=(65535-50000)%256;
- TH1=0x00; //定時器1設定初值
- TH1=0x00;
- TR0=1; //定時器0不開啟
- TR1=0; //定時器1開啟
- }
- //**********************************************************
- //隨機函數
- //**********************************************************
- void Random_Dot()
- {
- num1_t=rand()%1000; //取出100-999中的任意一個值
- num2_t=rand()%1000;
- if(num1_t>100)
- num1=num1_t;
- if(num2_t>100)
- num2=num2_t;
- }
- /****************************************************************************
- 函數功能:主程序
- 入口參數:
- 出口參數:
- ****************************************************************************/
- void main(void)
- {
- unsigned char key_16mun; //聲明1個變量,用來暫存按鍵的值.
- 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) //主循環
- {
- 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) //如果輸入的鍵值是數字鍵
- {
- tab[i]=key_16mun;
- result=result*10+tab[i];
- i++; //每輸入一位密碼,位數自增1.
- if(i == 5) //密碼輸入位數控制在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);
- }
- }
- //**********************************************************
- //定時器中斷0
- //**********************************************************
- void time0() interrupt 1
- {
- TH0=(65535-50000)/256; //定時器0設定初值
- TL0=(65535-50000)%256;
- count++;
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼
所有資料51hei提供下載:
058-大腦運算能力智力測試儀.zip
(237 KB, 下載次數: 20)
2017-7-24 11:13 上傳
點擊文件名下載附件
全套資料 下載積分: 黑幣 -5
|