久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4142|回復: 0
打印 上一主題 下一主題
收起左側

基于51單片機的大腦智力檢測儀全套資料

[復制鏈接]
跳轉到指定樓層
樓主
之前給別人做的,通過51單片機產生偽隨機數,通過定時器控制時間,3S時間計算結果并通過矩陣鍵盤顯示到液晶1602上。話不多說,看仿真:


單片機源程序如下:

  1. //程序頭函數
  2. #include <reg52.h>
  3. #include <stdlib.h>
  4. #include <intrins.h>
  5. //宏定義
  6. #define uint unsigned int
  7. #define uchar unsigned char
  8. #define keyIo P1
  9. //1602液晶
  10. sbit rs=P2^5;
  11. sbit rw=P2^6;
  12. sbit e=P2^7;
  13. //led
  14. sbit led_red=P2^3;
  15. sbit led_green=P2^0;
  16. /*******************************定義全局變量********************************/
  17. uint num1=100,num2=100,num3,round,round_t,cod,keyNo;
  18. uint count;
  19. int sec=3;
  20. bit flag_ok;
  21. uint tab[4]={0};
  22. uint sum,i=0;
  23. uint num1_t,num2_t,key_off,result;

  24. /****************************************************************************
  25. 函數功能:延時子程序
  26. 入口參數:
  27. 出口參數:
  28. ****************************************************************************/
  29. void delay(uint k)
  30. {
  31.         uint m;
  32.         while(k--)
  33.                 for(m=0;m<121;m++);
  34. }
  35. void delay_uint(uint z)
  36. {
  37.         while(z--);
  38. }
  39. /****************************************************************************
  40. 函數功能:1602顯示子程序
  41. 入口參數:
  42. 出口參數:
  43. ****************************************************************************/

  44. /********************************************************************
  45. * 名稱 : write_com(uchar com)
  46. * 功能 : 1602命令函數
  47. * 輸入 : 輸入的命令值
  48. * 輸出 : 無
  49. ***********************************************************************/
  50. void write_com(uchar com)
  51. {
  52.         e=0;
  53.         rs=0;
  54.         rw=0;
  55.         P0=com;
  56.         delay_uint(25);
  57.         e=1;
  58.         delay_uint(100);
  59.         e=0;
  60. }
  61. /********************************************************************
  62. * 名稱 : write_data(uchar dat)
  63. * 功能 : 1602寫數據函數
  64. * 輸入 : 需要寫入1602的數據
  65. * 輸出 : 無
  66. ***********************************************************************/
  67. void write_data(uchar dat)
  68. {
  69.         e=0;
  70.         rs=1;
  71.         rw=0;
  72.         P0=dat;
  73.         delay_uint(25);
  74.         e=1;
  75.         delay_uint(100);
  76.         e=0;        
  77. }
  78. /***********************lcd1602上顯示兩位十進制數************************/
  79. void write_sfm1(uchar hang,uchar add,uint date)
  80. {
  81.         if(hang==1)   
  82.                 write_com(0x80+add);
  83.         else
  84.                 write_com(0x80+0x40+add);
  85.         write_data(0x30+date);        
  86. }
  87. void write_sfm2(uchar hang,uchar add,uint date)
  88. {
  89.         if(hang==1)   
  90.                 write_com(0x80+add);
  91.         else
  92.                 write_com(0x80+0x40+add);
  93.         write_data(0x30+date/10%10);
  94.         write_data(0x30+date%10);        
  95. }
  96. void write_sfm3(uchar hang,uchar add,uint date)
  97. {
  98.         if(hang==1)   
  99.                 write_com(0x80+add);
  100.         else
  101.                 write_com(0x80+0x40+add);
  102.         write_data(0x30+date/100);
  103.         write_data(0x30+date/10%10);
  104.         write_data(0x30+date%10);        
  105. }
  106. void write_sfm4(uchar hang,uchar add,uint date)
  107. {
  108.         if(hang==1)   
  109.                 write_com(0x80+add);
  110.         else
  111.                 write_com(0x80+0x40+add);
  112.         write_data(0x30+date/1000);
  113.         write_data(0x30+date/100%10);
  114.         write_data(0x30+date/10%10);
  115.         write_data(0x30+date%10);        
  116. }
  117. /***********************lcd1602上顯示字符函數************************/
  118. void write_string(uchar hang,uchar add,uchar *p)
  119. {
  120.         if(hang==1)   
  121.                 write_com(0x80+add);
  122.         else
  123.                 write_com(0x80+0x40+add);
  124.                 while(1)                                                                                                                 
  125.                 {
  126.                         if(*p == '\0')  break;
  127.                         write_data(*p);
  128.                         p++;
  129.                 }        
  130. }

  131. /***********************lcd1602初始化設置************************/
  132. void init_1602()        //lcd1602初始化
  133. {
  134.         write_com(0x38);        
  135.         write_com(0x0c);
  136.         write_com(0x06);
  137.         delay_uint(1000);  
  138.         write_string(1,0," Welcom to use ");
  139.         write_string(2,0," Brain Tester  ");
  140. }
  141. /*=======按鍵采集函數========*/
  142. /*-------------------------------------------------------------------------------------------------
  143. 說明:
  144.                 1.每次只采集1個按鍵,多個按鍵按下時,只采集程序前面的鍵值.
  145.                 2.該函數只要采集到按鍵后.只有當按鍵松開后才能再次采集按鍵.
  146.                 3.采集的結果與按鍵數字對應.(0~15)方便其它函數處理.如果沒有按鍵按下.采集結果為100.
  147. --------------------------------------------------------------------------------------------------*/
  148. unsigned int key16 (void)                                                                        //4*4矩陣鍵盤掃描.
  149. {
  150.         static unsigned int key_new = 0;                                                //聲明1個靜態變量,用來記錄按鍵在沒有松開的情況下,只能被采集1次.
  151.         static unsigned int key_l;                                                                //聲明1個靜態變量,用來存放掃描后的數據,方便判斷是哪個鍵被按下了.
  152.                
  153.         keyIo = 0x0f;                                                                                        //初始化按鍵掃描IO口,
  154.         if(keyIo != 0x0f)                                                                                //如果有任意按鍵按下,按鍵掃描IO口肯定不是初始值(這個要參考電路)
  155.         {
  156.                 delay(10);                                                                                //按鍵延時去抖動
  157.                 if((keyIo != 0x0f) && (key_new == 0))                                //如果判斷按鍵還被按下,并且是按鍵在松開的情況下按下的.
  158.                 {
  159.                         key_new = 1;                                                                        //按鍵松開記錄清0,表示下次如果按鍵沒有松開,就不再進入
  160.                         key_off = 1;                                                                        //記錄按鍵被按下.1表示按下,0表示松開.
  161.                         key_l = (keyIo | 0xf0);   //矩陣鍵盤掃描
  162.                         keyIo = key_l;
  163.                         switch(keyIo)                                                                        //判斷鍵值.
  164.                         {
  165.                                 case 0xee:  return 0;                                                //返回按鍵值. 1110 1110
  166.                                 case 0xde:  return 4;                                                //返回按鍵值. 1101 1110
  167.                                 case 0xbe:  return 8;                                                //返回按鍵值. 1011 1110
  168.                                 case 0x7e:  return 12;                                                //返回按鍵值. 0111 1110
  169.         
  170.                                 case 0xed:  return 1;                                                //返回按鍵值. 1110 1101
  171.                                 case 0xdd:  return 5;                                                //返回按鍵值. 1101 1101
  172.                                 case 0xbd:  return 9;                                                //返回按鍵值. 1011 1101
  173.                                 case 0x7d:  return 13;                                                //返回按鍵值. 0111 1101
  174.         
  175.                                 case 0xeb:  return 2;                                                //返回按鍵值. 1110 1011
  176.                                 case 0xdb:  return 6;                                                //返回按鍵值. 1101 1011
  177.                                 case 0xbb:  return 10;                                                //返回按鍵值. 1011 1011
  178.                                 case 0x7b:  return 14;                                                //返回按鍵值. 0111 1011
  179.         
  180.                                 case 0xe7:  return 3;                                                //返回按鍵值. 1110 0111
  181.                                 case 0xd7:  return 7;                                                //返回按鍵值. 1101 0111
  182.                                 case 0xb7:  return 11;                                                //返回按鍵值. 1011 0111
  183.                                 case 0x77:  return 15;                                                //返回按鍵值. 0111 0111
  184.                         }
  185.                 }                        
  186.         }
  187.         else
  188.         {
  189.                 key_new = 0;                                                                                //按鍵松開時,記錄按鍵松開復位,可以再次進入按鍵采集
  190.                 key_off = 0;                                                                                //記錄按鍵被按下.1表示按下,0表示松開.
  191.         }

  192.         return 100;                                                                                                //如果沒有檢測到按鍵,直接反回100.這個值只要不是有效鍵值就行.
  193. }
  194. //**********************************************************
  195. //初始化
  196. //**********************************************************
  197. void Init()
  198. {
  199.         EA=1;                                                //開總中斷
  200.         ET0=1;                                                //定時器0中斷使能
  201.         ET1=1;                                                //定時器1中斷使能
  202.         TMOD=0x21;                                        //定時器0模式1,定時器1模式2
  203.         TH0=(65535-50000)/256;                //定時器0設定初值
  204.         TL0=(65535-50000)%256;
  205.         TH1=0x00;                                        //定時器1設定初值
  206.         TH1=0x00;
  207.         TR0=1;                                                //定時器0不開啟
  208.         TR1=0;                                                //定時器1開啟
  209. }
  210. //**********************************************************
  211. //隨機函數
  212. //**********************************************************
  213. void Random_Dot()
  214. {
  215.         num1_t=rand()%1000;                                //取出100-999中的任意一個值
  216.         num2_t=rand()%1000;
  217.         if(num1_t>100)
  218.                 num1=num1_t;
  219.         if(num2_t>100)
  220.                 num2=num2_t;
  221. }
  222. /****************************************************************************
  223. 函數功能:主程序
  224. 入口參數:
  225. 出口參數:
  226. ****************************************************************************/
  227. void main(void)
  228. {         
  229.         unsigned char key_16mun;                                                        //聲明1個變量,用來暫存按鍵的值.
  230.         init_1602();
  231.         Init();
  232.         
  233.         delay(2000);
  234.         write_string(1,0,"Round:  Code:   ");
  235.         write_string(2,0,"T: N000+000=0000");
  236.         write_sfm2(1,6,round);
  237.         write_sfm2(1,13,cod);
  238.         write_sfm1(2,2,sec);
  239.         TR1=1;Random_Dot(); TR1=0; sum=num1+num2;
  240.         num3=result;
  241.         write_sfm3(2,4,num1);               
  242.         write_sfm3(2,8,num2);
  243.         write_sfm4(2,12,num3);
  244.     while(1)       //主循環                  
  245.     {
  246.                 key_16mun = key16();
  247.                 if(key_16mun==15)
  248.                 {
  249.                         TR0=1;
  250.                         round=round_t=0;
  251.                         cod=0;
  252.                         num3=result=i=0;
  253.                         TR1=1;Random_Dot(); TR1=0; sum=num1+num2;
  254.                 }
  255.                 if(key_16mun < 10)                                                                                        //如果輸入的鍵值是數字鍵
  256.                 {
  257.                         tab[i]=key_16mun;
  258.                         result=result*10+tab[i];
  259.                         i++;                                                                                //每輸入一位密碼,位數自增1.
  260.                         if(i == 5)                                                                //密碼輸入位數控制在6位
  261.                         {
  262.                                 i = 0;
  263.                                 result=0;
  264.                         }                                                                                
  265.                 }
  266.                 num3=result;                                 
  267.                 sum=num1+num2;
  268.                 if((num3==sum)&&(round!=round_t))
  269.                 {
  270.                         led_green=0;
  271.                         led_red=1;
  272.                         cod+=10;
  273.                         round_t=round;
  274.                 }                          
  275.                 else
  276.                 {
  277.                         led_green=1;
  278.                         led_red=0;
  279.                 }               
  280.                 write_sfm2(1,6,round);
  281.                 write_sfm2(1,13,cod);
  282.                 write_sfm1(2,2,sec);
  283.                 write_sfm3(2,4,num1);
  284.                 write_sfm3(2,8,num2);
  285.                 write_sfm4(2,12,num3);
  286.             }
  287. }

  288. //**********************************************************
  289. //定時器中斷0
  290. //**********************************************************
  291. void time0() interrupt         1
  292. {
  293.         TH0=(65535-50000)/256;                //定時器0設定初值
  294.         TL0=(65535-50000)%256;
  295.         count++;
  296. ……………………

  297. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:
058-大腦運算能力智力測試儀.zip (237 KB, 下載次數: 20)




評分

參與人數 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 看a网站| 欧美性jizz18性欧美 | 欧美一二区| 中文字幕一区二区三区不卡 | 亚洲三区在线观看 | 欧美一区二区三区久久精品 | 精品久久电影 | 福利网站在线观看 | 欧美日韩亚洲国产 | 欧美日韩国产一区二区三区 | 久久精品一区二区三区四区 | 午夜国产在线 | 草草草网站 | 国产精品成人国产乱 | 久久国产美女视频 | 亚洲欧美一区二区三区国产精品 | 日韩成人影院 | 羞视频在线观看 | 午夜精品一区二区三区在线观看 | 久久成人国产精品 | 久久久久亚洲 | 日韩在线精品 | 欧美日韩在线一区二区三区 | 中文字幕在线免费视频 | 中文字幕av网站 | 亚洲电影一区二区三区 | 国产日韩欧美中文字幕 | 亚洲精品9999 | 羞羞的视频在线观看 | 天天天插 | 请别相信他免费喜剧电影在线观看 | 国产一区二区精品在线观看 | 日本公妇乱淫xxxⅹ 国产在线不卡 | 国产成人午夜电影网 | 国产一区二区三区四区 | 国产一区二区三区四区五区加勒比 | 国内自拍真实伦在线观看 | 国产中文区二幕区2012 | 久久中文字幕电影 | 九色视频网站 | 一区二区三区四区视频 |