找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2845|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

實(shí)訓(xùn)做的一個(gè)單片機(jī)密碼鎖程序及仿真,功能不多

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主


單片機(jī)源程序如下:
  1. #include<reg51.h>
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. sbit RS = P1^0;
  5. sbit RW = P1^1;
  6. sbit EN = P1^2;
  7. sbit ledg=P1^3;                   //綠燈
  8. sbit ledr=P1^4;                   //紅燈
  9. sbit forward=P1^5;     //正轉(zhuǎn)
  10. sbit reversal=P1^6;    //反轉(zhuǎn)
  11. sbit braking=P1^7;           //制動(dòng)
  12. char table0[]=" Unlock Failed ";
  13. char table1[]="Unlock Successed";
  14. char table2[]="Enter PS:";
  15. char table3[]="Wrong Password";
  16. int temp,ch,p;
  17. int n0,n1,n2,n3,n4,n5,n6; //6位密碼數(shù)

  18. //***延時(shí)函數(shù)***//
  19. void delay(int time)
  20. {
  21.         int t=0;
  22.         for(;time>0;time--)
  23.         for(t=0;t<300;t++);
  24. }

  25. //=====鍵盤部分=====//
  26. keyscan()
  27. {
  28.         temp=P2&0xf0;         //第1行鍵盤數(shù),P2輸入
  29.         P2=0xfe;
  30.         delay(1);
  31.         temp=P2&0xf0;
  32.         while(temp!=0xf0)
  33.         {
  34.                 switch(temp)
  35.                 {
  36.                         case 0xe0:ch='1';break;
  37.                         case 0xd0:ch='2';break;
  38.                         case 0xb0:ch='3';break;
  39.                         default:ch=p; break;
  40.                  }
  41.                 while(temp!=0xf0)
  42.                 {
  43.                         temp=P2;
  44.                         temp=temp&0xf0;
  45.                  }
  46.         }
  47.         P2=0xfd;     //第2行鍵盤數(shù)
  48.         delay(1);
  49.         temp=P2&0xf0;
  50.         while(temp!=0xf0)
  51.         {
  52.                 switch(temp)
  53.                 {
  54.                         case 0xe0:ch='4';break;
  55.                         case 0xd0:ch='5';break;
  56.                         case 0xb0:ch='6';break;
  57.                         default:ch=p;break;
  58.                 }
  59.                 while(temp!=0xf0)
  60.                 {
  61.                         temp=P2;
  62.                         temp=temp&0xf0;
  63.                 }
  64.         }
  65.         P2=0xfb;      //第3行鍵盤數(shù)
  66.         delay(1);
  67.         temp=P2&0xf0;
  68.         while(temp!=0xf0)
  69.         {
  70.             switch(temp)
  71.                 {
  72.                         case 0xe0:ch='7';break;
  73.                         case 0xd0:ch='8';break;
  74.                         case 0xb0:ch='9';break;
  75.                         default:ch=p;break;
  76.                 }
  77.                 while(temp!=0xf0)
  78.                 {
  79.                         temp=P2;
  80.                         temp=temp&0xf0;
  81.                 }
  82.         }
  83.         P2=0xf7;                 //第4行鍵盤數(shù)
  84.         delay(1);
  85.         temp=P2&0xf0;
  86.         while(temp!=0xf0)
  87.         {
  88.                 switch(temp)
  89.                 {
  90.                         case 0xe0:ch='*';break;       
  91.                         case 0xd0:ch='0';break;
  92.                         case 0xb0:ch='#';break;       
  93.                         default:ch=p;break;
  94.                 }
  95.                 while(temp!=0xf0)
  96.                 {
  97.                         temp=P2;
  98.                         temp=temp&0xf0;
  99.                 }
  100.         }
  101.         return ch;
  102. }

  103. //=====LCD液晶部分=====//
  104. //***寫指令函數(shù)***//
  105. void LCDWrite(uchar com)//顯示
  106. {
  107.         P0=com;                  //送出指令
  108.         RS=0;RW=0;EN=1;   //寫指令時(shí)序
  109.         delay(10);
  110.         EN=0;
  111. }

  112. //***寫數(shù)據(jù)函數(shù)***//
  113. void LCDData(uchar dat)//輸入
  114. {
  115.         P0=dat;                    //送出數(shù)據(jù)
  116.         RS=1;RW=0;EN=1; //寫數(shù)據(jù)時(shí)序       
  117.         delay(10);
  118.         EN=0;
  119. }

  120. //***屏幕初始化函數(shù)***//
  121. void init()
  122. {
  123.         LCDWrite(0x01);         //清屏
  124.         LCDWrite(0x38);         //設(shè)置16*2顯示,5*7點(diǎn)陣,8位數(shù)據(jù)接口
  125.         LCDWrite(0x0f);         //開顯示,光標(biāo)閃爍,顯示光標(biāo)
  126.         LCDWrite(0x06);         //地址加1,整屏右移       
  127. }

  128. //***數(shù)字變?yōu)?*'函數(shù)***//
  129. change(int m)                        //輸入數(shù)字延時(shí)后變?yōu)?
  130. {
  131.         delay(200);
  132.         LCDWrite(m);
  133.         LCDData('*');
  134. }
  135.        
  136. //***字幕顯示調(diào)用函數(shù)***//
  137. void ps()                                         //輸入密碼界面"Enter PS:"
  138. {
  139.         char d1;
  140.         LCDWrite(0x80);                         //第1行第1個(gè)字符開始顯示
  141.         for(d1=0;d1<9;d1++)
  142.         {
  143.                 LCDData(table2[d1]);
  144.         }
  145. }
  146. void error()                                 //密碼錯(cuò)誤時(shí)調(diào)用顯示"Unlock Failed"
  147. {   char d1;                 //液晶屏幕第1行
  148.         LCDWrite(0x01);                         //清屏
  149.         LCDWrite(0x81);          //第1行第1個(gè)字符開始顯示
  150.         for(d1=0;d1<13;d1++)     //字符字?jǐn)?shù)
  151.         {
  152.                 LCDData(table0[d1]); //顯示調(diào)用table0
  153.         }
  154.        
  155. }
  156. void error1()                                 //密碼錯(cuò)誤時(shí)調(diào)用顯示"Wrong Password"
  157. {   char d2;                 //液晶屏幕第2行
  158.         LCDWrite(0xc1);          //第2行第2個(gè)字符開始顯示
  159.         for(d2=0;d2<14;d2++)      //字符字?jǐn)?shù)
  160.         {
  161.                 LCDData(table3[d2]); //顯示調(diào)用table3
  162.         }       
  163. }
  164. void open()                                         //密碼正確時(shí)調(diào)用顯示"Unlock Successed"
  165. {
  166.         char d2;                                 
  167.         LCDWrite(0xc0);                         //第2行第1個(gè)字符開始顯示
  168.         for(d2=0;d2<16;d2++)
  169.         {
  170.                 LCDData(table1[d2]);
  171.         }
  172. }

  173. //===步進(jìn)電機(jī)部分===//
  174. //***緊急制動(dòng)子程序***//
  175. void stop()                              
  176. {
  177.         if(braking==0)
  178.         {  
  179.            if(braking==0)
  180.            while(!braking)
  181.              {P3=0xff;}
  182.          }  
  183. }

  184. //===正反轉(zhuǎn)子程序===//
  185. void zfz()                              
  186. {  int i;
  187.    if(!forward&&ledg==1)                          //正轉(zhuǎn)
  188.    { delay(10);
  189.      while(!forward)
  190.          { stop();
  191.            for(i=0,P3=0x01;i<4;i++)
  192.                   { delay(90);
  193.                     P3=P3<<1;
  194.                   }
  195.          }
  196.    }
  197.    if(!reversal&&ledg==1)                                //反轉(zhuǎn)
  198.    { delay(10);
  199.      while(!reversal)
  200.          { stop();
  201.            for(i=0,P3=0xf7;i<4;i++)
  202.                   { delay(90);
  203.                     P3=P3>>1;
  204.                   }
  205.          }
  206.    }
  207. }

  208. //=====主函數(shù)=====//
  209. //***程序初始化***//
  210. void main()
  211. {
  212.         RW=0;
  213.         ledg=0;                   //綠燈
  214.         ledr=0;                   //紅燈               
  215.         init();
  216.         stop();
  217.         zfz();
  218.         delay(5);
  219.         ps();

  220. //***按鍵,屏幕關(guān)聯(lián)函數(shù)***//
  221. //*密碼1*//
  222.         LCDWrite(0x89);            //第1行第10個(gè)字符位置顯示
  223.         while(keyscan()==p)
  224.         {
  225.                 delay(3);
  226.                 keyscan();
  227.         }
  228.         LCDData(keyscan());        //第1行第10個(gè)字符位置輸入
  229.         n0=keyscan();                //第1個(gè)密碼
  230.         ch=p;
  231.         change(0x89);                //數(shù)字變*函數(shù)調(diào)用       
  232.     delay(1);
  233. //*密碼2*//
  234.         LCDWrite(0x8a);               
  235.         while(keyscan()==p)
  236.         {
  237.                 delay(3);
  238.                 keyscan();
  239.         }
  240.         LCDData(keyscan());         
  241.         n1=keyscan();
  242.         ch=p;               
  243.         change(0x8a);
  244.         delay(1);
  245. //*密碼3*//
  246.         LCDWrite(0x8b);               
  247.         while(keyscan()==p)
  248.         {
  249.                 delay(3);
  250.             keyscan();
  251.         }
  252.         LCDData(keyscan());   
  253.         n2=keyscan();                  
  254.     ch=p;
  255.         change(0x8b);
  256.         delay(1);
  257. //*密碼4*//
  258.         LCDWrite(0x8c);                  
  259.         while(keyscan()==p)
  260.         {
  261.                 delay(3);
  262.                 keyscan();
  263.         }
  264.         LCDData(keyscan());       
  265.         n3=keyscan();
  266.         ch=p;
  267.         change(0x8c);
  268.         delay(1);       
  269. //*密碼5*//
  270.         LCDWrite(0x8d);               
  271.         while(keyscan()==p)
  272.         {
  273.                 delay(3);
  274.                 keyscan();
  275.         }
  276.         LCDData(keyscan());       
  277.         n4=keyscan();
  278.         ch=p;
  279.         change(0x8d);
  280.         delay(1);               
  281. //*密碼6*//
  282. ……………………

  283. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼

所有資料51hei提供下載:
程序及仿真.zip (43.75 KB, 下載次數(shù): 28)



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

使用道具 舉報(bào)

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

本版積分規(guī)則

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

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表